var __decorate = this && this.__decorate || function(e, t, i, r) {
        var n, o = arguments.length,
            s = o < 3 ? t : null === r ? r = Object.getOwnPropertyDescriptor(t, i) : r;
        if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) s = Reflect.decorate(e, t, i, r);
        else
            for (var a = e.length - 1; a >= 0; a--)(n = e[a]) && (s = (o < 3 ? n(s) : o > 3 ? n(t, i, s) : n(t, i)) || s);
        return o > 3 && s && Object.defineProperty(t, i, s), s
    },
    __extends = this && this.__extends || (function() {
        var e = Object.setPrototypeOf || {
            __proto__: []
        }
        instanceof Array && function(e, t) {
            e.__proto__ = t
        } || function(e, t) {
            for (var i in t) t.hasOwnProperty(i) && (e[i] = t[i])
        };
        return function(t, i) {
            function r() {
                this.constructor = t
            }
            e(t, i), t.prototype = null === i ? Object.create(i) : (r.prototype = i.prototype, new r)
        }
    })(),
    BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._defines = {}, this._currentRank = 32, this._maxRank = -1
        }
        return e.prototype.unBindMesh = function() {
            this._mesh = null
        }, e.prototype.addFallback = function(e, t) {
            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)
        }, e.prototype.addCPUSkinningFallback = function(e, t) {
            this._mesh = t, e < this._currentRank && (this._currentRank = e), e > this._maxRank && (this._maxRank = e)
        }, Object.defineProperty(e.prototype, "isMoreFallbacks", {
            get: function() {
                return this._currentRank <= this._maxRank
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.reduce = function(e, t) {
            if (this._mesh && this._mesh.computeBonesUsingShaders && this._mesh.numBoneInfluencers > 0 && this._mesh.material) {
                this._mesh.computeBonesUsingShaders = !1, e = e.replace("#define NUM_BONE_INFLUENCERS " + this._mesh.numBoneInfluencers, "#define NUM_BONE_INFLUENCERS 0");
                for (var i = this._mesh.getScene(), r = 0; r < i.meshes.length; r++) {
                    var n = i.meshes[r];
                    if (n.material && (n.computeBonesUsingShaders && 0 !== n.numBoneInfluencers))
                        if (n.material.getEffect() === t) n.computeBonesUsingShaders = !1;
                        else
                            for (var o = 0, s = n.subMeshes; o < s.length; o++) {
                                var a = s[o],
                                    l = a.effect;
                                if (l === t) {
                                    n.computeBonesUsingShaders = !1;
                                    break
                                }
                            }
                }
            } else {
                var c = this._defines[this._currentRank];
                if (c)
                    for (var r = 0; r < c.length; r++) e = e.replace("#define " + c[r], "");
                this._currentRank++
            }
            return e
        }, e
    })();
    e.EffectFallbacks = t;
    var i = (function() {
        function e() {}
        return e
    })();
    e.EffectCreationOptions = i;
    var r = (function() {
        function t(i, r, n, o, s, a, l, c, h, u) {
            void 0 === o && (o = null), void 0 === a && (a = null), void 0 === l && (l = null), void 0 === c && (c = null), void 0 === h && (h = null);
            var f = this;
            if (this.uniqueId = 0, this.onCompileObservable = new e.Observable, this.onErrorObservable = new e.Observable, this.onBindObservable = new e.Observable, this._uniformBuffersNames = {}, this._isReady = !1, this._compilationError = "", this.name = i, r.attributes) {
                var d = r;
                if (this._engine = n, this._attributesNames = d.attributes, this._uniformsNames = d.uniformsNames.concat(d.samplers), this._samplers = d.samplers, this.defines = d.defines, this.onError = d.onError, this.onCompiled = d.onCompiled, this._fallbacks = d.fallbacks, this._indexParameters = d.indexParameters, this._transformFeedbackVaryings = d.transformFeedbackVaryings, d.uniformBuffersNames)
                    for (var p = 0; p < d.uniformBuffersNames.length; p++) this._uniformBuffersNames[d.uniformBuffersNames[p]] = p
            } else this._engine = s, this.defines = a, this._uniformsNames = n.concat(o), this._samplers = o, this._attributesNames = r, this.onError = h, this.onCompiled = c, this._indexParameters = u, this._fallbacks = l;
            this.uniqueId = t._uniqueIdSeed++;
            var _, m;
            i.vertexElement ? (_ = document.getElementById(i.vertexElement)) || (_ = i.vertexElement) : _ = i.vertex || i, i.fragmentElement ? (m = document.getElementById(i.fragmentElement)) || (m = i.fragmentElement) : m = i.fragment || i;
            var g;
            this._loadVertexShaderAsync(_).then((function(e) {
                return f._processIncludesAsync(e)
            })).then((function(e) {
                return g = f._processShaderConversion(e, !1), f._loadFragmentShaderAsync(m)
            })).then((function(e) {
                return f._processIncludesAsync(e)
            })).then((function(e) {
                var t = f._processShaderConversion(e, !0);
                if (i) {
                    var r = i.vertexElement || i.vertex || i,
                        n = i.fragmentElement || i.fragment || i;
                    f._vertexSourceCode = "#define SHADER_NAME vertex:" + r + "\n" + g, f._fragmentSourceCode = "#define SHADER_NAME fragment:" + n + "\n" + t
                } else f._vertexSourceCode = g, f._fragmentSourceCode = t;
                f._prepareEffect()
            }))
        }
        return Object.defineProperty(t.prototype, "key", {
            get: function() {
                return this._key
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.isReady = function() {
            return this._isReady
        }, t.prototype.getEngine = function() {
            return this._engine
        }, t.prototype.getProgram = function() {
            return this._program
        }, t.prototype.getAttributesNames = function() {
            return this._attributesNames
        }, t.prototype.getAttributeLocation = function(e) {
            return this._attributes[e]
        }, t.prototype.getAttributeLocationByName = function(e) {
            var t = this._attributesNames.indexOf(e);
            return this._attributes[t]
        }, t.prototype.getAttributesCount = function() {
            return this._attributes.length
        }, t.prototype.getUniformIndex = function(e) {
            return this._uniformsNames.indexOf(e)
        }, t.prototype.getUniform = function(e) {
            return this._uniforms[this._uniformsNames.indexOf(e)]
        }, t.prototype.getSamplers = function() {
            return this._samplers
        }, t.prototype.getCompilationError = function() {
            return this._compilationError
        }, t.prototype.executeWhenCompiled = function(e) {
            if (this.isReady()) return void e(this);
            this.onCompileObservable.add((function(t) {
                e(t)
            }))
        }, t.prototype._loadVertexShaderAsync = function(i) {
            if (e.Tools.IsWindowObjectExist() && i instanceof HTMLElement) {
                var r = e.Tools.GetDOMTextContent(i);
                return Promise.resolve(r)
            }
            if ("base64:" === i.substr(0, 7)) {
                var n = window.atob(i.substr(7));
                return Promise.resolve(n)
            }
            if (t.ShadersStore[i + "VertexShader"]) return Promise.resolve(t.ShadersStore[i + "VertexShader"]);
            var o;
            return o = "." === i[0] || "/" === i[0] || i.indexOf("http") > -1 ? i : e.Engine.ShadersRepository + i, this._engine._loadFileAsync(o + ".vertex.fx")
        }, t.prototype._loadFragmentShaderAsync = function(i) {
            if (e.Tools.IsWindowObjectExist() && i instanceof HTMLElement) {
                var r = e.Tools.GetDOMTextContent(i);
                return Promise.resolve(r)
            }
            if ("base64:" === i.substr(0, 7)) {
                var n = window.atob(i.substr(7));
                return Promise.resolve(n)
            }
            if (t.ShadersStore[i + "PixelShader"]) return Promise.resolve(t.ShadersStore[i + "PixelShader"]);
            if (t.ShadersStore[i + "FragmentShader"]) return Promise.resolve(t.ShadersStore[i + "FragmentShader"]);
            var o;
            return o = "." === i[0] || "/" === i[0] || i.indexOf("http") > -1 ? i : e.Engine.ShadersRepository + i, this._engine._loadFileAsync(o + ".fragment.fx")
        }, t.prototype._dumpShadersSource = function(t, i, r) {
            var n = this._engine.webGLVersion > 1 ? "#version 300 es\n" : "",
                o = n + (r ? r + "\n" : "");
            t = o + t, i = o + i;
            var s = 2,
                a = "\n1\t" + t.replace(/\n/gm, (function() {
                    return "\n" + s++ + "\t"
                }));
            s = 2;
            var l = "\n1\t" + i.replace(/\n/gm, (function() {
                return "\n" + s++ + "\t"
            }));
            this.name.vertexElement ? (e.Tools.Error("Vertex shader: " + this.name.vertexElement + a), e.Tools.Error("Fragment shader: " + this.name.fragmentElement + l)) : this.name.vertex ? (e.Tools.Error("Vertex shader: " + this.name.vertex + a), e.Tools.Error("Fragment shader: " + this.name.fragment + l)) : (e.Tools.Error("Vertex shader: " + this.name + a), e.Tools.Error("Fragment shader: " + this.name + l))
        }, t.prototype._processShaderConversion = function(e, t) {
            var i = this._processPrecision(e);
            if (1 == this._engine.webGLVersion) return i;
            if (-1 !== i.indexOf("#version 3")) return i.replace("#version 300 es", "");
            var r = -1 !== i.search(/#extension.+GL_EXT_draw_buffers.+require/),
                n = i.replace(/#extension.+(GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g, "");
            return n = n.replace(/varying(?![\n\r])\s/g, t ? "in " : "out "), n = n.replace(/attribute[ \t]/g, "in "), n = n.replace(/[ \t]attribute/g, " in"), t && (n = n.replace(/texture2DLodEXT\s*\(/g, "textureLod("), n = n.replace(/textureCubeLodEXT\s*\(/g, "textureLod("), n = n.replace(/texture2D\s*\(/g, "texture("), n = n.replace(/textureCube\s*\(/g, "texture("), n = n.replace(/gl_FragDepthEXT/g, "gl_FragDepth"), n = n.replace(/gl_FragColor/g, "glFragColor"), n = n.replace(/gl_FragData/g, "glFragData"), n = n.replace(/void\s+?main\s*\(/g, (r ? "" : "out vec4 glFragColor;\n") + "void main(")), n
        }, t.prototype._processIncludesAsync = function(i) {
            var r = this;
            return new Promise(function(n, o) {
                for (var s = /#include<(.+)>(\((.*)\))*(\[(.*)\])*/g, a = s.exec(i), l = i; null != a;) {
                    var c = a[1];
                    if (-1 !== c.indexOf("__decl__") && (c = c.replace(/__decl__/, ""), r._engine.supportsUniformBuffers && (c = c.replace(/Vertex/, "Ubo"), c = c.replace(/Fragment/, "Ubo")), c += "Declaration"), !t.IncludesShadersStore[c]) {
                        var h = e.Engine.ShadersRepository + "ShadersInclude/" + c + ".fx";
                        return void r._engine._loadFileAsync(h).then((function(e) {
                            return t.IncludesShadersStore[c] = e, r._processIncludesAsync(l)
                        })).then((function(e) {
                            n(e)
                        }))
                    }
                    var u = t.IncludesShadersStore[c];
                    if (a[2])
                        for (var f = a[3].split(","), d = 0; d < f.length; d += 2) {
                            var p = new RegExp(f[d], "g"),
                                _ = f[d + 1];
                            u = u.replace(p, _)
                        }
                    if (a[4]) {
                        var m = a[5];
                        if (-1 !== m.indexOf("..")) {
                            var g = m.split(".."),
                                v = parseInt(g[0]),
                                y = parseInt(g[1]),
                                b = u.slice(0);
                            u = "", isNaN(y) && (y = r._indexParameters[g[1]]);
                            for (var x = v; x < y; x++) r._engine.supportsUniformBuffers || (b = b.replace(/light\{X\}.(\w*)/g, (function(e, t) {
                                return t + "{X}"
                            }))), u += b.replace(/\{X\}/g, x.toString()) + "\n"
                        } else r._engine.supportsUniformBuffers || (u = u.replace(/light\{X\}.(\w*)/g, (function(e, t) {
                            return t + "{X}"
                        }))), u = u.replace(/\{X\}/g, m)
                    }
                    l = l.replace(a[0], u), a = s.exec(i)
                }
                n(l)
            })
        }, t.prototype._processPrecision = function(e) {
            return -1 === e.indexOf("precision highp float") ? e = this._engine.getCaps().highPrecisionShaderSupported ? "precision highp float;\n" + e : "precision mediump float;\n" + e : this._engine.getCaps().highPrecisionShaderSupported || (e = e.replace("precision highp float", "precision mediump float")), e
        }, t.prototype._rebuildProgram = function(t, i, r, n) {
            var o = this;
            this._isReady = !1, this._vertexSourceCodeOverride = t, this._fragmentSourceCodeOverride = i, this.onError = function(e, t) {
                n && n(t)
            }, this.onCompiled = function() {
                for (var t = o.getEngine().scenes, i = 0; i < t.length; i++) t[i].markAllMaterialsAsDirty(e.Material.TextureDirtyFlag);
                r && r(o._program)
            }, this._fallbacks = null, this._prepareEffect()
        }, t.prototype.getSpecificUniformLocations = function(e) {
            return this._engine.getUniforms(this._program, e)
        }, t.prototype._prepareEffect = function() {
            var t = this._attributesNames,
                i = this.defines,
                r = this._fallbacks;
            this._valueCache = {};
            var n = this._program;
            try {
                var o = this._engine;
                if (this._vertexSourceCodeOverride && this._fragmentSourceCodeOverride ? this._program = o.createRawShaderProgram(this._vertexSourceCodeOverride, this._fragmentSourceCodeOverride, void 0, this._transformFeedbackVaryings) : this._program = o.createShaderProgram(this._vertexSourceCode, this._fragmentSourceCode, i, void 0, this._transformFeedbackVaryings), this._program.__SPECTOR_rebuildProgram = this._rebuildProgram.bind(this), o.supportsUniformBuffers)
                    for (var s in this._uniformBuffersNames) this.bindUniformBlock(s, this._uniformBuffersNames[s]);
                this._uniforms = o.getUniforms(this._program, this._uniformsNames), this._attributes = o.getAttributes(this._program, t);
                var a;
                for (a = 0; a < this._samplers.length; a++) {
                    null == this.getUniform(this._samplers[a]) && (this._samplers.splice(a, 1), a--)
                }
                o.bindSamplers(this), this._compilationError = "", this._isReady = !0, this.onCompiled && this.onCompiled(this), this.onCompileObservable.notifyObservers(this), this.onCompileObservable.clear(), this._fallbacks && this._fallbacks.unBindMesh(), n && this.getEngine()._deleteProgram(n)
            } catch (o) {
                this._compilationError = o.message, e.Tools.Error("Unable to compile effect:"), e.Tools.Error("Uniforms: " + this._uniformsNames.map((function(e) {
                    return " " + e
                }))), e.Tools.Error("Attributes: " + t.map((function(e) {
                    return " " + e
                }))), this._dumpShadersSource(this._vertexSourceCode, this._fragmentSourceCode, i), e.Tools.Error("Error: " + this._compilationError), n && (this._program = n, this._isReady = !0, this.onError && this.onError(this, this._compilationError), this.onErrorObservable.notifyObservers(this)), r && r.isMoreFallbacks ? (e.Tools.Error("Trying next fallback."), this.defines = r.reduce(this.defines, this), this._prepareEffect()) : (this.onError && this.onError(this, this._compilationError), this.onErrorObservable.notifyObservers(this), this.onErrorObservable.clear(), this._fallbacks && this._fallbacks.unBindMesh())
            }
        }, Object.defineProperty(t.prototype, "isSupported", {
            get: function() {
                return "" === this._compilationError
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._bindTexture = function(e, t) {
            this._engine._bindTexture(this._samplers.indexOf(e), t)
        }, t.prototype.setTexture = function(e, t) {
            this._engine.setTexture(this._samplers.indexOf(e), this.getUniform(e), t)
        }, t.prototype.setTextureArray = function(e, t) {
            if (-1 === this._samplers.indexOf(e + "Ex"))
                for (var i = this._samplers.indexOf(e), r = 1; r < t.length; r++) this._samplers.splice(i + r, 0, e + "Ex");
            this._engine.setTextureArray(this._samplers.indexOf(e), this.getUniform(e), t)
        }, t.prototype.setTextureFromPostProcess = function(e, t) {
            this._engine.setTextureFromPostProcess(this._samplers.indexOf(e), t)
        }, t.prototype._cacheMatrix = function(e, t) {
            var i = this._valueCache[e],
                r = t.updateFlag;
            return (void 0 === i || i !== r) && (this._valueCache[e] = r, !0)
        }, t.prototype._cacheFloat2 = function(e, t, i) {
            var r = this._valueCache[e];
            if (!r) return r = [t, i], this._valueCache[e] = r, !0;
            var n = !1;
            return r[0] !== t && (r[0] = t, n = !0), r[1] !== i && (r[1] = i, n = !0), n
        }, t.prototype._cacheFloat3 = function(e, t, i, r) {
            var n = this._valueCache[e];
            if (!n) return n = [t, i, r], this._valueCache[e] = n, !0;
            var o = !1;
            return n[0] !== t && (n[0] = t, o = !0), n[1] !== i && (n[1] = i, o = !0), n[2] !== r && (n[2] = r, o = !0), o
        }, t.prototype._cacheFloat4 = function(e, t, i, r, n) {
            var o = this._valueCache[e];
            if (!o) return o = [t, i, r, n], this._valueCache[e] = o, !0;
            var s = !1;
            return o[0] !== t && (o[0] = t, s = !0), o[1] !== i && (o[1] = i, s = !0), o[2] !== r && (o[2] = r, s = !0), o[3] !== n && (o[3] = n, s = !0), s
        }, t.prototype.bindUniformBuffer = function(e, i) {
            var r = this._uniformBuffersNames[i];
            void 0 !== r && t._baseCache[r] !== e && (t._baseCache[r] = e, this._engine.bindUniformBufferBase(e, r))
        }, t.prototype.bindUniformBlock = function(e, t) {
            this._engine.bindUniformBlock(this._program, e, t)
        }, t.prototype.setInt = function(e, t) {
            var i = this._valueCache[e];
            return void 0 !== i && i === t ? this : (this._valueCache[e] = t, this._engine.setInt(this.getUniform(e), t), this)
        }, t.prototype.setIntArray = function(e, t) {
            return this._valueCache[e] = null, this._engine.setIntArray(this.getUniform(e), t), this
        }, t.prototype.setIntArray2 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setIntArray2(this.getUniform(e), t), this
        }, t.prototype.setIntArray3 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setIntArray3(this.getUniform(e), t), this
        }, t.prototype.setIntArray4 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setIntArray4(this.getUniform(e), t), this
        }, t.prototype.setFloatArray = function(e, t) {
            return this._valueCache[e] = null, this._engine.setFloatArray(this.getUniform(e), t), this
        }, t.prototype.setFloatArray2 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setFloatArray2(this.getUniform(e), t), this
        }, t.prototype.setFloatArray3 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setFloatArray3(this.getUniform(e), t), this
        }, t.prototype.setFloatArray4 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setFloatArray4(this.getUniform(e), t), this
        }, t.prototype.setArray = function(e, t) {
            return this._valueCache[e] = null, this._engine.setArray(this.getUniform(e), t), this
        }, t.prototype.setArray2 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setArray2(this.getUniform(e), t), this
        }, t.prototype.setArray3 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setArray3(this.getUniform(e), t), this
        }, t.prototype.setArray4 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setArray4(this.getUniform(e), t), this
        }, t.prototype.setMatrices = function(e, t) {
            return t ? (this._valueCache[e] = null, this._engine.setMatrices(this.getUniform(e), t), this) : this
        }, t.prototype.setMatrix = function(e, t) {
            return this._cacheMatrix(e, t) && this._engine.setMatrix(this.getUniform(e), t), this
        }, t.prototype.setMatrix3x3 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setMatrix3x3(this.getUniform(e), t), this
        }, t.prototype.setMatrix2x2 = function(e, t) {
            return this._valueCache[e] = null, this._engine.setMatrix2x2(this.getUniform(e), t), this
        }, t.prototype.setFloat = function(e, t) {
            var i = this._valueCache[e];
            return void 0 !== i && i === t ? this : (this._valueCache[e] = t, this._engine.setFloat(this.getUniform(e), t), this)
        }, t.prototype.setBool = function(e, t) {
            var i = this._valueCache[e];
            return void 0 !== i && i === t ? this : (this._valueCache[e] = t, this._engine.setBool(this.getUniform(e), t ? 1 : 0), this)
        }, t.prototype.setVector2 = function(e, t) {
            return this._cacheFloat2(e, t.x, t.y) && this._engine.setFloat2(this.getUniform(e), t.x, t.y), this
        }, t.prototype.setFloat2 = function(e, t, i) {
            return this._cacheFloat2(e, t, i) && this._engine.setFloat2(this.getUniform(e), t, i), this
        }, t.prototype.setVector3 = function(e, t) {
            return this._cacheFloat3(e, t.x, t.y, t.z) && this._engine.setFloat3(this.getUniform(e), t.x, t.y, t.z), this
        }, t.prototype.setFloat3 = function(e, t, i, r) {
            return this._cacheFloat3(e, t, i, r) && this._engine.setFloat3(this.getUniform(e), t, i, r), this
        }, t.prototype.setVector4 = function(e, t) {
            return this._cacheFloat4(e, t.x, t.y, t.z, t.w) && this._engine.setFloat4(this.getUniform(e), t.x, t.y, t.z, t.w), this
        }, t.prototype.setFloat4 = function(e, t, i, r, n) {
            return this._cacheFloat4(e, t, i, r, n) && this._engine.setFloat4(this.getUniform(e), t, i, r, n), this
        }, t.prototype.setColor3 = function(e, t) {
            return this._cacheFloat3(e, t.r, t.g, t.b) && this._engine.setColor3(this.getUniform(e), t), this
        }, t.prototype.setColor4 = function(e, t, i) {
            return this._cacheFloat4(e, t.r, t.g, t.b, i) && this._engine.setColor4(this.getUniform(e), t, i), this
        }, t.prototype.setDirectColor4 = function(e, t) {
            return this._cacheFloat4(e, t.r, t.g, t.b, t.a) && this._engine.setDirectColor4(this.getUniform(e), t), this
        }, t.ResetCache = function() {
            t._baseCache = {}
        }, t._uniqueIdSeed = 0, t._baseCache = {}, t.ShadersStore = {}, t.IncludesShadersStore = {}, t
    })();
    e.Effect = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {}
        return Object.defineProperty(e, "KEYDOWN", {
            get: function() {
                return e._KEYDOWN
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "KEYUP", {
            get: function() {
                return e._KEYUP
            },
            enumerable: !0,
            configurable: !0
        }), e._KEYDOWN = 1, e._KEYUP = 2, e
    })();
    e.KeyboardEventTypes = t;
    var i = (function() {
        function e(e, t) {
            this.type = e, this.event = t
        }
        return e
    })();
    e.KeyboardInfo = i;
    var r = (function(e) {
        function t(t, i) {
            var r = e.call(this, t, i) || this;
            return r.skipOnPointerObservable = !1, r
        }
        return __extends(t, e), t
    })(i);
    e.KeyboardInfoPre = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {}
        return Object.defineProperty(e, "POINTERDOWN", {
            get: function() {
                return e._POINTERDOWN
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "POINTERUP", {
            get: function() {
                return e._POINTERUP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "POINTERMOVE", {
            get: function() {
                return e._POINTERMOVE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "POINTERWHEEL", {
            get: function() {
                return e._POINTERWHEEL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "POINTERPICK", {
            get: function() {
                return e._POINTERPICK
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "POINTERTAP", {
            get: function() {
                return e._POINTERTAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "POINTERDOUBLETAP", {
            get: function() {
                return e._POINTERDOUBLETAP
            },
            enumerable: !0,
            configurable: !0
        }), e._POINTERDOWN = 1, e._POINTERUP = 2, e._POINTERMOVE = 4, e._POINTERWHEEL = 8, e._POINTERPICK = 16, e._POINTERTAP = 32, e._POINTERDOUBLETAP = 64, e
    })();
    e.PointerEventTypes = t;
    var i = (function() {
        function e(e, t) {
            this.type = e, this.event = t
        }
        return e
    })();
    e.PointerInfoBase = i;
    var r = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, r) || this;
            return s.skipOnPointerObservable = !1, s.localPosition = new e.Vector2(n, o), s
        }
        return __extends(i, t), i
    })(i);
    e.PointerInfoPre = r;
    var n = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, i) || this;
            return n.pickInfo = r, n
        }
        return __extends(t, e), t
    })(i);
    e.PointerInfo = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    e.ToGammaSpace = 1 / 2.2, e.ToLinearSpace = 2.2, e.Epsilon = .001;
    var t = (function() {
        function t(e, t, i) {
            void 0 === e && (e = 0), void 0 === t && (t = 0), void 0 === i && (i = 0), this.r = e, this.g = t, this.b = i
        }
        return t.prototype.toString = function() {
            return "{R: " + this.r + " G:" + this.g + " B:" + this.b + "}"
        }, t.prototype.getClassName = function() {
            return "Color3"
        }, t.prototype.getHashCode = function() {
            var e = this.r || 0;
            return e = 397 * e ^ (this.g || 0), e = 397 * e ^ (this.b || 0)
        }, t.prototype.toArray = function(e, t) {
            return void 0 === t && (t = 0), e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, this
        }, t.prototype.toColor4 = function(e) {
            return void 0 === e && (e = 1), new i(this.r, this.g, this.b, e)
        }, t.prototype.asArray = function() {
            var e = new Array;
            return this.toArray(e, 0), e
        }, t.prototype.toLuminance = function() {
            return .3 * this.r + .59 * this.g + .11 * this.b
        }, t.prototype.multiply = function(e) {
            return new t(this.r * e.r, this.g * e.g, this.b * e.b)
        }, t.prototype.multiplyToRef = function(e, t) {
            return t.r = this.r * e.r, t.g = this.g * e.g, t.b = this.b * e.b, this
        }, t.prototype.equals = function(e) {
            return e && this.r === e.r && this.g === e.g && this.b === e.b
        }, t.prototype.equalsFloats = function(e, t, i) {
            return this.r === e && this.g === t && this.b === i
        }, t.prototype.scale = function(e) {
            return new t(this.r * e, this.g * e, this.b * e)
        }, t.prototype.scaleToRef = function(e, t) {
            return t.r = this.r * e, t.g = this.g * e, t.b = this.b * e, this
        }, t.prototype.clampToRef = function(t, i, r) {
            return void 0 === t && (t = 0), void 0 === i && (i = 1), r.r = e.Scalar.Clamp(this.r, t, i), r.g = e.Scalar.Clamp(this.g, t, i), r.b = e.Scalar.Clamp(this.b, t, i), this
        }, t.prototype.add = function(e) {
            return new t(this.r + e.r, this.g + e.g, this.b + e.b)
        }, t.prototype.addToRef = function(e, t) {
            return t.r = this.r + e.r, t.g = this.g + e.g, t.b = this.b + e.b, this
        }, t.prototype.subtract = function(e) {
            return new t(this.r - e.r, this.g - e.g, this.b - e.b)
        }, t.prototype.subtractToRef = function(e, t) {
            return t.r = this.r - e.r, t.g = this.g - e.g, t.b = this.b - e.b, this
        }, t.prototype.clone = function() {
            return new t(this.r, this.g, this.b)
        }, t.prototype.copyFrom = function(e) {
            return this.r = e.r, this.g = e.g, this.b = e.b, this
        }, t.prototype.copyFromFloats = function(e, t, i) {
            return this.r = e, this.g = t, this.b = i, this
        }, t.prototype.set = function(e, t, i) {
            return this.copyFromFloats(e, t, i)
        }, t.prototype.toHexString = function() {
            var t = 255 * this.r | 0,
                i = 255 * this.g | 0,
                r = 255 * this.b | 0;
            return "#" + e.Scalar.ToHex(t) + e.Scalar.ToHex(i) + e.Scalar.ToHex(r)
        }, t.prototype.toLinearSpace = function() {
            var e = new t;
            return this.toLinearSpaceToRef(e), e
        }, t.prototype.toLinearSpaceToRef = function(t) {
            return t.r = Math.pow(this.r, e.ToLinearSpace), t.g = Math.pow(this.g, e.ToLinearSpace), t.b = Math.pow(this.b, e.ToLinearSpace), this
        }, t.prototype.toGammaSpace = function() {
            var e = new t;
            return this.toGammaSpaceToRef(e), e
        }, t.prototype.toGammaSpaceToRef = function(t) {
            return t.r = Math.pow(this.r, e.ToGammaSpace), t.g = Math.pow(this.g, e.ToGammaSpace), t.b = Math.pow(this.b, e.ToGammaSpace), this
        }, t.FromHexString = function(e) {
            if ("#" !== e.substring(0, 1) || 7 !== e.length) return new t(0, 0, 0);
            var i = parseInt(e.substring(1, 3), 16),
                r = parseInt(e.substring(3, 5), 16),
                n = parseInt(e.substring(5, 7), 16);
            return t.FromInts(i, r, n)
        }, t.FromArray = function(e, i) {
            return void 0 === i && (i = 0), new t(e[i], e[i + 1], e[i + 2])
        }, t.FromInts = function(e, i, r) {
            return new t(e / 255, i / 255, r / 255)
        }, t.Lerp = function(e, i, r) {
            return new t(e.r + (i.r - e.r) * r, e.g + (i.g - e.g) * r, e.b + (i.b - e.b) * r)
        }, t.Red = function() {
            return new t(1, 0, 0)
        }, t.Green = function() {
            return new t(0, 1, 0)
        }, t.Blue = function() {
            return new t(0, 0, 1)
        }, t.Black = function() {
            return new t(0, 0, 0)
        }, t.White = function() {
            return new t(1, 1, 1)
        }, t.Purple = function() {
            return new t(.5, 0, .5)
        }, t.Magenta = function() {
            return new t(1, 0, 1)
        }, t.Yellow = function() {
            return new t(1, 1, 0)
        }, t.Gray = function() {
            return new t(.5, .5, .5)
        }, t.Teal = function() {
            return new t(0, 1, 1)
        }, t.Random = function() {
            return new t(Math.random(), Math.random(), Math.random())
        }, t
    })();
    e.Color3 = t;
    var i = (function() {
        function t(e, t, i, r) {
            void 0 === e && (e = 0), void 0 === t && (t = 0), void 0 === i && (i = 0), void 0 === r && (r = 1), this.r = e, this.g = t, this.b = i, this.a = r
        }
        return t.prototype.addInPlace = function(e) {
            return this.r += e.r, this.g += e.g, this.b += e.b, this.a += e.a, this
        }, t.prototype.asArray = function() {
            var e = new Array;
            return this.toArray(e, 0), e
        }, t.prototype.toArray = function(e, t) {
            return void 0 === t && (t = 0), e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, e[t + 3] = this.a, this
        }, t.prototype.add = function(e) {
            return new t(this.r + e.r, this.g + e.g, this.b + e.b, this.a + e.a)
        }, t.prototype.subtract = function(e) {
            return new t(this.r - e.r, this.g - e.g, this.b - e.b, this.a - e.a)
        }, t.prototype.subtractToRef = function(e, t) {
            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, this
        }, t.prototype.scale = function(e) {
            return new t(this.r * e, this.g * e, this.b * e, this.a * e)
        }, t.prototype.scaleToRef = function(e, t) {
            return t.r = this.r * e, t.g = this.g * e, t.b = this.b * e, t.a = this.a * e, this
        }, t.prototype.clampToRef = function(t, i, r) {
            return void 0 === t && (t = 0), void 0 === i && (i = 1), r.r = e.Scalar.Clamp(this.r, t, i), r.g = e.Scalar.Clamp(this.g, t, i), r.b = e.Scalar.Clamp(this.b, t, i), r.a = e.Scalar.Clamp(this.a, t, i), this
        }, t.prototype.multiply = function(e) {
            return new t(this.r * e.r, this.g * e.g, this.b * e.b, this.a * e.a)
        }, t.prototype.multiplyToRef = function(e, t) {
            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
        }, t.prototype.toString = function() {
            return "{R: " + this.r + " G:" + this.g + " B:" + this.b + " A:" + this.a + "}"
        }, t.prototype.getClassName = function() {
            return "Color4"
        }, t.prototype.getHashCode = function() {
            var e = this.r || 0;
            return e = 397 * e ^ (this.g || 0), e = 397 * e ^ (this.b || 0), e = 397 * e ^ (this.a || 0)
        }, t.prototype.clone = function() {
            return new t(this.r, this.g, this.b, this.a)
        }, t.prototype.copyFrom = function(e) {
            return this.r = e.r, this.g = e.g, this.b = e.b, this.a = e.a, this
        }, t.prototype.copyFromFloats = function(e, t, i, r) {
            return this.r = e, this.g = t, this.b = i, this.a = r, this
        }, t.prototype.set = function(e, t, i, r) {
            return this.copyFromFloats(e, t, i, r)
        }, t.prototype.toHexString = function() {
            var t = 255 * this.r | 0,
                i = 255 * this.g | 0,
                r = 255 * this.b | 0,
                n = 255 * this.a | 0;
            return "#" + e.Scalar.ToHex(t) + e.Scalar.ToHex(i) + e.Scalar.ToHex(r) + e.Scalar.ToHex(n)
        }, t.prototype.toLinearSpace = function() {
            var e = new t;
            return this.toLinearSpaceToRef(e), e
        }, t.prototype.toLinearSpaceToRef = function(t) {
            return t.r = Math.pow(this.r, e.ToLinearSpace), t.g = Math.pow(this.g, e.ToLinearSpace), t.b = Math.pow(this.b, e.ToLinearSpace), t.a = this.a, this
        }, t.prototype.toGammaSpace = function() {
            var e = new t;
            return this.toGammaSpaceToRef(e), e
        }, t.prototype.toGammaSpaceToRef = function(t) {
            return t.r = Math.pow(this.r, e.ToGammaSpace), t.g = Math.pow(this.g, e.ToGammaSpace), t.b = Math.pow(this.b, e.ToGammaSpace), t.a = this.a, this
        }, t.FromHexString = function(e) {
            if ("#" !== e.substring(0, 1) || 9 !== e.length) return new t(0, 0, 0, 0);
            var i = parseInt(e.substring(1, 3), 16),
                r = parseInt(e.substring(3, 5), 16),
                n = parseInt(e.substring(5, 7), 16),
                o = parseInt(e.substring(7, 9), 16);
            return t.FromInts(i, r, n, o)
        }, t.Lerp = function(e, i, r) {
            var n = new t(0, 0, 0, 0);
            return t.LerpToRef(e, i, r, n), n
        }, t.LerpToRef = function(e, t, i, r) {
            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
        }, t.FromArray = function(e, i) {
            return void 0 === i && (i = 0), new t(e[i], e[i + 1], e[i + 2], e[i + 3])
        }, t.FromInts = function(e, i, r, n) {
            return new t(e / 255, i / 255, r / 255, n / 255)
        }, t.CheckColors4 = function(e, t) {
            if (e.length === 3 * t) {
                for (var i = [], r = 0; r < e.length; r += 3) {
                    var n = r / 3 * 4;
                    i[n] = e[r], i[n + 1] = e[r + 1], i[n + 2] = e[r + 2], i[n + 3] = 1
                }
                return i
            }
            return e
        }, t
    })();
    e.Color4 = i;
    var r = (function() {
        function t(e, t) {
            this.x = e, this.y = t
        }
        return t.prototype.toString = function() {
            return "{X: " + this.x + " Y:" + this.y + "}"
        }, t.prototype.getClassName = function() {
            return "Vector2"
        }, t.prototype.getHashCode = function() {
            var e = this.x || 0;
            return e = 397 * e ^ (this.y || 0)
        }, t.prototype.toArray = function(e, t) {
            return void 0 === t && (t = 0), e[t] = this.x, e[t + 1] = this.y, this
        }, t.prototype.asArray = function() {
            var e = new Array;
            return this.toArray(e, 0), e
        }, t.prototype.copyFrom = function(e) {
            return this.x = e.x, this.y = e.y, this
        }, t.prototype.copyFromFloats = function(e, t) {
            return this.x = e, this.y = t, this
        }, t.prototype.set = function(e, t) {
            return this.copyFromFloats(e, t)
        }, t.prototype.add = function(e) {
            return new t(this.x + e.x, this.y + e.y)
        }, t.prototype.addToRef = function(e, t) {
            return t.x = this.x + e.x, t.y = this.y + e.y, this
        }, t.prototype.addInPlace = function(e) {
            return this.x += e.x, this.y += e.y, this
        }, t.prototype.addVector3 = function(e) {
            return new t(this.x + e.x, this.y + e.y)
        }, t.prototype.subtract = function(e) {
            return new t(this.x - e.x, this.y - e.y)
        }, t.prototype.subtractToRef = function(e, t) {
            return t.x = this.x - e.x, t.y = this.y - e.y, this
        }, t.prototype.subtractInPlace = function(e) {
            return this.x -= e.x, this.y -= e.y, this
        }, t.prototype.multiplyInPlace = function(e) {
            return this.x *= e.x, this.y *= e.y, this
        }, t.prototype.multiply = function(e) {
            return new t(this.x * e.x, this.y * e.y)
        }, t.prototype.multiplyToRef = function(e, t) {
            return t.x = this.x * e.x, t.y = this.y * e.y, this
        }, t.prototype.multiplyByFloats = function(e, i) {
            return new t(this.x * e, this.y * i)
        }, t.prototype.divide = function(e) {
            return new t(this.x / e.x, this.y / e.y)
        }, t.prototype.divideToRef = function(e, t) {
            return t.x = this.x / e.x, t.y = this.y / e.y, this
        }, t.prototype.divideInPlace = function(e) {
            return this.divideToRef(e, this)
        }, t.prototype.negate = function() {
            return new t(-this.x, -this.y)
        }, t.prototype.scaleInPlace = function(e) {
            return this.x *= e, this.y *= e, this
        }, t.prototype.scale = function(e) {
            return new t(this.x * e, this.y * e)
        }, t.prototype.equals = function(e) {
            return e && this.x === e.x && this.y === e.y
        }, t.prototype.equalsWithEpsilon = function(t, i) {
            return void 0 === i && (i = e.Epsilon), t && e.Scalar.WithinEpsilon(this.x, t.x, i) && e.Scalar.WithinEpsilon(this.y, t.y, i)
        }, t.prototype.length = function() {
            return Math.sqrt(this.x * this.x + this.y * this.y)
        }, t.prototype.lengthSquared = function() {
            return this.x * this.x + this.y * this.y
        }, t.prototype.normalize = function() {
            var e = this.length();
            if (0 === e) return this;
            var t = 1 / e;
            return this.x *= t, this.y *= t, this
        }, t.prototype.clone = function() {
            return new t(this.x, this.y)
        }, t.Zero = function() {
            return new t(0, 0)
        }, t.One = function() {
            return new t(1, 1)
        }, t.FromArray = function(e, i) {
            return void 0 === i && (i = 0), new t(e[i], e[i + 1])
        }, t.FromArrayToRef = function(e, t, i) {
            i.x = e[t], i.y = e[t + 1]
        }, t.CatmullRom = function(e, i, r, n, o) {
            var s = o * o,
                a = o * s;
            return new t(.5 * (2 * i.x + (-e.x + r.x) * o + (2 * e.x - 5 * i.x + 4 * r.x - n.x) * s + (-e.x + 3 * i.x - 3 * r.x + n.x) * a), .5 * (2 * i.y + (-e.y + r.y) * o + (2 * e.y - 5 * i.y + 4 * r.y - n.y) * s + (-e.y + 3 * i.y - 3 * r.y + n.y) * a))
        }, t.Clamp = function(e, i, r) {
            var n = e.x;
            n = n > r.x ? r.x : n, n = n < i.x ? i.x : n;
            var o = e.y;
            return o = o > r.y ? r.y : o, o = o < i.y ? i.y : o, new t(n, o)
        }, t.Hermite = function(e, i, r, n, o) {
            var s = o * o,
                a = o * s,
                l = 2 * a - 3 * s + 1,
                c = -2 * a + 3 * s,
                h = a - 2 * s + o,
                u = a - s;
            return new t(e.x * l + r.x * c + i.x * h + n.x * u, e.y * l + r.y * c + i.y * h + n.y * u)
        }, t.Lerp = function(e, i, r) {
            return new t(e.x + (i.x - e.x) * r, e.y + (i.y - e.y) * r)
        }, t.Dot = function(e, t) {
            return e.x * t.x + e.y * t.y
        }, t.Normalize = function(e) {
            var t = e.clone();
            return t.normalize(), t
        }, t.Minimize = function(e, i) {
            return new t(e.x < i.x ? e.x : i.x, e.y < i.y ? e.y : i.y)
        }, t.Maximize = function(e, i) {
            return new t(e.x > i.x ? e.x : i.x, e.y > i.y ? e.y : i.y)
        }, t.Transform = function(e, i) {
            var r = t.Zero();
            return t.TransformToRef(e, i, r), r
        }, t.TransformToRef = function(e, t, i) {
            var r = e.x * t.m[0] + e.y * t.m[4] + t.m[12],
                n = e.x * t.m[1] + e.y * t.m[5] + t.m[13];
            i.x = r, i.y = n
        }, t.PointInTriangle = function(e, t, i, r) {
            var n = .5 * (-i.y * r.x + t.y * (-i.x + r.x) + t.x * (i.y - r.y) + i.x * r.y),
                o = n < 0 ? -1 : 1,
                s = (t.y * r.x - t.x * r.y + (r.y - t.y) * e.x + (t.x - r.x) * e.y) * o,
                a = (t.x * i.y - t.y * i.x + (t.y - i.y) * e.x + (i.x - t.x) * e.y) * o;
            return s > 0 && a > 0 && s + a < 2 * n * o
        }, t.Distance = function(e, i) {
            return Math.sqrt(t.DistanceSquared(e, i))
        }, t.DistanceSquared = function(e, t) {
            var i = e.x - t.x,
                r = e.y - t.y;
            return i * i + r * r
        }, t.Center = function(e, t) {
            var i = e.add(t);
            return i.scaleInPlace(.5), i
        }, t.DistanceOfPointFromSegment = function(e, i, r) {
            var n = t.DistanceSquared(i, r);
            if (0 === n) return t.Distance(e, i);
            var o = r.subtract(i),
                s = Math.max(0, Math.min(1, t.Dot(e.subtract(i), o) / n)),
                a = i.add(o.multiplyByFloats(s, s));
            return t.Distance(e, a)
        }, t
    })();
    e.Vector2 = r;
    var n = (function() {
        function t(e, t, i) {
            this.x = e, this.y = t, this.z = i
        }
        return t.prototype.toString = function() {
            return "{X: " + this.x + " Y:" + this.y + " Z:" + this.z + "}"
        }, t.prototype.getClassName = function() {
            return "Vector3"
        }, t.prototype.getHashCode = function() {
            var e = this.x || 0;
            return e = 397 * e ^ (this.y || 0), e = 397 * e ^ (this.z || 0)
        }, t.prototype.asArray = function() {
            var e = [];
            return this.toArray(e, 0), e
        }, t.prototype.toArray = function(e, t) {
            return void 0 === t && (t = 0), e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, this
        }, t.prototype.toQuaternion = function() {
            var e = new a(0, 0, 0, 1),
                t = Math.cos(.5 * (this.x + this.z)),
                i = Math.sin(.5 * (this.x + this.z)),
                r = Math.cos(.5 * (this.z - this.x)),
                n = Math.sin(.5 * (this.z - this.x)),
                o = Math.cos(.5 * this.y),
                s = Math.sin(.5 * this.y);
            return e.x = r * s, e.y = -n * s, e.z = i * o, e.w = t * o, e
        }, t.prototype.addInPlace = function(e) {
            return this.x += e.x, this.y += e.y, this.z += e.z, this
        }, t.prototype.add = function(e) {
            return new t(this.x + e.x, this.y + e.y, this.z + e.z)
        }, t.prototype.addToRef = function(e, t) {
            return t.x = this.x + e.x, t.y = this.y + e.y, t.z = this.z + e.z, this
        }, t.prototype.subtractInPlace = function(e) {
            return this.x -= e.x, this.y -= e.y, this.z -= e.z, this
        }, t.prototype.subtract = function(e) {
            return new t(this.x - e.x, this.y - e.y, this.z - e.z)
        }, t.prototype.subtractToRef = function(e, t) {
            return t.x = this.x - e.x, t.y = this.y - e.y, t.z = this.z - e.z, this
        }, t.prototype.subtractFromFloats = function(e, i, r) {
            return new t(this.x - e, this.y - i, this.z - r)
        }, t.prototype.subtractFromFloatsToRef = function(e, t, i, r) {
            return r.x = this.x - e, r.y = this.y - t, r.z = this.z - i, this
        }, t.prototype.negate = function() {
            return new t(-this.x, -this.y, -this.z)
        }, t.prototype.scaleInPlace = function(e) {
            return this.x *= e, this.y *= e, this.z *= e, this
        }, t.prototype.scale = function(e) {
            return new t(this.x * e, this.y * e, this.z * e)
        }, t.prototype.scaleToRef = function(e, t) {
            return t.x = this.x * e, t.y = this.y * e, t.z = this.z * e, this
        }, t.prototype.equals = function(e) {
            return e && this.x === e.x && this.y === e.y && this.z === e.z
        }, t.prototype.equalsWithEpsilon = function(t, i) {
            return void 0 === i && (i = e.Epsilon), t && e.Scalar.WithinEpsilon(this.x, t.x, i) && e.Scalar.WithinEpsilon(this.y, t.y, i) && e.Scalar.WithinEpsilon(this.z, t.z, i)
        }, t.prototype.equalsToFloats = function(e, t, i) {
            return this.x === e && this.y === t && this.z === i
        }, t.prototype.multiplyInPlace = function(e) {
            return this.x *= e.x, this.y *= e.y, this.z *= e.z, this
        }, t.prototype.multiply = function(e) {
            return new t(this.x * e.x, this.y * e.y, this.z * e.z)
        }, t.prototype.multiplyToRef = function(e, t) {
            return t.x = this.x * e.x, t.y = this.y * e.y, t.z = this.z * e.z, this
        }, t.prototype.multiplyByFloats = function(e, i, r) {
            return new t(this.x * e, this.y * i, this.z * r)
        }, t.prototype.divide = function(e) {
            return new t(this.x / e.x, this.y / e.y, this.z / e.z)
        }, t.prototype.divideToRef = function(e, t) {
            return t.x = this.x / e.x, t.y = this.y / e.y, t.z = this.z / e.z, this
        }, t.prototype.divideInPlace = function(e) {
            return this.divideToRef(e, this)
        }, t.prototype.minimizeInPlace = function(e) {
            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), this
        }, t.prototype.maximizeInPlace = function(e) {
            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), this
        }, Object.defineProperty(t.prototype, "isNonUniform", {
            get: function() {
                var e = Math.abs(this.x),
                    t = Math.abs(this.y);
                if (e !== t) return !0;
                var i = Math.abs(this.z);
                return e !== i || t !== i
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.length = function() {
            return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z)
        }, t.prototype.lengthSquared = function() {
            return this.x * this.x + this.y * this.y + this.z * this.z
        }, t.prototype.normalize = function() {
            var e = this.length();
            if (0 === e || 1 === e) return this;
            var t = 1 / e;
            return this.x *= t, this.y *= t, this.z *= t, this
        }, t.prototype.normalizeToNew = function() {
            var e = new t(0, 0, 0);
            return this.normalizeToRef(e), e
        }, t.prototype.normalizeToRef = function(e) {
            var t = this.length();
            if (0 === t || 1 === t) return e.set(this.x, this.y, this.z), e;
            var i = 1 / t;
            return this.scaleToRef(i, e), e
        }, t.prototype.clone = function() {
            return new t(this.x, this.y, this.z)
        }, t.prototype.copyFrom = function(e) {
            return this.x = e.x, this.y = e.y, this.z = e.z, this
        }, t.prototype.copyFromFloats = function(e, t, i) {
            return this.x = e, this.y = t, this.z = i, this
        }, t.prototype.set = function(e, t, i) {
            return this.copyFromFloats(e, t, i)
        }, t.GetClipFactor = function(e, i, r, n) {
            var o = t.Dot(e, r) - n;
            return o / (o - (t.Dot(i, r) - n))
        }, t.GetAngleBetweenVectors = function(e, i, r) {
            var n = e.clone().normalize(),
                o = i.clone().normalize(),
                s = t.Dot(n, o),
                a = t.Cross(n, o);
            return t.Dot(a, r) > 0 ? Math.acos(s) : -Math.acos(s)
        }, t.FromArray = function(e, i) {
            return i || (i = 0), new t(e[i], e[i + 1], e[i + 2])
        }, t.FromFloatArray = function(e, i) {
            return t.FromArray(e, i)
        }, t.FromArrayToRef = function(e, t, i) {
            i.x = e[t], i.y = e[t + 1], i.z = e[t + 2]
        }, t.FromFloatArrayToRef = function(e, i, r) {
            return t.FromArrayToRef(e, i, r)
        }, t.FromFloatsToRef = function(e, t, i, r) {
            r.x = e, r.y = t, r.z = i
        }, t.Zero = function() {
            return new t(0, 0, 0)
        }, t.One = function() {
            return new t(1, 1, 1)
        }, t.Up = function() {
            return new t(0, 1, 0)
        }, t.Forward = function() {
            return new t(0, 0, 1)
        }, t.Right = function() {
            return new t(1, 0, 0)
        }, t.Left = function() {
            return new t(-1, 0, 0)
        }, t.TransformCoordinates = function(e, i) {
            var r = t.Zero();
            return t.TransformCoordinatesToRef(e, i, r), r
        }, t.TransformCoordinatesToRef = function(e, t, i) {
            var r = e.x * t.m[0] + e.y * t.m[4] + e.z * t.m[8] + t.m[12],
                n = e.x * t.m[1] + e.y * t.m[5] + e.z * t.m[9] + t.m[13],
                o = e.x * t.m[2] + e.y * t.m[6] + e.z * t.m[10] + t.m[14],
                s = e.x * t.m[3] + e.y * t.m[7] + e.z * t.m[11] + t.m[15];
            i.x = r / s, i.y = n / s, i.z = o / s
        }, t.TransformCoordinatesFromFloatsToRef = function(e, t, i, r, n) {
            var o = e * r.m[0] + t * r.m[4] + i * r.m[8] + r.m[12],
                s = e * r.m[1] + t * r.m[5] + i * r.m[9] + r.m[13],
                a = e * r.m[2] + t * r.m[6] + i * r.m[10] + r.m[14],
                l = e * r.m[3] + t * r.m[7] + i * r.m[11] + r.m[15];
            n.x = o / l, n.y = s / l, n.z = a / l
        }, t.TransformNormal = function(e, i) {
            var r = t.Zero();
            return t.TransformNormalToRef(e, i, r), r
        }, t.TransformNormalToRef = function(e, t, i) {
            var r = e.x * t.m[0] + e.y * t.m[4] + e.z * t.m[8],
                n = e.x * t.m[1] + e.y * t.m[5] + e.z * t.m[9],
                o = e.x * t.m[2] + e.y * t.m[6] + e.z * t.m[10];
            i.x = r, i.y = n, i.z = o
        }, t.TransformNormalFromFloatsToRef = function(e, t, i, r, n) {
            n.x = e * r.m[0] + t * r.m[4] + i * r.m[8], n.y = e * r.m[1] + t * r.m[5] + i * r.m[9], n.z = e * r.m[2] + t * r.m[6] + i * r.m[10]
        }, t.CatmullRom = function(e, i, r, n, o) {
            var s = o * o,
                a = o * s;
            return new t(.5 * (2 * i.x + (-e.x + r.x) * o + (2 * e.x - 5 * i.x + 4 * r.x - n.x) * s + (-e.x + 3 * i.x - 3 * r.x + n.x) * a), .5 * (2 * i.y + (-e.y + r.y) * o + (2 * e.y - 5 * i.y + 4 * r.y - n.y) * s + (-e.y + 3 * i.y - 3 * r.y + n.y) * a), .5 * (2 * i.z + (-e.z + r.z) * o + (2 * e.z - 5 * i.z + 4 * r.z - n.z) * s + (-e.z + 3 * i.z - 3 * r.z + n.z) * a))
        }, t.Clamp = function(e, i, r) {
            var n = e.x;
            n = n > r.x ? r.x : n, n = n < i.x ? i.x : n;
            var o = e.y;
            o = o > r.y ? r.y : o, o = o < i.y ? i.y : o;
            var s = e.z;
            return s = s > r.z ? r.z : s, s = s < i.z ? i.z : s, new t(n, o, s)
        }, t.Hermite = function(e, i, r, n, o) {
            var s = o * o,
                a = o * s,
                l = 2 * a - 3 * s + 1,
                c = -2 * a + 3 * s,
                h = a - 2 * s + o,
                u = a - s;
            return new t(e.x * l + r.x * c + i.x * h + n.x * u, e.y * l + r.y * c + i.y * h + n.y * u, e.z * l + r.z * c + i.z * h + n.z * u)
        }, t.Lerp = function(e, i, r) {
            var n = new t(0, 0, 0);
            return t.LerpToRef(e, i, r, n), n
        }, t.LerpToRef = function(e, t, i, r) {
            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
        }, t.Dot = function(e, t) {
            return e.x * t.x + e.y * t.y + e.z * t.z
        }, t.Cross = function(e, i) {
            var r = t.Zero();
            return t.CrossToRef(e, i, r), r
        }, t.CrossToRef = function(e, t, i) {
            E.Vector3[0].x = e.y * t.z - e.z * t.y, E.Vector3[0].y = e.z * t.x - e.x * t.z, E.Vector3[0].z = e.x * t.y - e.y * t.x, i.copyFrom(E.Vector3[0])
        }, t.Normalize = function(e) {
            var i = t.Zero();
            return t.NormalizeToRef(e, i), i
        }, t.NormalizeToRef = function(e, t) {
            t.copyFrom(e), t.normalize()
        }, t.Project = function(e, i, r, n) {
            var o = n.width,
                s = n.height,
                a = n.x,
                c = n.y,
                h = t._viewportMatrixCache ? t._viewportMatrixCache : t._viewportMatrixCache = new l;
            l.FromValuesToRef(o / 2, 0, 0, 0, 0, -s / 2, 0, 0, 0, 0, .5, 0, a + o / 2, s / 2 + c, .5, 1, h);
            var u = E.Matrix[0];
            return i.multiplyToRef(r, u), u.multiplyToRef(h, u), t.TransformCoordinates(e, u)
        }, t.UnprojectFromTransform = function(i, r, n, o, s) {
            var a = E.Matrix[0];
            o.multiplyToRef(s, a), a.invert(), i.x = i.x / r * 2 - 1, i.y = -(i.y / n * 2 - 1);
            var l = t.TransformCoordinates(i, a),
                c = i.x * a.m[3] + i.y * a.m[7] + i.z * a.m[11] + a.m[15];
            return e.Scalar.WithinEpsilon(c, 1) && (l = l.scale(1 / c)), l
        }, t.Unproject = function(e, i, r, n, o, s) {
            var a = t.Zero();
            return t.UnprojectToRef(e, i, r, n, o, s, a), a
        }, t.UnprojectToRef = function(e, i, r, n, o, s, a) {
            t.UnprojectFloatsToRef(e.x, e.y, e.z, i, r, n, o, s, a)
        }, t.UnprojectFloatsToRef = function(i, r, n, o, s, a, l, c, h) {
            var u = E.Matrix[0];
            a.multiplyToRef(l, u), u.multiplyToRef(c, u), u.invert();
            var f = E.Vector3[0];
            f.x = i / o * 2 - 1, f.y = -(r / s * 2 - 1), f.z = 2 * n - 1, t.TransformCoordinatesToRef(f, u, h);
            var d = f.x * u.m[3] + f.y * u.m[7] + f.z * u.m[11] + u.m[15];
            e.Scalar.WithinEpsilon(d, 1) && h.scaleInPlace(1 / d)
        }, t.Minimize = function(e, t) {
            var i = e.clone();
            return i.minimizeInPlace(t), i
        }, t.Maximize = function(e, t) {
            var i = e.clone();
            return i.maximizeInPlace(t), i
        }, t.Distance = function(e, i) {
            return Math.sqrt(t.DistanceSquared(e, i))
        }, t.DistanceSquared = function(e, t) {
            var i = e.x - t.x,
                r = e.y - t.y,
                n = e.z - t.z;
            return i * i + r * r + n * n
        }, t.Center = function(e, t) {
            var i = e.add(t);
            return i.scaleInPlace(.5), i
        }, t.RotationFromAxis = function(e, i, r) {
            var n = t.Zero();
            return t.RotationFromAxisToRef(e, i, r, n), n
        }, t.RotationFromAxisToRef = function(e, t, i, r) {
            var n = E.Quaternion[0];
            a.RotationQuaternionFromAxisToRef(e, t, i, n), n.toEulerAnglesToRef(r)
        }, t
    })();
    e.Vector3 = n;
    var o = (function() {
        function t(e, t, i, r) {
            this.x = e, this.y = t, this.z = i, this.w = r
        }
        return t.prototype.toString = function() {
            return "{X: " + this.x + " Y:" + this.y + " Z:" + this.z + " W:" + this.w + "}"
        }, t.prototype.getClassName = function() {
            return "Vector4"
        }, t.prototype.getHashCode = function() {
            var e = this.x || 0;
            return e = 397 * e ^ (this.y || 0), e = 397 * e ^ (this.z || 0), e = 397 * e ^ (this.w || 0)
        }, t.prototype.asArray = function() {
            var e = new Array;
            return this.toArray(e, 0), e
        }, t.prototype.toArray = function(e, t) {
            return void 0 === t && (t = 0), e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, e[t + 3] = this.w, this
        }, t.prototype.addInPlace = function(e) {
            return this.x += e.x, this.y += e.y, this.z += e.z, this.w += e.w, this
        }, t.prototype.add = function(e) {
            return new t(this.x + e.x, this.y + e.y, this.z + e.z, this.w + e.w)
        }, t.prototype.addToRef = function(e, t) {
            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, this
        }, t.prototype.subtractInPlace = function(e) {
            return this.x -= e.x, this.y -= e.y, this.z -= e.z, this.w -= e.w, this
        }, t.prototype.subtract = function(e) {
            return new t(this.x - e.x, this.y - e.y, this.z - e.z, this.w - e.w)
        }, t.prototype.subtractToRef = function(e, t) {
            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, this
        }, t.prototype.subtractFromFloats = function(e, i, r, n) {
            return new t(this.x - e, this.y - i, this.z - r, this.w - n)
        }, t.prototype.subtractFromFloatsToRef = function(e, t, i, r, n) {
            return n.x = this.x - e, n.y = this.y - t, n.z = this.z - i, n.w = this.w - r, this
        }, t.prototype.negate = function() {
            return new t(-this.x, -this.y, -this.z, -this.w)
        }, t.prototype.scaleInPlace = function(e) {
            return this.x *= e, this.y *= e, this.z *= e, this.w *= e, this
        }, t.prototype.scale = function(e) {
            return new t(this.x * e, this.y * e, this.z * e, this.w * e)
        }, t.prototype.scaleToRef = function(e, t) {
            return t.x = this.x * e, t.y = this.y * e, t.z = this.z * e, t.w = this.w * e, this
        }, t.prototype.equals = function(e) {
            return e && this.x === e.x && this.y === e.y && this.z === e.z && this.w === e.w
        }, t.prototype.equalsWithEpsilon = function(t, i) {
            return void 0 === i && (i = e.Epsilon), t && e.Scalar.WithinEpsilon(this.x, t.x, i) && e.Scalar.WithinEpsilon(this.y, t.y, i) && e.Scalar.WithinEpsilon(this.z, t.z, i) && e.Scalar.WithinEpsilon(this.w, t.w, i)
        }, t.prototype.equalsToFloats = function(e, t, i, r) {
            return this.x === e && this.y === t && this.z === i && this.w === r
        }, t.prototype.multiplyInPlace = function(e) {
            return this.x *= e.x, this.y *= e.y, this.z *= e.z, this.w *= e.w, this
        }, t.prototype.multiply = function(e) {
            return new t(this.x * e.x, this.y * e.y, this.z * e.z, this.w * e.w)
        }, t.prototype.multiplyToRef = function(e, t) {
            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, this
        }, t.prototype.multiplyByFloats = function(e, i, r, n) {
            return new t(this.x * e, this.y * i, this.z * r, this.w * n)
        }, t.prototype.divide = function(e) {
            return new t(this.x / e.x, this.y / e.y, this.z / e.z, this.w / e.w)
        }, t.prototype.divideToRef = function(e, t) {
            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, this
        }, t.prototype.divideInPlace = function(e) {
            return this.divideToRef(e, this)
        }, t.prototype.minimizeInPlace = function(e) {
            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
        }, t.prototype.maximizeInPlace = function(e) {
            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
        }, t.prototype.length = function() {
            return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
        }, t.prototype.lengthSquared = function() {
            return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w
        }, t.prototype.normalize = function() {
            var e = this.length();
            if (0 === e) return this;
            var t = 1 / e;
            return this.x *= t, this.y *= t, this.z *= t, this.w *= t, this
        }, t.prototype.toVector3 = function() {
            return new n(this.x, this.y, this.z)
        }, t.prototype.clone = function() {
            return new t(this.x, this.y, this.z, this.w)
        }, t.prototype.copyFrom = function(e) {
            return this.x = e.x, this.y = e.y, this.z = e.z, this.w = e.w, this
        }, t.prototype.copyFromFloats = function(e, t, i, r) {
            return this.x = e, this.y = t, this.z = i, this.w = r, this
        }, t.prototype.set = function(e, t, i, r) {
            return this.copyFromFloats(e, t, i, r)
        }, t.FromArray = function(e, i) {
            return i || (i = 0), new t(e[i], e[i + 1], e[i + 2], e[i + 3])
        }, t.FromArrayToRef = function(e, t, i) {
            i.x = e[t], i.y = e[t + 1], i.z = e[t + 2], i.w = e[t + 3]
        }, t.FromFloatArrayToRef = function(e, i, r) {
            t.FromArrayToRef(e, i, r)
        }, t.FromFloatsToRef = function(e, t, i, r, n) {
            n.x = e, n.y = t, n.z = i, n.w = r
        }, t.Zero = function() {
            return new t(0, 0, 0, 0)
        }, t.One = function() {
            return new t(1, 1, 1, 1)
        }, t.Normalize = function(e) {
            var i = t.Zero();
            return t.NormalizeToRef(e, i), i
        }, t.NormalizeToRef = function(e, t) {
            t.copyFrom(e), t.normalize()
        }, t.Minimize = function(e, t) {
            var i = e.clone();
            return i.minimizeInPlace(t), i
        }, t.Maximize = function(e, t) {
            var i = e.clone();
            return i.maximizeInPlace(t), i
        }, t.Distance = function(e, i) {
            return Math.sqrt(t.DistanceSquared(e, i))
        }, t.DistanceSquared = function(e, t) {
            var i = e.x - t.x,
                r = e.y - t.y,
                n = e.z - t.z,
                o = e.w - t.w;
            return i * i + r * r + n * n + o * o
        }, t.Center = function(e, t) {
            var i = e.add(t);
            return i.scaleInPlace(.5), i
        }, t.TransformNormal = function(e, i) {
            var r = t.Zero();
            return t.TransformNormalToRef(e, i, r), r
        }, t.TransformNormalToRef = function(e, t, i) {
            var r = e.x * t.m[0] + e.y * t.m[4] + e.z * t.m[8],
                n = e.x * t.m[1] + e.y * t.m[5] + e.z * t.m[9],
                o = e.x * t.m[2] + e.y * t.m[6] + e.z * t.m[10];
            i.x = r, i.y = n, i.z = o, i.w = e.w
        }, t.TransformNormalFromFloatsToRef = function(e, t, i, r, n, o) {
            o.x = e * n.m[0] + t * n.m[4] + i * n.m[8], o.y = e * n.m[1] + t * n.m[5] + i * n.m[9], o.z = e * n.m[2] + t * n.m[6] + i * n.m[10], o.w = r
        }, t
    })();
    e.Vector4 = o;
    var s = (function() {
        function e(e, t) {
            this.width = e, this.height = t
        }
        return e.prototype.toString = function() {
            return "{W: " + this.width + ", H: " + this.height + "}"
        }, e.prototype.getClassName = function() {
            return "Size"
        }, e.prototype.getHashCode = function() {
            var e = this.width || 0;
            return e = 397 * e ^ (this.height || 0)
        }, e.prototype.copyFrom = function(e) {
            this.width = e.width, this.height = e.height
        }, e.prototype.copyFromFloats = function(e, t) {
            return this.width = e, this.height = t, this
        }, e.prototype.set = function(e, t) {
            return this.copyFromFloats(e, t)
        }, e.prototype.multiplyByFloats = function(t, i) {
            return new e(this.width * t, this.height * i)
        }, e.prototype.clone = function() {
            return new e(this.width, this.height)
        }, e.prototype.equals = function(e) {
            return !!e && (this.width === e.width && this.height === e.height)
        }, Object.defineProperty(e.prototype, "surface", {
            get: function() {
                return this.width * this.height
            },
            enumerable: !0,
            configurable: !0
        }), e.Zero = function() {
            return new e(0, 0)
        }, e.prototype.add = function(t) {
            return new e(this.width + t.width, this.height + t.height)
        }, e.prototype.subtract = function(t) {
            return new e(this.width - t.width, this.height - t.height)
        }, e.Lerp = function(t, i, r) {
            return new e(t.width + (i.width - t.width) * r, t.height + (i.height - t.height) * r)
        }, e
    })();
    e.Size = s;
    var a = (function() {
        function e(e, t, i, r) {
            void 0 === e && (e = 0), void 0 === t && (t = 0), void 0 === i && (i = 0), void 0 === r && (r = 1), this.x = e, this.y = t, this.z = i, this.w = r
        }
        return e.prototype.toString = function() {
            return "{X: " + this.x + " Y:" + this.y + " Z:" + this.z + " W:" + this.w + "}"
        }, e.prototype.getClassName = function() {
            return "Quaternion"
        }, e.prototype.getHashCode = function() {
            var e = this.x || 0;
            return e = 397 * e ^ (this.y || 0), e = 397 * e ^ (this.z || 0), e = 397 * e ^ (this.w || 0)
        }, e.prototype.asArray = function() {
            return [this.x, this.y, this.z, this.w]
        }, e.prototype.equals = function(e) {
            return e && this.x === e.x && this.y === e.y && this.z === e.z && this.w === e.w
        }, e.prototype.clone = function() {
            return new e(this.x, this.y, this.z, this.w)
        }, e.prototype.copyFrom = function(e) {
            return this.x = e.x, this.y = e.y, this.z = e.z, this.w = e.w, this
        }, e.prototype.copyFromFloats = function(e, t, i, r) {
            return this.x = e, this.y = t, this.z = i, this.w = r, this
        }, e.prototype.set = function(e, t, i, r) {
            return this.copyFromFloats(e, t, i, r)
        }, e.prototype.add = function(t) {
            return new e(this.x + t.x, this.y + t.y, this.z + t.z, this.w + t.w)
        }, e.prototype.subtract = function(t) {
            return new e(this.x - t.x, this.y - t.y, this.z - t.z, this.w - t.w)
        }, e.prototype.scale = function(t) {
            return new e(this.x * t, this.y * t, this.z * t, this.w * t)
        }, e.prototype.multiply = function(t) {
            var i = new e(0, 0, 0, 1);
            return this.multiplyToRef(t, i), i
        }, e.prototype.multiplyToRef = function(e, t) {
            var 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,
                n = this.x * e.y - this.y * e.x + this.z * e.w + this.w * e.z,
                o = -this.x * e.x - this.y * e.y - this.z * e.z + this.w * e.w;
            return t.copyFromFloats(i, r, n, o), this
        }, e.prototype.multiplyInPlace = function(e) {
            return this.multiplyToRef(e, this), this
        }, e.prototype.conjugateToRef = function(e) {
            return e.copyFromFloats(-this.x, -this.y, -this.z, this.w), this
        }, e.prototype.conjugateInPlace = function() {
            return this.x *= -1, this.y *= -1, this.z *= -1, this
        }, e.prototype.conjugate = function() {
            return new e(-this.x, -this.y, -this.z, this.w)
        }, e.prototype.length = function() {
            return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
        }, e.prototype.normalize = function() {
            var e = 1 / this.length();
            return this.x *= e, this.y *= e, this.z *= e, this.w *= e, this
        }, e.prototype.toEulerAngles = function(e) {
            void 0 === e && (e = "YZX");
            var t = n.Zero();
            return this.toEulerAnglesToRef(t, e), t
        }, e.prototype.toEulerAnglesToRef = function(e, t) {
            void 0 === t && (t = "YZX");
            var i = this.z,
                r = this.x,
                n = this.y,
                o = this.w,
                s = o * o,
                a = i * i,
                l = r * r,
                c = n * n,
                h = n * i - r * o;
            return h < -.4999999 ? (e.y = 2 * Math.atan2(n, o), e.x = Math.PI / 2, e.z = 0) : h > .4999999 ? (e.y = 2 * Math.atan2(n, o), e.x = -Math.PI / 2, e.z = 0) : (e.z = Math.atan2(2 * (r * n + i * o), -a - l + c + s), e.x = Math.asin(-2 * (i * n - r * o)), e.y = Math.atan2(2 * (i * r + n * o), a - l - c + s)), this
        }, e.prototype.toRotationMatrix = function(e) {
            var t = this.x * this.x,
                i = this.y * this.y,
                r = this.z * this.z,
                n = this.x * this.y,
                o = this.z * this.w,
                s = this.z * this.x,
                a = this.y * this.w,
                l = this.y * this.z,
                c = this.x * this.w;
            return e.m[0] = 1 - 2 * (i + r), e.m[1] = 2 * (n + o), e.m[2] = 2 * (s - a), e.m[3] = 0, e.m[4] = 2 * (n - o), e.m[5] = 1 - 2 * (r + t), e.m[6] = 2 * (l + c), e.m[7] = 0, e.m[8] = 2 * (s + a), e.m[9] = 2 * (l - c), e.m[10] = 1 - 2 * (i + t), e.m[11] = 0, e.m[12] = 0, e.m[13] = 0, e.m[14] = 0, e.m[15] = 1, e._markAsUpdated(), this
        }, e.prototype.fromRotationMatrix = function(t) {
            return e.FromRotationMatrixToRef(t, this), this
        }, e.FromRotationMatrix = function(t) {
            var i = new e;
            return e.FromRotationMatrixToRef(t, i), i
        }, e.FromRotationMatrixToRef = function(e, t) {
            var i, r = e.m,
                n = r[0],
                o = r[4],
                s = r[8],
                a = r[1],
                l = r[5],
                c = r[9],
                h = r[2],
                u = r[6],
                f = r[10],
                d = n + l + f;
            d > 0 ? (i = .5 / Math.sqrt(d + 1), t.w = .25 / i, t.x = (u - c) * i, t.y = (s - h) * i, t.z = (a - o) * i) : n > l && n > f ? (i = 2 * Math.sqrt(1 + n - l - f), t.w = (u - c) / i, t.x = .25 * i, t.y = (o + a) / i, t.z = (s + h) / i) : l > f ? (i = 2 * Math.sqrt(1 + l - n - f), t.w = (s - h) / i, t.x = (o + a) / i, t.y = .25 * i, t.z = (c + u) / i) : (i = 2 * Math.sqrt(1 + f - n - l), t.w = (a - o) / i, t.x = (s + h) / i, t.y = (c + u) / i, t.z = .25 * i)
        }, e.Zero = function() {
            return new e(0, 0, 0, 0)
        }, e.Inverse = function(t) {
            return new e(-t.x, -t.y, -t.z, t.w)
        }, e.Identity = function() {
            return new e(0, 0, 0, 1)
        }, e.IsIdentity = function(e) {
            return e && 0 === e.x && 0 === e.y && 0 === e.z && 1 === e.w
        }, e.RotationAxis = function(t, i) {
            return e.RotationAxisToRef(t, i, new e)
        }, e.RotationAxisToRef = function(e, t, i) {
            var r = Math.sin(t / 2);
            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
        }, e.FromArray = function(t, i) {
            return i || (i = 0), new e(t[i], t[i + 1], t[i + 2], t[i + 3])
        }, e.RotationYawPitchRoll = function(t, i, r) {
            var n = new e;
            return e.RotationYawPitchRollToRef(t, i, r, n), n
        }, e.RotationYawPitchRollToRef = function(e, t, i, r) {
            var n = .5 * i,
                o = .5 * t,
                s = .5 * e,
                a = Math.sin(n),
                l = Math.cos(n),
                c = Math.sin(o),
                h = Math.cos(o),
                u = Math.sin(s),
                f = Math.cos(s);
            r.x = f * c * l + u * h * a, r.y = u * h * l - f * c * a, r.z = f * h * a - u * c * l, r.w = f * h * l + u * c * a
        }, e.RotationAlphaBetaGamma = function(t, i, r) {
            var n = new e;
            return e.RotationAlphaBetaGammaToRef(t, i, r, n), n
        }, e.RotationAlphaBetaGammaToRef = function(e, t, i, r) {
            var n = .5 * (i + e),
                o = .5 * (i - e),
                s = .5 * t;
            r.x = Math.cos(o) * Math.sin(s), r.y = Math.sin(o) * Math.sin(s), r.z = Math.sin(n) * Math.cos(s), r.w = Math.cos(n) * Math.cos(s)
        }, e.RotationQuaternionFromAxis = function(t, i, r, n) {
            var o = new e(0, 0, 0, 0);
            return e.RotationQuaternionFromAxisToRef(t, i, r, o), o
        }, e.RotationQuaternionFromAxisToRef = function(t, i, r, n) {
            var o = E.Matrix[0];
            l.FromXYZAxesToRef(t.normalize(), i.normalize(), r.normalize(), o), e.FromRotationMatrixToRef(o, n)
        }, e.Slerp = function(t, i, r) {
            var n = e.Identity();
            return e.SlerpToRef(t, i, r, n), n
        }, e.SlerpToRef = function(e, t, i, r) {
            var n, o, s = i,
                a = e.x * t.x + e.y * t.y + e.z * t.z + e.w * t.w,
                l = !1;
            if (a < 0 && (l = !0, a = -a), a > .999999) o = 1 - s, n = l ? -s : s;
            else {
                var c = Math.acos(a),
                    h = 1 / Math.sin(c);
                o = Math.sin((1 - s) * c) * h, n = l ? -Math.sin(s * c) * h : Math.sin(s * c) * h
            }
            r.x = o * e.x + n * t.x, r.y = o * e.y + n * t.y, r.z = o * e.z + n * t.z, r.w = o * e.w + n * t.w
        }, e.Hermite = function(t, i, r, n, o) {
            var s = o * o,
                a = o * s,
                l = 2 * a - 3 * s + 1,
                c = -2 * a + 3 * s,
                h = a - 2 * s + o,
                u = a - s;
            return new e(t.x * l + r.x * c + i.x * h + n.x * u, t.y * l + r.y * c + i.y * h + n.y * u, t.z * l + r.z * c + i.z * h + n.z * u, t.w * l + r.w * c + i.w * h + n.w * u)
        }, e
    })();
    e.Quaternion = a;
    var l = (function() {
        function e() {
            this._isIdentity = !1, this._isIdentityDirty = !0, this.m = new Float32Array(16), this._markAsUpdated()
        }
        return e.prototype._markAsUpdated = function() {
            this.updateFlag = e._updateFlagSeed++, this._isIdentityDirty = !0
        }, e.prototype.isIdentity = function(e) {
            return void 0 === e && (e = !1), this._isIdentityDirty && (this._isIdentityDirty = !1, 1 !== this.m[0] || 1 !== this.m[5] || 1 !== this.m[15] ? this._isIdentity = !1 : 0 !== 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[11] || 0 !== this.m[12] || 0 !== this.m[13] || 0 !== this.m[14] ? this._isIdentity = !1 : this._isIdentity = !0, e || 1 === this.m[10] || (this._isIdentity = !1)), this._isIdentity
        }, e.prototype.determinant = function() {
            var e = this.m[10] * this.m[15] - this.m[11] * this.m[14],
                t = this.m[9] * this.m[15] - this.m[11] * this.m[13],
                i = this.m[9] * this.m[14] - this.m[10] * this.m[13],
                r = this.m[8] * this.m[15] - this.m[11] * this.m[12],
                n = this.m[8] * this.m[14] - this.m[10] * this.m[12],
                o = this.m[8] * this.m[13] - this.m[9] * this.m[12];
            return this.m[0] * (this.m[5] * e - this.m[6] * t + this.m[7] * i) - this.m[1] * (this.m[4] * e - this.m[6] * r + this.m[7] * n) + this.m[2] * (this.m[4] * t - this.m[5] * r + this.m[7] * o) - this.m[3] * (this.m[4] * i - this.m[5] * n + this.m[6] * o)
        }, e.prototype.toArray = function() {
            return this.m
        }, e.prototype.asArray = function() {
            return this.toArray()
        }, e.prototype.invert = function() {
            return this.invertToRef(this), this
        }, e.prototype.reset = function() {
            for (var e = 0; e < 16; e++) this.m[e] = 0;
            return this._markAsUpdated(), this
        }, e.prototype.add = function(t) {
            var i = new e;
            return this.addToRef(t, i), i
        }, e.prototype.addToRef = function(e, t) {
            for (var i = 0; i < 16; i++) t.m[i] = this.m[i] + e.m[i];
            return t._markAsUpdated(), this
        }, e.prototype.addToSelf = function(e) {
            for (var t = 0; t < 16; t++) this.m[t] += e.m[t];
            return this._markAsUpdated(), this
        }, e.prototype.invertToRef = function(e) {
            var t = this.m[0],
                i = this.m[1],
                r = this.m[2],
                n = this.m[3],
                o = this.m[4],
                s = this.m[5],
                a = this.m[6],
                l = this.m[7],
                c = this.m[8],
                h = this.m[9],
                u = this.m[10],
                f = this.m[11],
                d = this.m[12],
                p = this.m[13],
                _ = this.m[14],
                m = this.m[15],
                g = u * m - f * _,
                v = h * m - f * p,
                y = h * _ - u * p,
                b = c * m - f * d,
                x = c * _ - u * d,
                T = c * p - h * d,
                E = s * g - a * v + l * y,
                A = -(o * g - a * b + l * x),
                P = o * v - s * b + l * T,
                M = -(o * y - s * x + a * T),
                S = 1 / (t * E + i * A + r * P + n * M),
                C = a * m - l * _,
                R = s * m - l * p,
                O = s * _ - a * p,
                I = o * m - l * d,
                D = o * _ - a * d,
                B = o * p - s * d,
                L = a * f - l * u,
                w = s * f - l * h,
                F = s * u - a * h,
                N = o * f - l * c,
                V = o * u - a * c,
                U = o * h - s * c;
            return e.m[0] = E * S, e.m[4] = A * S, e.m[8] = P * S, e.m[12] = M * S, e.m[1] = -(i * g - r * v + n * y) * S, e.m[5] = (t * g - r * b + n * x) * S, e.m[9] = -(t * v - i * b + n * T) * S, e.m[13] = (t * y - i * x + r * T) * S, e.m[2] = (i * C - r * R + n * O) * S, e.m[6] = -(t * C - r * I + n * D) * S, e.m[10] = (t * R - i * I + n * B) * S, e.m[14] = -(t * O - i * D + r * B) * S, e.m[3] = -(i * L - r * w + n * F) * S, e.m[7] = (t * L - r * N + n * V) * S, e.m[11] = -(t * w - i * N + n * U) * S, e.m[15] = (t * F - i * V + r * U) * S, e._markAsUpdated(), this
        }, e.prototype.setTranslationFromFloats = function(e, t, i) {
            return this.m[12] = e, this.m[13] = t, this.m[14] = i, this._markAsUpdated(), this
        }, e.prototype.setTranslation = function(e) {
            return this.m[12] = e.x, this.m[13] = e.y, this.m[14] = e.z, this._markAsUpdated(), this
        }, e.prototype.getTranslation = function() {
            return new n(this.m[12], this.m[13], this.m[14])
        }, e.prototype.getTranslationToRef = function(e) {
            return e.x = this.m[12], e.y = this.m[13], e.z = this.m[14], this
        }, e.prototype.removeRotationAndScaling = function() {
            return this.setRowFromFloats(0, 1, 0, 0, 0), this.setRowFromFloats(1, 0, 1, 0, 0), this.setRowFromFloats(2, 0, 0, 1, 0), this
        }, e.prototype.multiply = function(t) {
            var i = new e;
            return this.multiplyToRef(t, i), i
        }, e.prototype.copyFrom = function(e) {
            for (var t = 0; t < 16; t++) this.m[t] = e.m[t];
            return this._markAsUpdated(), this
        }, e.prototype.copyToArray = function(e, t) {
            void 0 === t && (t = 0);
            for (var i = 0; i < 16; i++) e[t + i] = this.m[i];
            return this
        }, e.prototype.multiplyToRef = function(e, t) {
            return this.multiplyToArray(e, t.m, 0), t._markAsUpdated(), this
        }, e.prototype.multiplyToArray = function(e, t, i) {
            var r = this.m[0],
                n = this.m[1],
                o = this.m[2],
                s = this.m[3],
                a = this.m[4],
                l = this.m[5],
                c = this.m[6],
                h = this.m[7],
                u = this.m[8],
                f = this.m[9],
                d = this.m[10],
                p = this.m[11],
                _ = this.m[12],
                m = this.m[13],
                g = this.m[14],
                v = this.m[15],
                y = e.m[0],
                b = e.m[1],
                x = e.m[2],
                T = e.m[3],
                E = e.m[4],
                A = e.m[5],
                P = e.m[6],
                M = e.m[7],
                S = e.m[8],
                C = e.m[9],
                R = e.m[10],
                O = e.m[11],
                I = e.m[12],
                D = e.m[13],
                B = e.m[14],
                L = e.m[15];
            return t[i] = r * y + n * E + o * S + s * I, t[i + 1] = r * b + n * A + o * C + s * D, t[i + 2] = r * x + n * P + o * R + s * B, t[i + 3] = r * T + n * M + o * O + s * L, t[i + 4] = a * y + l * E + c * S + h * I, t[i + 5] = a * b + l * A + c * C + h * D, t[i + 6] = a * x + l * P + c * R + h * B, t[i + 7] = a * T + l * M + c * O + h * L, t[i + 8] = u * y + f * E + d * S + p * I, t[i + 9] = u * b + f * A + d * C + p * D, t[i + 10] = u * x + f * P + d * R + p * B, t[i + 11] = u * T + f * M + d * O + p * L, t[i + 12] = _ * y + m * E + g * S + v * I, t[i + 13] = _ * b + m * A + g * C + v * D, t[i + 14] = _ * x + m * P + g * R + v * B, t[i + 15] = _ * T + m * M + g * O + v * L, this
        }, e.prototype.equals = function(e) {
            return e && this.m[0] === e.m[0] && this.m[1] === e.m[1] && this.m[2] === e.m[2] && this.m[3] === e.m[3] && this.m[4] === e.m[4] && this.m[5] === e.m[5] && this.m[6] === e.m[6] && this.m[7] === e.m[7] && this.m[8] === e.m[8] && this.m[9] === e.m[9] && this.m[10] === e.m[10] && this.m[11] === e.m[11] && this.m[12] === e.m[12] && this.m[13] === e.m[13] && this.m[14] === e.m[14] && this.m[15] === e.m[15]
        }, e.prototype.clone = function() {
            return e.FromValues(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5], this.m[6], this.m[7], this.m[8], this.m[9], this.m[10], this.m[11], this.m[12], this.m[13], this.m[14], this.m[15])
        }, e.prototype.getClassName = function() {
            return "Matrix"
        }, e.prototype.getHashCode = function() {
            for (var e = this.m[0] || 0, t = 1; t < 16; t++) e = 397 * e ^ (this.m[t] || 0);
            return e
        }, e.prototype.decompose = function(t, i, r) {
            return r.x = this.m[12], r.y = this.m[13], r.z = this.m[14], t.x = Math.sqrt(this.m[0] * this.m[0] + this.m[1] * this.m[1] + this.m[2] * this.m[2]), t.y = Math.sqrt(this.m[4] * this.m[4] + this.m[5] * this.m[5] + this.m[6] * this.m[6]), t.z = Math.sqrt(this.m[8] * this.m[8] + this.m[9] * this.m[9] + this.m[10] * this.m[10]), this.determinant() <= 0 && (t.y *= -1), 0 === t.x || 0 === t.y || 0 === t.z ? (i.x = 0, i.y = 0, i.z = 0, i.w = 1, !1) : (e.FromValuesToRef(this.m[0] / t.x, this.m[1] / t.x, this.m[2] / t.x, 0, this.m[4] / t.y, this.m[5] / t.y, this.m[6] / t.y, 0, this.m[8] / t.z, this.m[9] / t.z, this.m[10] / t.z, 0, 0, 0, 0, 1, E.Matrix[0]), a.FromRotationMatrixToRef(E.Matrix[0], i), !0)
        }, e.prototype.toNormalMatrix = function(t) {
            this.invertToRef(t), t.transpose();
            var i = t.m;
            e.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, t)
        }, e.prototype.getRotationMatrix = function() {
            var t = e.Identity();
            return this.getRotationMatrixToRef(t), t
        }, e.prototype.getRotationMatrixToRef = function(t) {
            var i = this.m,
                r = i[0] * i[1] * i[2] * i[3] < 0 ? -1 : 1,
                n = i[4] * i[5] * i[6] * i[7] < 0 ? -1 : 1,
                o = i[8] * i[9] * i[10] * i[11] < 0 ? -1 : 1,
                s = r * Math.sqrt(i[0] * i[0] + i[1] * i[1] + i[2] * i[2]),
                a = n * Math.sqrt(i[4] * i[4] + i[5] * i[5] + i[6] * i[6]),
                l = o * Math.sqrt(i[8] * i[8] + i[9] * i[9] + i[10] * i[10]);
            return e.FromValuesToRef(i[0] / s, i[1] / s, i[2] / s, 0, i[4] / a, i[5] / a, i[6] / a, 0, i[8] / l, i[9] / l, i[10] / l, 0, 0, 0, 0, 1, t), this
        }, e.FromArray = function(t, i) {
            var r = new e;
            return i || (i = 0), e.FromArrayToRef(t, i, r), r
        }, e.FromArrayToRef = function(e, t, i) {
            for (var r = 0; r < 16; r++) i.m[r] = e[r + t];
            i._markAsUpdated()
        }, e.FromFloat32ArrayToRefScaled = function(e, t, i, r) {
            for (var n = 0; n < 16; n++) r.m[n] = e[n + t] * i;
            r._markAsUpdated()
        }, e.FromValuesToRef = function(e, t, i, r, n, o, s, a, l, c, h, u, f, d, p, _, m) {
            m.m[0] = e, m.m[1] = t, m.m[2] = i, m.m[3] = r, m.m[4] = n, m.m[5] = o, m.m[6] = s, m.m[7] = a, m.m[8] = l, m.m[9] = c, m.m[10] = h, m.m[11] = u, m.m[12] = f, m.m[13] = d, m.m[14] = p, m.m[15] = _, m._markAsUpdated()
        }, e.prototype.getRow = function(e) {
            if (e < 0 || e > 3) return null;
            var t = 4 * e;
            return new o(this.m[t + 0], this.m[t + 1], this.m[t + 2], this.m[t + 3])
        }, e.prototype.setRow = function(e, t) {
            if (e < 0 || e > 3) return this;
            var i = 4 * e;
            return this.m[i + 0] = t.x, this.m[i + 1] = t.y, this.m[i + 2] = t.z, this.m[i + 3] = t.w, this._markAsUpdated(), this
        }, e.prototype.transpose = function() {
            return e.Transpose(this)
        }, e.prototype.transposeToRef = function(t) {
            return e.TransposeToRef(this, t), this
        }, e.prototype.setRowFromFloats = function(e, t, i, r, n) {
            if (e < 0 || e > 3) return this;
            var o = 4 * e;
            return this.m[o + 0] = t, this.m[o + 1] = i, this.m[o + 2] = r, this.m[o + 3] = n, this._markAsUpdated(), this
        }, Object.defineProperty(e, "IdentityReadOnly", {
            get: function() {
                return e._identityReadOnly
            },
            enumerable: !0,
            configurable: !0
        }), e.FromValues = function(t, i, r, n, o, s, a, l, c, h, u, f, d, p, _, m) {
            var g = new e;
            return g.m[0] = t, g.m[1] = i, g.m[2] = r, g.m[3] = n, g.m[4] = o, g.m[5] = s, g.m[6] = a, g.m[7] = l, g.m[8] = c, g.m[9] = h, g.m[10] = u, g.m[11] = f, g.m[12] = d, g.m[13] = p, g.m[14] = _, g.m[15] = m, g
        }, e.Compose = function(t, i, r) {
            var n = e.Identity();
            return e.ComposeToRef(t, i, r, n), n
        }, e.ComposeToRef = function(t, i, r, n) {
            e.FromValuesToRef(t.x, 0, 0, 0, 0, t.y, 0, 0, 0, 0, t.z, 0, 0, 0, 0, 1, E.Matrix[1]), i.toRotationMatrix(E.Matrix[0]), E.Matrix[1].multiplyToRef(E.Matrix[0], n), n.setTranslation(r)
        }, e.Identity = function() {
            return e.FromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
        }, e.IdentityToRef = function(t) {
            e.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, t)
        }, e.Zero = function() {
            return e.FromValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
        }, e.RotationX = function(t) {
            var i = new e;
            return e.RotationXToRef(t, i), i
        }, e.Invert = function(t) {
            var i = new e;
            return t.invertToRef(i), i
        }, e.RotationXToRef = function(e, t) {
            var i = Math.sin(e),
                r = Math.cos(e);
            t.m[0] = 1, t.m[15] = 1, t.m[5] = r, t.m[10] = r, t.m[9] = -i, t.m[6] = i, t.m[1] = 0, t.m[2] = 0, t.m[3] = 0, t.m[4] = 0, t.m[7] = 0, t.m[8] = 0, t.m[11] = 0, t.m[12] = 0, t.m[13] = 0, t.m[14] = 0, t._markAsUpdated()
        }, e.RotationY = function(t) {
            var i = new e;
            return e.RotationYToRef(t, i), i
        }, e.RotationYToRef = function(e, t) {
            var i = Math.sin(e),
                r = Math.cos(e);
            t.m[5] = 1, t.m[15] = 1, t.m[0] = r, t.m[2] = -i, t.m[8] = i, t.m[10] = r, t.m[1] = 0, t.m[3] = 0, t.m[4] = 0, t.m[6] = 0, t.m[7] = 0, t.m[9] = 0, t.m[11] = 0, t.m[12] = 0, t.m[13] = 0, t.m[14] = 0, t._markAsUpdated()
        }, e.RotationZ = function(t) {
            var i = new e;
            return e.RotationZToRef(t, i), i
        }, e.RotationZToRef = function(e, t) {
            var i = Math.sin(e),
                r = Math.cos(e);
            t.m[10] = 1, t.m[15] = 1, t.m[0] = r, t.m[1] = i, t.m[4] = -i, t.m[5] = r, t.m[2] = 0, t.m[3] = 0, t.m[6] = 0, t.m[7] = 0, t.m[8] = 0, t.m[9] = 0, t.m[11] = 0, t.m[12] = 0, t.m[13] = 0, t.m[14] = 0, t._markAsUpdated()
        }, e.RotationAxis = function(t, i) {
            var r = e.Zero();
            return e.RotationAxisToRef(t, i, r), r
        }, e.RotationAxisToRef = function(e, t, i) {
            var r = Math.sin(-t),
                n = Math.cos(-t),
                o = 1 - n;
            e.normalize(), i.m[0] = e.x * e.x * o + n, i.m[1] = e.x * e.y * o - e.z * r, i.m[2] = e.x * e.z * o + e.y * r, i.m[3] = 0, i.m[4] = e.y * e.x * o + e.z * r, i.m[5] = e.y * e.y * o + n, i.m[6] = e.y * e.z * o - e.x * r, i.m[7] = 0, i.m[8] = e.z * e.x * o - e.y * r, i.m[9] = e.z * e.y * o + e.x * r, i.m[10] = e.z * e.z * o + n, i.m[11] = 0, i.m[15] = 1, i._markAsUpdated()
        }, e.RotationYawPitchRoll = function(t, i, r) {
            var n = new e;
            return e.RotationYawPitchRollToRef(t, i, r, n), n
        }, e.RotationYawPitchRollToRef = function(e, t, i, r) {
            a.RotationYawPitchRollToRef(e, t, i, this._tempQuaternion), this._tempQuaternion.toRotationMatrix(r)
        }, e.Scaling = function(t, i, r) {
            var n = e.Zero();
            return e.ScalingToRef(t, i, r, n), n
        }, e.ScalingToRef = function(e, t, i, r) {
            r.m[0] = e, r.m[1] = 0, r.m[2] = 0, r.m[3] = 0, r.m[4] = 0, r.m[5] = t, r.m[6] = 0, r.m[7] = 0, r.m[8] = 0, r.m[9] = 0, r.m[10] = i, r.m[11] = 0, r.m[12] = 0, r.m[13] = 0, r.m[14] = 0, r.m[15] = 1, r._markAsUpdated()
        }, e.Translation = function(t, i, r) {
            var n = e.Identity();
            return e.TranslationToRef(t, i, r, n), n
        }, e.TranslationToRef = function(t, i, r, n) {
            e.FromValuesToRef(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t, i, r, 1, n)
        }, e.Lerp = function(t, i, r) {
            for (var n = e.Zero(), o = 0; o < 16; o++) n.m[o] = t.m[o] * (1 - r) + i.m[o] * r;
            return n._markAsUpdated(), n
        }, e.DecomposeLerp = function(t, i, r) {
            var o = new n(0, 0, 0),
                s = new a,
                l = new n(0, 0, 0);
            t.decompose(o, s, l);
            var c = new n(0, 0, 0),
                h = new a,
                u = new n(0, 0, 0);
            i.decompose(c, h, u);
            var f = n.Lerp(o, c, r),
                d = a.Slerp(s, h, r),
                p = n.Lerp(l, u, r);
            return e.Compose(f, d, p)
        }, e.LookAtLH = function(t, i, r) {
            var n = e.Zero();
            return e.LookAtLHToRef(t, i, r, n), n
        }, e.LookAtLHToRef = function(t, i, r, o) {
            i.subtractToRef(t, this._zAxis), this._zAxis.normalize(), n.CrossToRef(r, this._zAxis, this._xAxis), 0 === this._xAxis.lengthSquared() ? this._xAxis.x = 1 : this._xAxis.normalize(), n.CrossToRef(this._zAxis, this._xAxis, this._yAxis), this._yAxis.normalize();
            var s = -n.Dot(this._xAxis, t),
                a = -n.Dot(this._yAxis, t),
                l = -n.Dot(this._zAxis, t);
            return e.FromValuesToRef(this._xAxis.x, this._yAxis.x, this._zAxis.x, 0, this._xAxis.y, this._yAxis.y, this._zAxis.y, 0, this._xAxis.z, this._yAxis.z, this._zAxis.z, 0, s, a, l, 1, o)
        }, e.LookAtRH = function(t, i, r) {
            var n = e.Zero();
            return e.LookAtRHToRef(t, i, r, n), n
        }, e.LookAtRHToRef = function(t, i, r, o) {
            t.subtractToRef(i, this._zAxis), this._zAxis.normalize(), n.CrossToRef(r, this._zAxis, this._xAxis), 0 === this._xAxis.lengthSquared() ? this._xAxis.x = 1 : this._xAxis.normalize(), n.CrossToRef(this._zAxis, this._xAxis, this._yAxis), this._yAxis.normalize();
            var s = -n.Dot(this._xAxis, t),
                a = -n.Dot(this._yAxis, t),
                l = -n.Dot(this._zAxis, t);
            return e.FromValuesToRef(this._xAxis.x, this._yAxis.x, this._zAxis.x, 0, this._xAxis.y, this._yAxis.y, this._zAxis.y, 0, this._xAxis.z, this._yAxis.z, this._zAxis.z, 0, s, a, l, 1, o)
        }, e.OrthoLH = function(t, i, r, n) {
            var o = e.Zero();
            return e.OrthoLHToRef(t, i, r, n, o), o
        }, e.OrthoLHToRef = function(t, i, r, n, o) {
            var s = r,
                a = n,
                l = 2 / t,
                c = 2 / i,
                h = 2 / (a - s),
                u = -(a + s) / (a - s);
            e.FromValuesToRef(l, 0, 0, 0, 0, c, 0, 0, 0, 0, h, 0, 0, 0, u, 1, o)
        }, e.OrthoOffCenterLH = function(t, i, r, n, o, s) {
            var a = e.Zero();
            return e.OrthoOffCenterLHToRef(t, i, r, n, o, s, a), a
        }, e.OrthoOffCenterLHToRef = function(t, i, r, n, o, s, a) {
            var l = o,
                c = s,
                h = 2 / (i - t),
                u = 2 / (n - r),
                f = 2 / (c - l),
                d = -(c + l) / (c - l),
                p = (t + i) / (t - i),
                _ = (n + r) / (r - n);
            e.FromValuesToRef(h, 0, 0, 0, 0, u, 0, 0, 0, 0, f, 0, p, _, d, 1, a)
        }, e.OrthoOffCenterRH = function(t, i, r, n, o, s) {
            var a = e.Zero();
            return e.OrthoOffCenterRHToRef(t, i, r, n, o, s, a), a
        }, e.OrthoOffCenterRHToRef = function(t, i, r, n, o, s, a) {
            e.OrthoOffCenterLHToRef(t, i, r, n, o, s, a),
                a.m[10] *= -1
        }, e.PerspectiveLH = function(t, i, r, n) {
            var o = e.Zero(),
                s = r,
                a = n,
                l = 2 * s / t,
                c = 2 * s / i,
                h = (a + s) / (a - s),
                u = -2 * a * s / (a - s);
            return e.FromValuesToRef(l, 0, 0, 0, 0, c, 0, 0, 0, 0, h, 1, 0, 0, u, 0, o), o
        }, e.PerspectiveFovLH = function(t, i, r, n) {
            var o = e.Zero();
            return e.PerspectiveFovLHToRef(t, i, r, n, o), o
        }, e.PerspectiveFovLHToRef = function(t, i, r, n, o, s) {
            void 0 === s && (s = !0);
            var a = r,
                l = n,
                c = 1 / Math.tan(.5 * t),
                h = s ? c / i : c,
                u = s ? c : c * i,
                f = (l + a) / (l - a),
                d = -2 * l * a / (l - a);
            e.FromValuesToRef(h, 0, 0, 0, 0, u, 0, 0, 0, 0, f, 1, 0, 0, d, 0, o)
        }, e.PerspectiveFovRH = function(t, i, r, n) {
            var o = e.Zero();
            return e.PerspectiveFovRHToRef(t, i, r, n, o), o
        }, e.PerspectiveFovRHToRef = function(t, i, r, n, o, s) {
            void 0 === s && (s = !0);
            var a = r,
                l = n,
                c = 1 / Math.tan(.5 * t),
                h = s ? c / i : c,
                u = s ? c : c * i,
                f = -(l + a) / (l - a),
                d = -2 * l * a / (l - a);
            e.FromValuesToRef(h, 0, 0, 0, 0, u, 0, 0, 0, 0, f, -1, 0, 0, d, 0, o)
        }, e.PerspectiveFovWebVRToRef = function(e, t, i, r, n) {
            void 0 === n && (n = !1);
            var o = n ? -1 : 1,
                s = Math.tan(e.upDegrees * Math.PI / 180),
                a = Math.tan(e.downDegrees * Math.PI / 180),
                l = Math.tan(e.leftDegrees * Math.PI / 180),
                c = Math.tan(e.rightDegrees * Math.PI / 180),
                h = 2 / (l + c),
                u = 2 / (s + a);
            r.m[0] = h, r.m[1] = r.m[2] = r.m[3] = r.m[4] = 0, r.m[5] = u, r.m[6] = r.m[7] = 0, r.m[8] = (l - c) * h * .5, r.m[9] = -(s - a) * u * .5, r.m[10] = -i / (t - i), r.m[11] = 1 * o, r.m[12] = r.m[13] = r.m[15] = 0, r.m[14] = -2 * i * t / (i - t), r._markAsUpdated()
        }, e.GetFinalMatrix = function(t, i, r, n, o, s) {
            var a = t.width,
                l = t.height,
                c = t.x,
                h = t.y,
                u = e.FromValues(a / 2, 0, 0, 0, 0, -l / 2, 0, 0, 0, 0, s - o, 0, c + a / 2, l / 2 + h, o, 1);
            return i.multiply(r).multiply(n).multiply(u)
        }, e.GetAsMatrix2x2 = function(e) {
            return new Float32Array([e.m[0], e.m[1], e.m[4], e.m[5]])
        }, e.GetAsMatrix3x3 = function(e) {
            return new Float32Array([e.m[0], e.m[1], e.m[2], e.m[4], e.m[5], e.m[6], e.m[8], e.m[9], e.m[10]])
        }, e.Transpose = function(t) {
            var i = new e;
            return e.TransposeToRef(t, i), i
        }, e.TransposeToRef = function(e, t) {
            t.m[0] = e.m[0], t.m[1] = e.m[4], t.m[2] = e.m[8], t.m[3] = e.m[12], t.m[4] = e.m[1], t.m[5] = e.m[5], t.m[6] = e.m[9], t.m[7] = e.m[13], t.m[8] = e.m[2], t.m[9] = e.m[6], t.m[10] = e.m[10], t.m[11] = e.m[14], t.m[12] = e.m[3], t.m[13] = e.m[7], t.m[14] = e.m[11], t.m[15] = e.m[15]
        }, e.Reflection = function(t) {
            var i = new e;
            return e.ReflectionToRef(t, i), i
        }, e.ReflectionToRef = function(e, t) {
            e.normalize();
            var i = e.normal.x,
                r = e.normal.y,
                n = e.normal.z,
                o = -2 * i,
                s = -2 * r,
                a = -2 * n;
            t.m[0] = o * i + 1, t.m[1] = s * i, t.m[2] = a * i, t.m[3] = 0, t.m[4] = o * r, t.m[5] = s * r + 1, t.m[6] = a * r, t.m[7] = 0, t.m[8] = o * n, t.m[9] = s * n, t.m[10] = a * n + 1, t.m[11] = 0, t.m[12] = o * e.d, t.m[13] = s * e.d, t.m[14] = a * e.d, t.m[15] = 1, t._markAsUpdated()
        }, e.FromXYZAxesToRef = function(e, t, i, r) {
            r.m[0] = e.x, r.m[1] = e.y, r.m[2] = e.z, r.m[3] = 0, r.m[4] = t.x, r.m[5] = t.y, r.m[6] = t.z, r.m[7] = 0, r.m[8] = i.x, r.m[9] = i.y, r.m[10] = i.z, r.m[11] = 0, r.m[12] = 0, r.m[13] = 0, r.m[14] = 0, r.m[15] = 1, r._markAsUpdated()
        }, e.FromQuaternionToRef = function(e, t) {
            var i = e.x * e.x,
                r = e.y * e.y,
                n = e.z * e.z,
                o = e.x * e.y,
                s = e.z * e.w,
                a = e.z * e.x,
                l = e.y * e.w,
                c = e.y * e.z,
                h = e.x * e.w;
            t.m[0] = 1 - 2 * (r + n), t.m[1] = 2 * (o + s), t.m[2] = 2 * (a - l), t.m[3] = 0, t.m[4] = 2 * (o - s), t.m[5] = 1 - 2 * (n + i), t.m[6] = 2 * (c + h), t.m[7] = 0, t.m[8] = 2 * (a + l), t.m[9] = 2 * (c - h), 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()
        }, e._tempQuaternion = new a, e._xAxis = n.Zero(), e._yAxis = n.Zero(), e._zAxis = n.Zero(), e._updateFlagSeed = 0, e._identityReadOnly = e.Identity(), e
    })();
    e.Matrix = l;
    var c = (function() {
        function e(e, t, i, r) {
            this.normal = new n(e, t, i), this.d = r
        }
        return e.prototype.asArray = function() {
            return [this.normal.x, this.normal.y, this.normal.z, this.d]
        }, e.prototype.clone = function() {
            return new e(this.normal.x, this.normal.y, this.normal.z, this.d)
        }, e.prototype.getClassName = function() {
            return "Plane"
        }, e.prototype.getHashCode = function() {
            var e = this.normal.getHashCode();
            return e = 397 * e ^ (this.d || 0)
        }, e.prototype.normalize = function() {
            var e = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z),
                t = 0;
            return 0 !== e && (t = 1 / e), this.normal.x *= t, this.normal.y *= t, this.normal.z *= t, this.d *= t, this
        }, e.prototype.transform = function(t) {
            var i = l.Transpose(t),
                r = this.normal.x,
                n = this.normal.y,
                o = this.normal.z,
                s = this.d;
            return new e(r * i.m[0] + n * i.m[1] + o * i.m[2] + s * i.m[3], r * i.m[4] + n * i.m[5] + o * i.m[6] + s * i.m[7], r * i.m[8] + n * i.m[9] + o * i.m[10] + s * i.m[11], r * i.m[12] + n * i.m[13] + o * i.m[14] + s * i.m[15])
        }, e.prototype.dotCoordinate = function(e) {
            return this.normal.x * e.x + this.normal.y * e.y + this.normal.z * e.z + this.d
        }, e.prototype.copyFromPoints = function(e, t, i) {
            var r, n = t.x - e.x,
                o = t.y - e.y,
                s = t.z - e.z,
                a = i.x - e.x,
                l = i.y - e.y,
                c = i.z - e.z,
                h = o * c - s * l,
                u = s * a - n * c,
                f = n * l - o * a,
                d = Math.sqrt(h * h + u * u + f * f);
            return r = 0 !== d ? 1 / d : 0, this.normal.x = h * r, this.normal.y = u * r, this.normal.z = f * r, this.d = -(this.normal.x * e.x + this.normal.y * e.y + this.normal.z * e.z), this
        }, e.prototype.isFrontFacingTo = function(e, t) {
            return n.Dot(this.normal, e) <= t
        }, e.prototype.signedDistanceTo = function(e) {
            return n.Dot(e, this.normal) + this.d
        }, e.FromArray = function(t) {
            return new e(t[0], t[1], t[2], t[3])
        }, e.FromPoints = function(t, i, r) {
            var n = new e(0, 0, 0, 0);
            return n.copyFromPoints(t, i, r), n
        }, e.FromPositionAndNormal = function(t, i) {
            var r = new e(0, 0, 0, 0);
            return i.normalize(), r.normal = i, r.d = -(i.x * t.x + i.y * t.y + i.z * t.z), r
        }, e.SignedDistanceToPlaneFromPositionAndNormal = function(e, t, i) {
            var r = -(t.x * e.x + t.y * e.y + t.z * e.z);
            return n.Dot(i, t) + r
        }, e
    })();
    e.Plane = c;
    var h = (function() {
        function e(e, t, i, r) {
            this.x = e, this.y = t, this.width = i, this.height = r
        }
        return e.prototype.toGlobal = function(t, i) {
            if (t.getRenderWidth) {
                var r = t;
                return this.toGlobal(r.getRenderWidth(), r.getRenderHeight())
            }
            var n = t;
            return new e(this.x * n, this.y * i, this.width * n, this.height * i)
        }, e.prototype.clone = function() {
            return new e(this.x, this.y, this.width, this.height)
        }, e
    })();
    e.Viewport = h;
    var u = (function() {
        function e() {}
        return e.GetPlanes = function(t) {
            for (var i = [], r = 0; r < 6; r++) i.push(new c(0, 0, 0, 0));
            return e.GetPlanesToRef(t, i), i
        }, e.GetNearPlaneToRef = function(e, t) {
            t.normal.x = e.m[3] + e.m[2], t.normal.y = e.m[7] + e.m[6], t.normal.z = e.m[11] + e.m[10], t.d = e.m[15] + e.m[14], t.normalize()
        }, e.GetFarPlaneToRef = function(e, t) {
            t.normal.x = e.m[3] - e.m[2], t.normal.y = e.m[7] - e.m[6], t.normal.z = e.m[11] - e.m[10], t.d = e.m[15] - e.m[14], t.normalize()
        }, e.GetLeftPlaneToRef = function(e, t) {
            t.normal.x = e.m[3] + e.m[0], t.normal.y = e.m[7] + e.m[4], t.normal.z = e.m[11] + e.m[8], t.d = e.m[15] + e.m[12], t.normalize()
        }, e.GetRightPlaneToRef = function(e, t) {
            t.normal.x = e.m[3] - e.m[0], t.normal.y = e.m[7] - e.m[4], t.normal.z = e.m[11] - e.m[8], t.d = e.m[15] - e.m[12], t.normalize()
        }, e.GetTopPlaneToRef = function(e, t) {
            t.normal.x = e.m[3] - e.m[1], t.normal.y = e.m[7] - e.m[5], t.normal.z = e.m[11] - e.m[9], t.d = e.m[15] - e.m[13], t.normalize()
        }, e.GetBottomPlaneToRef = function(e, t) {
            t.normal.x = e.m[3] + e.m[1], t.normal.y = e.m[7] + e.m[5], t.normal.z = e.m[11] + e.m[9], t.d = e.m[15] + e.m[13], t.normalize()
        }, e.GetPlanesToRef = function(t, i) {
            e.GetNearPlaneToRef(t, i[0]), e.GetFarPlaneToRef(t, i[1]), e.GetLeftPlaneToRef(t, i[2]), e.GetRightPlaneToRef(t, i[3]), e.GetTopPlaneToRef(t, i[4]), e.GetBottomPlaneToRef(t, i[5])
        }, e
    })();
    e.Frustum = u;
    !(function(e) {
        e[e.LOCAL = 0] = "LOCAL", e[e.WORLD = 1] = "WORLD", e[e.BONE = 2] = "BONE"
    })(e.Space || (e.Space = {}));
    var f = (function() {
        function e() {}
        return e.X = new n(1, 0, 0), e.Y = new n(0, 1, 0), e.Z = new n(0, 0, 1), e
    })();
    e.Axis = f;
    var d = (function() {
        function e() {}
        return e.interpolate = function(e, t, i, r, n) {
            for (var o = 1 - 3 * r + 3 * t, s = 3 * r - 6 * t, a = 3 * t, l = e, c = 0; c < 5; c++) {
                var h = l * l;
                l -= (o * (h * l) + s * h + a * l - e) * (1 / (3 * o * h + 2 * s * l + a)), l = Math.min(1, Math.max(0, l))
            }
            return 3 * Math.pow(1 - l, 2) * l * i + 3 * (1 - l) * Math.pow(l, 2) * n + Math.pow(l, 3)
        }, e
    })();
    e.BezierCurve = d;
    var p;
    !(function(e) {
        e[e.CW = 0] = "CW", e[e.CCW = 1] = "CCW"
    })(p = e.Orientation || (e.Orientation = {}));
    var _ = (function() {
        function e(e) {
            var t = this;
            this.degrees = function() {
                return 180 * t._radians / Math.PI
            }, this.radians = function() {
                return t._radians
            }, this._radians = e, this._radians < 0 && (this._radians += 2 * Math.PI)
        }
        return e.BetweenTwoPoints = function(t, i) {
            var r = i.subtract(t);
            return new e(Math.atan2(r.y, r.x))
        }, e.FromRadians = function(t) {
            return new e(t)
        }, e.FromDegrees = function(t) {
            return new e(t * Math.PI / 180)
        }, e
    })();
    e.Angle = _;
    var m = (function() {
        function e(e, t, i) {
            this.startPoint = e, this.midPoint = t, this.endPoint = i;
            var n = Math.pow(t.x, 2) + Math.pow(t.y, 2),
                o = (Math.pow(e.x, 2) + Math.pow(e.y, 2) - n) / 2,
                s = (n - Math.pow(i.x, 2) - Math.pow(i.y, 2)) / 2,
                a = (e.x - t.x) * (t.y - i.y) - (t.x - i.x) * (e.y - t.y);
            this.centerPoint = new r((o * (t.y - i.y) - s * (e.y - t.y)) / a, ((e.x - t.x) * s - (t.x - i.x) * o) / a), this.radius = this.centerPoint.subtract(this.startPoint).length(), this.startAngle = _.BetweenTwoPoints(this.centerPoint, this.startPoint);
            var l = this.startAngle.degrees(),
                c = _.BetweenTwoPoints(this.centerPoint, this.midPoint).degrees(),
                h = _.BetweenTwoPoints(this.centerPoint, this.endPoint).degrees();
            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 ? p.CW : p.CCW, this.angle = _.FromDegrees(this.orientation === p.CW ? l - h : h - l)
        }
        return e
    })();
    e.Arc2 = m;
    var g = (function() {
        function e(e, t) {
            this._points = new Array, this._length = 0, this.closed = !1, this._points.push(new r(e, t))
        }
        return e.prototype.addLineTo = function(e, t) {
            if (this.closed) return this;
            var i = new r(e, t),
                n = this._points[this._points.length - 1];
            return this._points.push(i), this._length += i.subtract(n).length(), this
        }, e.prototype.addArcTo = function(e, t, i, n, o) {
            if (void 0 === o && (o = 36), this.closed) return this;
            var s = this._points[this._points.length - 1],
                a = new r(e, t),
                l = new r(i, n),
                c = new m(s, a, l),
                h = c.angle.radians() / o;
            c.orientation === p.CW && (h *= -1);
            for (var u = c.startAngle.radians() + h, f = 0; f < o; f++) {
                var d = Math.cos(u) * c.radius + c.centerPoint.x,
                    _ = Math.sin(u) * c.radius + c.centerPoint.y;
                this.addLineTo(d, _), u += h
            }
            return this
        }, e.prototype.close = function() {
            return this.closed = !0, this
        }, e.prototype.length = function() {
            var e = this._length;
            if (!this.closed) {
                var t = this._points[this._points.length - 1];
                e += this._points[0].subtract(t).length()
            }
            return e
        }, e.prototype.getPoints = function() {
            return this._points
        }, e.prototype.getPointAtLengthPosition = function(e) {
            if (e < 0 || e > 1) return r.Zero();
            for (var t = e * this.length(), i = 0, n = 0; n < this._points.length; n++) {
                var o = (n + 1) % this._points.length,
                    s = this._points[n],
                    a = this._points[o],
                    l = a.subtract(s),
                    c = l.length() + i;
                if (t >= i && t <= c) {
                    var h = l.normalize(),
                        u = t - i;
                    return new r(s.x + h.x * u, s.y + h.y * u)
                }
                i = c
            }
            return r.Zero()
        }, e.StartingAt = function(t, i) {
            return new e(t, i)
        }, e
    })();
    e.Path2 = g;
    var v = (function() {
        function t(e, t, i) {
            void 0 === t && (t = null), this.path = e, this._curve = new Array, this._distances = new Array, this._tangents = new Array, this._normals = new Array, this._binormals = new Array;
            for (var r = 0; r < e.length; r++) this._curve[r] = e[r].clone();
            this._raw = i || !1, this._compute(t)
        }
        return t.prototype.getCurve = function() {
            return this._curve
        }, t.prototype.getTangents = function() {
            return this._tangents
        }, t.prototype.getNormals = function() {
            return this._normals
        }, t.prototype.getBinormals = function() {
            return this._binormals
        }, t.prototype.getDistances = function() {
            return this._distances
        }, t.prototype.update = function(e, t) {
            void 0 === t && (t = null);
            for (var i = 0; i < e.length; i++) this._curve[i].x = e[i].x, this._curve[i].y = e[i].y, this._curve[i].z = e[i].z;
            return this._compute(t), this
        }, t.prototype._compute = function(e) {
            var t = this._curve.length;
            this._tangents[0] = this._getFirstNonNullVector(0), this._raw || this._tangents[0].normalize(), this._tangents[t - 1] = this._curve[t - 1].subtract(this._curve[t - 2]), this._raw || this._tangents[t - 1].normalize();
            var i = this._tangents[0],
                r = this._normalVector(this._curve[0], i, e);
            this._normals[0] = r, this._raw || this._normals[0].normalize(), this._binormals[0] = n.Cross(i, this._normals[0]), this._raw || this._binormals[0].normalize(), this._distances[0] = 0;
            for (var o, s, a, l, c = 1; c < t; c++) o = this._getLastNonNullVector(c), c < t - 1 && (s = this._getFirstNonNullVector(c), this._tangents[c] = o.add(s), this._tangents[c].normalize()), this._distances[c] = this._distances[c - 1] + o.length(), a = this._tangents[c], l = this._binormals[c - 1], this._normals[c] = n.Cross(l, a), this._raw || this._normals[c].normalize(), this._binormals[c] = n.Cross(a, this._normals[c]), this._raw || this._binormals[c].normalize()
        }, t.prototype._getFirstNonNullVector = function(e) {
            for (var t = 1, i = this._curve[e + t].subtract(this._curve[e]); 0 === i.length() && e + t + 1 < this._curve.length;) t++, i = this._curve[e + t].subtract(this._curve[e]);
            return i
        }, t.prototype._getLastNonNullVector = function(e) {
            for (var t = 1, i = this._curve[e].subtract(this._curve[e - t]); 0 === i.length() && e > t + 1;) t++, i = this._curve[e].subtract(this._curve[e - t]);
            return i
        }, t.prototype._normalVector = function(t, i, r) {
            var o, s = i.length();
            if (0 === s && (s = 1), void 0 === r || null === r) {
                var a;
                a = e.Scalar.WithinEpsilon(Math.abs(i.y) / s, 1, e.Epsilon) ? e.Scalar.WithinEpsilon(Math.abs(i.x) / s, 1, e.Epsilon) ? e.Scalar.WithinEpsilon(Math.abs(i.z) / s, 1, e.Epsilon) ? n.Zero() : new n(0, 0, 1) : new n(1, 0, 0) : new n(0, -1, 0), o = n.Cross(i, a)
            } else o = n.Cross(i, r), n.CrossToRef(o, i, o);
            return o.normalize(), o
        }, t
    })();
    e.Path3D = v;
    var y = (function() {
        function e(e) {
            this._length = 0, this._points = e, this._length = this._computeLength(e)
        }
        return e.CreateQuadraticBezier = function(t, i, r, o) {
            o = o > 2 ? o : 3;
            for (var s = new Array, a = function(e, t, i, r) {
                    return (1 - e) * (1 - e) * t + 2 * e * (1 - e) * i + e * e * r
                }, l = 0; l <= o; l++) s.push(new n(a(l / o, t.x, i.x, r.x), a(l / o, t.y, i.y, r.y), a(l / o, t.z, i.z, r.z)));
            return new e(s)
        }, e.CreateCubicBezier = function(t, i, r, o, s) {
            s = s > 3 ? s : 4;
            for (var a = new Array, l = function(e, t, i, r, n) {
                    return (1 - e) * (1 - e) * (1 - e) * t + 3 * e * (1 - e) * (1 - e) * i + 3 * e * e * (1 - e) * r + e * e * e * n
                }, c = 0; c <= s; c++) a.push(new n(l(c / s, t.x, i.x, r.x, o.x), l(c / s, t.y, i.y, r.y, o.y), l(c / s, t.z, i.z, r.z, o.z)));
            return new e(a)
        }, e.CreateHermiteSpline = function(t, i, r, o, s) {
            for (var a = new Array, l = 1 / s, c = 0; c <= s; c++) a.push(n.Hermite(t, i, r, o, c * l));
            return new e(a)
        }, e.CreateCatmullRomSpline = function(t, i) {
            var r = new Array;
            r.push(t[0].clone()), Array.prototype.push.apply(r, t), r.push(t[t.length - 1].clone());
            for (var o = new Array, s = 1 / i, a = 0, l = 0; l < r.length - 3; l++) {
                a = 0;
                for (var c = 0; c < i; c++) o.push(n.CatmullRom(r[l], r[l + 1], r[l + 2], r[l + 3], a)), a += s
            }
            return l--, o.push(n.CatmullRom(r[l], r[l + 1], r[l + 2], r[l + 3], a)), new e(o)
        }, e.prototype.getPoints = function() {
            return this._points
        }, e.prototype.length = function() {
            return this._length
        }, e.prototype.continue = function(t) {
            for (var i = this._points[this._points.length - 1], r = this._points.slice(), n = t.getPoints(), o = 1; o < n.length; o++) r.push(n[o].subtract(n[0]).add(i));
            return new e(r)
        }, e.prototype._computeLength = function(e) {
            for (var t = 0, i = 1; i < e.length; i++) t += e[i].subtract(e[i - 1]).length();
            return t
        }, e
    })();
    e.Curve3 = y;
    var b = (function() {
        function e(e, t) {
            void 0 === e && (e = n.Zero()), void 0 === t && (t = n.Up()), this.position = e, this.normal = t
        }
        return e.prototype.clone = function() {
            return new e(this.position.clone(), this.normal.clone())
        }, e
    })();
    e.PositionNormalVertex = b;
    var x = (function() {
        function e(e, t, i) {
            void 0 === e && (e = n.Zero()), void 0 === t && (t = n.Up()), void 0 === i && (i = r.Zero()), this.position = e, this.normal = t, this.uv = i
        }
        return e.prototype.clone = function() {
            return new e(this.position.clone(), this.normal.clone(), this.uv.clone())
        }, e
    })();
    e.PositionNormalTextureVertex = x;
    var T = (function() {
        function e() {}
        return e.Color3 = [t.Black(), t.Black(), t.Black()], e.Vector2 = [r.Zero(), r.Zero(), r.Zero()], e.Vector3 = [n.Zero(), n.Zero(), n.Zero(), n.Zero(), n.Zero(), n.Zero(), n.Zero(), n.Zero(), n.Zero()], e.Vector4 = [o.Zero(), o.Zero(), o.Zero()], e.Quaternion = [a.Zero(), a.Zero()], e.Matrix = [l.Zero(), l.Zero(), l.Zero(), l.Zero(), l.Zero(), l.Zero(), l.Zero(), l.Zero()], e
    })();
    e.Tmp = T;
    var E = (function() {
        function e() {}
        return e.Vector3 = [n.Zero()], e.Matrix = [l.Zero(), l.Zero()], e.Quaternion = [a.Zero()], e
    })()
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {}
        return e.WithinEpsilon = function(e, t, i) {
            void 0 === i && (i = 1.401298e-45);
            var r = e - t;
            return -i <= r && r <= i
        }, e.ToHex = function(e) {
            var t = e.toString(16);
            return e <= 15 ? ("0" + t).toUpperCase() : t.toUpperCase()
        }, e.Sign = function(e) {
            return e = +e, 0 === e || isNaN(e) ? e : e > 0 ? 1 : -1
        }, e.Clamp = function(e, t, i) {
            return void 0 === t && (t = 0), void 0 === i && (i = 1), Math.min(i, Math.max(t, e))
        }, e.Log2 = function(e) {
            return Math.log(e) * Math.LOG2E
        }, e.Repeat = function(e, t) {
            return e - Math.floor(e / t) * t
        }, e.Normalize = function(e, t, i) {
            return (e - t) / (i - t)
        }, e.Denormalize = function(e, t, i) {
            return e * (i - t) + t
        }, e.DeltaAngle = function(t, i) {
            var r = e.Repeat(i - t, 360);
            return r > 180 && (r -= 360), r
        }, e.PingPong = function(t, i) {
            var r = e.Repeat(t, 2 * i);
            return i - Math.abs(r - i)
        }, e.SmoothStep = function(t, i, r) {
            var n = e.Clamp(r);
            return n = -2 * n * n * n + 3 * n * n, i * n + t * (1 - n)
        }, e.MoveTowards = function(t, i, r) {
            return Math.abs(i - t) <= r ? i : t + e.Sign(i - t) * r
        }, e.MoveTowardsAngle = function(t, i, r) {
            var n = e.DeltaAngle(t, i),
                o = 0;
            return -r < n && n < r ? o = i : (i = t + n, o = e.MoveTowards(t, i, r)), o
        }, e.Lerp = function(e, t, i) {
            return e + (t - e) * i
        }, e.LerpAngle = function(t, i, r) {
            var n = e.Repeat(i - t, 360);
            return n > 180 && (n -= 360), t + n * e.Clamp(r)
        }, e.InverseLerp = function(t, i, r) {
            return t != i ? e.Clamp((r - t) / (i - t)) : 0
        }, e.Hermite = function(e, t, i, r, n) {
            var o = n * n,
                s = n * o;
            return e * (2 * s - 3 * o + 1) + i * (-2 * s + 3 * o) + t * (s - 2 * o + n) + r * (s - o)
        }, e.RandomRange = function(e, t) {
            return e === t ? e : Math.random() * (t - e) + e
        }, e.RangeToPercent = function(e, t, i) {
            return (e - t) / (i - t)
        }, e.PercentToRange = function(e, t, i) {
            return (i - t) * e + t
        }, e.NormalizeRadians = function(t) {
            return t -= e.TwoPi * Math.floor((t + Math.PI) / e.TwoPi)
        }, e.TwoPi = 2 * Math.PI, e
    })();
    e.Scalar = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    function t(e) {
        var t = e.getClassName();
        return g[t] || (g[t] = {}), g[t]
    }

    function i(e) {
        var t = e.getClassName();
        if (v[t]) return v[t];
        v[t] = {};
        for (var i = v[t], r = e, n = t; n;) {
            var o = g[n];
            for (var s in o) i[s] = o[s];
            var a = void 0,
                l = !1;
            do {
                if (a = Object.getPrototypeOf(r), !a.getClassName) {
                    l = !0;
                    break
                }
                if (a.getClassName() !== n) break;
                r = a
            } while (a);
            if (l) break;
            n = a.getClassName(), r = a
        }
        return i
    }

    function r(e, i) {
        return function(r, n) {
            var o = t(r);
            o[n] || (o[n] = {
                type: e,
                sourceName: i
            })
        }
    }

    function n(e, t) {
        return void 0 === t && (t = null),
            function(i, r) {
                var n = t || "_" + r;
                Object.defineProperty(i, r, {
                    get: function() {
                        return this[n]
                    },
                    set: function(t) {
                        this[n] !== t && (this[n] = t, i[e].apply(this))
                    },
                    enumerable: !0,
                    configurable: !0
                })
            }
    }

    function o(e, t) {
        return void 0 === t && (t = null), n(e, t)
    }

    function s(e) {
        return r(0, e)
    }

    function a(e) {
        return r(1, e)
    }

    function l(e) {
        return r(2, e)
    }

    function c(e) {
        return r(3, e)
    }

    function h(e) {
        return r(4, e)
    }

    function u(e) {
        return r(5, e)
    }

    function f(e) {
        return r(6, e)
    }

    function d(e) {
        return r(7, e)
    }

    function p(e) {
        return r(8, e)
    }

    function _(e) {
        return r(9, e)
    }

    function m(e) {
        return r(10, e)
    }
    var g = {},
        v = {},
        y = function(t, r, n) {
            var o = t();
            e.Tags && e.Tags.AddTagsTo(o, r.tags);
            var s = i(o);
            for (var a in s) {
                var l = s[a],
                    c = r[a],
                    h = l.type;
                if (void 0 !== c && null !== c) switch (h) {
                    case 0:
                    case 6:
                        o[a] = c;
                        break;
                    case 1:
                        o[a] = n || c.isRenderTarget ? c : c.clone();
                        break;
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 7:
                    case 10:
                        o[a] = n ? c : c.clone()
                }
            }
            return o
        };
    e.expandToProperty = o, e.serialize = s, e.serializeAsTexture = a, e.serializeAsColor3 = l, e.serializeAsFresnelParameters = c, e.serializeAsVector2 = h, e.serializeAsVector3 = u, e.serializeAsMeshReference = f, e.serializeAsColorCurves = d, e.serializeAsColor4 = p, e.serializeAsImageProcessingConfiguration = _, e.serializeAsQuaternion = m;
    var b = (function() {
        function t() {}
        return t.Serialize = function(t, r) {
            r || (r = {}), e.Tags && (r.tags = e.Tags.GetTags(t));
            var n = i(t);
            for (var o in n) {
                var s = n[o],
                    a = s.sourceName || o,
                    l = s.type,
                    c = t[o];
                if (void 0 !== c && null !== c) switch (l) {
                    case 0:
                        r[a] = c;
                        break;
                    case 1:
                        r[a] = c.serialize();
                        break;
                    case 2:
                        r[a] = c.asArray();
                        break;
                    case 3:
                        r[a] = c.serialize();
                        break;
                    case 4:
                    case 5:
                        r[a] = c.asArray();
                        break;
                    case 6:
                        r[a] = c.id;
                        break;
                    case 7:
                        r[a] = c.serialize();
                        break;
                    case 8:
                        r[a] = c.asArray();
                        break;
                    case 9:
                        r[a] = c.serialize()
                }
            }
            return r
        }, t.Parse = function(t, r, n, o) {
            void 0 === o && (o = null);
            var s = t();
            o || (o = ""), e.Tags && e.Tags.AddTagsTo(s, r.tags);
            var a = i(s);
            for (var l in a) {
                var c = a[l],
                    h = r[c.sourceName || l],
                    u = c.type;
                if (void 0 !== h && null !== h) {
                    var f = s;
                    switch (u) {
                        case 0:
                            f[l] = h;
                            break;
                        case 1:
                            n && (f[l] = e.Texture.Parse(h, n, o));
                            break;
                        case 2:
                            f[l] = e.Color3.FromArray(h);
                            break;
                        case 3:
                            f[l] = e.FresnelParameters.Parse(h);
                            break;
                        case 4:
                            f[l] = e.Vector2.FromArray(h);
                            break;
                        case 5:
                            f[l] = e.Vector3.FromArray(h);
                            break;
                        case 6:
                            n && (f[l] = n.getLastMeshByID(h));
                            break;
                        case 7:
                            f[l] = e.ColorCurves.Parse(h);
                            break;
                        case 8:
                            f[l] = e.Color4.FromArray(h);
                            break;
                        case 9:
                            f[l] = e.ImageProcessingConfiguration.Parse(h)
                    }
                }
            }
            return s
        }, t.Clone = function(e, t) {
            return y(e, t, !1)
        }, t.Instanciate = function(e, t) {
            return y(e, t, !0)
        }, t
    })();
    e.SerializationHelper = b
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            var e = this;
            this.promise = new Promise(function(t, i) {
                e._resolve = t, e._reject = i
            })
        }
        return Object.defineProperty(e.prototype, "resolve", {
            get: function() {
                return this._resolve
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "reject", {
            get: function() {
                return this._reject
            },
            enumerable: !0,
            configurable: !0
        }), e
    })();
    e.Deferred = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i, r) {
            void 0 === t && (t = !1), this.initalize(e, t, i, r)
        }
        return e.prototype.initalize = function(e, t, i, r) {
            return void 0 === t && (t = !1), this.mask = e, this.skipNextObservers = t, this.target = i, this.currentTarget = r, this
        }, e
    })();
    e.EventState = t;
    var i = (function() {
        function e(e, t, i) {
            void 0 === i && (i = null), this.callback = e, this.mask = t, this.scope = i, this._willBeUnregistered = !1, this.unregisterOnNextCall = !1
        }
        return e
    })();
    e.Observer = i;
    var r = (function() {
        function e() {}
        return e.prototype.dispose = function() {
            if (this._observers && this._observables)
                for (var e = 0; e < this._observers.length; e++) this._observables[e].remove(this._observers[e]);
            this._observers = null, this._observables = null
        }, e.Watch = function(t, i, r, n) {
            void 0 === r && (r = -1), void 0 === n && (n = null);
            var o = new e;
            o._observers = new Array, o._observables = t;
            for (var s = 0, a = t; s < a.length; s++) {
                var l = a[s],
                    c = l.add(i, r, !1, n);
                c && o._observers.push(c)
            }
            return o
        }, e
    })();
    e.MultiObserver = r;
    var n = (function() {
        function r(e) {
            this._observers = new Array, this._eventState = new t(0), e && (this._onObserverAdded = e)
        }
        return r.prototype.add = function(e, t, r, n, o) {
            if (void 0 === t && (t = -1), void 0 === r && (r = !1), void 0 === n && (n = null), void 0 === o && (o = !1), !e) return null;
            var s = new i(e, t, n);
            return s.unregisterOnNextCall = o, r ? this._observers.unshift(s) : this._observers.push(s), this._onObserverAdded && this._onObserverAdded(s), s
        }, r.prototype.remove = function(e) {
            if (!e) return !1;
            var t = this._observers.indexOf(e);
            return -1 !== t && (this._observers.splice(t, 1), !0)
        }, r.prototype.removeCallback = function(e, t) {
            for (var i = 0; i < this._observers.length; i++)
                if (this._observers[i].callback === e && (!t || t === this._observers[i].scope)) return this._observers.splice(i, 1), !0;
            return !1
        }, r.prototype._deferUnregister = function(t) {
            var i = this;
            t.unregisterOnNextCall = !1, t._willBeUnregistered = !0, e.Tools.SetImmediate((function() {
                i.remove(t)
            }))
        }, r.prototype.notifyObservers = function(e, t, i, r) {
            if (void 0 === t && (t = -1), !this._observers.length) return !0;
            var n = this._eventState;
            n.mask = t, n.target = i, n.currentTarget = r, n.skipNextObservers = !1, n.lastReturnValue = e;
            for (var o = 0, s = this._observers; o < s.length; o++) {
                var a = s[o];
                if (!a._willBeUnregistered && (a.mask & t && (a.scope ? n.lastReturnValue = a.callback.apply(a.scope, [e, n]) : n.lastReturnValue = a.callback(e, n), a.unregisterOnNextCall && this._deferUnregister(a)), n.skipNextObservers)) return !1
            }
            return !0
        }, r.prototype.notifyObserversWithPromise = function(e, t, i, r) {
            var n = this;
            void 0 === t && (t = -1);
            var o = Promise.resolve(e);
            if (!this._observers.length) return o;
            var s = this._eventState;
            return s.mask = t, s.target = i, s.currentTarget = r, s.skipNextObservers = !1, this._observers.forEach((function(i) {
                s.skipNextObservers || i._willBeUnregistered || i.mask & t && (o = i.scope ? o.then((function(t) {
                    return s.lastReturnValue = t, i.callback.apply(i.scope, [e, s])
                })) : o.then((function(t) {
                    return s.lastReturnValue = t, i.callback(e, s)
                })), i.unregisterOnNextCall && n._deferUnregister(i))
            })), o.then((function() {
                return e
            }))
        }, r.prototype.notifyObserver = function(e, t, i) {
            void 0 === i && (i = -1);
            var r = this._eventState;
            r.mask = i, r.skipNextObservers = !1, e.callback(t, r)
        }, r.prototype.hasObservers = function() {
            return this._observers.length > 0
        }, r.prototype.clear = function() {
            this._observers = new Array, this._onObserverAdded = null
        }, r.prototype.clone = function() {
            var e = new r;
            return e._observers = this._observers.slice(0), e
        }, r.prototype.hasSpecificMask = function(e) {
            void 0 === e && (e = -1);
            for (var t = 0, i = this._observers; t < i.length; t++) {
                var r = i[t];
                if (r.mask & e || r.mask === e) return !0
            }
            return !1
        }, r
    })();
    e.Observable = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(t) {
            this.length = 0, this.data = new Array(t), this._id = e._GlobalId++
        }
        return e.prototype.push = function(e) {
            this.data[this.length++] = e, this.length > this.data.length && (this.data.length *= 2)
        }, e.prototype.forEach = function(e) {
            for (var t = 0; t < this.length; t++) e(this.data[t])
        }, e.prototype.sort = function(e) {
            this.data.sort(e)
        }, e.prototype.reset = function() {
            this.length = 0
        }, e.prototype.dispose = function() {
            this.reset(), this.data && (this.data.length = 0, this.data = [])
        }, e.prototype.concat = function(e) {
            if (0 !== e.length) {
                this.length + e.length > this.data.length && (this.data.length = 2 * (this.length + e.length));
                for (var t = 0; t < e.length; t++) this.data[this.length++] = (e.data || e)[t]
            }
        }, e.prototype.indexOf = function(e) {
            var t = this.data.indexOf(e);
            return t >= this.length ? -1 : t
        }, e.prototype.contains = function(e) {
            return -1 !== this.data.indexOf(e)
        }, e._GlobalId = 0, e
    })();
    e.SmartArray = t;
    var i = (function(e) {
        function t() {
            var t = null !== e && e.apply(this, arguments) || this;
            return t._duplicateId = 0, t
        }
        return __extends(t, e), t.prototype.push = function(t) {
            e.prototype.push.call(this, t), t.__smartArrayFlags || (t.__smartArrayFlags = {}), t.__smartArrayFlags[this._id] = this._duplicateId
        }, t.prototype.pushNoDuplicate = function(e) {
            return (!e.__smartArrayFlags || e.__smartArrayFlags[this._id] !== this._duplicateId) && (this.push(e), !0)
        }, t.prototype.reset = function() {
            e.prototype.reset.call(this), this._duplicateId++
        }, t.prototype.concatWithNoDuplicate = function(e) {
            if (0 !== e.length) {
                this.length + e.length > this.data.length && (this.data.length = 2 * (this.length + e.length));
                for (var t = 0; t < e.length; t++) {
                    var i = (e.data || e)[t];
                    this.pushNoDuplicate(i)
                }
            }
        }, t
    })(t);
    e.SmartArrayNoDuplicate = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    function t(e, t) {
        return function(i) {
            i.__bjsclassName__ = e, i.__bjsmoduleName__ = null != t ? t : null
        }
    }
    var i = (function(e) {
        function t(i, r) {
            var n = e.call(this, i) || this;
            return n.request = r, n.name = "LoadFileError", t._setPrototypeOf(n, t.prototype), n
        }
        return __extends(t, e), t._setPrototypeOf = Object.setPrototypeOf || function(e, t) {
            return e.__proto__ = t, e
        }, t
    })(Error);
    e.LoadFileError = i;
    var r = (function() {
        function e() {}
        return e.ExponentialBackoff = function(e, t) {
            return void 0 === e && (e = 3), void 0 === t && (t = 500),
                function(i, r, n) {
                    return 0 !== r.status || n >= e || -1 !== i.indexOf("file:") ? -1 : Math.pow(2, n) * t
                }
        }, e
    })();
    e.RetryStrategy = r;
    var n, o = function(t, i) {
            return t ? t instanceof e.Mesh ? null : t instanceof e.SubMesh ? t.clone(i) : t.clone ? t.clone() : null : null
        },
        s = (function() {
            function t() {}
            return t.Mix = function(e, t, i) {
                return e * (1 - i) + t * i
            }, t.Instantiate = function(e) {
                if (t.RegisteredExternalClasses && t.RegisteredExternalClasses[e]) return t.RegisteredExternalClasses[e];
                for (var i = e.split("."), r = window || this, n = 0, o = i.length; n < o; n++) r = r[i[n]];
                return "function" != typeof r ? null : r
            }, t.Slice = function(e) {
                return e.slice ? e.slice() : Array.prototype.slice.call(e)
            }, t.SetImmediate = function(e) {
                window.setImmediate ? window.setImmediate(e) : setTimeout(e, 1)
            }, t.IsExponentOfTwo = function(e) {
                var t = 1;
                do {
                    t *= 2
                } while (t < e);
                return t === e
            }, t.CeilingPOT = function(e) {
                return e--, e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, ++e
            }, t.FloorPOT = function(e) {
                return e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, (e |= e >> 16) - (e >> 1)
            }, t.NearestPOT = function(e) {
                var i = t.CeilingPOT(e),
                    r = t.FloorPOT(e);
                return i - e > e - r ? r : i
            }, t.GetExponentOfTwo = function(i, r, n) {
                void 0 === n && (n = e.Engine.SCALEMODE_NEAREST);
                var o;
                switch (n) {
                    case e.Engine.SCALEMODE_FLOOR:
                        o = t.FloorPOT(i);
                        break;
                    case e.Engine.SCALEMODE_NEAREST:
                        o = t.NearestPOT(i);
                        break;
                    case e.Engine.SCALEMODE_CEILING:
                    default:
                        o = t.CeilingPOT(i)
                }
                return Math.min(o, r)
            }, t.GetFilename = function(e) {
                var t = e.lastIndexOf("/");
                return t < 0 ? e : e.substring(t + 1)
            }, t.GetFolderPath = function(e, t) {
                void 0 === t && (t = !1);
                var i = e.lastIndexOf("/");
                return i < 0 ? t ? e : "" : e.substring(0, i + 1)
            }, t.GetDOMTextContent = function(e) {
                for (var t = "", i = e.firstChild; i;) 3 === i.nodeType && (t += i.textContent), i = i.nextSibling;
                return t
            }, t.ToDegrees = function(e) {
                return 180 * e / Math.PI
            }, t.ToRadians = function(e) {
                return e * Math.PI / 180
            }, t.EncodeArrayBufferTobase64 = function(e) {
                for (var t, i, r, n, o, s, a, l = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", c = "", h = 0, u = new Uint8Array(e); h < u.length;) t = u[h++], i = h < u.length ? u[h++] : Number.NaN, r = h < u.length ? u[h++] : Number.NaN, n = t >> 2, o = (3 & t) << 4 | i >> 4, s = (15 & i) << 2 | r >> 6, a = 63 & r, isNaN(i) ? s = a = 64 : isNaN(r) && (a = 64), c += l.charAt(n) + l.charAt(o) + l.charAt(s) + l.charAt(a);
                return "data:image/png;base64," + c
            }, t.ExtractMinAndMaxIndexed = function(t, i, r, n, o) {
                void 0 === o && (o = null);
                for (var s = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), a = new e.Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE), l = r; l < r + n; l++) {
                    var c = new e.Vector3(t[3 * i[l]], t[3 * i[l] + 1], t[3 * i[l] + 2]);
                    s = e.Vector3.Minimize(c, s), a = e.Vector3.Maximize(c, a)
                }
                return o && (s.x -= s.x * o.x + o.y, s.y -= s.y * o.x + o.y, s.z -= s.z * o.x + o.y, a.x += a.x * o.x + o.y, a.y += a.y * o.x + o.y, a.z += a.z * o.x + o.y), {
                    minimum: s,
                    maximum: a
                }
            }, t.ExtractMinAndMax = function(t, i, r, n, o) {
                void 0 === n && (n = null);
                var s = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),
                    a = new e.Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
                o || (o = 3);
                for (var l = i; l < i + r; l++) {
                    var c = new e.Vector3(t[l * o], t[l * o + 1], t[l * o + 2]);
                    s = e.Vector3.Minimize(c, s), a = e.Vector3.Maximize(c, a)
                }
                return n && (s.x -= s.x * n.x + n.y, s.y -= s.y * n.x + n.y, s.z -= s.z * n.x + n.y, a.x += a.x * n.x + n.y, a.y += a.y * n.x + n.y, a.z += a.z * n.x + n.y), {
                    minimum: s,
                    maximum: a
                }
            }, t.Vector2ArrayFeeder = function(t) {
                return function(i) {
                    var r = void 0 !== t.BYTES_PER_ELEMENT;
                    if (i >= (r ? t.length / 2 : t.length)) return null;
                    if (r) {
                        var n = t;
                        return new e.Vector2(n[2 * i + 0], n[2 * i + 1])
                    }
                    return t[i]
                }
            }, t.ExtractMinAndMaxVector2 = function(t, i) {
                void 0 === i && (i = null);
                for (var r = new e.Vector2(Number.MAX_VALUE, Number.MAX_VALUE), n = new e.Vector2(-Number.MAX_VALUE, -Number.MAX_VALUE), o = 0, s = t(o++); s;) r = e.Vector2.Minimize(s, r), n = e.Vector2.Maximize(s, n), s = t(o++);
                return i && (r.x -= r.x * i.x + i.y, r.y -= r.y * i.x + i.y, n.x += n.x * i.x + i.y, n.y += n.y * i.x + i.y), {
                    minimum: r,
                    maximum: n
                }
            }, t.MakeArray = function(e, t) {
                return !0 === t || void 0 !== e && null != e ? Array.isArray(e) ? e : [e] : null
            }, t.GetPointerPrefix = function() {
                var e = "pointer";
                return !t.IsWindowObjectExist() || window.PointerEvent || navigator.pointerEnabled || (e = "mouse"), e
            }, t.QueueNewFrame = function(e, i) {
                return t.IsWindowObjectExist() ? (i || (i = window), i.requestAnimationFrame ? i.requestAnimationFrame(e) : i.msRequestAnimationFrame ? i.msRequestAnimationFrame(e) : i.webkitRequestAnimationFrame ? i.webkitRequestAnimationFrame(e) : i.mozRequestAnimationFrame ? i.mozRequestAnimationFrame(e) : i.oRequestAnimationFrame ? i.oRequestAnimationFrame(e) : window.setTimeout(e, 16)) : setTimeout(e, 16)
            }, t.RequestFullscreen = function(e) {
                var t = e.requestFullscreen || e.msRequestFullscreen || e.webkitRequestFullscreen || e.mozRequestFullScreen;
                t && t.call(e)
            }, t.ExitFullscreen = function() {
                document.exitFullscreen ? document.exitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.webkitCancelFullScreen ? document.webkitCancelFullScreen() : document.msCancelFullScreen && document.msCancelFullScreen()
            }, t.SetCorsBehavior = function(e, i) {
                if ((!e || 0 !== e.indexOf("data:")) && t.CorsBehavior)
                    if ("string" == typeof t.CorsBehavior || t.CorsBehavior instanceof String) i.crossOrigin = t.CorsBehavior;
                    else {
                        var r = t.CorsBehavior(e);
                        r && (i.crossOrigin = r)
                    }
            }, t.CleanUrl = function(e) {
                return e = e.replace(/#/gm, "%23")
            }, t.LoadImage = function(i, r, n, o) {
                i instanceof ArrayBuffer && (i = t.EncodeArrayBufferTobase64(i)), i = t.CleanUrl(i), i = t.PreprocessUrl(i);
                var s = new Image;
                t.SetCorsBehavior(i, s);
                var a = function() {
                        s.removeEventListener("load", a), s.removeEventListener("error", l), r(s)
                    },
                    l = function(e) {
                        s.removeEventListener("load", a), s.removeEventListener("error", l), t.Error("Error while trying to load image: " + i), n && n("Error while trying to load image: " + i, e)
                    };
                s.addEventListener("load", a), s.addEventListener("error", l);
                var c = function() {
                        s.src = i
                    },
                    h = function() {
                        o && o.loadImageFromDB(i, s)
                    };
                if ("data:" !== i.substr(0, 5) && o && o.enableTexturesOffline && e.Database.IsUASupportingBlobStorage) o.openAsync(h, c);
                else {
                    if (-1 !== i.indexOf("file:")) {
                        var u = decodeURIComponent(i.substring(5).toLowerCase());
                        if (e.FilesInput.FilesToLoad[u]) {
                            try {
                                var f;
                                try {
                                    f = URL.createObjectURL(e.FilesInput.FilesToLoad[u], {
                                        oneTimeOnly: !0
                                    })
                                } catch (t) {
                                    f = URL.createObjectURL(e.FilesInput.FilesToLoad[u])
                                }
                                s.src = f
                            } catch (e) {
                                s.src = ""
                            }
                            return s
                        }
                    }
                    c()
                }
                return s
            }, t.LoadFile = function(r, n, o, s, a, l) {
                if (r = t.CleanUrl(r), r = t.PreprocessUrl(r), -1 !== r.indexOf("file:")) {
                    var c = decodeURIComponent(r.substring(5).toLowerCase());
                    if (e.FilesInput.FilesToLoad[c]) return t.ReadFile(e.FilesInput.FilesToLoad[c], n, o, a)
                }
                var h = t.BaseUrl + r,
                    u = !1,
                    f = {
                        onCompleteObservable: new e.Observable,
                        abort: function() {
                            return u = !0
                        }
                    },
                    d = function() {
                        var e = new XMLHttpRequest,
                            r = null;
                        f.abort = function() {
                            u = !0, e.readyState !== (XMLHttpRequest.DONE || 4) && e.abort(), null !== r && (clearTimeout(r), r = null)
                        };
                        var s = function(c) {
                            e.open("GET", h, !0), a && (e.responseType = "arraybuffer"), o && e.addEventListener("progress", o);
                            var d = function() {
                                e.removeEventListener("loadend", d), f.onCompleteObservable.notifyObservers(f), f.onCompleteObservable.clear()
                            };
                            e.addEventListener("loadend", d);
                            var p = function() {
                                if (!u && e.readyState === (XMLHttpRequest.DONE || 4)) {
                                    if (e.removeEventListener("readystatechange", p), e.status >= 200 && e.status < 300 || !t.IsWindowObjectExist() && 0 === e.status) return void n(a ? e.response : e.responseText, e.responseURL);
                                    var o = t.DefaultRetryStrategy;
                                    if (o) {
                                        var f = o(h, e, c);
                                        if (-1 !== f) return e.removeEventListener("loadend", d), e = new XMLHttpRequest, void(r = setTimeout((function() {
                                            return s(c + 1)
                                        }), f))
                                    }
                                    var _ = new i("Error status: " + e.status + " " + e.statusText + " - Unable to load " + h, e);
                                    if (!l) throw _;
                                    l(e, _)
                                }
                            };
                            e.addEventListener("readystatechange", p), e.send()
                        };
                        s(0)
                    };
                if (s && s.enableSceneOffline) {
                    var p = function() {
                            u || d()
                        },
                        _ = function() {
                            u || s && s.loadFileFromDB(r, (function(e) {
                                u || n(e), f.onCompleteObservable.notifyObservers(f)
                            }), o ? function(e) {
                                u || o(e)
                            } : void 0, p, a)
                        };
                    s.openAsync(_, p)
                } else d();
                return f
            }, t.LoadScript = function(e, t, i) {
                var r = document.getElementsByTagName("head")[0],
                    n = document.createElement("script");
                n.type = "text/javascript", n.src = e, n.onload = function() {
                    t && t()
                }, n.onerror = function(e) {
                    i && i("Unable to load script", e)
                }, r.appendChild(n)
            }, t.ReadFileAsDataURL = function(t, i, r) {
                var n = new FileReader,
                    o = {
                        onCompleteObservable: new e.Observable,
                        abort: function() {
                            return n.abort()
                        }
                    };
                return n.onloadend = function(e) {
                    o.onCompleteObservable.notifyObservers(o)
                }, n.onload = function(e) {
                    i(e.target.result)
                }, n.onprogress = r, n.readAsDataURL(t), o
            }, t.ReadFile = function(i, r, n, o) {
                var s = new FileReader,
                    a = {
                        onCompleteObservable: new e.Observable,
                        abort: function() {
                            return s.abort()
                        }
                    };
                return s.onloadend = function(e) {
                    return a.onCompleteObservable.notifyObservers(a)
                }, s.onerror = function(e) {
                    t.Log("Error while reading file: " + i.name), r(JSON.stringify({
                        autoClear: !0,
                        clearColor: [1, 0, 0],
                        ambientColor: [0, 0, 0],
                        gravity: [0, -9.807, 0],
                        meshes: [],
                        cameras: [],
                        lights: []
                    }))
                }, s.onload = function(e) {
                    r(e.target.result)
                }, n && (s.onprogress = n), o ? s.readAsArrayBuffer(i) : s.readAsText(i), a
            }, t.FileAsURL = function(e) {
                var t = new Blob([e]);
                return (window.URL || window.webkitURL).createObjectURL(t)
            }, t.Format = function(e, t) {
                return void 0 === t && (t = 2), e.toFixed(t)
            }, t.CheckExtends = function(e, t, i) {
                e.x < t.x && (t.x = e.x), e.y < t.y && (t.y = e.y), e.z < t.z && (t.z = e.z), e.x > i.x && (i.x = e.x), e.y > i.y && (i.y = e.y), e.z > i.z && (i.z = e.z)
            }, t.DeepCopy = function(e, t, i, r) {
                for (var n in e)
                    if (("_" !== n[0] || r && -1 !== r.indexOf(n)) && (!i || -1 === i.indexOf(n))) {
                        var s = e[n],
                            a = typeof s;
                        if ("function" !== a)
                            if ("object" === a)
                                if (s instanceof Array) {
                                    if (t[n] = [], s.length > 0)
                                        if ("object" == typeof s[0])
                                            for (var l = 0; l < s.length; l++) {
                                                var c = o(s[l], t); - 1 === t[n].indexOf(c) && t[n].push(c)
                                            } else t[n] = s.slice(0)
                                } else t[n] = o(s, t);
                        else t[n] = s
                    }
            }, t.IsEmpty = function(e) {
                for (var t in e)
                    if (e.hasOwnProperty(t)) return !1;
                return !0
            }, t.RegisterTopRootEvents = function(e) {
                for (var t = 0; t < e.length; t++) {
                    var i = e[t];
                    window.addEventListener(i.name, i.handler, !1);
                    try {
                        window.parent && window.parent.addEventListener(i.name, i.handler, !1)
                    } catch (e) {}
                }
            }, t.UnregisterTopRootEvents = function(e) {
                for (var t = 0; t < e.length; t++) {
                    var i = e[t];
                    window.removeEventListener(i.name, i.handler);
                    try {
                        window.parent && window.parent.removeEventListener(i.name, i.handler)
                    } catch (e) {}
                }
            }, t.DumpFramebuffer = function(e, i, r, o, s, a) {
                void 0 === s && (s = "image/png");
                for (var l = 4 * e, c = i / 2, h = r.readPixels(0, 0, e, i), u = 0; u < c; u++)
                    for (var f = 0; f < l; f++) {
                        var d = f + u * l,
                            p = i - u - 1,
                            _ = f + p * l,
                            m = h[d];
                        h[d] = h[_], h[_] = m
                    }
                n || (n = document.createElement("canvas")), n.width = e, n.height = i;
                var g = n.getContext("2d");
                if (g) {
                    var v = g.createImageData(e, i);
                    v.data.set(h), g.putImageData(v, 0, 0), t.EncodeScreenshotCanvasData(o, s, a)
                }
            }, t.EncodeScreenshotCanvasData = function(e, t, i) {
                void 0 === t && (t = "image/png");
                var r = n.toDataURL(t);
                e ? e(r) : (n.toBlob || (n.toBlob = function(e, t, i) {
                    var r = this;
                    setTimeout((function() {
                        for (var n = atob(r.toDataURL(t, i).split(",")[1]), o = n.length, s = new Uint8Array(o), a = 0; a < o; a++) s[a] = n.charCodeAt(a);
                        e(new Blob([s], {
                            type: t || "image/png"
                        }))
                    }))
                }), n.toBlob((function(e) {
                    var t = URL.createObjectURL(e);
                    if ("download" in document.createElement("a")) {
                        var r = window.document.createElement("a");
                        if (r.href = t, i) r.setAttribute("download", i);
                        else {
                            var n = new Date,
                                o = (n.getFullYear() + "-" + (n.getMonth() + 1)).slice(-2) + "-" + n.getDate() + "_" + n.getHours() + "-" + ("0" + n.getMinutes()).slice(-2);
                            r.setAttribute("download", "screenshot_" + o + ".png")
                        }
                        window.document.body.appendChild(r), r.addEventListener("click", (function() {
                            r.parentElement && r.parentElement.removeChild(r)
                        })), r.click()
                    } else {
                        var s = window.open("");
                        if (!s) return;
                        var a = s.document.createElement("img");
                        a.onload = function() {
                            URL.revokeObjectURL(t)
                        }, a.src = t, s.document.body.appendChild(a)
                    }
                })))
            }, t.CreateScreenshot = function(e, i, r, o, s) {
                void 0 === s && (s = "image/png");
                var a, l;
                if (r.precision) a = Math.round(e.getRenderWidth() * r.precision), l = Math.round(a / e.getAspectRatio(i));
                else if (r.width && r.height) a = r.width, l = r.height;
                else if (r.width && !r.height) a = r.width, l = Math.round(a / e.getAspectRatio(i));
                else if (r.height && !r.width) l = r.height, a = Math.round(l * e.getAspectRatio(i));
                else {
                    if (isNaN(r)) return void t.Error("Invalid 'size' parameter !");
                    l = r, a = r
                }
                n || (n = document.createElement("canvas")), n.width = a, n.height = l;
                var c = n.getContext("2d"),
                    h = e.getRenderWidth() / e.getRenderHeight(),
                    u = a,
                    f = u / h;
                f > l && (f = l, u = f * h);
                var d = Math.max(0, a - u) / 2,
                    p = Math.max(0, l - f) / 2,
                    _ = e.getRenderingCanvas();
                c && _ && c.drawImage(_, d, p, u, f), t.EncodeScreenshotCanvasData(o, s)
            }, t.CreateScreenshotUsingRenderTarget = function(i, r, n, o, s, a, l, c) {
                void 0 === s && (s = "image/png"), void 0 === a && (a = 1), void 0 === l && (l = !1);
                var h, u;
                if (n.precision) h = Math.round(i.getRenderWidth() * n.precision), u = Math.round(h / i.getAspectRatio(r)), n = {
                    width: h,
                    height: u
                };
                else if (n.width && n.height) h = n.width, u = n.height;
                else if (n.width && !n.height) h = n.width, u = Math.round(h / i.getAspectRatio(r)), n = {
                    width: h,
                    height: u
                };
                else if (n.height && !n.width) u = n.height, h = Math.round(u * i.getAspectRatio(r)), n = {
                    width: h,
                    height: u
                };
                else {
                    if (isNaN(n)) return void t.Error("Invalid 'size' parameter !");
                    u = n, h = n
                }
                var f = r.getScene(),
                    d = null;
                f.activeCamera !== r && (d = f.activeCamera, f.activeCamera = r);
                var p = new e.RenderTargetTexture("screenShot", n, f, !1, !1, e.Engine.TEXTURETYPE_UNSIGNED_INT, !1, e.Texture.NEAREST_SAMPLINGMODE);
                p.renderList = null, p.samples = a, l && p.addPostProcess(new e.FxaaPostProcess("antialiasing", 1, f.activeCamera)), p.onAfterRenderObservable.add((function() {
                    t.DumpFramebuffer(h, u, i, o, s, c)
                })), f.incrementRenderId(), f.resetCachedMaterial(), p.render(!0), p.dispose(), d && (f.activeCamera = d), r.getProjectionMatrix(!0)
            }, t.ValidateXHRData = function(t, i) {
                void 0 === i && (i = 7);
                try {
                    if (1 & i) {
                        if (t.responseText && t.responseText.length > 0) return !0;
                        if (1 === i) return !1
                    }
                    if (2 & i) {
                        var r = e.TGATools.GetTGAHeader(t.response);
                        if (r.width && r.height && r.width > 0 && r.height > 0) return !0;
                        if (2 === i) return !1
                    }
                    if (4 & i) {
                        var n = new Uint8Array(t.response, 0, 3);
                        return 68 === n[0] && 68 === n[1] && 83 === n[2]
                    }
                } catch (e) {}
                return !1
            }, t.RandomId = function() {
                return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function(e) {
                    var t = 16 * Math.random() | 0;
                    return ("x" === e ? t : 3 & t | 8).toString(16)
                }))
            }, t.IsBase64 = function(e) {
                return !(e.length < 5) && "data:" === e.substr(0, 5)
            }, t.DecodeBase64 = function(e) {
                for (var t = atob(e.split(",")[1]), i = t.length, r = new Uint8Array(new ArrayBuffer(i)), n = 0; n < i; n++) r[n] = t.charCodeAt(n);
                return r.buffer
            }, Object.defineProperty(t, "NoneLogLevel", {
                get: function() {
                    return t._NoneLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "MessageLogLevel", {
                get: function() {
                    return t._MessageLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "WarningLogLevel", {
                get: function() {
                    return t._WarningLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "ErrorLogLevel", {
                get: function() {
                    return t._ErrorLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "AllLogLevel", {
                get: function() {
                    return t._MessageLogLevel | t._WarningLogLevel | t._ErrorLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), t._AddLogEntry = function(e) {
                t._LogCache = e + t._LogCache, t.OnNewCacheEntry && t.OnNewCacheEntry(e)
            }, t._FormatMessage = function(e) {
                var t = function(e) {
                        return e < 10 ? "0" + e : "" + e
                    },
                    i = new Date;
                return "[" + t(i.getHours()) + ":" + t(i.getMinutes()) + ":" + t(i.getSeconds()) + "]: " + e
            }, t._LogDisabled = function(e) {}, t._LogEnabled = function(e) {
                var i = t._FormatMessage(e);
                console.log("BJS - " + i);
                var r = "<div style='color:white'>" + i + "</div><br>";
                t._AddLogEntry(r)
            }, t._WarnDisabled = function(e) {}, t._WarnEnabled = function(e) {
                var i = t._FormatMessage(e);
                console.warn("BJS - " + i);
                var r = "<div style='color:orange'>" + i + "</div><br>";
                t._AddLogEntry(r)
            }, t._ErrorDisabled = function(e) {}, t._ErrorEnabled = function(e) {
                t.errorsCount++;
                var i = t._FormatMessage(e);
                console.error("BJS - " + i);
                var r = "<div style='color:red'>" + i + "</div><br>";
                t._AddLogEntry(r)
            }, Object.defineProperty(t, "LogCache", {
                get: function() {
                    return t._LogCache
                },
                enumerable: !0,
                configurable: !0
            }), t.ClearLogCache = function() {
                t._LogCache = "", t.errorsCount = 0
            }, Object.defineProperty(t, "LogLevels", {
                set: function(e) {
                    (e & t.MessageLogLevel) === t.MessageLogLevel ? t.Log = t._LogEnabled : t.Log = t._LogDisabled, (e & t.WarningLogLevel) === t.WarningLogLevel ? t.Warn = t._WarnEnabled : t.Warn = t._WarnDisabled, (e & t.ErrorLogLevel) === t.ErrorLogLevel ? t.Error = t._ErrorEnabled : t.Error = t._ErrorDisabled
                },
                enumerable: !0,
                configurable: !0
            }), t.IsWindowObjectExist = function() {
                return "undefined" != typeof window
            }, Object.defineProperty(t, "PerformanceNoneLogLevel", {
                get: function() {
                    return t._PerformanceNoneLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "PerformanceUserMarkLogLevel", {
                get: function() {
                    return t._PerformanceUserMarkLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "PerformanceConsoleLogLevel", {
                get: function() {
                    return t._PerformanceConsoleLogLevel
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t, "PerformanceLogLevel", {
                set: function(e) {
                    return (e & t.PerformanceUserMarkLogLevel) === t.PerformanceUserMarkLogLevel ? (t.StartPerformanceCounter = t._StartUserMark, void(t.EndPerformanceCounter = t._EndUserMark)) : (e & t.PerformanceConsoleLogLevel) === t.PerformanceConsoleLogLevel ? (t.StartPerformanceCounter = t._StartPerformanceConsole, void(t.EndPerformanceCounter = t._EndPerformanceConsole)) : (t.StartPerformanceCounter = t._StartPerformanceCounterDisabled, void(t.EndPerformanceCounter = t._EndPerformanceCounterDisabled))
                },
                enumerable: !0,
                configurable: !0
            }), t._StartPerformanceCounterDisabled = function(e, t) {}, t._EndPerformanceCounterDisabled = function(e, t) {}, t._StartUserMark = function(e, i) {
                if (void 0 === i && (i = !0), !t._performance) {
                    if (!t.IsWindowObjectExist()) return;
                    t._performance = window.performance
                }
                i && t._performance.mark && t._performance.mark(e + "-Begin")
            }, t._EndUserMark = function(e, i) {
                void 0 === i && (i = !0), i && t._performance.mark && (t._performance.mark(e + "-End"), t._performance.measure(e, e + "-Begin", e + "-End"))
            }, t._StartPerformanceConsole = function(e, i) {
                void 0 === i && (i = !0), i && (t._StartUserMark(e, i), console.time && console.time(e))
            }, t._EndPerformanceConsole = function(e, i) {
                void 0 === i && (i = !0), i && (t._EndUserMark(e, i), console.time && console.timeEnd(e))
            }, Object.defineProperty(t, "Now", {
                get: function() {
                    return t.IsWindowObjectExist() && window.performance && window.performance.now ? window.performance.now() : (new Date).getTime()
                },
                enumerable: !0,
                configurable: !0
            }), t.GetClassName = function(e, t) {
                void 0 === t && (t = !1);
                var i = null;
                if (!t && e.getClassName) i = e.getClassName();
                else {
                    if (e instanceof Object) {
                        i = (t ? e : Object.getPrototypeOf(e)).constructor.__bjsclassName__
                    }
                    i || (i = typeof e)
                }
                return i
            }, t.First = function(e, t) {
                for (var i = 0, r = e; i < r.length; i++) {
                    var n = r[i];
                    if (t(n)) return n
                }
                return null
            }, t.getFullClassName = function(e, t) {
                void 0 === t && (t = !1);
                var i = null,
                    r = null;
                if (!t && e.getClassName) i = e.getClassName();
                else {
                    if (e instanceof Object) {
                        var n = t ? e : Object.getPrototypeOf(e);
                        i = n.constructor.__bjsclassName__, r = n.constructor.__bjsmoduleName__
                    }
                    i || (i = typeof e)
                }
                return i ? (null != r ? r + "." : "") + i : null
            }, t.arrayOrStringFeeder = function(e) {
                return function(i) {
                    if (i >= e.length) return null;
                    var r = e.charCodeAt ? e.charCodeAt(i) : e[i];
                    return r && r.getHashCode && (r = r.getHashCode()), "string" == typeof r ? t.hashCodeFromStream(t.arrayOrStringFeeder(r)) : r
                }
            }, t.hashCodeFromStream = function(e) {
                for (var t = 0, i = 0, r = e(i++); null != r;) t = (t << 5) - t + r, t |= 0, r = e(i++);
                return t
            }, t.DelayAsync = function(e) {
                return new Promise(function(t) {
                    setTimeout((function() {
                        t()
                    }), e)
                })
            }, t.BaseUrl = "", t.DefaultRetryStrategy = r.ExponentialBackoff(), t.CorsBehavior = "anonymous", t.UseFallbackTexture = !0, t.RegisteredExternalClasses = {}, t.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", t.PreprocessUrl = function(e) {
                return e
            }, t._NoneLogLevel = 0, t._MessageLogLevel = 1, t._WarningLogLevel = 2, t._ErrorLogLevel = 4, t._LogCache = "", t.errorsCount = 0, t.Log = t._LogEnabled, t.Warn = t._WarnEnabled, t.Error = t._ErrorEnabled, t._PerformanceNoneLogLevel = 0, t._PerformanceUserMarkLogLevel = 1, t._PerformanceConsoleLogLevel = 2, t.StartPerformanceCounter = t._StartPerformanceCounterDisabled, t.EndPerformanceCounter = t._EndPerformanceCounterDisabled, t
        })();
    e.Tools = s;
    var a = (function() {
        function e() {
            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
        }
        return Object.defineProperty(e.prototype, "min", {
            get: function() {
                return this._min
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "max", {
            get: function() {
                return this._max
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "average", {
            get: function() {
                return this._average
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "lastSecAverage", {
            get: function() {
                return this._lastSecAverage
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "current", {
            get: function() {
                return this._current
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "total", {
            get: function() {
                return this._totalAccumulated
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "count", {
            get: function() {
                return this._totalValueCount
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.fetchNewFrame = function() {
            this._totalValueCount++, this._current = 0, this._lastSecValueCount++
        }, e.prototype.addCount = function(t, i) {
            e.Enabled && (this._current += t, i && this._fetchResult())
        }, e.prototype.beginMonitoring = function() {
            e.Enabled && (this._startMonitoringTime = s.Now)
        }, e.prototype.endMonitoring = function(t) {
            if (void 0 === t && (t = !0), e.Enabled) {
                t && this.fetchNewFrame();
                var i = s.Now;
                this._current = i - this._startMonitoringTime, t && this._fetchResult()
            }
        }, e.prototype._fetchResult = function() {
            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;
            var e = s.Now;
            e - this._lastSecTime > 1e3 && (this._lastSecAverage = this._lastSecAccumulated / this._lastSecValueCount, this._lastSecTime = e, this._lastSecAccumulated = 0, this._lastSecValueCount = 0)
        }, e.Enabled = !0, e
    })();
    e.PerfCounter = a, e.className = t;
    var l = (function() {
        function e(e, t, i, r) {
            void 0 === r && (r = 0), this.iterations = e, this._fn = t, this._successCallback = i, this.index = r - 1, this._done = !1
        }
        return e.prototype.executeNext = function() {
            this._done || (this.index + 1 < this.iterations ? (++this.index, this._fn(this)) : this.breakLoop())
        }, e.prototype.breakLoop = function() {
            this._done = !0, this._successCallback()
        }, e.Run = function(t, i, r, n) {
            void 0 === n && (n = 0);
            var o = new e(t, i, r, n);
            return o.executeNext(), o
        }, e.SyncAsyncForLoop = function(t, i, r, n, o, s) {
            void 0 === s && (s = 0), e.Run(Math.ceil(t / i), (function(e) {
                o && o() ? e.breakLoop() : setTimeout((function() {
                    for (var n = 0; n < i; ++n) {
                        var s = e.index * i + n;
                        if (s >= t) break;
                        if (r(s), o && o()) {
                            e.breakLoop();
                            break
                        }
                    }
                    e.executeNext()
                }), s)
            }), n)
        }, e
    })();
    e.AsyncLoop = l
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.Pending = 0] = "Pending", e[e.Fulfilled = 1] = "Fulfilled", e[e.Rejected = 2] = "Rejected"
    })(t || (t = {}));
    var i = (function() {
            function e() {
                this.count = 0, this.target = 0, this.results = []
            }
            return e
        })(),
        r = (function() {
            function r(e) {
                var i = this;
                if (this._state = t.Pending, this._children = new Array, this._rejectWasConsumed = !1, e) try {
                    e((function(e) {
                        i._resolve(e)
                    }), (function(e) {
                        i._reject(e)
                    }))
                } catch (e) {
                    this._reject(e)
                }
            }
            return r.prototype.catch = function(e) {
                return this.then(void 0, e)
            }, r.prototype.then = function(i, n) {
                var o = this,
                    s = new r;
                return s._onFulfilled = i, s._onRejected = n, this._children.push(s), this._state !== t.Pending && e.Tools.SetImmediate((function() {
                    if (o._state === t.Fulfilled || o._rejectWasConsumed) {
                        var e = s._resolve(o._result);
                        if (void 0 !== e && null !== e)
                            if (void 0 !== e._state) {
                                var i = e;
                                s._children.push(i), s = i
                            } else s._result = e
                    } else s._reject(o._reason)
                })), s
            }, r.prototype._moveChildren = function(e) {
                if ((a = this._children).push.apply(a, e.splice(0, e.length)), this._state === t.Fulfilled)
                    for (var i = 0, r = this._children; i < r.length; i++) {
                        var n = r[i];
                        n._resolve(this._result)
                    } else if (this._state === t.Rejected)
                        for (var o = 0, s = this._children; o < s.length; o++) {
                            var n = s[o];
                            n._reject(this._reason)
                        }
                var a
            }, r.prototype._resolve = function(e) {
                try {
                    this._state = t.Fulfilled, this._result = e;
                    var i = null;
                    if (this._onFulfilled && (i = this._onFulfilled(e)), void 0 !== i && null !== i)
                        if (void 0 !== i._state) {
                            var r = i;
                            r._moveChildren(this._children)
                        } else e = i;
                    for (var n = 0, o = this._children; n < o.length; n++) {
                        o[n]._resolve(e)
                    }
                    return this._children.length = 0, delete this._onFulfilled, delete this._onRejected, i
                } catch (e) {
                    this._reject(e, !0)
                }
                return null
            }, r.prototype._reject = function(e, i) {
                if (void 0 === i && (i = !1), this._state = t.Rejected, this._reason = e, this._onRejected && !i) try {
                    this._onRejected(e), this._rejectWasConsumed = !0
                } catch (t) {
                    e = t
                }
                for (var r = 0, n = this._children; r < n.length; r++) {
                    var o = n[r];
                    this._rejectWasConsumed ? o._resolve(null) : o._reject(e)
                }
                this._children.length = 0, delete this._onFulfilled, delete this._onRejected
            }, r.resolve = function(e) {
                var t = new r;
                return t._resolve(e), t
            }, r._RegisterForFulfillment = function(e, i, r) {
                e.then((function(e) {
                    return i.results[r] = e, i.count++, i.count === i.target && i.rootPromise._resolve(i.results), null
                }), (function(e) {
                    i.rootPromise._state !== t.Rejected && i.rootPromise._reject(e)
                }))
            }, r.all = function(e) {
                var t = new r,
                    n = new i;
                if (n.target = e.length, n.rootPromise = t, e.length)
                    for (var o = 0; o < e.length; o++) r._RegisterForFulfillment(e[o], n, o);
                else t._resolve([]);
                return t
            }, r
        })(),
        n = (function() {
            function e() {}
            return e.Apply = function(e) {
                if (void 0 === e && (e = !1), e || "undefined" == typeof Promise) {
                    window.Promise = r
                }
            }, e
        })();
    e.PromisePolyfill = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e) {
            this._pendingActions = new Array, this._workerInfos = e.map((function(e) {
                return {
                    worker: e,
                    active: !1
                }
            }))
        }
        return e.prototype.dispose = function() {
            for (var e = 0, t = this._workerInfos; e < t.length; e++) {
                t[e].worker.terminate()
            }
            delete this._workerInfos, delete this._pendingActions
        }, e.prototype.push = function(e) {
            for (var t = 0, i = this._workerInfos; t < i.length; t++) {
                var r = i[t];
                if (!r.active) return void this._execute(r, e)
            }
            this._pendingActions.push(e)
        }, e.prototype._execute = function(e, t) {
            var i = this;
            e.active = !0, t(e.worker, (function() {
                e.active = !1;
                var t = i._pendingActions.shift();
                t && i._execute(e, t)
            }))
        }, e
    })();
    e.WorkerPool = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._isAlphaBlendDirty = !1, this._isBlendFunctionParametersDirty = !1, this._isBlendEquationParametersDirty = !1, this._isBlendConstantsDirty = !1, this._alphaBlend = !1, this._blendFunctionParameters = new Array(4), this._blendEquationParameters = new Array(2), this._blendConstants = new Array(4), this.reset()
        }
        return Object.defineProperty(e.prototype, "isDirty", {
            get: function() {
                return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "alphaBlend", {
            get: function() {
                return this._alphaBlend
            },
            set: function(e) {
                this._alphaBlend !== e && (this._alphaBlend = e, this._isAlphaBlendDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.setAlphaBlendConstants = function(e, t, i, r) {
            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)
        }, e.prototype.setAlphaBlendFunctionParameters = function(e, t, i, r) {
            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)
        }, e.prototype.setAlphaEquationParameters = function(e, t) {
            this._blendEquationParameters[0] === e && this._blendEquationParameters[1] === t || (this._blendEquationParameters[0] = e, this._blendEquationParameters[1] = t, this._isBlendEquationParametersDirty = !0)
        }, e.prototype.reset = function() {
            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
        }, e.prototype.apply = function(e) {
            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._isBlendEquationParametersDirty[0], this._isBlendEquationParametersDirty[1]), this._isBlendEquationParametersDirty = !1), this._isBlendConstantsDirty && (e.blendColor(this._blendConstants[0], this._blendConstants[1], this._blendConstants[2], this._blendConstants[3]), this._isBlendConstantsDirty = !1))
        }, e
    })();
    e._AlphaState = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._isDepthTestDirty = !1, this._isDepthMaskDirty = !1, this._isDepthFuncDirty = !1, this._isCullFaceDirty = !1, this._isCullDirty = !1, this._isZOffsetDirty = !1, this._isFrontFaceDirty = !1, this.reset()
        }
        return Object.defineProperty(e.prototype, "isDirty", {
            get: function() {
                return this._isDepthFuncDirty || this._isDepthTestDirty || this._isDepthMaskDirty || this._isCullFaceDirty || this._isCullDirty || this._isZOffsetDirty || this._isFrontFaceDirty
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "zOffset", {
            get: function() {
                return this._zOffset
            },
            set: function(e) {
                this._zOffset !== e && (this._zOffset = e, this._isZOffsetDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "cullFace", {
            get: function() {
                return this._cullFace
            },
            set: function(e) {
                this._cullFace !== e && (this._cullFace = e, this._isCullFaceDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "cull", {
            get: function() {
                return this._cull
            },
            set: function(e) {
                this._cull !== e && (this._cull = e, this._isCullDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "depthFunc", {
            get: function() {
                return this._depthFunc
            },
            set: function(e) {
                this._depthFunc !== e && (this._depthFunc = e, this._isDepthFuncDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "depthMask", {
            get: function() {
                return this._depthMask
            },
            set: function(e) {
                this._depthMask !== e && (this._depthMask = e, this._isDepthMaskDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "depthTest", {
            get: function() {
                return this._depthTest
            },
            set: function(e) {
                this._depthTest !== e && (this._depthTest = e, this._isDepthTestDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "frontFace", {
            get: function() {
                return this._frontFace
            },
            set: function(e) {
                this._frontFace !== e && (this._frontFace = e, this._isFrontFaceDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.reset = function() {
            this._depthMask = !0, this._depthTest = !0, this._depthFunc = null, this._cullFace = null, this._cull = null, this._zOffset = 0, this._frontFace = null, this._isDepthTestDirty = !0, this._isDepthMaskDirty = !0, this._isDepthFuncDirty = !1, this._isCullFaceDirty = !1, this._isCullDirty = !1, this._isZOffsetDirty = !1, this._isFrontFaceDirty = !1
        }, e.prototype.apply = function(e) {
            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 ? (e.enable(e.POLYGON_OFFSET_FILL), e.polygonOffset(this.zOffset, 0)) : e.disable(e.POLYGON_OFFSET_FILL), this._isZOffsetDirty = !1), this._isFrontFaceDirty && (e.frontFace(this.frontFace), this._isFrontFaceDirty = !1))
        }, e
    })();
    e._DepthCullingState = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._isStencilTestDirty = !1, this._isStencilMaskDirty = !1, this._isStencilFuncDirty = !1, this._isStencilOpDirty = !1, this.reset()
        }
        return Object.defineProperty(t.prototype, "isDirty", {
            get: function() {
                return this._isStencilTestDirty || this._isStencilMaskDirty || this._isStencilFuncDirty || this._isStencilOpDirty
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilFunc", {
            get: function() {
                return this._stencilFunc
            },
            set: function(e) {
                this._stencilFunc !== e && (this._stencilFunc = e, this._isStencilFuncDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilFuncRef", {
            get: function() {
                return this._stencilFuncRef
            },
            set: function(e) {
                this._stencilFuncRef !== e && (this._stencilFuncRef = e, this._isStencilFuncDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilFuncMask", {
            get: function() {
                return this._stencilFuncMask
            },
            set: function(e) {
                this._stencilFuncMask !== e && (this._stencilFuncMask = e, this._isStencilFuncDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilOpStencilFail", {
            get: function() {
                return this._stencilOpStencilFail
            },
            set: function(e) {
                this._stencilOpStencilFail !== e && (this._stencilOpStencilFail = e, this._isStencilOpDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilOpDepthFail", {
            get: function() {
                return this._stencilOpDepthFail
            },
            set: function(e) {
                this._stencilOpDepthFail !== e && (this._stencilOpDepthFail = e, this._isStencilOpDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilOpStencilDepthPass", {
            get: function() {
                return this._stencilOpStencilDepthPass
            },
            set: function(e) {
                this._stencilOpStencilDepthPass !== e && (this._stencilOpStencilDepthPass = e, this._isStencilOpDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilMask", {
            get: function() {
                return this._stencilMask
            },
            set: function(e) {
                this._stencilMask !== e && (this._stencilMask = e, this._isStencilMaskDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "stencilTest", {
            get: function() {
                return this._stencilTest
            },
            set: function(e) {
                this._stencilTest !== e && (this._stencilTest = e, this._isStencilTestDirty = !0)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.reset = function() {
            this._stencilTest = !1, this._stencilMask = 255, this._stencilFunc = e.Engine.ALWAYS, this._stencilFuncRef = 1, this._stencilFuncMask = 255, this._stencilOpStencilFail = e.Engine.KEEP, this._stencilOpDepthFail = e.Engine.KEEP, this._stencilOpStencilDepthPass = e.Engine.REPLACE, this._isStencilTestDirty = !0, this._isStencilMaskDirty = !0, this._isStencilFuncDirty = !0, this._isStencilOpDirty = !0
        }, t.prototype.apply = function(e) {
            this.isDirty && (this._isStencilTestDirty && (this.stencilTest ? e.enable(e.STENCIL_TEST) : e.disable(e.STENCIL_TEST), this._isStencilTestDirty = !1), this._isStencilMaskDirty && (e.stencilMask(this.stencilMask), this._isStencilMaskDirty = !1), this._isStencilFuncDirty && (e.stencilFunc(this.stencilFunc, this.stencilFuncRef, this.stencilFuncMask), this._isStencilFuncDirty = !1), this._isStencilOpDirty && (e.stencilOp(this.stencilOpStencilFail, this.stencilOpDepthFail, this.stencilOpStencilDepthPass), this._isStencilOpDirty = !1))
        }, t
    })();
    e._StencilState = t
})(BABYLON || (BABYLON = {}));
var __assign = this && this.__assign || Object.assign || function(e) {
        for (var t, i = 1, r = arguments.length; i < r; i++) {
            t = arguments[i];
            for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n])
        }
        return e
    },
    BABYLON;
!(function(e) {
    var t = function(e, t, r, n, o) {
            return i(e, o + (n ? n + "\n" : "") + t, r)
        },
        i = function(e, t, i) {
            var r = e.createShader("vertex" === i ? e.VERTEX_SHADER : e.FRAGMENT_SHADER);
            if (e.shaderSource(r, t), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
                var n = e.getShaderInfoLog(r);
                if (n) throw new Error(n)
            }
            if (!r) throw new Error("Something went wrong while compile the shader.");
            return r
        },
        r = function(t, i, r) {
            var n = r.NEAREST,
                o = r.NEAREST;
            switch (t) {
                case e.Texture.BILINEAR_SAMPLINGMODE:
                    n = r.LINEAR, o = i ? r.LINEAR_MIPMAP_NEAREST : r.LINEAR;
                    break;
                case e.Texture.TRILINEAR_SAMPLINGMODE:
                    n = r.LINEAR, o = i ? r.LINEAR_MIPMAP_LINEAR : r.LINEAR;
                    break;
                case e.Texture.NEAREST_SAMPLINGMODE:
                    n = r.NEAREST, o = i ? r.NEAREST_MIPMAP_LINEAR : r.NEAREST;
                    break;
                case e.Texture.NEAREST_NEAREST_MIPNEAREST:
                    n = r.NEAREST, o = i ? r.NEAREST_MIPMAP_NEAREST : r.NEAREST;
                    break;
                case e.Texture.NEAREST_LINEAR_MIPNEAREST:
                    n = r.NEAREST, o = i ? r.LINEAR_MIPMAP_NEAREST : r.LINEAR;
                    break;
                case e.Texture.NEAREST_LINEAR_MIPLINEAR:
                    n = r.NEAREST, o = i ? r.LINEAR_MIPMAP_LINEAR : r.LINEAR;
                    break;
                case e.Texture.NEAREST_LINEAR:
                    n = r.NEAREST, o = r.LINEAR;
                    break;
                case e.Texture.NEAREST_NEAREST:
                    n = r.NEAREST, o = r.NEAREST;
                    break;
                case e.Texture.LINEAR_NEAREST_MIPNEAREST:
                    n = r.LINEAR, o = i ? r.NEAREST_MIPMAP_NEAREST : r.NEAREST;
                    break;
                case e.Texture.LINEAR_NEAREST_MIPLINEAR:
                    n = r.LINEAR, o = i ? r.NEAREST_MIPMAP_LINEAR : r.NEAREST;
                    break;
                case e.Texture.LINEAR_LINEAR:
                    n = r.LINEAR, o = r.LINEAR;
                    break;
                case e.Texture.LINEAR_NEAREST:
                    n = r.LINEAR, o = r.NEAREST
            }
            return {
                min: o,
                mag: n
            }
        },
        n = function(t, i, r, n, o, s) {
            void 0 === s && (s = null);
            var a, l = function() {
                    r[i] = a, r._internalCount++, n && n._removePendingData(a), 6 === r._internalCount && o(r)
                },
                c = function(e, t) {
                    n && n._removePendingData(a), s && s(e, t)
                };
            a = e.Tools.LoadImage(t, l, c, n ? n.database : null), n && n._addPendingData(a)
        },
        o = function(e, t, i, r, o) {
            void 0 === o && (o = null);
            var s = [];
            s._internalCount = 0;
            for (var a = 0; a < 6; a++) n(r[a], a, s, t, i, o)
        },
        s = (function() {
            function e() {}
            return e
        })(),
        a = (function() {
            function e() {}
            return e
        })();
    e.InstancingAttributeInfo = a;
    var l = (function() {
        function e() {}
        return e
    })();
    e.RenderTargetCreationOptions = l;
    var c = (function() {
        function e() {}
        return e
    })();
    e.DepthTextureCreationOptions = c;
    var h = (function() {
        function e() {}
        return e
    })();
    e.EngineCapabilities = h;
    var u = (function() {
        function n(t, i, r, o) {
            void 0 === o && (o = !1);
            var a = this;
            this.forcePOTTextures = !1, this.isFullscreen = !1, this.isPointerLock = !1, this.cullBackFaces = !0, this.renderEvenInBackground = !0, this.preventCacheWipeBetweenFrames = !1, this.enableOfflineSupport = !1, this.scenes = new Array, this.postProcesses = new Array, this.onResizeObservable = new e.Observable, this.onCanvasBlurObservable = new e.Observable, this.onCanvasFocusObservable = new e.Observable, this.onCanvasPointerOutObservable = new e.Observable, this.onBeforeTextureInitObservable = new e.Observable, this._vrDisplay = void 0, this._vrSupported = !1, this._vrExclusivePointerMode = !1, this.disableUniformBuffers = !1, this._uniformBuffers = new Array, this.onBeginFrameObservable = new e.Observable, this.onEndFrameObservable = new e.Observable, this.onBeforeShaderCompilationObservable = new e.Observable, this.onAfterShaderCompilationObservable = new e.Observable, this._windowIsBackground = !1, this._webGLVersion = 1, this._badOS = !1, this._badDesktopOS = !1, this.disableTextureBindingOptimization = !1, this.onVRDisplayChangedObservable = new e.Observable, this.onVRRequestPresentComplete = new e.Observable, this.onVRRequestPresentStart = new e.Observable, this._colorWrite = !0, this._drawCalls = new e.PerfCounter, this._textureCollisions = new e.PerfCounter, this._renderingQueueLaunched = !1, this._activeRenderLoops = new Array, this._deterministicLockstep = !1, this._lockstepMaxSteps = 4, this.onContextLostObservable = new e.Observable, this.onContextRestoredObservable = new e.Observable, this._contextWasLost = !1, this._doNotHandleContextLost = !1, this._performanceMonitor = new e.PerformanceMonitor, this._fps = 60, this._deltaTime = 0, this.disablePerformanceMonitorInBackground = !1, this._depthCullingState = new e._DepthCullingState, this._stencilState = new e._StencilState, this._alphaState = new e._AlphaState, this._alphaMode = n.ALPHA_DISABLE, this._internalTexturesCache = new Array, this._activeChannel = 0, this._currentTextureChannel = -1, this._boundTexturesCache = {}, this._compiledEffects = {}, this._vertexAttribArraysEnabled = [], this._uintIndicesCurrentlySet = !1, this._currentBoundBuffer = new Array, this._currentBufferPointers = new Array, this._currentInstanceLocations = new Array, this._currentInstanceBuffers = new Array, this._firstBoundInternalTextureTracker = new e.DummyInternalTextureTracker, this._lastBoundInternalTextureTracker = new e.DummyInternalTextureTracker, this._vaoRecordInProgress = !1, this._mustWipeVertexAttributes = !1, this._nextFreeTextureSlots = new Array, this._maxSimultaneousTextures = 0, this._activeRequests = new Array, this._texturesSupported = new Array, this._onVRFullScreenTriggered = function() {
                if (a._vrDisplay && a._vrDisplay.isPresenting) {
                    a._oldSize = new e.Size(a.getRenderWidth(), a.getRenderHeight()), a._oldHardwareScaleFactor = a.getHardwareScalingLevel();
                    var t = a._vrDisplay.getEyeParameters("left");
                    a.setHardwareScalingLevel(1), a.setSize(2 * t.renderWidth, t.renderHeight)
                } else a.setHardwareScalingLevel(a._oldHardwareScaleFactor), a.setSize(a._oldSize.width, a._oldSize.height)
            }, this._boundUniforms = {}, e.PromisePolyfill.Apply();
            var l = null;
            if (n.Instances.push(this), t) {
                if (r = r || {}, t.getContext) {
                    if (l = t, this._renderingCanvas = l, null != i && (r.antialias = i), void 0 === r.deterministicLockstep && (r.deterministicLockstep = !1), void 0 === r.lockstepMaxSteps && (r.lockstepMaxSteps = 4), void 0 === r.preserveDrawingBuffer && (r.preserveDrawingBuffer = !1), void 0 === r.audioEngine && (r.audioEngine = !0), void 0 === r.stencil && (r.stencil = !0), this._deterministicLockstep = r.deterministicLockstep, this._lockstepMaxSteps = r.lockstepMaxSteps, this._doNotHandleContextLost = !!r.doNotHandleContextLost, navigator && navigator.userAgent)
                        for (var c = navigator.userAgent, h = 0, u = n.ExceptionList; h < u.length; h++) {
                            var f = u[h],
                                d = f.key,
                                p = f.targets;
                            if (c.indexOf(d) > -1) {
                                if (f.capture && f.captureConstraint) {
                                    var _ = f.capture,
                                        m = f.captureConstraint,
                                        g = new RegExp(_),
                                        v = g.exec(c);
                                    if (v && v.length > 0) {
                                        var y = parseInt(v[v.length - 1]);
                                        if (y >= m) continue
                                    }
                                }
                                for (var b = 0, x = p; b < x.length; b++) {
                                    var T = x[b];
                                    switch (T) {
                                        case "uniformBuffer":
                                            this.disableUniformBuffers = !0;
                                            break;
                                        case "textureBindingOptimization":
                                            this.disableTextureBindingOptimization = !0
                                    }
                                }
                                break
                            }
                        }
                    if (!r.disableWebGL2Support) try {
                        this._gl = l.getContext("webgl2", r) || l.getContext("experimental-webgl2", r), this._gl && (this._webGLVersion = 2)
                    } catch (e) {}
                    if (!this._gl) {
                        if (!l) throw new Error("The provided canvas is null or undefined.");
                        try {
                            this._gl = l.getContext("webgl", r) || l.getContext("experimental-webgl", r)
                        } catch (e) {
                            throw new Error("WebGL not supported")
                        }
                    }
                    if (!this._gl) throw new Error("WebGL not supported");
                    this._onCanvasFocus = function() {
                        a.onCanvasFocusObservable.notifyObservers(a)
                    }, this._onCanvasBlur = function() {
                        a.onCanvasBlurObservable.notifyObservers(a)
                    }, l.addEventListener("focus", this._onCanvasFocus), l.addEventListener("blur", this._onCanvasBlur), this._onBlur = function() {
                        a.disablePerformanceMonitorInBackground && a._performanceMonitor.disable(), a._windowIsBackground = !0
                    }, this._onFocus = function() {
                        a.disablePerformanceMonitorInBackground && a._performanceMonitor.enable(), a._windowIsBackground = !1
                    }, this._onCanvasPointerOut = function(e) {
                        a.onCanvasPointerOutObservable.notifyObservers(e)
                    }, window.addEventListener("blur", this._onBlur), window.addEventListener("focus", this._onFocus), l.addEventListener("pointerout", this._onCanvasPointerOut), this._doNotHandleContextLost || (this._onContextLost = function(t) {
                        t.preventDefault(), a._contextWasLost = !0, e.Tools.Warn("WebGL context lost."), a.onContextLostObservable.notifyObservers(a)
                    }, this._onContextRestored = function(t) {
                        setTimeout((function() {
                            a._initGLContext(), a._rebuildEffects(), a._rebuildInternalTextures(), a._rebuildBuffers(), a.wipeCaches(!0), e.Tools.Warn("WebGL context successfully restored."), a.onContextRestoredObservable.notifyObservers(a), a._contextWasLost = !1
                        }), 0)
                    }, l.addEventListener("webglcontextlost", this._onContextLost, !1), l.addEventListener("webglcontextrestored", this._onContextRestored, !1))
                } else this._gl = t, this._renderingCanvas = this._gl.canvas, this._gl.renderbufferStorageMultisample && (this._webGLVersion = 2), r.stencil = this._gl.getContextAttributes().stencil;
                var E = r.limitDeviceRatio || window.devicePixelRatio || 1;
                this._hardwareScalingLevel = o ? 1 / Math.min(E, window.devicePixelRatio || 1) : 1, this.resize(), this._isStencilEnable = !!r.stencil, this._initGLContext(), l && (this._onFullscreenChange = function() {
                    void 0 !== document.fullscreen ? a.isFullscreen = document.fullscreen : void 0 !== document.mozFullScreen ? a.isFullscreen = document.mozFullScreen : void 0 !== document.webkitIsFullScreen ? a.isFullscreen = document.webkitIsFullScreen : void 0 !== document.msIsFullScreen && (a.isFullscreen = document.msIsFullScreen), a.isFullscreen && a._pointerLockRequested && l && (l.requestPointerLock = l.requestPointerLock || l.msRequestPointerLock || l.mozRequestPointerLock || l.webkitRequestPointerLock, l.requestPointerLock && l.requestPointerLock())
                }, document.addEventListener("fullscreenchange", this._onFullscreenChange, !1), document.addEventListener("mozfullscreenchange", this._onFullscreenChange, !1), document.addEventListener("webkitfullscreenchange", this._onFullscreenChange, !1), document.addEventListener("msfullscreenchange", this._onFullscreenChange, !1), this._onPointerLockChange = function() {
                    a.isPointerLock = document.mozPointerLockElement === l || document.webkitPointerLockElement === l || document.msPointerLockElement === l || document.pointerLockElement === l
                }, document.addEventListener("pointerlockchange", this._onPointerLockChange, !1), document.addEventListener("mspointerlockchange", this._onPointerLockChange, !1), document.addEventListener("mozpointerlockchange", this._onPointerLockChange, !1), document.addEventListener("webkitpointerlockchange", this._onPointerLockChange, !1), this._onVRDisplayPointerRestricted = function() {
                    l && l.requestPointerLock()
                }, this._onVRDisplayPointerUnrestricted = function() {
                    document.exitPointerLock()
                }, window.addEventListener("vrdisplaypointerrestricted", this._onVRDisplayPointerRestricted, !1), window.addEventListener("vrdisplaypointerunrestricted", this._onVRDisplayPointerUnrestricted, !1)), r.audioEngine && e.AudioEngine && !n.audioEngine && (n.audioEngine = new e.AudioEngine);
                for (var A = 0; A < this._caps.maxVertexAttribs; A++) this._currentBufferPointers[A] = new s;
                this._linkTrackers(this._firstBoundInternalTextureTracker, this._lastBoundInternalTextureTracker), r.autoEnableWebVR && this.initWebVR(), this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent), this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent), e.Tools.Log("Babylon.js engine (v" + n.Version + ") launched"), this.enableOfflineSupport = void 0 !== e.Database
            }
        }
        return Object.defineProperty(n, "LastCreatedEngine", {
            get: function() {
                return 0 === n.Instances.length ? null : n.Instances[n.Instances.length - 1]
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "LastCreatedScene", {
            get: function() {
                var e = n.LastCreatedEngine;
                return e ? 0 === e.scenes.length ? null : e.scenes[e.scenes.length - 1] : null
            },
            enumerable: !0,
            configurable: !0
        }), n.MarkAllMaterialsAsDirty = function(e, t) {
            for (var i = 0; i < n.Instances.length; i++)
                for (var r = n.Instances[i], o = 0; o < r.scenes.length; o++) r.scenes[o].markAllMaterialsAsDirty(e, t)
        }, Object.defineProperty(n, "NEVER", {
            get: function() {
                return n._NEVER
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALWAYS", {
            get: function() {
                return n._ALWAYS
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "LESS", {
            get: function() {
                return n._LESS
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "EQUAL", {
            get: function() {
                return n._EQUAL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "LEQUAL", {
            get: function() {
                return n._LEQUAL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "GREATER", {
            get: function() {
                return n._GREATER
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "GEQUAL", {
            get: function() {
                return n._GEQUAL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "NOTEQUAL", {
            get: function() {
                return n._NOTEQUAL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "KEEP", {
            get: function() {
                return n._KEEP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "REPLACE", {
            get: function() {
                return n._REPLACE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "INCR", {
            get: function() {
                return n._INCR
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "DECR", {
            get: function() {
                return n._DECR
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "INVERT", {
            get: function() {
                return n._INVERT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "INCR_WRAP", {
            get: function() {
                return n._INCR_WRAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "DECR_WRAP", {
            get: function() {
                return n._DECR_WRAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_DISABLE", {
            get: function() {
                return n._ALPHA_DISABLE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_ONEONE", {
            get: function() {
                return n._ALPHA_ONEONE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_ADD", {
            get: function() {
                return n._ALPHA_ADD
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_COMBINE", {
            get: function() {
                return n._ALPHA_COMBINE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_SUBTRACT", {
            get: function() {
                return n._ALPHA_SUBTRACT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_MULTIPLY", {
            get: function() {
                return n._ALPHA_MULTIPLY
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_MAXIMIZED", {
            get: function() {
                return n._ALPHA_MAXIMIZED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_PREMULTIPLIED", {
            get: function() {
                return n._ALPHA_PREMULTIPLIED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_PREMULTIPLIED_PORTERDUFF", {
            get: function() {
                return n._ALPHA_PREMULTIPLIED_PORTERDUFF
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_INTERPOLATE", {
            get: function() {
                return n._ALPHA_INTERPOLATE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "ALPHA_SCREENMODE", {
            get: function() {
                return n._ALPHA_SCREENMODE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "DELAYLOADSTATE_NONE", {
            get: function() {
                return n._DELAYLOADSTATE_NONE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "DELAYLOADSTATE_LOADED", {
            get: function() {
                return n._DELAYLOADSTATE_LOADED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "DELAYLOADSTATE_LOADING", {
            get: function() {
                return n._DELAYLOADSTATE_LOADING
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "DELAYLOADSTATE_NOTLOADED", {
            get: function() {
                return n._DELAYLOADSTATE_NOTLOADED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_ALPHA", {
            get: function() {
                return n._TEXTUREFORMAT_ALPHA
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_LUMINANCE", {
            get: function() {
                return n._TEXTUREFORMAT_LUMINANCE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_R32F", {
            get: function() {
                return n._TEXTUREFORMAT_R32F
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_RG32F", {
            get: function() {
                return n._TEXTUREFORMAT_RG32F
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_RGB32F", {
            get: function() {
                return n._TEXTUREFORMAT_RGB32F
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_RGBA32F", {
            get: function() {
                return n._TEXTUREFORMAT_RGBA32F
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_LUMINANCE_ALPHA", {
            get: function() {
                return n._TEXTUREFORMAT_LUMINANCE_ALPHA
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_RGB", {
            get: function() {
                return n._TEXTUREFORMAT_RGB
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTUREFORMAT_RGBA", {
            get: function() {
                return n._TEXTUREFORMAT_RGBA
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTURETYPE_UNSIGNED_INT", {
            get: function() {
                return n._TEXTURETYPE_UNSIGNED_INT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTURETYPE_FLOAT", {
            get: function() {
                return n._TEXTURETYPE_FLOAT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "TEXTURETYPE_HALF_FLOAT", {
            get: function() {
                return n._TEXTURETYPE_HALF_FLOAT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "SCALEMODE_FLOOR", {
            get: function() {
                return n._SCALEMODE_FLOOR
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "SCALEMODE_NEAREST", {
            get: function() {
                return n._SCALEMODE_NEAREST
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "SCALEMODE_CEILING", {
            get: function() {
                return n._SCALEMODE_CEILING
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n, "Version", {
            get: function() {
                return "3.2.0-alpha10"
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "isInVRExclusivePointerMode", {
            get: function() {
                return this._vrExclusivePointerMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "supportsUniformBuffers", {
            get: function() {
                return this.webGLVersion > 1 && !this.disableUniformBuffers
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "needPOTTextures", {
            get: function() {
                return this._webGLVersion < 2 || this.forcePOTTextures
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "badOS", {
            get: function() {
                return this._badOS
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "badDesktopOS", {
            get: function() {
                return this._badDesktopOS
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "performanceMonitor", {
            get: function() {
                return this._performanceMonitor
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "texturesSupported", {
            get: function() {
                return this._texturesSupported
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "textureFormatInUse", {
            get: function() {
                return this._textureFormatInUse
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "currentViewport", {
            get: function() {
                return this._cachedViewport
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "emptyTexture", {
            get: function() {
                return this._emptyTexture || (this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, n.TEXTUREFORMAT_RGBA, !1, !1, e.Texture.NEAREST_SAMPLINGMODE)), this._emptyTexture
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "emptyTexture3D", {
            get: function() {
                return this._emptyTexture3D || (this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, n.TEXTUREFORMAT_RGBA, !1, !1, e.Texture.NEAREST_SAMPLINGMODE)), this._emptyTexture3D
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "emptyCubeTexture", {
            get: function() {
                if (!this._emptyCubeTexture) {
                    var t = new Uint8Array(4),
                        i = [t, t, t, t, t, t];
                    this._emptyCubeTexture = this.createRawCubeTexture(i, 1, n.TEXTUREFORMAT_RGBA, n.TEXTURETYPE_UNSIGNED_INT, !1, !1, e.Texture.NEAREST_SAMPLINGMODE)
                }
                return this._emptyCubeTexture
            },
            enumerable: !0,
            configurable: !0
        }), n.prototype._rebuildInternalTextures = function() {
            for (var e = this._internalTexturesCache.slice(), t = 0, i = e; t < i.length; t++) {
                i[t]._rebuild()
            }
        }, n.prototype._rebuildEffects = function() {
            for (var t in this._compiledEffects) {
                this._compiledEffects[t]._prepareEffect()
            }
            e.Effect.ResetCache()
        }, n.prototype._rebuildBuffers = function() {
            for (var e = 0, t = this.scenes; e < t.length; e++) {
                var i = t[e];
                i.resetCachedMaterial(), i._rebuildGeometries(), i._rebuildTextures()
            }
            for (var r = 0, n = this._uniformBuffers; r < n.length; r++) {
                n[r]._rebuild()
            }
        }, n.prototype._initGLContext = function() {
            this._caps = new h, this._caps.maxTexturesImageUnits = this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS), this._caps.maxCombinedTexturesImageUnits = this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), this._caps.maxVertexTextureImageUnits = this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), this._caps.maxTextureSize = this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE), this._caps.maxCubemapTextureSize = this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE), this._caps.maxRenderTextureSize = this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE), this._caps.maxVertexAttribs = this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS), this._caps.maxVaryingVectors = this._gl.getParameter(this._gl.MAX_VARYING_VECTORS), this._caps.maxFragmentUniformVectors = this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS), this._caps.maxVertexUniformVectors = this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS), this._glVersion = this._gl.getParameter(this._gl.VERSION);
            var e = this._gl.getExtension("WEBGL_debug_renderer_info");
            if (null != e && (this._glRenderer = this._gl.getParameter(e.UNMASKED_RENDERER_WEBGL), this._glVendor = this._gl.getParameter(e.UNMASKED_VENDOR_WEBGL)), this._glVendor || (this._glVendor = "Unknown vendor"), this._glRenderer || (this._glRenderer = "Unknown renderer"), this._gl.HALF_FLOAT_OES = 36193, 34842 !== this._gl.RGBA16F && (this._gl.RGBA16F = 34842), 34836 !== this._gl.RGBA32F && (this._gl.RGBA32F = 34836), 35056 !== this._gl.DEPTH24_STENCIL8 && (this._gl.DEPTH24_STENCIL8 = 35056), this._caps.standardDerivatives = this._webGLVersion > 1 || null !== this._gl.getExtension("OES_standard_derivatives"), this._caps.astc = this._gl.getExtension("WEBGL_compressed_texture_astc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_astc"), this._caps.s3tc = this._gl.getExtension("WEBGL_compressed_texture_s3tc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"), this._caps.pvrtc = this._gl.getExtension("WEBGL_compressed_texture_pvrtc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), this._caps.etc1 = this._gl.getExtension("WEBGL_compressed_texture_etc1") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_etc1"), this._caps.etc2 = this._gl.getExtension("WEBGL_compressed_texture_etc") || this._gl.getExtension("WEBKIT_WEBGL_compressed_texture_etc") || this._gl.getExtension("WEBGL_compressed_texture_es3_0"), this._caps.textureAnisotropicFilterExtension = this._gl.getExtension("EXT_texture_filter_anisotropic") || this._gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || this._gl.getExtension("MOZ_EXT_texture_filter_anisotropic"), this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0, this._caps.uintIndices = this._webGLVersion > 1 || null !== this._gl.getExtension("OES_element_index_uint"), this._caps.fragmentDepthSupported = this._webGLVersion > 1 || null !== this._gl.getExtension("EXT_frag_depth"), this._caps.highPrecisionShaderSupported = !0, this._caps.timerQuery = this._gl.getExtension("EXT_disjoint_timer_query_webgl2") || this._gl.getExtension("EXT_disjoint_timer_query"), this._caps.timerQuery && (1 === this._webGLVersion && (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), this._caps.colorBufferFloat = this._webGLVersion > 1 && this._gl.getExtension("EXT_color_buffer_float"), this._caps.textureFloat = this._webGLVersion > 1 || this._gl.getExtension("OES_texture_float"), this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension("OES_texture_float_linear"), this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer(), this._caps.textureHalfFloat = this._webGLVersion > 1 || this._gl.getExtension("OES_texture_half_float"), this._caps.textureHalfFloatLinearFiltering = this._webGLVersion > 1 || this._caps.textureHalfFloat && this._gl.getExtension("OES_texture_half_float_linear"), this._webGLVersion > 1 && (this._gl.HALF_FLOAT_OES = 5131), this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer(), this._caps.textureLOD = this._webGLVersion > 1 || this._gl.getExtension("EXT_shader_texture_lod"), this._webGLVersion > 1) this._caps.drawBuffersExtension = !0;
            else {
                var t = this._gl.getExtension("WEBGL_draw_buffers");
                if (null !== t) {
                    this._caps.drawBuffersExtension = !0, this._gl.drawBuffers = t.drawBuffersWEBGL.bind(t), this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER;
                    for (var i = 0; i < 16; i++) this._gl["COLOR_ATTACHMENT" + i + "_WEBGL"] = t["COLOR_ATTACHMENT" + i + "_WEBGL"]
                } else this._caps.drawBuffersExtension = !1
            }
            if (this._webGLVersion > 1) this._caps.depthTextureExtension = !0;
            else {
                var r = this._gl.getExtension("WEBGL_depth_texture");
                null != r && (this._caps.depthTextureExtension = !0, this._gl.UNSIGNED_INT_24_8 = r.UNSIGNED_INT_24_8_WEBGL)
            }
            if (this._webGLVersion > 1) this._caps.vertexArrayObject = !0;
            else {
                var n = this._gl.getExtension("OES_vertex_array_object");
                null != n ? (this._caps.vertexArrayObject = !0, this._gl.createVertexArray = n.createVertexArrayOES.bind(n), this._gl.bindVertexArray = n.bindVertexArrayOES.bind(n), this._gl.deleteVertexArray = n.deleteVertexArrayOES.bind(n)) : this._caps.vertexArrayObject = !1
            }
            if (this._webGLVersion > 1) this._caps.instancedArrays = !0;
            else {
                var o = this._gl.getExtension("ANGLE_instanced_arrays");
                null != o ? (this._caps.instancedArrays = !0, this._gl.drawArraysInstanced = o.drawArraysInstancedANGLE.bind(o), this._gl.drawElementsInstanced = o.drawElementsInstancedANGLE.bind(o), this._gl.vertexAttribDivisor = o.vertexAttribDivisorANGLE.bind(o)) : this._caps.instancedArrays = !1
            }
            if (this._caps.astc && this.texturesSupported.push("-astc.ktx"), this._caps.s3tc && this.texturesSupported.push("-dxt.ktx"), this._caps.pvrtc && this.texturesSupported.push("-pvrtc.ktx"), this._caps.etc2 && this.texturesSupported.push("-etc2.ktx"), this._caps.etc1 && this.texturesSupported.push("-etc1.ktx"), this._gl.getShaderPrecisionFormat) {
                var s = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);
                s && (this._caps.highPrecisionShaderSupported = 0 !== s.precision)
            }
            this.setDepthBuffer(!0), this.setDepthFunctionToLessOrEqual(), this.setDepthWrite(!0), this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;
            for (var a = 0; a < this._maxSimultaneousTextures; a++) this._nextFreeTextureSlots.push(a)
        }, Object.defineProperty(n.prototype, "webGLVersion", {
            get: function() {
                return this._webGLVersion
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "isStencilEnable", {
            get: function() {
                return this._isStencilEnable
            },
            enumerable: !0,
            configurable: !0
        }), n.prototype._prepareWorkingCanvas = function() {
            if (!this._workingCanvas) {
                this._workingCanvas = document.createElement("canvas");
                var e = this._workingCanvas.getContext("2d");
                e && (this._workingContext = e)
            }
        }, n.prototype.resetTextureCache = function() {
            for (var e in this._boundTexturesCache) {
                var t = this._boundTexturesCache[e];
                t && this._removeDesignatedSlot(t), this._boundTexturesCache[e] = null
            }
            if (!this.disableTextureBindingOptimization) {
                this._nextFreeTextureSlots = [];
                for (var i = 0; i < this._maxSimultaneousTextures; i++) this._nextFreeTextureSlots.push(i)
            }
            this._currentTextureChannel = -1
        }, n.prototype.isDeterministicLockStep = function() {
            return this._deterministicLockstep
        }, n.prototype.getLockstepMaxSteps = function() {
            return this._lockstepMaxSteps
        }, n.prototype.getGlInfo = function() {
            return {
                vendor: this._glVendor,
                renderer: this._glRenderer,
                version: this._glVersion
            }
        }, n.prototype.getAspectRatio = function(e, t) {
            void 0 === t && (t = !1);
            var i = e.viewport;
            return this.getRenderWidth(t) * i.width / (this.getRenderHeight(t) * i.height)
        }, n.prototype.getRenderWidth = function(e) {
            return void 0 === e && (e = !1), !e && this._currentRenderTarget ? this._currentRenderTarget.width : this._gl.drawingBufferWidth
        }, n.prototype.getRenderHeight = function(e) {
            return void 0 === e && (e = !1), !e && this._currentRenderTarget ? this._currentRenderTarget.height : this._gl.drawingBufferHeight
        }, n.prototype.getRenderingCanvas = function() {
            return this._renderingCanvas
        }, n.prototype.getRenderingCanvasClientRect = function() {
            return this._renderingCanvas ? this._renderingCanvas.getBoundingClientRect() : null
        }, n.prototype.setHardwareScalingLevel = function(e) {
            this._hardwareScalingLevel = e, this.resize()
        }, n.prototype.getHardwareScalingLevel = function() {
            return this._hardwareScalingLevel
        }, n.prototype.getLoadedTexturesCache = function() {
            return this._internalTexturesCache
        }, n.prototype.getCaps = function() {
            return this._caps
        }, Object.defineProperty(n.prototype, "drawCalls", {
            get: function() {
                return e.Tools.Warn("drawCalls is deprecated. Please use SceneInstrumentation class"), 0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "drawCallsPerfCounter", {
            get: function() {
                return e.Tools.Warn("drawCallsPerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), n.prototype.getDepthFunction = function() {
            return this._depthCullingState.depthFunc
        }, n.prototype.setDepthFunction = function(e) {
            this._depthCullingState.depthFunc = e
        }, n.prototype.setDepthFunctionToGreater = function() {
            this._depthCullingState.depthFunc = this._gl.GREATER
        }, n.prototype.setDepthFunctionToGreaterOrEqual = function() {
            this._depthCullingState.depthFunc = this._gl.GEQUAL
        }, n.prototype.setDepthFunctionToLess = function() {
            this._depthCullingState.depthFunc = this._gl.LESS
        }, n.prototype.setDepthFunctionToLessOrEqual = function() {
            this._depthCullingState.depthFunc = this._gl.LEQUAL
        }, n.prototype.getStencilBuffer = function() {
            return this._stencilState.stencilTest
        }, n.prototype.setStencilBuffer = function(e) {
            this._stencilState.stencilTest = e
        }, n.prototype.getStencilMask = function() {
            return this._stencilState.stencilMask
        }, n.prototype.setStencilMask = function(e) {
            this._stencilState.stencilMask = e
        }, n.prototype.getStencilFunction = function() {
            return this._stencilState.stencilFunc
        }, n.prototype.getStencilFunctionReference = function() {
            return this._stencilState.stencilFuncRef
        }, n.prototype.getStencilFunctionMask = function() {
            return this._stencilState.stencilFuncMask
        }, n.prototype.setStencilFunction = function(e) {
            this._stencilState.stencilFunc = e
        }, n.prototype.setStencilFunctionReference = function(e) {
            this._stencilState.stencilFuncRef = e
        }, n.prototype.setStencilFunctionMask = function(e) {
            this._stencilState.stencilFuncMask = e
        }, n.prototype.getStencilOperationFail = function() {
            return this._stencilState.stencilOpStencilFail
        }, n.prototype.getStencilOperationDepthFail = function() {
            return this._stencilState.stencilOpDepthFail
        }, n.prototype.getStencilOperationPass = function() {
            return this._stencilState.stencilOpStencilDepthPass
        }, n.prototype.setStencilOperationFail = function(e) {
            this._stencilState.stencilOpStencilFail = e
        }, n.prototype.setStencilOperationDepthFail = function(e) {
            this._stencilState.stencilOpDepthFail = e
        }, n.prototype.setStencilOperationPass = function(e) {
            this._stencilState.stencilOpStencilDepthPass = e
        }, n.prototype.setDitheringState = function(e) {
            e ? this._gl.enable(this._gl.DITHER) : this._gl.disable(this._gl.DITHER)
        }, n.prototype.setRasterizerState = function(e) {
            e ? this._gl.disable(this._gl.RASTERIZER_DISCARD) : this._gl.enable(this._gl.RASTERIZER_DISCARD)
        }, n.prototype.stopRenderLoop = function(e) {
            if (!e) return void(this._activeRenderLoops = []);
            var t = this._activeRenderLoops.indexOf(e);
            t >= 0 && this._activeRenderLoops.splice(t, 1)
        }, n.prototype._renderLoop = function() {
            if (!this._contextWasLost) {
                var t = !0;
                if (!this.renderEvenInBackground && this._windowIsBackground && (t = !1), t) {
                    this.beginFrame();
                    for (var i = 0; i < this._activeRenderLoops.length; i++) {
                        (0, this._activeRenderLoops[i])()
                    }
                    this.endFrame()
                }
            }
            if (this._activeRenderLoops.length > 0) {
                var r = null;
                this._vrDisplay && this._vrDisplay.isPresenting && (r = this._vrDisplay), this._frameHandler = e.Tools.QueueNewFrame(this._bindedRenderFunction, r)
            } else this._renderingQueueLaunched = !1
        }, n.prototype.runRenderLoop = function(t) {
            -1 === this._activeRenderLoops.indexOf(t) && (this._activeRenderLoops.push(t), this._renderingQueueLaunched || (this._renderingQueueLaunched = !0, this._bindedRenderFunction = this._renderLoop.bind(this), this._frameHandler = e.Tools.QueueNewFrame(this._bindedRenderFunction)))
        }, n.prototype.switchFullscreen = function(t) {
            this.isFullscreen ? e.Tools.ExitFullscreen() : (this._pointerLockRequested = t, this._renderingCanvas && e.Tools.RequestFullscreen(this._renderingCanvas))
        }, n.prototype.clear = function(e, t, i, r) {
            void 0 === r && (r = !1), this.applyStates();
            var n = 0;
            t && e && (this._gl.clearColor(e.r, e.g, e.b, void 0 !== e.a ? e.a : 1), n |= this._gl.COLOR_BUFFER_BIT), i && (this._gl.clearDepth(1), n |= this._gl.DEPTH_BUFFER_BIT), r && (this._gl.clearStencil(0), n |= this._gl.STENCIL_BUFFER_BIT), this._gl.clear(n)
        }, n.prototype.scissorClear = function(e, t, i, r, n) {
            var o = this._gl,
                s = o.getParameter(o.SCISSOR_TEST),
                a = o.getParameter(o.SCISSOR_BOX);
            o.enable(o.SCISSOR_TEST), o.scissor(e, t, i, r), this.clear(n, !0, !0, !0), o.scissor(a[0], a[1], a[2], a[3]), !0 === s ? o.enable(o.SCISSOR_TEST) : o.disable(o.SCISSOR_TEST)
        }, n.prototype.setViewport = function(e, t, i) {
            var r = t || this.getRenderWidth(),
                n = i || this.getRenderHeight(),
                o = e.x || 0,
                s = e.y || 0;
            this._cachedViewport = e, this._gl.viewport(o * r, s * n, r * e.width, n * e.height)
        }, n.prototype.setDirectViewport = function(e, t, i, r) {
            var n = this._cachedViewport;
            return this._cachedViewport = null, this._gl.viewport(e, t, i, r), n
        }, n.prototype.beginFrame = function() {
            this.onBeginFrameObservable.notifyObservers(this), this._measureFps()
        }, n.prototype.endFrame = function() {
            this._badOS && this.flushFramebuffer(), this._vrDisplay && this._vrDisplay.isPresenting && this._vrDisplay.submitFrame(), this.onEndFrameObservable.notifyObservers(this)
        }, n.prototype.resize = function() {
            if (!this._vrDisplay || !this._vrDisplay.isPresenting) {
                var e = this._renderingCanvas ? this._renderingCanvas.clientWidth : window.innerWidth,
                    t = this._renderingCanvas ? this._renderingCanvas.clientHeight : window.innerHeight;
                this.setSize(e / this._hardwareScalingLevel, t / this._hardwareScalingLevel)
            }
        }, n.prototype.setSize = function(e, t) {
            if (this._renderingCanvas && (this._renderingCanvas.width !== e || this._renderingCanvas.height !== t)) {
                this._renderingCanvas.width = e, this._renderingCanvas.height = t;
                for (var i = 0; i < this.scenes.length; i++)
                    for (var r = this.scenes[i], n = 0; n < r.cameras.length; n++) {
                        var o = r.cameras[n];
                        o._currentRenderId = 0
                    }
                this.onResizeObservable.hasObservers && this.onResizeObservable.notifyObservers(this)
            }
        }, n.prototype.isVRDevicePresent = function() {
            return !!this._vrDisplay
        }, n.prototype.getVRDevice = function() {
            return this._vrDisplay
        }, n.prototype.initWebVR = function() {
            return this.initWebVRAsync(), this.onVRDisplayChangedObservable
        }, n.prototype.initWebVRAsync = function() {
            var t = this,
                i = function() {
                    var e = {
                        vrDisplay: t._vrDisplay,
                        vrSupported: t._vrSupported
                    };
                    t.onVRDisplayChangedObservable.notifyObservers(e), t._webVRInitPromise = new Promise(function(t) {
                        t(e)
                    })
                };
            return this._onVrDisplayConnect || (this._onVrDisplayConnect = function(e) {
                t._vrDisplay = e.display, i()
            }, this._onVrDisplayDisconnect = function() {
                t._vrDisplay.cancelAnimationFrame(t._frameHandler), t._vrDisplay = void 0, t._frameHandler = e.Tools.QueueNewFrame(t._bindedRenderFunction), i()
            }, this._onVrDisplayPresentChange = function() {
                t._vrExclusivePointerMode = t._vrDisplay && t._vrDisplay.isPresenting
            }, window.addEventListener("vrdisplayconnect", this._onVrDisplayConnect), window.addEventListener("vrdisplaydisconnect", this._onVrDisplayDisconnect), window.addEventListener("vrdisplaypresentchange", this._onVrDisplayPresentChange)), this._webVRInitPromise = this._webVRInitPromise || this._getVRDisplaysAsync(), this._webVRInitPromise.then(i), this._webVRInitPromise
        }, n.prototype.enableVR = function() {
            var e = this;
            if (this._vrDisplay && !this._vrDisplay.isPresenting) {
                var t = function() {
                        e.onVRRequestPresentComplete.notifyObservers(!0), e._onVRFullScreenTriggered()
                    },
                    i = function() {
                        e.onVRRequestPresentComplete.notifyObservers(!1)
                    };
                this.onVRRequestPresentStart.notifyObservers(this), this._vrDisplay.requestPresent([{
                    source: this.getRenderingCanvas()
                }]).then(t).catch(i)
            }
        }, n.prototype.disableVR = function() {
            this._vrDisplay && this._vrDisplay.isPresenting && this._vrDisplay.exitPresent().then(this._onVRFullScreenTriggered).catch(this._onVRFullScreenTriggered)
        }, n.prototype._getVRDisplaysAsync = function() {
            var e = this;
            return new Promise(function(t, i) {
                navigator.getVRDisplays ? navigator.getVRDisplays().then((function(i) {
                    e._vrSupported = !0, e._vrDisplay = i[0], t({
                        vrDisplay: e._vrDisplay,
                        vrSupported: e._vrSupported
                    })
                })) : (e._vrDisplay = void 0, e._vrSupported = !1, t({
                    vrDisplay: e._vrDisplay,
                    vrSupported: e._vrSupported
                }))
            })
        }, n.prototype.bindFramebuffer = function(e, t, i, r, n, o) {
            this._currentRenderTarget && this.unBindFramebuffer(this._currentRenderTarget), this._currentRenderTarget = e, this.bindUnboundFramebuffer(e._MSAAFramebuffer ? e._MSAAFramebuffer : e._framebuffer);
            var s = this._gl;
            e.isCube && (void 0 === t && (t = 0), s.framebufferTexture2D(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0, s.TEXTURE_CUBE_MAP_POSITIVE_X + t, e._webGLTexture, 0), o && (o._generateStencilBuffer ? s.framebufferTexture2D(s.FRAMEBUFFER, s.DEPTH_STENCIL_ATTACHMENT, s.TEXTURE_CUBE_MAP_POSITIVE_X + t, o, 0) : s.framebufferTexture2D(s.FRAMEBUFFER, s.DEPTH_ATTACHMENT, s.TEXTURE_CUBE_MAP_POSITIVE_X + t, o, 0))), this._cachedViewport && !n ? this.setViewport(this._cachedViewport, i, r) : s.viewport(0, 0, i || e.width, r || e.height), this.wipeCaches()
        }, n.prototype.bindUnboundFramebuffer = function(e) {
            this._currentFramebuffer !== e && (this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, e), this._currentFramebuffer = e)
        }, n.prototype.unBindFramebuffer = function(e, t, i) {
            void 0 === t && (t = !1), this._currentRenderTarget = null;
            var r = this._gl;
            e._MSAAFramebuffer && (r.bindFramebuffer(r.READ_FRAMEBUFFER, e._MSAAFramebuffer), r.bindFramebuffer(r.DRAW_FRAMEBUFFER, e._framebuffer), r.blitFramebuffer(0, 0, e.width, e.height, 0, 0, e.width, e.height, r.COLOR_BUFFER_BIT, r.NEAREST)), !e.generateMipMaps || t || e.isCube || (this._bindTextureDirectly(r.TEXTURE_2D, e, !0), r.generateMipmap(r.TEXTURE_2D), this._bindTextureDirectly(r.TEXTURE_2D, null)), i && (e._MSAAFramebuffer && this.bindUnboundFramebuffer(e._framebuffer), i()), this.bindUnboundFramebuffer(null)
        }, n.prototype.unBindMultiColorAttachmentFramebuffer = function(e, t, i) {
            void 0 === t && (t = !1), this._currentRenderTarget = null;
            var r = this._gl;
            if (e[0]._MSAAFramebuffer) {
                r.bindFramebuffer(r.READ_FRAMEBUFFER, e[0]._MSAAFramebuffer), r.bindFramebuffer(r.DRAW_FRAMEBUFFER, e[0]._framebuffer);
                var n = e[0]._attachments;
                n || (n = new Array(e.length), e[0]._attachments = n);
                for (var o = 0; o < e.length; o++) {
                    for (var s = e[o], a = 0; a < n.length; a++) n[a] = r.NONE;
                    n[o] = r[this.webGLVersion > 1 ? "COLOR_ATTACHMENT" + o : "COLOR_ATTACHMENT" + o + "_WEBGL"], r.readBuffer(n[o]), r.drawBuffers(n), r.blitFramebuffer(0, 0, s.width, s.height, 0, 0, s.width, s.height, r.COLOR_BUFFER_BIT, r.NEAREST)
                }
                for (var o = 0; o < n.length; o++) n[o] = r[this.webGLVersion > 1 ? "COLOR_ATTACHMENT" + o : "COLOR_ATTACHMENT" + o + "_WEBGL"];
                r.drawBuffers(n)
            }
            for (var o = 0; o < e.length; o++) {
                var s = e[o];
                !s.generateMipMaps || t || s.isCube || (this._bindTextureDirectly(r.TEXTURE_2D, s), r.generateMipmap(r.TEXTURE_2D), this._bindTextureDirectly(r.TEXTURE_2D, null))
            }
            i && (e[0]._MSAAFramebuffer && this.bindUnboundFramebuffer(e[0]._framebuffer), i()), this.bindUnboundFramebuffer(null)
        }, n.prototype.generateMipMapsForCubemap = function(e) {
            if (e.generateMipMaps) {
                var t = this._gl;
                this._bindTextureDirectly(t.TEXTURE_CUBE_MAP, e, !0), t.generateMipmap(t.TEXTURE_CUBE_MAP), this._bindTextureDirectly(t.TEXTURE_CUBE_MAP, null)
            }
        }, n.prototype.flushFramebuffer = function() {
            this._gl.flush()
        }, n.prototype.restoreDefaultFramebuffer = function() {
            this._currentRenderTarget ? this.unBindFramebuffer(this._currentRenderTarget) : this.bindUnboundFramebuffer(null), this._cachedViewport && this.setViewport(this._cachedViewport), this.wipeCaches()
        }, n.prototype.createUniformBuffer = function(e) {
            var t = this._gl.createBuffer();
            if (!t) throw new Error("Unable to create uniform buffer");
            return this.bindUniformBuffer(t), e instanceof Float32Array ? this._gl.bufferData(this._gl.UNIFORM_BUFFER, e, this._gl.STATIC_DRAW) : this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(e), this._gl.STATIC_DRAW), this.bindUniformBuffer(null), t.references = 1, t
        }, n.prototype.createDynamicUniformBuffer = function(e) {
            var t = this._gl.createBuffer();
            if (!t) throw new Error("Unable to create dynamic uniform buffer");
            return this.bindUniformBuffer(t), e instanceof Float32Array ? this._gl.bufferData(this._gl.UNIFORM_BUFFER, e, this._gl.DYNAMIC_DRAW) : this._gl.bufferData(this._gl.UNIFORM_BUFFER, new Float32Array(e), this._gl.DYNAMIC_DRAW), this.bindUniformBuffer(null), t.references = 1, t
        }, n.prototype.updateUniformBuffer = function(e, t, i, r) {
            this.bindUniformBuffer(e), void 0 === i && (i = 0), void 0 === r ? t instanceof Float32Array ? this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, i, t) : this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, i, new Float32Array(t)) : t instanceof Float32Array ? this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, t.subarray(i, i + r)) : this._gl.bufferSubData(this._gl.UNIFORM_BUFFER, 0, new Float32Array(t).subarray(i, i + r)), this.bindUniformBuffer(null)
        }, n.prototype._resetVertexBufferBinding = function() {
            this.bindArrayBuffer(null), this._cachedVertexBuffers = null
        }, n.prototype.createVertexBuffer = function(e) {
            var t = this._gl.createBuffer();
            if (!t) throw new Error("Unable to create vertex buffer");
            return this.bindArrayBuffer(t), e instanceof Float32Array ? this._gl.bufferData(this._gl.ARRAY_BUFFER, e, this._gl.STATIC_DRAW) : this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(e), this._gl.STATIC_DRAW), this._resetVertexBufferBinding(), t.references = 1, t
        }, n.prototype.createDynamicVertexBuffer = function(e) {
            var t = this._gl.createBuffer();
            if (!t) throw new Error("Unable to create dynamic vertex buffer");
            return this.bindArrayBuffer(t), e instanceof Float32Array ? this._gl.bufferData(this._gl.ARRAY_BUFFER, e, this._gl.DYNAMIC_DRAW) : this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(e), this._gl.DYNAMIC_DRAW), this._resetVertexBufferBinding(), t.references = 1, t
        }, n.prototype.updateDynamicIndexBuffer = function(e, t, i) {
            void 0 === i && (i = 0), this._currentBoundBuffer[this._gl.ELEMENT_ARRAY_BUFFER] = null, this.bindIndexBuffer(e);
            var r;
            r = t instanceof Uint16Array || t instanceof Uint32Array ? t : e.is32Bits ? new Uint32Array(t) : new Uint16Array(t), this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, r, this._gl.DYNAMIC_DRAW), this._resetIndexBufferBinding()
        }, n.prototype.updateDynamicVertexBuffer = function(e, t, i, r) {
            this.bindArrayBuffer(e), void 0 === i && (i = 0), void 0 === r ? t instanceof Float32Array ? this._gl.bufferSubData(this._gl.ARRAY_BUFFER, i, t) : this._gl.bufferSubData(this._gl.ARRAY_BUFFER, i, new Float32Array(t)) : t instanceof Float32Array ? this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, t.subarray(i, i + r)) : this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, new Float32Array(t).subarray(i, i + r)), this._resetVertexBufferBinding()
        }, n.prototype._resetIndexBufferBinding = function() {
            this.bindIndexBuffer(null), this._cachedIndexBuffer = null
        }, n.prototype.createIndexBuffer = function(e, t) {
            var i = this._gl.createBuffer();
            if (!i) throw new Error("Unable to create index buffer");
            this.bindIndexBuffer(i);
            var r, n = !1;
            if (e instanceof Uint16Array) r = e;
            else if (this._caps.uintIndices)
                if (e instanceof Uint32Array) r = e, n = !0;
                else {
                    for (var o = 0; o < e.length; o++)
                        if (e[o] > 65535) {
                            n = !0;
                            break
                        }
                    r = n ? new Uint32Array(e) : new Uint16Array(e)
                }
            else r = new Uint16Array(e);
            return this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, r, t ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW), this._resetIndexBufferBinding(), i.references = 1, i.is32Bits = n, i
        }, n.prototype.bindArrayBuffer = function(e) {
            this._vaoRecordInProgress || this._unbindVertexArrayObject(), this.bindBuffer(e, this._gl.ARRAY_BUFFER)
        }, n.prototype.bindUniformBuffer = function(e) {
            this._gl.bindBuffer(this._gl.UNIFORM_BUFFER, e)
        }, n.prototype.bindUniformBufferBase = function(e, t) {
            this._gl.bindBufferBase(this._gl.UNIFORM_BUFFER, t, e)
        }, n.prototype.bindUniformBlock = function(e, t, i) {
            var r = this._gl.getUniformBlockIndex(e, t);
            this._gl.uniformBlockBinding(e, r, i)
        }, n.prototype.bindIndexBuffer = function(e) {
            this._vaoRecordInProgress || this._unbindVertexArrayObject(), this.bindBuffer(e, this._gl.ELEMENT_ARRAY_BUFFER)
        }, n.prototype.bindBuffer = function(e, t) {
            (this._vaoRecordInProgress || this._currentBoundBuffer[t] !== e) && (this._gl.bindBuffer(t, e), this._currentBoundBuffer[t] = e)
        }, n.prototype.updateArrayBuffer = function(e) {
            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, e)
        }, n.prototype.vertexAttribPointer = function(e, t, i, r, n, o, s) {
            var a = this._currentBufferPointers[t],
                l = !1;
            a.active ? (a.buffer !== e && (a.buffer = e, l = !0), a.size !== i && (a.size = i, l = !0), a.type !== r && (a.type = r, l = !0), a.normalized !== n && (a.normalized = n, l = !0), a.stride !== o && (a.stride = o, l = !0), a.offset !== s && (a.offset = s, l = !0)) : (l = !0, a.active = !0, a.index = t, a.size = i, a.type = r, a.normalized = n, a.stride = o, a.offset = s, a.buffer = e), (l || this._vaoRecordInProgress) && (this.bindArrayBuffer(e), this._gl.vertexAttribPointer(t, i, r, n, o, s))
        }, n.prototype._bindIndexBufferWithCache = function(e) {
            null != e && this._cachedIndexBuffer !== e && (this._cachedIndexBuffer = e, this.bindIndexBuffer(e), this._uintIndicesCurrentlySet = e.is32Bits)
        }, n.prototype._bindVertexBuffersAttributes = function(e, t) {
            var i = t.getAttributesNames();
            this._vaoRecordInProgress || this._unbindVertexArrayObject(), this.unbindAllAttributes();
            for (var r = 0; r < i.length; r++) {
                var n = t.getAttributeLocation(r);
                if (n >= 0) {
                    var o = e[i[r]];
                    if (!o) continue;
                    this._gl.enableVertexAttribArray(n), this._vaoRecordInProgress || (this._vertexAttribArraysEnabled[n] = !0);
                    var s = o.getBuffer();
                    s && (this.vertexAttribPointer(s, n, o.getSize(), this._gl.FLOAT, !1, 4 * o.getStrideSize(), 4 * o.getOffset()), o.getIsInstanced() && (this._gl.vertexAttribDivisor(n, o.getInstanceDivisor()), this._vaoRecordInProgress || (this._currentInstanceLocations.push(n), this._currentInstanceBuffers.push(s))))
                }
            }
        }, n.prototype.recordVertexArrayObject = function(e, t, i) {
            var r = this._gl.createVertexArray();
            return this._vaoRecordInProgress = !0, this._gl.bindVertexArray(r), this._mustWipeVertexAttributes = !0, this._bindVertexBuffersAttributes(e, i), this.bindIndexBuffer(t), this._vaoRecordInProgress = !1, this._gl.bindVertexArray(null), r
        }, n.prototype.bindVertexArrayObject = function(e, t) {
            this._cachedVertexArrayObject !== e && (this._cachedVertexArrayObject = e, this._gl.bindVertexArray(e), this._cachedVertexBuffers = null, this._cachedIndexBuffer = null, this._uintIndicesCurrentlySet = null != t && t.is32Bits, this._mustWipeVertexAttributes = !0)
        }, n.prototype.bindBuffersDirectly = function(e, t, i, r, n) {
            if (this._cachedVertexBuffers !== e || this._cachedEffectForVertexBuffers !== n) {
                this._cachedVertexBuffers = e, this._cachedEffectForVertexBuffers = n;
                var o = n.getAttributesCount();
                this._unbindVertexArrayObject(), this.unbindAllAttributes();
                for (var s = 0, a = 0; a < o; a++)
                    if (a < i.length) {
                        var l = n.getAttributeLocation(a);
                        l >= 0 && (this._gl.enableVertexAttribArray(l), this._vertexAttribArraysEnabled[l] = !0, this.vertexAttribPointer(e, l, i[a], this._gl.FLOAT, !1, r, s)), s += 4 * i[a]
                    }
            }
            this._bindIndexBufferWithCache(t)
        }, n.prototype._unbindVertexArrayObject = function() {
            this._cachedVertexArrayObject && (this._cachedVertexArrayObject = null, this._gl.bindVertexArray(null))
        }, n.prototype.bindBuffers = function(e, t, i) {
            this._cachedVertexBuffers === e && this._cachedEffectForVertexBuffers === i || (this._cachedVertexBuffers = e, this._cachedEffectForVertexBuffers = i, this._bindVertexBuffersAttributes(e, i)), this._bindIndexBufferWithCache(t)
        }, n.prototype.unbindInstanceAttributes = function() {
            for (var e, t = 0, i = this._currentInstanceLocations.length; t < i; t++) {
                var r = this._currentInstanceBuffers[t];
                e != r && r.references && (e = r, this.bindArrayBuffer(r));
                var n = this._currentInstanceLocations[t];
                this._gl.vertexAttribDivisor(n, 0)
            }
            this._currentInstanceBuffers.length = 0, this._currentInstanceLocations.length = 0
        }, n.prototype.releaseVertexArrayObject = function(e) {
            this._gl.deleteVertexArray(e)
        }, n.prototype._releaseBuffer = function(e) {
            return 0 === --e.references && (this._gl.deleteBuffer(e), !0)
        }, n.prototype.createInstancesBuffer = function(e) {
            var t = this._gl.createBuffer();
            if (!t) throw new Error("Unable to create instance buffer");
            return t.capacity = e, this.bindArrayBuffer(t), this._gl.bufferData(this._gl.ARRAY_BUFFER, e, this._gl.DYNAMIC_DRAW), t
        }, n.prototype.deleteInstancesBuffer = function(e) {
            this._gl.deleteBuffer(e)
        }, n.prototype.updateAndBindInstancesBuffer = function(e, t, i) {
            if (this.bindArrayBuffer(e), t && this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, t), void 0 !== i[0].index) {
                for (var r = 0, n = 0; n < i.length; n++) {
                    var o = i[n];
                    r += 4 * o.attributeSize
                }
                for (var n = 0; n < i.length; n++) {
                    var o = i[n];
                    this._vertexAttribArraysEnabled[o.index] || (this._gl.enableVertexAttribArray(o.index), this._vertexAttribArraysEnabled[o.index] = !0), this.vertexAttribPointer(e, o.index, o.attributeSize, o.attribyteType || this._gl.FLOAT, o.normalized || !1, r, o.offset), this._gl.vertexAttribDivisor(o.index, 1), this._currentInstanceLocations.push(o.index), this._currentInstanceBuffers.push(e)
                }
            } else
                for (var s = 0; s < 4; s++) {
                    var a = i[s];
                    this._vertexAttribArraysEnabled[a] || (this._gl.enableVertexAttribArray(a), this._vertexAttribArraysEnabled[a] = !0), this.vertexAttribPointer(e, a, 4, this._gl.FLOAT, !1, 64, 16 * s), this._gl.vertexAttribDivisor(a, 1), this._currentInstanceLocations.push(a), this._currentInstanceBuffers.push(e)
                }
        }, n.prototype.applyStates = function() {
            this._depthCullingState.apply(this._gl), this._stencilState.apply(this._gl), this._alphaState.apply(this._gl)
        }, n.prototype.draw = function(t, i, r, n) {
            this.drawElementsType(t ? e.Material.TriangleFillMode : e.Material.WireFrameFillMode, i, r, n)
        }, n.prototype.drawPointClouds = function(t, i, r) {
            this.drawArraysType(e.Material.PointFillMode, t, i, r)
        }, n.prototype.drawUnIndexed = function(t, i, r, n) {
            this.drawArraysType(t ? e.Material.TriangleFillMode : e.Material.WireFrameFillMode, i, r, n)
        }, n.prototype.drawElementsType = function(e, t, i, r) {
            this.applyStates(), this._drawCalls.addCount(1, !1);
            var n = this.DrawMode(e),
                o = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT,
                s = this._uintIndicesCurrentlySet ? 4 : 2;
            r ? this._gl.drawElementsInstanced(n, i, o, t * s, r) : this._gl.drawElements(n, i, o, t * s)
        }, n.prototype.drawArraysType = function(e, t, i, r) {
            this.applyStates(), this._drawCalls.addCount(1, !1);
            var n = this.DrawMode(e);
            r ? this._gl.drawArraysInstanced(n, t, i, r) : this._gl.drawArrays(n, t, i)
        }, n.prototype.DrawMode = function(t) {
            switch (t) {
                case e.Material.TriangleFillMode:
                    return this._gl.TRIANGLES;
                case e.Material.PointFillMode:
                    return this._gl.POINTS;
                case e.Material.WireFrameFillMode:
                    return this._gl.LINES;
                case e.Material.PointListDrawMode:
                    return this._gl.POINTS;
                case e.Material.LineListDrawMode:
                    return this._gl.LINES;
                case e.Material.LineLoopDrawMode:
                    return this._gl.LINE_LOOP;
                case e.Material.LineStripDrawMode:
                    return this._gl.LINE_STRIP;
                case e.Material.TriangleStripDrawMode:
                    return this._gl.TRIANGLE_STRIP;
                case e.Material.TriangleFanDrawMode:
                    return this._gl.TRIANGLE_FAN;
                default:
                    return this._gl.TRIANGLES
            }
        }, n.prototype._releaseEffect = function(e) {
            this._compiledEffects[e._key] && (delete this._compiledEffects[e._key], this._deleteProgram(e.getProgram()))
        }, n.prototype._deleteProgram = function(e) {
            e && (e.__SPECTOR_rebuildProgram = null, e.transformFeedback && (this.deleteTransformFeedback(e.transformFeedback), e.transformFeedback = null), this._gl.deleteProgram(e))
        }, n.prototype.createEffect = function(t, i, r, n, o, s, a, l, c) {
            var h = t.vertexElement || t.vertex || t,
                u = t.fragmentElement || t.fragment || t,
                f = h + "+" + u + "@" + (o || i.defines);
            if (this._compiledEffects[f]) {
                var d = this._compiledEffects[f];
                return a && d.isReady() && a(d), d
            }
            var p = new e.Effect(t, i, r, n, this, o, s, a, l, c);
            return p._key = f, this._compiledEffects[f] = p, p
        }, n.prototype.createEffectForParticles = function(e, t, i, r, n, o, s) {
            return void 0 === t && (t = []), void 0 === i && (i = []), void 0 === r && (r = ""), this.createEffect({
                vertex: "particles",
                fragmentElement: e
            }, ["position", "color", "options"], ["view", "projection"].concat(t), ["diffuseSampler"].concat(i), r, n, o, s)
        }, n.prototype.createRawShaderProgram = function(e, t, r, n) {
            void 0 === n && (n = null), r = r || this._gl;
            var o = i(r, e, "vertex"),
                s = i(r, t, "fragment");
            return this._createShaderProgram(o, s, r, n)
        }, n.prototype.createShaderProgram = function(e, i, r, n, o) {
            void 0 === o && (o = null), n = n || this._gl, this.onBeforeShaderCompilationObservable.notifyObservers(this);
            var s = this._webGLVersion > 1 ? "#version 300 es\n" : "",
                a = t(n, e, "vertex", r, s),
                l = t(n, i, "fragment", r, s),
                c = this._createShaderProgram(a, l, n, o);
            return this.onAfterShaderCompilationObservable.notifyObservers(this), c
        }, n.prototype._createShaderProgram = function(e, t, i, r) {
            void 0 === r && (r = null);
            var n = i.createProgram();
            if (!n) throw new Error("Unable to create program");
            if (i.attachShader(n, e), i.attachShader(n, t), this.webGLVersion > 1 && r) {
                var o = this.createTransformFeedback();
                this.bindTransformFeedback(o), this.setTranformFeedbackVaryings(n, r), n.transformFeedback = o
            }
            if (i.linkProgram(n), this.webGLVersion > 1 && r && this.bindTransformFeedback(null), !i.getProgramParameter(n, i.LINK_STATUS)) {
                i.validateProgram(n);
                var s = i.getProgramInfoLog(n);
                if (s) throw new Error(s)
            }
            return i.deleteShader(e), i.deleteShader(t), n
        }, n.prototype.getUniforms = function(e, t) {
            for (var i = new Array, r = 0; r < t.length; r++) i.push(this._gl.getUniformLocation(e, t[r]));
            return i
        }, n.prototype.getAttributes = function(e, t) {
            for (var i = [], r = 0; r < t.length; r++) try {
                i.push(this._gl.getAttribLocation(e, t[r]))
            } catch (e) {
                i.push(-1)
            }
            return i
        }, n.prototype.enableEffect = function(e) {
            e && (this.bindSamplers(e), this._currentEffect = e, e.onBind && e.onBind(e), e.onBindObservable.notifyObservers(e))
        }, n.prototype.setIntArray = function(e, t) {
            e && this._gl.uniform1iv(e, t)
        }, n.prototype.setIntArray2 = function(e, t) {
            e && t.length % 2 == 0 && this._gl.uniform2iv(e, t)
        }, n.prototype.setIntArray3 = function(e, t) {
            e && t.length % 3 == 0 && this._gl.uniform3iv(e, t)
        }, n.prototype.setIntArray4 = function(e, t) {
            e && t.length % 4 == 0 && this._gl.uniform4iv(e, t)
        }, n.prototype.setFloatArray = function(e, t) {
            e && this._gl.uniform1fv(e, t)
        }, n.prototype.setFloatArray2 = function(e, t) {
            e && t.length % 2 == 0 && this._gl.uniform2fv(e, t)
        }, n.prototype.setFloatArray3 = function(e, t) {
            e && t.length % 3 == 0 && this._gl.uniform3fv(e, t)
        }, n.prototype.setFloatArray4 = function(e, t) {
            e && t.length % 4 == 0 && this._gl.uniform4fv(e, t)
        }, n.prototype.setArray = function(e, t) {
            e && this._gl.uniform1fv(e, t)
        }, n.prototype.setArray2 = function(e, t) {
            e && t.length % 2 == 0 && this._gl.uniform2fv(e, t)
        }, n.prototype.setArray3 = function(e, t) {
            e && t.length % 3 == 0 && this._gl.uniform3fv(e, t)
        }, n.prototype.setArray4 = function(e, t) {
            e && t.length % 4 == 0 && this._gl.uniform4fv(e, t)
        }, n.prototype.setMatrices = function(e, t) {
            e && this._gl.uniformMatrix4fv(e, !1, t)
        }, n.prototype.setMatrix = function(e, t) {
            e && this._gl.uniformMatrix4fv(e, !1, t.toArray())
        }, n.prototype.setMatrix3x3 = function(e, t) {
            e && this._gl.uniformMatrix3fv(e, !1, t)
        }, n.prototype.setMatrix2x2 = function(e, t) {
            e && this._gl.uniformMatrix2fv(e, !1, t)
        }, n.prototype.setInt = function(e, t) {
            e && this._gl.uniform1i(e, t)
        }, n.prototype.setFloat = function(e, t) {
            e && this._gl.uniform1f(e, t)
        }, n.prototype.setFloat2 = function(e, t, i) {
            e && this._gl.uniform2f(e, t, i)
        }, n.prototype.setFloat3 = function(e, t, i, r) {
            e && this._gl.uniform3f(e, t, i, r)
        }, n.prototype.setBool = function(e, t) {
            e && this._gl.uniform1i(e, t)
        }, n.prototype.setFloat4 = function(e, t, i, r, n) {
            e && this._gl.uniform4f(e, t, i, r, n)
        }, n.prototype.setColor3 = function(e, t) {
            e && this._gl.uniform3f(e, t.r, t.g, t.b)
        }, n.prototype.setColor4 = function(e, t, i) {
            e && this._gl.uniform4f(e, t.r, t.g, t.b, i)
        }, n.prototype.setDirectColor4 = function(e, t) {
            e && this._gl.uniform4f(e, t.r, t.g, t.b, t.a)
        }, n.prototype.setState = function(e, t, i, r) {
            void 0 === t && (t = 0), void 0 === r && (r = !1), (this._depthCullingState.cull !== e || i) && (this._depthCullingState.cull = e);
            var n = this.cullBackFaces ? this._gl.BACK : this._gl.FRONT;
            (this._depthCullingState.cullFace !== n || i) && (this._depthCullingState.cullFace = n), this.setZOffset(t);
            var o = r ? this._gl.CW : this._gl.CCW;
            (this._depthCullingState.frontFace !== o || i) && (this._depthCullingState.frontFace = o)
        }, n.prototype.setZOffset = function(e) {
            this._depthCullingState.zOffset = e
        }, n.prototype.getZOffset = function() {
            return this._depthCullingState.zOffset
        }, n.prototype.setDepthBuffer = function(e) {
            this._depthCullingState.depthTest = e
        }, n.prototype.getDepthWrite = function() {
            return this._depthCullingState.depthMask
        }, n.prototype.setDepthWrite = function(e) {
            this._depthCullingState.depthMask = e
        }, n.prototype.setColorWrite = function(e) {
            this._gl.colorMask(e, e, e, e), this._colorWrite = e
        }, n.prototype.getColorWrite = function() {
            return this._colorWrite
        }, n.prototype.setAlphaConstants = function(e, t, i, r) {
            this._alphaState.setAlphaBlendConstants(e, t, i, r)
        }, n.prototype.setAlphaMode = function(e, t) {
            if (void 0 === t && (t = !1), this._alphaMode !== e) {
                switch (e) {
                    case n.ALPHA_DISABLE:
                        this._alphaState.alphaBlend = !1;
                        break;
                    case n.ALPHA_PREMULTIPLIED:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_PREMULTIPLIED_PORTERDUFF:
                        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;
                        break;
                    case n.ALPHA_COMBINE:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_ONEONE:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.ONE, this._gl.ONE, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_ADD:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE, this._gl.ZERO, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_SUBTRACT:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.ZERO, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_MULTIPLY:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.DST_COLOR, this._gl.ZERO, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_MAXIMIZED:
                        this._alphaState.setAlphaBlendFunctionParameters(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_COLOR, this._gl.ONE, this._gl.ONE), this._alphaState.alphaBlend = !0;
                        break;
                    case n.ALPHA_INTERPOLATE:
                        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;
                        break;
                    case n.ALPHA_SCREENMODE:
                        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
                }
                t || this.setDepthWrite(e === n.ALPHA_DISABLE), this._alphaMode = e
            }
        }, n.prototype.getAlphaMode = function() {
            return this._alphaMode
        }, n.prototype.wipeCaches = function(e) {
            this.preventCacheWipeBetweenFrames && !e || (this._currentEffect = null, e && (this.resetTextureCache(), this._currentProgram = null, this._stencilState.reset(), this._depthCullingState.reset(), this.setDepthFunctionToLessOrEqual(), this._alphaState.reset()), this._resetVertexBufferBinding(), this._cachedIndexBuffer = null, this._cachedEffectForVertexBuffers = null, this._unbindVertexArrayObject(), this.bindIndexBuffer(null))
        }, n.prototype.setTextureFormatToUse = function(e) {
            for (var t = 0, i = this.texturesSupported.length; t < i; t++)
                for (var r = 0, n = e.length; r < n; r++)
                    if (this._texturesSupported[t] === e[r].toLowerCase()) return this._textureFormatInUse = this._texturesSupported[t];
            return this._textureFormatInUse = null, null
        }, n.prototype._createTexture = function() {
            var e = this._gl.createTexture();
            if (!e) throw new Error("Unable to create texture");
            return e
        }, n.prototype.createTexture = function(t, i, r, n, o, s, a, l, c, h) {
            var u = this;
            void 0 === o && (o = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null), void 0 === c && (c = null), void 0 === h && (h = null);
            var f = String(t),
                d = "data:" === f.substr(0, 5),
                p = "blob:" === f.substr(0, 5),
                _ = d && -1 !== f.indexOf("base64"),
                m = c || new e.InternalTexture(this, e.InternalTexture.DATASOURCE_URL),
                g = f.lastIndexOf("."),
                v = g > 0 ? f.substring(g).toLowerCase() : "",
                y = this.getCaps().s3tc && 0 === v.indexOf(".dds"),
                b = 0 === v.indexOf(".tga"),
                x = !1;
            !this._textureFormatInUse || _ || c || (f = f.substring(0, g) + this._textureFormatInUse, x = !0), n && n._addPendingData(m), m.url = f, m.generateMipMaps = !i, m.samplingMode = o, m.invertY = r, this._doNotHandleContextLost || (m._buffer = l);
            var T = null;
            s && !c && (T = m.onLoadedObservable.add(s)), c || this._internalTexturesCache.push(m);
            var E = function(s, c) {
                    n && n._removePendingData(m), T && m.onLoadedObservable.remove(T), x ? u.createTexture(t, i, r, n, o, null, a, l, m) : e.Tools.UseFallbackTexture && u.createTexture(e.Tools.fallbackTexture, i, r, n, o, null, a, l, m), a && a(s || "Unknown error", c)
                },
                A = null;
            if (x || b || y) x ? A = function(t) {
                var s = new e.KhronosTextureContainer(t, 1);
                u._prepareWebGLTexture(m, n, s.pixelWidth, s.pixelHeight, r, !1, !0, (function() {
                    return s.uploadLevels(u._gl, !i), !1
                }), o)
            } : b ? A = function(t) {
                var s = new Uint8Array(t),
                    a = e.TGATools.GetTGAHeader(s);
                u._prepareWebGLTexture(m, n, a.width, a.height, r, i, !1, (function() {
                    return e.TGATools.UploadContent(u._gl, s), !1
                }), o)
            } : y && (A = function(t) {
                var s = e.DDSTools.GetDDSInfo(t),
                    a = (s.isRGB || s.isLuminance || s.mipmapCount > 1) && !i && s.width >> s.mipmapCount - 1 == 1;
                u._prepareWebGLTexture(m, n, s.width, s.height, r, !a, s.isFourCC, (function() {
                    return e.DDSTools.UploadDDSLevels(u, u._gl, t, s, a, 1), !1
                }), o)
            }), l ? A && A(l) : this._loadFile(f, (function(e) {
                A && A(e)
            }), void 0, n ? n.database : void 0, !0, (function(e, t) {
                E("Unable to load " + (e && e.responseURL, t))
            }));
            else {
                var P = function(t) {
                    p && !u._doNotHandleContextLost && (m._buffer = t), u._prepareWebGLTexture(m, n, t.width, t.height, r, i, !1, (function(i, r, o) {
                        var s = u._gl,
                            a = t.width === i && t.height === r,
                            l = h ? u._getInternalFormat(h) : ".jpg" === v ? s.RGB : s.RGBA;
                        if (a) return s.texImage2D(s.TEXTURE_2D, 0, l, l, s.UNSIGNED_BYTE, t), !1;
                        var c = new e.InternalTexture(u, e.InternalTexture.DATASOURCE_TEMP);
                        return u._bindTextureDirectly(s.TEXTURE_2D, c, !0), s.texImage2D(s.TEXTURE_2D, 0, l, l, s.UNSIGNED_BYTE, t), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, s.LINEAR), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, s.LINEAR), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, s.CLAMP_TO_EDGE), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, s.CLAMP_TO_EDGE), u._rescaleTexture(c, m, n, l, (function() {
                            u._releaseTexture(c), u._bindTextureDirectly(s.TEXTURE_2D, m, !0), o()
                        })), !0
                    }), o)
                };
                !d || _ ? l instanceof HTMLImageElement ? P(l) : e.Tools.LoadImage(f, P, E, n ? n.database : null) : l instanceof Array || "string" == typeof l || l instanceof ArrayBuffer ? e.Tools.LoadImage(l, P, E, n ? n.database : null) : P(l)
            }
            return m
        }, n.prototype._rescaleTexture = function(t, i, r, o, s) {
            var a = this,
                l = this.createRenderTargetTexture({
                    width: i.width,
                    height: i.height
                }, {
                    generateMipMaps: !1,
                    type: n.TEXTURETYPE_UNSIGNED_INT,
                    samplingMode: e.Texture.BILINEAR_SAMPLINGMODE,
                    generateDepthBuffer: !1,
                    generateStencilBuffer: !1
                });
            this._rescalePostProcess || (this._rescalePostProcess = new e.PassPostProcess("rescale", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, this, !1, n.TEXTURETYPE_UNSIGNED_INT)), this._rescalePostProcess.getEffect().executeWhenCompiled((function() {
                a._rescalePostProcess.onApply = function(e) {
                    e._bindTexture("textureSampler", t)
                };
                var e = r;
                e || (e = a.scenes[a.scenes.length - 1]), e.postProcessManager.directRender([a._rescalePostProcess], l, !0), a._bindTextureDirectly(a._gl.TEXTURE_2D, i, !0), a._gl.copyTexImage2D(a._gl.TEXTURE_2D, 0, o, 0, 0, i.width, i.height, 0), a.unBindFramebuffer(l), a._releaseTexture(l), s && s()
            }))
        }, n.prototype._getInternalFormat = function(e) {
            var t = this._gl.RGBA;
            switch (e) {
                case n.TEXTUREFORMAT_ALPHA:
                    t = this._gl.ALPHA;
                    break;
                case n.TEXTUREFORMAT_LUMINANCE:
                    t = this._gl.LUMINANCE;
                    break;
                case n.TEXTUREFORMAT_LUMINANCE_ALPHA:
                    t = this._gl.LUMINANCE_ALPHA;
                    break;
                case n.TEXTUREFORMAT_RGB:
                case n.TEXTUREFORMAT_RGB32F:
                    t = this._gl.RGB;
                    break;
                case n.TEXTUREFORMAT_RGBA:
                case n.TEXTUREFORMAT_RGBA32F:
                    t = this._gl.RGBA;
                    break;
                case n.TEXTUREFORMAT_R32F:
                    t = this._gl.RED;
                    break;
                case n.TEXTUREFORMAT_RG32F:
                    t = this._gl.RG
            }
            return t
        }, n.prototype.updateRawTexture = function(e, t, i, r, o, s) {
            if (void 0 === o && (o = null), void 0 === s && (s = n.TEXTURETYPE_UNSIGNED_INT), e) {
                var a = this._getRGBABufferInternalSizedFormat(s, i),
                    l = this._getInternalFormat(i),
                    c = this._getWebGLTextureType(s);
                this._bindTextureDirectly(this._gl.TEXTURE_2D, e, !0), this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, void 0 === r ? 1 : r ? 1 : 0), this._doNotHandleContextLost || (e._bufferView = t, e.format = i, e.type = s, e.invertY = r, e._compression = o), e.width % 4 != 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), o && t ? this._gl.compressedTexImage2D(this._gl.TEXTURE_2D, 0, this.getCaps().s3tc[o], e.width, e.height, 0, t) : this._gl.texImage2D(this._gl.TEXTURE_2D, 0, a, e.width, e.height, 0, l, c, t), e.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), e.isReady = !0
            }
        }, n.prototype.createRawTexture = function(t, i, o, s, a, l, c, h, u) {
            void 0 === h && (h = null), void 0 === u && (u = n.TEXTURETYPE_UNSIGNED_INT);
            var f = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_RAW);
            f.baseWidth = i, f.baseHeight = o, f.width = i, f.height = o, f.format = s, f.generateMipMaps = a, f.samplingMode = c, f.invertY = l, f._compression = h, f.type = u, this._doNotHandleContextLost || (f._bufferView = t), this.updateRawTexture(f, t, s, l, h, u), this._bindTextureDirectly(this._gl.TEXTURE_2D, f, !0);
            var d = r(c, a, this._gl);
            return this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, d.mag), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, d.min), a && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), this._internalTexturesCache.push(f), f
        }, n.prototype.createDynamicTexture = function(t, i, r, n) {
            var o = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_DYNAMIC);
            return o.baseWidth = t, o.baseHeight = i, r && (t = this.needPOTTextures ? e.Tools.GetExponentOfTwo(t, this._caps.maxTextureSize) : t, i = this.needPOTTextures ? e.Tools.GetExponentOfTwo(i, this._caps.maxTextureSize) : i), o.width = t, o.height = i, o.isReady = !1, o.generateMipMaps = r, o.samplingMode = n, this.updateTextureSamplingMode(n, o), this._internalTexturesCache.push(o), o
        }, n.prototype.updateTextureSamplingMode = function(e, t) {
            var i = r(e, t.generateMipMaps, this._gl);
            t.isCube ? (this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, t, !0), this._gl.texParameteri(this._gl.TEXTURE_CUBE_MAP, this._gl.TEXTURE_MAG_FILTER, i.mag), this._gl.texParameteri(this._gl.TEXTURE_CUBE_MAP, this._gl.TEXTURE_MIN_FILTER, i.min), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null)) : t.is3D ? (this._bindTextureDirectly(this._gl.TEXTURE_3D, t, !0), this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_MAG_FILTER, i.mag), this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_MIN_FILTER, i.min),
                this._bindTextureDirectly(this._gl.TEXTURE_3D, null)) : (this._bindTextureDirectly(this._gl.TEXTURE_2D, t, !0), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, i.mag), this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, i.min), this._bindTextureDirectly(this._gl.TEXTURE_2D, null)), t.samplingMode = e
        }, n.prototype.updateDynamicTexture = function(e, t, i, r, n) {
            if (void 0 === r && (r = !1), e) {
                this._bindTextureDirectly(this._gl.TEXTURE_2D, e, !0), this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, i ? 1 : 0), r && this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);
                var o = n ? this._getInternalFormat(n) : this._gl.RGBA;
                this._gl.texImage2D(this._gl.TEXTURE_2D, 0, o, o, this._gl.UNSIGNED_BYTE, t), e.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), r && this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0), e.isReady = !0
            }
        }, n.prototype.updateVideoTexture = function(e, t, i) {
            if (e && !e._isDisabled) {
                this._bindTextureDirectly(this._gl.TEXTURE_2D, e, !0), this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, i ? 0 : 1);
                try {
                    if (void 0 === this._videoTextureSupported && (this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA, this._gl.RGBA, this._gl.UNSIGNED_BYTE, t), 0 !== this._gl.getError() ? this._videoTextureSupported = !1 : this._videoTextureSupported = !0), this._videoTextureSupported) this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA, this._gl.RGBA, this._gl.UNSIGNED_BYTE, t);
                    else {
                        if (!e._workingCanvas) {
                            e._workingCanvas = document.createElement("canvas");
                            var r = e._workingCanvas.getContext("2d");
                            if (!r) throw new Error("Unable to get 2d context");
                            e._workingContext = r, e._workingCanvas.width = e.width, e._workingCanvas.height = e.height
                        }
                        e._workingContext.drawImage(t, 0, 0, t.videoWidth, t.videoHeight, 0, 0, e.width, e.height), this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA, this._gl.RGBA, this._gl.UNSIGNED_BYTE, e._workingCanvas)
                    }
                    e.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(this._gl.TEXTURE_2D, null), e.isReady = !0
                } catch (t) {
                    e._isDisabled = !0
                }
            }
        }, n.prototype.updateTextureComparisonFunction = function(t, i) {
            if (1 === this.webGLVersion) return void e.Tools.Error("WebGL 1 does not support texture comparison.");
            var r = this._gl;
            t.isCube ? (this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, t, !0), 0 === i ? (r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_COMPARE_FUNC, n.LEQUAL), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_COMPARE_MODE, r.NONE)) : (r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_COMPARE_FUNC, i), r.texParameteri(r.TEXTURE_CUBE_MAP, r.TEXTURE_COMPARE_MODE, r.COMPARE_REF_TO_TEXTURE)), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null)) : (this._bindTextureDirectly(this._gl.TEXTURE_2D, t, !0), 0 === i ? (r.texParameteri(r.TEXTURE_2D, r.TEXTURE_COMPARE_FUNC, n.LEQUAL), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_COMPARE_MODE, r.NONE)) : (r.texParameteri(r.TEXTURE_2D, r.TEXTURE_COMPARE_FUNC, i), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_COMPARE_MODE, r.COMPARE_REF_TO_TEXTURE)), this._bindTextureDirectly(this._gl.TEXTURE_2D, null)), t._comparisonFunction = i
        }, n.prototype._setupDepthStencilTexture = function(t, i, o, s, a) {
            var l = i.width || i,
                c = i.height || i;
            t.baseWidth = l, t.baseHeight = c, t.width = l, t.height = c, t.isReady = !0, t.samples = 1, t.generateMipMaps = !1, t._generateDepthBuffer = !0, t._generateStencilBuffer = o, t.samplingMode = s ? e.Texture.NEAREST_SAMPLINGMODE : e.Texture.BILINEAR_SAMPLINGMODE, t.type = n.TEXTURETYPE_UNSIGNED_INT, t._comparisonFunction = a;
            var h = this._gl,
                u = t.isCube ? h.TEXTURE_CUBE_MAP : h.TEXTURE_2D,
                f = r(t.samplingMode, !1, h);
            h.texParameteri(u, h.TEXTURE_MAG_FILTER, f.mag), h.texParameteri(u, h.TEXTURE_MIN_FILTER, f.min), h.texParameteri(u, h.TEXTURE_WRAP_S, h.CLAMP_TO_EDGE), h.texParameteri(u, h.TEXTURE_WRAP_T, h.CLAMP_TO_EDGE), 0 === a ? (h.texParameteri(u, h.TEXTURE_COMPARE_FUNC, n.LEQUAL), h.texParameteri(u, h.TEXTURE_COMPARE_MODE, h.NONE)) : (h.texParameteri(u, h.TEXTURE_COMPARE_FUNC, a), h.texParameteri(u, h.TEXTURE_COMPARE_MODE, h.COMPARE_REF_TO_TEXTURE))
        }, n.prototype.createDepthStencilTexture = function(t, i) {
            var r = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_DEPTHTEXTURE);
            if (!this._caps.depthTextureExtension) return e.Tools.Error("Depth texture is not supported by your browser or hardware."), r;
            var n = __assign({
                    bilinearFiltering: !1,
                    comparisonFunction: 0,
                    generateStencil: !1
                }, i),
                o = this._gl;
            return this._bindTextureDirectly(o.TEXTURE_2D, r, !0), this._setupDepthStencilTexture(r, t, n.generateStencil, n.bilinearFiltering, n.comparisonFunction), this.webGLVersion > 1 ? n.generateStencil ? o.texImage2D(o.TEXTURE_2D, 0, o.DEPTH24_STENCIL8, r.width, r.height, 0, o.DEPTH_STENCIL, o.UNSIGNED_INT_24_8, null) : o.texImage2D(o.TEXTURE_2D, 0, o.DEPTH_COMPONENT24, r.width, r.height, 0, o.DEPTH_COMPONENT, o.UNSIGNED_INT, null) : n.generateStencil ? o.texImage2D(o.TEXTURE_2D, 0, o.DEPTH_STENCIL, r.width, r.height, 0, o.DEPTH_STENCIL, o.UNSIGNED_INT_24_8, null) : o.texImage2D(o.TEXTURE_2D, 0, o.DEPTH_COMPONENT, r.width, r.height, 0, o.DEPTH_COMPONENT, o.UNSIGNED_INT, null), this._bindTextureDirectly(o.TEXTURE_2D, null), r
        }, n.prototype.createDepthStencilCubeTexture = function(t, i) {
            var r = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_UNKNOWN);
            if (r.isCube = !0, 1 === this.webGLVersion) return e.Tools.Error("Depth cube texture is not supported by WebGL 1."), r;
            var n = __assign({
                    bilinearFiltering: !1,
                    comparisonFunction: 0,
                    generateStencil: !1
                }, i),
                o = this._gl;
            this._bindTextureDirectly(o.TEXTURE_CUBE_MAP, r, !0), this._setupDepthStencilTexture(r, t, n.generateStencil, n.bilinearFiltering, n.comparisonFunction);
            for (var s = 0; s < 6; s++) n.generateStencil ? o.texImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X + s, 0, o.DEPTH24_STENCIL8, t, t, 0, o.DEPTH_STENCIL, o.UNSIGNED_INT_24_8, null) : o.texImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X + s, 0, o.DEPTH_COMPONENT24, t, t, 0, o.DEPTH_COMPONENT, o.UNSIGNED_INT, null);
            return this._bindTextureDirectly(o.TEXTURE_CUBE_MAP, null), r
        }, n.prototype.setFrameBufferDepthStencilTexture = function(e) {
            var t = e.getInternalTexture();
            if (t && t._framebuffer && e.depthStencilTexture) {
                var i = this._gl,
                    r = e.depthStencilTexture;
                this.bindUnboundFramebuffer(t._framebuffer), r.isCube ? r._generateStencilBuffer ? i.framebufferTexture2D(i.FRAMEBUFFER, i.DEPTH_STENCIL_ATTACHMENT, i.TEXTURE_CUBE_MAP_POSITIVE_X, r, 0) : i.framebufferTexture2D(i.FRAMEBUFFER, i.DEPTH_ATTACHMENT, i.TEXTURE_CUBE_MAP_POSITIVE_X, r, 0) : r._generateStencilBuffer ? i.framebufferTexture2D(i.FRAMEBUFFER, i.DEPTH_STENCIL_ATTACHMENT, i.TEXTURE_2D, r, 0) : i.framebufferTexture2D(i.FRAMEBUFFER, i.DEPTH_ATTACHMENT, i.TEXTURE_2D, r, 0), this.bindUnboundFramebuffer(null)
            }
        }, n.prototype.createRenderTargetTexture = function(t, i) {
            var o = new l;
            void 0 !== i && "object" == typeof i ? (o.generateMipMaps = i.generateMipMaps, o.generateDepthBuffer = void 0 === i.generateDepthBuffer || i.generateDepthBuffer, o.generateStencilBuffer = o.generateDepthBuffer && i.generateStencilBuffer, o.type = void 0 === i.type ? n.TEXTURETYPE_UNSIGNED_INT : i.type, o.samplingMode = void 0 === i.samplingMode ? e.Texture.TRILINEAR_SAMPLINGMODE : i.samplingMode) : (o.generateMipMaps = i, o.generateDepthBuffer = !0, o.generateStencilBuffer = !1, o.type = n.TEXTURETYPE_UNSIGNED_INT, o.samplingMode = e.Texture.TRILINEAR_SAMPLINGMODE), o.type !== n.TEXTURETYPE_FLOAT || this._caps.textureFloatLinearFiltering ? o.type !== n.TEXTURETYPE_HALF_FLOAT || this._caps.textureHalfFloatLinearFiltering || (o.samplingMode = e.Texture.NEAREST_SAMPLINGMODE) : o.samplingMode = e.Texture.NEAREST_SAMPLINGMODE;
            var s = this._gl,
                a = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_RENDERTARGET);
            this._bindTextureDirectly(s.TEXTURE_2D, a, !0);
            var c = t.width || t,
                h = t.height || t,
                u = r(o.samplingMode, !!o.generateMipMaps, s);
            o.type !== n.TEXTURETYPE_FLOAT || this._caps.textureFloat || (o.type = n.TEXTURETYPE_UNSIGNED_INT, e.Tools.Warn("Float textures are not supported. Render target forced to TEXTURETYPE_UNSIGNED_BYTE type")), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, u.mag), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, u.min), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, s.CLAMP_TO_EDGE), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, s.CLAMP_TO_EDGE), s.texImage2D(s.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(o.type), c, h, 0, s.RGBA, this._getWebGLTextureType(o.type), null);
            var f = s.createFramebuffer();
            return this.bindUnboundFramebuffer(f), s.framebufferTexture2D(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0, s.TEXTURE_2D, a._webGLTexture, 0), a._depthStencilBuffer = this._setupFramebufferDepthAttachments(!!o.generateStencilBuffer, o.generateDepthBuffer, c, h), o.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(s.TEXTURE_2D, null), s.bindRenderbuffer(s.RENDERBUFFER, null), this.bindUnboundFramebuffer(null), a._framebuffer = f, a.baseWidth = c, a.baseHeight = h, a.width = c, a.height = h, a.isReady = !0, a.samples = 1, a.generateMipMaps = !!o.generateMipMaps, a.samplingMode = o.samplingMode, a.type = o.type, a._generateDepthBuffer = o.generateDepthBuffer, a._generateStencilBuffer = !!o.generateStencilBuffer, this._internalTexturesCache.push(a), a
        }, n.prototype.createMultipleRenderTarget = function(t, i) {
            var o = !1,
                s = !0,
                a = !1,
                l = !1,
                c = 1,
                h = n.TEXTURETYPE_UNSIGNED_INT,
                u = e.Texture.TRILINEAR_SAMPLINGMODE,
                f = [],
                d = [];
            void 0 !== i && (o = i.generateMipMaps, s = void 0 === i.generateDepthBuffer || i.generateDepthBuffer, a = i.generateStencilBuffer, l = i.generateDepthTexture, c = i.textureCount || 1, i.types && (f = i.types), i.samplingModes && (d = i.samplingModes));
            var p = this._gl,
                _ = p.createFramebuffer();
            this.bindUnboundFramebuffer(_);
            for (var m = t.width || t, g = t.height || t, v = [], y = [], b = this._setupFramebufferDepthAttachments(a, s, m, g), x = 0; x < c; x++) {
                var T = d[x] || u,
                    E = f[x] || h;
                E !== n.TEXTURETYPE_FLOAT || this._caps.textureFloatLinearFiltering ? E !== n.TEXTURETYPE_HALF_FLOAT || this._caps.textureHalfFloatLinearFiltering || (T = e.Texture.NEAREST_SAMPLINGMODE) : T = e.Texture.NEAREST_SAMPLINGMODE;
                var A = r(T, o, p);
                E !== n.TEXTURETYPE_FLOAT || this._caps.textureFloat || (E = n.TEXTURETYPE_UNSIGNED_INT, e.Tools.Warn("Float textures are not supported. Render target forced to TEXTURETYPE_UNSIGNED_BYTE type"));
                var P = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_MULTIRENDERTARGET),
                    M = p[this.webGLVersion > 1 ? "COLOR_ATTACHMENT" + x : "COLOR_ATTACHMENT" + x + "_WEBGL"];
                v.push(P), y.push(M), p.activeTexture(p["TEXTURE" + x]), p.bindTexture(p.TEXTURE_2D, P._webGLTexture), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MAG_FILTER, A.mag), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MIN_FILTER, A.min), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_S, p.CLAMP_TO_EDGE), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_T, p.CLAMP_TO_EDGE), p.texImage2D(p.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(E), m, g, 0, p.RGBA, this._getWebGLTextureType(E), null), p.framebufferTexture2D(p.DRAW_FRAMEBUFFER, M, p.TEXTURE_2D, P._webGLTexture, 0), o && this._gl.generateMipmap(this._gl.TEXTURE_2D), this._bindTextureDirectly(p.TEXTURE_2D, null), P._framebuffer = _, P._depthStencilBuffer = b, P.baseWidth = m, P.baseHeight = g, P.width = m, P.height = g, P.isReady = !0, P.samples = 1, P.generateMipMaps = o, P.samplingMode = T, P.type = E, P._generateDepthBuffer = s, P._generateStencilBuffer = a, P._attachments = y, this._internalTexturesCache.push(P)
            }
            if (l && this._caps.depthTextureExtension) {
                var S = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_MULTIRENDERTARGET);
                p.activeTexture(p.TEXTURE0), p.bindTexture(p.TEXTURE_2D, S._webGLTexture), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MAG_FILTER, p.NEAREST), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MIN_FILTER, p.NEAREST), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_S, p.CLAMP_TO_EDGE), p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_T, p.CLAMP_TO_EDGE), p.texImage2D(p.TEXTURE_2D, 0, this.webGLVersion < 2 ? p.DEPTH_COMPONENT : p.DEPTH_COMPONENT16, m, g, 0, p.DEPTH_COMPONENT, p.UNSIGNED_SHORT, null), p.framebufferTexture2D(p.FRAMEBUFFER, p.DEPTH_ATTACHMENT, p.TEXTURE_2D, S._webGLTexture, 0), S._framebuffer = _, S.baseWidth = m, S.baseHeight = g, S.width = m, S.height = g, S.isReady = !0, S.samples = 1, S.generateMipMaps = o, S.samplingMode = p.NEAREST, S._generateDepthBuffer = s, S._generateStencilBuffer = a, v.push(S), this._internalTexturesCache.push(S)
            }
            return p.drawBuffers(y), p.bindRenderbuffer(p.RENDERBUFFER, null), this.bindUnboundFramebuffer(null), this.resetTextureCache(), v
        }, n.prototype._setupFramebufferDepthAttachments = function(e, t, i, r, n) {
            void 0 === n && (n = 1);
            var o = null,
                s = this._gl;
            return e ? (o = s.createRenderbuffer(), s.bindRenderbuffer(s.RENDERBUFFER, o), n > 1 ? s.renderbufferStorageMultisample(s.RENDERBUFFER, n, s.DEPTH24_STENCIL8, i, r) : s.renderbufferStorage(s.RENDERBUFFER, s.DEPTH_STENCIL, i, r), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.DEPTH_STENCIL_ATTACHMENT, s.RENDERBUFFER, o)) : t && (o = s.createRenderbuffer(), s.bindRenderbuffer(s.RENDERBUFFER, o), n > 1 ? s.renderbufferStorageMultisample(s.RENDERBUFFER, n, s.DEPTH_COMPONENT16, i, r) : s.renderbufferStorage(s.RENDERBUFFER, s.DEPTH_COMPONENT16, i, r), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.DEPTH_ATTACHMENT, s.RENDERBUFFER, o)), o
        }, n.prototype.updateRenderTargetTextureSampleCount = function(e, t) {
            if (this.webGLVersion < 2 || !e) return 1;
            if (e.samples === t) return t;
            var i = this._gl;
            if (t = Math.min(t, i.getParameter(i.MAX_SAMPLES)), e._depthStencilBuffer && (i.deleteRenderbuffer(e._depthStencilBuffer), e._depthStencilBuffer = null), e._MSAAFramebuffer && (i.deleteFramebuffer(e._MSAAFramebuffer), e._MSAAFramebuffer = null), e._MSAARenderBuffer && (i.deleteRenderbuffer(e._MSAARenderBuffer), e._MSAARenderBuffer = null), t > 1) {
                var r = i.createFramebuffer();
                if (!r) throw new Error("Unable to create multi sampled framebuffer");
                e._MSAAFramebuffer = r, this.bindUnboundFramebuffer(e._MSAAFramebuffer);
                var n = i.createRenderbuffer();
                if (!n) throw new Error("Unable to create multi sampled framebuffer");
                i.bindRenderbuffer(i.RENDERBUFFER, n), i.renderbufferStorageMultisample(i.RENDERBUFFER, t, this._getRGBAMultiSampleBufferFormat(e.type), e.width, e.height), i.framebufferRenderbuffer(i.FRAMEBUFFER, i.COLOR_ATTACHMENT0, i.RENDERBUFFER, n), e._MSAARenderBuffer = n
            } else this.bindUnboundFramebuffer(e._framebuffer);
            return e.samples = t, e._depthStencilBuffer = this._setupFramebufferDepthAttachments(e._generateStencilBuffer, e._generateDepthBuffer, e.width, e.height, t), i.bindRenderbuffer(i.RENDERBUFFER, null), this.bindUnboundFramebuffer(null), t
        }, n.prototype.updateMultipleRenderTargetTextureSampleCount = function(e, t) {
            if (this.webGLVersion < 2 || !e || 0 == e.length) return 1;
            if (e[0].samples === t) return t;
            var i = this._gl;
            t = Math.min(t, i.getParameter(i.MAX_SAMPLES)), e[0]._depthStencilBuffer && (i.deleteRenderbuffer(e[0]._depthStencilBuffer), e[0]._depthStencilBuffer = null), e[0]._MSAAFramebuffer && (i.deleteFramebuffer(e[0]._MSAAFramebuffer), e[0]._MSAAFramebuffer = null);
            for (var r = 0; r < e.length; r++) e[r]._MSAARenderBuffer && (i.deleteRenderbuffer(e[r]._MSAARenderBuffer), e[r]._MSAARenderBuffer = null);
            if (t > 1) {
                var n = i.createFramebuffer();
                if (!n) throw new Error("Unable to create multi sampled framebuffer");
                this.bindUnboundFramebuffer(n);
                for (var o = this._setupFramebufferDepthAttachments(e[0]._generateStencilBuffer, e[0]._generateDepthBuffer, e[0].width, e[0].height, t), s = [], r = 0; r < e.length; r++) {
                    var a = e[r],
                        l = i[this.webGLVersion > 1 ? "COLOR_ATTACHMENT" + r : "COLOR_ATTACHMENT" + r + "_WEBGL"],
                        c = i.createRenderbuffer();
                    if (!c) throw new Error("Unable to create multi sampled framebuffer");
                    i.bindRenderbuffer(i.RENDERBUFFER, c), i.renderbufferStorageMultisample(i.RENDERBUFFER, t, this._getRGBAMultiSampleBufferFormat(a.type), a.width, a.height), i.framebufferRenderbuffer(i.FRAMEBUFFER, l, i.RENDERBUFFER, c), a._MSAAFramebuffer = n, a._MSAARenderBuffer = c, a.samples = t, a._depthStencilBuffer = o, i.bindRenderbuffer(i.RENDERBUFFER, null), s.push(l)
                }
                i.drawBuffers(s)
            } else this.bindUnboundFramebuffer(e[0]._framebuffer);
            return this.bindUnboundFramebuffer(null), t
        }, n.prototype._uploadDataToTexture = function(e, t, i, r, n, o, s, a) {
            this._gl.texImage2D(e, t, i, r, n, 0, o, s, a)
        }, n.prototype._uploadCompressedDataToTexture = function(e, t, i, r, n, o) {
            this._gl.compressedTexImage2D(e, t, i, r, n, 0, o)
        }, n.prototype.createRenderTargetCubeTexture = function(t, i) {
            var o = __assign({
                generateMipMaps: !0,
                generateDepthBuffer: !0,
                generateStencilBuffer: !1,
                type: n.TEXTURETYPE_UNSIGNED_INT,
                samplingMode: e.Texture.TRILINEAR_SAMPLINGMODE
            }, i);
            o.generateStencilBuffer = o.generateDepthBuffer && o.generateStencilBuffer, o.type !== n.TEXTURETYPE_FLOAT || this._caps.textureFloatLinearFiltering ? o.type !== n.TEXTURETYPE_HALF_FLOAT || this._caps.textureHalfFloatLinearFiltering || (o.samplingMode = e.Texture.NEAREST_SAMPLINGMODE) : o.samplingMode = e.Texture.NEAREST_SAMPLINGMODE;
            var s = this._gl,
                a = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_RENDERTARGET);
            this._bindTextureDirectly(s.TEXTURE_CUBE_MAP, a, !0);
            var l = r(o.samplingMode, o.generateMipMaps, s);
            o.type !== n.TEXTURETYPE_FLOAT || this._caps.textureFloat || (o.type = n.TEXTURETYPE_UNSIGNED_INT, e.Tools.Warn("Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type")), s.texParameteri(s.TEXTURE_CUBE_MAP, s.TEXTURE_MAG_FILTER, l.mag), s.texParameteri(s.TEXTURE_CUBE_MAP, s.TEXTURE_MIN_FILTER, l.min), s.texParameteri(s.TEXTURE_CUBE_MAP, s.TEXTURE_WRAP_S, s.CLAMP_TO_EDGE), s.texParameteri(s.TEXTURE_CUBE_MAP, s.TEXTURE_WRAP_T, s.CLAMP_TO_EDGE);
            for (var c = 0; c < 6; c++) s.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + c, 0, this._getRGBABufferInternalSizedFormat(o.type), t, t, 0, s.RGBA, this._getWebGLTextureType(o.type), null);
            var h = s.createFramebuffer();
            return this.bindUnboundFramebuffer(h), a._depthStencilBuffer = this._setupFramebufferDepthAttachments(o.generateStencilBuffer, o.generateDepthBuffer, t, t), o.generateMipMaps && s.generateMipmap(s.TEXTURE_CUBE_MAP), this._bindTextureDirectly(s.TEXTURE_CUBE_MAP, null), s.bindRenderbuffer(s.RENDERBUFFER, null), this.bindUnboundFramebuffer(null), a._framebuffer = h, a.width = t, a.height = t, a.isReady = !0, a.isCube = !0, a.samples = 1, a.generateMipMaps = o.generateMipMaps, a.samplingMode = o.samplingMode, a.type = o.type, a._generateDepthBuffer = o.generateDepthBuffer, a._generateStencilBuffer = o.generateStencilBuffer, this._internalTexturesCache.push(a), a
        }, n.prototype.createPrefilteredCubeTexture = function(t, i, r, n, o, s, a, l) {
            var c = this;
            void 0 === o && (o = null), void 0 === s && (s = null), void 0 === l && (l = null);
            var h = function(t) {
                if (!t) return void(o && o(null));
                var s = t.texture;
                if (s._dataSource = e.InternalTexture.DATASOURCE_CUBEPREFILTERED, s._lodGenerationScale = r, s._lodGenerationOffset = n, c._caps.textureLOD) return void(o && o(s));
                var a = c._gl,
                    l = t.width;
                if (l) {
                    for (var h = [], u = 0; u < 3; u++) {
                        var f = u / 2,
                            d = 1 - f,
                            p = n,
                            _ = e.Scalar.Log2(l) * r + n,
                            m = p + (_ - p) * d,
                            g = Math.round(Math.min(Math.max(m, 0), _)),
                            v = new e.InternalTexture(c, e.InternalTexture.DATASOURCE_TEMP);
                        if (v.isCube = !0, c._bindTextureDirectly(a.TEXTURE_CUBE_MAP, v, !0), a.texParameteri(a.TEXTURE_CUBE_MAP, a.TEXTURE_MAG_FILTER, a.LINEAR), a.texParameteri(a.TEXTURE_CUBE_MAP, a.TEXTURE_MIN_FILTER, a.LINEAR), a.texParameteri(a.TEXTURE_CUBE_MAP, a.TEXTURE_WRAP_S, a.CLAMP_TO_EDGE), a.texParameteri(a.TEXTURE_CUBE_MAP, a.TEXTURE_WRAP_T, a.CLAMP_TO_EDGE), t.isDDS) {
                            var y = t.info,
                                b = t.data;
                            a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL, y.isCompressed ? 1 : 0), e.DDSTools.UploadDDSLevels(c, c._gl, b, y, !0, 6, g)
                        } else e.Tools.Warn("DDS is the only prefiltered cube map supported so far.");
                        c._bindTextureDirectly(a.TEXTURE_CUBE_MAP, null);
                        var x = new e.BaseTexture(i);
                        x.isCube = !0, x._texture = v, v.isReady = !0, h.push(x)
                    }
                    s._lodTextureHigh = h[2], s._lodTextureMid = h[1], s._lodTextureLow = h[0], o && o(s)
                }
            };
            return this.createCubeTexture(t, i, null, !1, h, s, a, l)
        }, n.prototype.createCubeTexture = function(t, i, r, n, s, a, l, c) {
            var h = this;
            void 0 === s && (s = null), void 0 === a && (a = null), void 0 === c && (c = null);
            var u = this._gl,
                f = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_CUBE);
            f.isCube = !0, f.url = t, f.generateMipMaps = !n, this._doNotHandleContextLost || (f._extension = c, f._files = r);
            var d = !1,
                p = !1,
                _ = t.lastIndexOf("."),
                m = c || (_ > -1 ? t.substring(_).toLowerCase() : "");
            this._textureFormatInUse ? (m = this._textureFormatInUse, t = (_ > -1 ? t.substring(0, _) : t) + this._textureFormatInUse, d = !0) : p = ".dds" === m;
            var g = function(e, t) {
                a && e && a(e.status + " " + e.statusText, t)
            };
            if (d) this._loadFile(t, (function(t) {
                var i = new e.KhronosTextureContainer(t, 6),
                    r = i.numberOfMipmapLevels > 1 && !n;
                h._bindTextureDirectly(u.TEXTURE_CUBE_MAP, f, !0), u.pixelStorei(u.UNPACK_FLIP_Y_WEBGL, 1), i.uploadLevels(h._gl, !n), h.setCubeMapTextureParams(u, r), f.width = i.pixelWidth, f.height = i.pixelHeight, f.isReady = !0
            }), void 0, void 0, !0, g);
            else if (p) r && 6 === r.length ? this._cascadeLoadFiles(i, (function(t) {
                for (var i, r = !1, o = 0, a = 0; a < t.length; a++) {
                    var l = t[a];
                    i = e.DDSTools.GetDDSInfo(l), r = (i.isRGB || i.isLuminance || i.mipmapCount > 1) && !n, h._bindTextureDirectly(u.TEXTURE_CUBE_MAP, f, !0), u.pixelStorei(u.UNPACK_FLIP_Y_WEBGL, i.isCompressed ? 1 : 0), e.DDSTools.UploadDDSLevels(h, h._gl, l, i, r, 6, -1, a), n || i.isFourCC || 1 !== i.mipmapCount || u.generateMipmap(u.TEXTURE_CUBE_MAP), f.width = i.width, f.height = i.height, f.type = i.textureType, o = i.width
                }
                h.setCubeMapTextureParams(u, r), f.isReady = !0, s && s({
                    isDDS: !0,
                    width: o,
                    info: i,
                    imgs: t,
                    texture: f
                })
            }), r, a) : this._loadFile(t, (function(t) {
                var i = e.DDSTools.GetDDSInfo(t),
                    r = (i.isRGB || i.isLuminance || i.mipmapCount > 1) && !n;
                h._bindTextureDirectly(u.TEXTURE_CUBE_MAP, f, !0), u.pixelStorei(u.UNPACK_FLIP_Y_WEBGL, i.isCompressed ? 1 : 0), e.DDSTools.UploadDDSLevels(h, h._gl, t, i, r, 6), n || i.isFourCC || 1 !== i.mipmapCount || u.generateMipmap(u.TEXTURE_CUBE_MAP), h.setCubeMapTextureParams(u, r), f.width = i.width, f.height = i.height, f.isReady = !0, f.type = i.textureType, s && s({
                    isDDS: !0,
                    width: i.width,
                    info: i,
                    data: t,
                    texture: f
                })
            }), void 0, void 0, !0, g);
            else {
                if (!r) throw new Error("Cannot load cubemap because files were not defined");
                o(0, i, (function(t) {
                    var i = h.needPOTTextures ? e.Tools.GetExponentOfTwo(t[0].width, h._caps.maxCubemapTextureSize) : t[0].width,
                        r = i;
                    if (h._prepareWorkingCanvas(), h._workingCanvas && h._workingContext) {
                        h._workingCanvas.width = i, h._workingCanvas.height = r;
                        var o = [u.TEXTURE_CUBE_MAP_POSITIVE_X, u.TEXTURE_CUBE_MAP_POSITIVE_Y, u.TEXTURE_CUBE_MAP_POSITIVE_Z, u.TEXTURE_CUBE_MAP_NEGATIVE_X, u.TEXTURE_CUBE_MAP_NEGATIVE_Y, u.TEXTURE_CUBE_MAP_NEGATIVE_Z];
                        h._bindTextureDirectly(u.TEXTURE_CUBE_MAP, f, !0), u.pixelStorei(u.UNPACK_FLIP_Y_WEBGL, 0);
                        for (var a = l ? h._getInternalFormat(l) : h._gl.RGBA, c = 0; c < o.length; c++) h._workingContext.drawImage(t[c], 0, 0, t[c].width, t[c].height, 0, 0, i, r), u.texImage2D(o[c], 0, a, a, u.UNSIGNED_BYTE, h._workingCanvas);
                        n || u.generateMipmap(u.TEXTURE_CUBE_MAP), h.setCubeMapTextureParams(u, !n), f.width = i, f.height = r, f.isReady = !0, l && (f.format = l), f.onLoadedObservable.notifyObservers(f), f.onLoadedObservable.clear(), s && s()
                    }
                }), r, a)
            }
            return this._internalTexturesCache.push(f), f
        }, n.prototype.setCubeMapTextureParams = function(e, t) {
            e.texParameteri(e.TEXTURE_CUBE_MAP, e.TEXTURE_MAG_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_CUBE_MAP, e.TEXTURE_MIN_FILTER, t ? e.LINEAR_MIPMAP_LINEAR : e.LINEAR), e.texParameteri(e.TEXTURE_CUBE_MAP, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_CUBE_MAP, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), this._bindTextureDirectly(e.TEXTURE_CUBE_MAP, null)
        }, n.prototype.updateRawCubeTexture = function(t, i, r, n, o, s, a) {
            void 0 === s && (s = null), void 0 === a && (a = 0), t._bufferViewArray = i, t.format = r, t.type = n, t.invertY = o, t._compression = s;
            var l = this._gl,
                c = this._getWebGLTextureType(n),
                h = this._getInternalFormat(r),
                u = this._getRGBABufferInternalSizedFormat(n),
                f = !1;
            h === l.RGB && (h = l.RGBA, f = !0), this._bindTextureDirectly(l.TEXTURE_CUBE_MAP, t, !0), l.pixelStorei(l.UNPACK_FLIP_Y_WEBGL, void 0 === o ? 1 : o ? 1 : 0), t.width % 4 != 0 && l.pixelStorei(l.UNPACK_ALIGNMENT, 1);
            for (var d = 0; d < 6; d++) {
                var p = i[d];
                s ? l.compressedTexImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X + d, a, this.getCaps().s3tc[s], t.width, t.height, 0, p) : (f && (p = this._convertRGBtoRGBATextureData(p, t.width, t.height, n)), l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X + d, a, u, t.width, t.height, 0, h, c, p))
            }(!this.needPOTTextures || e.Tools.IsExponentOfTwo(t.width) && e.Tools.IsExponentOfTwo(t.height)) && t.generateMipMaps && 0 === a && this._gl.generateMipmap(this._gl.TEXTURE_CUBE_MAP), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null), t.isReady = !0
        }, n.prototype.createRawCubeTexture = function(t, i, n, o, s, a, l, c) {
            void 0 === c && (c = null);
            var h = this._gl,
                u = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_CUBERAW);
            u.isCube = !0, u.generateMipMaps = s, u.format = n, u.type = o, this._doNotHandleContextLost || (u._bufferViewArray = t);
            var f = this._getWebGLTextureType(o),
                d = this._getInternalFormat(n);
            d === h.RGB && (d = h.RGBA);
            var p = i,
                _ = p;
            if (u.width = p, u.height = _, !this.needPOTTextures || e.Tools.IsExponentOfTwo(u.width) && e.Tools.IsExponentOfTwo(u.height) || (s = !1), t && this.updateRawCubeTexture(u, t, n, o, a, c), this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, u, !0), t && s && this._gl.generateMipmap(this._gl.TEXTURE_CUBE_MAP), f !== h.FLOAT || this._caps.textureFloatLinearFiltering)
                if (f !== this._gl.HALF_FLOAT_OES || this._caps.textureHalfFloatLinearFiltering) {
                    var m = r(l, s, h);
                    h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_MAG_FILTER, m.mag), h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_MIN_FILTER, m.min)
                } else h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_MAG_FILTER, h.NEAREST), h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_MIN_FILTER, h.NEAREST);
            else h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_MAG_FILTER, h.NEAREST), h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_MIN_FILTER, h.NEAREST);
            return h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_WRAP_S, h.CLAMP_TO_EDGE), h.texParameteri(h.TEXTURE_CUBE_MAP, h.TEXTURE_WRAP_T, h.CLAMP_TO_EDGE), this._bindTextureDirectly(h.TEXTURE_CUBE_MAP, null), u
        }, n.prototype.createRawCubeTextureFromUrl = function(t, i, r, n, o, s, a, l, c, h, u, f) {
            var d = this;
            void 0 === c && (c = null), void 0 === h && (h = null), void 0 === u && (u = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === f && (f = !1);
            var p = this._gl,
                _ = this.createRawCubeTexture(null, r, n, o, !s, f, u);
            i._addPendingData(_), _.url = t, this._internalTexturesCache.push(_);
            var m = function(e, t) {
                    i._removePendingData(_), h && e && h(e.status + " " + e.statusText, t)
                },
                g = function(e) {
                    var t = _.width,
                        r = a(e);
                    if (r) {
                        if (l) {
                            var h = d._getWebGLTextureType(o),
                                u = d._getInternalFormat(n),
                                m = d._getRGBABufferInternalSizedFormat(o),
                                g = !1;
                            u === p.RGB && (u = p.RGBA, g = !0), d._bindTextureDirectly(p.TEXTURE_CUBE_MAP, _, !0), p.pixelStorei(p.UNPACK_FLIP_Y_WEBGL, 0);
                            for (var v = l(r), y = 0; y < v.length; y++)
                                for (var b = t >> y, x = 0; x < 6; x++) {
                                    var T = v[y][x];
                                    g && (T = d._convertRGBtoRGBATextureData(T, b, b, o)), p.texImage2D(x, y, m, b, b, 0, u, h, T)
                                }
                            d._bindTextureDirectly(p.TEXTURE_CUBE_MAP, null)
                        } else _.generateMipMaps = !s, d.updateRawCubeTexture(_, r, n, o, f);
                        _.isReady = !0, i._removePendingData(_), c && c()
                    }
                };
            return this._loadFile(t, (function(e) {
                g(e)
            }), void 0, i.database, !0, m), _
        }, n.prototype.updateRawTexture3D = function(e, t, i, r, n) {
            void 0 === n && (n = null);
            var o = this._getInternalFormat(i);
            this._bindTextureDirectly(this._gl.TEXTURE_3D, e, !0), this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, void 0 === r ? 1 : r ? 1 : 0), this._doNotHandleContextLost || (e._bufferView = t, e.format = i, e.invertY = r, e._compression = n), e.width % 4 != 0 && this._gl.pixelStorei(this._gl.UNPACK_ALIGNMENT, 1), n && t ? this._gl.compressedTexImage3D(this._gl.TEXTURE_3D, 0, this.getCaps().s3tc[n], e.width, e.height, e.depth, 0, t) : this._gl.texImage3D(this._gl.TEXTURE_3D, 0, o, e.width, e.height, e.depth, 0, o, this._gl.UNSIGNED_BYTE, t), e.generateMipMaps && this._gl.generateMipmap(this._gl.TEXTURE_3D), this._bindTextureDirectly(this._gl.TEXTURE_3D, null), e.isReady = !0
        }, n.prototype.createRawTexture3D = function(t, i, n, o, s, a, l, c, h) {
            void 0 === h && (h = null);
            var u = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_RAW3D);
            u.baseWidth = i, u.baseHeight = n, u.baseDepth = o, u.width = i, u.height = n, u.depth = o, u.format = s, u.generateMipMaps = a, u.samplingMode = c, u.is3D = !0, this._doNotHandleContextLost || (u._bufferView = t), this.updateRawTexture3D(u, t, s, l, h), this._bindTextureDirectly(this._gl.TEXTURE_3D, u, !0);
            var f = r(c, a, this._gl);
            return this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_MAG_FILTER, f.mag), this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_MIN_FILTER, f.min), a && this._gl.generateMipmap(this._gl.TEXTURE_3D), this._bindTextureDirectly(this._gl.TEXTURE_3D, null), this._internalTexturesCache.push(u), u
        }, n.prototype._prepareWebGLTextureContinuation = function(e, t, i, n, o) {
            var s = this._gl;
            if (s) {
                var a = r(o, !i, s);
                s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, a.mag), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, a.min), i || n || s.generateMipmap(s.TEXTURE_2D), this._bindTextureDirectly(s.TEXTURE_2D, null), t && t._removePendingData(e), e.onLoadedObservable.notifyObservers(e), e.onLoadedObservable.clear()
            }
        }, n.prototype._prepareWebGLTexture = function(t, i, r, n, o, s, a, l, c) {
            var h = this;
            void 0 === c && (c = e.Texture.TRILINEAR_SAMPLINGMODE);
            var u = this.needPOTTextures ? e.Tools.GetExponentOfTwo(r, this.getCaps().maxTextureSize) : r,
                f = this.needPOTTextures ? e.Tools.GetExponentOfTwo(n, this.getCaps().maxTextureSize) : n,
                d = this._gl;
            if (d) {
                if (!t._webGLTexture) return void(i && i._removePendingData(t));
                this._bindTextureDirectly(d.TEXTURE_2D, t, !0), d.pixelStorei(d.UNPACK_FLIP_Y_WEBGL, void 0 === o ? 1 : o ? 1 : 0), t.baseWidth = r, t.baseHeight = n, t.width = u, t.height = f, t.isReady = !0, l(u, f, (function() {
                    h._prepareWebGLTextureContinuation(t, i, s, a, c)
                })) || this._prepareWebGLTextureContinuation(t, i, s, a, c)
            }
        }, n.prototype._convertRGBtoRGBATextureData = function(e, t, i, r) {
            var o;
            o = r === n.TEXTURETYPE_FLOAT ? new Float32Array(t * i * 4) : new Uint32Array(t * i * 4);
            for (var s = 0; s < t; s++)
                for (var a = 0; a < i; a++) {
                    var l = 3 * (a * t + s),
                        c = 4 * (a * t + s);
                    o[c + 0] = e[l + 0], o[c + 1] = e[l + 1], o[c + 2] = e[l + 2], o[c + 3] = 1
                }
            return o
        }, n.prototype._releaseFramebufferObjects = function(e) {
            var t = this._gl;
            e._framebuffer && (t.deleteFramebuffer(e._framebuffer), e._framebuffer = null), e._depthStencilBuffer && (t.deleteRenderbuffer(e._depthStencilBuffer), e._depthStencilBuffer = null), e._MSAAFramebuffer && (t.deleteFramebuffer(e._MSAAFramebuffer), e._MSAAFramebuffer = null), e._MSAARenderBuffer && (t.deleteRenderbuffer(e._MSAARenderBuffer), e._MSAARenderBuffer = null)
        }, n.prototype._releaseTexture = function(e) {
            var t = this._gl;
            this._releaseFramebufferObjects(e), t.deleteTexture(e._webGLTexture), this.unbindAllTextures();
            var i = this._internalTexturesCache.indexOf(e); - 1 !== i && this._internalTexturesCache.splice(i, 1), e._lodTextureHigh && e._lodTextureHigh.dispose(), e._lodTextureMid && e._lodTextureMid.dispose(), e._lodTextureLow && e._lodTextureLow.dispose()
        }, n.prototype.setProgram = function(e) {
            this._currentProgram !== e && (this._gl.useProgram(e), this._currentProgram = e)
        }, n.prototype.bindSamplers = function(e) {
            this.setProgram(e.getProgram());
            for (var t = e.getSamplers(), i = 0; i < t.length; i++) {
                var r = e.getUniform(t[i]);
                r && (this._boundUniforms[i] = r)
            }
            this._currentEffect = null
        }, n.prototype._moveBoundTextureOnTop = function(e) {
            this.disableTextureBindingOptimization || this._lastBoundInternalTextureTracker.previous === e || (this._linkTrackers(e.previous, e.next), this._linkTrackers(this._lastBoundInternalTextureTracker.previous, e), this._linkTrackers(e, this._lastBoundInternalTextureTracker))
        }, n.prototype._getCorrectTextureChannel = function(e, t) {
            if (!t) return -1;
            if (t._initialSlot = e, this.disableTextureBindingOptimization) e !== t._designatedSlot && this._textureCollisions.addCount(1, !1);
            else if (e !== t._designatedSlot) return t._designatedSlot > -1 ? t._designatedSlot : this._nextFreeTextureSlots.length ? this._nextFreeTextureSlots[0] : (this._textureCollisions.addCount(1, !1), this._removeDesignatedSlot(this._firstBoundInternalTextureTracker.next));
            return e
        }, n.prototype._linkTrackers = function(e, t) {
            e.next = t, t.previous = e
        }, n.prototype._removeDesignatedSlot = function(e) {
            var t = e._designatedSlot;
            return -1 === t ? -1 : (e._designatedSlot = -1, this.disableTextureBindingOptimization ? -1 : (this._linkTrackers(e.previous, e.next), this._boundTexturesCache[t] = null, this._nextFreeTextureSlots.push(t), t))
        }, n.prototype._activateCurrentTexture = function() {
            this._currentTextureChannel !== this._activeChannel && (this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel), this._currentTextureChannel = this._activeChannel)
        }, n.prototype._bindTextureDirectly = function(e, t, i) {
            void 0 === i && (i = !1), i && t && t._designatedSlot > -1 && (this._activeChannel = t._designatedSlot);
            var r = this._boundTexturesCache[this._activeChannel],
                n = t && t._initialSlot > -1;
            if (r !== t) {
                if (r && this._removeDesignatedSlot(r), this._activateCurrentTexture(), this._gl.bindTexture(e, t ? t._webGLTexture : null), this._boundTexturesCache[this._activeChannel] = t, t) {
                    if (!this.disableTextureBindingOptimization) {
                        var o = this._nextFreeTextureSlots.indexOf(this._activeChannel);
                        o > -1 && this._nextFreeTextureSlots.splice(o, 1), this._linkTrackers(this._lastBoundInternalTextureTracker.previous, t), this._linkTrackers(t, this._lastBoundInternalTextureTracker)
                    }
                    t._designatedSlot = this._activeChannel
                }
            } else i && this._activateCurrentTexture();
            n && !i && this._bindSamplerUniformToChannel(t._initialSlot, this._activeChannel)
        }, n.prototype._bindTexture = function(e, t) {
            e < 0 || (t && (e = this._getCorrectTextureChannel(e, t)), this._activeChannel = e, this._bindTextureDirectly(this._gl.TEXTURE_2D, t))
        }, n.prototype.setTextureFromPostProcess = function(e, t) {
            this._bindTexture(e, t ? t._textures.data[t._currentRenderTextureInd] : null)
        }, n.prototype.unbindAllTextures = function() {
            for (var e = 0; e < this._maxSimultaneousTextures; e++) 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)
        }, n.prototype.setTexture = function(e, t, i) {
            e < 0 || (t && (this._boundUniforms[e] = t), this._setTexture(e, i))
        }, n.prototype._bindSamplerUniformToChannel = function(e, t) {
            var i = this._boundUniforms[e];
            i._currentState !== t && (this._gl.uniform1i(i, t), i._currentState = t)
        }, n.prototype._setTexture = function(t, i, r) {
            if (void 0 === r && (r = !1), !i) return null != this._boundTexturesCache[t] && (this._activeChannel = t, 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)), !1;
            if (i.video) this._activeChannel = t, i.update();
            else if (i.delayLoadState === n.DELAYLOADSTATE_NOTLOADED) return i.delayLoad(), !1;
            var o;
            if (o = i.isReady() ? i.getInternalTexture() : i.isCube ? this.emptyCubeTexture : i.is3D ? this.emptyTexture3D : this.emptyTexture, r || (t = this._getCorrectTextureChannel(t, o)), this._boundTexturesCache[t] === o) return this._moveBoundTextureOnTop(o), r || this._bindSamplerUniformToChannel(o._initialSlot, t), !1;
            if (this._activeChannel = t, o && o.is3D) {
                if (this._bindTextureDirectly(this._gl.TEXTURE_3D, o, r), o && o._cachedWrapU !== i.wrapU) switch (o._cachedWrapU = i.wrapU, i.wrapU) {
                    case e.Texture.WRAP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);
                        break;
                    case e.Texture.CLAMP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);
                        break;
                    case e.Texture.MIRROR_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_S, this._gl.MIRRORED_REPEAT)
                }
                if (o && o._cachedWrapV !== i.wrapV) switch (o._cachedWrapV = i.wrapV, i.wrapV) {
                    case e.Texture.WRAP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);
                        break;
                    case e.Texture.CLAMP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);
                        break;
                    case e.Texture.MIRROR_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_T, this._gl.MIRRORED_REPEAT)
                }
                if (o && o._cachedWrapR !== i.wrapR) switch (o._cachedWrapR = i.wrapR, i.wrapR) {
                    case e.Texture.WRAP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_R, this._gl.REPEAT);
                        break;
                    case e.Texture.CLAMP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_R, this._gl.CLAMP_TO_EDGE);
                        break;
                    case e.Texture.MIRROR_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_3D, this._gl.TEXTURE_WRAP_R, this._gl.MIRRORED_REPEAT)
                }
                this._setAnisotropicLevel(this._gl.TEXTURE_3D, i)
            } else if (o && o.isCube) {
                if (this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, o, r), o._cachedCoordinatesMode !== i.coordinatesMode) {
                    o._cachedCoordinatesMode = i.coordinatesMode;
                    var s = i.coordinatesMode !== e.Texture.CUBIC_MODE && i.coordinatesMode !== e.Texture.SKYBOX_MODE ? this._gl.REPEAT : this._gl.CLAMP_TO_EDGE;
                    this._gl.texParameteri(this._gl.TEXTURE_CUBE_MAP, this._gl.TEXTURE_WRAP_S, s), this._gl.texParameteri(this._gl.TEXTURE_CUBE_MAP, this._gl.TEXTURE_WRAP_T, s)
                }
                this._setAnisotropicLevel(this._gl.TEXTURE_CUBE_MAP, i)
            } else {
                if (this._bindTextureDirectly(this._gl.TEXTURE_2D, o, r), o && o._cachedWrapU !== i.wrapU) switch (o._cachedWrapU = i.wrapU, i.wrapU) {
                    case e.Texture.WRAP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);
                        break;
                    case e.Texture.CLAMP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);
                        break;
                    case e.Texture.MIRROR_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.MIRRORED_REPEAT)
                }
                if (o && o._cachedWrapV !== i.wrapV) switch (o._cachedWrapV = i.wrapV, i.wrapV) {
                    case e.Texture.WRAP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);
                        break;
                    case e.Texture.CLAMP_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);
                        break;
                    case e.Texture.MIRROR_ADDRESSMODE:
                        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.MIRRORED_REPEAT)
                }
                this._setAnisotropicLevel(this._gl.TEXTURE_2D, i)
            }
            return !0
        }, n.prototype.setTextureArray = function(e, t, i) {
            if (!(e < 0) && t) {
                this._textureUnits && this._textureUnits.length === i.length || (this._textureUnits = new Int32Array(i.length));
                for (var r = 0; r < i.length; r++) this._textureUnits[r] = this._getCorrectTextureChannel(e + r, i[r].getInternalTexture());
                this._gl.uniform1iv(t, this._textureUnits);
                for (var n = 0; n < i.length; n++) this._setTexture(this._textureUnits[n], i[n], !0)
            }
        }, n.prototype._setAnisotropicLevel = function(t, i) {
            var r = i.getInternalTexture();
            if (r) {
                var n = this._caps.textureAnisotropicFilterExtension,
                    o = i.anisotropicFilteringLevel;
                r.samplingMode !== e.Texture.LINEAR_LINEAR_MIPNEAREST && r.samplingMode !== e.Texture.LINEAR_LINEAR_MIPLINEAR && r.samplingMode !== e.Texture.LINEAR_LINEAR && (o = 1), n && r._cachedAnisotropicFilteringLevel !== o && (this._gl.texParameterf(t, n.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(o, this._caps.maxAnisotropy)), r._cachedAnisotropicFilteringLevel = o)
            }
        }, n.prototype.readPixels = function(e, t, i, r) {
            var n = new Uint8Array(r * i * 4);
            return this._gl.readPixels(e, t, i, r, this._gl.RGBA, this._gl.UNSIGNED_BYTE, n), n
        }, n.prototype.addExternalData = function(t, i) {
            return this._externalData || (this._externalData = new e.StringDictionary), this._externalData.add(t, i)
        }, n.prototype.getExternalData = function(t) {
            return this._externalData || (this._externalData = new e.StringDictionary), this._externalData.get(t)
        }, n.prototype.getOrAddExternalDataWithFactory = function(t, i) {
            return this._externalData || (this._externalData = new e.StringDictionary), this._externalData.getOrAddWithFactory(t, i)
        }, n.prototype.removeExternalData = function(t) {
            return this._externalData || (this._externalData = new e.StringDictionary), this._externalData.remove(t)
        }, n.prototype.unbindAllAttributes = function() {
            if (this._mustWipeVertexAttributes) {
                this._mustWipeVertexAttributes = !1;
                for (var e = 0; e < this._caps.maxVertexAttribs; e++) this._gl.disableVertexAttribArray(e), this._vertexAttribArraysEnabled[e] = !1, this._currentBufferPointers[e].active = !1
            } else
                for (var e = 0, t = this._vertexAttribArraysEnabled.length; e < t; e++) e >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[e] || (this._gl.disableVertexAttribArray(e), this._vertexAttribArraysEnabled[e] = !1, this._currentBufferPointers[e].active = !1)
        }, n.prototype.releaseEffects = function() {
            for (var e in this._compiledEffects) this._deleteProgram(this._compiledEffects[e]._program);
            this._compiledEffects = {}
        }, n.prototype.dispose = function() {
            for (this.hideLoadingUI(), this.stopRenderLoop(); this.postProcesses.length;) this.postProcesses[0].dispose();
            for (this._emptyTexture && (this._releaseTexture(this._emptyTexture), this._emptyTexture = null), this._emptyCubeTexture && (this._releaseTexture(this._emptyCubeTexture), this._emptyCubeTexture = null), this._rescalePostProcess && this._rescalePostProcess.dispose(); this.scenes.length;) this.scenes[0].dispose();
            n.audioEngine && n.audioEngine.dispose(), this.releaseEffects(), this.unbindAllAttributes(), this._dummyFramebuffer && this._gl.deleteFramebuffer(this._dummyFramebuffer), this.disableVR(), e.Tools.IsWindowObjectExist() && (window.removeEventListener("blur", this._onBlur), window.removeEventListener("focus", this._onFocus), window.removeEventListener("vrdisplaypointerrestricted", this._onVRDisplayPointerRestricted), window.removeEventListener("vrdisplaypointerunrestricted", this._onVRDisplayPointerUnrestricted), this._renderingCanvas && (this._renderingCanvas.removeEventListener("focus", this._onCanvasFocus), this._renderingCanvas.removeEventListener("blur", this._onCanvasBlur), this._renderingCanvas.removeEventListener("pointerout", this._onCanvasBlur), this._doNotHandleContextLost || (this._renderingCanvas.removeEventListener("webglcontextlost", this._onContextLost), this._renderingCanvas.removeEventListener("webglcontextrestored", this._onContextRestored))), 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), this._onVrDisplayConnect && (window.removeEventListener("vrdisplayconnect", this._onVrDisplayConnect), this._onVrDisplayDisconnect && window.removeEventListener("vrdisplaydisconnect", this._onVrDisplayDisconnect), this._onVrDisplayPresentChange && window.removeEventListener("vrdisplaypresentchange", this._onVrDisplayPresentChange), this._onVrDisplayConnect = null, this._onVrDisplayDisconnect = null));
            var t = n.Instances.indexOf(this);
            t >= 0 && n.Instances.splice(t, 1), this._workingCanvas = null, this._workingContext = null, this._currentBufferPointers = [], this._renderingCanvas = null, this._currentProgram = null, this.onResizeObservable.clear(), this.onCanvasBlurObservable.clear(), this.onCanvasFocusObservable.clear(), this.onCanvasPointerOutObservable.clear(), this.onBeginFrameObservable.clear(), this.onEndFrameObservable.clear(), e.Effect.ResetCache();
            for (var i = 0, r = this._activeRequests; i < r.length; i++) {
                r[i].abort()
            }
        }, n.prototype.displayLoadingUI = function() {
            if (e.Tools.IsWindowObjectExist()) {
                var t = this.loadingScreen;
                t && t.displayLoadingUI()
            }
        }, n.prototype.hideLoadingUI = function() {
            if (e.Tools.IsWindowObjectExist()) {
                var t = this.loadingScreen;
                t && t.hideLoadingUI()
            }
        }, Object.defineProperty(n.prototype, "loadingScreen", {
            get: function() {
                return !this._loadingScreen && e.DefaultLoadingScreen && this._renderingCanvas && (this._loadingScreen = new e.DefaultLoadingScreen(this._renderingCanvas)), this._loadingScreen
            },
            set: function(e) {
                this._loadingScreen = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "loadingUIText", {
            set: function(e) {
                this.loadingScreen.loadingUIText = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "loadingUIBackgroundColor", {
            set: function(e) {
                this.loadingScreen.loadingUIBackgroundColor = e
            },
            enumerable: !0,
            configurable: !0
        }), n.prototype.attachContextLostEvent = function(e) {
            this._renderingCanvas && this._renderingCanvas.addEventListener("webglcontextlost", e, !1)
        }, n.prototype.attachContextRestoredEvent = function(e) {
            this._renderingCanvas && this._renderingCanvas.addEventListener("webglcontextrestored", e, !1)
        }, n.prototype.getVertexShaderSource = function(e) {
            var t = this._gl.getAttachedShaders(e);
            return t ? this._gl.getShaderSource(t[0]) : null
        }, n.prototype.getFragmentShaderSource = function(e) {
            var t = this._gl.getAttachedShaders(e);
            return t ? this._gl.getShaderSource(t[1]) : null
        }, n.prototype.getError = function() {
            return this._gl.getError()
        }, n.prototype.getFps = function() {
            return this._fps
        }, n.prototype.getDeltaTime = function() {
            return this._deltaTime
        }, n.prototype._measureFps = function() {
            this._performanceMonitor.sampleFrame(), this._fps = this._performanceMonitor.averageFPS, this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0
        }, n.prototype._readTexturePixels = function(e, t, i, r) {
            void 0 === r && (r = -1);
            var n = this._gl;
            if (!this._dummyFramebuffer) {
                var o = n.createFramebuffer();
                if (!o) throw new Error("Unable to create dummy framebuffer");
                this._dummyFramebuffer = o
            }
            n.bindFramebuffer(n.FRAMEBUFFER, this._dummyFramebuffer), r > -1 ? n.framebufferTexture2D(n.FRAMEBUFFER, n.COLOR_ATTACHMENT0, n.TEXTURE_CUBE_MAP_POSITIVE_X + r, e._webGLTexture, 0) : n.framebufferTexture2D(n.FRAMEBUFFER, n.COLOR_ATTACHMENT0, n.TEXTURE_2D, e._webGLTexture, 0);
            var s, a = void 0 !== e.type ? this._getWebGLTextureType(e.type) : n.UNSIGNED_BYTE;
            switch (a) {
                case n.UNSIGNED_BYTE:
                    s = new Uint8Array(4 * t * i), a = n.UNSIGNED_BYTE;
                    break;
                default:
                    s = new Float32Array(4 * t * i), a = n.FLOAT
            }
            return n.readPixels(0, 0, t, i, n.RGBA, a, s), n.bindFramebuffer(n.FRAMEBUFFER, this._currentFramebuffer), s
        }, n.prototype._canRenderToFloatFramebuffer = function() {
            return this._webGLVersion > 1 ? this._caps.colorBufferFloat : this._canRenderToFramebuffer(n.TEXTURETYPE_FLOAT)
        }, n.prototype._canRenderToHalfFloatFramebuffer = function() {
            return this._webGLVersion > 1 ? this._caps.colorBufferFloat : this._canRenderToFramebuffer(n.TEXTURETYPE_HALF_FLOAT)
        }, n.prototype._canRenderToFramebuffer = function(e) {
            for (var t = this._gl; t.getError() !== t.NO_ERROR;);
            var i = !0,
                r = t.createTexture();
            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);
            var n = t.createFramebuffer();
            t.bindFramebuffer(t.FRAMEBUFFER, n), t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, r, 0);
            var o = t.checkFramebufferStatus(t.FRAMEBUFFER);
            if (i = i && o === 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) {
                t.bindFramebuffer(t.FRAMEBUFFER, null);
                var s = t.RGBA,
                    a = t.UNSIGNED_BYTE,
                    l = new Uint8Array(4);
                t.readPixels(0, 0, 1, 1, s, a, l), i = i && t.getError() === t.NO_ERROR
            }
            for (t.deleteTexture(r), t.deleteFramebuffer(n), t.bindFramebuffer(t.FRAMEBUFFER, null); !i && t.getError() !== t.NO_ERROR;);
            return i
        }, n.prototype._getWebGLTextureType = function(e) {
            return e === n.TEXTURETYPE_FLOAT ? this._gl.FLOAT : e === n.TEXTURETYPE_HALF_FLOAT ? this._gl.HALF_FLOAT_OES : this._gl.UNSIGNED_BYTE
        }, n.prototype._getRGBABufferInternalSizedFormat = function(e, t) {
            if (1 === this._webGLVersion) return this._gl.RGBA;
            if (e === n.TEXTURETYPE_FLOAT) {
                if (t) switch (t) {
                    case n.TEXTUREFORMAT_R32F:
                        return this._gl.R32F;
                    case n.TEXTUREFORMAT_RG32F:
                        return this._gl.RG32F;
                    case n.TEXTUREFORMAT_RGB32F:
                        return this._gl.RGB32F
                }
                return this._gl.RGBA32F
            }
            return e === n.TEXTURETYPE_HALF_FLOAT ? this._gl.RGBA16F : this._gl.RGBA
        }, n.prototype._getRGBAMultiSampleBufferFormat = function(e) {
            return e === n.TEXTURETYPE_FLOAT ? this._gl.RGBA32F : e === n.TEXTURETYPE_HALF_FLOAT ? this._gl.RGBA16F : this._gl.RGBA8
        }, n.prototype.createQuery = function() {
            return this._gl.createQuery()
        }, n.prototype.deleteQuery = function(e) {
            return this._gl.deleteQuery(e), this
        }, n.prototype.isQueryResultAvailable = function(e) {
            return this._gl.getQueryParameter(e, this._gl.QUERY_RESULT_AVAILABLE)
        }, n.prototype.getQueryResult = function(e) {
            return this._gl.getQueryParameter(e, this._gl.QUERY_RESULT)
        }, n.prototype.beginOcclusionQuery = function(e, t) {
            var i = this.getGlAlgorithmType(e);
            return this._gl.beginQuery(i, t), this
        }, n.prototype.endOcclusionQuery = function(e) {
            var t = this.getGlAlgorithmType(e);
            return this._gl.endQuery(t), this
        }, n.prototype._createTimeQuery = function() {
            var e = this._caps.timerQuery;
            return e.createQueryEXT ? e.createQueryEXT() : this.createQuery()
        }, n.prototype._deleteTimeQuery = function(e) {
            var t = this._caps.timerQuery;
            if (t.deleteQueryEXT) return void t.deleteQueryEXT(e);
            this.deleteQuery(e)
        }, n.prototype._getTimeQueryResult = function(e) {
            var t = this._caps.timerQuery;
            return t.getQueryObjectEXT ? t.getQueryObjectEXT(e, t.QUERY_RESULT_EXT) : this.getQueryResult(e)
        }, n.prototype._getTimeQueryAvailability = function(e) {
            var t = this._caps.timerQuery;
            return t.getQueryObjectEXT ? t.getQueryObjectEXT(e, t.QUERY_RESULT_AVAILABLE_EXT) : this.isQueryResultAvailable(e)
        }, n.prototype.startTimeQuery = function() {
            var t = this._caps.timerQuery;
            if (!t) return null;
            var i = new e._TimeToken;
            if (this._gl.getParameter(t.GPU_DISJOINT_EXT), this._caps.canUseTimestampForTimerQuery) i._startTimeQuery = this._createTimeQuery(), t.queryCounterEXT(i._startTimeQuery, t.TIMESTAMP_EXT);
            else {
                if (this._currentNonTimestampToken) return this._currentNonTimestampToken;
                i._timeElapsedQuery = this._createTimeQuery(), t.beginQueryEXT ? t.beginQueryEXT(t.TIME_ELAPSED_EXT, i._timeElapsedQuery) : this._gl.beginQuery(t.TIME_ELAPSED_EXT, i._timeElapsedQuery), this._currentNonTimestampToken = i
            }
            return i
        }, n.prototype.endTimeQuery = function(e) {
            var t = this._caps.timerQuery;
            if (!t || !e) return -1;
            if (this._caps.canUseTimestampForTimerQuery) {
                if (!e._startTimeQuery) return -1;
                e._endTimeQuery || (e._endTimeQuery = this._createTimeQuery(), t.queryCounterEXT(e._endTimeQuery, t.TIMESTAMP_EXT))
            } else if (!e._timeElapsedQueryEnded) {
                if (!e._timeElapsedQuery) return -1;
                t.endQueryEXT ? t.endQueryEXT(t.TIME_ELAPSED_EXT) : this._gl.endQuery(t.TIME_ELAPSED_EXT), e._timeElapsedQueryEnded = !0
            }
            var i = this._gl.getParameter(t.GPU_DISJOINT_EXT),
                r = !1;
            if (e._endTimeQuery ? r = this._getTimeQueryAvailability(e._endTimeQuery) : e._timeElapsedQuery && (r = this._getTimeQueryAvailability(e._timeElapsedQuery)), r && !i) {
                var n = 0;
                if (this._caps.canUseTimestampForTimerQuery) {
                    if (!e._startTimeQuery || !e._endTimeQuery) return -1;
                    var o = this._getTimeQueryResult(e._startTimeQuery);
                    n = this._getTimeQueryResult(e._endTimeQuery) - o, this._deleteTimeQuery(e._startTimeQuery), this._deleteTimeQuery(e._endTimeQuery), e._startTimeQuery = null, e._endTimeQuery = null
                } else {
                    if (!e._timeElapsedQuery) return -1;
                    n = this._getTimeQueryResult(e._timeElapsedQuery), this._deleteTimeQuery(e._timeElapsedQuery), e._timeElapsedQuery = null, e._timeElapsedQueryEnded = !1, this._currentNonTimestampToken = null
                }
                return n
            }
            return -1
        }, n.prototype.getGlAlgorithmType = function(t) {
            return t === e.AbstractMesh.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE ? this._gl.ANY_SAMPLES_PASSED_CONSERVATIVE : this._gl.ANY_SAMPLES_PASSED
        }, n.prototype.createTransformFeedback = function() {
            return this._gl.createTransformFeedback()
        }, n.prototype.deleteTransformFeedback = function(e) {
            this._gl.deleteTransformFeedback(e)
        }, n.prototype.bindTransformFeedback = function(e) {
            this._gl.bindTransformFeedback(this._gl.TRANSFORM_FEEDBACK, e)
        }, n.prototype.beginTransformFeedback = function(e) {
            void 0 === e && (e = !0), this._gl.beginTransformFeedback(e ? this._gl.POINTS : this._gl.TRIANGLES)
        }, n.prototype.endTransformFeedback = function() {
            this._gl.endTransformFeedback()
        }, n.prototype.setTranformFeedbackVaryings = function(e, t) {
            this._gl.transformFeedbackVaryings(e, t, this._gl.INTERLEAVED_ATTRIBS)
        }, n.prototype.bindTransformFeedbackBuffer = function(e) {
            this._gl.bindBufferBase(this._gl.TRANSFORM_FEEDBACK_BUFFER, 0, e)
        }, n.prototype._loadFile = function(t, i, r, n, o, s) {
            var a = this,
                l = e.Tools.LoadFile(t, i, r, n, o, s);
            return this._activeRequests.push(l), l.onCompleteObservable.add((function(e) {
                a._activeRequests.splice(a._activeRequests.indexOf(e), 1)
            })), l
        }, n.prototype._loadFileAsync = function(e, t, i) {
            var r = this;
            return new Promise(function(n, o) {
                r._loadFile(e, (function(e) {
                    n(e)
                }), void 0, t, i, (function(e, t) {
                    o(t)
                }))
            })
        }, n.prototype._partialLoadFile = function(e, t, i, r, n, o) {
            void 0 === o && (o = null);
            var s = function(e) {
                    i[t] = e, 6 === ++i._internalCount && n(i)
                },
                a = function(e, t) {
                    o && e && o(e.status + " " + e.statusText, t)
                };
            this._loadFile(e, s, void 0, void 0, !0, a)
        }, n.prototype._cascadeLoadFiles = function(e, t, i, r) {
            void 0 === r && (r = null);
            var n = [];
            n._internalCount = 0;
            for (var o = 0; o < 6; o++) this._partialLoadFile(i[o], o, n, e, t, r)
        }, n.isSupported = function() {
            try {
                var e = document.createElement("canvas");
                return null != (e.getContext("webgl") || e.getContext("experimental-webgl")) && !!window.WebGLRenderingContext
            } catch (e) {
                return !1
            }
        }, n.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: "Macintosh",
            capture: null,
            captureConstraint: null,
            targets: ["textureBindingOptimization"]
        }, {
            key: "iPhone",
            capture: null,
            captureConstraint: null,
            targets: ["textureBindingOptimization"]
        }, {
            key: "iPad",
            capture: null,
            captureConstraint: null,
            targets: ["textureBindingOptimization"]
        }], n.Instances = new Array, n._ALPHA_DISABLE = 0, n._ALPHA_ADD = 1, n._ALPHA_COMBINE = 2, n._ALPHA_SUBTRACT = 3, n._ALPHA_MULTIPLY = 4, n._ALPHA_MAXIMIZED = 5, n._ALPHA_ONEONE = 6, n._ALPHA_PREMULTIPLIED = 7, n._ALPHA_PREMULTIPLIED_PORTERDUFF = 8, n._ALPHA_INTERPOLATE = 9, n._ALPHA_SCREENMODE = 10, n._DELAYLOADSTATE_NONE = 0, n._DELAYLOADSTATE_LOADED = 1, n._DELAYLOADSTATE_LOADING = 2, n._DELAYLOADSTATE_NOTLOADED = 4, n._TEXTUREFORMAT_ALPHA = 0, n._TEXTUREFORMAT_LUMINANCE = 1, n._TEXTUREFORMAT_LUMINANCE_ALPHA = 2, n._TEXTUREFORMAT_RGB = 4, n._TEXTUREFORMAT_RGBA = 5, n._TEXTUREFORMAT_R32F = 6, n._TEXTUREFORMAT_RG32F = 7, n._TEXTUREFORMAT_RGB32F = 8, n._TEXTUREFORMAT_RGBA32F = 9, n._TEXTURETYPE_UNSIGNED_INT = 0, n._TEXTURETYPE_FLOAT = 1, n._TEXTURETYPE_HALF_FLOAT = 2, n._NEVER = 512, n._ALWAYS = 519, n._LESS = 513, n._EQUAL = 514, n._LEQUAL = 515, n._GREATER = 516, n._GEQUAL = 518, n._NOTEQUAL = 517, n._KEEP = 7680, n._REPLACE = 7681, n._INCR = 7682, n._DECR = 7683, n._INVERT = 5386, n._INCR_WRAP = 34055, n._DECR_WRAP = 34056, n._SCALEMODE_FLOOR = 1, n._SCALEMODE_NEAREST = 2, n._SCALEMODE_CEILING = 3, n.CollisionsEpsilon = .001, n.CodeRepository = "src/", n.ShadersRepository = "src/Shaders/", n
    })();
    e.Engine = u
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            void 0 === i && (i = null), this.state = "", this.metadata = null, this.doNotSerialize = !1, this._isDisposed = !1, this.animations = new Array, this._ranges = {}, this._isEnabled = !0, this._isReady = !0, this._currentRenderId = -1, this._parentRenderId = -1, this.onDisposeObservable = new e.Observable, this._behaviors = new Array, this.name = t, this.id = t, this._scene = i || e.Engine.LastCreatedScene, this.uniqueId = this._scene.getUniqueId(), this._initCache()
        }
        return t.prototype.isDisposed = function() {
            return this._isDisposed
        }, Object.defineProperty(t.prototype, "parent", {
            get: function() {
                return this._parentNode
            },
            set: function(e) {
                if (this._parentNode !== e) {
                    if (this._parentNode && void 0 !== this._parentNode._children && null !== this._parentNode._children) {
                        var t = this._parentNode._children.indexOf(this); - 1 !== t && this._parentNode._children.splice(t, 1)
                    }
                    this._parentNode = e, this._parentNode && (void 0 !== this._parentNode._children && null !== this._parentNode._children || (this._parentNode._children = new Array), this._parentNode._children.push(this))
                }
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getClassName = function() {
            return "Node"
        }, Object.defineProperty(t.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.getEngine = function() {
            return this._scene.getEngine()
        }, t.prototype.addBehavior = function(e) {
            var t = this;
            if (-1 !== this._behaviors.indexOf(e)) return this;
            if (e.init(), this._scene.isLoading) var i = this._scene.onDataLoadedObservable.add((function() {
                e.attach(t), setTimeout((function() {
                    t._scene.onDataLoadedObservable.remove(i)
                }), 0)
            }));
            else e.attach(this);
            return this._behaviors.push(e), this
        }, t.prototype.removeBehavior = function(e) {
            var t = this._behaviors.indexOf(e);
            return -1 === t ? this : (this._behaviors[t].detach(), this._behaviors.splice(t, 1), this)
        }, Object.defineProperty(t.prototype, "behaviors", {
            get: function() {
                return this._behaviors
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getBehaviorByName = function(e) {
            for (var t = 0, i = this._behaviors; t < i.length; t++) {
                var r = i[t];
                if (r.name === e) return r
            }
            return null
        }, t.prototype.getWorldMatrix = function() {
            return e.Matrix.Identity()
        }, t.prototype._initCache = function() {
            this._cache = {}, this._cache.parent = void 0
        }, t.prototype.updateCache = function(e) {
            !e && this.isSynchronized() || (this._cache.parent = this.parent, this._updateCache())
        }, t.prototype._updateCache = function(e) {}, t.prototype._isSynchronized = function() {
            return !0
        }, t.prototype._markSyncedWithParent = function() {
            this.parent && (this._parentRenderId = this.parent._currentRenderId)
        }, t.prototype.isSynchronizedWithParent = function() {
            return !this.parent || this._parentRenderId === this.parent._currentRenderId && this.parent.isSynchronized()
        }, t.prototype.isSynchronized = function(e) {
            var t = this.hasNewParent();
            return t = t || !this.isSynchronizedWithParent(), t = t || !this._isSynchronized(), e && this.updateCache(!0), !t
        }, t.prototype.hasNewParent = function(e) {
            return this._cache.parent !== this.parent && (e && (this._cache.parent = this.parent), !0)
        }, t.prototype.isReady = function(e) {
            return void 0 === e && (e = !1), this._isReady
        }, t.prototype.isEnabled = function(e) {
            return void 0 === e && (e = !0), !1 === e ? this._isEnabled : !1 !== this._isEnabled && (void 0 === this.parent || null === this.parent || this.parent.isEnabled(e))
        }, t.prototype.setEnabled = function(e) {
            this._isEnabled = e
        }, t.prototype.isDescendantOf = function(e) {
            return !!this.parent && (this.parent === e || this.parent.isDescendantOf(e))
        }, t.prototype._getDescendants = function(e, t, i) {
            if (void 0 === t && (t = !1), this._children)
                for (var r = 0; r < this._children.length; r++) {
                    var n = this._children[r];
                    i && !i(n) || e.push(n), t || n._getDescendants(e, !1, i)
                }
        }, t.prototype.getDescendants = function(e, t) {
            var i = new Array;
            return this._getDescendants(i, e, t), i
        }, t.prototype.getChildMeshes = function(t, i) {
            var r = [];
            return this._getDescendants(r, t, (function(t) {
                return (!i || i(t)) && t instanceof e.AbstractMesh
            })), r
        }, t.prototype.getChildTransformNodes = function(t, i) {
            var r = [];
            return this._getDescendants(r, t, (function(t) {
                return (!i || i(t)) && t instanceof e.TransformNode
            })), r
        }, t.prototype.getChildren = function(e) {
            return this.getDescendants(!0, e)
        }, t.prototype._setReady = function(e) {
            if (e !== this._isReady) {
                if (!e) return void(this._isReady = !1);
                this._isReady = !0, this.onReady && this.onReady(this)
            }
        }, t.prototype.getAnimationByName = function(e) {
            for (var t = 0; t < this.animations.length; t++) {
                var i = this.animations[t];
                if (i.name === e) return i
            }
            return null
        }, t.prototype.createAnimationRange = function(t, i, r) {
            if (!this._ranges[t]) {
                this._ranges[t] = new e.AnimationRange(t, i, r);
                for (var n = 0, o = this.animations.length; n < o; n++) this.animations[n] && this.animations[n].createRange(t, i, r)
            }
        }, t.prototype.deleteAnimationRange = function(e, t) {
            void 0 === t && (t = !0);
            for (var i = 0, r = this.animations.length; i < r; i++) this.animations[i] && this.animations[i].deleteRange(e, t);
            this._ranges[e] = null
        }, t.prototype.getAnimationRange = function(e) {
            return this._ranges[e]
        }, t.prototype.beginAnimation = function(e, t, i, r) {
            var n = this.getAnimationRange(e);
            return n ? this._scene.beginAnimation(this, n.from, n.to, t, i, r) : null
        }, t.prototype.serializeAnimationRanges = function() {
            var e = [];
            for (var t in this._ranges) {
                var i = this._ranges[t];
                if (i) {
                    var r = {};
                    r.name = t, r.from = i.from, r.to = i.to, e.push(r)
                }
            }
            return e
        }, t.prototype.computeWorldMatrix = function(t) {
            return e.Matrix.Identity()
        }, t.prototype.dispose = function() {
            this.parent = null, this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear();
            for (var e = 0, t = this._behaviors; e < t.length; e++) {
                t[e].detach()
            }
            this._behaviors = [], this._isDisposed = !0
        }, t.ParseAnimationRanges = function(e, t, i) {
            if (t.ranges)
                for (var r = 0; r < t.ranges.length; r++) {
                    var n = t.ranges[r];
                    e.createAnimationRange(n.name, n.from, n.to)
                }
        }, __decorate([e.serialize()], t.prototype, "name", void 0), __decorate([e.serialize()], t.prototype, "id", void 0), __decorate([e.serialize()], t.prototype, "uniqueId", void 0), __decorate([e.serialize()], t.prototype, "state", void 0), __decorate([e.serialize()], t.prototype, "metadata", void 0), t
    })();
    e.Node = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            this.minimum = t, this.maximum = i, this._tempRadiusVector = e.Vector3.Zero();
            var r = e.Vector3.Distance(t, i);
            this.center = e.Vector3.Lerp(t, i, .5), this.radius = .5 * r, this.centerWorld = e.Vector3.Zero(), this._update(e.Matrix.Identity())
        }
        return t.prototype._update = function(t) {
            e.Vector3.TransformCoordinatesToRef(this.center, t, this.centerWorld), e.Vector3.TransformNormalFromFloatsToRef(1, 1, 1, t, this._tempRadiusVector), this.radiusWorld = Math.max(Math.abs(this._tempRadiusVector.x), Math.abs(this._tempRadiusVector.y), Math.abs(this._tempRadiusVector.z)) * this.radius
        }, t.prototype.isInFrustum = function(e) {
            for (var t = 0; t < 6; t++)
                if (e[t].dotCoordinate(this.centerWorld) <= -this.radiusWorld) return !1;
            return !0
        }, t.prototype.intersectsPoint = function(t) {
            var i = this.centerWorld.x - t.x,
                r = this.centerWorld.y - t.y,
                n = this.centerWorld.z - t.z,
                o = Math.sqrt(i * i + r * r + n * n);
            return !(Math.abs(this.radiusWorld - o) < e.Epsilon)
        }, t.Intersects = function(e, t) {
            var i = e.centerWorld.x - t.centerWorld.x,
                r = e.centerWorld.y - t.centerWorld.y,
                n = e.centerWorld.z - t.centerWorld.z,
                o = Math.sqrt(i * i + r * r + n * n);
            return !(e.radiusWorld + t.radiusWorld < o)
        }, t
    })();
    e.BoundingSphere = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            this.minimum = t, this.maximum = i, this.vectors = new Array, this.vectorsWorld = new Array, this.vectors.push(this.minimum.clone()), this.vectors.push(this.maximum.clone()), this.vectors.push(this.minimum.clone()), this.vectors[2].x = this.maximum.x, this.vectors.push(this.minimum.clone()), this.vectors[3].y = this.maximum.y, this.vectors.push(this.minimum.clone()), this.vectors[4].z = this.maximum.z, this.vectors.push(this.maximum.clone()), this.vectors[5].z = this.minimum.z, this.vectors.push(this.maximum.clone()), this.vectors[6].x = this.minimum.x, this.vectors.push(this.maximum.clone()), this.vectors[7].y = this.minimum.y, this.center = this.maximum.add(this.minimum).scale(.5), this.extendSize = this.maximum.subtract(this.minimum).scale(.5), this.directions = [e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero()];
            for (var r = 0; r < this.vectors.length; r++) this.vectorsWorld[r] = e.Vector3.Zero();
            this.minimumWorld = e.Vector3.Zero(), this.maximumWorld = e.Vector3.Zero(), this.centerWorld = e.Vector3.Zero(), this.extendSizeWorld = e.Vector3.Zero(), this._update(e.Matrix.Identity())
        }
        return t.prototype.getWorldMatrix = function() {
            return this._worldMatrix
        }, t.prototype.setWorldMatrix = function(e) {
            return this._worldMatrix.copyFrom(e), this
        }, t.prototype._update = function(t) {
            e.Vector3.FromFloatsToRef(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, this.minimumWorld), e.Vector3.FromFloatsToRef(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, this.maximumWorld);
            for (var i = 0; i < this.vectors.length; i++) {
                var r = this.vectorsWorld[i];
                e.Vector3.TransformCoordinatesToRef(this.vectors[i], t, r), r.x < this.minimumWorld.x && (this.minimumWorld.x = r.x), r.y < this.minimumWorld.y && (this.minimumWorld.y = r.y), r.z < this.minimumWorld.z && (this.minimumWorld.z = r.z), r.x > this.maximumWorld.x && (this.maximumWorld.x = r.x), r.y > this.maximumWorld.y && (this.maximumWorld.y = r.y), r.z > this.maximumWorld.z && (this.maximumWorld.z = r.z)
            }
            this.maximumWorld.subtractToRef(this.minimumWorld, this.extendSizeWorld), this.extendSizeWorld.scaleInPlace(.5), this.maximumWorld.addToRef(this.minimumWorld, this.centerWorld), this.centerWorld.scaleInPlace(.5), e.Vector3.FromFloatArrayToRef(t.m, 0, this.directions[0]), e.Vector3.FromFloatArrayToRef(t.m, 4, this.directions[1]), e.Vector3.FromFloatArrayToRef(t.m, 8, this.directions[2]), this._worldMatrix = t
        }, t.prototype.isInFrustum = function(e) {
            return t.IsInFrustum(this.vectorsWorld, e)
        }, t.prototype.isCompletelyInFrustum = function(e) {
            return t.IsCompletelyInFrustum(this.vectorsWorld, e)
        }, t.prototype.intersectsPoint = function(t) {
            var i = -e.Epsilon;
            return !(this.maximumWorld.x - t.x < i || i > t.x - this.minimumWorld.x) && (!(this.maximumWorld.y - t.y < i || i > t.y - this.minimumWorld.y) && !(this.maximumWorld.z - t.z < i || i > t.z - this.minimumWorld.z))
        }, t.prototype.intersectsSphere = function(e) {
            return t.IntersectsSphere(this.minimumWorld, this.maximumWorld, e.centerWorld, e.radiusWorld)
        }, t.prototype.intersectsMinMax = function(e, t) {
            return !(this.maximumWorld.x < e.x || this.minimumWorld.x > t.x) && (!(this.maximumWorld.y < e.y || this.minimumWorld.y > t.y) && !(this.maximumWorld.z < e.z || this.minimumWorld.z > t.z))
        }, t.Intersects = function(e, t) {
            return !(e.maximumWorld.x < t.minimumWorld.x || e.minimumWorld.x > t.maximumWorld.x) && (!(e.maximumWorld.y < t.minimumWorld.y || e.minimumWorld.y > t.maximumWorld.y) && !(e.maximumWorld.z < t.minimumWorld.z || e.minimumWorld.z > t.maximumWorld.z))
        }, t.IntersectsSphere = function(t, i, r, n) {
            var o = e.Vector3.Clamp(r, t, i);
            return e.Vector3.DistanceSquared(r, o) <= n * n
        }, t.IsCompletelyInFrustum = function(e, t) {
            for (var i = 0; i < 6; i++)
                for (var r = 0; r < 8; r++)
                    if (t[i].dotCoordinate(e[r]) < 0) return !1;
            return !0
        }, t.IsInFrustum = function(e, t) {
            for (var i = 0; i < 6; i++) {
                for (var r = 8, n = 0; n < 8 && t[i].dotCoordinate(e[n]) < 0; n++) --r;
                if (0 === r) return !1
            }
            return !0
        }, t
    })();
    e.BoundingBox = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = function(t, i) {
            var r = e.Vector3.Dot(i.centerWorld, t),
                n = Math.abs(e.Vector3.Dot(i.directions[0], t)) * i.extendSize.x,
                o = Math.abs(e.Vector3.Dot(i.directions[1], t)) * i.extendSize.y,
                s = Math.abs(e.Vector3.Dot(i.directions[2], t)) * i.extendSize.z,
                a = n + o + s;
            return {
                min: r - a,
                max: r + a
            }
        },
        i = function(e, t, i, r) {
            return !(e > r || i > t)
        },
        r = function(e, r, n) {
            var o = t(e, r),
                s = t(e, n);
            return i(o.min, o.max, s.min, s.max)
        },
        n = (function() {
            function t(t, i) {
                this.minimum = t, this.maximum = i, this._isLocked = !1, this.boundingBox = new e.BoundingBox(t, i), this.boundingSphere = new e.BoundingSphere(t, i)
            }
            return Object.defineProperty(t.prototype, "isLocked", {
                get: function() {
                    return this._isLocked
                },
                set: function(e) {
                    this._isLocked = e
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.update = function(e) {
                this._isLocked || (this.boundingBox._update(e), this.boundingSphere._update(e))
            }, t.prototype.centerOn = function(t, i) {
                return this.minimum = t.subtract(i), this.maximum = t.add(i), this.boundingBox = new e.BoundingBox(this.minimum, this.maximum), this.boundingSphere = new e.BoundingSphere(this.minimum, this.maximum), this
            }, t.prototype.isInFrustum = function(e) {
                return !!this.boundingSphere.isInFrustum(e) && this.boundingBox.isInFrustum(e)
            }, Object.defineProperty(t.prototype, "diagonalLength", {
                get: function() {
                    var e = this.boundingBox;
                    return e.maximumWorld.subtract(e.minimumWorld).length()
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.isCompletelyInFrustum = function(e) {
                return this.boundingBox.isCompletelyInFrustum(e)
            }, t.prototype._checkCollision = function(e) {
                return e._canDoCollision(this.boundingSphere.centerWorld, this.boundingSphere.radiusWorld, this.boundingBox.minimumWorld, this.boundingBox.maximumWorld)
            }, t.prototype.intersectsPoint = function(e) {
                return !!this.boundingSphere.centerWorld && (!!this.boundingSphere.intersectsPoint(e) && !!this.boundingBox.intersectsPoint(e))
            }, t.prototype.intersects = function(t, i) {
                if (!this.boundingSphere.centerWorld || !t.boundingSphere.centerWorld) return !1;
                if (!e.BoundingSphere.Intersects(this.boundingSphere, t.boundingSphere)) return !1;
                if (!e.BoundingBox.Intersects(this.boundingBox, t.boundingBox)) return !1;
                if (!i) return !0;
                var n = this.boundingBox,
                    o = t.boundingBox;
                return !!r(n.directions[0], n, o) && (!!r(n.directions[1], n, o) && (!!r(n.directions[2], n, o) && (!!r(o.directions[0], n, o) && (!!r(o.directions[1], n, o) && (!!r(o.directions[2], n, o) && (!!r(e.Vector3.Cross(n.directions[0], o.directions[0]), n, o) && (!!r(e.Vector3.Cross(n.directions[0], o.directions[1]), n, o) && (!!r(e.Vector3.Cross(n.directions[0], o.directions[2]), n, o) && (!!r(e.Vector3.Cross(n.directions[1], o.directions[0]), n, o) && (!!r(e.Vector3.Cross(n.directions[1], o.directions[1]), n, o) && (!!r(e.Vector3.Cross(n.directions[1], o.directions[2]), n, o) && (!!r(e.Vector3.Cross(n.directions[2], o.directions[0]), n, o) && (!!r(e.Vector3.Cross(n.directions[2], o.directions[1]), n, o) && !!r(e.Vector3.Cross(n.directions[2], o.directions[2]), n, o))))))))))))))
            }, t
        })();
    e.BoundingInfo = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n) {
            void 0 === r && (r = null), void 0 === n && (n = !0);
            var o = t.call(this, i, r) || this;
            return o._rotation = e.Vector3.Zero(), o._scaling = e.Vector3.One(), o._isDirty = !1, o.billboardMode = e.AbstractMesh.BILLBOARDMODE_NONE, o.scalingDeterminant = 1, o.infiniteDistance = !1, o.position = e.Vector3.Zero(), o._localWorld = e.Matrix.Zero(), o._worldMatrix = e.Matrix.Zero(), o._worldMatrixDeterminant = 0, o._absolutePosition = e.Vector3.Zero(), o._pivotMatrix = e.Matrix.Identity(), o._postMultiplyPivotMatrix = !1, o._isWorldMatrixFrozen = !1, o.onAfterWorldMatrixUpdateObservable = new e.Observable, o._nonUniformScaling = !1, n && o.getScene().addTransformNode(o), o
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "rotation", {
            get: function() {
                return this._rotation
            },
            set: function(e) {
                this._rotation = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "scaling", {
            get: function() {
                return this._scaling
            },
            set: function(e) {
                this._scaling = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "rotationQuaternion", {
            get: function() {
                return this._rotationQuaternion
            },
            set: function(e) {
                this._rotationQuaternion = e, e && this.rotation.length() && this.rotation.copyFromFloats(0, 0, 0)
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getWorldMatrix = function() {
            return this._currentRenderId !== this.getScene().getRenderId() && this.computeWorldMatrix(), this._worldMatrix
        }, i.prototype._getWorldMatrixDeterminant = function() {
            return this._worldMatrixDeterminant
        }, Object.defineProperty(i.prototype, "worldMatrixFromCache", {
            get: function() {
                return this._worldMatrix
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.updatePoseMatrix = function(e) {
            return this._poseMatrix.copyFrom(e), this
        }, i.prototype.getPoseMatrix = function() {
            return this._poseMatrix
        }, i.prototype._isSynchronized = function() {
            return !this._isDirty && (this.billboardMode === this._cache.billboardMode && this.billboardMode === e.AbstractMesh.BILLBOARDMODE_NONE && (!this._cache.pivotMatrixUpdated && (!this.infiniteDistance && (!!this._cache.position.equals(this.position) && (!(this.rotationQuaternion && !this._cache.rotationQuaternion.equals(this.rotationQuaternion)) && (!!this._cache.rotation.equals(this.rotation) && !!this._cache.scaling.equals(this.scaling)))))))
        }, i.prototype._initCache = function() {
            t.prototype._initCache.call(this), this._cache.localMatrixUpdated = !1, this._cache.position = e.Vector3.Zero(), this._cache.scaling = e.Vector3.Zero(), this._cache.rotation = e.Vector3.Zero(), this._cache.rotationQuaternion = new e.Quaternion(0, 0, 0, 0), this._cache.billboardMode = -1
        }, i.prototype.markAsDirty = function(e) {
            return "rotation" === e && (this.rotationQuaternion = null), this._currentRenderId = Number.MAX_VALUE, this._isDirty = !0, this
        }, Object.defineProperty(i.prototype, "absolutePosition", {
            get: function() {
                return this._absolutePosition
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.setPreTransformMatrix = function(e) {
            return this.setPivotMatrix(e, !1)
        }, i.prototype.setPivotMatrix = function(t, i) {
            return void 0 === i && (i = !0), this._pivotMatrix = t.clone(), this._cache.pivotMatrixUpdated = !0, this._postMultiplyPivotMatrix = i, this._postMultiplyPivotMatrix && (this._pivotMatrixInverse ? this._pivotMatrix.invertToRef(this._pivotMatrixInverse) : this._pivotMatrixInverse = e.Matrix.Invert(this._pivotMatrix)), this
        }, i.prototype.getPivotMatrix = function() {
            return this._pivotMatrix
        }, i.prototype.freezeWorldMatrix = function() {
            return this._isWorldMatrixFrozen = !1, this.computeWorldMatrix(!0), this._isWorldMatrixFrozen = !0, this
        }, i.prototype.unfreezeWorldMatrix = function() {
            return this._isWorldMatrixFrozen = !1, this.computeWorldMatrix(!0), this
        }, Object.defineProperty(i.prototype, "isWorldMatrixFrozen", {
            get: function() {
                return this._isWorldMatrixFrozen
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getAbsolutePosition = function() {
            return this.computeWorldMatrix(), this._absolutePosition
        }, i.prototype.setAbsolutePosition = function(t) {
            if (!t) return this;
            var i, r, n;
            if (void 0 === t.x) {
                if (arguments.length < 3) return this;
                i = arguments[0], r = arguments[1], n = arguments[2]
            } else i = t.x, r = t.y, n = t.z;
            if (this.parent) {
                var o = this.parent.getWorldMatrix().clone();
                o.invert();
                var s = new e.Vector3(i, r, n);
                this.position = e.Vector3.TransformCoordinates(s, o)
            } else this.position.x = i, this.position.y = r, this.position.z = n;
            return this
        }, i.prototype.setPositionWithLocalVector = function(t) {
            return this.computeWorldMatrix(), this.position = e.Vector3.TransformNormal(t, this._localWorld), this
        }, i.prototype.getPositionExpressedInLocalSpace = function() {
            this.computeWorldMatrix();
            var t = this._localWorld.clone();
            return t.invert(), e.Vector3.TransformNormal(this.position, t)
        }, i.prototype.locallyTranslate = function(t) {
            return this.computeWorldMatrix(!0), this.position = e.Vector3.TransformCoordinates(t, this._localWorld), this
        }, i.prototype.lookAt = function(t, i, r, n, o) {
            void 0 === i && (i = 0), void 0 === r && (r = 0), void 0 === n && (n = 0), void 0 === o && (o = e.Space.LOCAL);
            var s = e.AbstractMesh._lookAtVectorCache,
                a = o === e.Space.LOCAL ? this.position : this.getAbsolutePosition();
            t.subtractToRef(a, s);
            var l = -Math.atan2(s.z, s.x) - Math.PI / 2,
                c = Math.sqrt(s.x * s.x + s.z * s.z),
                h = Math.atan2(s.y, c);
            return this.rotationQuaternion ? e.Quaternion.RotationYawPitchRollToRef(l + i, h + r, n, this.rotationQuaternion) : (this.rotation.x = h + r, this.rotation.y = l + i, this.rotation.z = n), this
        }, i.prototype.getDirection = function(t) {
            var i = e.Vector3.Zero();
            return this.getDirectionToRef(t, i), i
        }, i.prototype.getDirectionToRef = function(t, i) {
            return e.Vector3.TransformNormalToRef(t, this.getWorldMatrix(), i), this
        }, i.prototype.setPivotPoint = function(t, i) {
            void 0 === i && (i = e.Space.LOCAL), 0 == this.getScene().getRenderId() && this.computeWorldMatrix(!0);
            var r = this.getWorldMatrix();
            if (i == e.Space.WORLD) {
                var n = e.Tmp.Matrix[0];
                r.invertToRef(n), t = e.Vector3.TransformCoordinates(t, n)
            }
            return this.setPivotMatrix(e.Matrix.Translation(-t.x, -t.y, -t.z), !0)
        }, i.prototype.getPivotPoint = function() {
            var t = e.Vector3.Zero();
            return this.getPivotPointToRef(t), t
        }, i.prototype.getPivotPointToRef = function(e) {
            return e.x = -this._pivotMatrix.m[12], e.y = -this._pivotMatrix.m[13], e.z = -this._pivotMatrix.m[14], this
        }, i.prototype.getAbsolutePivotPoint = function() {
            var t = e.Vector3.Zero();
            return this.getAbsolutePivotPointToRef(t), t
        }, i.prototype.getAbsolutePivotPointToRef = function(t) {
            return t.x = this._pivotMatrix.m[12], t.y = this._pivotMatrix.m[13], t.z = this._pivotMatrix.m[14], this.getPivotPointToRef(t), e.Vector3.TransformCoordinatesToRef(t, this.getWorldMatrix(), t), this
        }, i.prototype.setParent = function(t) {
            if (null === t) {
                var i = e.Tmp.Quaternion[0],
                    r = e.Tmp.Vector3[0],
                    n = e.Tmp.Vector3[1];
                this.parent && this.parent.computeWorldMatrix && this.parent.computeWorldMatrix(!0), this.computeWorldMatrix(!0), this.getWorldMatrix().decompose(n, i, r), this.rotationQuaternion ? this.rotationQuaternion.copyFrom(i) : i.toEulerAnglesToRef(this.rotation), this.scaling.x = n.x, this.scaling.y = n.y, this.scaling.z = n.z, this.position.x = r.x, this.position.y = r.y, this.position.z = r.z
            } else {
                var i = e.Tmp.Quaternion[0],
                    r = e.Tmp.Vector3[0],
                    n = e.Tmp.Vector3[1],
                    o = e.Tmp.Matrix[0],
                    s = e.Tmp.Matrix[1];
                this.computeWorldMatrix(!0), t.computeWorldMatrix(!0), t.getWorldMatrix().invertToRef(s), this.getWorldMatrix().multiplyToRef(s, o), o.decompose(n, i, r), this.rotationQuaternion ? this.rotationQuaternion.copyFrom(i) : i.toEulerAnglesToRef(this.rotation), this.position.x = r.x, this.position.y = r.y, this.position.z = r.z, this.scaling.x = n.x, this.scaling.y = n.y, this.scaling.z = n.z
            }
            return this.parent = t, this
        }, Object.defineProperty(i.prototype, "nonUniformScaling", {
            get: function() {
                return this._nonUniformScaling
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._updateNonUniformScalingState = function(e) {
            return this._nonUniformScaling !== e && (this._nonUniformScaling = !0, !0)
        }, i.prototype.attachToBone = function(e, t) {
            return this._transformToBoneReferal = t, this.parent = e, e.getWorldMatrix().determinant() < 0 && (this.scalingDeterminant *= -1), this
        }, i.prototype.detachFromBone = function() {
            return this.parent ? (this.parent.getWorldMatrix().determinant() < 0 && (this.scalingDeterminant *= -1), this._transformToBoneReferal = null, this.parent = null, this) : this
        }, i.prototype.rotate = function(t, i, r) {
            t.normalize(), this.rotationQuaternion || (this.rotationQuaternion = e.Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z), this.rotation = e.Vector3.Zero());
            var n;
            if (r && r !== e.Space.LOCAL) {
                if (this.parent) {
                    var o = this.parent.getWorldMatrix().clone();
                    o.invert(), t = e.Vector3.TransformNormal(t, o)
                }
                n = e.Quaternion.RotationAxisToRef(t, i, e.AbstractMesh._rotationAxisCache), n.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion)
            } else n = e.Quaternion.RotationAxisToRef(t, i, e.AbstractMesh._rotationAxisCache), this.rotationQuaternion.multiplyToRef(n, this.rotationQuaternion);
            return this
        }, i.prototype.rotateAround = function(t, i, r) {
            return i.normalize(), this.rotationQuaternion || (this.rotationQuaternion = e.Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z), this.rotation.copyFromFloats(0, 0, 0)), t.subtractToRef(this.position, e.Tmp.Vector3[0]), e.Matrix.TranslationToRef(e.Tmp.Vector3[0].x, e.Tmp.Vector3[0].y, e.Tmp.Vector3[0].z, e.Tmp.Matrix[0]), e.Tmp.Matrix[0].invertToRef(e.Tmp.Matrix[2]), e.Matrix.RotationAxisToRef(i, r, e.Tmp.Matrix[1]), e.Tmp.Matrix[2].multiplyToRef(e.Tmp.Matrix[1], e.Tmp.Matrix[2]), e.Tmp.Matrix[2].multiplyToRef(e.Tmp.Matrix[0], e.Tmp.Matrix[2]), e.Tmp.Matrix[2].decompose(e.Tmp.Vector3[0], e.Tmp.Quaternion[0], e.Tmp.Vector3[1]), this.position.addInPlace(e.Tmp.Vector3[1]), e.Tmp.Quaternion[0].multiplyToRef(this.rotationQuaternion, this.rotationQuaternion), this
        }, i.prototype.translate = function(t, i, r) {
            var n = t.scale(i);
            if (r && r !== e.Space.LOCAL) this.setAbsolutePosition(this.getAbsolutePosition().add(n));
            else {
                var o = this.getPositionExpressedInLocalSpace().add(n);
                this.setPositionWithLocalVector(o)
            }
            return this
        }, i.prototype.addRotation = function(t, i, r) {
            var n;
            this.rotationQuaternion ? n = this.rotationQuaternion : (n = e.Tmp.Quaternion[1], e.Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, n));
            var o = e.Tmp.Quaternion[0];
            return e.Quaternion.RotationYawPitchRollToRef(i, t, r, o), n.multiplyInPlace(o), this.rotationQuaternion || n.toEulerAnglesToRef(this.rotation), this
        }, i.prototype.computeWorldMatrix = function(t) {
            if (this._isWorldMatrixFrozen) return this._worldMatrix;
            if (!t && this.isSynchronized(!0)) return this._worldMatrix;
            if (this._cache.position.copyFrom(this.position), this._cache.scaling.copyFrom(this.scaling), this._cache.pivotMatrixUpdated = !1, this._cache.billboardMode = this.billboardMode, this._currentRenderId = this.getScene().getRenderId(), this._isDirty = !1, e.Matrix.ScalingToRef(this.scaling.x * this.scalingDeterminant, this.scaling.y * this.scalingDeterminant, this.scaling.z * this.scalingDeterminant, e.Tmp.Matrix[1]), this.rotationQuaternion) {
                this.rotation.length() && (this.rotationQuaternion.multiplyInPlace(e.Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z)), this.rotation.copyFromFloats(0, 0, 0))
            }
            this.rotationQuaternion ? (this.rotationQuaternion.toRotationMatrix(e.Tmp.Matrix[0]), this._cache.rotationQuaternion.copyFrom(this.rotationQuaternion)) : (e.Matrix.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, e.Tmp.Matrix[0]), this._cache.rotation.copyFrom(this.rotation));
            var i = this.getScene().activeCamera;
            if (this.infiniteDistance && !this.parent && i) {
                var r = i.getWorldMatrix(),
                    n = new e.Vector3(r.m[12], r.m[13], r.m[14]);
                e.Matrix.TranslationToRef(this.position.x + n.x, this.position.y + n.y, this.position.z + n.z, e.Tmp.Matrix[2])
            } else e.Matrix.TranslationToRef(this.position.x, this.position.y, this.position.z, e.Tmp.Matrix[2]);
            if (this._pivotMatrix.multiplyToRef(e.Tmp.Matrix[1], e.Tmp.Matrix[4]), e.Tmp.Matrix[4].multiplyToRef(e.Tmp.Matrix[0], e.Tmp.Matrix[5]), this.billboardMode !== e.AbstractMesh.BILLBOARDMODE_NONE && i) {
                if ((this.billboardMode & e.AbstractMesh.BILLBOARDMODE_ALL) !== e.AbstractMesh.BILLBOARDMODE_ALL) {
                    var o = e.Tmp.Vector3[3];
                    this.parent && this.parent.getWorldMatrix ? this._transformToBoneReferal ? (this.parent.getWorldMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), e.Tmp.Matrix[6]), e.Vector3.TransformCoordinatesToRef(this.position, e.Tmp.Matrix[6], o)) : e.Vector3.TransformCoordinatesToRef(this.position, this.parent.getWorldMatrix(), o) : o.copyFrom(this.position), o.subtractInPlace(i.globalPosition);
                    var s = e.Tmp.Vector3[4].copyFromFloats(0, 0, 0);
                    (this.billboardMode & e.AbstractMesh.BILLBOARDMODE_X) === e.AbstractMesh.BILLBOARDMODE_X && (s.x = Math.atan2(-o.y, o.z)), (this.billboardMode & e.AbstractMesh.BILLBOARDMODE_Y) === e.AbstractMesh.BILLBOARDMODE_Y && (s.y = Math.atan2(o.x, o.z)), (this.billboardMode & e.AbstractMesh.BILLBOARDMODE_Z) === e.AbstractMesh.BILLBOARDMODE_Z && (s.z = Math.atan2(o.y, o.x)), e.Matrix.RotationYawPitchRollToRef(s.y, s.x, s.z, e.Tmp.Matrix[0])
                } else e.Tmp.Matrix[1].copyFrom(i.getViewMatrix()), e.Tmp.Matrix[1].setTranslationFromFloats(0, 0, 0), e.Tmp.Matrix[1].invertToRef(e.Tmp.Matrix[0]);
                e.Tmp.Matrix[1].copyFrom(e.Tmp.Matrix[5]), e.Tmp.Matrix[1].multiplyToRef(e.Tmp.Matrix[0], e.Tmp.Matrix[5])
            }
            return e.Tmp.Matrix[5].multiplyToRef(e.Tmp.Matrix[2], this._localWorld), this.parent && this.parent.getWorldMatrix ? (this.billboardMode !== e.AbstractMesh.BILLBOARDMODE_NONE ? (this._transformToBoneReferal ? (this.parent.getWorldMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), e.Tmp.Matrix[6]), e.Tmp.Matrix[5].copyFrom(e.Tmp.Matrix[6])) : e.Tmp.Matrix[5].copyFrom(this.parent.getWorldMatrix()), this._localWorld.getTranslationToRef(e.Tmp.Vector3[5]), e.Vector3.TransformCoordinatesToRef(e.Tmp.Vector3[5], e.Tmp.Matrix[5], e.Tmp.Vector3[5]), this._worldMatrix.copyFrom(this._localWorld), this._worldMatrix.setTranslation(e.Tmp.Vector3[5])) : this._transformToBoneReferal ? (this._localWorld.multiplyToRef(this.parent.getWorldMatrix(), e.Tmp.Matrix[6]), e.Tmp.Matrix[6].multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), this._worldMatrix)) : this._localWorld.multiplyToRef(this.parent.getWorldMatrix(), this._worldMatrix), this._markSyncedWithParent()) : this._worldMatrix.copyFrom(this._localWorld), this._postMultiplyPivotMatrix && this._worldMatrix.multiplyToRef(this._pivotMatrixInverse, this._worldMatrix), this.scaling.isNonUniform ? this._updateNonUniformScalingState(!0) : this.parent && this.parent._nonUniformScaling ? this._updateNonUniformScalingState(this.parent._nonUniformScaling) : this._updateNonUniformScalingState(!1), this._afterComputeWorldMatrix(), this._absolutePosition.copyFromFloats(this._worldMatrix.m[12], this._worldMatrix.m[13], this._worldMatrix.m[14]), this.onAfterWorldMatrixUpdateObservable.notifyObservers(this), this._poseMatrix || (this._poseMatrix = e.Matrix.Invert(this._worldMatrix)), this._worldMatrixDeterminant = this._worldMatrix.determinant(), this._worldMatrix
        }, i.prototype._afterComputeWorldMatrix = function() {}, i.prototype.registerAfterWorldMatrixUpdate = function(e) {
            return this.onAfterWorldMatrixUpdateObservable.add(e), this
        }, i.prototype.unregisterAfterWorldMatrixUpdate = function(e) {
            return this.onAfterWorldMatrixUpdateObservable.removeCallback(e), this
        }, i.prototype.clone = function(t, r, n) {
            var o = this,
                s = e.SerializationHelper.Clone((function() {
                    return new i(t, o.getScene())
                }), this);
            if (s.name = t, s.id = t, r && (s.parent = r), !n)
                for (var a = this.getDescendants(!0), l = 0; l < a.length; l++) {
                    var c = a[l];
                    c.clone && c.clone(t + "." + c.name, s)
                }
            return s
        }, i.prototype.serialize = function(t) {
            var i = e.SerializationHelper.Serialize(this, t);
            return i.type = this.getClassName(), this.parent && (i.parentId = this.parent.id), e.Tags && e.Tags.HasTags(this) && (i.tags = e.Tags.GetTags(this)), i.localMatrix = this.getPivotMatrix().asArray(), i.isEnabled = this.isEnabled(), this.parent && (i.parentId = this.parent.id), i
        }, i.Parse = function(t, r, n) {
            var o = e.SerializationHelper.Parse((function() {
                return new i(t.name, r)
            }), t, r, n);
            return e.Tags && e.Tags.AddTagsTo(o, t.tags), t.localMatrix ? o.setPreTransformMatrix(e.Matrix.FromArray(t.localMatrix)) : t.pivotMatrix && o.setPivotMatrix(e.Matrix.FromArray(t.pivotMatrix)), o.setEnabled(t.isEnabled), t.parentId && (o._waitingParentId = t.parentId), o
        }, i.prototype.dispose = function(e) {
            if (this.getScene().stopAnimation(this), this.getScene().removeTransformNode(this), e) {
                var i = this.getChildMeshes(!0);
                for (o = 0; o < i.length; o++) {
                    var r = i[o];
                    r.parent = null, r.computeWorldMatrix(!0)
                }
            } else
                for (var n = this.getDescendants(!0), o = 0; o < n.length; o++) n[o].dispose();
            this.onAfterWorldMatrixUpdateObservable.clear(), t.prototype.dispose.call(this)
        }, i.BILLBOARDMODE_NONE = 0, i.BILLBOARDMODE_X = 1, i.BILLBOARDMODE_Y = 2, i.BILLBOARDMODE_Z = 4, i.BILLBOARDMODE_ALL = 7, i._lookAtVectorCache = new e.Vector3(0, 0, 0), i._rotationAxisCache = new e.Quaternion, __decorate([e.serializeAsVector3()], i.prototype, "_rotation", void 0), __decorate([e.serializeAsQuaternion()], i.prototype, "_rotationQuaternion", void 0), __decorate([e.serializeAsVector3()], i.prototype, "_scaling", void 0), __decorate([e.serialize()], i.prototype, "billboardMode", void 0), __decorate([e.serialize()], i.prototype, "scalingDeterminant", void 0), __decorate([e.serialize()], i.prototype, "infiniteDistance", void 0), __decorate([e.serializeAsVector3()], i.prototype, "position", void 0), i
    })(e.Node);
    e.TransformNode = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(r, n) {
            void 0 === n && (n = null);
            var o = t.call(this, r, n, !1) || this;
            return o._facetNb = 0, o._partitioningSubdivisions = 10, o._partitioningBBoxRatio = 1.01, o._facetDataEnabled = !1, o._facetParameters = {}, o._bbSize = e.Vector3.Zero(), o._subDiv = {
                max: 1,
                X: 1,
                Y: 1,
                Z: 1
            }, o._facetDepthSort = !1, o._facetDepthSortEnabled = !1, o.onCollideObservable = new e.Observable, o.onCollisionPositionChangeObservable = new e.Observable, o.onMaterialChangedObservable = new e.Observable, o.definedFacingForward = !0, o.occlusionQueryAlgorithmType = i.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE, o.occlusionType = i.OCCLUSION_TYPE_NONE, o.occlusionRetryCount = -1, o._occlusionInternalRetryCounter = 0, o._isOccluded = !1, o._isOcclusionQueryInProgress = !1, o._visibility = 1, o.alphaIndex = Number.MAX_VALUE, o.isVisible = !0, o.isPickable = !0, o.showBoundingBox = !1, o.showSubMeshesBoundingBox = !1, o.isBlocker = !1, o.enablePointerMoveEvents = !1, o.renderingGroupId = 0, o._receiveShadows = !1, o.renderOutline = !1, o.outlineColor = e.Color3.Red(), o.outlineWidth = .02, o.renderOverlay = !1, o.overlayColor = e.Color3.Red(), o.overlayAlpha = .5, o._hasVertexAlpha = !1, o._useVertexColors = !0, o._computeBonesUsingShaders = !0, o._numBoneInfluencers = 4, o._applyFog = !0, o.useOctreeForRenderingSelection = !0, o.useOctreeForPicking = !0, o.useOctreeForCollisions = !0, o._layerMask = 268435455, o.alwaysSelectAsActiveMesh = !1, o.actionManager = null, o.physicsImpostor = null, o._checkCollisions = !1, o._collisionMask = -1, o._collisionGroup = -1, o.ellipsoid = new e.Vector3(.5, 1, .5), o.ellipsoidOffset = new e.Vector3(0, 0, 0), o._oldPositionForCollisions = new e.Vector3(0, 0, 0), o._diffPositionForCollisions = new e.Vector3(0, 0, 0), o.edgesWidth = 1, o.edgesColor = new e.Color4(1, 0, 0, 1), o._collisionsTransformMatrix = e.Matrix.Zero(), o._collisionsScalingMatrix = e.Matrix.Zero(), o._renderId = 0, o._intersectionsInProgress = new Array, o._unIndexed = !1, o._lightSources = new Array, o._onCollisionPositionChange = function(t, i, r) {
                void 0 === r && (r = null), o.getScene().workerCollisions && i.multiplyInPlace(o._collider._radius), i.subtractToRef(o._oldPositionForCollisions, o._diffPositionForCollisions), o._diffPositionForCollisions.length() > e.Engine.CollisionsEpsilon && o.position.addInPlace(o._diffPositionForCollisions), r && o.onCollideObservable.notifyObservers(r), o.onCollisionPositionChangeObservable.notifyObservers(o.position)
            }, o.getScene().addMesh(o), o._resyncLightSources(), o
        }
        return __extends(i, t), Object.defineProperty(i, "BILLBOARDMODE_NONE", {
            get: function() {
                return e.TransformNode.BILLBOARDMODE_NONE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "BILLBOARDMODE_X", {
            get: function() {
                return e.TransformNode.BILLBOARDMODE_X
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "BILLBOARDMODE_Y", {
            get: function() {
                return e.TransformNode.BILLBOARDMODE_Y
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "BILLBOARDMODE_Z", {
            get: function() {
                return e.TransformNode.BILLBOARDMODE_Z
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "BILLBOARDMODE_ALL", {
            get: function() {
                return e.TransformNode.BILLBOARDMODE_ALL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "facetNb", {
            get: function() {
                return this._facetNb
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "partitioningSubdivisions", {
            get: function() {
                return this._partitioningSubdivisions
            },
            set: function(e) {
                this._partitioningSubdivisions = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "partitioningBBoxRatio", {
            get: function() {
                return this._partitioningBBoxRatio
            },
            set: function(e) {
                this._partitioningBBoxRatio = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "mustDepthSortFacets", {
            get: function() {
                return this._facetDepthSort
            },
            set: function(e) {
                this._facetDepthSort = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "facetDepthSortFrom", {
            get: function() {
                return this._facetDepthSortFrom
            },
            set: function(e) {
                this._facetDepthSortFrom = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "isFacetDataEnabled", {
            get: function() {
                return this._facetDataEnabled
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._updateNonUniformScalingState = function(e) {
            return !!t.prototype._updateNonUniformScalingState.call(this, e) && (this._markSubMeshesAsMiscDirty(), !0)
        }, Object.defineProperty(i.prototype, "onCollide", {
            set: function(e) {
                this._onCollideObserver && this.onCollideObservable.remove(this._onCollideObserver), this._onCollideObserver = this.onCollideObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onCollisionPositionChange", {
            set: function(e) {
                this._onCollisionPositionChangeObserver && this.onCollisionPositionChangeObservable.remove(this._onCollisionPositionChangeObserver), this._onCollisionPositionChangeObserver = this.onCollisionPositionChangeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "isOccluded", {
            get: function() {
                return this._isOccluded
            },
            set: function(e) {
                this._isOccluded = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "isOcclusionQueryInProgress", {
            get: function() {
                return this._isOcclusionQueryInProgress
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "visibility", {
            get: function() {
                return this._visibility
            },
            set: function(e) {
                this._visibility !== e && (this._visibility = e, this._markSubMeshesAsMiscDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "material", {
            get: function() {
                return this._material
            },
            set: function(e) {
                if (this._material !== e && (this._material = e, this.onMaterialChangedObservable.hasObservers && this.onMaterialChangedObservable.notifyObservers(this), this.subMeshes))
                    for (var t = 0, i = this.subMeshes; t < i.length; t++) {
                        var r = i[t];
                        r.setEffect(null)
                    }
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "receiveShadows", {
            get: function() {
                return this._receiveShadows
            },
            set: function(e) {
                this._receiveShadows !== e && (this._receiveShadows = e, this._markSubMeshesAsLightDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "hasVertexAlpha", {
            get: function() {
                return this._hasVertexAlpha
            },
            set: function(e) {
                this._hasVertexAlpha !== e && (this._hasVertexAlpha = e, this._markSubMeshesAsAttributesDirty(), this._markSubMeshesAsMiscDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "useVertexColors", {
            get: function() {
                return this._useVertexColors
            },
            set: function(e) {
                this._useVertexColors !== e && (this._useVertexColors = e, this._markSubMeshesAsAttributesDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "computeBonesUsingShaders", {
            get: function() {
                return this._computeBonesUsingShaders
            },
            set: function(e) {
                this._computeBonesUsingShaders !== e && (this._computeBonesUsingShaders = e, this._markSubMeshesAsAttributesDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "numBoneInfluencers", {
            get: function() {
                return this._numBoneInfluencers
            },
            set: function(e) {
                this._numBoneInfluencers !== e && (this._numBoneInfluencers = e, this._markSubMeshesAsAttributesDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "applyFog", {
            get: function() {
                return this._applyFog
            },
            set: function(e) {
                this._applyFog !== e && (this._applyFog = e, this._markSubMeshesAsMiscDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "layerMask", {
            get: function() {
                return this._layerMask
            },
            set: function(e) {
                e !== this._layerMask && (this._layerMask = e, this._resyncLightSources())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "collisionMask", {
            get: function() {
                return this._collisionMask
            },
            set: function(e) {
                this._collisionMask = isNaN(e) ? -1 : e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "collisionGroup", {
            get: function() {
                return this._collisionGroup
            },
            set: function(e) {
                this._collisionGroup = isNaN(e) ? -1 : e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "_positions", {
            get: function() {
                return null
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "skeleton", {
            get: function() {
                return this._skeleton
            },
            set: function(e) {
                this._skeleton && this._skeleton.needInitialSkinMatrix && this._skeleton._unregisterMeshWithPoseMatrix(this), e && e.needInitialSkinMatrix && e._registerMeshWithPoseMatrix(this), this._skeleton = e, this._skeleton || (this._bonesTransformMatrices = null), this._markSubMeshesAsAttributesDirty()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "AbstractMesh"
        }, i.prototype.toString = function(t) {
            var i = "Name: " + this.name + ", isInstance: " + (this instanceof e.InstancedMesh ? "YES" : "NO");
            return i += ", # of submeshes: " + (this.subMeshes ? this.subMeshes.length : 0), this._skeleton && (i += ", skeleton: " + this._skeleton.name), t && (i += ", billboard mode: " + ["NONE", "X", "Y", null, "Z", null, null, "ALL"][this.billboardMode], i += ", freeze wrld mat: " + (this._isWorldMatrixFrozen || this._waitingFreezeWorldMatrix ? "YES" : "NO")), i
        }, i.prototype._rebuild = function() {
            if (this._occlusionQuery && (this._occlusionQuery = null), this._edgesRenderer && this._edgesRenderer._rebuild(), this.subMeshes)
                for (var e = 0, t = this.subMeshes; e < t.length; e++) {
                    var i = t[e];
                    i._rebuild()
                }
        }, i.prototype._resyncLightSources = function() {
            this._lightSources.length = 0;
            for (var e = 0, t = this.getScene().lights; e < t.length; e++) {
                var i = t[e];
                i.isEnabled() && (i.canAffectMesh(this) && this._lightSources.push(i))
            }
            this._markSubMeshesAsLightDirty()
        }, i.prototype._resyncLighSource = function(e) {
            var t = e.isEnabled() && e.canAffectMesh(this),
                i = this._lightSources.indexOf(e);
            if (-1 === i) {
                if (!t) return;
                this._lightSources.push(e)
            } else {
                if (t) return;
                this._lightSources.splice(i, 1)
            }
            this._markSubMeshesAsLightDirty()
        }, i.prototype._removeLightSource = function(e) {
            var t = this._lightSources.indexOf(e); - 1 !== t && (this._lightSources.splice(t, 1), this._markSubMeshesAsLightDirty())
        }, i.prototype._markSubMeshesAsDirty = function(e) {
            if (this.subMeshes)
                for (var t = 0, i = this.subMeshes; t < i.length; t++) {
                    var r = i[t];
                    r._materialDefines && e(r._materialDefines)
                }
        }, i.prototype._markSubMeshesAsLightDirty = function() {
            this._markSubMeshesAsDirty((function(e) {
                return e.markAsLightDirty()
            }))
        }, i.prototype._markSubMeshesAsAttributesDirty = function() {
            this._markSubMeshesAsDirty((function(e) {
                return e.markAsAttributesDirty()
            }))
        }, i.prototype._markSubMeshesAsMiscDirty = function() {
            if (this.subMeshes)
                for (var t = 0, i = this.subMeshes; t < i.length; t++) {
                    var r = i[t],
                        n = r.getMaterial();
                    n && n.markAsDirty(e.Material.MiscDirtyFlag)
                }
        }, Object.defineProperty(i.prototype, "scaling", {
            get: function() {
                return this._scaling
            },
            set: function(e) {
                this._scaling = e, this.physicsImpostor && this.physicsImpostor.forceUpdate()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.disableEdgesRendering = function() {
            return this._edgesRenderer && (this._edgesRenderer.dispose(), this._edgesRenderer = null), this
        }, i.prototype.enableEdgesRendering = function(t, i) {
            return void 0 === t && (t = .95), void 0 === i && (i = !1), this.disableEdgesRendering(), this._edgesRenderer = new e.EdgesRenderer(this, t, i), this
        }, Object.defineProperty(i.prototype, "isBlocked", {
            get: function() {
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getLOD = function(e) {
            return this
        }, i.prototype.getTotalVertices = function() {
            return 0
        }, i.prototype.getIndices = function() {
            return null
        }, i.prototype.getVerticesData = function(e) {
            return null
        }, i.prototype.setVerticesData = function(e, t, i, r) {
            return this
        }, i.prototype.updateVerticesData = function(e, t, i, r) {
            return this
        }, i.prototype.setIndices = function(e, t) {
            return this
        }, i.prototype.isVerticesDataPresent = function(e) {
            return !1
        }, i.prototype.getBoundingInfo = function() {
            return this._masterMesh ? this._masterMesh.getBoundingInfo() : (this._boundingInfo || this._updateBoundingInfo(), this._boundingInfo)
        }, i.prototype.normalizeToUnitCube = function(e) {
            void 0 === e && (e = !0);
            var t = this.getHierarchyBoundingVectors(e),
                i = t.max.subtract(t.min),
                r = Math.max(i.x, i.y, i.z);
            if (0 === r) return this;
            var n = 1 / r;
            return this.scaling.scaleInPlace(n), this
        }, i.prototype.setBoundingInfo = function(e) {
            return this._boundingInfo = e, this
        }, Object.defineProperty(i.prototype, "useBones", {
            get: function() {
                return this.skeleton && this.getScene().skeletonsEnabled && this.isVerticesDataPresent(e.VertexBuffer.MatricesIndicesKind) && this.isVerticesDataPresent(e.VertexBuffer.MatricesWeightsKind)
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._preActivate = function() {}, i.prototype._preActivateForIntermediateRendering = function(e) {}, i.prototype._activate = function(e) {
            this._renderId = e
        }, i.prototype.getWorldMatrix = function() {
            return this._masterMesh ? this._masterMesh.getWorldMatrix() : t.prototype.getWorldMatrix.call(this)
        }, i.prototype._getWorldMatrixDeterminant = function() {
            return this._masterMesh ? this._masterMesh._getWorldMatrixDeterminant() : t.prototype._getWorldMatrixDeterminant.call(this)
        }, i.prototype.movePOV = function(e, t, i) {
            return this.position.addInPlace(this.calcMovePOV(e, t, i)), this
        }, i.prototype.calcMovePOV = function(t, i, r) {
            var n = new e.Matrix;
            (this.rotationQuaternion ? this.rotationQuaternion : e.Quaternion.RotationYawPitchRoll(this.rotation.y, this.rotation.x, this.rotation.z)).toRotationMatrix(n);
            var o = e.Vector3.Zero(),
                s = this.definedFacingForward ? -1 : 1;
            return e.Vector3.TransformCoordinatesFromFloatsToRef(t * s, i, r * s, n, o), o
        }, i.prototype.rotatePOV = function(e, t, i) {
            return this.rotation.addInPlace(this.calcRotatePOV(e, t, i)), this
        }, i.prototype.calcRotatePOV = function(t, i, r) {
            var n = this.definedFacingForward ? 1 : -1;
            return new e.Vector3(t * n, i, r * n)
        }, i.prototype.getHierarchyBoundingVectors = function(t) {
            void 0 === t && (t = !0), this.computeWorldMatrix(!0);
            var i, r, n = this.getBoundingInfo();
            if (this.subMeshes ? (i = n.boundingBox.minimumWorld, r = n.boundingBox.maximumWorld) : (i = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), r = new e.Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE)), t)
                for (var o = this.getDescendants(!1), s = 0, a = o; s < a.length; s++) {
                    var l = a[s],
                        c = l;
                    if (c.computeWorldMatrix(!0), c.getBoundingInfo && 0 !== c.getTotalVertices()) {
                        var h = c.getBoundingInfo(),
                            u = h.boundingBox,
                            f = u.minimumWorld,
                            d = u.maximumWorld;
                        e.Tools.CheckExtends(f, i, r), e.Tools.CheckExtends(d, i, r)
                    }
                }
            return {
                min: i,
                max: r
            }
        }, i.prototype._updateBoundingInfo = function() {
            return this._boundingInfo = this._boundingInfo || new e.BoundingInfo(this.absolutePosition, this.absolutePosition), this._boundingInfo.update(this.worldMatrixFromCache), this._updateSubMeshesBoundingInfo(this.worldMatrixFromCache), this
        }, i.prototype._updateSubMeshesBoundingInfo = function(e) {
            if (!this.subMeshes) return this;
            for (var t = 0; t < this.subMeshes.length; t++) {
                var i = this.subMeshes[t];
                i.IsGlobal || i.updateBoundingInfo(e)
            }
            return this
        }, i.prototype._afterComputeWorldMatrix = function() {
            this._updateBoundingInfo()
        }, i.prototype.isInFrustum = function(e) {
            return null !== this._boundingInfo && this._boundingInfo.isInFrustum(e)
        }, i.prototype.isCompletelyInFrustum = function(e) {
            return null !== this._boundingInfo && this._boundingInfo.isCompletelyInFrustum(e)
        }, i.prototype.intersectsMesh = function(e, t, i) {
            if (void 0 === t && (t = !1), !this._boundingInfo || !e._boundingInfo) return !1;
            if (this._boundingInfo.intersects(e._boundingInfo, t)) return !0;
            if (i)
                for (var r = 0, n = this.getChildMeshes(); r < n.length; r++) {
                    var o = n[r];
                    if (o.intersectsMesh(e, t, !0)) return !0
                }
            return !1
        }, i.prototype.intersectsPoint = function(e) {
            return !!this._boundingInfo && this._boundingInfo.intersectsPoint(e)
        }, i.prototype.getPhysicsImpostor = function() {
            return this.physicsImpostor
        }, i.prototype.getPositionInCameraSpace = function(t) {
            return void 0 === t && (t = null), t || (t = this.getScene().activeCamera), e.Vector3.TransformCoordinates(this.absolutePosition, t.getViewMatrix())
        }, i.prototype.getDistanceToCamera = function(e) {
            return void 0 === e && (e = null), e || (e = this.getScene().activeCamera), this.absolutePosition.subtract(e.position).length()
        }, i.prototype.applyImpulse = function(e, t) {
            return this.physicsImpostor ? (this.physicsImpostor.applyImpulse(e, t), this) : this
        }, i.prototype.setPhysicsLinkWith = function(t, i, r, n) {
            return this.physicsImpostor && t.physicsImpostor ? (this.physicsImpostor.createJoint(t.physicsImpostor, e.PhysicsJoint.HingeJoint, {
                mainPivot: i,
                connectedPivot: r,
                nativeParams: n
            }), this) : this
        }, Object.defineProperty(i.prototype, "checkCollisions", {
            get: function() {
                return this._checkCollisions
            },
            set: function(e) {
                this._checkCollisions = e, this.getScene().workerCollisions && this.getScene().collisionCoordinator.onMeshUpdated(this)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "collider", {
            get: function() {
                return this._collider
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.moveWithCollisions = function(t) {
            return this.getAbsolutePosition().addToRef(this.ellipsoidOffset, this._oldPositionForCollisions), this._collider || (this._collider = new e.Collider), this._collider._radius = this.ellipsoid, this.getScene().collisionCoordinator.getNewPosition(this._oldPositionForCollisions, t, this._collider, 3, this, this._onCollisionPositionChange, this.uniqueId), this
        }, i.prototype.createOrUpdateSubmeshesOctree = function(t, i) {
            void 0 === t && (t = 64), void 0 === i && (i = 2), this._submeshesOctree || (this._submeshesOctree = new e.Octree(e.Octree.CreationFuncForSubMeshes, t, i)), this.computeWorldMatrix(!0);
            var r = this.getBoundingInfo(),
                n = r.boundingBox;
            return this._submeshesOctree.update(n.minimumWorld, n.maximumWorld, this.subMeshes), this._submeshesOctree
        }, i.prototype._collideForSubMesh = function(t, i, r) {
            if (this._generatePointsArray(), !this._positions) return this;
            if (!t._lastColliderWorldVertices || !t._lastColliderTransformMatrix.equals(i)) {
                t._lastColliderTransformMatrix = i.clone(), t._lastColliderWorldVertices = [], t._trianglePlanes = [];
                for (var n = t.verticesStart, o = t.verticesStart + t.verticesCount, s = n; s < o; s++) t._lastColliderWorldVertices.push(e.Vector3.TransformCoordinates(this._positions[s], i))
            }
            return r._collide(t._trianglePlanes, t._lastColliderWorldVertices, this.getIndices(), t.indexStart, t.indexStart + t.indexCount, t.verticesStart, !!t.getMaterial()), r.collisionFound && (r.collidedMesh = this), this
        }, i.prototype._processCollisionsForSubMeshes = function(e, t) {
            var i, r;
            if (this._submeshesOctree && this.useOctreeForCollisions) {
                var n = e._velocityWorldLength + Math.max(e._radius.x, e._radius.y, e._radius.z),
                    o = this._submeshesOctree.intersects(e._basePointWorld, n);
                r = o.length, i = o.data
            } else i = this.subMeshes, r = i.length;
            for (var s = 0; s < r; s++) {
                var a = i[s];
                r > 1 && !a._checkCollision(e) || this._collideForSubMesh(a, t, e)
            }
            return this
        }, i.prototype._checkCollision = function(t) {
            return this._boundingInfo && this._boundingInfo._checkCollision(t) ? (e.Matrix.ScalingToRef(1 / t._radius.x, 1 / t._radius.y, 1 / t._radius.z, this._collisionsScalingMatrix), this.worldMatrixFromCache.multiplyToRef(this._collisionsScalingMatrix, this._collisionsTransformMatrix), this._processCollisionsForSubMeshes(t, this._collisionsTransformMatrix), this) : this
        }, i.prototype._generatePointsArray = function() {
            return !1
        }, i.prototype.intersects = function(t, i) {
            var r = new e.PickingInfo;
            if (!(this.subMeshes && this._boundingInfo && t.intersectsSphere(this._boundingInfo.boundingSphere) && t.intersectsBox(this._boundingInfo.boundingBox))) return r;
            if (!this._generatePointsArray()) return r;
            var n, o, s = null;
            if (this._submeshesOctree && this.useOctreeForPicking) {
                var a = e.Ray.Transform(t, this.getWorldMatrix()),
                    l = this._submeshesOctree.intersectsRay(a);
                o = l.length, n = l.data
            } else n = this.subMeshes, o = n.length;
            for (var c = 0; c < o; c++) {
                var h = n[c];
                if (!(o > 1) || h.canIntersects(t)) {
                    var u = h.intersects(t, this._positions, this.getIndices(), i);
                    if (u && (i || !s || u.distance < s.distance) && (s = u, s.subMeshId = c, i)) break
                }
            }
            if (s) {
                var f = this.getWorldMatrix(),
                    d = e.Vector3.TransformCoordinates(t.origin, f),
                    p = t.direction.clone();
                p = p.scale(s.distance);
                var _ = e.Vector3.TransformNormal(p, f),
                    m = d.add(_);
                return r.hit = !0, r.distance = e.Vector3.Distance(d, m), r.pickedPoint = m, r.pickedMesh = this, r.bu = s.bu || 0, r.bv = s.bv || 0, r.faceId = s.faceId, r.subMeshId = s.subMeshId, r
            }
            return r
        }, i.prototype.clone = function(e, t, i) {
            return null
        }, i.prototype.releaseSubMeshes = function() {
            if (this.subMeshes)
                for (; this.subMeshes.length;) this.subMeshes[0].dispose();
            else this.subMeshes = new Array;
            return this
        }, i.prototype.dispose = function(e, i) {
            var r = this;
            void 0 === i && (i = !1);
            var n;
            for (void 0 !== this.actionManager && null !== this.actionManager && (this.actionManager.dispose(), this.actionManager = null), this.skeleton = null, this.physicsImpostor && this.physicsImpostor.dispose(), n = 0; n < this._intersectionsInProgress.length; n++) {
                var o = this._intersectionsInProgress[n],
                    s = o._intersectionsInProgress.indexOf(this);
                o._intersectionsInProgress.splice(s, 1)
            }
            this._intersectionsInProgress = [], this.getScene().lights.forEach((function(e) {
                var t = e.includedOnlyMeshes.indexOf(r); - 1 !== t && e.includedOnlyMeshes.splice(t, 1), -1 !== (t = e.excludedMeshes.indexOf(r)) && e.excludedMeshes.splice(t, 1);
                var i = e.getShadowGenerator();
                if (i) {
                    var n = i.getShadowMap();
                    n && n.renderList && -1 !== (t = n.renderList.indexOf(r)) && n.renderList.splice(t, 1)
                }
            })), this._edgesRenderer && (this._edgesRenderer.dispose(), this._edgesRenderer = null), "InstancedMesh" !== this.getClassName() && this.releaseSubMeshes();
            var a = this.getScene().selectionOctree;
            if (void 0 !== a && null !== a) {
                var n = a.dynamicContent.indexOf(this); - 1 !== n && a.dynamicContent.splice(n, 1)
            }
            var l = this.getScene().getEngine();
            if (this._occlusionQuery && (this._isOcclusionQueryInProgress = !1, l.deleteQuery(this._occlusionQuery), this._occlusionQuery = null), l.wipeCaches(), this.getScene().removeMesh(this), i && this.material && this.material.dispose(!1, !0), !e)
                for (n = 0; n < this.getScene().particleSystems.length; n++) this.getScene().particleSystems[n].emitter === this && (this.getScene().particleSystems[n].dispose(), n--);
            this._facetDataEnabled && this.disableFacetData(), this.onAfterWorldMatrixUpdateObservable.clear(), this.onCollideObservable.clear(), this.onCollisionPositionChangeObservable.clear(), t.prototype.dispose.call(this, e)
        }, i.prototype.addChild = function(e) {
            return e.setParent(this), this
        }, i.prototype.removeChild = function(e) {
            return e.setParent(null), this
        }, i.prototype._initFacetData = function() {
            this._facetNormals || (this._facetNormals = new Array), this._facetPositions || (this._facetPositions = new Array), this._facetPartitioning || (this._facetPartitioning = new Array), this._facetNb = this.getIndices().length / 3 | 0, this._partitioningSubdivisions = this._partitioningSubdivisions ? this._partitioningSubdivisions : 10, this._partitioningBBoxRatio = this._partitioningBBoxRatio ? this._partitioningBBoxRatio : 1.01;
            for (var t = 0; t < this._facetNb; t++) this._facetNormals[t] = e.Vector3.Zero(), this._facetPositions[t] = e.Vector3.Zero();
            return this._facetDataEnabled = !0, this
        }, i.prototype.updateFacetData = function() {
            this._facetDataEnabled || this._initFacetData();
            var t = this.getVerticesData(e.VertexBuffer.PositionKind),
                i = this.getIndices(),
                r = this.getVerticesData(e.VertexBuffer.NormalKind),
                n = this.getBoundingInfo();
            if (this._facetDepthSort && !this._facetDepthSortEnabled) {
                if (this._facetDepthSortEnabled = !0, i instanceof Uint16Array) this._depthSortedIndices = new Uint16Array(i);
                else if (i instanceof Uint32Array) this._depthSortedIndices = new Uint32Array(i);
                else {
                    for (var o = !1, s = 0; s < i.length; s++)
                        if (i[s] > 65535) {
                            o = !0;
                            break
                        }
                    this._depthSortedIndices = o ? new Uint32Array(i) : new Uint16Array(i)
                }
                if (this._facetDepthSortFunction = function(e, t) {
                        return t.sqDistance - e.sqDistance
                    }, !this._facetDepthSortFrom) {
                    var a = this.getScene().activeCamera;
                    this._facetDepthSortFrom = a ? a.position : e.Vector3.Zero()
                }
                this._depthSortedFacets = [];
                for (var l = 0; l < this._facetNb; l++) {
                    var c = {
                        ind: 3 * l,
                        sqDistance: 0
                    };
                    this._depthSortedFacets.push(c)
                }
                this._invertedMatrix = e.Matrix.Identity(), this._facetDepthSortOrigin = e.Vector3.Zero()
            }
            this._bbSize.x = n.maximum.x - n.minimum.x > e.Epsilon ? n.maximum.x - n.minimum.x : e.Epsilon, this._bbSize.y = n.maximum.y - n.minimum.y > e.Epsilon ? n.maximum.y - n.minimum.y : e.Epsilon, this._bbSize.z = n.maximum.z - n.minimum.z > e.Epsilon ? n.maximum.z - n.minimum.z : e.Epsilon;
            var h = this._bbSize.x > this._bbSize.y ? this._bbSize.x : this._bbSize.y;
            if (h = h > this._bbSize.z ? h : this._bbSize.z, this._subDiv.max = this._partitioningSubdivisions, this._subDiv.X = Math.floor(this._subDiv.max * this._bbSize.x / h), this._subDiv.Y = Math.floor(this._subDiv.max * this._bbSize.y / h), this._subDiv.Z = Math.floor(this._subDiv.max * this._bbSize.z / h), this._subDiv.X = this._subDiv.X < 1 ? 1 : this._subDiv.X, this._subDiv.Y = this._subDiv.Y < 1 ? 1 : this._subDiv.Y, this._subDiv.Z = this._subDiv.Z < 1 ? 1 : this._subDiv.Z, this._facetParameters.facetNormals = this.getFacetLocalNormals(), this._facetParameters.facetPositions = this.getFacetLocalPositions(), this._facetParameters.facetPartitioning = this.getFacetLocalPartitioning(), this._facetParameters.bInfo = n, this._facetParameters.bbSize = this._bbSize, this._facetParameters.subDiv = this._subDiv, this._facetParameters.ratio = this.partitioningBBoxRatio, this._facetParameters.depthSort = this._facetDepthSort, this._facetDepthSort && this._facetDepthSortEnabled && (this.computeWorldMatrix(!0), this._worldMatrix.invertToRef(this._invertedMatrix), e.Vector3.TransformCoordinatesToRef(this._facetDepthSortFrom, this._invertedMatrix, this._facetDepthSortOrigin), this._facetParameters.distanceTo = this._facetDepthSortOrigin), this._facetParameters.depthSortedFacets = this._depthSortedFacets, e.VertexData.ComputeNormals(t, i, r, this._facetParameters), this._facetDepthSort && this._facetDepthSortEnabled) {
                this._depthSortedFacets.sort(this._facetDepthSortFunction);
                for (var u = this._depthSortedIndices.length / 3 | 0, l = 0; l < u; l++) {
                    var f = this._depthSortedFacets[l].ind;
                    this._depthSortedIndices[3 * l] = i[f], this._depthSortedIndices[3 * l + 1] = i[f + 1], this._depthSortedIndices[3 * l + 2] = i[f + 2]
                }
                this.updateIndices(this._depthSortedIndices)
            }
            return this
        }, i.prototype.getFacetLocalNormals = function() {
            return this._facetNormals || this.updateFacetData(), this._facetNormals
        }, i.prototype.getFacetLocalPositions = function() {
            return this._facetPositions || this.updateFacetData(), this._facetPositions
        }, i.prototype.getFacetLocalPartitioning = function() {
            return this._facetPartitioning || this.updateFacetData(), this._facetPartitioning
        }, i.prototype.getFacetPosition = function(t) {
            var i = e.Vector3.Zero();
            return this.getFacetPositionToRef(t, i), i
        }, i.prototype.getFacetPositionToRef = function(t, i) {
            var r = this.getFacetLocalPositions()[t],
                n = this.getWorldMatrix();
            return e.Vector3.TransformCoordinatesToRef(r, n, i), this
        }, i.prototype.getFacetNormal = function(t) {
            var i = e.Vector3.Zero();
            return this.getFacetNormalToRef(t, i), i
        }, i.prototype.getFacetNormalToRef = function(t, i) {
            var r = this.getFacetLocalNormals()[t];
            return e.Vector3.TransformNormalToRef(r, this.getWorldMatrix(), i), this
        }, i.prototype.getFacetsAtLocalCoordinates = function(e, t, i) {
            var r = this.getBoundingInfo(),
                n = Math.floor((e - r.minimum.x * this._partitioningBBoxRatio) * this._subDiv.X * this._partitioningBBoxRatio / this._bbSize.x),
                o = Math.floor((t - r.minimum.y * this._partitioningBBoxRatio) * this._subDiv.Y * this._partitioningBBoxRatio / this._bbSize.y),
                s = Math.floor((i - r.minimum.z * this._partitioningBBoxRatio) * this._subDiv.Z * this._partitioningBBoxRatio / this._bbSize.z);
            return n < 0 || n > this._subDiv.max || o < 0 || o > this._subDiv.max || s < 0 || s > this._subDiv.max ? null : this._facetPartitioning[n + this._subDiv.max * o + this._subDiv.max * this._subDiv.max * s]
        }, i.prototype.getClosestFacetAtCoordinates = function(t, i, r, n, o, s) {
            void 0 === o && (o = !1), void 0 === s && (s = !0);
            var a = this.getWorldMatrix(),
                l = e.Tmp.Matrix[5];
            a.invertToRef(l);
            var c = e.Tmp.Vector3[8];
            e.Vector3.TransformCoordinatesFromFloatsToRef(t, i, r, l, c);
            var h = this.getClosestFacetAtLocalCoordinates(c.x, c.y, c.z, n, o, s);
            return n && e.Vector3.TransformCoordinatesFromFloatsToRef(n.x, n.y, n.z, a, n), h
        }, i.prototype.getClosestFacetAtLocalCoordinates = function(e, t, i, r, n, o) {
            void 0 === n && (n = !1), void 0 === o && (o = !0);
            var s = null,
                a = 0,
                l = 0,
                c = 0,
                h = 0,
                u = 0,
                f = 0,
                d = 0,
                p = 0,
                _ = this.getFacetLocalPositions(),
                m = this.getFacetLocalNormals(),
                g = this.getFacetsAtLocalCoordinates(e, t, i);
            if (!g) return null;
            for (var v, y, b, x = Number.MAX_VALUE, T = x, E = 0; E < g.length; E++) v = g[E], y = m[v], b = _[v], h = (e - b.x) * y.x + (t - b.y) * y.y + (i - b.z) * y.z, (!n || n && o && h >= 0 || n && !o && h <= 0) && (h = y.x * b.x + y.y * b.y + y.z * b.z, u = -(y.x * e + y.y * t + y.z * i - h) / (y.x * y.x + y.y * y.y + y.z * y.z), f = e + y.x * u, d = t + y.y * u, p = i + y.z * u, a = f - e, l = d - t, c = p - i, (T = a * a + l * l + c * c) < x && (x = T, s = v, r && (r.x = f, r.y = d, r.z = p)));
            return s
        }, i.prototype.getFacetDataParameters = function() {
            return this._facetParameters
        }, i.prototype.disableFacetData = function() {
            return this._facetDataEnabled && (this._facetDataEnabled = !1, this._facetPositions = new Array, this._facetNormals = new Array, this._facetPartitioning = new Array, this._facetParameters = null, this._depthSortedIndices = new Uint32Array(0)), this
        }, i.prototype.updateIndices = function(e) {
            return this
        }, i.prototype.createNormals = function(t) {
            var i, r = this.getVerticesData(e.VertexBuffer.PositionKind),
                n = this.getIndices();
            i = this.isVerticesDataPresent(e.VertexBuffer.NormalKind) ? this.getVerticesData(e.VertexBuffer.NormalKind) : [], e.VertexData.ComputeNormals(r, n, i, {
                useRightHandedSystem: this.getScene().useRightHandedSystem
            }), this.setVerticesData(e.VertexBuffer.NormalKind, i, t)
        }, i.prototype.alignWithNormal = function(t, i) {
            i || (i = e.Axis.Y);
            var r = e.Tmp.Vector3[0],
                n = e.Tmp.Vector3[1];
            return e.Vector3.CrossToRef(i, t, n), e.Vector3.CrossToRef(t, n, r), this.rotationQuaternion ? e.Quaternion.RotationQuaternionFromAxisToRef(r, t, n, this.rotationQuaternion) : e.Vector3.RotationFromAxisToRef(r, t, n, this.rotation), this
        }, i.prototype.checkOcclusionQuery = function() {
            var e = this.getEngine();
            if (e.webGLVersion < 2 || this.occlusionType === i.OCCLUSION_TYPE_NONE) return void(this._isOccluded = !1);
            if (this.isOcclusionQueryInProgress && this._occlusionQuery) {
                if (e.isQueryResultAvailable(this._occlusionQuery)) {
                    var t = e.getQueryResult(this._occlusionQuery);
                    this._isOcclusionQueryInProgress = !1, this._occlusionInternalRetryCounter = 0, this._isOccluded = 1 !== t
                } else {
                    if (this._occlusionInternalRetryCounter++, !(-1 !== this.occlusionRetryCount && this._occlusionInternalRetryCounter > this.occlusionRetryCount)) return;
                    this._isOcclusionQueryInProgress = !1, this._occlusionInternalRetryCounter = 0, this._isOccluded = this.occlusionType !== i.OCCLUSION_TYPE_OPTIMISTIC && this._isOccluded
                }
            }
            var r = this.getScene(),
                n = r.getBoundingBoxRenderer();
            this._occlusionQuery || (this._occlusionQuery = e.createQuery()), e.beginOcclusionQuery(this.occlusionQueryAlgorithmType, this._occlusionQuery), n.renderOcclusionBoundingBox(this), e.endOcclusionQuery(this.occlusionQueryAlgorithmType), this._isOcclusionQueryInProgress = !0
        }, i.OCCLUSION_TYPE_NONE = 0, i.OCCLUSION_TYPE_OPTIMISTIC = 1, i.OCCLUSION_TYPE_STRICT = 2, i.OCCLUSION_ALGORITHM_TYPE_ACCURATE = 0, i.OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE = 1, i
    })(e.TransformNode);
    e.AbstractMesh = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(r, n) {
            var o = t.call(this, r, n) || this;
            return o.diffuse = new e.Color3(1, 1, 1), o.specular = new e.Color3(1, 1, 1), o.intensity = 1, o.range = Number.MAX_VALUE, o._photometricScale = 1, o._intensityMode = i.INTENSITYMODE_AUTOMATIC, o._radius = 1e-5, o.renderPriority = 0, o.shadowEnabled = !0, o._excludeWithLayerMask = 0, o._includeOnlyWithLayerMask = 0, o._lightmapMode = 0, o._excludedMeshesIds = new Array, o._includedOnlyMeshesIds = new Array, o.getScene().addLight(o), o._uniformBuffer = new e.UniformBuffer(o.getScene().getEngine()), o._buildUniformLayout(), o.includedOnlyMeshes = new Array, o.excludedMeshes = new Array, o._resyncMeshes(), o
        }
        return __extends(i, t), Object.defineProperty(i, "LIGHTMAP_DEFAULT", {
            get: function() {
                return i._LIGHTMAP_DEFAULT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "LIGHTMAP_SPECULAR", {
            get: function() {
                return i._LIGHTMAP_SPECULAR
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "LIGHTMAP_SHADOWSONLY", {
            get: function() {
                return i._LIGHTMAP_SHADOWSONLY
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "INTENSITYMODE_AUTOMATIC", {
            get: function() {
                return i._INTENSITYMODE_AUTOMATIC
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "INTENSITYMODE_LUMINOUSPOWER", {
            get: function() {
                return i._INTENSITYMODE_LUMINOUSPOWER
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "INTENSITYMODE_LUMINOUSINTENSITY", {
            get: function() {
                return i._INTENSITYMODE_LUMINOUSINTENSITY
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "INTENSITYMODE_ILLUMINANCE", {
            get: function() {
                return i._INTENSITYMODE_ILLUMINANCE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "INTENSITYMODE_LUMINANCE", {
            get: function() {
                return i._INTENSITYMODE_LUMINANCE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "LIGHTTYPEID_POINTLIGHT", {
            get: function() {
                return i._LIGHTTYPEID_POINTLIGHT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "LIGHTTYPEID_DIRECTIONALLIGHT", {
            get: function() {
                return i._LIGHTTYPEID_DIRECTIONALLIGHT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "LIGHTTYPEID_SPOTLIGHT", {
            get: function() {
                return i._LIGHTTYPEID_SPOTLIGHT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "LIGHTTYPEID_HEMISPHERICLIGHT", {
            get: function() {
                return i._LIGHTTYPEID_HEMISPHERICLIGHT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "intensityMode", {
            get: function() {
                return this._intensityMode
            },
            set: function(e) {
                this._intensityMode = e, this._computePhotometricScale()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "radius", {
            get: function() {
                return this._radius
            },
            set: function(e) {
                this._radius = e, this._computePhotometricScale()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "includedOnlyMeshes", {
            get: function() {
                return this._includedOnlyMeshes
            },
            set: function(e) {
                this._includedOnlyMeshes = e, this._hookArrayForIncludedOnly(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "excludedMeshes", {
            get: function() {
                return this._excludedMeshes
            },
            set: function(e) {
                this._excludedMeshes = e, this._hookArrayForExcluded(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "excludeWithLayerMask", {
            get: function() {
                return this._excludeWithLayerMask
            },
            set: function(e) {
                this._excludeWithLayerMask = e, this._resyncMeshes()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "includeOnlyWithLayerMask", {
            get: function() {
                return this._includeOnlyWithLayerMask
            },
            set: function(e) {
                this._includeOnlyWithLayerMask = e, this._resyncMeshes()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "lightmapMode", {
            get: function() {
                return this._lightmapMode
            },
            set: function(e) {
                this._lightmapMode !== e && (this._lightmapMode = e, this._markMeshesAsLightDirty())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "Light"
        }, i.prototype.toString = function(e) {
            var t = "Name: " + this.name;
            if (t += ", type: " + ["Point", "Directional", "Spot", "Hemispheric"][this.getTypeID()], this.animations)
                for (var i = 0; i < this.animations.length; i++) t += ", animation[0]: " + this.animations[i].toString(e);
            return t
        }, i.prototype.setEnabled = function(e) {
            t.prototype.setEnabled.call(this, e), this._resyncMeshes()
        }, i.prototype.getShadowGenerator = function() {
            return this._shadowGenerator
        }, i.prototype.getAbsolutePosition = function() {
            return e.Vector3.Zero()
        }, i.prototype.canAffectMesh = function(e) {
            return !e || !(this.includedOnlyMeshes && this.includedOnlyMeshes.length > 0 && -1 === this.includedOnlyMeshes.indexOf(e)) && (!(this.excludedMeshes && this.excludedMeshes.length > 0 && -1 !== this.excludedMeshes.indexOf(e)) && ((0 === this.includeOnlyWithLayerMask || 0 != (this.includeOnlyWithLayerMask & e.layerMask)) && !(0 !== this.excludeWithLayerMask && this.excludeWithLayerMask & e.layerMask)))
        }, i.prototype.getWorldMatrix = function() {
            this._currentRenderId = this.getScene().getRenderId();
            var t = this._getWorldMatrix();
            return this.parent && this.parent.getWorldMatrix ? (this._parentedWorldMatrix || (this._parentedWorldMatrix = e.Matrix.Identity()), t.multiplyToRef(this.parent.getWorldMatrix(), this._parentedWorldMatrix), this._markSyncedWithParent(), this._parentedWorldMatrix) : t
        }, i.CompareLightsPriority = function(e, t) {
            return e.shadowEnabled !== t.shadowEnabled ? (t.shadowEnabled ? 1 : 0) - (e.shadowEnabled ? 1 : 0) : t.renderPriority - e.renderPriority
        }, i.prototype.dispose = function() {
            this._shadowGenerator && (this._shadowGenerator.dispose(), this._shadowGenerator = null), this.getScene().stopAnimation(this);
            for (var e = 0, i = this.getScene().meshes; e < i.length; e++) {
                i[e]._removeLightSource(this)
            }
            this._uniformBuffer.dispose(), this.getScene().removeLight(this), t.prototype.dispose.call(this)
        }, i.prototype.getTypeID = function() {
            return 0
        }, i.prototype.getScaledIntensity = function() {
            return this._photometricScale * this.intensity
        }, i.prototype.clone = function(t) {
            var r = i.GetConstructorFromName(this.getTypeID(), t, this.getScene());
            return r ? e.SerializationHelper.Clone(r, this) : null
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.type = this.getTypeID(), this.parent && (t.parentId = this.parent.id), this.excludedMeshes.length > 0 && (t.excludedMeshesIds = [], this.excludedMeshes.forEach((function(e) {
                t.excludedMeshesIds.push(e.id)
            }))), this.includedOnlyMeshes.length > 0 && (t.includedOnlyMeshesIds = [], this.includedOnlyMeshes.forEach((function(e) {
                t.includedOnlyMeshesIds.push(e.id)
            }))), e.Animation.AppendSerializedAnimations(this, t), t.ranges = this.serializeAnimationRanges(), t
        }, i.GetConstructorFromName = function(t, i, r) {
            switch (t) {
                case 0:
                    return function() {
                        return new e.PointLight(i, e.Vector3.Zero(), r)
                    };
                case 1:
                    return function() {
                        return new e.DirectionalLight(i, e.Vector3.Zero(), r)
                    };
                case 2:
                    return function() {
                        return new e.SpotLight(i, e.Vector3.Zero(), e.Vector3.Zero(), 0, 0, r)
                    };
                case 3:
                    return function() {
                        return new e.HemisphericLight(i, e.Vector3.Zero(), r)
                    }
            }
            return null
        }, i.Parse = function(t, r) {
            var n = i.GetConstructorFromName(t.type, t.name, r);
            if (!n) return null;
            var o = e.SerializationHelper.Parse(n, t, r);
            if (t.excludedMeshesIds && (o._excludedMeshesIds = t.excludedMeshesIds), t.includedOnlyMeshesIds && (o._includedOnlyMeshesIds = t.includedOnlyMeshesIds), t.parentId && (o._waitingParentId = t.parentId), t.animations) {
                for (var s = 0; s < t.animations.length; s++) {
                    var a = t.animations[s];
                    o.animations.push(e.Animation.Parse(a))
                }
                e.Node.ParseAnimationRanges(o, t, r)
            }
            return t.autoAnimate && r.beginAnimation(o, t.autoAnimateFrom, t.autoAnimateTo, t.autoAnimateLoop, t.autoAnimateSpeed || 1), o
        }, i.prototype._hookArrayForExcluded = function(e) {
            var t = this,
                i = e.push;
            e.push = function() {
                for (var r = [], n = 0; n < arguments.length; n++) r[n] = arguments[n];
                for (var o = i.apply(e, r), s = 0, a = r; s < a.length; s++) {
                    a[s]._resyncLighSource(t)
                }
                return o
            };
            var r = e.splice;
            e.splice = function(i, n) {
                for (var o = r.apply(e, [i, n]), s = 0, a = o; s < a.length; s++) {
                    a[s]._resyncLighSource(t)
                }
                return o
            };
            for (var n = 0, o = e; n < o.length; n++) {
                o[n]._resyncLighSource(this)
            }
        }, i.prototype._hookArrayForIncludedOnly = function(e) {
            var t = this,
                i = e.push;
            e.push = function() {
                for (var r = [], n = 0; n < arguments.length; n++) r[n] = arguments[n];
                var o = i.apply(e, r);
                return t._resyncMeshes(), o
            };
            var r = e.splice;
            e.splice = function(i, n) {
                var o = r.apply(e, [i, n]);
                return t._resyncMeshes(), o
            }, this._resyncMeshes()
        }, i.prototype._resyncMeshes = function() {
            for (var e = 0, t = this.getScene().meshes; e < t.length; e++) {
                t[e]._resyncLighSource(this)
            }
        }, i.prototype._markMeshesAsLightDirty = function() {
            for (var e = 0, t = this.getScene().meshes; e < t.length; e++) {
                var i = t[e]; - 1 !== i._lightSources.indexOf(this) && i._markSubMeshesAsLightDirty()
            }
        }, i.prototype._computePhotometricScale = function() {
            this._photometricScale = this._getPhotometricScale(), this.getScene().resetCachedMaterial()
        }, i.prototype._getPhotometricScale = function() {
            var e = 0,
                t = this.getTypeID(),
                r = this.intensityMode;
            switch (r === i.INTENSITYMODE_AUTOMATIC && (r = t === i.LIGHTTYPEID_DIRECTIONALLIGHT ? i.INTENSITYMODE_ILLUMINANCE : i.INTENSITYMODE_LUMINOUSINTENSITY), t) {
                case i.LIGHTTYPEID_POINTLIGHT:
                case i.LIGHTTYPEID_SPOTLIGHT:
                    switch (r) {
                        case i.INTENSITYMODE_LUMINOUSPOWER:
                            e = 1 / (4 * Math.PI);
                            break;
                        case i.INTENSITYMODE_LUMINOUSINTENSITY:
                            e = 1;
                            break;
                        case i.INTENSITYMODE_LUMINANCE:
                            e = this.radius * this.radius
                    }
                    break;
                case i.LIGHTTYPEID_DIRECTIONALLIGHT:
                    switch (r) {
                        case i.INTENSITYMODE_ILLUMINANCE:
                            e = 1;
                            break;
                        case i.INTENSITYMODE_LUMINANCE:
                            var n = this.radius;
                            n = Math.max(n, .001);
                            e = 2 * Math.PI * (1 - Math.cos(n))
                    }
                    break;
                case i.LIGHTTYPEID_HEMISPHERICLIGHT:
                    e = 1
            }
            return e
        }, i.prototype._reorderLightsInScene = function() {
            var e = this.getScene();
            0 != this._renderPriority && (e.requireLightSorting = !0), this.getScene().sortLightsByPriority()
        }, i._LIGHTMAP_DEFAULT = 0, i._LIGHTMAP_SPECULAR = 1, i._LIGHTMAP_SHADOWSONLY = 2, i._INTENSITYMODE_AUTOMATIC = 0, i._INTENSITYMODE_LUMINOUSPOWER = 1, i._INTENSITYMODE_LUMINOUSINTENSITY = 2, i._INTENSITYMODE_ILLUMINANCE = 3, i._INTENSITYMODE_LUMINANCE = 4, i._LIGHTTYPEID_POINTLIGHT = 0, i._LIGHTTYPEID_DIRECTIONALLIGHT = 1, i._LIGHTTYPEID_SPOTLIGHT = 2, i._LIGHTTYPEID_HEMISPHERICLIGHT = 3, __decorate([e.serializeAsColor3()], i.prototype, "diffuse", void 0), __decorate([e.serializeAsColor3()], i.prototype, "specular", void 0), __decorate([e.serialize()], i.prototype, "intensity", void 0), __decorate([e.serialize()], i.prototype, "range", void 0), __decorate([e.serialize()], i.prototype, "intensityMode", null), __decorate([e.serialize()], i.prototype, "radius", null), __decorate([e.serialize()], i.prototype, "_renderPriority", void 0), __decorate([e.expandToProperty("_reorderLightsInScene")], i.prototype, "renderPriority", void 0), __decorate([e.serialize()], i.prototype, "shadowEnabled", void 0), __decorate([e.serialize("excludeWithLayerMask")], i.prototype, "_excludeWithLayerMask", void 0), __decorate([e.serialize("includeOnlyWithLayerMask")], i.prototype, "_includeOnlyWithLayerMask", void 0), __decorate([e.serialize("lightmapMode")], i.prototype, "_lightmapMode", void 0), i
    })(e.Node);
    e.Light = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(r, n, o) {
            var s = t.call(this, r, o) || this;
            return s.upVector = e.Vector3.Up(), s.orthoLeft = null, s.orthoRight = null, s.orthoBottom = null, s.orthoTop = null, s.fov = .8, s.minZ = 1, s.maxZ = 1e4, s.inertia = .9, s.mode = i.PERSPECTIVE_CAMERA, s.isIntermediate = !1, s.viewport = new e.Viewport(0, 0, 1, 1), s.layerMask = 268435455, s.fovMode = i.FOVMODE_VERTICAL_FIXED, s.cameraRigMode = i.RIG_MODE_NONE, s._rigCameras = new Array, s._webvrViewMatrix = e.Matrix.Identity(), s._skipRendering = !1, s.customRenderTargets = new Array, s.onViewMatrixChangedObservable = new e.Observable, s.onProjectionMatrixChangedObservable = new e.Observable, s.onAfterCheckInputsObservable = new e.Observable, s.onRestoreStateObservable = new e.Observable, s._computedViewMatrix = e.Matrix.Identity(), s._projectionMatrix = new e.Matrix, s._doNotComputeProjectionMatrix = !1, s._postProcesses = new Array, s._transformMatrix = e.Matrix.Zero(), s._activeMeshes = new e.SmartArray(256), s._globalPosition = e.Vector3.Zero(), s._refreshFrustumPlanes = !0, s.getScene().addCamera(s), s.getScene().activeCamera || (s.getScene().activeCamera = s), s.position = n, s
        }
        return __extends(i, t), Object.defineProperty(i, "PERSPECTIVE_CAMERA", {
            get: function() {
                return i._PERSPECTIVE_CAMERA
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ORTHOGRAPHIC_CAMERA", {
            get: function() {
                return i._ORTHOGRAPHIC_CAMERA
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "FOVMODE_VERTICAL_FIXED", {
            get: function() {
                return i._FOVMODE_VERTICAL_FIXED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "FOVMODE_HORIZONTAL_FIXED", {
            get: function() {
                return i._FOVMODE_HORIZONTAL_FIXED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_NONE", {
            get: function() {
                return i._RIG_MODE_NONE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_STEREOSCOPIC_ANAGLYPH", {
            get: function() {
                return i._RIG_MODE_STEREOSCOPIC_ANAGLYPH
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL", {
            get: function() {
                return i._RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED", {
            get: function() {
                return i._RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_STEREOSCOPIC_OVERUNDER", {
            get: function() {
                return i._RIG_MODE_STEREOSCOPIC_OVERUNDER
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_VR", {
            get: function() {
                return i._RIG_MODE_VR
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "RIG_MODE_WEBVR", {
            get: function() {
                return i._RIG_MODE_WEBVR
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.storeState = function() {
            return this._stateStored = !0, this._storedFov = this.fov, this
        }, i.prototype._restoreStateValues = function() {
            return !!this._stateStored && (this.fov = this._storedFov, !0)
        }, i.prototype.restoreState = function() {
            return !!this._restoreStateValues() && (this.onRestoreStateObservable.notifyObservers(this), !0)
        }, i.prototype.getClassName = function() {
            return "Camera"
        }, i.prototype.toString = function(e) {
            var t = "Name: " + this.name;
            if (t += ", type: " + this.getClassName(), this.animations)
                for (var i = 0; i < this.animations.length; i++) t += ", animation[0]: " + this.animations[i].toString(e);
            return t
        }, Object.defineProperty(i.prototype, "globalPosition", {
            get: function() {
                return this._globalPosition
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getActiveMeshes = function() {
            return this._activeMeshes
        }, i.prototype.isActiveMesh = function(e) {
            return -1 !== this._activeMeshes.indexOf(e)
        }, i.prototype._initCache = function() {
            t.prototype._initCache.call(this), this._cache.position = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.upVector = new e.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.renderWidth = void 0, this._cache.renderHeight = void 0
        }, i.prototype._updateCache = function(e) {
            e || t.prototype._updateCache.call(this), this._cache.position.copyFrom(this.position), this._cache.upVector.copyFrom(this.upVector)
        }, i.prototype._isSynchronized = function() {
            return this._isSynchronizedViewMatrix() && this._isSynchronizedProjectionMatrix()
        }, i.prototype._isSynchronizedViewMatrix = function() {
            return !!t.prototype._isSynchronized.call(this) && (this._cache.position.equals(this.position) && this._cache.upVector.equals(this.upVector) && this.isSynchronizedWithParent())
        }, i.prototype._isSynchronizedProjectionMatrix = function() {
            var e = this._cache.mode === this.mode && this._cache.minZ === this.minZ && this._cache.maxZ === this.maxZ;
            if (!e) return !1;
            var t = this.getEngine();
            return e = this.mode === i.PERSPECTIVE_CAMERA ? this._cache.fov === this.fov && this._cache.fovMode === this.fovMode && this._cache.aspectRatio === t.getAspectRatio(this) : 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()
        }, i.prototype.attachControl = function(e, t) {}, i.prototype.detachControl = function(e) {}, i.prototype.update = function() {
            this._checkInputs(), this.cameraRigMode !== i.RIG_MODE_NONE && this._updateRigCameras()
        }, i.prototype._checkInputs = function() {
            this.onAfterCheckInputsObservable.notifyObservers(this)
        }, Object.defineProperty(i.prototype, "rigCameras", {
            get: function() {
                return this._rigCameras
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "rigPostProcess", {
            get: function() {
                return this._rigPostProcess
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._cascadePostProcessesToRigCams = function() {
            this._postProcesses.length > 0 && this._postProcesses[0].markTextureDirty();
            for (var t = 0, i = this._rigCameras.length; t < i; t++) {
                var r = this._rigCameras[t],
                    n = r._rigPostProcess;
                if (n) {
                    n instanceof e.PassPostProcess && (r.isIntermediate = 0 === this._postProcesses.length), r._postProcesses = this._postProcesses.slice(0).concat(n), n.markTextureDirty()
                } else r._postProcesses = this._postProcesses.slice(0)
            }
        }, i.prototype.attachPostProcess = function(t, i) {
            return void 0 === i && (i = null), !t.isReusable() && this._postProcesses.indexOf(t) > -1 ? (e.Tools.Error("You're trying to reuse a post process not defined as reusable."), 0) : (null == i || i < 0 ? this._postProcesses.push(t) : this._postProcesses.splice(i, 0, t), this._cascadePostProcessesToRigCams(), this._postProcesses.indexOf(t))
        }, i.prototype.detachPostProcess = function(e) {
            var t = this._postProcesses.indexOf(e); - 1 !== t && this._postProcesses.splice(t, 1), this._cascadePostProcessesToRigCams()
        }, i.prototype.getWorldMatrix = function() {
            return this._worldMatrix || (this._worldMatrix = e.Matrix.Identity()), this.getViewMatrix().invertToRef(this._worldMatrix), this._worldMatrix
        }, i.prototype._getViewMatrix = function() {
            return e.Matrix.Identity()
        }, i.prototype.getViewMatrix = function(t) {
            return !t && this._isSynchronizedViewMatrix() ? this._computedViewMatrix : (this.updateCache(), this._computedViewMatrix = this._getViewMatrix(), this._currentRenderId = this.getScene().getRenderId(), this._refreshFrustumPlanes = !0, this.parent && this.parent.getWorldMatrix ? (this._worldMatrix || (this._worldMatrix = e.Matrix.Identity()), this._computedViewMatrix.invertToRef(this._worldMatrix), this._worldMatrix.multiplyToRef(this.parent.getWorldMatrix(), this._computedViewMatrix), this._globalPosition.copyFromFloats(this._computedViewMatrix.m[12], this._computedViewMatrix.m[13], this._computedViewMatrix.m[14]), this._computedViewMatrix.invert(), this._markSyncedWithParent()) : this._globalPosition.copyFrom(this.position), this._cameraRigParams && this._cameraRigParams.vrPreViewMatrix && this._computedViewMatrix.multiplyToRef(this._cameraRigParams.vrPreViewMatrix, this._computedViewMatrix), this.onViewMatrixChangedObservable.notifyObservers(this), this._computedViewMatrix)
        }, i.prototype.freezeProjectionMatrix = function(e) {
            this._doNotComputeProjectionMatrix = !0, void 0 !== e && (this._projectionMatrix = e)
        }, i.prototype.unfreezeProjectionMatrix = function() {
            this._doNotComputeProjectionMatrix = !1
        }, i.prototype.getProjectionMatrix = function(t) {
            if (this._doNotComputeProjectionMatrix || !t && this._isSynchronizedProjectionMatrix()) return this._projectionMatrix;
            this._cache.mode = this.mode, this._cache.minZ = this.minZ, this._cache.maxZ = this.maxZ, this._refreshFrustumPlanes = !0;
            var r = this.getEngine(),
                n = this.getScene();
            if (this.mode === i.PERSPECTIVE_CAMERA) this._cache.fov = this.fov, this._cache.fovMode = this.fovMode, this._cache.aspectRatio = r.getAspectRatio(this), this.minZ <= 0 && (this.minZ = .1), n.useRightHandedSystem ? e.Matrix.PerspectiveFovRHToRef(this.fov, r.getAspectRatio(this), this.minZ, this.maxZ, this._projectionMatrix, this.fovMode === i.FOVMODE_VERTICAL_FIXED) : e.Matrix.PerspectiveFovLHToRef(this.fov, r.getAspectRatio(this), this.minZ, this.maxZ, this._projectionMatrix, this.fovMode === i.FOVMODE_VERTICAL_FIXED);
            else {
                var o = r.getRenderWidth() / 2,
                    s = r.getRenderHeight() / 2;
                n.useRightHandedSystem ? e.Matrix.OrthoOffCenterRHToRef(this.orthoLeft || -o, this.orthoRight || o, this.orthoBottom || -s, this.orthoTop || s, this.minZ, this.maxZ, this._projectionMatrix) : e.Matrix.OrthoOffCenterLHToRef(this.orthoLeft || -o, this.orthoRight || o, this.orthoBottom || -s, this.orthoTop || s, this.minZ, this.maxZ, this._projectionMatrix), this._cache.orthoLeft = this.orthoLeft, this._cache.orthoRight = this.orthoRight, this._cache.orthoBottom = this.orthoBottom, this._cache.orthoTop = this.orthoTop, this._cache.renderWidth = r.getRenderWidth(), this._cache.renderHeight = r.getRenderHeight()
            }
            return this.onProjectionMatrixChangedObservable.notifyObservers(this), this._projectionMatrix
        }, i.prototype.getTranformationMatrix = function() {
            return this._computedViewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix), this._transformMatrix
        }, i.prototype.updateFrustumPlanes = function() {
            this._refreshFrustumPlanes && (this.getTranformationMatrix(), this._frustumPlanes ? e.Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes) : this._frustumPlanes = e.Frustum.GetPlanes(this._transformMatrix), this._refreshFrustumPlanes = !1)
        }, i.prototype.isInFrustum = function(e) {
            return this.updateFrustumPlanes(), e.isInFrustum(this._frustumPlanes)
        }, i.prototype.isCompletelyInFrustum = function(e) {
            return this.updateFrustumPlanes(), e.isCompletelyInFrustum(this._frustumPlanes)
        }, i.prototype.getForwardRay = function(t, i, r) {
            void 0 === t && (t = 100), i || (i = this.getWorldMatrix()), r || (r = this.position);
            var n = new e.Vector3(0, 0, 1),
                o = e.Vector3.TransformNormal(n, i),
                s = e.Vector3.Normalize(o);
            return new e.Ray(r, s, t)
        }, i.prototype.dispose = function() {
            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;) {
                var e = this._rigCameras.pop();
                e && e.dispose()
            }
            if (this._rigPostProcess) this._rigPostProcess.dispose(this), this._rigPostProcess = null, this._postProcesses = [];
            else if (this.cameraRigMode !== i.RIG_MODE_NONE) this._rigPostProcess = null, this._postProcesses = [];
            else
                for (var r = this._postProcesses.length; --r >= 0;) this._postProcesses[r].dispose(this);
            for (var r = this.customRenderTargets.length; --r >= 0;) this.customRenderTargets[r].dispose();
            this.customRenderTargets = [], this._activeMeshes.dispose(), t.prototype.dispose.call(this)
        }, Object.defineProperty(i.prototype, "leftCamera", {
            get: function() {
                return this._rigCameras.length < 1 ? null : this._rigCameras[0]
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "rightCamera", {
            get: function() {
                return this._rigCameras.length < 2 ? null : this._rigCameras[1]
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getLeftTarget = function() {
            return this._rigCameras.length < 1 ? null : this._rigCameras[0].getTarget()
        }, i.prototype.getRightTarget = function() {
            return this._rigCameras.length < 2 ? null : this._rigCameras[1].getTarget()
        }, i.prototype.setCameraRigMode = function(t, r) {
            if (this.cameraRigMode !== t) {
                for (; this._rigCameras.length > 0;) {
                    var n = this._rigCameras.pop();
                    n && n.dispose()
                }
                if (this.cameraRigMode = t, this._cameraRigParams = {}, this._cameraRigParams.interaxialDistance = r.interaxialDistance || .0637, this._cameraRigParams.stereoHalfAngle = e.Tools.ToRadians(this._cameraRigParams.interaxialDistance / .0637), this.cameraRigMode !== i.RIG_MODE_NONE) {
                    var o = this.createRigCamera(this.name + "_L", 0),
                        s = this.createRigCamera(this.name + "_R", 1);
                    o && s && (this._rigCameras.push(o), this._rigCameras.push(s))
                }
                switch (this.cameraRigMode) {
                    case i.RIG_MODE_STEREOSCOPIC_ANAGLYPH:
                        this._rigCameras[0]._rigPostProcess = new e.PassPostProcess(this.name + "_passthru", 1, this._rigCameras[0]), this._rigCameras[1]._rigPostProcess = new e.AnaglyphPostProcess(this.name + "_anaglyph", 1, this._rigCameras);
                        break;
                    case i.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:
                    case i.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:
                    case i.RIG_MODE_STEREOSCOPIC_OVERUNDER:
                        var a = this.cameraRigMode === i.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL || this.cameraRigMode === i.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED;
                        this._rigCameras[0]._rigPostProcess = new e.PassPostProcess(this.name + "_passthru", 1, this._rigCameras[0]), this._rigCameras[1]._rigPostProcess = new e.StereoscopicInterlacePostProcess(this.name + "_stereoInterlace", this._rigCameras, a);
                        break;
                    case i.RIG_MODE_VR:
                        var l = r.vrCameraMetrics || e.VRCameraMetrics.GetDefault();
                        this._rigCameras[0]._cameraRigParams.vrMetrics = l, this._rigCameras[0].viewport = new e.Viewport(0, 0, .5, 1), this._rigCameras[0]._cameraRigParams.vrWorkMatrix = new e.Matrix, this._rigCameras[0]._cameraRigParams.vrHMatrix = l.leftHMatrix, this._rigCameras[0]._cameraRigParams.vrPreViewMatrix = l.leftPreViewMatrix, this._rigCameras[0].getProjectionMatrix = this._rigCameras[0]._getVRProjectionMatrix, this._rigCameras[1]._cameraRigParams.vrMetrics = l, this._rigCameras[1].viewport = new e.Viewport(.5, 0, .5, 1), this._rigCameras[1]._cameraRigParams.vrWorkMatrix = new e.Matrix, this._rigCameras[1]._cameraRigParams.vrHMatrix = l.rightHMatrix, this._rigCameras[1]._cameraRigParams.vrPreViewMatrix = l.rightPreViewMatrix, this._rigCameras[1].getProjectionMatrix = this._rigCameras[1]._getVRProjectionMatrix, l.compensateDistortion && (this._rigCameras[0]._rigPostProcess = new e.VRDistortionCorrectionPostProcess("VR_Distort_Compensation_Left", this._rigCameras[0], !1, l), this._rigCameras[1]._rigPostProcess = new e.VRDistortionCorrectionPostProcess("VR_Distort_Compensation_Right", this._rigCameras[1], !0, l));
                        break;
                    case i.RIG_MODE_WEBVR:
                        if (r.vrDisplay) {
                            var c = r.vrDisplay.getEyeParameters("left"),
                                h = r.vrDisplay.getEyeParameters("right");
                            this._rigCameras[0].viewport = new e.Viewport(0, 0, .5, 1), this._rigCameras[0].setCameraRigParameter("left", !0), this._rigCameras[0].setCameraRigParameter("specs", r.specs), this._rigCameras[0].setCameraRigParameter("eyeParameters", c), this._rigCameras[0].setCameraRigParameter("frameData", r.frameData), this._rigCameras[0].setCameraRigParameter("parentCamera", r.parentCamera), this._rigCameras[0]._cameraRigParams.vrWorkMatrix = new e.Matrix, this._rigCameras[0].getProjectionMatrix = this._getWebVRProjectionMatrix, this._rigCameras[0].parent = this, this._rigCameras[0]._getViewMatrix = this._getWebVRViewMatrix, this._rigCameras[1].viewport = new e.Viewport(.5, 0, .5, 1), this._rigCameras[1].setCameraRigParameter("eyeParameters", h), this._rigCameras[1].setCameraRigParameter("specs", r.specs), this._rigCameras[1].setCameraRigParameter("frameData", r.frameData), this._rigCameras[1].setCameraRigParameter("parentCamera", r.parentCamera), this._rigCameras[1]._cameraRigParams.vrWorkMatrix = new e.Matrix, this._rigCameras[1].getProjectionMatrix = this._getWebVRProjectionMatrix, this._rigCameras[1].parent = this, this._rigCameras[1]._getViewMatrix = this._getWebVRViewMatrix, i.UseAlternateWebVRRendering && (this._rigCameras[1]._skipRendering = !0, this._rigCameras[0]._alternateCamera = this._rigCameras[1])
                        }
                }
                this._cascadePostProcessesToRigCams(), this.update()
            }
        }, i.prototype._getVRProjectionMatrix = function() {
            return e.Matrix.PerspectiveFovLHToRef(this._cameraRigParams.vrMetrics.aspectRatioFov, this._cameraRigParams.vrMetrics.aspectRatio, this.minZ, this.maxZ, this._cameraRigParams.vrWorkMatrix), this._cameraRigParams.vrWorkMatrix.multiplyToRef(this._cameraRigParams.vrHMatrix, this._projectionMatrix), this._projectionMatrix
        }, i.prototype._updateCameraRotationMatrix = function() {}, i.prototype._updateWebVRCameraRotationMatrix = function() {}, i.prototype._getWebVRProjectionMatrix = function() {
            return e.Matrix.Identity()
        }, i.prototype._getWebVRViewMatrix = function() {
            return e.Matrix.Identity()
        }, i.prototype.setCameraRigParameter = function(t, i) {
            this._cameraRigParams || (this._cameraRigParams = {}), this._cameraRigParams[t] = i, "interaxialDistance" === t && (this._cameraRigParams.stereoHalfAngle = e.Tools.ToRadians(i / .0637))
        }, i.prototype.createRigCamera = function(e, t) {
            return null
        }, i.prototype._updateRigCameras = function() {
            for (var e = 0; e < this._rigCameras.length; e++) this._rigCameras[e].minZ = this.minZ, this._rigCameras[e].maxZ = this.maxZ, this._rigCameras[e].fov = this.fov;
            this.cameraRigMode === i.RIG_MODE_STEREOSCOPIC_ANAGLYPH && (this._rigCameras[0].viewport = this._rigCameras[1].viewport = this.viewport)
        }, i.prototype._setupInputs = function() {}, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.type = this.getClassName(), this.parent && (t.parentId = this.parent.id), this.inputs && this.inputs.serialize(t), e.Animation.AppendSerializedAnimations(this, t), t.ranges = this.serializeAnimationRanges(), t
        }, i.prototype.clone = function(t) {
            return e.SerializationHelper.Clone(i.GetConstructorFromName(this.getClassName(), t, this.getScene(), this.interaxialDistance, this.isStereoscopicSideBySide), this)
        }, i.prototype.getDirection = function(t) {
            var i = e.Vector3.Zero();
            return this.getDirectionToRef(t, i), i
        }, i.prototype.getDirectionToRef = function(t, i) {
            e.Vector3.TransformNormalToRef(t, this.getWorldMatrix(), i)
        }, i.GetConstructorFromName = function(t, i, r, n, o) {
            switch (void 0 === n && (n = 0), void 0 === o && (o = !0), t) {
                case "ArcRotateCamera":
                    return function() {
                        return new e.ArcRotateCamera(i, 0, 0, 1, e.Vector3.Zero(), r)
                    };
                case "DeviceOrientationCamera":
                    return function() {
                        return new e.DeviceOrientationCamera(i, e.Vector3.Zero(), r)
                    };
                case "FollowCamera":
                    return function() {
                        return new e.FollowCamera(i, e.Vector3.Zero(), r)
                    };
                case "ArcFollowCamera":
                    return function() {
                        return new e.ArcFollowCamera(i, 0, 0, 1, null, r)
                    };
                case "GamepadCamera":
                    return function() {
                        return new e.GamepadCamera(i, e.Vector3.Zero(), r)
                    };
                case "TouchCamera":
                    return function() {
                        return new e.TouchCamera(i, e.Vector3.Zero(), r)
                    };
                case "VirtualJoysticksCamera":
                    return function() {
                        return new e.VirtualJoysticksCamera(i, e.Vector3.Zero(), r)
                    };
                case "WebVRFreeCamera":
                case "WebVRGamepadCamera":
                    return function() {
                        return new e.WebVRFreeCamera(i, e.Vector3.Zero(), r)
                    };
                case "VRDeviceOrientationFreeCamera":
                    return function() {
                        return new e.VRDeviceOrientationFreeCamera(i, e.Vector3.Zero(), r)
                    };
                case "VRDeviceOrientationGamepadCamera":
                    return function() {
                        return new e.VRDeviceOrientationGamepadCamera(i, e.Vector3.Zero(), r)
                    };
                case "AnaglyphArcRotateCamera":
                    return function() {
                        return new e.AnaglyphArcRotateCamera(i, 0, 0, 1, e.Vector3.Zero(), n, r)
                    };
                case "AnaglyphFreeCamera":
                    return function() {
                        return new e.AnaglyphFreeCamera(i, e.Vector3.Zero(), n, r)
                    };
                case "AnaglyphGamepadCamera":
                    return function() {
                        return new e.AnaglyphGamepadCamera(i, e.Vector3.Zero(), n, r)
                    };
                case "AnaglyphUniversalCamera":
                    return function() {
                        return new e.AnaglyphUniversalCamera(i, e.Vector3.Zero(), n, r)
                    };
                case "StereoscopicArcRotateCamera":
                    return function() {
                        return new e.StereoscopicArcRotateCamera(i, 0, 0, 1, e.Vector3.Zero(), n, o, r)
                    };
                case "StereoscopicFreeCamera":
                    return function() {
                        return new e.StereoscopicFreeCamera(i, e.Vector3.Zero(), n, o, r)
                    };
                case "StereoscopicGamepadCamera":
                    return function() {
                        return new e.StereoscopicGamepadCamera(i, e.Vector3.Zero(), n, o, r)
                    };
                case "StereoscopicUniversalCamera":
                    return function() {
                        return new e.StereoscopicUniversalCamera(i, e.Vector3.Zero(), n, o, r)
                    };
                case "FreeCamera":
                default:
                    return function() {
                        return new e.UniversalCamera(i, e.Vector3.Zero(), r)
                    }
            }
        }, i.prototype.computeWorldMatrix = function() {
            return this.getWorldMatrix()
        }, i.Parse = function(t, r) {
            var n = t.type,
                o = i.GetConstructorFromName(n, t.name, r, t.interaxial_distance, t.isStereoscopicSideBySide),
                s = e.SerializationHelper.Parse(o, t, r);
            if (t.parentId && (s._waitingParentId = t.parentId), s.inputs && (s.inputs.parse(t), s._setupInputs()), s.setPosition && (s.position.copyFromFloats(0, 0, 0), s.setPosition(e.Vector3.FromArray(t.position))), t.target && s.setTarget && s.setTarget(e.Vector3.FromArray(t.target)), t.cameraRigMode) {
                var a = t.interaxial_distance ? {
                    interaxialDistance: t.interaxial_distance
                } : {};
                s.setCameraRigMode(t.cameraRigMode, a)
            }
            if (t.animations) {
                for (var l = 0; l < t.animations.length; l++) {
                    var c = t.animations[l];
                    s.animations.push(e.Animation.Parse(c))
                }
                e.Node.ParseAnimationRanges(s, t, r)
            }
            return t.autoAnimate && r.beginAnimation(s, t.autoAnimateFrom, t.autoAnimateTo, t.autoAnimateLoop, t.autoAnimateSpeed || 1), s
        }, i._PERSPECTIVE_CAMERA = 0, i._ORTHOGRAPHIC_CAMERA = 1, i._FOVMODE_VERTICAL_FIXED = 0, i._FOVMODE_HORIZONTAL_FIXED = 1, i._RIG_MODE_NONE = 0, i._RIG_MODE_STEREOSCOPIC_ANAGLYPH = 10, i._RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL = 11, i._RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED = 12, i._RIG_MODE_STEREOSCOPIC_OVERUNDER = 13, i._RIG_MODE_VR = 20, i._RIG_MODE_WEBVR = 21, i.ForceAttachControlToAlwaysPreventDefault = !1, i.UseAlternateWebVRRendering = !1, __decorate([e.serializeAsVector3()], i.prototype, "position", void 0), __decorate([e.serializeAsVector3()], i.prototype, "upVector", void 0), __decorate([e.serialize()], i.prototype, "orthoLeft", void 0), __decorate([e.serialize()], i.prototype, "orthoRight", void 0), __decorate([e.serialize()], i.prototype, "orthoBottom", void 0), __decorate([e.serialize()], i.prototype, "orthoTop", void 0), __decorate([e.serialize()], i.prototype, "fov", void 0), __decorate([e.serialize()], i.prototype, "minZ", void 0), __decorate([e.serialize()], i.prototype, "maxZ", void 0), __decorate([e.serialize()], i.prototype, "inertia", void 0), __decorate([e.serialize()], i.prototype, "mode", void 0), __decorate([e.serialize()], i.prototype, "layerMask", void 0), __decorate([e.serialize()], i.prototype, "fovMode", void 0), __decorate([e.serialize()], i.prototype, "cameraRigMode", void 0), __decorate([e.serialize()], i.prototype, "interaxialDistance", void 0), __decorate([e.serialize()], i.prototype, "isStereoscopicSideBySide", void 0), i
    })(e.Node);
    e.Camera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            this._renderingGroups = new Array, this._autoClearDepthStencil = {}, this._customOpaqueSortCompareFn = {}, this._customAlphaTestSortCompareFn = {}, this._customTransparentSortCompareFn = {}, this._renderinGroupInfo = null, this._scene = e;
            for (var i = t.MIN_RENDERINGGROUPS; i < t.MAX_RENDERINGGROUPS; i++) this._autoClearDepthStencil[i] = {
                autoClear: !0,
                depth: !0,
                stencil: !0
            }
        }
        return t.prototype._clearDepthStencilBuffer = function(e, t) {
            void 0 === e && (e = !0), void 0 === t && (t = !0), this._depthStencilBufferAlreadyCleaned || (this._scene.getEngine().clear(null, !1, e, t), this._depthStencilBufferAlreadyCleaned = !0)
        }, t.prototype.render = function(i, r, n, o) {
            var s = this._scene.onRenderingGroupObservable.hasObservers() ? this._scene.onRenderingGroupObservable : null,
                a = null;
            if (s && (this._renderinGroupInfo || (this._renderinGroupInfo = new e.RenderingGroupInfo), a = this._renderinGroupInfo, a.scene = this._scene, a.camera = this._scene.activeCamera), o)
                for (var l = 0; l < this._scene.spriteManagers.length; l++) {
                    var c = this._scene.spriteManagers[l];
                    this.dispatchSprites(c)
                }
            for (var l = t.MIN_RENDERINGGROUPS; l < t.MAX_RENDERINGGROUPS; l++) {
                this._depthStencilBufferAlreadyCleaned = l === t.MIN_RENDERINGGROUPS;
                var h = this._renderingGroups[l];
                if (h || s) {
                    var u = 0;
                    if (s && a && (u = Math.pow(2, l), a.renderStage = e.RenderingGroupInfo.STAGE_PRECLEAR, a.renderingGroupId = l, s.notifyObservers(a, u)), t.AUTOCLEAR) {
                        var f = this._autoClearDepthStencil[l];
                        f && f.autoClear && this._clearDepthStencilBuffer(f.depth, f.stencil)
                    }
                    s && a && (a.renderStage = e.RenderingGroupInfo.STAGE_PREOPAQUE, s.notifyObservers(a, u), a.renderStage = e.RenderingGroupInfo.STAGE_PRETRANSPARENT, s.notifyObservers(a, u)), h && h.render(i, o, n, r), s && a && (a.renderStage = e.RenderingGroupInfo.STAGE_POSTTRANSPARENT, s.notifyObservers(a, u))
                }
            }
        }, t.prototype.reset = function() {
            for (var e = t.MIN_RENDERINGGROUPS; e < t.MAX_RENDERINGGROUPS; e++) {
                var i = this._renderingGroups[e];
                i && i.prepare()
            }
        }, t.prototype.dispose = function() {
            for (var e = t.MIN_RENDERINGGROUPS; e < t.MAX_RENDERINGGROUPS; e++) {
                var i = this._renderingGroups[e];
                i && i.dispose()
            }
            this._renderingGroups.length = 0
        }, t.prototype._prepareRenderingGroup = function(t) {
            void 0 === this._renderingGroups[t] && (this._renderingGroups[t] = new e.RenderingGroup(t, this._scene, this._customOpaqueSortCompareFn[t], this._customAlphaTestSortCompareFn[t], this._customTransparentSortCompareFn[t]))
        }, t.prototype.dispatchSprites = function(e) {
            var t = e.renderingGroupId || 0;
            this._prepareRenderingGroup(t), this._renderingGroups[t].dispatchSprites(e)
        }, t.prototype.dispatchParticles = function(e) {
            var t = e.renderingGroupId || 0;
            this._prepareRenderingGroup(t), this._renderingGroups[t].dispatchParticles(e)
        }, t.prototype.dispatch = function(e, t, i) {
            void 0 === t && (t = e.getMesh());
            var r = t.renderingGroupId || 0;
            this._prepareRenderingGroup(r), this._renderingGroups[r].dispatch(e, t, i)
        }, t.prototype.setRenderingOrder = function(e, t, i, r) {
            if (void 0 === t && (t = null), void 0 === i && (i = null), void 0 === r && (r = null), this._customOpaqueSortCompareFn[e] = t, this._customAlphaTestSortCompareFn[e] = i, this._customTransparentSortCompareFn[e] = r, this._renderingGroups[e]) {
                var n = this._renderingGroups[e];
                n.opaqueSortCompareFn = this._customOpaqueSortCompareFn[e], n.alphaTestSortCompareFn = this._customAlphaTestSortCompareFn[e], n.transparentSortCompareFn = this._customTransparentSortCompareFn[e]
            }
        }, t.prototype.setRenderingAutoClearDepthStencil = function(e, t, i, r) {
            void 0 === i && (i = !0), void 0 === r && (r = !0), this._autoClearDepthStencil[e] = {
                autoClear: t,
                depth: i,
                stencil: r
            }
        }, t.MAX_RENDERINGGROUPS = 4, t.MIN_RENDERINGGROUPS = 0, t.AUTOCLEAR = !0, t
    })();
    e.RenderingManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o) {
            void 0 === r && (r = null), void 0 === n && (n = null), void 0 === o && (o = null), this.index = t, this._opaqueSubMeshes = new e.SmartArray(256), this._transparentSubMeshes = new e.SmartArray(256), this._alphaTestSubMeshes = new e.SmartArray(256), this._depthOnlySubMeshes = new e.SmartArray(256), this._particleSystems = new e.SmartArray(256), this._spriteManagers = new e.SmartArray(256), this._edgesRenderers = new e.SmartArray(16), this._scene = i, this.opaqueSortCompareFn = r, this.alphaTestSortCompareFn = n, this.transparentSortCompareFn = o
        }
        return Object.defineProperty(t.prototype, "opaqueSortCompareFn", {
            set: function(e) {
                this._opaqueSortCompareFn = e, this._renderOpaque = e ? this.renderOpaqueSorted : t.renderUnsorted
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "alphaTestSortCompareFn", {
            set: function(e) {
                this._alphaTestSortCompareFn = e, this._renderAlphaTest = e ? this.renderAlphaTestSorted : t.renderUnsorted
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "transparentSortCompareFn", {
            set: function(e) {
                this._transparentSortCompareFn = e || t.defaultTransparentSortCompare, this._renderTransparent = this.renderTransparentSorted
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.render = function(t, i, r, n) {
            if (t) return void t(this._opaqueSubMeshes, this._alphaTestSubMeshes, this._transparentSubMeshes, this._depthOnlySubMeshes);
            var o = this._scene.getEngine();
            0 !== this._depthOnlySubMeshes.length && (o.setColorWrite(!1), this._renderAlphaTest(this._depthOnlySubMeshes), o.setColorWrite(!0)), 0 !== this._opaqueSubMeshes.length && this._renderOpaque(this._opaqueSubMeshes), 0 !== this._alphaTestSubMeshes.length && this._renderAlphaTest(this._alphaTestSubMeshes);
            var s = o.getStencilBuffer();
            o.setStencilBuffer(!1), i && this._renderSprites(), r && this._renderParticles(n), this.onBeforeTransparentRendering && this.onBeforeTransparentRendering(), 0 !== this._transparentSubMeshes.length && (this._renderTransparent(this._transparentSubMeshes), o.setAlphaMode(e.Engine.ALPHA_DISABLE)), o.setStencilBuffer(!1);
            for (var a = 0; a < this._edgesRenderers.length; a++) this._edgesRenderers.data[a].render();
            o.setStencilBuffer(s)
        }, t.prototype.renderOpaqueSorted = function(e) {
            return t.renderSorted(e, this._opaqueSortCompareFn, this._scene.activeCamera, !1)
        }, t.prototype.renderAlphaTestSorted = function(e) {
            return t.renderSorted(e, this._alphaTestSortCompareFn, this._scene.activeCamera, !1)
        }, t.prototype.renderTransparentSorted = function(e) {
            return t.renderSorted(e, this._transparentSortCompareFn, this._scene.activeCamera, !0)
        }, t.renderSorted = function(t, i, r, n) {
            for (var o, s = 0, a = r ? r.globalPosition : e.Vector3.Zero(); s < t.length; s++) o = t.data[s], o._alphaIndex = o.getMesh().alphaIndex, o._distanceToCamera = o.getBoundingInfo().boundingSphere.centerWorld.subtract(a).length();
            var l = t.data.slice(0, t.length);
            for (i && l.sort(i), s = 0; s < l.length; s++) {
                if (o = l[s], n) {
                    var c = o.getMaterial();
                    if (c && c.needDepthPrePass) {
                        var h = c.getScene().getEngine();
                        h.setColorWrite(!1), h.setAlphaMode(e.Engine.ALPHA_DISABLE), o.render(!1), h.setColorWrite(!0)
                    }
                }
                o.render(n)
            }
        }, t.renderUnsorted = function(e) {
            for (var t = 0; t < e.length; t++) {
                e.data[t].render(!1)
            }
        }, t.defaultTransparentSortCompare = function(e, i) {
            return e._alphaIndex > i._alphaIndex ? 1 : e._alphaIndex < i._alphaIndex ? -1 : t.backToFrontSortCompare(e, i)
        }, t.backToFrontSortCompare = function(e, t) {
            return e._distanceToCamera < t._distanceToCamera ? 1 : e._distanceToCamera > t._distanceToCamera ? -1 : 0
        }, t.frontToBackSortCompare = function(e, t) {
            return e._distanceToCamera < t._distanceToCamera ? -1 : e._distanceToCamera > t._distanceToCamera ? 1 : 0
        }, t.prototype.prepare = function() {
            this._opaqueSubMeshes.reset(), this._transparentSubMeshes.reset(), this._alphaTestSubMeshes.reset(), this._depthOnlySubMeshes.reset(), this._particleSystems.reset(), this._spriteManagers.reset(), this._edgesRenderers.reset()
        }, t.prototype.dispose = function() {
            this._opaqueSubMeshes.dispose(), this._transparentSubMeshes.dispose(), this._alphaTestSubMeshes.dispose(), this._depthOnlySubMeshes.dispose(), this._particleSystems.dispose(), this._spriteManagers.dispose(), this._edgesRenderers.dispose()
        }, t.prototype.dispatch = function(e, t, i) {
            void 0 === t && (t = e.getMesh()), void 0 === i && (i = e.getMaterial()), null !== i && void 0 !== i && (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)), null !== t._edgesRenderer && void 0 !== t._edgesRenderer && this._edgesRenderers.push(t._edgesRenderer))
        }, t.prototype.dispatchSprites = function(e) {
            this._spriteManagers.push(e)
        }, t.prototype.dispatchParticles = function(e) {
            this._particleSystems.push(e)
        }, t.prototype._renderParticles = function(e) {
            if (0 !== this._particleSystems.length) {
                var t = this._scene.activeCamera;
                this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);
                for (var i = 0; i < this._particleSystems.length; i++) {
                    var r = this._particleSystems.data[i];
                    if (0 !== (t && t.layerMask & r.layerMask)) {
                        var n = r.emitter;
                        n.position && e && -1 === e.indexOf(n) || this._scene._activeParticles.addCount(r.render(), !1)
                    }
                }
                this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene)
            }
        }, t.prototype._renderSprites = function() {
            if (this._scene.spritesEnabled && 0 !== this._spriteManagers.length) {
                var e = this._scene.activeCamera;
                this._scene.onBeforeSpritesRenderingObservable.notifyObservers(this._scene);
                for (var t = 0; t < this._spriteManagers.length; t++) {
                    var i = this._spriteManagers.data[t];
                    0 !== (e && e.layerMask & i.layerMask) && i.render()
                }
                this._scene.onAfterSpritesRenderingObservable.notifyObservers(this._scene)
            }
        }, t
    })();
    e.RenderingGroup = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
            function e() {
                this._singleClick = !1, this._doubleClick = !1, this._hasSwiped = !1, this._ignore = !1
            }
            return Object.defineProperty(e.prototype, "singleClick", {
                get: function() {
                    return this._singleClick
                },
                set: function(e) {
                    this._singleClick = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(e.prototype, "doubleClick", {
                get: function() {
                    return this._doubleClick
                },
                set: function(e) {
                    this._doubleClick = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(e.prototype, "hasSwiped", {
                get: function() {
                    return this._hasSwiped
                },
                set: function(e) {
                    this._hasSwiped = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(e.prototype, "ignore", {
                get: function() {
                    return this._ignore
                },
                set: function(e) {
                    this._ignore = e
                },
                enumerable: !0,
                configurable: !0
            }), e
        })(),
        i = (function() {
            function e() {}
            return e.STAGE_PRECLEAR = 1, e.STAGE_PREOPAQUE = 2, e.STAGE_PRETRANSPARENT = 3, e.STAGE_POSTTRANSPARENT = 4, e
        })();
    e.RenderingGroupInfo = i;
    var r = (function() {
        function i(t) {
            this.autoClear = !0, this.autoClearDepthAndStencil = !0, this.clearColor = new e.Color4(.2, .2, .3, 1), this.ambientColor = new e.Color3(0, 0, 0), this.forceWireframe = !1, this._forcePointsCloud = !1, this.forceShowBoundingBoxes = !1, this.animationsEnabled = !0, this.useConstantAnimationDeltaTime = !1, this.constantlyUpdateMeshUnderPointer = !1, this.hoverCursor = "pointer", this.defaultCursor = "", this.preventDefaultOnPointerDown = !0, this.metadata = null, this.onDisposeObservable = new e.Observable, this.onBeforeRenderObservable = new e.Observable, this.onAfterRenderObservable = new e.Observable, this.onBeforeAnimationsObservable = new e.Observable, this.onAfterAnimationsObservable = new e.Observable, this.onBeforeDrawPhaseObservable = new e.Observable, this.onAfterDrawPhaseObservable = new e.Observable, this.onBeforePhysicsObservable = new e.Observable, this.onAfterPhysicsObservable = new e.Observable, this.onReadyObservable = new e.Observable, this.onBeforeCameraRenderObservable = new e.Observable, this.onAfterCameraRenderObservable = new e.Observable, this.onBeforeActiveMeshesEvaluationObservable = new e.Observable, this.onAfterActiveMeshesEvaluationObservable = new e.Observable, this.onBeforeParticlesRenderingObservable = new e.Observable, this.onAfterParticlesRenderingObservable = new e.Observable, this.onBeforeSpritesRenderingObservable = new e.Observable, this.onAfterSpritesRenderingObservable = new e.Observable, this.onDataLoadedObservable = new e.Observable, this.onNewCameraAddedObservable = new e.Observable, this.onCameraRemovedObservable = new e.Observable, this.onNewLightAddedObservable = new e.Observable, this.onLightRemovedObservable = new e.Observable, this.onNewGeometryAddedObservable = new e.Observable, this.onGeometryRemovedObservable = new e.Observable, this.onNewTransformNodeAddedObservable = new e.Observable, this.onTransformNodeRemovedObservable = new e.Observable, this.onNewMeshAddedObservable = new e.Observable, this.onMeshRemovedObservable = new e.Observable, this.OnBeforeRenderTargetsRenderObservable = new e.Observable, this.OnAfterRenderTargetsRenderObservable = new e.Observable, this.onBeforeStepObservable = new e.Observable, this.onAfterStepObservable = new e.Observable, this.onRenderingGroupObservable = new e.Observable, this.animations = [], this.onPrePointerObservable = new e.Observable, this.onPointerObservable = new e.Observable, this._meshPickProceed = !1, this._currentPickResult = null, this._previousPickResult = null, this._totalPointersPressed = 0, this._doubleClickOccured = !1, this.cameraToUseForPointers = null, this._startingPointerPosition = new e.Vector2(0, 0), this._previousStartingPointerPosition = new e.Vector2(0, 0), this._startingPointerTime = 0, this._previousStartingPointerTime = 0, this._timeAccumulator = 0, this._currentStepId = 0, this._currentInternalStep = 0, this.onPreKeyboardObservable = new e.Observable, this.onKeyboardObservable = new e.Observable, this._useRightHandedSystem = !1, this._fogEnabled = !0, this._fogMode = i.FOGMODE_NONE, this.fogColor = new e.Color3(.2, .2, .3), this.fogDensity = .1, this.fogStart = 0, this.fogEnd = 1e3, this._shadowsEnabled = !0, this._lightsEnabled = !0, this.lights = new Array, this.cameras = new Array, this.activeCameras = new Array, this.transformNodes = new Array, this.meshes = new Array, this.animationGroups = new Array, this._geometries = new Array, this.materials = new Array, this.multiMaterials = new Array, this._texturesEnabled = !0, this.textures = new Array, this.particlesEnabled = !0, this.particleSystems = new Array, this.spritesEnabled = !0, this.spriteManagers = new Array, this.layers = new Array, this.effectLayers = new Array, this._skeletonsEnabled = !0, this.skeletons = new Array, this.morphTargetManagers = new Array, this.lensFlaresEnabled = !0, this.lensFlareSystems = new Array, this.collisionsEnabled = !0, this.gravity = new e.Vector3(0, -9.807, 0), this.postProcesses = new Array, this.postProcessesEnabled = !0, this.renderTargetsEnabled = !0, this.dumpNextRenderTargets = !1, this.customRenderTargets = new Array, this.importedMeshesFiles = new Array, this.probesEnabled = !0, this.reflectionProbes = new Array, this._actionManagers = new Array, this._meshesForIntersections = new e.SmartArrayNoDuplicate(256), this.proceduralTexturesEnabled = !0, this._proceduralTextures = new Array, this.soundTracks = new Array, this._audioEnabled = !0, this._headphone = !1, this._totalVertices = new e.PerfCounter, this._activeIndices = new e.PerfCounter, this._activeParticles = new e.PerfCounter, this._activeBones = new e.PerfCounter, this._animationTime = 0, this.animationTimeScale = 1, this._renderId = 0, this._executeWhenReadyTimeoutId = -1, this._intermediateRendering = !1, this._viewUpdateFlag = -1, this._projectionUpdateFlag = -1, this._alternateViewUpdateFlag = -1, this._alternateProjectionUpdateFlag = -1, this._toBeDisposed = new e.SmartArray(256),
                this._activeRequests = new Array, this._pendingData = new Array, this._isDisposed = !1, this.dispatchAllSubMeshesOfActiveMeshes = !1, this._activeMeshes = new e.SmartArray(256), this._processedMaterials = new e.SmartArray(256), this._renderTargets = new e.SmartArrayNoDuplicate(256), this._activeParticleSystems = new e.SmartArray(256), this._activeSkeletons = new e.SmartArrayNoDuplicate(32), this._softwareSkinnedMeshes = new e.SmartArrayNoDuplicate(32), this._activeAnimatables = new Array, this._transformMatrix = e.Matrix.Zero(), this._useAlternateCameraConfiguration = !1, this._alternateRendering = !1, this.requireLightSorting = !1, this._depthRenderer = {}, this._activeMeshesFrozen = !1, this._tempPickingRay = e.Ray ? e.Ray.Zero() : null, this._engine = t || e.Engine.LastCreatedEngine, this._engine.scenes.push(this), this._uid = null, this._renderingManager = new e.RenderingManager(this), this.postProcessManager = new e.PostProcessManager(this), e.OutlineRenderer && (this._outlineRenderer = new e.OutlineRenderer(this)), e.Tools.IsWindowObjectExist() && this.attachControl(), e.SimplificationQueue && (this.simplificationQueue = new e.SimplificationQueue), this.workerCollisions = !1, this._createUbo(), this._imageProcessingConfiguration = new e.ImageProcessingConfiguration
        }
        return Object.defineProperty(i, "FOGMODE_NONE", {
            get: function() {
                return i._FOGMODE_NONE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "FOGMODE_EXP", {
            get: function() {
                return i._FOGMODE_EXP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "FOGMODE_EXP2", {
            get: function() {
                return i._FOGMODE_EXP2
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "FOGMODE_LINEAR", {
            get: function() {
                return i._FOGMODE_LINEAR
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "environmentTexture", {
            get: function() {
                return this._environmentTexture
            },
            set: function(t) {
                this._environmentTexture !== t && (this._environmentTexture = t, this.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "imageProcessingConfiguration", {
            get: function() {
                return this._imageProcessingConfiguration
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "forcePointsCloud", {
            get: function() {
                return this._forcePointsCloud
            },
            set: function(t) {
                this._forcePointsCloud !== t && (this._forcePointsCloud = t, this.markAllMaterialsAsDirty(e.Material.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "beforeRender", {
            set: function(e) {
                this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), e && (this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "afterRender", {
            set: function(e) {
                this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), e && (this._onAfterRenderObserver = this.onAfterRenderObservable.add(e))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "beforeCameraRender", {
            set: function(e) {
                this._onBeforeCameraRenderObserver && this.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver), this._onBeforeCameraRenderObserver = this.onBeforeCameraRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "afterCameraRender", {
            set: function(e) {
                this._onAfterCameraRenderObserver && this.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver), this._onAfterCameraRenderObserver = this.onAfterCameraRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "gamepadManager", {
            get: function() {
                return this._gamepadManager || (this._gamepadManager = new e.GamepadManager(this)), this._gamepadManager
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "unTranslatedPointer", {
            get: function() {
                return new e.Vector2(this._unTranslatedPointerX, this._unTranslatedPointerY)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "useRightHandedSystem", {
            get: function() {
                return this._useRightHandedSystem
            },
            set: function(t) {
                this._useRightHandedSystem !== t && (this._useRightHandedSystem = t, this.markAllMaterialsAsDirty(e.Material.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.setStepId = function(e) {
            this._currentStepId = e
        }, i.prototype.getStepId = function() {
            return this._currentStepId
        }, i.prototype.getInternalStep = function() {
            return this._currentInternalStep
        }, Object.defineProperty(i.prototype, "fogEnabled", {
            get: function() {
                return this._fogEnabled
            },
            set: function(t) {
                this._fogEnabled !== t && (this._fogEnabled = t, this.markAllMaterialsAsDirty(e.Material.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "fogMode", {
            get: function() {
                return this._fogMode
            },
            set: function(t) {
                this._fogMode !== t && (this._fogMode = t, this.markAllMaterialsAsDirty(e.Material.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "shadowsEnabled", {
            get: function() {
                return this._shadowsEnabled
            },
            set: function(t) {
                this._shadowsEnabled !== t && (this._shadowsEnabled = t, this.markAllMaterialsAsDirty(e.Material.LightDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "lightsEnabled", {
            get: function() {
                return this._lightsEnabled
            },
            set: function(t) {
                this._lightsEnabled !== t && (this._lightsEnabled = t, this.markAllMaterialsAsDirty(e.Material.LightDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "defaultMaterial", {
            get: function() {
                return this._defaultMaterial || (this._defaultMaterial = new e.StandardMaterial("default material", this)), this._defaultMaterial
            },
            set: function(e) {
                this._defaultMaterial = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "texturesEnabled", {
            get: function() {
                return this._texturesEnabled
            },
            set: function(t) {
                this._texturesEnabled !== t && (this._texturesEnabled = t, this.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "skeletonsEnabled", {
            get: function() {
                return this._skeletonsEnabled
            },
            set: function(t) {
                this._skeletonsEnabled !== t && (this._skeletonsEnabled = t, this.markAllMaterialsAsDirty(e.Material.AttributesDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "postProcessRenderPipelineManager", {
            get: function() {
                return this._postProcessRenderPipelineManager || (this._postProcessRenderPipelineManager = new e.PostProcessRenderPipelineManager), this._postProcessRenderPipelineManager
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "mainSoundTrack", {
            get: function() {
                return this._mainSoundTrack || (this._mainSoundTrack = new e.SoundTrack(this, {
                    mainTrack: !0
                })), this._mainSoundTrack
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "_isAlternateRenderingEnabled", {
            get: function() {
                return this._alternateRendering
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "frustumPlanes", {
            get: function() {
                return this._frustumPlanes
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "geometryBufferRenderer", {
            get: function() {
                return this._geometryBufferRenderer
            },
            set: function(e) {
                e && e.isSupported && (this._geometryBufferRenderer = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "debugLayer", {
            get: function() {
                return this._debugLayer || (this._debugLayer = new e.DebugLayer(this)), this._debugLayer
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "workerCollisions", {
            get: function() {
                return this._workerCollisions
            },
            set: function(t) {
                e.CollisionCoordinatorLegacy && (t = t && !!Worker, this._workerCollisions = t, this.collisionCoordinator && this.collisionCoordinator.destroy(), this.collisionCoordinator = t ? new e.CollisionCoordinatorWorker : new e.CollisionCoordinatorLegacy, this.collisionCoordinator.init(this))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "selectionOctree", {
            get: function() {
                return this._selectionOctree
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "meshUnderPointer", {
            get: function() {
                return this._pointerOverMesh
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "pointerX", {
            get: function() {
                return this._pointerX
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "pointerY", {
            get: function() {
                return this._pointerY
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getCachedMaterial = function() {
            return this._cachedMaterial
        }, i.prototype.getCachedEffect = function() {
            return this._cachedEffect
        }, i.prototype.getCachedVisibility = function() {
            return this._cachedVisibility
        }, i.prototype.isCachedMaterialInvalid = function(e, t, i) {
            return void 0 === i && (i = 1), this._cachedEffect !== t || this._cachedMaterial !== e || this._cachedVisibility !== i
        }, i.prototype.getBoundingBoxRenderer = function() {
            return this._boundingBoxRenderer || (this._boundingBoxRenderer = new e.BoundingBoxRenderer(this)), this._boundingBoxRenderer
        }, i.prototype.getOutlineRenderer = function() {
            return this._outlineRenderer
        }, i.prototype.getEngine = function() {
            return this._engine
        }, i.prototype.getTotalVertices = function() {
            return this._totalVertices.current
        }, Object.defineProperty(i.prototype, "totalVerticesPerfCounter", {
            get: function() {
                return this._totalVertices
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getActiveIndices = function() {
            return this._activeIndices.current
        }, Object.defineProperty(i.prototype, "totalActiveIndicesPerfCounter", {
            get: function() {
                return this._activeIndices
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getActiveParticles = function() {
            return this._activeParticles.current
        }, Object.defineProperty(i.prototype, "activeParticlesPerfCounter", {
            get: function() {
                return this._activeParticles
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getActiveBones = function() {
            return this._activeBones.current
        }, Object.defineProperty(i.prototype, "activeBonesPerfCounter", {
            get: function() {
                return this._activeBones
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getInterFramePerfCounter = function() {
            return e.Tools.Warn("getInterFramePerfCounter is deprecated. Please use SceneInstrumentation class"), 0
        }, Object.defineProperty(i.prototype, "interFramePerfCounter", {
            get: function() {
                return e.Tools.Warn("interFramePerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getLastFrameDuration = function() {
            return e.Tools.Warn("getLastFrameDuration is deprecated. Please use SceneInstrumentation class"), 0
        }, Object.defineProperty(i.prototype, "lastFramePerfCounter", {
            get: function() {
                return e.Tools.Warn("lastFramePerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getEvaluateActiveMeshesDuration = function() {
            return e.Tools.Warn("getEvaluateActiveMeshesDuration is deprecated. Please use SceneInstrumentation class"), 0
        }, Object.defineProperty(i.prototype, "evaluateActiveMeshesDurationPerfCounter", {
            get: function() {
                return e.Tools.Warn("evaluateActiveMeshesDurationPerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getActiveMeshes = function() {
            return this._activeMeshes
        }, i.prototype.getRenderTargetsDuration = function() {
            return e.Tools.Warn("getRenderTargetsDuration is deprecated. Please use SceneInstrumentation class"), 0
        }, i.prototype.getRenderDuration = function() {
            return e.Tools.Warn("getRenderDuration is deprecated. Please use SceneInstrumentation class"), 0
        }, Object.defineProperty(i.prototype, "renderDurationPerfCounter", {
            get: function() {
                return e.Tools.Warn("renderDurationPerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getParticlesDuration = function() {
            return e.Tools.Warn("getParticlesDuration is deprecated. Please use SceneInstrumentation class"), 0
        }, Object.defineProperty(i.prototype, "particlesDurationPerfCounter", {
            get: function() {
                return e.Tools.Warn("particlesDurationPerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getSpritesDuration = function() {
            return e.Tools.Warn("getSpritesDuration is deprecated. Please use SceneInstrumentation class"), 0
        }, Object.defineProperty(i.prototype, "spriteDuractionPerfCounter", {
            get: function() {
                return e.Tools.Warn("spriteDuractionPerfCounter is deprecated. Please use SceneInstrumentation class"), null
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getAnimationRatio = function() {
            return this._animationRatio
        }, i.prototype.getRenderId = function() {
            return this._renderId
        }, i.prototype.incrementRenderId = function() {
            this._renderId++
        }, i.prototype._updatePointerPosition = function(e) {
            var t = this._engine.getRenderingCanvasClientRect();
            t && (this._pointerX = e.clientX - t.left, this._pointerY = e.clientY - t.top, this._unTranslatedPointerX = this._pointerX, this._unTranslatedPointerY = this._pointerY)
        }, i.prototype._createUbo = function() {
            this._sceneUbo = new e.UniformBuffer(this._engine, void 0, !0), this._sceneUbo.addUniform("viewProjection", 16), this._sceneUbo.addUniform("view", 16)
        }, i.prototype._createAlternateUbo = function() {
            this._alternateSceneUbo = new e.UniformBuffer(this._engine, void 0, !0), this._alternateSceneUbo.addUniform("viewProjection", 16), this._alternateSceneUbo.addUniform("view", 16)
        }, i.prototype.simulatePointerMove = function(e, t) {
            var i = new PointerEvent("pointermove", t);
            return this._processPointerMove(e, i)
        }, i.prototype._processPointerMove = function(t, i) {
            var r = this._engine.getRenderingCanvas();
            if (!r) return this;
            if (t && t.hit && t.pickedMesh ? (this.setPointerOverSprite(null), this.setPointerOverMesh(t.pickedMesh), this._pointerOverMesh && this._pointerOverMesh.actionManager && this._pointerOverMesh.actionManager.hasPointerTriggers ? this._pointerOverMesh.actionManager.hoverCursor ? r.style.cursor = this._pointerOverMesh.actionManager.hoverCursor : r.style.cursor = this.hoverCursor : r.style.cursor = this.defaultCursor) : (this.setPointerOverMesh(null), t = this.pickSprite(this._unTranslatedPointerX, this._unTranslatedPointerY, this._spritePredicate, !1, this.cameraToUseForPointers || void 0), t && t.hit && t.pickedSprite ? (this.setPointerOverSprite(t.pickedSprite), this._pointerOverSprite && this._pointerOverSprite.actionManager && this._pointerOverSprite.actionManager.hoverCursor ? r.style.cursor = this._pointerOverSprite.actionManager.hoverCursor : r.style.cursor = this.hoverCursor) : (this.setPointerOverSprite(null), r.style.cursor = this.defaultCursor)), t && (this.onPointerMove && this.onPointerMove(i, t), this.onPointerObservable.hasObservers())) {
                var n = "mousewheel" === i.type || "DOMMouseScroll" === i.type ? e.PointerEventTypes.POINTERWHEEL : e.PointerEventTypes.POINTERMOVE,
                    o = new e.PointerInfo(n, i, t);
                this.onPointerObservable.notifyObservers(o, n)
            }
            return this
        }, i.prototype.simulatePointerDown = function(e, t) {
            var i = new PointerEvent("pointerdown", t);
            return this._processPointerDown(e, i)
        }, i.prototype._processPointerDown = function(t, r) {
            var n = this;
            if (t && t.hit && t.pickedMesh) {
                this._pickedDownMesh = t.pickedMesh;
                var o = t.pickedMesh.actionManager;
                if (o) {
                    if (o.hasPickTriggers) switch (o.processTrigger(e.ActionManager.OnPickDownTrigger, e.ActionEvent.CreateNew(t.pickedMesh, r)), r.button) {
                        case 0:
                            o.processTrigger(e.ActionManager.OnLeftPickTrigger, e.ActionEvent.CreateNew(t.pickedMesh, r));
                            break;
                        case 1:
                            o.processTrigger(e.ActionManager.OnCenterPickTrigger, e.ActionEvent.CreateNew(t.pickedMesh, r));
                            break;
                        case 2:
                            o.processTrigger(e.ActionManager.OnRightPickTrigger, e.ActionEvent.CreateNew(t.pickedMesh, r))
                    }
                    o.hasSpecificTrigger(e.ActionManager.OnLongPressTrigger) && window.setTimeout((function() {
                        var t = n.pick(n._unTranslatedPointerX, n._unTranslatedPointerY, (function(t) {
                            return t.isPickable && t.isVisible && t.isReady() && t.actionManager && t.actionManager.hasSpecificTrigger(e.ActionManager.OnLongPressTrigger) && t == n._pickedDownMesh
                        }), !1, n.cameraToUseForPointers);
                        t && t.hit && t.pickedMesh && o && 0 !== n._totalPointersPressed && (new Date).getTime() - n._startingPointerTime > i.LongPressDelay && Math.abs(n._startingPointerPosition.x - n._pointerX) < i.DragMovementThreshold && Math.abs(n._startingPointerPosition.y - n._pointerY) < i.DragMovementThreshold && (n._startingPointerTime = 0, o.processTrigger(e.ActionManager.OnLongPressTrigger, e.ActionEvent.CreateNew(t.pickedMesh, r)))
                    }), i.LongPressDelay)
                }
            }
            if (t && (this.onPointerDown && this.onPointerDown(r, t), this.onPointerObservable.hasObservers())) {
                var s = e.PointerEventTypes.POINTERDOWN,
                    a = new e.PointerInfo(s, r, t);
                this.onPointerObservable.notifyObservers(a, s)
            }
            return this
        }, i.prototype.simulatePointerUp = function(e, i) {
            var r = new PointerEvent("pointerup", i),
                n = new t;
            return n.singleClick = !0, n.ignore = !0, this._processPointerUp(e, r, n)
        }, i.prototype._processPointerUp = function(t, i, r) {
            if (t && t && t.pickedMesh) {
                if (this._pickedUpMesh = t.pickedMesh, this._pickedDownMesh === this._pickedUpMesh && (this.onPointerPick && this.onPointerPick(i, t), r.singleClick && !r.ignore && this.onPointerObservable.hasObservers())) {
                    var n = e.PointerEventTypes.POINTERPICK,
                        o = new e.PointerInfo(n, i, t);
                    this.onPointerObservable.notifyObservers(o, n)
                }
                t.pickedMesh.actionManager && (r.ignore && t.pickedMesh.actionManager.processTrigger(e.ActionManager.OnPickUpTrigger, e.ActionEvent.CreateNew(t.pickedMesh, i)), r.hasSwiped || r.ignore || !r.singleClick || t.pickedMesh.actionManager.processTrigger(e.ActionManager.OnPickTrigger, e.ActionEvent.CreateNew(t.pickedMesh, i)), r.doubleClick && !r.ignore && t.pickedMesh.actionManager.hasSpecificTrigger(e.ActionManager.OnDoublePickTrigger) && t.pickedMesh.actionManager.processTrigger(e.ActionManager.OnDoublePickTrigger, e.ActionEvent.CreateNew(t.pickedMesh, i)))
            }
            if (this._pickedDownMesh && this._pickedDownMesh.actionManager && this._pickedDownMesh.actionManager.hasSpecificTrigger(e.ActionManager.OnPickOutTrigger) && this._pickedDownMesh !== this._pickedUpMesh && this._pickedDownMesh.actionManager.processTrigger(e.ActionManager.OnPickOutTrigger, e.ActionEvent.CreateNew(this._pickedDownMesh, i)), this.onPointerUp && this.onPointerUp(i, t), this.onPointerObservable.hasObservers())
                if (r.ignore) {
                    var n = e.PointerEventTypes.POINTERUP,
                        o = new e.PointerInfo(n, i, t);
                    this.onPointerObservable.notifyObservers(o, n)
                } else if (!r.hasSwiped) {
                if (r.singleClick && this.onPointerObservable.hasSpecificMask(e.PointerEventTypes.POINTERTAP)) {
                    var n = e.PointerEventTypes.POINTERTAP,
                        o = new e.PointerInfo(n, i, t);
                    this.onPointerObservable.notifyObservers(o, n)
                }
                if (r.doubleClick && this.onPointerObservable.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP)) {
                    var n = e.PointerEventTypes.POINTERDOUBLETAP,
                        o = new e.PointerInfo(n, i, t);
                    this.onPointerObservable.notifyObservers(o, n)
                }
            }
            return this
        }, i.prototype.attachControl = function(r, n, o) {
            var s = this;
            void 0 === r && (r = !0), void 0 === n && (n = !0), void 0 === o && (o = !0), this._initActionManager = function(e, t) {
                if (!s._meshPickProceed) {
                    var i = s.pick(s._unTranslatedPointerX, s._unTranslatedPointerY, s.pointerDownPredicate, !1, s.cameraToUseForPointers);
                    s._currentPickResult = i, i && (e = i.hit && i.pickedMesh ? i.pickedMesh.actionManager : null), s._meshPickProceed = !0
                }
                return e
            }, this._delayedSimpleClick = function(e, t, r) {
                ((new Date).getTime() - s._previousStartingPointerTime > i.DoubleClickDelay && !s._doubleClickOccured || e !== s._previousButtonPressed) && (s._doubleClickOccured = !1, t.singleClick = !0, t.ignore = !1, r(t, s._currentPickResult))
            }, this._initClickEvent = function(r, n, o, a) {
                var l = new t;
                s._currentPickResult = null;
                var c = null,
                    h = r.hasSpecificMask(e.PointerEventTypes.POINTERPICK) || n.hasSpecificMask(e.PointerEventTypes.POINTERPICK) || r.hasSpecificMask(e.PointerEventTypes.POINTERTAP) || n.hasSpecificMask(e.PointerEventTypes.POINTERTAP) || r.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP) || n.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP);
                if (!h && e.ActionManager && e.ActionManager.HasPickTriggers && (c = s._initActionManager(c, l)) && (h = c.hasPickTriggers), h) {
                    var u = o.button;
                    if (l.hasSwiped = Math.abs(s._startingPointerPosition.x - s._pointerX) > i.DragMovementThreshold || Math.abs(s._startingPointerPosition.y - s._pointerY) > i.DragMovementThreshold, !l.hasSwiped) {
                        var f = !i.ExclusiveDoubleClickMode;
                        f || (f = !r.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP) && !n.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP)) && !e.ActionManager.HasSpecificTrigger(e.ActionManager.OnDoublePickTrigger) && (c = s._initActionManager(c, l)) && (f = !c.hasSpecificTrigger(e.ActionManager.OnDoublePickTrigger)), f ? ((new Date).getTime() - s._previousStartingPointerTime > i.DoubleClickDelay || u !== s._previousButtonPressed) && (l.singleClick = !0, a(l, s._currentPickResult)) : (s._previousDelayedSimpleClickTimeout = s._delayedSimpleClickTimeout, s._delayedSimpleClickTimeout = window.setTimeout(s._delayedSimpleClick.bind(s, u, l, a), i.DoubleClickDelay));
                        var d = r.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP) || n.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP);
                        !d && e.ActionManager.HasSpecificTrigger(e.ActionManager.OnDoublePickTrigger) && (c = s._initActionManager(c, l)) && (d = c.hasSpecificTrigger(e.ActionManager.OnDoublePickTrigger)), d && (u === s._previousButtonPressed && (new Date).getTime() - s._previousStartingPointerTime < i.DoubleClickDelay && !s._doubleClickOccured ? !l.hasSwiped && Math.abs(s._previousStartingPointerPosition.x - s._startingPointerPosition.x) < i.DragMovementThreshold && Math.abs(s._previousStartingPointerPosition.y - s._startingPointerPosition.y) < i.DragMovementThreshold ? (s._previousStartingPointerTime = 0, s._doubleClickOccured = !0, l.doubleClick = !0, l.ignore = !1, i.ExclusiveDoubleClickMode && s._previousDelayedSimpleClickTimeout && clearTimeout(s._previousDelayedSimpleClickTimeout), s._previousDelayedSimpleClickTimeout = s._delayedSimpleClickTimeout, a(l, s._currentPickResult)) : (s._doubleClickOccured = !1, s._previousStartingPointerTime = s._startingPointerTime, s._previousStartingPointerPosition.x = s._startingPointerPosition.x, s._previousStartingPointerPosition.y = s._startingPointerPosition.y, s._previousButtonPressed = u, i.ExclusiveDoubleClickMode ? (s._previousDelayedSimpleClickTimeout && clearTimeout(s._previousDelayedSimpleClickTimeout), s._previousDelayedSimpleClickTimeout = s._delayedSimpleClickTimeout, a(l, s._previousPickResult)) : a(l, s._currentPickResult)) : (s._doubleClickOccured = !1, s._previousStartingPointerTime = s._startingPointerTime, s._previousStartingPointerPosition.x = s._startingPointerPosition.x, s._previousStartingPointerPosition.y = s._startingPointerPosition.y, s._previousButtonPressed = u))
                    }
                }
                l.ignore = !0, a(l, s._currentPickResult)
            }, this._spritePredicate = function(e) {
                return e.isPickable && e.actionManager && e.actionManager.hasPointerTriggers
            }, this._onPointerMove = function(t) {
                if (s._updatePointerPosition(t), s.onPrePointerObservable.hasObservers()) {
                    var i = "mousewheel" === t.type || "DOMMouseScroll" === t.type ? e.PointerEventTypes.POINTERWHEEL : e.PointerEventTypes.POINTERMOVE,
                        r = new e.PointerInfoPre(i, t, s._unTranslatedPointerX, s._unTranslatedPointerY);
                    if (s.onPrePointerObservable.notifyObservers(r, i), r.skipOnPointerObservable) return
                }
                if (s.cameraToUseForPointers || s.activeCamera) {
                    s.pointerMovePredicate || (s.pointerMovePredicate = function(e) {
                        return e.isPickable && e.isVisible && e.isReady() && e.isEnabled() && (e.enablePointerMoveEvents || s.constantlyUpdateMeshUnderPointer || null !== e.actionManager && void 0 !== e.actionManager)
                    });
                    var n = s.pick(s._unTranslatedPointerX, s._unTranslatedPointerY, s.pointerMovePredicate, !1, s.cameraToUseForPointers);
                    s._processPointerMove(n, t)
                }
            }, this._onPointerDown = function(t) {
                if (s._totalPointersPressed++, s._pickedDownMesh = null, s._meshPickProceed = !1, s._updatePointerPosition(t), s.preventDefaultOnPointerDown && c && (t.preventDefault(), c.focus()), s.onPrePointerObservable.hasObservers()) {
                    var i = e.PointerEventTypes.POINTERDOWN,
                        r = new e.PointerInfoPre(i, t, s._unTranslatedPointerX, s._unTranslatedPointerY);
                    if (s.onPrePointerObservable.notifyObservers(r, i), r.skipOnPointerObservable) return
                }
                if (s.cameraToUseForPointers || s.activeCamera) {
                    s._startingPointerPosition.x = s._pointerX, s._startingPointerPosition.y = s._pointerY, s._startingPointerTime = (new Date).getTime(), s.pointerDownPredicate || (s.pointerDownPredicate = function(e) {
                        return e.isPickable && e.isVisible && e.isReady() && e.isEnabled()
                    }), s._pickedDownMesh = null;
                    var n = s.pick(s._unTranslatedPointerX, s._unTranslatedPointerY, s.pointerDownPredicate, !1, s.cameraToUseForPointers);
                    if (s._processPointerDown(n, t), s._pickedDownSprite = null, s.spriteManagers.length > 0 && (n = s.pickSprite(s._unTranslatedPointerX, s._unTranslatedPointerY, s._spritePredicate, !1, s.cameraToUseForPointers || void 0)) && n.hit && n.pickedSprite && n.pickedSprite.actionManager) {
                        switch (s._pickedDownSprite = n.pickedSprite, t.button) {
                            case 0:
                                n.pickedSprite.actionManager.processTrigger(e.ActionManager.OnLeftPickTrigger, e.ActionEvent.CreateNewFromSprite(n.pickedSprite, s, t));
                                break;
                            case 1:
                                n.pickedSprite.actionManager.processTrigger(e.ActionManager.OnCenterPickTrigger, e.ActionEvent.CreateNewFromSprite(n.pickedSprite, s, t));
                                break;
                            case 2:
                                n.pickedSprite.actionManager.processTrigger(e.ActionManager.OnRightPickTrigger, e.ActionEvent.CreateNewFromSprite(n.pickedSprite, s, t))
                        }
                        n.pickedSprite.actionManager && n.pickedSprite.actionManager.processTrigger(e.ActionManager.OnPickDownTrigger, e.ActionEvent.CreateNewFromSprite(n.pickedSprite, s, t))
                    }
                }
            }, this._onPointerUp = function(t) {
                0 !== s._totalPointersPressed && (s._totalPointersPressed--, s._pickedUpMesh = null, s._meshPickProceed = !1, s._updatePointerPosition(t), s._initClickEvent(s.onPrePointerObservable, s.onPointerObservable, t, (function(r, n) {
                    if (s.onPrePointerObservable.hasObservers())
                        if (r.ignore) {
                            var o = e.PointerEventTypes.POINTERUP,
                                a = new e.PointerInfoPre(o, t, s._unTranslatedPointerX, s._unTranslatedPointerY);
                            if (s.onPrePointerObservable.notifyObservers(a, o), a.skipOnPointerObservable) return
                        } else if (!r.hasSwiped) {
                        if (r.singleClick && s.onPrePointerObservable.hasSpecificMask(e.PointerEventTypes.POINTERTAP)) {
                            var o = e.PointerEventTypes.POINTERTAP,
                                a = new e.PointerInfoPre(o, t, s._unTranslatedPointerX, s._unTranslatedPointerY);
                            if (s.onPrePointerObservable.notifyObservers(a, o), a.skipOnPointerObservable) return
                        }
                        if (r.doubleClick && s.onPrePointerObservable.hasSpecificMask(e.PointerEventTypes.POINTERDOUBLETAP)) {
                            var o = e.PointerEventTypes.POINTERDOUBLETAP,
                                a = new e.PointerInfoPre(o, t, s._unTranslatedPointerX, s._unTranslatedPointerY);
                            if (s.onPrePointerObservable.notifyObservers(a, o), a.skipOnPointerObservable) return
                        }
                    }
                    if (s.cameraToUseForPointers || s.activeCamera) {
                        if (s.pointerUpPredicate || (s.pointerUpPredicate = function(e) {
                                return e.isPickable && e.isVisible && e.isReady() && e.isEnabled()
                            }), !s._meshPickProceed && (e.ActionManager && e.ActionManager.HasTriggers || s.onPointerObservable.hasObservers()) && s._initActionManager(null, r), n || (n = s._currentPickResult), s._processPointerUp(n, t, r), s.spriteManagers.length > 0) {
                            var l = s.pickSprite(s._unTranslatedPointerX, s._unTranslatedPointerY, s._spritePredicate, !1, s.cameraToUseForPointers || void 0);
                            l && (l.hit && l.pickedSprite && l.pickedSprite.actionManager && (l.pickedSprite.actionManager.processTrigger(e.ActionManager.OnPickUpTrigger, e.ActionEvent.CreateNewFromSprite(l.pickedSprite, s, t)), l.pickedSprite.actionManager && Math.abs(s._startingPointerPosition.x - s._pointerX) < i.DragMovementThreshold && Math.abs(s._startingPointerPosition.y - s._pointerY) < i.DragMovementThreshold && l.pickedSprite.actionManager.processTrigger(e.ActionManager.OnPickTrigger, e.ActionEvent.CreateNewFromSprite(l.pickedSprite, s, t))), s._pickedDownSprite && s._pickedDownSprite.actionManager && s._pickedDownSprite !== l.pickedSprite && s._pickedDownSprite.actionManager.processTrigger(e.ActionManager.OnPickOutTrigger, e.ActionEvent.CreateNewFromSprite(s._pickedDownSprite, s, t)))
                        }
                        s._previousPickResult = s._currentPickResult
                    }
                })))
            }, this._onKeyDown = function(t) {
                var i = e.KeyboardEventTypes.KEYDOWN;
                if (s.onPreKeyboardObservable.hasObservers()) {
                    var r = new e.KeyboardInfoPre(i, t);
                    if (s.onPreKeyboardObservable.notifyObservers(r, i), r.skipOnPointerObservable) return
                }
                if (s.onKeyboardObservable.hasObservers()) {
                    var r = new e.KeyboardInfo(i, t);
                    s.onKeyboardObservable.notifyObservers(r, i)
                }
                s.actionManager && s.actionManager.processTrigger(e.ActionManager.OnKeyDownTrigger, e.ActionEvent.CreateNewFromScene(s, t))
            }, this._onKeyUp = function(t) {
                var i = e.KeyboardEventTypes.KEYUP;
                if (s.onPreKeyboardObservable.hasObservers()) {
                    var r = new e.KeyboardInfoPre(i, t);
                    if (s.onPreKeyboardObservable.notifyObservers(r, i), r.skipOnPointerObservable) return
                }
                if (s.onKeyboardObservable.hasObservers()) {
                    var r = new e.KeyboardInfo(i, t);
                    s.onKeyboardObservable.notifyObservers(r, i)
                }
                s.actionManager && s.actionManager.processTrigger(e.ActionManager.OnKeyUpTrigger, e.ActionEvent.CreateNewFromScene(s, t))
            };
            var a = this.getEngine();
            this._onCanvasFocusObserver = a.onCanvasFocusObservable.add((function() {
                c && (c.addEventListener("keydown", s._onKeyDown, !1), c.addEventListener("keyup", s._onKeyUp, !1))
            })), this._onCanvasBlurObserver = a.onCanvasBlurObservable.add((function() {
                c && (c.removeEventListener("keydown", s._onKeyDown), c.removeEventListener("keyup", s._onKeyUp))
            }));
            var l = e.Tools.GetPointerPrefix(),
                c = this._engine.getRenderingCanvas();
            c && (o && (c.addEventListener(l + "move", this._onPointerMove, !1), c.addEventListener("mousewheel", this._onPointerMove, !1), c.addEventListener("DOMMouseScroll", this._onPointerMove, !1)), n && c.addEventListener(l + "down", this._onPointerDown, !1), r && window.addEventListener(l + "up", this._onPointerUp, !1), c.tabIndex = 1)
        }, i.prototype.detachControl = function() {
            var t = this.getEngine(),
                i = e.Tools.GetPointerPrefix(),
                r = t.getRenderingCanvas();
            r && (r.removeEventListener(i + "move", this._onPointerMove), r.removeEventListener(i + "down", this._onPointerDown), window.removeEventListener(i + "up", this._onPointerUp), this._onCanvasBlurObserver && t.onCanvasBlurObservable.remove(this._onCanvasBlurObserver), this._onCanvasFocusObserver && t.onCanvasFocusObservable.remove(this._onCanvasFocusObserver), r.removeEventListener("mousewheel", this._onPointerMove), r.removeEventListener("DOMMouseScroll", this._onPointerMove), r.removeEventListener("keydown", this._onKeyDown), r.removeEventListener("keyup", this._onKeyUp), this.onKeyboardObservable.clear(), this.onPreKeyboardObservable.clear(), this.onPointerObservable.clear(), this.onPrePointerObservable.clear())
        }, i.prototype.isReady = function() {
            if (this._isDisposed) return !1;
            if (this._pendingData.length > 0) return !1;
            var t, i = this.getEngine();
            for (t = 0; t < this._geometries.length; t++) {
                if (this._geometries[t].delayLoadState === e.Engine.DELAYLOADSTATE_LOADING) return !1
            }
            for (t = 0; t < this.meshes.length; t++) {
                var r = this.meshes[t];
                if (r.isEnabled() && (r.subMeshes && 0 !== r.subMeshes.length)) {
                    if (!r.isReady(!0)) return !1;
                    for (var n = "InstancedMesh" === r.getClassName() || i.getCaps().instancedArrays && r.instances.length > 0, o = 0, s = this.effectLayers; o < s.length; o++) {
                        var a = s[o];
                        if (a.hasMesh(r))
                            for (var l = 0, c = r.subMeshes; l < c.length; l++) {
                                var h = c[l];
                                if (!a.isReady(h, n)) return !1
                            }
                    }
                }
            }
            return !0
        }, i.prototype.resetCachedMaterial = function() {
            this._cachedMaterial = null, this._cachedEffect = null, this._cachedVisibility = null
        }, i.prototype.registerBeforeRender = function(e) {
            this.onBeforeRenderObservable.add(e)
        }, i.prototype.unregisterBeforeRender = function(e) {
            this.onBeforeRenderObservable.removeCallback(e)
        }, i.prototype.registerAfterRender = function(e) {
            this.onAfterRenderObservable.add(e)
        }, i.prototype.unregisterAfterRender = function(e) {
            this.onAfterRenderObservable.removeCallback(e)
        }, i.prototype._executeOnceBeforeRender = function(e) {
            var t = this,
                i = function() {
                    e(), setTimeout((function() {
                        t.unregisterBeforeRender(i)
                    }))
                };
            this.registerBeforeRender(i)
        }, i.prototype.executeOnceBeforeRender = function(e, t) {
            var i = this;
            void 0 !== t ? setTimeout((function() {
                i._executeOnceBeforeRender(e)
            }), t) : this._executeOnceBeforeRender(e)
        }, i.prototype._addPendingData = function(e) {
            this._pendingData.push(e)
        }, i.prototype._removePendingData = function(e) {
            var t = this.isLoading,
                i = this._pendingData.indexOf(e); - 1 !== i && this._pendingData.splice(i, 1), t && !this.isLoading && this.onDataLoadedObservable.notifyObservers(this)
        }, i.prototype.getWaitingItemsCount = function() {
            return this._pendingData.length
        }, Object.defineProperty(i.prototype, "isLoading", {
            get: function() {
                return this._pendingData.length > 0
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.executeWhenReady = function(e) {
            var t = this;
            this.onReadyObservable.add(e), -1 === this._executeWhenReadyTimeoutId && (this._executeWhenReadyTimeoutId = setTimeout((function() {
                t._checkIsReady()
            }), 150))
        }, i.prototype.whenReadyAsync = function() {
            var e = this;
            return new Promise(function(t) {
                e.executeWhenReady((function() {
                    t()
                }))
            })
        }, i.prototype._checkIsReady = function() {
            var e = this;
            if (this.isReady()) return this.onReadyObservable.notifyObservers(this), this.onReadyObservable.clear(), void(this._executeWhenReadyTimeoutId = -1);
            this._executeWhenReadyTimeoutId = setTimeout((function() {
                e._checkIsReady()
            }), 150)
        }, i.prototype.beginAnimation = function(t, i, r, n, o, s, a) {
            if (void 0 === o && (o = 1), i > r && o > 0 && (o *= -1), this.stopAnimation(t), a || (a = new e.Animatable(this, t, i, r, n, o, s)), t.animations && a.appendAnimations(t, t.animations), t.getAnimatables)
                for (var l = t.getAnimatables(), c = 0; c < l.length; c++) this.beginAnimation(l[c], i, r, n, o, s, a);
            return a.reset(), a
        }, i.prototype.beginDirectAnimation = function(t, i, r, n, o, s, a) {
            return void 0 === s && (s = 1), new e.Animatable(this, t, r, n, o, s, a, i)
        }, i.prototype.beginDirectHierarchyAnimation = function(e, t, i, r, n, o, s, a) {
            for (var l = e.getDescendants(t), c = [], h = 0, u = l; h < u.length; h++) {
                var f = u[h];
                c.push(this.beginDirectAnimation(f, i, r, n, o, s, a))
            }
            return c
        }, i.prototype.getAnimatableByTarget = function(e) {
            for (var t = 0; t < this._activeAnimatables.length; t++)
                if (this._activeAnimatables[t].target === e) return this._activeAnimatables[t];
            return null
        }, Object.defineProperty(i.prototype, "animatables", {
            get: function() {
                return this._activeAnimatables
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.stopAnimation = function(e, t) {
            var i = this.getAnimatableByTarget(e);
            i && i.stop(t)
        }, i.prototype.stopAllAnimations = function() {
            if (this._activeAnimatables) {
                for (var e = 0; e < this._activeAnimatables.length; e++) this._activeAnimatables[e].stop();
                this._activeAnimatables = []
            }
        }, i.prototype._animate = function() {
            if (this.animationsEnabled && 0 !== this._activeAnimatables.length) {
                var t = e.Tools.Now;
                if (!this._animationTimeLast) {
                    if (this._pendingData.length > 0) return;
                    this._animationTimeLast = t
                }
                var i = this.useConstantAnimationDeltaTime ? 16 : (t - this._animationTimeLast) * this.animationTimeScale;
                this._animationTime += i, this._animationTimeLast = t;
                for (var r = 0; r < this._activeAnimatables.length; r++) this._activeAnimatables[r]._animate(this._animationTime)
            }
        }, i.prototype._switchToAlternateCameraConfiguration = function(e) {
            this._useAlternateCameraConfiguration = e
        }, i.prototype.getViewMatrix = function() {
            return this._useAlternateCameraConfiguration ? this._alternateViewMatrix : this._viewMatrix
        }, i.prototype.getProjectionMatrix = function() {
            return this._useAlternateCameraConfiguration ? this._alternateProjectionMatrix : this._projectionMatrix
        }, i.prototype.getTransformMatrix = function() {
            return this._useAlternateCameraConfiguration ? this._alternateTransformMatrix : this._transformMatrix
        }, i.prototype.setTransformMatrix = function(t, i) {
            if (this._viewUpdateFlag !== t.updateFlag || this._projectionUpdateFlag !== i.updateFlag) {
                if (this._viewUpdateFlag = t.updateFlag, this._projectionUpdateFlag = i.updateFlag, this._viewMatrix = t, this._projectionMatrix = i, this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix), this._frustumPlanes ? e.Frustum.GetPlanesToRef(this._transformMatrix, this._frustumPlanes) : this._frustumPlanes = e.Frustum.GetPlanes(this._transformMatrix), this.activeCamera && this.activeCamera._alternateCamera) {
                    var r = this.activeCamera._alternateCamera;
                    r.getViewMatrix().multiplyToRef(r.getProjectionMatrix(), e.Tmp.Matrix[0]), e.Frustum.GetRightPlaneToRef(e.Tmp.Matrix[0], this._frustumPlanes[3])
                }
                this._sceneUbo.useUbo && (this._sceneUbo.updateMatrix("viewProjection", this._transformMatrix), this._sceneUbo.updateMatrix("view", this._viewMatrix), this._sceneUbo.update())
            }
        }, i.prototype._setAlternateTransformMatrix = function(t, i) {
            this._alternateViewUpdateFlag === t.updateFlag && this._alternateProjectionUpdateFlag === i.updateFlag || (this._alternateViewUpdateFlag = t.updateFlag, this._alternateProjectionUpdateFlag = i.updateFlag, this._alternateViewMatrix = t, this._alternateProjectionMatrix = i, this._alternateTransformMatrix || (this._alternateTransformMatrix = e.Matrix.Zero()), this._alternateViewMatrix.multiplyToRef(this._alternateProjectionMatrix, this._alternateTransformMatrix), this._alternateSceneUbo || this._createAlternateUbo(), this._alternateSceneUbo.useUbo && (this._alternateSceneUbo.updateMatrix("viewProjection", this._alternateTransformMatrix), this._alternateSceneUbo.updateMatrix("view", this._alternateViewMatrix), this._alternateSceneUbo.update()))
        }, i.prototype.getSceneUniformBuffer = function() {
            return this._useAlternateCameraConfiguration ? this._alternateSceneUbo : this._sceneUbo
        }, i.prototype.getUniqueId = function() {
            var e = i._uniqueIdCounter;
            return i._uniqueIdCounter++, e
        }, i.prototype.addMesh = function(e) {
            this.meshes.push(e), this.collisionCoordinator && this.collisionCoordinator.onMeshAdded(e), e._resyncLightSources(), this.onNewMeshAddedObservable.notifyObservers(e)
        }, i.prototype.removeMesh = function(e) {
            var t = this.meshes.indexOf(e);
            return -1 !== t && this.meshes.splice(t, 1), this.onMeshRemovedObservable.notifyObservers(e), t
        }, i.prototype.addTransformNode = function(e) {
            this.transformNodes.push(e), this.onNewTransformNodeAddedObservable.notifyObservers(e)
        }, i.prototype.removeTransformNode = function(e) {
            var t = this.transformNodes.indexOf(e);
            return -1 !== t && this.transformNodes.splice(t, 1), this.onTransformNodeRemovedObservable.notifyObservers(e), t
        }, i.prototype.removeSkeleton = function(e) {
            var t = this.skeletons.indexOf(e);
            return -1 !== t && this.skeletons.splice(t, 1), t
        }, i.prototype.removeMorphTargetManager = function(e) {
            var t = this.morphTargetManagers.indexOf(e);
            return -1 !== t && this.morphTargetManagers.splice(t, 1), t
        }, i.prototype.removeLight = function(e) {
            var t = this.lights.indexOf(e);
            if (-1 !== t) {
                for (var i = 0, r = this.meshes; i < r.length; i++) {
                    r[i]._removeLightSource(e)
                }
                this.lights.splice(t, 1), this.sortLightsByPriority()
            }
            return this.onLightRemovedObservable.notifyObservers(e), t
        }, i.prototype.removeCamera = function(e) {
            var t = this.cameras.indexOf(e); - 1 !== t && this.cameras.splice(t, 1);
            var i = this.activeCameras.indexOf(e);
            return -1 !== i && this.activeCameras.splice(i, 1), this.activeCamera === e && (this.cameras.length > 0 ? this.activeCamera = this.cameras[0] : this.activeCamera = null), this.onCameraRemovedObservable.notifyObservers(e), t
        }, i.prototype.removeParticleSystem = function(e) {
            var t = this.particleSystems.indexOf(e);
            return -1 !== t && this.particleSystems.splice(t, 1), t
        }, i.prototype.removeAnimation = function(e) {
            var t = this.animations.indexOf(e);
            return -1 !== t && this.animations.splice(t, 1), t
        }, i.prototype.removeMultiMaterial = function(e) {
            var t = this.multiMaterials.indexOf(e);
            return -1 !== t && this.multiMaterials.splice(t, 1), t
        }, i.prototype.removeMaterial = function(e) {
            var t = this.materials.indexOf(e);
            return -1 !== t && this.materials.splice(t, 1), t
        }, i.prototype.removeLensFlareSystem = function(e) {
            var t = this.lensFlareSystems.indexOf(e);
            return -1 !== t && this.lensFlareSystems.splice(t, 1), t
        }, i.prototype.removeActionManager = function(e) {
            var t = this._actionManagers.indexOf(e);
            return -1 !== t && this._actionManagers.splice(t, 1), t
        }, i.prototype.addLight = function(e) {
            this.lights.push(e), this.sortLightsByPriority();
            for (var t = 0, i = this.meshes; t < i.length; t++) {
                var r = i[t]; - 1 === r._lightSources.indexOf(e) && (r._lightSources.push(e), r._resyncLightSources())
            }
            this.onNewLightAddedObservable.notifyObservers(e)
        }, i.prototype.sortLightsByPriority = function() {
            this.requireLightSorting && this.lights.sort(e.Light.CompareLightsPriority)
        }, i.prototype.addCamera = function(e) {
            this.cameras.push(e), this.onNewCameraAddedObservable.notifyObservers(e)
        }, i.prototype.addSkeleton = function(e) {
            this.skeletons.push(e)
        }, i.prototype.addParticleSystem = function(e) {
            this.particleSystems.push(e)
        }, i.prototype.addAnimation = function(e) {
            this.animations.push(e)
        }, i.prototype.addMultiMaterial = function(e) {
            this.multiMaterials.push(e)
        }, i.prototype.addMaterial = function(e) {
            this.materials.push(e)
        }, i.prototype.addMorphTargetManager = function(e) {
            this.morphTargetManagers.push(e)
        }, i.prototype.addGeometry = function(e) {
            this._geometries.push(e)
        }, i.prototype.addLensFlareSystem = function(e) {
            this.lensFlareSystems.push(e)
        }, i.prototype.addActionManager = function(e) {
            this._actionManagers.push(e)
        }, i.prototype.switchActiveCamera = function(e, t) {
            void 0 === t && (t = !0);
            var i = this._engine.getRenderingCanvas();
            i && (this.activeCamera && this.activeCamera.detachControl(i), this.activeCamera = e, t && e.attachControl(i))
        }, i.prototype.setActiveCameraByID = function(e) {
            var t = this.getCameraByID(e);
            return t ? (this.activeCamera = t, t) : null
        }, i.prototype.setActiveCameraByName = function(e) {
            var t = this.getCameraByName(e);
            return t ? (this.activeCamera = t, t) : null
        }, i.prototype.getAnimationGroupByName = function(e) {
            for (var t = 0; t < this.animationGroups.length; t++)
                if (this.animationGroups[t].name === e) return this.animationGroups[t];
            return null
        }, i.prototype.getMaterialByID = function(e) {
            for (var t = 0; t < this.materials.length; t++)
                if (this.materials[t].id === e) return this.materials[t];
            return null
        }, i.prototype.getMaterialByName = function(e) {
            for (var t = 0; t < this.materials.length; t++)
                if (this.materials[t].name === e) return this.materials[t];
            return null
        }, i.prototype.getLensFlareSystemByName = function(e) {
            for (var t = 0; t < this.lensFlareSystems.length; t++)
                if (this.lensFlareSystems[t].name === e) return this.lensFlareSystems[t];
            return null
        }, i.prototype.getLensFlareSystemByID = function(e) {
            for (var t = 0; t < this.lensFlareSystems.length; t++)
                if (this.lensFlareSystems[t].id === e) return this.lensFlareSystems[t];
            return null
        }, i.prototype.getCameraByID = function(e) {
            for (var t = 0; t < this.cameras.length; t++)
                if (this.cameras[t].id === e) return this.cameras[t];
            return null
        }, i.prototype.getCameraByUniqueID = function(e) {
            for (var t = 0; t < this.cameras.length; t++)
                if (this.cameras[t].uniqueId === e) return this.cameras[t];
            return null
        }, i.prototype.getCameraByName = function(e) {
            for (var t = 0; t < this.cameras.length; t++)
                if (this.cameras[t].name === e) return this.cameras[t];
            return null
        }, i.prototype.getBoneByID = function(e) {
            for (var t = 0; t < this.skeletons.length; t++)
                for (var i = this.skeletons[t], r = 0; r < i.bones.length; r++)
                    if (i.bones[r].id === e) return i.bones[r];
            return null
        }, i.prototype.getBoneByName = function(e) {
            for (var t = 0; t < this.skeletons.length; t++)
                for (var i = this.skeletons[t], r = 0; r < i.bones.length; r++)
                    if (i.bones[r].name === e) return i.bones[r];
            return null
        }, i.prototype.getLightByName = function(e) {
            for (var t = 0; t < this.lights.length; t++)
                if (this.lights[t].name === e) return this.lights[t];
            return null
        }, i.prototype.getLightByID = function(e) {
            for (var t = 0; t < this.lights.length; t++)
                if (this.lights[t].id === e) return this.lights[t];
            return null
        }, i.prototype.getLightByUniqueID = function(e) {
            for (var t = 0; t < this.lights.length; t++)
                if (this.lights[t].uniqueId === e) return this.lights[t];
            return null
        }, i.prototype.getParticleSystemByID = function(e) {
            for (var t = 0; t < this.particleSystems.length; t++)
                if (this.particleSystems[t].id === e) return this.particleSystems[t];
            return null
        }, i.prototype.getGeometryByID = function(e) {
            for (var t = 0; t < this._geometries.length; t++)
                if (this._geometries[t].id === e) return this._geometries[t];
            return null
        }, i.prototype.pushGeometry = function(e, t) {
            return !(!t && this.getGeometryByID(e.id)) && (this._geometries.push(e), this.collisionCoordinator && this.collisionCoordinator.onGeometryAdded(e), this.onNewGeometryAddedObservable.notifyObservers(e), !0)
        }, i.prototype.removeGeometry = function(e) {
            var t = this._geometries.indexOf(e);
            return t > -1 && (this._geometries.splice(t, 1), this.collisionCoordinator && this.collisionCoordinator.onGeometryDeleted(e), this.onGeometryRemovedObservable.notifyObservers(e), !0)
        }, i.prototype.getGeometries = function() {
            return this._geometries
        }, i.prototype.getMeshByID = function(e) {
            for (var t = 0; t < this.meshes.length; t++)
                if (this.meshes[t].id === e) return this.meshes[t];
            return null
        }, i.prototype.getMeshesByID = function(e) {
            return this.meshes.filter((function(t) {
                return t.id === e
            }))
        }, i.prototype.getTransformNodeByID = function(e) {
            for (var t = 0; t < this.transformNodes.length; t++)
                if (this.transformNodes[t].id === e) return this.transformNodes[t];
            return null
        }, i.prototype.getTransformNodesByID = function(e) {
            return this.transformNodes.filter((function(t) {
                return t.id === e
            }))
        }, i.prototype.getMeshByUniqueID = function(e) {
            for (var t = 0; t < this.meshes.length; t++)
                if (this.meshes[t].uniqueId === e) return this.meshes[t];
            return null
        }, i.prototype.getLastMeshByID = function(e) {
            for (var t = this.meshes.length - 1; t >= 0; t--)
                if (this.meshes[t].id === e) return this.meshes[t];
            return null
        }, i.prototype.getLastEntryByID = function(e) {
            var t;
            for (t = this.meshes.length - 1; t >= 0; t--)
                if (this.meshes[t].id === e) return this.meshes[t];
            for (t = this.transformNodes.length - 1; t >= 0; t--)
                if (this.transformNodes[t].id === e) return this.transformNodes[t];
            for (t = this.cameras.length - 1; t >= 0; t--)
                if (this.cameras[t].id === e) return this.cameras[t];
            for (t = this.lights.length - 1; t >= 0; t--)
                if (this.lights[t].id === e) return this.lights[t];
            return null
        }, i.prototype.getNodeByID = function(e) {
            var t = this.getMeshByID(e);
            if (t) return t;
            var i = this.getLightByID(e);
            if (i) return i;
            var r = this.getCameraByID(e);
            return r || this.getBoneByID(e)
        }, i.prototype.getNodeByName = function(e) {
            var t = this.getMeshByName(e);
            if (t) return t;
            var i = this.getLightByName(e);
            if (i) return i;
            var r = this.getCameraByName(e);
            return r || this.getBoneByName(e)
        }, i.prototype.getMeshByName = function(e) {
            for (var t = 0; t < this.meshes.length; t++)
                if (this.meshes[t].name === e) return this.meshes[t];
            return null
        }, i.prototype.getTransformNodeByName = function(e) {
            for (var t = 0; t < this.transformNodes.length; t++)
                if (this.transformNodes[t].name === e) return this.transformNodes[t];
            return null
        }, i.prototype.getSoundByName = function(t) {
            var i;
            if (e.AudioEngine) {
                for (i = 0; i < this.mainSoundTrack.soundCollection.length; i++)
                    if (this.mainSoundTrack.soundCollection[i].name === t) return this.mainSoundTrack.soundCollection[i];
                for (var r = 0; r < this.soundTracks.length; r++)
                    for (i = 0; i < this.soundTracks[r].soundCollection.length; i++)
                        if (this.soundTracks[r].soundCollection[i].name === t) return this.soundTracks[r].soundCollection[i]
            }
            return null
        }, i.prototype.getLastSkeletonByID = function(e) {
            for (var t = this.skeletons.length - 1; t >= 0; t--)
                if (this.skeletons[t].id === e) return this.skeletons[t];
            return null
        }, i.prototype.getSkeletonById = function(e) {
            for (var t = 0; t < this.skeletons.length; t++)
                if (this.skeletons[t].id === e) return this.skeletons[t];
            return null
        }, i.prototype.getSkeletonByName = function(e) {
            for (var t = 0; t < this.skeletons.length; t++)
                if (this.skeletons[t].name === e) return this.skeletons[t];
            return null
        }, i.prototype.getMorphTargetManagerById = function(e) {
            for (var t = 0; t < this.morphTargetManagers.length; t++)
                if (this.morphTargetManagers[t].uniqueId === e) return this.morphTargetManagers[t];
            return null
        }, i.prototype.isActiveMesh = function(e) {
            return -1 !== this._activeMeshes.indexOf(e)
        }, i.prototype.getHighlightLayerByName = function(t) {
            for (var i = 0; i < this.effectLayers.length; i++)
                if (this.effectLayers[i].name === t && this.effectLayers[i].getEffectName() === e.HighlightLayer.EffectName) return this.effectLayers[i];
            return null
        }, i.prototype.getGlowLayerByName = function(t) {
            for (var i = 0; i < this.effectLayers.length; i++)
                if (this.effectLayers[i].name === t && this.effectLayers[i].getEffectName() === e.GlowLayer.EffectName) return this.effectLayers[i];
            return null
        }, Object.defineProperty(i.prototype, "uid", {
            get: function() {
                return this._uid || (this._uid = e.Tools.RandomId()), this._uid
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.addExternalData = function(t, i) {
            return this._externalData || (this._externalData = new e.StringDictionary), this._externalData.add(t, i)
        }, i.prototype.getExternalData = function(e) {
            return this._externalData ? this._externalData.get(e) : null
        }, i.prototype.getOrAddExternalDataWithFactory = function(t, i) {
            return this._externalData || (this._externalData = new e.StringDictionary), this._externalData.getOrAddWithFactory(t, i)
        }, i.prototype.removeExternalData = function(e) {
            return this._externalData.remove(e)
        }, i.prototype._evaluateSubMesh = function(e, t) {
            if (this.dispatchAllSubMeshesOfActiveMeshes || t.alwaysSelectAsActiveMesh || 1 === t.subMeshes.length || e.isInFrustum(this._frustumPlanes)) {
                if (t.showSubMeshesBoundingBox) {
                    var i = e.getBoundingInfo();
                    null !== i && void 0 !== i && this.getBoundingBoxRenderer().renderList.push(i.boundingBox)
                }
                var r = e.getMaterial();
                null !== r && void 0 !== r && (void 0 !== r.getRenderTargetTextures && -1 === this._processedMaterials.indexOf(r) && (this._processedMaterials.push(r), this._renderTargets.concatWithNoDuplicate(r.getRenderTargetTextures())), this._activeIndices.addCount(e.indexCount, !1), this._renderingManager.dispatch(e, t, r))
            }
        }, i.prototype._isInIntermediateRendering = function() {
            return this._intermediateRendering
        }, i.prototype.setActiveMeshCandidateProvider = function(e) {
            this._activeMeshCandidateProvider = e
        }, i.prototype.getActiveMeshCandidateProvider = function() {
            return this._activeMeshCandidateProvider
        }, i.prototype.freezeActiveMeshes = function() {
            return this._evaluateActiveMeshes(), this._activeMeshesFrozen = !0, this
        }, i.prototype.unfreezeActiveMeshes = function() {
            return this._activeMeshesFrozen = !1, this
        }, i.prototype._evaluateActiveMeshes = function() {
            if ((!this._activeMeshesFrozen || !this._activeMeshes.length) && this.activeCamera) {
                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._boundingBoxRenderer && this._boundingBoxRenderer.reset();
                var t, i, r = !0;
                if (void 0 !== this._activeMeshCandidateProvider) t = this._activeMeshCandidateProvider.getMeshes(this), r = !1 === this._activeMeshCandidateProvider.checksIsEnabled, i = void 0 !== t ? t.length : 0;
                else if (void 0 !== this._selectionOctree) {
                    var n = this._selectionOctree.select(this._frustumPlanes);
                    t = n.data, i = n.length
                } else i = this.meshes.length, t = this.meshes;
                for (var o, s, a = 0; a < i; a++) o = t[a], o.isBlocked || (this._totalVertices.addCount(o.getTotalVertices(), !1), !o.isReady() || r && !o.isEnabled() || (o.computeWorldMatrix(), o.actionManager && o.actionManager.hasSpecificTriggers([e.ActionManager.OnIntersectionEnterTrigger, e.ActionManager.OnIntersectionExitTrigger]) && this._meshesForIntersections.pushNoDuplicate(o), void 0 !== (s = o.getLOD(this.activeCamera)) && null !== s && (o._preActivate(), (o.alwaysSelectAsActiveMesh || o.isVisible && o.visibility > 0 && 0 != (o.layerMask & this.activeCamera.layerMask) && o.isInFrustum(this._frustumPlanes)) && (this._activeMeshes.push(o), this.activeCamera._activeMeshes.push(o), o._activate(this._renderId), s !== o && s._activate(this._renderId), this._activeMesh(o, s)))));
                if (this.onAfterActiveMeshesEvaluationObservable.notifyObservers(this), this.particlesEnabled) {
                    this.onBeforeParticlesRenderingObservable.notifyObservers(this);
                    for (var l = 0; l < this.particleSystems.length; l++) {
                        var c = this.particleSystems[l];
                        if (c.isStarted() && c.emitter) {
                            var h = c.emitter;
                            h.position && !h.isEnabled() || (this._activeParticleSystems.push(c), c.animate(), this._renderingManager.dispatchParticles(c))
                        }
                    }
                    this.onAfterParticlesRenderingObservable.notifyObservers(this)
                }
            }
        }, i.prototype._activeMesh = function(e, t) {
            if (this.skeletonsEnabled && null !== t.skeleton && void 0 !== t.skeleton && (this._activeSkeletons.pushNoDuplicate(t.skeleton) && t.skeleton.prepare(), t.computeBonesUsingShaders || this._softwareSkinnedMeshes.pushNoDuplicate(t)), e.showBoundingBox || this.forceShowBoundingBoxes) {
                var i = e.getBoundingInfo();
                this.getBoundingBoxRenderer().renderList.push(i.boundingBox)
            }
            if (void 0 !== t && null !== t && void 0 !== t.subMeshes && null !== t.subMeshes && t.subMeshes.length > 0) {
                var r, n;
                if (t.useOctreeForRenderingSelection && void 0 !== t._submeshesOctree && null !== t._submeshesOctree) {
                    var o = t._submeshesOctree.select(this._frustumPlanes);
                    r = o.length, n = o.data
                } else n = t.subMeshes, r = n.length;
                for (var s, a = 0; a < r; a++) s = n[a], this._evaluateSubMesh(s, t)
            }
        }, i.prototype.updateTransformMatrix = function(e) {
            this.activeCamera && this.setTransformMatrix(this.activeCamera.getViewMatrix(), this.activeCamera.getProjectionMatrix(e))
        }, i.prototype.updateAlternateTransformMatrix = function(e) {
            this._setAlternateTransformMatrix(e.getViewMatrix(), e.getProjectionMatrix())
        }, i.prototype._renderForCamera = function(t, i) {
            if (!t || !t._skipRendering) {
                var r = this._engine;
                if (this.activeCamera = t, !this.activeCamera) throw new Error("Active camera not set");
                e.Tools.StartPerformanceCounter("Rendering camera " + this.activeCamera.name), r.setViewport(this.activeCamera.viewport), this.resetCachedMaterial(), this._renderId++, this.updateTransformMatrix(), t._alternateCamera && (this.updateAlternateTransformMatrix(t._alternateCamera), this._alternateRendering = !0), this.onBeforeCameraRenderObservable.notifyObservers(this.activeCamera), this._evaluateActiveMeshes();
                for (var n = 0; n < this._softwareSkinnedMeshes.length; n++) {
                    var o = this._softwareSkinnedMeshes.data[n];
                    o.applySkeleton(o.skeleton)
                }
                this.OnBeforeRenderTargetsRenderObservable.notifyObservers(this);
                var s = !1;
                if (t.customRenderTargets && t.customRenderTargets.length > 0 && this._renderTargets.concatWithNoDuplicate(t.customRenderTargets), i && i.customRenderTargets && i.customRenderTargets.length > 0 && this._renderTargets.concatWithNoDuplicate(i.customRenderTargets), this.renderTargetsEnabled && this._renderTargets.length > 0) {
                    this._intermediateRendering = !0, e.Tools.StartPerformanceCounter("Render targets", this._renderTargets.length > 0);
                    for (var a = 0; a < this._renderTargets.length; a++) {
                        var l = this._renderTargets.data[a];
                        if (l._shouldRender()) {
                            this._renderId++;
                            var c = l.activeCamera && l.activeCamera !== this.activeCamera;
                            l.render(c, this.dumpNextRenderTargets)
                        }
                    }
                    e.Tools.EndPerformanceCounter("Render targets", this._renderTargets.length > 0), this._intermediateRendering = !1, this._renderId++, s = !0
                }
                var h = this._engine.getStencilBuffer(),
                    u = !1,
                    f = !1;
                if (this.renderTargetsEnabled && this.effectLayers && this.effectLayers.length > 0) {
                    this._intermediateRendering = !0;
                    for (var d = 0; d < this.effectLayers.length; d++) {
                        var p = this.effectLayers[d];
                        if (p.shouldRender() && (!p.camera || p.camera.cameraRigMode === e.Camera.RIG_MODE_NONE && t === p.camera || p.camera.cameraRigMode !== e.Camera.RIG_MODE_NONE && p.camera._rigCameras.indexOf(t) > -1)) {
                            u = !0, f = f || p.needStencil();
                            var l = p._mainTexture;
                            l._shouldRender() && (this._renderId++, l.render(!1, !1), s = !0)
                        }
                    }
                    this._intermediateRendering = !1, this._renderId++
                }
                s && r.restoreDefaultFramebuffer(), this.OnAfterRenderTargetsRenderObservable.notifyObservers(this), this.postProcessManager._prepareFrame();
                var _, m;
                if (this.layers.length) {
                    for (r.setDepthBuffer(!1), _ = 0; _ < this.layers.length; _++) m = this.layers[_], m.isBackground && 0 != (m.layerMask & this.activeCamera.layerMask) && m.render();
                    r.setDepthBuffer(!0)
                }
                if (f && this._engine.setStencilBuffer(!0), this.onBeforeDrawPhaseObservable.notifyObservers(this), this._renderingManager.render(null, null, !0, !0), this.onAfterDrawPhaseObservable.notifyObservers(this), f && this._engine.setStencilBuffer(h), this._boundingBoxRenderer && this._boundingBoxRenderer.render(), this.lensFlaresEnabled) {
                    e.Tools.StartPerformanceCounter("Lens flares", this.lensFlareSystems.length > 0);
                    for (var g = 0; g < this.lensFlareSystems.length; g++) {
                        var v = this.lensFlareSystems[g];
                        0 != (t.layerMask & v.layerMask) && v.render()
                    }
                    e.Tools.EndPerformanceCounter("Lens flares", this.lensFlareSystems.length > 0)
                }
                if (this.layers.length) {
                    for (r.setDepthBuffer(!1), _ = 0; _ < this.layers.length; _++) m = this.layers[_], m.isBackground || 0 == (m.layerMask & this.activeCamera.layerMask) || m.render();
                    r.setDepthBuffer(!0)
                }
                if (u) {
                    r.setDepthBuffer(!1);
                    for (var d = 0; d < this.effectLayers.length; d++) this.effectLayers[d].shouldRender() && this.effectLayers[d].render();
                    r.setDepthBuffer(!0)
                }
                this.postProcessManager._finalizeFrame(t.isIntermediate), this._renderTargets.reset(), this._alternateRendering = !1, this.onAfterCameraRenderObservable.notifyObservers(this.activeCamera), e.Tools.EndPerformanceCounter("Rendering camera " + this.activeCamera.name)
            }
        }, i.prototype._processSubCameras = function(t) {
            if (t.cameraRigMode === e.Camera.RIG_MODE_NONE) return void this._renderForCamera(t);
            for (var i = 0; i < t._rigCameras.length; i++) this._renderForCamera(t._rigCameras[i], t);
            this.activeCamera = t, this.setTransformMatrix(this.activeCamera.getViewMatrix(), this.activeCamera.getProjectionMatrix())
        }, i.prototype._checkIntersections = function() {
            for (var t = 0; t < this._meshesForIntersections.length; t++) {
                var i = this._meshesForIntersections.data[t];
                if (i.actionManager)
                    for (var r = 0; r < i.actionManager.actions.length; r++) {
                        var n = i.actionManager.actions[r];
                        if (n.trigger === e.ActionManager.OnIntersectionEnterTrigger || n.trigger === e.ActionManager.OnIntersectionExitTrigger) {
                            var o = n.getTriggerParameter(),
                                s = o instanceof e.AbstractMesh ? o : o.mesh,
                                a = s.intersectsMesh(i, o.usePreciseIntersection),
                                l = i._intersectionsInProgress.indexOf(s);
                            a && -1 === l ? n.trigger === e.ActionManager.OnIntersectionEnterTrigger ? (n._executeCurrent(e.ActionEvent.CreateNew(i, void 0, s)), i._intersectionsInProgress.push(s)) : n.trigger === e.ActionManager.OnIntersectionExitTrigger && i._intersectionsInProgress.push(s) : !a && l > -1 && (n.trigger === e.ActionManager.OnIntersectionExitTrigger && n._executeCurrent(e.ActionEvent.CreateNew(i, void 0, s)), i.actionManager.hasSpecificTrigger(e.ActionManager.OnIntersectionExitTrigger) && n.trigger !== e.ActionManager.OnIntersectionExitTrigger || i._intersectionsInProgress.splice(l, 1))
                        }
                    }
            }
        }, i.prototype.render = function() {
            if (!this.isDisposed) {
                if (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(e.ActionManager.OnEveryFrameTrigger), this.simplificationQueue && !this.simplificationQueue.running && this.simplificationQueue.executeNext(), this._engine.isDeterministicLockStep()) {
                    var t = Math.max(i.MinDeltaTime, Math.min(this._engine.getDeltaTime(), i.MaxDeltaTime)) + this._timeAccumulator,
                        r = 1e3 / 60;
                    this._physicsEngine && (r = 1e3 * this._physicsEngine.getTimeStep());
                    var n = 0,
                        o = this._engine.getLockstepMaxSteps(),
                        s = Math.floor(t / 60);
                    s = Math.min(s, o);
                    do {
                        this.onBeforeStepObservable.notifyObservers(this), this._animationRatio = .06 * r, this._animate(), this.onAfterAnimationsObservable.notifyObservers(this), this._physicsEngine && (this.onBeforePhysicsObservable.notifyObservers(this), this._physicsEngine._step(r / 1e3), this.onAfterPhysicsObservable.notifyObservers(this)), this.onAfterStepObservable.notifyObservers(this), this._currentStepId++, n++, t -= r
                    } while (t > 0 && n < s);
                    this._timeAccumulator = t < 0 ? 0 : t
                } else {
                    var t = this.useConstantAnimationDeltaTime ? 16 : Math.max(i.MinDeltaTime, Math.min(this._engine.getDeltaTime(), i.MaxDeltaTime));
                    this._animationRatio = .06 * t, this._animate(), this.onAfterAnimationsObservable.notifyObservers(this), this._physicsEngine && (this.onBeforePhysicsObservable.notifyObservers(this), this._physicsEngine._step(t / 1e3), this.onAfterPhysicsObservable.notifyObservers(this))
                }
                if (this._gamepadManager && this._gamepadManager._isMonitoring && this._gamepadManager._checkGamepadsStatus(), this.onBeforeRenderObservable.notifyObservers(this), this.activeCameras.length > 0)
                    for (var a = 0; a < this.activeCameras.length; a++) {
                        var l = this.activeCameras[a];
                        if (l.update(), l.cameraRigMode !== e.Camera.RIG_MODE_NONE)
                            for (var c = 0; c < l._rigCameras.length; c++) l._rigCameras[c].update()
                    } else if (this.activeCamera && (this.activeCamera.update(), this.activeCamera.cameraRigMode !== e.Camera.RIG_MODE_NONE))
                        for (var c = 0; c < this.activeCamera._rigCameras.length; c++) this.activeCamera._rigCameras[c].update();
                this.OnBeforeRenderTargetsRenderObservable.notifyObservers(this);
                var h = this.getEngine(),
                    u = this.activeCamera;
                if (this.renderTargetsEnabled) {
                    e.Tools.StartPerformanceCounter("Custom render targets", this.customRenderTargets.length > 0), this._intermediateRendering = !0;
                    for (var f = 0; f < this.customRenderTargets.length; f++) {
                        var d = this.customRenderTargets[f];
                        if (d._shouldRender()) {
                            if (this._renderId++, this.activeCamera = d.activeCamera || this.activeCamera, !this.activeCamera) throw new Error("Active camera not set");
                            h.setViewport(this.activeCamera.viewport), this.updateTransformMatrix(), d.render(u !== this.activeCamera, this.dumpNextRenderTargets)
                        }
                    }
                    e.Tools.EndPerformanceCounter("Custom render targets", this.customRenderTargets.length > 0), this._intermediateRendering = !1, this._renderId++
                }
                if (this.customRenderTargets.length > 0 && h.restoreDefaultFramebuffer(), this.OnAfterRenderTargetsRenderObservable.notifyObservers(this), this.activeCamera = u, this.proceduralTexturesEnabled) {
                    e.Tools.StartPerformanceCounter("Procedural textures", this._proceduralTextures.length > 0);
                    for (var p = 0; p < this._proceduralTextures.length; p++) {
                        var _ = this._proceduralTextures[p];
                        _._shouldRender() && _.render()
                    }
                    e.Tools.EndPerformanceCounter("Procedural textures", this._proceduralTextures.length > 0)
                }
                if ((this.autoClearDepthAndStencil || this.autoClear) && this._engine.clear(this.clearColor, this.autoClear || this.forceWireframe || this.forcePointsCloud, this.autoClearDepthAndStencil, this.autoClearDepthAndStencil), this.shadowsEnabled)
                    for (var m = 0; m < this.lights.length; m++) {
                        var g = this.lights[m],
                            v = g.getShadowGenerator();
                        if (g.isEnabled() && g.shadowEnabled && v) {
                            var y = v.getShadowMap(); - 1 !== this.textures.indexOf(y) && this._renderTargets.push(y)
                        }
                    }
                for (var b in this._depthRenderer) this._renderTargets.push(this._depthRenderer[b].getDepthMap());
                if (this._geometryBufferRenderer && this._renderTargets.push(this._geometryBufferRenderer.getGBuffer()), this._postProcessRenderPipelineManager && this._postProcessRenderPipelineManager.update(), this.activeCameras.length > 0)
                    for (var a = 0; a < this.activeCameras.length; a++) a > 0 && this._engine.clear(null, !1, !0, !0), this._processSubCameras(this.activeCameras[a]);
                else {
                    if (!this.activeCamera) throw new Error("No camera defined");
                    this._processSubCameras(this.activeCamera)
                }
                this._checkIntersections(), e.AudioEngine && this._updateAudioParameters(), this.afterRender && this.afterRender(), this.onAfterRenderObservable.notifyObservers(this);
                for (var c = 0; c < this._toBeDisposed.length; c++) {
                    var x = this._toBeDisposed.data[c];
                    x && x.dispose(), this._toBeDisposed[c] = null
                }
                this._toBeDisposed.reset(), this.dumpNextRenderTargets && (this.dumpNextRenderTargets = !1), this._activeBones.addCount(0, !0), this._activeIndices.addCount(0, !0), this._activeParticles.addCount(0, !0)
            }
        }, i.prototype._updateAudioParameters = function() {
            if (this.audioEnabled && this._mainSoundTrack && (0 !== this._mainSoundTrack.soundCollection.length || 1 !== this.soundTracks.length)) {
                var t, i = e.Engine.audioEngine;
                if ((t = this.activeCameras.length > 0 ? this.activeCameras[0] : this.activeCamera) && i.canUseWebAudio && i.audioContext) {
                    i.audioContext.listener.setPosition(t.position.x, t.position.y, t.position.z), t.rigCameras && t.rigCameras.length > 0 && (t = t.rigCameras[0]);
                    var r = e.Matrix.Invert(t.getViewMatrix()),
                        n = e.Vector3.TransformNormal(new e.Vector3(0, 0, -1), r);
                    n.normalize(), isNaN(n.x) || isNaN(n.y) || isNaN(n.z) || i.audioContext.listener.setOrientation(n.x, n.y, n.z, 0, 1, 0);
                    var o;
                    for (o = 0; o < this.mainSoundTrack.soundCollection.length; o++) {
                        var s = this.mainSoundTrack.soundCollection[o];
                        s.useCustomAttenuation && s.updateDistanceFromListener()
                    }
                    for (o = 0; o < this.soundTracks.length; o++)
                        for (var a = 0; a < this.soundTracks[o].soundCollection.length; a++) s = this.soundTracks[o].soundCollection[a], s.useCustomAttenuation && s.updateDistanceFromListener()
                }
            }
        }, Object.defineProperty(i.prototype, "audioEnabled", {
            get: function() {
                return this._audioEnabled
            },
            set: function(t) {
                this._audioEnabled = t, e.AudioEngine && (this._audioEnabled ? this._enableAudio() : this._disableAudio())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._disableAudio = function() {
            var e;
            for (e = 0; e < this.mainSoundTrack.soundCollection.length; e++) this.mainSoundTrack.soundCollection[e].pause();
            for (e = 0; e < this.soundTracks.length; e++)
                for (var t = 0; t < this.soundTracks[e].soundCollection.length; t++) this.soundTracks[e].soundCollection[t].pause()
        }, i.prototype._enableAudio = function() {
            var e;
            for (e = 0; e < this.mainSoundTrack.soundCollection.length; e++) this.mainSoundTrack.soundCollection[e].isPaused && this.mainSoundTrack.soundCollection[e].play();
            for (e = 0; e < this.soundTracks.length; e++)
                for (var t = 0; t < this.soundTracks[e].soundCollection.length; t++) this.soundTracks[e].soundCollection[t].isPaused && this.soundTracks[e].soundCollection[t].play()
        }, Object.defineProperty(i.prototype, "headphone", {
            get: function() {
                return this._headphone
            },
            set: function(t) {
                this._headphone = t, e.AudioEngine && (this._headphone ? this._switchAudioModeForHeadphones() : this._switchAudioModeForNormalSpeakers())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._switchAudioModeForHeadphones = function() {
            this.mainSoundTrack.switchPanningModelToHRTF();
            for (var e = 0; e < this.soundTracks.length; e++) this.soundTracks[e].switchPanningModelToHRTF()
        }, i.prototype._switchAudioModeForNormalSpeakers = function() {
            this.mainSoundTrack.switchPanningModelToEqualPower();
            for (var e = 0; e < this.soundTracks.length; e++) this.soundTracks[e].switchPanningModelToEqualPower()
        }, i.prototype.enableDepthRenderer = function(t) {
            if (!(t = t || this.activeCamera)) throw "No camera available to enable depth renderer";
            return this._depthRenderer[t.id] || (this._depthRenderer[t.id] = new e.DepthRenderer(this, e.Engine.TEXTURETYPE_FLOAT, t)), this._depthRenderer[t.id]
        }, i.prototype.disableDepthRenderer = function(e) {
            (e = e || this.activeCamera) && this._depthRenderer[e.id] && (this._depthRenderer[e.id].dispose(), delete this._depthRenderer[e.id])
        }, i.prototype.enableGeometryBufferRenderer = function(t) {
            return void 0 === t && (t = 1), this._geometryBufferRenderer ? this._geometryBufferRenderer : (this._geometryBufferRenderer = new e.GeometryBufferRenderer(this, t), this._geometryBufferRenderer.isSupported || (this._geometryBufferRenderer = null), this._geometryBufferRenderer)
        }, i.prototype.disableGeometryBufferRenderer = function() {
            this._geometryBufferRenderer && (this._geometryBufferRenderer.dispose(), this._geometryBufferRenderer = null)
        }, i.prototype.freezeMaterials = function() {
            for (var e = 0; e < this.materials.length; e++) this.materials[e].freeze()
        }, i.prototype.unfreezeMaterials = function() {
            for (var e = 0; e < this.materials.length; e++) this.materials[e].unfreeze()
        }, i.prototype.dispose = function() {
            this.beforeRender = null, this.afterRender = null, this.skeletons = [], this.morphTargetManagers = [], this.importedMeshesFiles = new Array, this.stopAllAnimations(), this.resetCachedMaterial();
            for (var t in this._depthRenderer) this._depthRenderer[t].dispose();
            this._gamepadManager && (this._gamepadManager.dispose(), this._gamepadManager = null), this.activeCamera && (this.activeCamera._activeMeshes.dispose(), this.activeCamera = null), this._activeMeshes.dispose(), this._renderingManager.dispose(), this._processedMaterials.dispose(), this._activeParticleSystems.dispose(), this._activeSkeletons.dispose(), this._softwareSkinnedMeshes.dispose(), this._renderTargets.dispose(), this._boundingBoxRenderer && this._boundingBoxRenderer.dispose(), this._meshesForIntersections.dispose(), this._toBeDisposed.dispose();
            for (var i = 0, r = this._activeRequests; i < r.length; i++) {
                r[i].abort()
            }
            this._debugLayer && this._debugLayer.hide(), this.onDisposeObservable.notifyObservers(this), 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.onBeforeSpritesRenderingObservable.clear(), this.onAfterSpritesRenderingObservable.clear(), this.onBeforeDrawPhaseObservable.clear(), this.onAfterDrawPhaseObservable.clear(), this.onBeforePhysicsObservable.clear(), this.onAfterPhysicsObservable.clear(), this.onBeforeAnimationsObservable.clear(), this.onAfterAnimationsObservable.clear(), this.onDataLoadedObservable.clear(), this.detachControl(), e.AudioEngine && this.disposeSounds(), this.VRHelper && this.VRHelper.dispose();
            var n = this._engine.getRenderingCanvas();
            if (n) {
                var o;
                for (o = 0; o < this.cameras.length; o++) this.cameras[o].detachControl(n)
            }
            for (; this.animationGroups.length;) this.animationGroups[0].dispose();
            for (; this.lights.length;) this.lights[0].dispose();
            for (; this.meshes.length;) this.meshes[0].dispose(!0);
            for (; this.transformNodes.length;) this.removeTransformNode(this.transformNodes[0]);
            for (; this.cameras.length;) this.cameras[0].dispose();
            for (this.defaultMaterial && this.defaultMaterial.dispose(); this.multiMaterials.length;) this.multiMaterials[0].dispose();
            for (; this.materials.length;) this.materials[0].dispose();
            for (; this.particleSystems.length;) this.particleSystems[0].dispose();
            for (; this.spriteManagers.length;) this.spriteManagers[0].dispose();
            for (; this.postProcesses.length;) this.postProcesses[0].dispose();
            for (; this.layers.length;) this.layers[0].dispose();
            for (; this.effectLayers.length;) this.effectLayers[0].dispose();
            for (; this.textures.length;) this.textures[0].dispose();
            this._sceneUbo.dispose(), this._alternateSceneUbo && this._alternateSceneUbo.dispose(), this.postProcessManager.dispose(), this._postProcessRenderPipelineManager && this._postProcessRenderPipelineManager.dispose(), this._physicsEngine && this.disablePhysicsEngine(), o = this._engine.scenes.indexOf(this), o > -1 && this._engine.scenes.splice(o, 1), this._engine.wipeCaches(!0), this._isDisposed = !0
        }, Object.defineProperty(i.prototype, "isDisposed", {
            get: function() {
                return this._isDisposed
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.disposeSounds = function() {
            if (this._mainSoundTrack) {
                this.mainSoundTrack.dispose();
                for (var e = 0; e < this.soundTracks.length; e++) this.soundTracks[e].dispose()
            }
        }, i.prototype.getWorldExtends = function(t) {
            var i = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),
                r = new e.Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
            return t = t || function() {
                return !0
            }, this.meshes.filter(t).forEach((function(t) {
                if (t.computeWorldMatrix(!0), t.subMeshes && 0 !== t.subMeshes.length && !t.infiniteDistance) {
                    var n = t.getBoundingInfo(),
                        o = n.boundingBox.minimumWorld,
                        s = n.boundingBox.maximumWorld;
                    e.Tools.CheckExtends(o, i, r), e.Tools.CheckExtends(s, i, r)
                }
            })), {
                min: i,
                max: r
            }
        }, i.prototype.createOrUpdateSelectionOctree = function(t, i) {
            void 0 === t && (t = 64), void 0 === i && (i = 2), this._selectionOctree || (this._selectionOctree = new e.Octree(e.Octree.CreationFuncForMeshes, t, i));
            var r = this.getWorldExtends();
            return this._selectionOctree.update(r.min, r.max, this.meshes), this._selectionOctree
        }, i.prototype.createPickingRay = function(t, i, r, n, o) {
            void 0 === o && (o = !1);
            var s = e.Ray.Zero();
            return this.createPickingRayToRef(t, i, r, s, n, o), s
        }, i.prototype.createPickingRayToRef = function(t, i, r, n, o, s) {
            void 0 === s && (s = !1);
            var a = this._engine;
            if (!o) {
                if (!this.activeCamera) throw new Error("Active camera not set");
                o = this.activeCamera
            }
            var l = o.viewport,
                c = l.toGlobal(a.getRenderWidth(), a.getRenderHeight());
            return t = t / this._engine.getHardwareScalingLevel() - c.x, i = i / this._engine.getHardwareScalingLevel() - (this._engine.getRenderHeight() - c.y - c.height), n.update(t, i, c.width, c.height, r || e.Matrix.Identity(), s ? e.Matrix.Identity() : o.getViewMatrix(), o.getProjectionMatrix()), this
        }, i.prototype.createPickingRayInCameraSpace = function(t, i, r) {
            var n = e.Ray.Zero();
            return this.createPickingRayInCameraSpaceToRef(t, i, n, r), n
        }, i.prototype.createPickingRayInCameraSpaceToRef = function(t, i, r, n) {
            if (!e.PickingInfo) return this;
            var o = this._engine;
            if (!n) {
                if (!this.activeCamera) throw new Error("Active camera not set");
                n = this.activeCamera
            }
            var s = n.viewport,
                a = s.toGlobal(o.getRenderWidth(), o.getRenderHeight()),
                l = e.Matrix.Identity();
            return t = t / this._engine.getHardwareScalingLevel() - a.x, i = i / this._engine.getHardwareScalingLevel() - (this._engine.getRenderHeight() - a.y - a.height), r.update(t, i, a.width, a.height, l, l, n.getProjectionMatrix()), this
        }, i.prototype._internalPick = function(t, i, r) {
            if (!e.PickingInfo) return null;
            for (var n = null, o = 0; o < this.meshes.length; o++) {
                var s = this.meshes[o];
                if (i) {
                    if (!i(s)) continue
                } else if (!s.isEnabled() || !s.isVisible || !s.isPickable) continue;
                var a = s.getWorldMatrix(),
                    l = t(a),
                    c = s.intersects(l, r);
                if (c && c.hit && ((r || null == n || !(c.distance >= n.distance)) && (n = c, r))) break
            }
            return n || new e.PickingInfo
        }, i.prototype._internalMultiPick = function(t, i) {
            if (!e.PickingInfo) return null;
            for (var r = new Array, n = 0; n < this.meshes.length; n++) {
                var o = this.meshes[n];
                if (i) {
                    if (!i(o)) continue
                } else if (!o.isEnabled() || !o.isVisible || !o.isPickable) continue;
                var s = o.getWorldMatrix(),
                    a = t(s),
                    l = o.intersects(a, !1);
                l && l.hit && r.push(l)
            }
            return r
        }, i.prototype._internalPickSprites = function(t, i, r, n) {
            if (!e.PickingInfo) return null;
            var o = null;
            if (!n) {
                if (!this.activeCamera) return null;
                n = this.activeCamera
            }
            if (this.spriteManagers.length > 0)
                for (var s = 0; s < this.spriteManagers.length; s++) {
                    var a = this.spriteManagers[s];
                    if (a.isPickable) {
                        var l = a.intersects(t, n, i, r);
                        if (l && l.hit && (r || null == o || !(l.distance >= o.distance)) && (o = l, r)) break
                    }
                }
            return o || new e.PickingInfo
        }, i.prototype.pick = function(t, i, r, n, o) {
            var s = this;
            return e.PickingInfo ? this._internalPick((function(e) {
                return s.createPickingRayToRef(t, i, e, s._tempPickingRay, o || null), s._tempPickingRay
            }), r, n) : null
        }, i.prototype.pickSprite = function(e, t, i, r, n) {
            return this.createPickingRayInCameraSpaceToRef(e, t, this._tempPickingRay, n), this._internalPickSprites(this._tempPickingRay, i, r, n)
        }, i.prototype.pickWithRay = function(t, i, r) {
            var n = this;
            return this._internalPick((function(i) {
                return n._pickWithRayInverseMatrix || (n._pickWithRayInverseMatrix = e.Matrix.Identity()), i.invertToRef(n._pickWithRayInverseMatrix), n._cachedRayForTransform || (n._cachedRayForTransform = e.Ray.Zero()), e.Ray.TransformToRef(t, n._pickWithRayInverseMatrix, n._cachedRayForTransform), n._cachedRayForTransform
            }), i, r)
        }, i.prototype.multiPick = function(e, t, i, r) {
            var n = this;
            return this._internalMultiPick((function(i) {
                return n.createPickingRay(e, t, i, r || null)
            }), i)
        }, i.prototype.multiPickWithRay = function(t, i) {
            var r = this;
            return this._internalMultiPick((function(i) {
                return r._pickWithRayInverseMatrix || (r._pickWithRayInverseMatrix = e.Matrix.Identity()), i.invertToRef(r._pickWithRayInverseMatrix), r._cachedRayForTransform || (r._cachedRayForTransform = e.Ray.Zero()), e.Ray.TransformToRef(t, r._pickWithRayInverseMatrix, r._cachedRayForTransform), r._cachedRayForTransform
            }), i)
        }, i.prototype.setPointerOverMesh = function(t) {
            this._pointerOverMesh !== t && (this._pointerOverMesh && this._pointerOverMesh.actionManager && this._pointerOverMesh.actionManager.processTrigger(e.ActionManager.OnPointerOutTrigger, e.ActionEvent.CreateNew(this._pointerOverMesh)), this._pointerOverMesh = t, this._pointerOverMesh && this._pointerOverMesh.actionManager && this._pointerOverMesh.actionManager.processTrigger(e.ActionManager.OnPointerOverTrigger, e.ActionEvent.CreateNew(this._pointerOverMesh)))
        }, i.prototype.getPointerOverMesh = function() {
            return this._pointerOverMesh
        }, i.prototype.setPointerOverSprite = function(t) {
            this._pointerOverSprite !== t && (this._pointerOverSprite && this._pointerOverSprite.actionManager && this._pointerOverSprite.actionManager.processTrigger(e.ActionManager.OnPointerOutTrigger, e.ActionEvent.CreateNewFromSprite(this._pointerOverSprite, this)), this._pointerOverSprite = t, this._pointerOverSprite && this._pointerOverSprite.actionManager && this._pointerOverSprite.actionManager.processTrigger(e.ActionManager.OnPointerOverTrigger, e.ActionEvent.CreateNewFromSprite(this._pointerOverSprite, this)))
        }, i.prototype.getPointerOverSprite = function() {
            return this._pointerOverSprite
        }, i.prototype.getPhysicsEngine = function() {
            return this._physicsEngine
        }, i.prototype.enablePhysics = function(t, i) {
            if (void 0 === t && (t = null), this._physicsEngine) return !0;
            try {
                return this._physicsEngine = new e.PhysicsEngine(t, i), !0
            } catch (t) {
                return e.Tools.Error(t.message), !1
            }
        }, i.prototype.disablePhysicsEngine = function() {
            this._physicsEngine && (this._physicsEngine.dispose(), this._physicsEngine = null)
        }, i.prototype.isPhysicsEnabled = function() {
            return void 0 !== this._physicsEngine
        }, i.prototype.deleteCompoundImpostor = function(e) {
            var t = e.parts[0].mesh;
            t.physicsImpostor && (t.physicsImpostor.dispose(), t.physicsImpostor = null)
        }, i.prototype._rebuildGeometries = function() {
            for (var e = 0, t = this._geometries; e < t.length; e++) {
                t[e]._rebuild()
            }
            for (var i = 0, r = this.meshes; i < r.length; i++) {
                r[i]._rebuild()
            }
            this.postProcessManager && this.postProcessManager._rebuild();
            for (var n = 0, o = this.layers; n < o.length; n++) {
                o[n]._rebuild()
            }
            for (var s = 0, a = this.effectLayers; s < a.length; s++) {
                a[s]._rebuild()
            }
            this._boundingBoxRenderer && this._boundingBoxRenderer._rebuild();
            for (var l = 0, c = this.particleSystems; l < c.length; l++) {
                c[l].rebuild()
            }
            this._postProcessRenderPipelineManager && this._postProcessRenderPipelineManager._rebuild()
        }, i.prototype._rebuildTextures = function() {
            for (var t = 0, i = this.textures; t < i.length; t++) {
                i[t]._rebuild()
            }
            this.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag)
        }, i.prototype.createDefaultLight = function(t) {
            if (void 0 === t && (t = !1), t && this.lights)
                for (var i = 0; i < this.lights.length; i++) this.lights[i].dispose();
            0 === this.lights.length && new e.HemisphericLight("default light", e.Vector3.Up(), this)
        }, i.prototype.createDefaultCamera = function(t, i, r) {
            if (void 0 === t && (t = !1), void 0 === i && (i = !1), void 0 === r && (r = !1), i && this.activeCamera && (this.activeCamera.dispose(), this.activeCamera = null), !this.activeCamera) {
                var n, o = this.getWorldExtends(),
                    s = o.max.subtract(o.min),
                    a = o.min.add(s.scale(.5)),
                    l = 1.5 * s.length();
                if (isFinite(l) || (l = 1, a.copyFromFloats(0, 0, 0)), t) {
                    var c = new e.ArcRotateCamera("default camera", -Math.PI / 2, Math.PI / 2, l, a, this);
                    c.lowerRadiusLimit = .01 * l, c.wheelPrecision = 100 / l, n = c
                } else {
                    var h = new e.FreeCamera("default camera", new e.Vector3(a.x, a.y, -l), this);
                    h.setTarget(a), n = h
                }
                n.minZ = .01 * l, n.maxZ = 1e3 * l, n.speed = .2 * l, this.activeCamera = n;
                var u = this.getEngine().getRenderingCanvas();
                r && u && n.attachControl(u)
            }
        }, i.prototype.createDefaultCameraOrLight = function(e, t, i) {
            void 0 === e && (e = !1), void 0 === t && (t = !1), void 0 === i && (i = !1), this.createDefaultLight(t), this.createDefaultCamera(e, t, i)
        }, i.prototype.createDefaultSkybox = function(t, i, r, n) {
            if (void 0 === i && (i = !1), void 0 === r && (r = 1e3), void 0 === n && (n = 0), t && (this.environmentTexture = t), !this.environmentTexture) return e.Tools.Warn("Can not create default skybox without environment texture."), null;
            var o = e.Mesh.CreateBox("hdrSkyBox", r, this);
            if (i) {
                var s = new e.PBRMaterial("skyBox", this);
                s.backFaceCulling = !1, s.reflectionTexture = this.environmentTexture.clone(), s.reflectionTexture && (s.reflectionTexture.coordinatesMode = e.Texture.SKYBOX_MODE), s.microSurface = 1 - n, s.disableLighting = !0, s.twoSidedLighting = !0, o.infiniteDistance = !0, o.material = s
            } else {
                var a = new e.StandardMaterial("skyBox", this);
                a.backFaceCulling = !1, a.reflectionTexture = this.environmentTexture.clone(), a.reflectionTexture && (a.reflectionTexture.coordinatesMode = e.Texture.SKYBOX_MODE), a.disableLighting = !0, o.infiniteDistance = !0, o.material = a
            }
            return o
        }, i.prototype.createDefaultEnvironment = function(t) {
            return e.EnvironmentHelper ? new e.EnvironmentHelper(t, this) : null
        }, i.prototype.createDefaultVRExperience = function(t) {
            return void 0 === t && (t = {}), new e.VRExperienceHelper(this, t)
        }, i.prototype._getByTags = function(t, i, r) {
            if (void 0 === i) return t;
            var n = [];
            r = r || function(e) {};
            for (var o in t) {
                var s = t[o];
                e.Tags && e.Tags.MatchesQuery(s, i) && (n.push(s), r(s))
            }
            return n
        }, i.prototype.getMeshesByTags = function(e, t) {
            return this._getByTags(this.meshes, e, t)
        }, i.prototype.getCamerasByTags = function(e, t) {
            return this._getByTags(this.cameras, e, t)
        }, i.prototype.getLightsByTags = function(e, t) {
            return this._getByTags(this.lights, e, t)
        }, i.prototype.getMaterialByTags = function(e, t) {
            return this._getByTags(this.materials, e, t).concat(this._getByTags(this.multiMaterials, e, t))
        }, i.prototype.setRenderingOrder = function(e, t, i, r) {
            void 0 === t && (t = null), void 0 === i && (i = null), void 0 === r && (r = null), this._renderingManager.setRenderingOrder(e, t, i, r)
        }, i.prototype.setRenderingAutoClearDepthStencil = function(e, t, i, r) {
            void 0 === i && (i = !0), void 0 === r && (r = !0), this._renderingManager.setRenderingAutoClearDepthStencil(e, t, i, r)
        }, i.prototype.markAllMaterialsAsDirty = function(e, t) {
            for (var i = 0, r = this.materials; i < r.length; i++) {
                var n = r[i];
                t && !t(n) || n.markAsDirty(e)
            }
        }, i.prototype._loadFile = function(t, i, r, n, o, s) {
            var a = this,
                l = e.Tools.LoadFile(t, i, r, n ? this.database : void 0, o, s);
            return this._activeRequests.push(l), l.onCompleteObservable.add((function(e) {
                a._activeRequests.splice(a._activeRequests.indexOf(e), 1)
            })), l
        }, i.prototype._loadFileAsync = function(e, t, i) {
            var r = this;
            return new Promise(function(n, o) {
                r._loadFile(e, (function(e) {
                    n(e)
                }), void 0, t, i, (function(e, t) {
                    o(t)
                }))
            })
        }, i._FOGMODE_NONE = 0, i._FOGMODE_EXP = 1, i._FOGMODE_EXP2 = 2, i._FOGMODE_LINEAR = 3, i._uniqueIdCounter = 0, i.MinDeltaTime = 1, i.MaxDeltaTime = 1e3, i.DragMovementThreshold = 10, i.LongPressDelay = 500, i.DoubleClickDelay = 300, i.ExclusiveDoubleClickMode = !1, i
    })();
    e.Scene = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this.cameras = new Array, this.lights = new Array, this.meshes = new Array, this.skeletons = new Array, this.particleSystems = new Array, this.animations = new Array, this.multiMaterials = new Array, this.materials = new Array, this.morphTargetManagers = new Array, this.geometries = new Array, this.transformNodes = new Array, this.lensFlareSystems = new Array, this.shadowGenerators = new Array, this.actionManagers = new Array, this.sounds = new Array
        }
        return e
    })();
    e.KeepAssets = t;
    var i = (function() {
        function e(e) {
            this.cameras = new Array, this.lights = new Array, this.meshes = new Array, this.skeletons = new Array, this.particleSystems = new Array, this.animations = new Array, this.multiMaterials = new Array, this.materials = new Array, this.morphTargetManagers = new Array, this.geometries = new Array, this.transformNodes = new Array, this.lensFlareSystems = new Array, this.shadowGenerators = new Array, this.actionManagers = new Array, this.sounds = new Array, this.scene = e
        }
        return e.prototype.addAllToScene = function() {
            var e = this;
            this.cameras.forEach((function(t) {
                e.scene.addCamera(t)
            })), this.lights.forEach((function(t) {
                e.scene.addLight(t)
            })), this.meshes.forEach((function(t) {
                e.scene.addMesh(t)
            })), this.skeletons.forEach((function(t) {
                e.scene.addSkeleton(t)
            })), this.particleSystems.forEach((function(t) {
                e.scene.addParticleSystem(t)
            })), this.animations.forEach((function(t) {
                e.scene.addAnimation(t)
            })), this.multiMaterials.forEach((function(t) {
                e.scene.addMultiMaterial(t)
            })), this.materials.forEach((function(t) {
                e.scene.addMaterial(t)
            })), this.morphTargetManagers.forEach((function(t) {
                e.scene.addMorphTargetManager(t)
            })), this.geometries.forEach((function(t) {
                e.scene.addGeometry(t)
            })), this.transformNodes.forEach((function(t) {
                e.scene.addTransformNode(t)
            })), this.lensFlareSystems.forEach((function(t) {
                e.scene.addLensFlareSystem(t)
            })), this.actionManagers.forEach((function(t) {
                e.scene.addActionManager(t)
            })), this.sounds.forEach((function(t) {
                t.play(), t.autoplay = !0, e.scene.mainSoundTrack.AddSound(t)
            }))
        }, e.prototype.removeAllFromScene = function() {
            var e = this;
            this.cameras.forEach((function(t) {
                e.scene.removeCamera(t)
            })), this.lights.forEach((function(t) {
                e.scene.removeLight(t)
            })), this.meshes.forEach((function(t) {
                e.scene.removeMesh(t)
            })), this.skeletons.forEach((function(t) {
                e.scene.removeSkeleton(t)
            })), this.particleSystems.forEach((function(t) {
                e.scene.removeParticleSystem(t)
            })), this.animations.forEach((function(t) {
                e.scene.removeAnimation(t)
            })), this.multiMaterials.forEach((function(t) {
                e.scene.removeMultiMaterial(t)
            })), this.materials.forEach((function(t) {
                e.scene.removeMaterial(t)
            })), this.morphTargetManagers.forEach((function(t) {
                e.scene.removeMorphTargetManager(t)
            })), this.geometries.forEach((function(t) {
                e.scene.removeGeometry(t)
            })), this.transformNodes.forEach((function(t) {
                e.scene.removeTransformNode(t)
            })), this.lensFlareSystems.forEach((function(t) {
                e.scene.removeLensFlareSystem(t)
            })), this.actionManagers.forEach((function(t) {
                e.scene.removeActionManager(t)
            })), this.sounds.forEach((function(t) {
                t.stop(), t.autoplay = !1, e.scene.mainSoundTrack.RemoveSound(t)
            }))
        }, e.prototype._moveAssets = function(e, t, i) {
            for (var r = 0, n = e; r < n.length; r++) {
                for (var o = n[r], s = !0, a = 0, l = i; a < l.length; a++) {
                    if (o === l[a]) {
                        s = !1;
                        break
                    }
                }
                s && t.push(o)
            }
        }, e.prototype.moveAllFromScene = function(e) {
            void 0 === e && (e = new t), this._moveAssets(this.scene.cameras, this.cameras, e.cameras), this._moveAssets(this.scene.meshes, this.meshes, e.meshes), this._moveAssets(this.scene.getGeometries(), this.geometries, e.geometries), this._moveAssets(this.scene.materials, this.materials, e.materials), this._moveAssets(this.scene._actionManagers, this.actionManagers, e.actionManagers), this._moveAssets(this.scene.animations, this.animations, e.animations), this._moveAssets(this.scene.lensFlareSystems, this.lensFlareSystems, e.lensFlareSystems), this._moveAssets(this.scene.lights, this.lights, e.lights), this._moveAssets(this.scene.morphTargetManagers, this.morphTargetManagers, e.morphTargetManagers), this._moveAssets(this.scene.multiMaterials, this.multiMaterials, e.multiMaterials), this._moveAssets(this.scene.skeletons, this.skeletons, e.skeletons), this._moveAssets(this.scene.particleSystems, this.particleSystems, e.particleSystems), this._moveAssets(this.scene.mainSoundTrack.soundCollection, this.sounds, e.sounds), this._moveAssets(this.scene.transformNodes, this.transformNodes, e.transformNodes), this.removeAllFromScene()
        }, e
    })();
    e.AssetContainer = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o, s) {
            void 0 === s && (s = !1), t instanceof e.Mesh ? this._engine = t.getScene().getEngine() : this._engine = t, this._updatable = r, this._instanced = s, this._data = i, this._strideSize = n, o || this.create()
        }
        return t.prototype.createVertexBuffer = function(t, i, r, n, o) {
            return new e.VertexBuffer(this._engine, this, t, this._updatable, !0, n || this._strideSize, void 0 === o ? this._instanced : o, i, r)
        }, t.prototype.isUpdatable = function() {
            return this._updatable
        }, t.prototype.getData = function() {
            return this._data
        }, t.prototype.getBuffer = function() {
            return this._buffer
        }, t.prototype.getStrideSize = function() {
            return this._strideSize
        }, t.prototype.create = function(e) {
            void 0 === e && (e = null), !e && this._buffer || (e = e || this._data) && (this._buffer ? this._updatable && (this._engine.updateDynamicVertexBuffer(this._buffer, e), this._data = e) : this._updatable ? (this._buffer = this._engine.createDynamicVertexBuffer(e), this._data = e) : this._buffer = this._engine.createVertexBuffer(e))
        }, t.prototype._rebuild = function() {
            this._buffer = null, this.create(this._data)
        }, t.prototype.update = function(e) {
            this.create(e)
        }, t.prototype.updateDirectly = function(e, t, i) {
            this._buffer && this._updatable && (this._engine.updateDynamicVertexBuffer(this._buffer, e, t, i ? i * this.getStrideSize() : void 0), this._data = null)
        }, t.prototype.dispose = function() {
            this._buffer && this._engine._releaseBuffer(this._buffer) && (this._buffer = null)
        }, t
    })();
    e.Buffer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(i, r, n, o, s, a, l, c, h) {
            r instanceof e.Buffer ? (a || (a = r.getStrideSize()), this._buffer = r, this._ownsBuffer = !1) : (a || (a = t.DeduceStride(n)), this._buffer = new e.Buffer(i, r, o, a, s, l), this._ownsBuffer = !0), this._stride = a, this._instanced = void 0 !== l && l, this._instanceDivisor = l ? 1 : 0, this._offset = c || 0, this._size = h || a, this._kind = n
        }
        return Object.defineProperty(t.prototype, "instanceDivisor", {
            get: function() {
                return this._instanceDivisor
            },
            set: function(e) {
                this._instanceDivisor = e, this._instanced = 0 != e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._rebuild = function() {
            this._buffer && this._buffer._rebuild()
        }, t.prototype.getKind = function() {
            return this._kind
        }, t.prototype.isUpdatable = function() {
            return this._buffer.isUpdatable()
        }, t.prototype.getData = function() {
            return this._buffer.getData()
        }, t.prototype.getBuffer = function() {
            return this._buffer.getBuffer()
        }, t.prototype.getStrideSize = function() {
            return this._stride
        }, t.prototype.getOffset = function() {
            return this._offset
        }, t.prototype.getSize = function() {
            return this._size
        }, t.prototype.getIsInstanced = function() {
            return this._instanced
        }, t.prototype.getInstanceDivisor = function() {
            return this._instanceDivisor
        }, t.prototype.create = function(e) {
            return this._buffer.create(e)
        }, t.prototype.update = function(e) {
            return this._buffer.update(e)
        }, t.prototype.updateDirectly = function(e, t) {
            return this._buffer.updateDirectly(e, t)
        }, t.prototype.dispose = function() {
            this._ownsBuffer && this._buffer.dispose()
        }, Object.defineProperty(t, "PositionKind", {
            get: function() {
                return t._PositionKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "NormalKind", {
            get: function() {
                return t._NormalKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "TangentKind", {
            get: function() {
                return t._TangentKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "UVKind", {
            get: function() {
                return t._UVKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "UV2Kind", {
            get: function() {
                return t._UV2Kind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "UV3Kind", {
            get: function() {
                return t._UV3Kind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "UV4Kind", {
            get: function() {
                return t._UV4Kind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "UV5Kind", {
            get: function() {
                return t._UV5Kind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "UV6Kind", {
            get: function() {
                return t._UV6Kind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "ColorKind", {
            get: function() {
                return t._ColorKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "MatricesIndicesKind", {
            get: function() {
                return t._MatricesIndicesKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "MatricesWeightsKind", {
            get: function() {
                return t._MatricesWeightsKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "MatricesIndicesExtraKind", {
            get: function() {
                return t._MatricesIndicesExtraKind
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "MatricesWeightsExtraKind", {
            get: function() {
                return t._MatricesWeightsExtraKind
            },
            enumerable: !0,
            configurable: !0
        }), t.DeduceStride = function(e) {
            switch (e) {
                case t.UVKind:
                case t.UV2Kind:
                case t.UV3Kind:
                case t.UV4Kind:
                case t.UV5Kind:
                case t.UV6Kind:
                    return 2;
                case t.NormalKind:
                case t.PositionKind:
                    return 3;
                case t.ColorKind:
                case t.MatricesIndicesKind:
                case t.MatricesIndicesExtraKind:
                case t.MatricesWeightsKind:
                case t.MatricesWeightsExtraKind:
                case t.TangentKind:
                    return 4;
                default:
                    throw new Error("Invalid kind '" + e + "'")
            }
        }, t._PositionKind = "position", t._NormalKind = "normal", t._TangentKind = "tangent", t._UVKind = "uv", t._UV2Kind = "uv2", t._UV3Kind = "uv3", t._UV4Kind = "uv4", t._UV5Kind = "uv5", t._UV6Kind = "uv6", t._ColorKind = "color", t._MatricesIndicesKind = "matricesIndices", t._MatricesWeightsKind = "matricesWeights", t._MatricesIndicesExtraKind = "matricesIndicesExtra", t._MatricesWeightsExtraKind = "matricesWeightsExtra", t
    })();
    e.VertexBuffer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this.previous = null, this.next = null
        }
        return e
    })();
    e.DummyInternalTextureTracker = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(i, r) {
            this.onLoadedObservable = new e.Observable, this.previous = null, this.next = null, this._initialSlot = -1, this._designatedSlot = -1, this._dataSource = t.DATASOURCE_UNKNOWN, this._comparisonFunction = 0, this._references = 1, this._engine = i, this._dataSource = r, this._webGLTexture = i._createTexture()
        }
        return Object.defineProperty(t.prototype, "dataSource", {
            get: function() {
                return this._dataSource
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.incrementReferences = function() {
            this._references++
        }, t.prototype.updateSize = function(e, t, i) {
            void 0 === i && (i = 1), this.width = e, this.height = t, this.depth = i, this.baseWidth = e, this.baseHeight = t, this.baseDepth = i, this._size = e * t * i
        }, t.prototype._rebuild = function() {
            var i, r = this;
            switch (this.isReady = !1, this._cachedCoordinatesMode = null, this._cachedWrapU = null, this._cachedWrapV = null, this._cachedAnisotropicFilteringLevel = null, this._dataSource) {
                case t.DATASOURCE_TEMP:
                    return;
                case t.DATASOURCE_URL:
                    return i = this._engine.createTexture(this.url, !this.generateMipMaps, this.invertY, null, this.samplingMode, (function() {
                        r.isReady = !0
                    }), null, this._buffer, void 0, this.format), void i._swapAndDie(this);
                case t.DATASOURCE_RAW:
                    return i = this._engine.createRawTexture(this._bufferView, this.baseWidth, this.baseHeight, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression), i._swapAndDie(this), void(this.isReady = !0);
                case t.DATASOURCE_RAW3D:
                    return i = this._engine.createRawTexture3D(this._bufferView, this.baseWidth, this.baseHeight, this.baseDepth, this.format, this.generateMipMaps, this.invertY, this.samplingMode, this._compression), i._swapAndDie(this), void(this.isReady = !0);
                case t.DATASOURCE_DYNAMIC:
                    return i = this._engine.createDynamicTexture(this.baseWidth, this.baseHeight, this.generateMipMaps, this.samplingMode), void i._swapAndDie(this);
                case t.DATASOURCE_RENDERTARGET:
                    var n = new e.RenderTargetCreationOptions;
                    if (n.generateDepthBuffer = this._generateDepthBuffer, n.generateMipMaps = this.generateMipMaps, n.generateStencilBuffer = this._generateStencilBuffer, n.samplingMode = this.samplingMode, n.type = this.type, this.isCube) i = this._engine.createRenderTargetCubeTexture(this.width, n);
                    else {
                        var o = {
                            width: this.width,
                            height: this.height
                        };
                        i = this._engine.createRenderTargetTexture(o, n)
                    }
                    return i._swapAndDie(this), void(this.isReady = !0);
                case t.DATASOURCE_DEPTHTEXTURE:
                    var s = {
                        bilinearFiltering: this.samplingMode !== e.Texture.BILINEAR_SAMPLINGMODE,
                        comparisonFunction: this._comparisonFunction,
                        generateStencil: this._generateStencilBuffer
                    };
                    return i = this.isCube ? this._engine.createDepthStencilTexture({
                        width: this.width,
                        height: this.height
                    }, s) : this._engine.createDepthStencilCubeTexture(this.width, s), i._swapAndDie(this), void(this.isReady = !0);
                case t.DATASOURCE_CUBE:
                    return i = this._engine.createCubeTexture(this.url, null, this._files, !this.generateMipMaps, (function() {
                        r.isReady = !0
                    }), null, this.format, this._extension), void i._swapAndDie(this);
                case t.DATASOURCE_CUBERAW:
                    return i = this._engine.createRawCubeTexture(this._bufferViewArray, this.width, this.format, this.type, this.generateMipMaps, this.invertY, this.samplingMode, this._compression), i._swapAndDie(this), void(this.isReady = !0);
                case t.DATASOURCE_CUBEPREFILTERED:
                    return void(i = this._engine.createPrefilteredCubeTexture(this.url, null, this._lodGenerationScale, this._lodGenerationOffset, (function(e) {
                        e && e._swapAndDie(r), r.isReady = !0
                    }), null, this.format, this._extension))
            }
        }, t.prototype._swapAndDie = function(e) {
            e._webGLTexture = this._webGLTexture, this._framebuffer && (e._framebuffer = this._framebuffer), this._depthStencilBuffer && (e._depthStencilBuffer = this._depthStencilBuffer), 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);
            var t = this._engine.getLoadedTexturesCache(),
                i = t.indexOf(this); - 1 !== i && t.splice(i, 1)
        }, t.prototype.dispose = function() {
            this._webGLTexture && 0 === --this._references && (this._engine._releaseTexture(this), this._webGLTexture = null, this.previous = null, this.next = null)
        }, t.DATASOURCE_UNKNOWN = 0, t.DATASOURCE_URL = 1, t.DATASOURCE_TEMP = 2, t.DATASOURCE_RAW = 3, t.DATASOURCE_DYNAMIC = 4, t.DATASOURCE_RENDERTARGET = 5, t.DATASOURCE_MULTIRENDERTARGET = 6, t.DATASOURCE_CUBE = 7, t.DATASOURCE_CUBERAW = 8, t.DATASOURCE_CUBEPREFILTERED = 9, t.DATASOURCE_RAW3D = 10, t.DATASOURCE_DEPTHTEXTURE = 11, t
    })();
    e.InternalTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(i) {
            this._hasAlpha = !1, this.getAlphaFromRGB = !1, this.level = 1, this.coordinatesIndex = 0, this._coordinatesMode = e.Texture.EXPLICIT_MODE, this.wrapU = e.Texture.WRAP_ADDRESSMODE, this.wrapV = e.Texture.WRAP_ADDRESSMODE, this.wrapR = e.Texture.WRAP_ADDRESSMODE, this.anisotropicFilteringLevel = t.DEFAULT_ANISOTROPIC_FILTERING_LEVEL, this.isCube = !1, this.is3D = !1, this.gammaSpace = !0, this.invertZ = !1, this.lodLevelInAlpha = !1, this.lodGenerationOffset = 0, this.lodGenerationScale = .8, this.isRenderTarget = !1, this.animations = new Array, this.onDisposeObservable = new e.Observable, this.delayLoadState = e.Engine.DELAYLOADSTATE_NONE, this._scene = i || e.Engine.LastCreatedScene, this._scene && this._scene.textures.push(this), this._uid = null
        }
        return Object.defineProperty(t.prototype, "hasAlpha", {
            get: function() {
                return this._hasAlpha
            },
            set: function(t) {
                this._hasAlpha !== t && (this._hasAlpha = t, this._scene && this._scene.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag | e.Material.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "coordinatesMode", {
            get: function() {
                return this._coordinatesMode
            },
            set: function(t) {
                this._coordinatesMode !== t && (this._coordinatesMode = t, this._scene && this._scene.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "uid", {
            get: function() {
                return this._uid || (this._uid = e.Tools.RandomId()), this._uid
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.toString = function() {
            return this.name
        }, t.prototype.getClassName = function() {
            return "BaseTexture"
        }, Object.defineProperty(t.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isBlocking", {
            get: function() {
                return !0
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.getTextureMatrix = function() {
            return e.Matrix.IdentityReadOnly
        }, t.prototype.getReflectionTextureMatrix = function() {
            return e.Matrix.IdentityReadOnly
        }, t.prototype.getInternalTexture = function() {
            return this._texture
        }, t.prototype.isReadyOrNotBlocking = function() {
            return !this.isBlocking || this.isReady()
        }, t.prototype.isReady = function() {
            return this.delayLoadState === e.Engine.DELAYLOADSTATE_NOTLOADED ? (this.delayLoad(), !1) : !!this._texture && this._texture.isReady
        }, t.prototype.getSize = function() {
            return this._texture && this._texture.width ? new e.Size(this._texture.width, this._texture.height) : this._texture && this._texture._size ? new e.Size(this._texture._size, this._texture._size) : e.Size.Zero()
        }, t.prototype.getBaseSize = function() {
            return this.isReady() && this._texture ? this._texture._size ? new e.Size(this._texture._size, this._texture._size) : new e.Size(this._texture.baseWidth, this._texture.baseHeight) : e.Size.Zero()
        }, t.prototype.scale = function(e) {}, Object.defineProperty(t.prototype, "canRescale", {
            get: function() {
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._getFromCache = function(e, t, i) {
            if (!this._scene) return null;
            for (var r = this._scene.getEngine().getLoadedTexturesCache(), n = 0; n < r.length; n++) {
                var o = r[n];
                if (o.url === e && o.generateMipMaps === !t && (!i || i === o.samplingMode)) return o.incrementReferences(), o
            }
            return null
        }, t.prototype._rebuild = function() {}, t.prototype.delayLoad = function() {}, t.prototype.clone = function() {
            return null
        }, Object.defineProperty(t.prototype, "textureType", {
            get: function() {
                return this._texture && void 0 !== this._texture.type ? this._texture.type : e.Engine.TEXTURETYPE_UNSIGNED_INT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "textureFormat", {
            get: function() {
                return this._texture && void 0 !== this._texture.format ? this._texture.format : e.Engine.TEXTUREFORMAT_RGBA
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.readPixels = function(e) {
            if (void 0 === e && (e = 0), !this._texture) return null;
            var t = this.getSize(),
                i = this.getScene();
            if (!i) return null;
            var r = i.getEngine();
            return this._texture.isCube ? r._readTexturePixels(this._texture, t.width, t.height, e) : r._readTexturePixels(this._texture, t.width, t.height, -1)
        }, t.prototype.releaseInternalTexture = function() {
            this._texture && (this._texture.dispose(), this._texture = null)
        }, Object.defineProperty(t.prototype, "sphericalPolynomial", {
            get: function() {
                return this._texture && e.CubeMapToSphericalPolynomialTools && this.isReady() ? (this._texture._sphericalPolynomial || (this._texture._sphericalPolynomial = e.CubeMapToSphericalPolynomialTools.ConvertCubeMapTextureToSphericalPolynomial(this)), this._texture._sphericalPolynomial) : null
            },
            set: function(e) {
                this._texture && (this._texture._sphericalPolynomial = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "_lodTextureHigh", {
            get: function() {
                return this._texture ? this._texture._lodTextureHigh : null
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "_lodTextureMid", {
            get: function() {
                return this._texture ? this._texture._lodTextureMid : null
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "_lodTextureLow", {
            get: function() {
                return this._texture ? this._texture._lodTextureLow : null
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.dispose = function() {
            if (this._scene) {
                this._scene.stopAnimation(this), this._scene._removePendingData(this);
                var e = this._scene.textures.indexOf(this);
                e >= 0 && this._scene.textures.splice(e, 1), void 0 !== this._texture && (this.releaseInternalTexture(), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear())
            }
        }, t.prototype.serialize = function() {
            if (!this.name) return null;
            var t = e.SerializationHelper.Serialize(this);
            return e.Animation.AppendSerializedAnimations(this, t), t
        }, t.WhenAllReady = function(e, t) {
            var i = e.length;
            if (0 === i) return void t();
            for (var r, n, o = 0; o < e.length; o++) !(function() {
                if (r = e[o], r.isReady()) 0 == --i && t();
                else {
                    n = r.onLoadObservable;
                    var s = function() {
                        n.removeCallback(s), 0 == --i && t()
                    };
                    n.add(s)
                }
            })()
        }, t.DEFAULT_ANISOTROPIC_FILTERING_LEVEL = 4, __decorate([e.serialize()], t.prototype, "name", void 0), __decorate([e.serialize("hasAlpha")], t.prototype, "_hasAlpha", void 0), __decorate([e.serialize()], t.prototype, "getAlphaFromRGB", void 0), __decorate([e.serialize()], t.prototype, "level", void 0), __decorate([e.serialize()], t.prototype, "coordinatesIndex", void 0), __decorate([e.serialize("coordinatesMode")], t.prototype, "_coordinatesMode", void 0), __decorate([e.serialize()], t.prototype, "wrapU", void 0), __decorate([e.serialize()], t.prototype, "wrapV", void 0), __decorate([e.serialize()], t.prototype, "wrapR", void 0), __decorate([e.serialize()], t.prototype, "anisotropicFilteringLevel", void 0), __decorate([e.serialize()], t.prototype, "isCube", void 0), __decorate([e.serialize()], t.prototype, "is3D", void 0), __decorate([e.serialize()], t.prototype, "gammaSpace", void 0), __decorate([e.serialize()], t.prototype, "invertZ", void 0), __decorate([e.serialize()], t.prototype, "lodLevelInAlpha", void 0), __decorate([e.serialize()], t.prototype, "lodGenerationOffset", void 0), __decorate([e.serialize()], t.prototype, "lodGenerationScale", void 0), __decorate([e.serialize()], t.prototype, "isRenderTarget", void 0), t
    })();
    e.BaseTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(r, n, o, s, a, l, c, h, u, f) {
            void 0 === o && (o = !1), void 0 === s && (s = !0), void 0 === a && (a = i.TRILINEAR_SAMPLINGMODE), void 0 === l && (l = null), void 0 === c && (c = null), void 0 === h && (h = null), void 0 === u && (u = !1);
            var d = t.call(this, n) || this;
            if (d.uOffset = 0, d.vOffset = 0, d.uScale = 1, d.vScale = 1, d.uAng = 0, d.vAng = 0, d.wAng = 0, d._isBlocking = !0, d.name = r || "", d.url = r, d._noMipmap = o, d._invertY = s, d._samplingMode = a, d._buffer = h, d._deleteBuffer = u, f && (d._format = f), !(n = d.getScene())) return d;
            n.getEngine().onBeforeTextureInitObservable.notifyObservers(d);
            var p = function() {
                d._onLoadObservable && d._onLoadObservable.hasObservers() && d.onLoadObservable.notifyObservers(d), l && l(), !d.isBlocking && n && n.resetCachedMaterial()
            };
            return d.url ? (d._texture = d._getFromCache(d.url, o, a), d._texture ? d._texture.isReady ? e.Tools.SetImmediate((function() {
                return p()
            })) : d._texture.onLoadedObservable.add(p) : n.useDelayedTextureLoading ? (d.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED, d._delayedOnLoad = p, d._delayedOnError = c) : (d._texture = n.getEngine().createTexture(d.url, o, s, n, d._samplingMode, p, c, d._buffer, void 0, d._format), u && delete d._buffer), d) : (d._delayedOnLoad = p, d._delayedOnError = c, d)
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "noMipmap", {
            get: function() {
                return this._noMipmap
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "isBlocking", {
            get: function() {
                return this._isBlocking
            },
            set: function(e) {
                this._isBlocking = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "samplingMode", {
            get: function() {
                return this._samplingMode
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.updateURL = function(t) {
            this.url = t, this.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED, this.delayLoad()
        }, i.prototype.delayLoad = function() {
            if (this.delayLoadState === e.Engine.DELAYLOADSTATE_NOTLOADED) {
                var t = this.getScene();
                t && (this.delayLoadState = e.Engine.DELAYLOADSTATE_LOADED, this._texture = this._getFromCache(this.url, this._noMipmap, this._samplingMode), this._texture ? this._delayedOnLoad && (this._texture.isReady ? e.Tools.SetImmediate(this._delayedOnLoad) : this._texture.onLoadedObservable.add(this._delayedOnLoad)) : (this._texture = t.getEngine().createTexture(this.url, this._noMipmap, this._invertY, t, this._samplingMode, this._delayedOnLoad, this._delayedOnError, this._buffer, null, this._format), this._deleteBuffer && delete this._buffer), this._delayedOnLoad = null, this._delayedOnError = null)
            }
        }, i.prototype.updateSamplingMode = function(e) {
            if (this._texture) {
                var t = this.getScene();
                t && (this._samplingMode = e, t.getEngine().updateTextureSamplingMode(e, this._texture))
            }
        }, i.prototype._prepareRowForTextureGeneration = function(t, i, r, n) {
            t *= this.uScale, i *= this.vScale, t -= .5 * this.uScale, i -= .5 * this.vScale, r -= .5, e.Vector3.TransformCoordinatesFromFloatsToRef(t, i, r, this._rowGenerationMatrix, n), n.x += .5 * this.uScale + this.uOffset, n.y += .5 * this.vScale + this.vOffset, n.z += .5
        }, i.prototype.getTextureMatrix = function() {
            var t = this;
            if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale === this._cachedUScale && this.vScale === this._cachedVScale && this.uAng === this._cachedUAng && this.vAng === this._cachedVAng && this.wAng === this._cachedWAng) return this._cachedTextureMatrix;
            this._cachedUOffset = this.uOffset, this._cachedVOffset = this.vOffset, this._cachedUScale = this.uScale, this._cachedVScale = this.vScale, this._cachedUAng = this.uAng, this._cachedVAng = this.vAng, this._cachedWAng = this.wAng, this._cachedTextureMatrix || (this._cachedTextureMatrix = e.Matrix.Zero(), this._rowGenerationMatrix = new e.Matrix, this._t0 = e.Vector3.Zero(), this._t1 = e.Vector3.Zero(), this._t2 = e.Vector3.Zero()), e.Matrix.RotationYawPitchRollToRef(this.vAng, this.uAng, this.wAng, this._rowGenerationMatrix), 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), e.Matrix.IdentityToRef(this._cachedTextureMatrix), this._cachedTextureMatrix.m[0] = this._t1.x, this._cachedTextureMatrix.m[1] = this._t1.y, this._cachedTextureMatrix.m[2] = this._t1.z, this._cachedTextureMatrix.m[4] = this._t2.x, this._cachedTextureMatrix.m[5] = this._t2.y, this._cachedTextureMatrix.m[6] = this._t2.z, this._cachedTextureMatrix.m[8] = this._t0.x, this._cachedTextureMatrix.m[9] = this._t0.y, this._cachedTextureMatrix.m[10] = this._t0.z;
            var i = this.getScene();
            return i ? (i.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag, (function(e) {
                return e.hasTexture(t)
            })), this._cachedTextureMatrix) : this._cachedTextureMatrix
        }, i.prototype.getReflectionTextureMatrix = function() {
            var t = this,
                r = this.getScene();
            if (!r) return this._cachedTextureMatrix;
            if (this.uOffset === this._cachedUOffset && this.vOffset === this._cachedVOffset && this.uScale === this._cachedUScale && this.vScale === this._cachedVScale && this.coordinatesMode === this._cachedCoordinatesMode) {
                if (this.coordinatesMode !== i.PROJECTION_MODE) return this._cachedTextureMatrix;
                if (this._cachedProjectionMatrixId === r.getProjectionMatrix().updateFlag) return this._cachedTextureMatrix
            }
            switch (this._cachedTextureMatrix || (this._cachedTextureMatrix = e.Matrix.Zero()), this._projectionModeMatrix || (this._projectionModeMatrix = e.Matrix.Zero()), this._cachedUOffset = this.uOffset, this._cachedVOffset = this.vOffset, this._cachedUScale = this.uScale, this._cachedVScale = this.vScale, this._cachedCoordinatesMode = this.coordinatesMode, this.coordinatesMode) {
                case i.PLANAR_MODE:
                    e.Matrix.IdentityToRef(this._cachedTextureMatrix), this._cachedTextureMatrix[0] = this.uScale, this._cachedTextureMatrix[5] = this.vScale, this._cachedTextureMatrix[12] = this.uOffset, this._cachedTextureMatrix[13] = this.vOffset;
                    break;
                case i.PROJECTION_MODE:
                    e.Matrix.IdentityToRef(this._projectionModeMatrix), this._projectionModeMatrix.m[0] = .5, this._projectionModeMatrix.m[5] = -.5, this._projectionModeMatrix.m[10] = 0, this._projectionModeMatrix.m[12] = .5, this._projectionModeMatrix.m[13] = .5, this._projectionModeMatrix.m[14] = 1, this._projectionModeMatrix.m[15] = 1;
                    var n = r.getProjectionMatrix();
                    this._cachedProjectionMatrixId = n.updateFlag, n.multiplyToRef(this._projectionModeMatrix, this._cachedTextureMatrix);
                    break;
                default:
                    e.Matrix.IdentityToRef(this._cachedTextureMatrix)
            }
            return r.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag, (function(e) {
                return -1 !== e.getActiveTextures().indexOf(t)
            })), this._cachedTextureMatrix
        }, i.prototype.clone = function() {
            var t = this;
            return e.SerializationHelper.Clone((function() {
                return new i(t._texture ? t._texture.url : null, t.getScene(), t._noMipmap, t._invertY, t._samplingMode)
            }), this)
        }, Object.defineProperty(i.prototype, "onLoadObservable", {
            get: function() {
                return this._onLoadObservable || (this._onLoadObservable = new e.Observable), this._onLoadObservable
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return "string" == typeof this._buffer && "data:" === this._buffer.substr(0, 5) && (e.base64String = this._buffer, e.name = e.name.replace("data:", "")), e
        }, i.prototype.getClassName = function() {
            return "Texture"
        }, i.prototype.dispose = function() {
            t.prototype.dispose.call(this), this.onLoadObservable && (this.onLoadObservable.clear(), this._onLoadObservable = null), this._delayedOnLoad = null, this._delayedOnError = null
        }, i.CreateFromBase64String = function(t, r, n, o, s, a, l, c, h) {
            return void 0 === a && (a = i.TRILINEAR_SAMPLINGMODE), void 0 === l && (l = null), void 0 === c && (c = null), void 0 === h && (h = e.Engine.TEXTUREFORMAT_RGBA), new i("data:" + r, n, o, s, a, l, c, t, !1, h)
        }, i.Parse = function(t, r, n) {
            if (t.customType) {
                var o = e.Tools.Instantiate(t.customType),
                    s = o.Parse(t, r, n);
                return t.samplingMode && s.updateSamplingMode && s._samplingMode && s._samplingMode !== t.samplingMode && s.updateSamplingMode(t.samplingMode), s
            }
            if (t.isCube) return e.CubeTexture.Parse(t, r, n);
            if (!t.name && !t.isRenderTarget) return null;
            var a = e.SerializationHelper.Parse((function() {
                var o = !0;
                if (t.noMipmap && (o = !1), t.mirrorPlane) {
                    var s = new e.MirrorTexture(t.name, t.renderTargetSize, r, o);
                    return s._waitingRenderList = t.renderList, s.mirrorPlane = e.Plane.FromArray(t.mirrorPlane), s
                }
                if (t.isRenderTarget) {
                    var a = new e.RenderTargetTexture(t.name, t.renderTargetSize, r, o);
                    return a._waitingRenderList = t.renderList, a
                }
                var l;
                if (t.base64String) l = i.CreateFromBase64String(t.base64String, t.name, r, !o);
                else {
                    var c = n + t.name;
                    i.UseSerializedUrlIfAny && t.url && (c = t.url), l = new i(c, r, !o)
                }
                return l
            }), t, r);
            if (t.samplingMode) {
                var l = t.samplingMode;
                a._samplingMode !== l && a.updateSamplingMode(l)
            }
            if (t.animations)
                for (var c = 0; c < t.animations.length; c++) {
                    var h = t.animations[c];
                    a.animations.push(e.Animation.Parse(h))
                }
            return a
        }, i.LoadFromDataString = function(t, r, n, o, s, a, l, c, h, u) {
            return void 0 === o && (o = !1), void 0 === s && (s = !1), void 0 === a && (a = !0), void 0 === l && (l = i.TRILINEAR_SAMPLINGMODE), void 0 === c && (c = null), void 0 === h && (h = null), void 0 === u && (u = e.Engine.TEXTUREFORMAT_RGBA), "data:" !== t.substr(0, 5) && (t = "data:" + t), new i(t, n, s, a, l, c, h, r, o, u)
        }, i.NEAREST_SAMPLINGMODE = 1, i.NEAREST_NEAREST_MIPLINEAR = 1, i.BILINEAR_SAMPLINGMODE = 2, i.LINEAR_LINEAR_MIPNEAREST = 2, i.TRILINEAR_SAMPLINGMODE = 3, i.LINEAR_LINEAR_MIPLINEAR = 3, i.NEAREST_NEAREST_MIPNEAREST = 4, i.NEAREST_LINEAR_MIPNEAREST = 5, i.NEAREST_LINEAR_MIPLINEAR = 6, i.NEAREST_LINEAR = 7, i.NEAREST_NEAREST = 8, i.LINEAR_NEAREST_MIPNEAREST = 9, i.LINEAR_NEAREST_MIPLINEAR = 10, i.LINEAR_LINEAR = 11, i.LINEAR_NEAREST = 12, i.EXPLICIT_MODE = 0, i.SPHERICAL_MODE = 1, i.PLANAR_MODE = 2, i.CUBIC_MODE = 3, i.PROJECTION_MODE = 4, i.SKYBOX_MODE = 5, i.INVCUBIC_MODE = 6, i.EQUIRECTANGULAR_MODE = 7, i.FIXED_EQUIRECTANGULAR_MODE = 8, i.FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9, i.CLAMP_ADDRESSMODE = 0, i.WRAP_ADDRESSMODE = 1, i.MIRROR_ADDRESSMODE = 2, i.UseSerializedUrlIfAny = !1, __decorate([e.serialize()], i.prototype, "url", void 0), __decorate([e.serialize()], i.prototype, "uOffset", void 0), __decorate([e.serialize()], i.prototype, "vOffset", void 0), __decorate([e.serialize()], i.prototype, "uScale", void 0), __decorate([e.serialize()], i.prototype, "vScale", void 0), __decorate([e.serialize()], i.prototype, "uAng", void 0), __decorate([e.serialize()], i.prototype, "vAng", void 0), __decorate([e.serialize()], i.prototype, "wAng", void 0), __decorate([e.serialize()], i.prototype, "isBlocking", null), i
    })(e.BaseTexture);
    e.Texture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this.mustReturn = !1, this.visibleInstances = new Array, this.renderSelf = new Array
        }
        return e
    })();
    e._InstancesBatch = t;
    var i = (function(i) {
        function r(n, o, s, a, l, c) {
            void 0 === o && (o = null), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === c && (c = !0);
            var h = i.call(this, n, o) || this;
            if (h.onBeforeRenderObservable = new e.Observable, h.onAfterRenderObservable = new e.Observable, h.onBeforeDrawObservable = new e.Observable, h.delayLoadState = e.Engine.DELAYLOADSTATE_NONE, h.instances = new Array, h._LODLevels = new Array, h._visibleInstances = {}, h._renderIdForInstances = new Array, h._batchCache = new t, h._instancesBufferSize = 2048, h._originalBuilderSideOrientation = r._DEFAULTSIDE, h.overrideMaterialSideOrientation = null, h._areNormalsFrozen = !1, h._source = null, o = h.getScene(), a) {
                h._source = a, a._geometry && a._geometry.applyToMesh(h), e.Tools.DeepCopy(a, h, ["name", "material", "skeleton", "instances", "parent", "uniqueId", "source", "metadata"], ["_poseMatrix", "_source"]), a.metadata && a.metadata.clone ? h.metadata = a.metadata.clone() : h.metadata = a.metadata, e.Tags && e.Tags.HasTags(a) && e.Tags.AddTagsTo(h, e.Tags.GetTags(a, !0)), h.parent = a.parent, h.setPivotMatrix(a.getPivotMatrix()), h.id = n + "." + a.id, h.material = a.material;
                var u;
                if (!l)
                    for (var f = a.getDescendants(!0), d = 0; d < f.length; d++) {
                        var p = f[d];
                        p.clone && p.clone(n + "." + p.name, h)
                    }
                var _ = h.getScene().getPhysicsEngine();
                if (c && _) {
                    var m = _.getImpostorForPhysicsObject(a);
                    m && (h.physicsImpostor = m.clone(h))
                }
                for (u = 0; u < o.particleSystems.length; u++) {
                    var g = o.particleSystems[u];
                    g.emitter === a && g.clone(g.name, h)
                }
                h.computeWorldMatrix(!0)
            }
            return null !== s && (h.parent = s), h
        }
        return __extends(r, i), Object.defineProperty(r, "FRONTSIDE", {
            get: function() {
                return r._FRONTSIDE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "BACKSIDE", {
            get: function() {
                return r._BACKSIDE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "DOUBLESIDE", {
            get: function() {
                return r._DOUBLESIDE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "DEFAULTSIDE", {
            get: function() {
                return r._DEFAULTSIDE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "NO_CAP", {
            get: function() {
                return r._NO_CAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "CAP_START", {
            get: function() {
                return r._CAP_START
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "CAP_END", {
            get: function() {
                return r._CAP_END
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "CAP_ALL", {
            get: function() {
                return r._CAP_ALL
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "onBeforeDraw", {
            set: function(e) {
                this._onBeforeDrawObserver && this.onBeforeDrawObservable.remove(this._onBeforeDrawObserver), this._onBeforeDrawObserver = this.onBeforeDrawObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "morphTargetManager", {
            get: function() {
                return this._morphTargetManager
            },
            set: function(e) {
                this._morphTargetManager !== e && (this._morphTargetManager = e, this._syncGeometryWithMorphTargetManager())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "source", {
            get: function() {
                return this._source
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "isUnIndexed", {
            get: function() {
                return this._unIndexed
            },
            set: function(e) {
                this._unIndexed !== e && (this._unIndexed = e, this._markSubMeshesAsAttributesDirty())
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.getClassName = function() {
            return "Mesh"
        }, r.prototype.toString = function(t) {
            var r = i.prototype.toString.call(this, t);
            if (r += ", n vertices: " + this.getTotalVertices(), r += ", parent: " + (this._waitingParentId ? this._waitingParentId : this.parent ? this.parent.name : "NONE"), this.animations)
                for (var n = 0; n < this.animations.length; n++) r += ", animation[0]: " + this.animations[n].toString(t);
            if (t)
                if (this._geometry) {
                    var o = this.getIndices(),
                        s = this.getVerticesData(e.VertexBuffer.PositionKind);
                    s && o && (r += ", flat shading: " + (s.length / 3 === o.length ? "YES" : "NO"))
                } else r += ", flat shading: UNKNOWN";
            return r
        }, Object.defineProperty(r.prototype, "hasLODLevels", {
            get: function() {
                return this._LODLevels.length > 0
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.getLODLevels = function() {
            return this._LODLevels
        }, r.prototype._sortLODLevels = function() {
            this._LODLevels.sort((function(e, t) {
                return e.distance < t.distance ? 1 : e.distance > t.distance ? -1 : 0
            }))
        }, r.prototype.addLODLevel = function(t, i) {
            if (i && i._masterMesh) return e.Tools.Warn("You cannot use a mesh as LOD level twice"), this;
            var r = new e.MeshLODLevel(t, i);
            return this._LODLevels.push(r), i && (i._masterMesh = this), this._sortLODLevels(), this
        }, r.prototype.getLODLevelAtDistance = function(e) {
            for (var t = 0; t < this._LODLevels.length; t++) {
                var i = this._LODLevels[t];
                if (i.distance === e) return i.mesh
            }
            return null
        }, r.prototype.removeLODLevel = function(e) {
            for (var t = 0; t < this._LODLevels.length; t++) this._LODLevels[t].mesh === e && (this._LODLevels.splice(t, 1), e && (e._masterMesh = null));
            return this._sortLODLevels(), this
        }, r.prototype.getLOD = function(e, t) {
            if (!this._LODLevels || 0 === this._LODLevels.length) return this;
            var i;
            if (t) i = t;
            else {
                i = this.getBoundingInfo().boundingSphere
            }
            var r = i.centerWorld.subtract(e.globalPosition).length();
            if (this._LODLevels[this._LODLevels.length - 1].distance > r) return this.onLODLevelSelection && this.onLODLevelSelection(r, this, this._LODLevels[this._LODLevels.length - 1].mesh), this;
            for (var n = 0; n < this._LODLevels.length; n++) {
                var o = this._LODLevels[n];
                if (o.distance < r) return o.mesh && (o.mesh._preActivate(), o.mesh._updateSubMeshesBoundingInfo(this.worldMatrixFromCache)), this.onLODLevelSelection && this.onLODLevelSelection(r, this, o.mesh), o.mesh
            }
            return this.onLODLevelSelection && this.onLODLevelSelection(r, this, this), this
        }, Object.defineProperty(r.prototype, "geometry", {
            get: function() {
                return this._geometry
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.getTotalVertices = function() {
            return null === this._geometry || void 0 === this._geometry ? 0 : this._geometry.getTotalVertices()
        }, r.prototype.getVerticesData = function(e, t, i) {
            return this._geometry ? this._geometry.getVerticesData(e, t, i) : null
        }, r.prototype.getVertexBuffer = function(e) {
            return this._geometry ? this._geometry.getVertexBuffer(e) : null
        }, r.prototype.isVerticesDataPresent = function(e) {
            return this._geometry ? this._geometry.isVerticesDataPresent(e) : !!this._delayInfo && -1 !== this._delayInfo.indexOf(e)
        }, r.prototype.isVertexBufferUpdatable = function(e) {
            return this._geometry ? this._geometry.isVertexBufferUpdatable(e) : !!this._delayInfo && -1 !== this._delayInfo.indexOf(e)
        }, r.prototype.getVerticesDataKinds = function() {
            if (!this._geometry) {
                var e = new Array;
                return this._delayInfo && this._delayInfo.forEach((function(t, i, r) {
                    e.push(t)
                })), e
            }
            return this._geometry.getVerticesDataKinds()
        }, r.prototype.getTotalIndices = function() {
            return this._geometry ? this._geometry.getTotalIndices() : 0
        }, r.prototype.getIndices = function(e) {
            return this._geometry ? this._geometry.getIndices(e) : []
        }, Object.defineProperty(r.prototype, "isBlocked", {
            get: function() {
                return null !== this._masterMesh && void 0 !== this._masterMesh
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.isReady = function(t, r) {
            if (void 0 === t && (t = !1), void 0 === r && (r = !1), this.delayLoadState === e.Engine.DELAYLOADSTATE_LOADING) return !1;
            if (!i.prototype.isReady.call(this, t)) return !1;
            if (!this.subMeshes || 0 === this.subMeshes.length) return !0;
            if (!t) return !0;
            var n = this.getEngine(),
                o = this.getScene(),
                s = r || n.getCaps().instancedArrays && this.instances.length > 0;
            this.computeWorldMatrix();
            var a = this.material || o.defaultMaterial;
            if (a)
                if (a.storeEffectOnSubMeshes)
                    for (var l = 0, c = this.subMeshes; l < c.length; l++) {
                        var h = c[l],
                            u = h.getMaterial();
                        if (u && !u.isReadyForSubMesh(this, h, s)) return !1
                    } else if (!a.isReady(this, s)) return !1;
            for (var f = 0, d = this._lightSources; f < d.length; f++) {
                var p = d[f],
                    _ = p.getShadowGenerator();
                if (_)
                    for (var m = 0, g = this.subMeshes; m < g.length; m++) {
                        var h = g[m];
                        if (!_.isReady(h, s)) return !1
                    }
            }
            for (var v = 0, y = this._LODLevels; v < y.length; v++) {
                var b = y[v];
                if (b.mesh && !b.mesh.isReady(s)) return !1
            }
            return !0
        }, Object.defineProperty(r.prototype, "areNormalsFrozen", {
            get: function() {
                return this._areNormalsFrozen
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.freezeNormals = function() {
            return this._areNormalsFrozen = !0, this
        }, r.prototype.unfreezeNormals = function() {
            return this._areNormalsFrozen = !1, this
        }, Object.defineProperty(r.prototype, "overridenInstanceCount", {
            set: function(e) {
                this._overridenInstanceCount = e
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype._preActivate = function() {
            var e = this.getScene().getRenderId();
            return this._preActivateId === e ? this : (this._preActivateId = e, this._visibleInstances = null, this)
        }, r.prototype._preActivateForIntermediateRendering = function(e) {
            return this._visibleInstances && (this._visibleInstances.intermediateDefaultRenderId = e), this
        }, r.prototype._registerInstanceForRenderId = function(e, t) {
            return this._visibleInstances || (this._visibleInstances = {}, this._visibleInstances.defaultRenderId = t, this._visibleInstances.selfDefaultRenderId = this._renderId), this._visibleInstances[t] || (this._visibleInstances[t] = new Array), this._visibleInstances[t].push(e), this
        }, r.prototype.refreshBoundingInfo = function() {
            return this._refreshBoundingInfo(!1)
        }, r.prototype._refreshBoundingInfo = function(t) {
            if (this._boundingInfo && this._boundingInfo.isLocked) return this;
            var i = this._getPositionData(t);
            if (i) {
                var r = e.Tools.ExtractMinAndMax(i, 0, this.getTotalVertices());
                this._boundingInfo = new e.BoundingInfo(r.minimum, r.maximum)
            }
            if (this.subMeshes)
                for (var n = 0; n < this.subMeshes.length; n++) this.subMeshes[n].refreshBoundingInfo();
            return this._updateBoundingInfo(), this
        }, r.prototype._getPositionData = function(t) {
            var i = this.getVerticesData(e.VertexBuffer.PositionKind);
            if (i && t && this.skeleton) {
                i = e.Tools.Slice(i);
                var r = this.getVerticesData(e.VertexBuffer.MatricesIndicesKind),
                    n = this.getVerticesData(e.VertexBuffer.MatricesWeightsKind);
                if (n && r)
                    for (var o = this.numBoneInfluencers > 4, s = o ? this.getVerticesData(e.VertexBuffer.MatricesIndicesExtraKind) : null, a = o ? this.getVerticesData(e.VertexBuffer.MatricesWeightsExtraKind) : null, l = this.skeleton.getTransformMatrices(this), c = e.Tmp.Vector3[0], h = e.Tmp.Matrix[0], u = e.Tmp.Matrix[1], f = 0, d = 0; d < i.length; d += 3, f += 4) {
                        h.reset();
                        var p, _;
                        for (p = 0; p < 4 && !((_ = n[f + p]) <= 0); p++) e.Matrix.FromFloat32ArrayToRefScaled(l, Math.floor(16 * r[f + p]), _, u), h.addToSelf(u);
                        if (o)
                            for (p = 0; p < 4 && !((_ = a[f + p]) <= 0); p++) e.Matrix.FromFloat32ArrayToRefScaled(l, Math.floor(16 * s[f + p]), _, u), h.addToSelf(u);
                        e.Vector3.TransformCoordinatesFromFloatsToRef(i[d], i[d + 1], i[d + 2], h, c), c.toArray(i, d)
                    }
            }
            return i
        }, r.prototype._createGlobalSubMesh = function(t) {
            var i = this.getTotalVertices();
            if (!i || !this.getIndices()) return null;
            if (this.subMeshes && this.subMeshes.length > 0) {
                var r = this.getIndices();
                if (!r) return null;
                var n = r.length,
                    o = !1;
                if (t) o = !0;
                else
                    for (var s = 0, a = this.subMeshes; s < a.length; s++) {
                        var l = a[s];
                        if (l.indexStart + l.indexCount >= n) {
                            o = !0;
                            break
                        }
                        if (l.verticesStart + l.verticesCount >= i) {
                            o = !0;
                            break
                        }
                    }
                if (!o) return this.subMeshes[0]
            }
            return this.releaseSubMeshes(), new e.SubMesh(0, 0, i, 0, this.getTotalIndices(), this)
        }, r.prototype.subdivide = function(t) {
            if (!(t < 1)) {
                for (var i = this.getTotalIndices(), r = i / t | 0, n = 0; r % 3 != 0;) r++;
                this.releaseSubMeshes();
                for (var o = 0; o < t && !(n >= i); o++) e.SubMesh.CreateFromIndices(0, n, Math.min(r, i - n), this), n += r;
                this.synchronizeInstances()
            }
        }, r.prototype.setVerticesData = function(t, i, r, n) {
            if (void 0 === r && (r = !1), this._geometry) this._geometry.setVerticesData(t, i, r, n);
            else {
                var o = new e.VertexData;
                o.set(i, t);
                var s = this.getScene();
                new e.Geometry(e.Geometry.RandomId(), s, o, r, this)
            }
            return this
        }, r.prototype.markVerticesDataAsUpdatable = function(e, t) {
            void 0 === t && (t = !0);
            var i = this.getVertexBuffer(e);
            i && i.isUpdatable() !== t && this.setVerticesData(e, this.getVerticesData(e), t)
        }, r.prototype.setVerticesBuffer = function(t) {
            return this._geometry || (this._geometry = e.Geometry.CreateGeometryForMesh(this)), this._geometry.setVerticesBuffer(t), this
        }, r.prototype.updateVerticesData = function(e, t, i, r) {
            return this._geometry ? (r ? (this.makeGeometryUnique(), this.updateVerticesData(e, t, i, !1)) : this._geometry.updateVerticesData(e, t, i), this) : this
        }, r.prototype.updateMeshPositions = function(t, i) {
            void 0 === i && (i = !0);
            var r = this.getVerticesData(e.VertexBuffer.PositionKind);
            if (!r) return this;
            if (t(r), this.updateVerticesData(e.VertexBuffer.PositionKind, r, !1, !1), i) {
                var n = this.getIndices(),
                    o = this.getVerticesData(e.VertexBuffer.NormalKind);
                if (!o) return this;
                e.VertexData.ComputeNormals(r, n, o), this.updateVerticesData(e.VertexBuffer.NormalKind, o, !1, !1)
            }
            return this
        }, r.prototype.makeGeometryUnique = function() {
            if (!this._geometry) return this;
            var t = this._geometry,
                i = this._geometry.copy(e.Geometry.RandomId());
            return t.releaseForMesh(this, !0), i.applyToMesh(this), this
        }, r.prototype.setIndices = function(t, i, r) {
            if (void 0 === i && (i = null), void 0 === r && (r = !1), this._geometry) this._geometry.setIndices(t, i, r);
            else {
                var n = new e.VertexData;
                n.indices = t;
                var o = this.getScene();
                new e.Geometry(e.Geometry.RandomId(), o, n, r, this)
            }
            return this
        }, r.prototype.updateIndices = function(e, t) {
            return this._geometry ? (this._geometry.updateIndices(e, t), this) : this
        }, r.prototype.toLeftHanded = function() {
            return this._geometry ? (this._geometry.toLeftHanded(), this) : this
        }, r.prototype._bind = function(t, i, r) {
            if (!this._geometry) return this;
            var n, o = this.getScene().getEngine();
            if (this._unIndexed) n = null;
            else switch (r) {
                case e.Material.PointFillMode:
                    n = null;
                    break;
                case e.Material.WireFrameFillMode:
                    n = t.getLinesIndexBuffer(this.getIndices(), o);
                    break;
                default:
                case e.Material.TriangleFillMode:
                    n = this._unIndexed ? null : this._geometry.getIndexBuffer()
            }
            return this._geometry._bind(i, n), this
        }, r.prototype._draw = function(t, i, r, n) {
            if (void 0 === n && (n = !1), !this._geometry || !this._geometry.getVertexBuffers() || !this._geometry.getIndexBuffer()) return this;
            this.onBeforeDrawObservable.notifyObservers(this);
            var o = this.getScene(),
                s = o.getEngine();
            if (this._unIndexed || i == e.Material.PointFillMode ? s.drawArraysType(i, t.verticesStart, t.verticesCount, r) : i == e.Material.WireFrameFillMode ? s.drawElementsType(i, 0, t.linesIndexCount, r) : s.drawElementsType(i, t.indexStart, t.indexCount, r), o._isAlternateRenderingEnabled && !n) {
                var a = t.effect || this._effectiveMaterial.getEffect();
                if (!a || !o.activeCamera) return this;
                o._switchToAlternateCameraConfiguration(!0), this._effectiveMaterial.bindView(a), this._effectiveMaterial.bindViewProjection(a), s.setViewport(o.activeCamera._alternateCamera.viewport), this._draw(t, i, r, !0), s.setViewport(o.activeCamera.viewport), o._switchToAlternateCameraConfiguration(!1), this._effectiveMaterial.bindView(a), this._effectiveMaterial.bindViewProjection(a)
            }
            return this
        }, r.prototype.registerBeforeRender = function(e) {
            return this.onBeforeRenderObservable.add(e), this
        }, r.prototype.unregisterBeforeRender = function(e) {
            return this.onBeforeRenderObservable.removeCallback(e), this
        }, r.prototype.registerAfterRender = function(e) {
            return this.onAfterRenderObservable.add(e), this
        }, r.prototype.unregisterAfterRender = function(e) {
            return this.onAfterRenderObservable.removeCallback(e), this
        }, r.prototype._getInstancesRenderList = function(e) {
            var t = this.getScene();
            if (this._batchCache.mustReturn = !1, this._batchCache.renderSelf[e] = this.isEnabled() && this.isVisible, this._batchCache.visibleInstances[e] = null, this._visibleInstances) {
                var i = t.getRenderId(),
                    r = t._isInIntermediateRendering() ? this._visibleInstances.intermediateDefaultRenderId : this._visibleInstances.defaultRenderId;
                this._batchCache.visibleInstances[e] = this._visibleInstances[i];
                var n = this._renderId;
                !this._batchCache.visibleInstances[e] && r && (this._batchCache.visibleInstances[e] = this._visibleInstances[r], i = Math.max(r, i), n = Math.max(this._visibleInstances.selfDefaultRenderId, i));
                var o = this._batchCache.visibleInstances[e];
                if (o && o.length) {
                    if (this._renderIdForInstances[e] === i) return this._batchCache.mustReturn = !0, this._batchCache;
                    i !== n && (this._batchCache.renderSelf[e] = !1)
                }
                this._renderIdForInstances[e] = i
            }
            return this._batchCache
        }, r.prototype._renderWithInstances = function(t, i, r, n, o) {
            var s = r.visibleInstances[t._id];
            if (!s) return this;
            for (var a = s.length + 1, l = 16 * a * 4, c = this._instancesBufferSize, h = this._instancesBuffer; this._instancesBufferSize < l;) this._instancesBufferSize *= 2;
            this._instancesData && c == this._instancesBufferSize || (this._instancesData = new Float32Array(this._instancesBufferSize / 4));
            var u = 0,
                f = 0,
                d = this.getWorldMatrix();
            if (r.renderSelf[t._id] && (d.copyToArray(this._instancesData, u), u += 16, f++), s)
                for (var p = 0; p < s.length; p++) {
                    var _ = s[p];
                    _.getWorldMatrix().copyToArray(this._instancesData, u), u += 16, f++
                }
            return h && c == this._instancesBufferSize ? h.updateDirectly(this._instancesData, 0, f) : (h && h.dispose(), h = new e.Buffer(o, this._instancesData, !0, 16, !1, !0), this._instancesBuffer = h, this.setVerticesBuffer(h.createVertexBuffer("world0", 0, 4)), this.setVerticesBuffer(h.createVertexBuffer("world1", 4, 4)), this.setVerticesBuffer(h.createVertexBuffer("world2", 8, 4)), this.setVerticesBuffer(h.createVertexBuffer("world3", 12, 4))), this._bind(t, n, i), this._draw(t, i, f), o.unbindInstanceAttributes(), this
        }, r.prototype._processRendering = function(e, t, i, r, n, o, s) {
            var a = this.getScene(),
                l = a.getEngine();
            if (n) this._renderWithInstances(e, i, r, t, l);
            else {
                r.renderSelf[e._id] && (o && o(!1, this.getWorldMatrix(), s), this._draw(e, i, this._overridenInstanceCount));
                var c = r.visibleInstances[e._id];
                if (c)
                    for (var h = 0; h < c.length; h++) {
                        var u = c[h],
                            f = u.getWorldMatrix();
                        o && o(!0, f, s), this._draw(e, i)
                    }
            }
            return this
        }, r.prototype.render = function(t, i) {
            if (this.checkOcclusionQuery(), this._isOccluded) return this;
            var r = this.getScene(),
                n = this._getInstancesRenderList(t._id);
            if (n.mustReturn) return this;
            if (!this._geometry || !this._geometry.getVertexBuffers() || !this._geometry.getIndexBuffer()) return this;
            this.onBeforeRenderObservable.notifyObservers(this);
            var o = r.getEngine(),
                s = o.getCaps().instancedArrays && null !== n.visibleInstances[t._id] && void 0 !== n.visibleInstances[t._id],
                a = t.getMaterial();
            if (!a) return this;
            if (this._effectiveMaterial = a,
                this._effectiveMaterial.storeEffectOnSubMeshes) {
                if (!this._effectiveMaterial.isReadyForSubMesh(this, t, s)) return this
            } else if (!this._effectiveMaterial.isReady(this, s)) return this;
            i && o.setAlphaMode(this._effectiveMaterial.alphaMode);
            var l = o.getDepthWrite();
            this.renderOutline && (o.setDepthWrite(!1), r.getOutlineRenderer().render(t, n), o.setDepthWrite(l));
            var c;
            if (!(c = this._effectiveMaterial.storeEffectOnSubMeshes ? t.effect : this._effectiveMaterial.getEffect())) return this;
            var h = this.overrideMaterialSideOrientation;
            null == h && (h = this._effectiveMaterial.sideOrientation, this._getWorldMatrixDeterminant() < 0 && (h = h === e.Material.ClockWiseSideOrientation ? e.Material.CounterClockWiseSideOrientation : e.Material.ClockWiseSideOrientation));
            var u = this._effectiveMaterial._preBind(c, h);
            this._effectiveMaterial.forceDepthWrite && o.setDepthWrite(!0);
            var f = r.forcePointsCloud ? e.Material.PointFillMode : r.forceWireframe ? e.Material.WireFrameFillMode : this._effectiveMaterial.fillMode;
            s || this._bind(t, c, f);
            var d = this.getWorldMatrix();
            if (this._effectiveMaterial.storeEffectOnSubMeshes ? this._effectiveMaterial.bindForSubMesh(d, this, t) : this._effectiveMaterial.bind(d, this), !this._effectiveMaterial.backFaceCulling && this._effectiveMaterial.separateCullingPass && (o.setState(!0, this._effectiveMaterial.zOffset, !1, !u), this._processRendering(t, c, f, n, s, this._onBeforeDraw, this._effectiveMaterial), o.setState(!0, this._effectiveMaterial.zOffset, !1, u)), this._processRendering(t, c, f, n, s, this._onBeforeDraw, this._effectiveMaterial), this._effectiveMaterial.unbind(), this.renderOutline && l && (o.setDepthWrite(!0), o.setColorWrite(!1), r.getOutlineRenderer().render(t, n), o.setColorWrite(!0)), this.renderOverlay) {
                var p = o.getAlphaMode();
                o.setAlphaMode(e.Engine.ALPHA_COMBINE), r.getOutlineRenderer().render(t, n, !0), o.setAlphaMode(p)
            }
            return this.onAfterRenderObservable.notifyObservers(this), this
        }, r.prototype._onBeforeDraw = function(e, t, i) {
            e && i && i.bindOnlyWorldMatrix(t)
        }, r.prototype.getEmittedParticleSystems = function() {
            for (var e = new Array, t = 0; t < this.getScene().particleSystems.length; t++) {
                var i = this.getScene().particleSystems[t];
                i.emitter === this && e.push(i)
            }
            return e
        }, r.prototype.getHierarchyEmittedParticleSystems = function() {
            var e = new Array,
                t = this.getDescendants();
            t.push(this);
            for (var i = 0; i < this.getScene().particleSystems.length; i++) {
                var r = this.getScene().particleSystems[i],
                    n = r.emitter;
                n.position && -1 !== t.indexOf(n) && e.push(r)
            }
            return e
        }, r.prototype._checkDelayState = function() {
            var t = this.getScene();
            return this._geometry ? this._geometry.load(t) : this.delayLoadState === e.Engine.DELAYLOADSTATE_NOTLOADED && (this.delayLoadState = e.Engine.DELAYLOADSTATE_LOADING, this._queueLoad(t)), this
        }, r.prototype._queueLoad = function(t) {
            var i = this;
            t._addPendingData(this);
            var r = -1 !== this.delayLoadingFile.indexOf(".babylonbinarymeshdata");
            return e.Tools.LoadFile(this.delayLoadingFile, (function(r) {
                r instanceof ArrayBuffer ? i._delayLoadingFunction(r, i) : i._delayLoadingFunction(JSON.parse(r), i), i.instances.forEach((function(e) {
                    e._syncSubMeshes()
                })), i.delayLoadState = e.Engine.DELAYLOADSTATE_LOADED, t._removePendingData(i)
            }), (function() {}), t.database, r), this
        }, r.prototype.isInFrustum = function(t) {
            return this.delayLoadState !== e.Engine.DELAYLOADSTATE_LOADING && (!!i.prototype.isInFrustum.call(this, t) && (this._checkDelayState(), !0))
        }, r.prototype.setMaterialByID = function(e) {
            var t, i = this.getScene().materials;
            for (t = i.length - 1; t > -1; t--)
                if (i[t].id === e) return this.material = i[t], this;
            var r = this.getScene().multiMaterials;
            for (t = r.length - 1; t > -1; t--)
                if (r[t].id === e) return this.material = r[t], this;
            return this
        }, r.prototype.getAnimatables = function() {
            var e = new Array;
            return this.material && e.push(this.material), this.skeleton && e.push(this.skeleton), e
        }, r.prototype.bakeTransformIntoVertices = function(t) {
            if (!this.isVerticesDataPresent(e.VertexBuffer.PositionKind)) return this;
            var i = this.subMeshes.splice(0);
            this._resetPointsArrayCache();
            var r, n = this.getVerticesData(e.VertexBuffer.PositionKind),
                o = new Array;
            for (r = 0; r < n.length; r += 3) e.Vector3.TransformCoordinates(e.Vector3.FromArray(n, r), t).toArray(o, r);
            if (this.setVerticesData(e.VertexBuffer.PositionKind, o, this.getVertexBuffer(e.VertexBuffer.PositionKind).isUpdatable()), !this.isVerticesDataPresent(e.VertexBuffer.NormalKind)) return this;
            for (n = this.getVerticesData(e.VertexBuffer.NormalKind), o = [], r = 0; r < n.length; r += 3) e.Vector3.TransformNormal(e.Vector3.FromArray(n, r), t).normalize().toArray(o, r);
            return this.setVerticesData(e.VertexBuffer.NormalKind, o, this.getVertexBuffer(e.VertexBuffer.NormalKind).isUpdatable()), t.m[0] * t.m[5] * t.m[10] < 0 && this.flipFaces(), this.releaseSubMeshes(), this.subMeshes = i, this
        }, r.prototype.bakeCurrentTransformIntoVertices = function() {
            return this.bakeTransformIntoVertices(this.computeWorldMatrix(!0)), this.scaling.copyFromFloats(1, 1, 1), this.position.copyFromFloats(0, 0, 0), this.rotation.copyFromFloats(0, 0, 0), this.rotationQuaternion && (this.rotationQuaternion = e.Quaternion.Identity()), this._worldMatrix = e.Matrix.Identity(), this
        }, Object.defineProperty(r.prototype, "_positions", {
            get: function() {
                return this._geometry ? this._geometry._positions : null
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype._resetPointsArrayCache = function() {
            return this._geometry && this._geometry._resetPointsArrayCache(), this
        }, r.prototype._generatePointsArray = function() {
            return !!this._geometry && this._geometry._generatePointsArray()
        }, r.prototype.clone = function(e, t, i, n) {
            return void 0 === n && (n = !0), new r(e, this.getScene(), t, this, i, n)
        }, r.prototype.dispose = function(e, t) {
            var r = this;
            void 0 === t && (t = !1), this.morphTargetManager = null, this._geometry && this._geometry.releaseForMesh(this, !0);
            var n = this.getScene().meshes;
            for (n.forEach((function(e) {
                    var t = e;
                    t._source && t._source === r && (t._source = null)
                })), this._source = null, this._instancesBuffer && (this._instancesBuffer.dispose(), this._instancesBuffer = null); this.instances.length;) this.instances[0].dispose();
            for (var o = this.getScene().effectLayers, s = 0; s < o.length; s++) {
                var a = o[s];
                a && a._disposeMesh(this)
            }
            i.prototype.dispose.call(this, e, t)
        }, r.prototype.applyDisplacementMap = function(t, i, r, n, o, s) {
            var a = this,
                l = this.getScene(),
                c = function(e) {
                    var t = document.createElement("canvas"),
                        l = t.getContext("2d"),
                        c = e.width,
                        h = e.height;
                    t.width = c, t.height = h, l.drawImage(e, 0, 0);
                    var u = l.getImageData(0, 0, c, h).data;
                    a.applyDisplacementMapFromBuffer(u, c, h, i, r, o, s), n && n(a)
                };
            return e.Tools.LoadImage(t, c, (function() {}), l.database), this
        }, r.prototype.applyDisplacementMapFromBuffer = function(t, i, r, n, o, s, a) {
            if (!this.isVerticesDataPresent(e.VertexBuffer.PositionKind) || !this.isVerticesDataPresent(e.VertexBuffer.NormalKind) || !this.isVerticesDataPresent(e.VertexBuffer.UVKind)) return e.Tools.Warn("Cannot call applyDisplacementMap: Given mesh is not complete. Position, Normal or UV are missing"), this;
            var l = this.getVerticesData(e.VertexBuffer.PositionKind),
                c = this.getVerticesData(e.VertexBuffer.NormalKind),
                h = this.getVerticesData(e.VertexBuffer.UVKind),
                u = e.Vector3.Zero(),
                f = e.Vector3.Zero(),
                d = e.Vector2.Zero();
            s = s || e.Vector2.Zero(), a = a || new e.Vector2(1, 1);
            for (var p = 0; p < l.length; p += 3) {
                e.Vector3.FromArrayToRef(l, p, u), e.Vector3.FromArrayToRef(c, p, f), e.Vector2.FromArrayToRef(h, p / 3 * 2, d);
                var _ = Math.abs(d.x * a.x + s.x) * i % i | 0,
                    m = Math.abs(d.y * a.y + s.y) * r % r | 0,
                    g = 4 * (_ + m * i),
                    v = t[g] / 255,
                    y = t[g + 1] / 255,
                    b = t[g + 2] / 255,
                    x = .3 * v + .59 * y + .11 * b;
                f.normalize(), f.scaleInPlace(n + (o - n) * x), u = u.add(f), u.toArray(l, p)
            }
            return e.VertexData.ComputeNormals(l, this.getIndices(), c), this.updateVerticesData(e.VertexBuffer.PositionKind, l), this.updateVerticesData(e.VertexBuffer.NormalKind, c), this
        }, r.prototype.convertToFlatShadedMesh = function() {
            var t, i, r = this.getVerticesDataKinds(),
                n = {},
                o = {},
                s = {},
                a = !1;
            for (t = 0; t < r.length; t++) {
                i = r[t];
                var l = this.getVertexBuffer(i);
                i !== e.VertexBuffer.NormalKind ? (n[i] = l, o[i] = n[i].getData(), s[i] = []) : (a = l.isUpdatable(), r.splice(t, 1), t--)
            }
            var c, h = this.subMeshes.slice(0),
                u = this.getIndices(),
                f = this.getTotalIndices();
            for (c = 0; c < f; c++) {
                var d = u[c];
                for (t = 0; t < r.length; t++) {
                    i = r[t];
                    for (var p = n[i].getStrideSize(), _ = 0; _ < p; _++) s[i].push(o[i][d * p + _])
                }
            }
            var m = [],
                g = s[e.VertexBuffer.PositionKind];
            for (c = 0; c < f; c += 3) {
                u[c] = c, u[c + 1] = c + 1, u[c + 2] = c + 2;
                for (var v = e.Vector3.FromArray(g, 3 * c), y = e.Vector3.FromArray(g, 3 * (c + 1)), b = e.Vector3.FromArray(g, 3 * (c + 2)), x = v.subtract(y), T = b.subtract(y), E = e.Vector3.Normalize(e.Vector3.Cross(x, T)), A = 0; A < 3; A++) m.push(E.x), m.push(E.y), m.push(E.z)
            }
            for (this.setIndices(u), this.setVerticesData(e.VertexBuffer.NormalKind, m, a), t = 0; t < r.length; t++) i = r[t], this.setVerticesData(i, s[i], n[i].isUpdatable());
            this.releaseSubMeshes();
            for (var P = 0; P < h.length; P++) {
                var M = h[P];
                e.SubMesh.AddToMesh(M.materialIndex, M.indexStart, M.indexCount, M.indexStart, M.indexCount, this)
            }
            return this.synchronizeInstances(), this
        }, r.prototype.convertToUnIndexedMesh = function() {
            var t, i, r = this.getVerticesDataKinds(),
                n = {},
                o = {},
                s = {};
            for (t = 0; t < r.length; t++) {
                i = r[t];
                var a = this.getVertexBuffer(i);
                n[i] = a, o[i] = n[i].getData(), s[i] = []
            }
            var l, c = this.subMeshes.slice(0),
                h = this.getIndices(),
                u = this.getTotalIndices();
            for (l = 0; l < u; l++) {
                var f = h[l];
                for (t = 0; t < r.length; t++) {
                    i = r[t];
                    for (var d = n[i].getStrideSize(), p = 0; p < d; p++) s[i].push(o[i][f * d + p])
                }
            }
            for (l = 0; l < u; l += 3) h[l] = l, h[l + 1] = l + 1, h[l + 2] = l + 2;
            for (this.setIndices(h), t = 0; t < r.length; t++) i = r[t], this.setVerticesData(i, s[i], n[i].isUpdatable());
            this.releaseSubMeshes();
            for (var _ = 0; _ < c.length; _++) {
                var m = c[_];
                e.SubMesh.AddToMesh(m.materialIndex, m.indexStart, m.indexCount, m.indexStart, m.indexCount, this)
            }
            return this._unIndexed = !0, this.synchronizeInstances(), this
        }, r.prototype.flipFaces = function(t) {
            void 0 === t && (t = !1);
            var i, r = e.VertexData.ExtractFromMesh(this);
            if (t && this.isVerticesDataPresent(e.VertexBuffer.NormalKind) && r.normals)
                for (i = 0; i < r.normals.length; i++) r.normals[i] *= -1;
            if (r.indices) {
                var n;
                for (i = 0; i < r.indices.length; i += 3) n = r.indices[i + 1], r.indices[i + 1] = r.indices[i + 2], r.indices[i + 2] = n
            }
            return r.applyToMesh(this), this
        }, r.prototype.createInstance = function(t) {
            return new e.InstancedMesh(t, this)
        }, r.prototype.synchronizeInstances = function() {
            for (var e = 0; e < this.instances.length; e++) {
                this.instances[e]._syncSubMeshes()
            }
            return this
        }, r.prototype.simplify = function(t, i, r, n) {
            return void 0 === i && (i = !0), void 0 === r && (r = e.SimplificationType.QUADRATIC), this.getScene().simplificationQueue.addTask({
                settings: t,
                parallelProcessing: i,
                mesh: this,
                simplificationType: r,
                successCallback: n
            }), this
        }, r.prototype.optimizeIndices = function(t) {
            var i = this,
                r = this.getIndices(),
                n = this.getVerticesData(e.VertexBuffer.PositionKind);
            if (!n || !r) return this;
            for (var o = new Array, s = 0; s < n.length; s += 3) o.push(e.Vector3.FromArray(n, s));
            var a = new Array;
            return e.AsyncLoop.SyncAsyncForLoop(o.length, 40, (function(e) {
                for (var t = o.length - 1 - e, i = o[t], r = 0; r < t; ++r) {
                    var n = o[r];
                    if (i.equals(n)) {
                        a[t] = r;
                        break
                    }
                }
            }), (function() {
                for (var e = 0; e < r.length; ++e) r[e] = a[r[e]] || r[e];
                var n = i.subMeshes.slice(0);
                i.setIndices(r), i.subMeshes = n, t && t(i)
            })), this
        }, r.prototype.serialize = function(t) {
            t.name = this.name, t.id = this.id, t.type = this.getClassName(), e.Tags && e.Tags.HasTags(this) && (t.tags = e.Tags.GetTags(this)), t.position = this.position.asArray(), this.rotationQuaternion ? t.rotationQuaternion = this.rotationQuaternion.asArray() : this.rotation && (t.rotation = this.rotation.asArray()), t.scaling = this.scaling.asArray(), t.localMatrix = this.getPivotMatrix().asArray(), t.isEnabled = this.isEnabled(!1), t.isVisible = this.isVisible, t.infiniteDistance = this.infiniteDistance, t.pickable = this.isPickable, t.receiveShadows = this.receiveShadows, t.billboardMode = this.billboardMode, t.visibility = this.visibility, t.checkCollisions = this.checkCollisions, t.isBlocker = this.isBlocker, this.parent && (t.parentId = this.parent.id), t.isUnIndexed = this.isUnIndexed;
            var i = this._geometry;
            if (i) {
                var r = i.id;
                t.geometryId = r, t.subMeshes = [];
                for (var n = 0; n < this.subMeshes.length; n++) {
                    var o = this.subMeshes[n];
                    t.subMeshes.push({
                        materialIndex: o.materialIndex,
                        verticesStart: o.verticesStart,
                        verticesCount: o.verticesCount,
                        indexStart: o.indexStart,
                        indexCount: o.indexCount
                    })
                }
            }
            this.material ? t.materialId = this.material.id : this.material = null, this.morphTargetManager && (t.morphTargetManagerId = this.morphTargetManager.uniqueId), this.skeleton && (t.skeletonId = this.skeleton.id);
            var s = this.getPhysicsImpostor();
            s && (t.physicsMass = s.getParam("mass"), t.physicsFriction = s.getParam("friction"), t.physicsRestitution = s.getParam("mass"), t.physicsImpostor = s.type), this.metadata && (t.metadata = this.metadata), t.instances = [];
            for (var a = 0; a < this.instances.length; a++) {
                var l = this.instances[a],
                    c = {
                        name: l.name,
                        id: l.id,
                        position: l.position.asArray(),
                        scaling: l.scaling.asArray()
                    };
                l.rotationQuaternion ? c.rotationQuaternion = l.rotationQuaternion.asArray() : l.rotation && (c.rotation = l.rotation.asArray()), t.instances.push(c), e.Animation.AppendSerializedAnimations(l, c), c.ranges = l.serializeAnimationRanges()
            }
            e.Animation.AppendSerializedAnimations(this, t), t.ranges = this.serializeAnimationRanges(), t.layerMask = this.layerMask, t.alphaIndex = this.alphaIndex, t.hasVertexAlpha = this.hasVertexAlpha, t.overlayAlpha = this.overlayAlpha, t.overlayColor = this.overlayColor.asArray(), t.renderOverlay = this.renderOverlay, t.applyFog = this.applyFog, this.actionManager && (t.actions = this.actionManager.serialize(this.name))
        }, r.prototype._syncGeometryWithMorphTargetManager = function() {
            if (this.geometry) {
                this._markSubMeshesAsAttributesDirty();
                var t = this._morphTargetManager;
                if (t && t.vertexCount) {
                    if (t.vertexCount !== this.getTotalVertices()) return e.Tools.Error("Mesh is incompatible with morph targets. Targets and mesh must all have the same vertices count."), void(this.morphTargetManager = null);
                    for (var i = 0; i < t.numInfluencers; i++) {
                        var r = t.getActiveTarget(i),
                            n = r.getPositions();
                        if (!n) return void e.Tools.Error("Invalid morph target. Target must have positions.");
                        this.geometry.setVerticesData(e.VertexBuffer.PositionKind + i, n, !1, 3);
                        var o = r.getNormals();
                        o && this.geometry.setVerticesData(e.VertexBuffer.NormalKind + i, o, !1, 3);
                        var s = r.getTangents();
                        s && this.geometry.setVerticesData(e.VertexBuffer.TangentKind + i, s, !1, 3)
                    }
                } else
                    for (var i = 0; this.geometry.isVerticesDataPresent(e.VertexBuffer.PositionKind + i);) this.geometry.removeVerticesData(e.VertexBuffer.PositionKind + i), this.geometry.isVerticesDataPresent(e.VertexBuffer.NormalKind + i) && this.geometry.removeVerticesData(e.VertexBuffer.NormalKind + i), this.geometry.isVerticesDataPresent(e.VertexBuffer.TangentKind + i) && this.geometry.removeVerticesData(e.VertexBuffer.TangentKind + i), i++
            }
        }, r.Parse = function(t, i, n) {
            var o;
            if (o = t.type && "GroundMesh" === t.type ? e.GroundMesh.Parse(t, i) : new r(t.name, i), o.id = t.id, e.Tags && e.Tags.AddTagsTo(o, t.tags), o.position = e.Vector3.FromArray(t.position), void 0 !== t.metadata && (o.metadata = t.metadata), t.rotationQuaternion ? o.rotationQuaternion = e.Quaternion.FromArray(t.rotationQuaternion) : t.rotation && (o.rotation = e.Vector3.FromArray(t.rotation)), o.scaling = e.Vector3.FromArray(t.scaling), t.localMatrix ? o.setPreTransformMatrix(e.Matrix.FromArray(t.localMatrix)) : t.pivotMatrix && o.setPivotMatrix(e.Matrix.FromArray(t.pivotMatrix)), o.setEnabled(t.isEnabled), o.isVisible = t.isVisible, o.infiniteDistance = t.infiniteDistance, o.showBoundingBox = t.showBoundingBox, o.showSubMeshesBoundingBox = t.showSubMeshesBoundingBox, void 0 !== t.applyFog && (o.applyFog = t.applyFog), void 0 !== t.pickable && (o.isPickable = t.pickable), void 0 !== t.alphaIndex && (o.alphaIndex = t.alphaIndex), o.receiveShadows = t.receiveShadows, o.billboardMode = t.billboardMode, void 0 !== t.visibility && (o.visibility = t.visibility), o.checkCollisions = t.checkCollisions, void 0 !== t.isBlocker && (o.isBlocker = t.isBlocker), o._shouldGenerateFlatShading = t.useFlatShading, t.freezeWorldMatrix && (o._waitingFreezeWorldMatrix = t.freezeWorldMatrix), t.parentId && (o._waitingParentId = t.parentId), void 0 !== t.actions && (o._waitingActions = t.actions), void 0 !== t.overlayAlpha && (o.overlayAlpha = t.overlayAlpha), void 0 !== t.overlayColor && (o.overlayColor = e.Color3.FromArray(t.overlayColor)), void 0 !== t.renderOverlay && (o.renderOverlay = t.renderOverlay), o.isUnIndexed = !!t.isUnIndexed, o.hasVertexAlpha = t.hasVertexAlpha, t.delayLoadingFile ? (o.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED, o.delayLoadingFile = n + t.delayLoadingFile, o._boundingInfo = new e.BoundingInfo(e.Vector3.FromArray(t.boundingBoxMinimum), e.Vector3.FromArray(t.boundingBoxMaximum)), t._binaryInfo && (o._binaryInfo = t._binaryInfo), o._delayInfo = [], t.hasUVs && o._delayInfo.push(e.VertexBuffer.UVKind), t.hasUVs2 && o._delayInfo.push(e.VertexBuffer.UV2Kind), t.hasUVs3 && o._delayInfo.push(e.VertexBuffer.UV3Kind), t.hasUVs4 && o._delayInfo.push(e.VertexBuffer.UV4Kind), t.hasUVs5 && o._delayInfo.push(e.VertexBuffer.UV5Kind), t.hasUVs6 && o._delayInfo.push(e.VertexBuffer.UV6Kind), t.hasColors && o._delayInfo.push(e.VertexBuffer.ColorKind), t.hasMatricesIndices && o._delayInfo.push(e.VertexBuffer.MatricesIndicesKind), t.hasMatricesWeights && o._delayInfo.push(e.VertexBuffer.MatricesWeightsKind), o._delayLoadingFunction = e.Geometry._ImportGeometry, e.SceneLoader.ForceFullSceneLoadingForIncremental && o._checkDelayState()) : e.Geometry._ImportGeometry(t, o), t.materialId ? o.setMaterialByID(t.materialId) : o.material = null, t.morphTargetManagerId > -1 && (o.morphTargetManager = i.getMorphTargetManagerById(t.morphTargetManagerId)), t.skeletonId > -1 && (o.skeleton = i.getLastSkeletonByID(t.skeletonId), t.numBoneInfluencers && (o.numBoneInfluencers = t.numBoneInfluencers)), t.animations) {
                for (var s = 0; s < t.animations.length; s++) {
                    var a = t.animations[s];
                    o.animations.push(e.Animation.Parse(a))
                }
                e.Node.ParseAnimationRanges(o, t, i)
            }
            if (t.autoAnimate && i.beginAnimation(o, t.autoAnimateFrom, t.autoAnimateTo, t.autoAnimateLoop, t.autoAnimateSpeed || 1), t.layerMask && !isNaN(t.layerMask) ? o.layerMask = Math.abs(parseInt(t.layerMask)) : o.layerMask = 268435455, t.physicsImpostor && (o.physicsImpostor = new e.PhysicsImpostor(o, t.physicsImpostor, {
                    mass: t.physicsMass,
                    friction: t.physicsFriction,
                    restitution: t.physicsRestitution
                }, i)), t.instances)
                for (var l = 0; l < t.instances.length; l++) {
                    var c = t.instances[l],
                        h = o.createInstance(c.name);
                    if (c.id && (h.id = c.id), e.Tags && e.Tags.AddTagsTo(h, c.tags), h.position = e.Vector3.FromArray(c.position), c.parentId && (h._waitingParentId = c.parentId), c.rotationQuaternion ? h.rotationQuaternion = e.Quaternion.FromArray(c.rotationQuaternion) : c.rotation && (h.rotation = e.Vector3.FromArray(c.rotation)), h.scaling = e.Vector3.FromArray(c.scaling), h.checkCollisions = o.checkCollisions, t.animations) {
                        for (s = 0; s < t.animations.length; s++) a = t.animations[s], h.animations.push(e.Animation.Parse(a));
                        e.Node.ParseAnimationRanges(h, t, i)
                    }
                }
            return o
        }, r.CreateRibbon = function(t, i, r, n, o, s, a, l, c) {
            return void 0 === r && (r = !1), void 0 === a && (a = !1), e.MeshBuilder.CreateRibbon(t, {
                pathArray: i,
                closeArray: r,
                closePath: n,
                offset: o,
                updatable: a,
                sideOrientation: l,
                instance: c
            }, s)
        }, r.CreateDisc = function(t, i, r, n, o, s) {
            void 0 === n && (n = null);
            var a = {
                radius: i,
                tessellation: r,
                sideOrientation: s,
                updatable: o
            };
            return e.MeshBuilder.CreateDisc(t, a, n)
        }, r.CreateBox = function(t, i, r, n, o) {
            void 0 === r && (r = null);
            var s = {
                size: i,
                sideOrientation: o,
                updatable: n
            };
            return e.MeshBuilder.CreateBox(t, s, r)
        }, r.CreateSphere = function(t, i, r, n, o, s) {
            var a = {
                segments: i,
                diameterX: r,
                diameterY: r,
                diameterZ: r,
                sideOrientation: s,
                updatable: o
            };
            return e.MeshBuilder.CreateSphere(t, a, n)
        }, r.CreateCylinder = function(t, i, n, o, s, a, l, c, h) {
            void 0 !== l && l instanceof e.Scene || (void 0 !== l && (h = c || r.DEFAULTSIDE, c = l), l = a, a = 1);
            var u = {
                height: i,
                diameterTop: n,
                diameterBottom: o,
                tessellation: s,
                subdivisions: a,
                sideOrientation: h,
                updatable: c
            };
            return e.MeshBuilder.CreateCylinder(t, u, l)
        }, r.CreateTorus = function(t, i, r, n, o, s, a) {
            var l = {
                diameter: i,
                thickness: r,
                tessellation: n,
                sideOrientation: a,
                updatable: s
            };
            return e.MeshBuilder.CreateTorus(t, l, o)
        }, r.CreateTorusKnot = function(t, i, r, n, o, s, a, l, c, h) {
            var u = {
                radius: i,
                tube: r,
                radialSegments: n,
                tubularSegments: o,
                p: s,
                q: a,
                sideOrientation: h,
                updatable: c
            };
            return e.MeshBuilder.CreateTorusKnot(t, u, l)
        }, r.CreateLines = function(t, i, r, n, o) {
            void 0 === r && (r = null), void 0 === n && (n = !1), void 0 === o && (o = null);
            var s = {
                points: i,
                updatable: n,
                instance: o
            };
            return e.MeshBuilder.CreateLines(t, s, r)
        }, r.CreateDashedLines = function(t, i, r, n, o, s, a, l) {
            void 0 === s && (s = null);
            var c = {
                points: i,
                dashSize: r,
                gapSize: n,
                dashNb: o,
                updatable: a,
                instance: l
            };
            return e.MeshBuilder.CreateDashedLines(t, c, s)
        }, r.CreatePolygon = function(t, i, r, n, o, s) {
            var a = {
                shape: i,
                holes: n,
                updatable: o,
                sideOrientation: s
            };
            return e.MeshBuilder.CreatePolygon(t, a, r)
        }, r.ExtrudePolygon = function(t, i, r, n, o, s, a) {
            var l = {
                shape: i,
                holes: o,
                depth: r,
                updatable: s,
                sideOrientation: a
            };
            return e.MeshBuilder.ExtrudePolygon(t, l, n)
        }, r.ExtrudeShape = function(t, i, n, o, s, a, l, c, h, u) {
            void 0 === l && (l = null);
            var f = {
                shape: i,
                path: n,
                scale: o,
                rotation: s,
                cap: 0 === a ? 0 : a || r.NO_CAP,
                sideOrientation: h,
                instance: u,
                updatable: c
            };
            return e.MeshBuilder.ExtrudeShape(t, f, l)
        }, r.ExtrudeShapeCustom = function(t, i, n, o, s, a, l, c, h, u, f, d) {
            var p = {
                shape: i,
                path: n,
                scaleFunction: o,
                rotationFunction: s,
                ribbonCloseArray: a,
                ribbonClosePath: l,
                cap: 0 === c ? 0 : c || r.NO_CAP,
                sideOrientation: f,
                instance: d,
                updatable: u
            };
            return e.MeshBuilder.ExtrudeShapeCustom(t, p, h)
        }, r.CreateLathe = function(t, i, r, n, o, s, a) {
            var l = {
                shape: i,
                radius: r,
                tessellation: n,
                sideOrientation: a,
                updatable: s
            };
            return e.MeshBuilder.CreateLathe(t, l, o)
        }, r.CreatePlane = function(t, i, r, n, o) {
            var s = {
                size: i,
                width: i,
                height: i,
                sideOrientation: o,
                updatable: n
            };
            return e.MeshBuilder.CreatePlane(t, s, r)
        }, r.CreateGround = function(t, i, r, n, o, s) {
            var a = {
                width: i,
                height: r,
                subdivisions: n,
                updatable: s
            };
            return e.MeshBuilder.CreateGround(t, a, o)
        }, r.CreateTiledGround = function(t, i, r, n, o, s, a, l, c) {
            var h = {
                xmin: i,
                zmin: r,
                xmax: n,
                zmax: o,
                subdivisions: s,
                precision: a,
                updatable: c
            };
            return e.MeshBuilder.CreateTiledGround(t, h, l)
        }, r.CreateGroundFromHeightMap = function(t, i, r, n, o, s, a, l, c, h) {
            var u = {
                width: r,
                height: n,
                subdivisions: o,
                minHeight: s,
                maxHeight: a,
                updatable: c,
                onReady: h
            };
            return e.MeshBuilder.CreateGroundFromHeightMap(t, i, u, l)
        }, r.CreateTube = function(t, i, r, n, o, s, a, l, c, h) {
            var u = {
                path: i,
                radius: r,
                tessellation: n,
                radiusFunction: o,
                arc: 1,
                cap: s,
                updatable: l,
                sideOrientation: c,
                instance: h
            };
            return e.MeshBuilder.CreateTube(t, u, a)
        }, r.CreatePolyhedron = function(t, i, r) {
            return e.MeshBuilder.CreatePolyhedron(t, i, r)
        }, r.CreateIcoSphere = function(t, i, r) {
            return e.MeshBuilder.CreateIcoSphere(t, i, r)
        }, r.CreateDecal = function(t, i, r, n, o, s) {
            var a = {
                position: r,
                normal: n,
                size: o,
                angle: s
            };
            return e.MeshBuilder.CreateDecal(t, i, a)
        }, r.prototype.setPositionsForCPUSkinning = function() {
            if (!this._sourcePositions) {
                var t = this.getVerticesData(e.VertexBuffer.PositionKind);
                if (!t) return this._sourcePositions;
                this._sourcePositions = new Float32Array(t), this.isVertexBufferUpdatable(e.VertexBuffer.PositionKind) || this.setVerticesData(e.VertexBuffer.PositionKind, t, !0)
            }
            return this._sourcePositions
        }, r.prototype.setNormalsForCPUSkinning = function() {
            if (!this._sourceNormals) {
                var t = this.getVerticesData(e.VertexBuffer.NormalKind);
                if (!t) return this._sourceNormals;
                this._sourceNormals = new Float32Array(t), this.isVertexBufferUpdatable(e.VertexBuffer.NormalKind) || this.setVerticesData(e.VertexBuffer.NormalKind, t, !0)
            }
            return this._sourceNormals
        }, r.prototype.applySkeleton = function(t) {
            if (!this.geometry) return this;
            if (this.geometry._softwareSkinningRenderId == this.getScene().getRenderId()) return this;
            if (this.geometry._softwareSkinningRenderId = this.getScene().getRenderId(), !this.isVerticesDataPresent(e.VertexBuffer.PositionKind)) return this;
            if (!this.isVerticesDataPresent(e.VertexBuffer.NormalKind)) return this;
            if (!this.isVerticesDataPresent(e.VertexBuffer.MatricesIndicesKind)) return this;
            if (!this.isVerticesDataPresent(e.VertexBuffer.MatricesWeightsKind)) return this;
            if (!this._sourcePositions) {
                var i = this.subMeshes.slice();
                this.setPositionsForCPUSkinning(), this.subMeshes = i
            }
            this._sourceNormals || this.setNormalsForCPUSkinning();
            var r = this.getVerticesData(e.VertexBuffer.PositionKind);
            if (!r) return this;
            r instanceof Float32Array || (r = new Float32Array(r));
            var n = this.getVerticesData(e.VertexBuffer.NormalKind);
            if (!n) return this;
            n instanceof Float32Array || (n = new Float32Array(n));
            var o = this.getVerticesData(e.VertexBuffer.MatricesIndicesKind),
                s = this.getVerticesData(e.VertexBuffer.MatricesWeightsKind);
            if (!s || !o) return this;
            for (var a, l = this.numBoneInfluencers > 4, c = l ? this.getVerticesData(e.VertexBuffer.MatricesIndicesExtraKind) : null, h = l ? this.getVerticesData(e.VertexBuffer.MatricesWeightsExtraKind) : null, u = t.getTransformMatrices(this), f = e.Vector3.Zero(), d = new e.Matrix, p = new e.Matrix, _ = 0, m = 0; m < r.length; m += 3, _ += 4) {
                var g;
                for (a = 0; a < 4 && (g = s[_ + a]) > 0; a++) e.Matrix.FromFloat32ArrayToRefScaled(u, Math.floor(16 * o[_ + a]), g, p), d.addToSelf(p);
                if (l)
                    for (a = 0; a < 4 && (g = h[_ + a]) > 0; a++) e.Matrix.FromFloat32ArrayToRefScaled(u, Math.floor(16 * c[_ + a]), g, p), d.addToSelf(p);
                e.Vector3.TransformCoordinatesFromFloatsToRef(this._sourcePositions[m], this._sourcePositions[m + 1], this._sourcePositions[m + 2], d, f), f.toArray(r, m), e.Vector3.TransformNormalFromFloatsToRef(this._sourceNormals[m], this._sourceNormals[m + 1], this._sourceNormals[m + 2], d, f), f.toArray(n, m), d.reset()
            }
            return this.updateVerticesData(e.VertexBuffer.PositionKind, r), this.updateVerticesData(e.VertexBuffer.NormalKind, n), this
        }, r.MinMax = function(t) {
            var i = null,
                r = null;
            return t.forEach((function(e, t, n) {
                var o = e.getBoundingInfo(),
                    s = o.boundingBox;
                i && r ? (i.minimizeInPlace(s.minimumWorld), r.maximizeInPlace(s.maximumWorld)) : (i = s.minimumWorld, r = s.maximumWorld)
            })), i && r ? {
                min: i,
                max: r
            } : {
                min: e.Vector3.Zero(),
                max: e.Vector3.Zero()
            }
        }, r.Center = function(t) {
            var i = t instanceof Array ? r.MinMax(t) : t;
            return e.Vector3.Center(i.min, i.max)
        }, r.MergeMeshes = function(t, i, n, o, s) {
            void 0 === i && (i = !0);
            var a;
            if (!n) {
                var l = 0;
                for (a = 0; a < t.length; a++)
                    if (t[a] && (l += t[a].getTotalVertices()) > 65536) return e.Tools.Warn("Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices"), null
            }
            var c, h = null,
                u = new Array,
                f = null;
            for (a = 0; a < t.length; a++) t[a] && (t[a].computeWorldMatrix(!0), c = e.VertexData.ExtractFromMesh(t[a], !0), c.transform(t[a].getWorldMatrix()), h ? h.merge(c) : (h = c, f = t[a]), s && u.push(t[a].getTotalIndices()));
            if (f = f, o || (o = new r(f.name + "_merged", f.getScene())), h.applyToMesh(o), o.material = f.material, o.checkCollisions = f.checkCollisions, i)
                for (a = 0; a < t.length; a++) t[a] && t[a].dispose();
            if (s) {
                o.releaseSubMeshes(), a = 0;
                for (var d = 0; a < u.length;) e.SubMesh.CreateFromIndices(0, d, u[a], o), d += u[a], a++
            }
            return o
        }, r._FRONTSIDE = 0, r._BACKSIDE = 1, r._DOUBLESIDE = 2, r._DEFAULTSIDE = 0, r._NO_CAP = 0, r._CAP_START = 1, r._CAP_END = 2, r._CAP_ALL = 3, r
    })(e.AbstractMesh);
    e.Mesh = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {}
        return Object.defineProperty(e.prototype, "effect", {
            get: function() {
                return this._materialEffect
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.setEffect = function(e, t) {
            if (void 0 === t && (t = null), this._materialEffect === e) return void(e || (this._materialDefines = null));
            this._materialDefines = t, this._materialEffect = e
        }, e
    })();
    e.BaseSubMesh = t;
    var i = (function(t) {
        function i(e, i, r, n, o, s, a, l) {
            void 0 === l && (l = !0);
            var c = t.call(this) || this;
            return c.materialIndex = e, c.verticesStart = i, c.verticesCount = r, c.indexStart = n, c.indexCount = o, c._renderId = 0, c._mesh = s, c._renderingMesh = a || s, s.subMeshes.push(c), c._trianglePlanes = [], c._id = s.subMeshes.length - 1, l && (c.refreshBoundingInfo(), s.computeWorldMatrix(!0)), c
        }
        return __extends(i, t), i.AddToMesh = function(e, t, r, n, o, s, a, l) {
            return void 0 === l && (l = !0), new i(e, t, r, n, o, s, a, l)
        }, Object.defineProperty(i.prototype, "IsGlobal", {
            get: function() {
                return 0 === this.verticesStart && this.verticesCount == this._mesh.getTotalVertices()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getBoundingInfo = function() {
            return this.IsGlobal ? this._mesh.getBoundingInfo() : this._boundingInfo
        }, i.prototype.setBoundingInfo = function(e) {
            return this._boundingInfo = e, this
        }, i.prototype.getMesh = function() {
            return this._mesh
        }, i.prototype.getRenderingMesh = function() {
            return this._renderingMesh
        }, i.prototype.getMaterial = function() {
            var e = this._renderingMesh.material;
            if (null === e || void 0 === e) return this._mesh.getScene().defaultMaterial;
            if (e.getSubMaterial) {
                var t = e,
                    i = t.getSubMaterial(this.materialIndex);
                return this._currentMaterial !== i && (this._currentMaterial = i, this._materialDefines = null), i
            }
            return e
        }, i.prototype.refreshBoundingInfo = function() {
            if (this._lastColliderWorldVertices = null, this.IsGlobal || !this._renderingMesh || !this._renderingMesh.geometry) return this;
            var t = this._renderingMesh.getVerticesData(e.VertexBuffer.PositionKind);
            if (!t) return this._boundingInfo = this._mesh.getBoundingInfo(), this;
            var i, r = this._renderingMesh.getIndices();
            if (0 === this.indexStart && this.indexCount === r.length) {
                var n = this._renderingMesh.getBoundingInfo();
                i = {
                    minimum: n.minimum.clone(),
                    maximum: n.maximum.clone()
                }
            } else i = e.Tools.ExtractMinAndMaxIndexed(t, r, this.indexStart, this.indexCount, this._renderingMesh.geometry.boundingBias);
            return this._boundingInfo = new e.BoundingInfo(i.minimum, i.maximum), this
        }, i.prototype._checkCollision = function(e) {
            return this._renderingMesh.getBoundingInfo()._checkCollision(e)
        }, i.prototype.updateBoundingInfo = function(e) {
            var t = this.getBoundingInfo();
            return t || (this.refreshBoundingInfo(), t = this.getBoundingInfo()), t.update(e), this
        }, i.prototype.isInFrustum = function(e) {
            var t = this.getBoundingInfo();
            return !!t && t.isInFrustum(e)
        }, i.prototype.isCompletelyInFrustum = function(e) {
            var t = this.getBoundingInfo();
            return !!t && t.isCompletelyInFrustum(e)
        }, i.prototype.render = function(e) {
            return this._renderingMesh.render(this, e), this
        }, i.prototype.getLinesIndexBuffer = function(e, t) {
            if (!this._linesIndexBuffer) {
                for (var i = [], r = this.indexStart; r < this.indexStart + this.indexCount; r += 3) i.push(e[r], e[r + 1], e[r + 1], e[r + 2], e[r + 2], e[r]);
                this._linesIndexBuffer = t.createIndexBuffer(i), this.linesIndexCount = i.length
            }
            return this._linesIndexBuffer
        }, i.prototype.canIntersects = function(e) {
            var t = this.getBoundingInfo();
            return !!t && e.intersectsBox(t.boundingBox)
        }, i.prototype.intersects = function(t, i, r, n) {
            var o = null;
            if (e.LinesMesh && this._mesh instanceof e.LinesMesh)
                for (var s = this._mesh, a = this.indexStart; a < this.indexStart + this.indexCount; a += 2) {
                    var l = i[r[a]],
                        c = i[r[a + 1]],
                        h = t.intersectionSegment(l, c, s.intersectionThreshold);
                    if (!(h < 0) && ((n || !o || h < o.distance) && (o = new e.IntersectionInfo(null, null, h), n))) break
                } else
                    for (var a = this.indexStart; a < this.indexStart + this.indexCount; a += 3) {
                        var l = i[r[a]],
                            c = i[r[a + 1]],
                            u = i[r[a + 2]],
                            f = t.intersectsTriangle(l, c, u);
                        if (f) {
                            if (f.distance < 0) continue;
                            if ((n || !o || f.distance < o.distance) && (o = f, o.faceId = a / 3, n)) break
                        }
                    }
            return o
        }, i.prototype._rebuild = function() {
            this._linesIndexBuffer && (this._linesIndexBuffer = null)
        }, i.prototype.clone = function(t, r) {
            var n = new i(this.materialIndex, this.verticesStart, this.verticesCount, this.indexStart, this.indexCount, t, r, !1);
            if (!this.IsGlobal) {
                var o = this.getBoundingInfo();
                if (!o) return n;
                n._boundingInfo = new e.BoundingInfo(o.minimum, o.maximum)
            }
            return n
        }, i.prototype.dispose = function() {
            this._linesIndexBuffer && (this._mesh.getScene().getEngine()._releaseBuffer(this._linesIndexBuffer), this._linesIndexBuffer = null);
            var e = this._mesh.subMeshes.indexOf(this);
            this._mesh.subMeshes.splice(e, 1)
        }, i.CreateFromIndices = function(e, t, r, n, o) {
            var s = Number.MAX_VALUE,
                a = -Number.MAX_VALUE;
            o = o || n;
            for (var l = o.getIndices(), c = t; c < t + r; c++) {
                var h = l[c];
                h < s && (s = h), h > a && (a = h)
            }
            return new i(e, s, a - s + 1, t, r, n, o)
        }, i
    })(t);
    e.SubMesh = i
})(BABYLON || (BABYLON = {}));
var __assign = this && this.__assign || Object.assign || function(e) {
        for (var t, i = 1, r = arguments.length; i < r; i++) {
            t = arguments[i];
            for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n])
        }
        return e
    },
    BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._isDirty = !0, this._areLightsDirty = !0, this._areAttributesDirty = !0, this._areTexturesDirty = !0, this._areFresnelDirty = !0, this._areMiscDirty = !0, this._areImageProcessingDirty = !0, this._normals = !1, this._uvs = !1, this._needNormals = !1, this._needUVs = !1
        }
        return Object.defineProperty(e.prototype, "isDirty", {
                get: function() {
                    return this._isDirty
                },
                enumerable: !0,
                configurable: !0
            }), e.prototype.markAsProcessed = function() {
                this._isDirty = !1, this._areAttributesDirty = !1, this._areTexturesDirty = !1, this._areFresnelDirty = !1, this._areLightsDirty = !1, this._areMiscDirty = !1, this._areImageProcessingDirty = !1
            }, e.prototype.markAsUnprocessed = function() {
                this._isDirty = !0
            }, e.prototype.markAllAsDirty = function() {
                this._areTexturesDirty = !0, this._areAttributesDirty = !0, this._areLightsDirty = !0, this._areFresnelDirty = !0, this._areMiscDirty = !0, this._areImageProcessingDirty = !0, this._isDirty = !0
            }, e.prototype.markAsImageProcessingDirty = function() {
                this._areImageProcessingDirty = !0, this._isDirty = !0
            }, e.prototype.markAsLightDirty = function() {
                this._areLightsDirty = !0, this._isDirty = !0
            }, e.prototype.markAsAttributesDirty = function() {
                this._areAttributesDirty = !0, this._isDirty = !0
            }, e.prototype.markAsTexturesDirty = function() {
                this._areTexturesDirty = !0, this._isDirty = !0
            }, e.prototype.markAsFresnelDirty = function() {
                this._areFresnelDirty = !0, this._isDirty = !0
            },
            e.prototype.markAsMiscDirty = function() {
                this._areMiscDirty = !0, this._isDirty = !0
            }, e.prototype.rebuild = function() {
                this._keys && delete this._keys, this._keys = [];
                for (var e = 0, t = Object.keys(this); e < t.length; e++) {
                    var i = t[e];
                    "_" !== i[0] && this._keys.push(i)
                }
            }, e.prototype.isEqual = function(e) {
                if (this._keys.length !== e._keys.length) return !1;
                for (var t = 0; t < this._keys.length; t++) {
                    var i = this._keys[t];
                    if (this[i] !== e[i]) return !1
                }
                return !0
            }, e.prototype.cloneTo = function(e) {
                this._keys.length !== e._keys.length && (e._keys = this._keys.slice(0));
                for (var t = 0; t < this._keys.length; t++) {
                    var i = this._keys[t];
                    e[i] = this[i]
                }
            }, e.prototype.reset = function() {
                for (var e = 0; e < this._keys.length; e++) {
                    var t = this._keys[e];
                    "number" == typeof this[t] ? this[t] = 0 : this[t] = !1
                }
            }, e.prototype.toString = function() {
                for (var e = "", t = 0; t < this._keys.length; t++) {
                    var i = this._keys[t],
                        r = this[i];
                    "number" == typeof r ? e += "#define " + i + " " + this[i] + "\n" : r && (e += "#define " + i + "\n")
                }
                return e
            }, e
    })();
    e.MaterialDefines = t;
    var i = (function() {
        function t(i, r, n) {
            this.checkReadyOnEveryCall = !1, this.checkReadyOnlyOnce = !1, this.state = "", this._alpha = 1, this._backFaceCulling = !0, this.doNotSerialize = !1, this.storeEffectOnSubMeshes = !1, this.onDisposeObservable = new e.Observable, this.onBindObservable = new e.Observable, this.onUnBindObservable = new e.Observable, this._alphaMode = e.Engine.ALPHA_COMBINE, this._needDepthPrePass = !1, this.disableDepthWrite = !1, this.forceDepthWrite = !1, this.separateCullingPass = !1, this._fogEnabled = !0, this.pointSize = 1, this.zOffset = 0, this._wasPreviouslyReady = !1, this._fillMode = t.TriangleFillMode, this.name = i, this.id = i || e.Tools.RandomId(), this._scene = r || e.Engine.LastCreatedScene, this._scene.useRightHandedSystem ? this.sideOrientation = t.ClockWiseSideOrientation : this.sideOrientation = t.CounterClockWiseSideOrientation, this._uniformBuffer = new e.UniformBuffer(this._scene.getEngine()), this._useUBO = this.getScene().getEngine().supportsUniformBuffers, n || this._scene.materials.push(this)
        }
        return Object.defineProperty(t, "TriangleFillMode", {
            get: function() {
                return t._TriangleFillMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "WireFrameFillMode", {
            get: function() {
                return t._WireFrameFillMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "PointFillMode", {
            get: function() {
                return t._PointFillMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "PointListDrawMode", {
            get: function() {
                return t._PointListDrawMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "LineListDrawMode", {
            get: function() {
                return t._LineListDrawMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "LineLoopDrawMode", {
            get: function() {
                return t._LineLoopDrawMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "LineStripDrawMode", {
            get: function() {
                return t._LineStripDrawMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "TriangleStripDrawMode", {
            get: function() {
                return t._TriangleStripDrawMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "TriangleFanDrawMode", {
            get: function() {
                return t._TriangleFanDrawMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "ClockWiseSideOrientation", {
            get: function() {
                return t._ClockWiseSideOrientation
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "CounterClockWiseSideOrientation", {
            get: function() {
                return t._CounterClockWiseSideOrientation
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "TextureDirtyFlag", {
            get: function() {
                return t._TextureDirtyFlag
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "LightDirtyFlag", {
            get: function() {
                return t._LightDirtyFlag
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "FresnelDirtyFlag", {
            get: function() {
                return t._FresnelDirtyFlag
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "AttributesDirtyFlag", {
            get: function() {
                return t._AttributesDirtyFlag
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "MiscDirtyFlag", {
            get: function() {
                return t._MiscDirtyFlag
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "alpha", {
            get: function() {
                return this._alpha
            },
            set: function(e) {
                this._alpha !== e && (this._alpha = e, this.markAsDirty(t.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "backFaceCulling", {
            get: function() {
                return this._backFaceCulling
            },
            set: function(e) {
                this._backFaceCulling !== e && (this._backFaceCulling = e, this.markAsDirty(t.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onBind", {
            set: function(e) {
                this._onBindObserver && this.onBindObservable.remove(this._onBindObserver), this._onBindObserver = this.onBindObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "alphaMode", {
            get: function() {
                return this._alphaMode
            },
            set: function(e) {
                this._alphaMode !== e && (this._alphaMode = e, this.markAsDirty(t.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "needDepthPrePass", {
            get: function() {
                return this._needDepthPrePass
            },
            set: function(e) {
                this._needDepthPrePass !== e && (this._needDepthPrePass = e, this._needDepthPrePass && (this.checkReadyOnEveryCall = !0))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "fogEnabled", {
            get: function() {
                return this._fogEnabled
            },
            set: function(e) {
                this._fogEnabled !== e && (this._fogEnabled = e, this.markAsDirty(t.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "wireframe", {
            get: function() {
                return this._fillMode === t.WireFrameFillMode
            },
            set: function(e) {
                this._fillMode = e ? t.WireFrameFillMode : t.TriangleFillMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "pointsCloud", {
            get: function() {
                return this._fillMode === t.PointFillMode
            },
            set: function(e) {
                this._fillMode = e ? t.PointFillMode : t.TriangleFillMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "fillMode", {
            get: function() {
                return this._fillMode
            },
            set: function(e) {
                this._fillMode !== e && (this._fillMode = e, this.markAsDirty(t.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.toString = function(e) {
            return "Name: " + this.name
        }, t.prototype.getClassName = function() {
            return "Material"
        }, Object.defineProperty(t.prototype, "isFrozen", {
            get: function() {
                return this.checkReadyOnlyOnce
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.freeze = function() {
            this.checkReadyOnlyOnce = !0
        }, t.prototype.unfreeze = function() {
            this.checkReadyOnlyOnce = !1
        }, t.prototype.isReady = function(e, t) {
            return !0
        }, t.prototype.isReadyForSubMesh = function(e, t, i) {
            return !1
        }, t.prototype.getEffect = function() {
            return this._effect
        }, t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.needAlphaBlending = function() {
            return this.alpha < 1
        }, t.prototype.needAlphaBlendingForMesh = function(e) {
            return this.needAlphaBlending() || e.visibility < 1 || e.hasVertexAlpha
        }, t.prototype.needAlphaTesting = function() {
            return !1
        }, t.prototype.getAlphaTestTexture = function() {
            return null
        }, t.prototype.markDirty = function() {
            this._wasPreviouslyReady = !1
        }, t.prototype._preBind = function(e, i) {
            void 0 === i && (i = null);
            var r = this._scene.getEngine(),
                n = null == i ? this.sideOrientation : i,
                o = n === t.ClockWiseSideOrientation;
            return r.enableEffect(e || this._effect), r.setState(this.backFaceCulling, this.zOffset, !1, o), o
        }, t.prototype.bind = function(e, t) {}, t.prototype.bindForSubMesh = function(e, t, i) {}, t.prototype.bindOnlyWorldMatrix = function(e) {}, t.prototype.bindSceneUniformBuffer = function(e, t) {
            t.bindToEffect(e, "Scene")
        }, t.prototype.bindView = function(e) {
            this._useUBO ? this.bindSceneUniformBuffer(e, this.getScene().getSceneUniformBuffer()) : e.setMatrix("view", this.getScene().getViewMatrix())
        }, t.prototype.bindViewProjection = function(e) {
            this._useUBO ? this.bindSceneUniformBuffer(e, this.getScene().getSceneUniformBuffer()) : e.setMatrix("viewProjection", this.getScene().getTransformMatrix())
        }, t.prototype._shouldTurnAlphaTestOn = function(e) {
            return !this.needAlphaBlendingForMesh(e) && this.needAlphaTesting()
        }, t.prototype._afterBind = function(e) {
            if (this._scene._cachedMaterial = this, this._scene._cachedVisibility = e ? e.visibility : 1, e && this.onBindObservable.notifyObservers(e), this.disableDepthWrite) {
                var t = this._scene.getEngine();
                this._cachedDepthWriteState = t.getDepthWrite(), t.setDepthWrite(!1)
            }
        }, t.prototype.unbind = function() {
            if (this.onUnBindObservable.notifyObservers(this), this.disableDepthWrite) {
                this._scene.getEngine().setDepthWrite(this._cachedDepthWriteState)
            }
        }, t.prototype.getActiveTextures = function() {
            return []
        }, t.prototype.hasTexture = function(e) {
            return !1
        }, t.prototype.clone = function(e) {
            return null
        }, t.prototype.getBindedMeshes = function() {
            for (var e = new Array, t = 0; t < this._scene.meshes.length; t++) {
                var i = this._scene.meshes[t];
                i.material === this && e.push(i)
            }
            return e
        }, t.prototype.forceCompilation = function(t, i, r) {
            var n = this,
                o = __assign({
                    clipPlane: !1
                }, r),
                s = new e.BaseSubMesh,
                a = this.getScene(),
                l = function() {
                    if (n._scene && n._scene.getEngine()) {
                        s._materialDefines && (s._materialDefines._renderId = -1);
                        var r = a.clipPlane;
                        o.clipPlane && (a.clipPlane = new e.Plane(0, 0, 0, 1)), n.storeEffectOnSubMeshes ? n.isReadyForSubMesh(t, s) ? i && i(n) : setTimeout(l, 16) : n.isReady(t) ? i && i(n) : setTimeout(l, 16), o.clipPlane && (a.clipPlane = r)
                    }
                };
            l()
        }, t.prototype.forceCompilationAsync = function(e, t) {
            var i = this;
            return new Promise(function(r) {
                i.forceCompilation(e, (function() {
                    r()
                }), t)
            })
        }, t.prototype.markAsDirty = function(e) {
            e & t.TextureDirtyFlag && this._markAllSubMeshesAsTexturesDirty(), e & t.LightDirtyFlag && this._markAllSubMeshesAsLightsDirty(), e & t.FresnelDirtyFlag && this._markAllSubMeshesAsFresnelDirty(), e & t.AttributesDirtyFlag && this._markAllSubMeshesAsAttributesDirty(), e & t.MiscDirtyFlag && this._markAllSubMeshesAsMiscDirty(), this.getScene().resetCachedMaterial()
        }, t.prototype._markAllSubMeshesAsDirty = function(e) {
            for (var t = 0, i = this.getScene().meshes; t < i.length; t++) {
                var r = i[t];
                if (r.subMeshes)
                    for (var n = 0, o = r.subMeshes; n < o.length; n++) {
                        var s = o[n];
                        s.getMaterial() === this && (s._materialDefines && e(s._materialDefines))
                    }
            }
        }, t.prototype._markAllSubMeshesAsImageProcessingDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                return e.markAsImageProcessingDirty()
            }))
        }, t.prototype._markAllSubMeshesAsTexturesDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                return e.markAsTexturesDirty()
            }))
        }, t.prototype._markAllSubMeshesAsFresnelDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                return e.markAsFresnelDirty()
            }))
        }, t.prototype._markAllSubMeshesAsFresnelAndMiscDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                e.markAsFresnelDirty(), e.markAsMiscDirty()
            }))
        }, t.prototype._markAllSubMeshesAsLightsDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                return e.markAsLightDirty()
            }))
        }, t.prototype._markAllSubMeshesAsAttributesDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                return e.markAsAttributesDirty()
            }))
        }, t.prototype._markAllSubMeshesAsMiscDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                return e.markAsMiscDirty()
            }))
        }, t.prototype._markAllSubMeshesAsTexturesAndMiscDirty = function() {
            this._markAllSubMeshesAsDirty((function(e) {
                e.markAsTexturesDirty(), e.markAsMiscDirty()
            }))
        }, t.prototype.dispose = function(e, t) {
            this.getScene().stopAnimation(this);
            var i = this._scene.materials.indexOf(this);
            for (i >= 0 && this._scene.materials.splice(i, 1), i = 0; i < this._scene.meshes.length; i++) {
                var r = this._scene.meshes[i];
                if (r.material === this && (r.material = null, r.geometry)) {
                    var n = r.geometry;
                    if (this.storeEffectOnSubMeshes)
                        for (var o = 0, s = r.subMeshes; o < s.length; o++) {
                            var a = s[o];
                            n._releaseVertexArrayObject(a._materialEffect), e && a._materialEffect && this._scene.getEngine()._releaseEffect(a._materialEffect)
                        } else n._releaseVertexArrayObject(this._effect)
                }
            }
            this._uniformBuffer.dispose(), e && this._effect && (this.storeEffectOnSubMeshes || this._scene.getEngine()._releaseEffect(this._effect), this._effect = null), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.onBindObservable.clear(), this.onUnBindObservable.clear()
        }, t.prototype.serialize = function() {
            return e.SerializationHelper.Serialize(this)
        }, t.ParseMultiMaterial = function(t, i) {
            var r = new e.MultiMaterial(t.name, i);
            r.id = t.id, e.Tags && e.Tags.AddTagsTo(r, t.tags);
            for (var n = 0; n < t.materials.length; n++) {
                var o = t.materials[n];
                o ? r.subMaterials.push(i.getMaterialByID(o)) : r.subMaterials.push(null)
            }
            return r
        }, t.Parse = function(t, i, r) {
            return t.customType ? "BABYLON.PBRMaterial" === t.customType && t.overloadedAlbedo && (t.customType = "BABYLON.LegacyPBRMaterial", !e.LegacyPBRMaterial) ? void e.Tools.Error("Your scene is trying to load a legacy version of the PBRMaterial, please, include it from the materials library.") : e.Tools.Instantiate(t.customType).Parse(t, i, r) : e.StandardMaterial.Parse(t, i, r)
        }, t._TriangleFillMode = 0, t._WireFrameFillMode = 1, t._PointFillMode = 2, t._PointListDrawMode = 3, t._LineListDrawMode = 4, t._LineLoopDrawMode = 5, t._LineStripDrawMode = 6, t._TriangleStripDrawMode = 7, t._TriangleFanDrawMode = 8, t._ClockWiseSideOrientation = 0, t._CounterClockWiseSideOrientation = 1, t._TextureDirtyFlag = 1, t._LightDirtyFlag = 2, t._FresnelDirtyFlag = 4, t._AttributesDirtyFlag = 8, t._MiscDirtyFlag = 16, __decorate([e.serialize()], t.prototype, "id", void 0), __decorate([e.serialize()], t.prototype, "name", void 0), __decorate([e.serialize()], t.prototype, "checkReadyOnEveryCall", void 0), __decorate([e.serialize()], t.prototype, "checkReadyOnlyOnce", void 0), __decorate([e.serialize()], t.prototype, "state", void 0), __decorate([e.serialize("alpha")], t.prototype, "_alpha", void 0), __decorate([e.serialize("backFaceCulling")], t.prototype, "_backFaceCulling", void 0), __decorate([e.serialize()], t.prototype, "sideOrientation", void 0), __decorate([e.serialize("alphaMode")], t.prototype, "_alphaMode", void 0), __decorate([e.serialize()], t.prototype, "_needDepthPrePass", void 0), __decorate([e.serialize()], t.prototype, "disableDepthWrite", void 0), __decorate([e.serialize()], t.prototype, "forceDepthWrite", void 0), __decorate([e.serialize()], t.prototype, "separateCullingPass", void 0), __decorate([e.serialize("fogEnabled")], t.prototype, "_fogEnabled", void 0), __decorate([e.serialize()], t.prototype, "pointSize", void 0), __decorate([e.serialize()], t.prototype, "zOffset", void 0), __decorate([e.serialize()], t.prototype, "wireframe", null), __decorate([e.serialize()], t.prototype, "pointsCloud", null), __decorate([e.serialize()], t.prototype, "fillMode", null), t
    })();
    e.Material = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i) {
            this._engine = e, this._noUBO = !e.supportsUniformBuffers, this._dynamic = i, this._data = t || [], this._uniformLocations = {}, this._uniformSizes = {}, this._uniformLocationPointer = 0, this._needSync = !1, 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.updateMatrix = this._updateMatrixForEffect, this.updateVector3 = this._updateVector3ForEffect, this.updateVector4 = this._updateVector4ForEffect, this.updateColor3 = this._updateColor3ForEffect, this.updateColor4 = this._updateColor4ForEffect) : (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.updateMatrix = this._updateMatrixForUniform, this.updateVector3 = this._updateVector3ForUniform, this.updateVector4 = this._updateVector4ForUniform, this.updateColor3 = this._updateColor3ForUniform, this.updateColor4 = this._updateColor4ForUniform)
        }
        return Object.defineProperty(t.prototype, "useUbo", {
            get: function() {
                return !this._noUBO
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isSync", {
            get: function() {
                return !this._needSync
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.isDynamic = function() {
            return void 0 !== this._dynamic
        }, t.prototype.getData = function() {
            return this._bufferData
        }, t.prototype.getBuffer = function() {
            return this._buffer
        }, t.prototype._fillAlignment = function(e) {
            var t;
            if (t = e <= 2 ? e : 4, this._uniformLocationPointer % t != 0) {
                var i = this._uniformLocationPointer;
                this._uniformLocationPointer += t - this._uniformLocationPointer % t;
                for (var r = this._uniformLocationPointer - i, n = 0; n < r; n++) this._data.push(0)
            }
        }, t.prototype.addUniform = function(e, t) {
            if (!this._noUBO && void 0 === this._uniformLocations[e]) {
                var i;
                if (t instanceof Array) i = t, t = i.length;
                else {
                    t = t, i = [];
                    for (var r = 0; r < t; r++) i.push(0)
                }
                this._fillAlignment(t), this._uniformSizes[e] = t, this._uniformLocations[e] = this._uniformLocationPointer, this._uniformLocationPointer += t;
                for (var r = 0; r < t; r++) this._data.push(i[r]);
                this._needSync = !0
            }
        }, t.prototype.addMatrix = function(e, t) {
            this.addUniform(e, Array.prototype.slice.call(t.toArray()))
        }, t.prototype.addFloat2 = function(e, t, i) {
            var r = [t, i];
            this.addUniform(e, r)
        }, t.prototype.addFloat3 = function(e, t, i, r) {
            var n = [t, i, r];
            this.addUniform(e, n)
        }, t.prototype.addColor3 = function(e, t) {
            var i = new Array;
            t.toArray(i), this.addUniform(e, i)
        }, t.prototype.addColor4 = function(e, t, i) {
            var r = new Array;
            t.toArray(r), r.push(i), this.addUniform(e, r)
        }, t.prototype.addVector3 = function(e, t) {
            var i = new Array;
            t.toArray(i), this.addUniform(e, i)
        }, t.prototype.addMatrix3x3 = function(e) {
            this.addUniform(e, 12)
        }, t.prototype.addMatrix2x2 = function(e) {
            this.addUniform(e, 8)
        }, t.prototype.create = function() {
            this._noUBO || this._buffer || (this._fillAlignment(4), this._bufferData = new Float32Array(this._data), this._rebuild(), this._needSync = !0)
        }, t.prototype._rebuild = function() {
            this._noUBO || (this._dynamic ? this._buffer = this._engine.createDynamicUniformBuffer(this._bufferData) : this._buffer = this._engine.createUniformBuffer(this._bufferData))
        }, t.prototype.update = function() {
            if (!this._buffer) return void this.create();
            (this._dynamic || this._needSync) && (this._engine.updateUniformBuffer(this._buffer, this._bufferData), this._needSync = !1)
        }, t.prototype.updateUniform = function(t, i, r) {
            var n = this._uniformLocations[t];
            if (void 0 === n) {
                if (this._buffer) return void e.Tools.Error("Cannot add an uniform after UBO has been created.");
                this.addUniform(t, r), n = this._uniformLocations[t]
            }
            if (this._buffer || this.create(), this._dynamic)
                for (var o = 0; o < r; o++) this._bufferData[n + o] = i[o];
            else {
                for (var s = !1, o = 0; o < r; o++) this._bufferData[n + o] !== i[o] && (s = !0, this._bufferData[n + o] = i[o]);
                this._needSync = this._needSync || s
            }
        }, t.prototype._updateMatrix3x3ForUniform = function(e, i) {
            for (var r = 0; r < 3; r++) t._tempBuffer[4 * r] = i[3 * r], t._tempBuffer[4 * r + 1] = i[3 * r + 1], t._tempBuffer[4 * r + 2] = i[3 * r + 2], t._tempBuffer[4 * r + 3] = 0;
            this.updateUniform(e, t._tempBuffer, 12)
        }, t.prototype._updateMatrix3x3ForEffect = function(e, t) {
            this._currentEffect.setMatrix3x3(e, t)
        }, t.prototype._updateMatrix2x2ForEffect = function(e, t) {
            this._currentEffect.setMatrix2x2(e, t)
        }, t.prototype._updateMatrix2x2ForUniform = function(e, i) {
            for (var r = 0; r < 2; r++) t._tempBuffer[4 * r] = i[2 * r], t._tempBuffer[4 * r + 1] = i[2 * r + 1], t._tempBuffer[4 * r + 2] = 0, t._tempBuffer[4 * r + 3] = 0;
            this.updateUniform(e, t._tempBuffer, 8)
        }, t.prototype._updateFloatForEffect = function(e, t) {
            this._currentEffect.setFloat(e, t)
        }, t.prototype._updateFloatForUniform = function(e, i) {
            t._tempBuffer[0] = i, this.updateUniform(e, t._tempBuffer, 1)
        }, t.prototype._updateFloat2ForEffect = function(e, t, i, r) {
            void 0 === r && (r = ""), this._currentEffect.setFloat2(e + r, t, i)
        }, t.prototype._updateFloat2ForUniform = function(e, i, r, n) {
            void 0 === n && (n = ""), t._tempBuffer[0] = i, t._tempBuffer[1] = r, this.updateUniform(e, t._tempBuffer, 2)
        }, t.prototype._updateFloat3ForEffect = function(e, t, i, r, n) {
            void 0 === n && (n = ""), this._currentEffect.setFloat3(e + n, t, i, r)
        }, t.prototype._updateFloat3ForUniform = function(e, i, r, n, o) {
            void 0 === o && (o = ""), t._tempBuffer[0] = i, t._tempBuffer[1] = r, t._tempBuffer[2] = n, this.updateUniform(e, t._tempBuffer, 3)
        }, t.prototype._updateFloat4ForEffect = function(e, t, i, r, n, o) {
            void 0 === o && (o = ""), this._currentEffect.setFloat4(e + o, t, i, r, n)
        }, t.prototype._updateFloat4ForUniform = function(e, i, r, n, o, s) {
            void 0 === s && (s = ""), t._tempBuffer[0] = i, t._tempBuffer[1] = r, t._tempBuffer[2] = n, t._tempBuffer[3] = o, this.updateUniform(e, t._tempBuffer, 4)
        }, t.prototype._updateMatrixForEffect = function(e, t) {
            this._currentEffect.setMatrix(e, t)
        }, t.prototype._updateMatrixForUniform = function(e, t) {
            this.updateUniform(e, t.toArray(), 16)
        }, t.prototype._updateVector3ForEffect = function(e, t) {
            this._currentEffect.setVector3(e, t)
        }, t.prototype._updateVector3ForUniform = function(e, i) {
            i.toArray(t._tempBuffer), this.updateUniform(e, t._tempBuffer, 3)
        }, t.prototype._updateVector4ForEffect = function(e, t) {
            this._currentEffect.setVector4(e, t)
        }, t.prototype._updateVector4ForUniform = function(e, i) {
            i.toArray(t._tempBuffer), this.updateUniform(e, t._tempBuffer, 4)
        }, t.prototype._updateColor3ForEffect = function(e, t, i) {
            void 0 === i && (i = ""), this._currentEffect.setColor3(e + i, t)
        }, t.prototype._updateColor3ForUniform = function(e, i, r) {
            void 0 === r && (r = ""), i.toArray(t._tempBuffer), this.updateUniform(e, t._tempBuffer, 3)
        }, t.prototype._updateColor4ForEffect = function(e, t, i, r) {
            void 0 === r && (r = ""), this._currentEffect.setColor4(e + r, t, i)
        }, t.prototype._updateColor4ForUniform = function(e, i, r, n) {
            void 0 === n && (n = ""), i.toArray(t._tempBuffer), t._tempBuffer[3] = r, this.updateUniform(e, t._tempBuffer, 4)
        }, t.prototype.setTexture = function(e, t) {
            this._currentEffect.setTexture(e, t)
        }, t.prototype.updateUniformDirectly = function(e, t) {
            this.updateUniform(e, t, t.length), this.update()
        }, t.prototype.bindToEffect = function(e, t) {
            this._currentEffect = e, !this._noUBO && this._buffer && e.bindUniformBuffer(this._buffer, t)
        }, t.prototype.dispose = function() {
            if (!this._noUBO) {
                var e = this._engine._uniformBuffers.indexOf(this); - 1 !== e && this._engine._uniformBuffers.splice(e, 1), this._buffer && this._engine._releaseBuffer(this._buffer) && (this._buffer = null)
            }
        }, t._MAX_UNIFORM_SIZE = 256, t._tempBuffer = new Float32Array(t._MAX_UNIFORM_SIZE), t
    })();
    e.UniformBuffer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.prototype.set = function(t, i) {
            switch (i) {
                case e.VertexBuffer.PositionKind:
                    this.positions = t;
                    break;
                case e.VertexBuffer.NormalKind:
                    this.normals = t;
                    break;
                case e.VertexBuffer.TangentKind:
                    this.tangents = t;
                    break;
                case e.VertexBuffer.UVKind:
                    this.uvs = t;
                    break;
                case e.VertexBuffer.UV2Kind:
                    this.uvs2 = t;
                    break;
                case e.VertexBuffer.UV3Kind:
                    this.uvs3 = t;
                    break;
                case e.VertexBuffer.UV4Kind:
                    this.uvs4 = t;
                    break;
                case e.VertexBuffer.UV5Kind:
                    this.uvs5 = t;
                    break;
                case e.VertexBuffer.UV6Kind:
                    this.uvs6 = t;
                    break;
                case e.VertexBuffer.ColorKind:
                    this.colors = t;
                    break;
                case e.VertexBuffer.MatricesIndicesKind:
                    this.matricesIndices = t;
                    break;
                case e.VertexBuffer.MatricesWeightsKind:
                    this.matricesWeights = t;
                    break;
                case e.VertexBuffer.MatricesIndicesExtraKind:
                    this.matricesIndicesExtra = t;
                    break;
                case e.VertexBuffer.MatricesWeightsExtraKind:
                    this.matricesWeightsExtra = t
            }
        }, t.prototype.applyToMesh = function(e, t) {
            return this._applyTo(e, t), this
        }, t.prototype.applyToGeometry = function(e, t) {
            return this._applyTo(e, t), this
        }, t.prototype.updateMesh = function(e, t, i) {
            return this._update(e), this
        }, t.prototype.updateGeometry = function(e, t, i) {
            return this._update(e), this
        }, t.prototype._applyTo = function(t, i) {
            return void 0 === i && (i = !1), this.positions && t.setVerticesData(e.VertexBuffer.PositionKind, this.positions, i), this.normals && t.setVerticesData(e.VertexBuffer.NormalKind, this.normals, i), this.tangents && t.setVerticesData(e.VertexBuffer.TangentKind, this.tangents, i), this.uvs && t.setVerticesData(e.VertexBuffer.UVKind, this.uvs, i), this.uvs2 && t.setVerticesData(e.VertexBuffer.UV2Kind, this.uvs2, i), this.uvs3 && t.setVerticesData(e.VertexBuffer.UV3Kind, this.uvs3, i), this.uvs4 && t.setVerticesData(e.VertexBuffer.UV4Kind, this.uvs4, i), this.uvs5 && t.setVerticesData(e.VertexBuffer.UV5Kind, this.uvs5, i), this.uvs6 && t.setVerticesData(e.VertexBuffer.UV6Kind, this.uvs6, i), this.colors && t.setVerticesData(e.VertexBuffer.ColorKind, this.colors, i), this.matricesIndices && t.setVerticesData(e.VertexBuffer.MatricesIndicesKind, this.matricesIndices, i), this.matricesWeights && t.setVerticesData(e.VertexBuffer.MatricesWeightsKind, this.matricesWeights, i), this.matricesIndicesExtra && t.setVerticesData(e.VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, i), this.matricesWeightsExtra && t.setVerticesData(e.VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, i), this.indices && t.setIndices(this.indices, null, i), this
        }, t.prototype._update = function(t, i, r) {
            return this.positions && t.updateVerticesData(e.VertexBuffer.PositionKind, this.positions, i, r), this.normals && t.updateVerticesData(e.VertexBuffer.NormalKind, this.normals, i, r), this.tangents && t.updateVerticesData(e.VertexBuffer.TangentKind, this.tangents, i, r), this.uvs && t.updateVerticesData(e.VertexBuffer.UVKind, this.uvs, i, r), this.uvs2 && t.updateVerticesData(e.VertexBuffer.UV2Kind, this.uvs2, i, r), this.uvs3 && t.updateVerticesData(e.VertexBuffer.UV3Kind, this.uvs3, i, r), this.uvs4 && t.updateVerticesData(e.VertexBuffer.UV4Kind, this.uvs4, i, r), this.uvs5 && t.updateVerticesData(e.VertexBuffer.UV5Kind, this.uvs5, i, r), this.uvs6 && t.updateVerticesData(e.VertexBuffer.UV6Kind, this.uvs6, i, r), this.colors && t.updateVerticesData(e.VertexBuffer.ColorKind, this.colors, i, r), this.matricesIndices && t.updateVerticesData(e.VertexBuffer.MatricesIndicesKind, this.matricesIndices, i, r), this.matricesWeights && t.updateVerticesData(e.VertexBuffer.MatricesWeightsKind, this.matricesWeights, i, r), this.matricesIndicesExtra && t.updateVerticesData(e.VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra, i, r), this.matricesWeightsExtra && t.updateVerticesData(e.VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra, i, r), this.indices && t.setIndices(this.indices, null), this
        }, t.prototype.transform = function(t) {
            var i, r = e.Vector3.Zero();
            if (this.positions) {
                var n = e.Vector3.Zero();
                for (i = 0; i < this.positions.length; i += 3) e.Vector3.FromArrayToRef(this.positions, i, n), e.Vector3.TransformCoordinatesToRef(n, t, r), this.positions[i] = r.x, this.positions[i + 1] = r.y, this.positions[i + 2] = r.z
            }
            if (this.normals) {
                var o = e.Vector3.Zero();
                for (i = 0; i < this.normals.length; i += 3) e.Vector3.FromArrayToRef(this.normals, i, o), e.Vector3.TransformNormalToRef(o, t, r), this.normals[i] = r.x, this.normals[i + 1] = r.y, this.normals[i + 2] = r.z
            }
            if (this.tangents) {
                var s = e.Vector4.Zero(),
                    a = e.Vector4.Zero();
                for (i = 0; i < this.tangents.length; i += 4) e.Vector4.FromArrayToRef(this.tangents, i, s), e.Vector4.TransformNormalToRef(s, t, a), this.tangents[i] = a.x, this.tangents[i + 1] = a.y, this.tangents[i + 2] = a.z, this.tangents[i + 3] = a.w
            }
            return this
        }, t.prototype.merge = function(e) {
            if (this._validate(), e._validate(), !this.normals != !e.normals || !this.tangents != !e.tangents || !this.uvs != !e.uvs || !this.uvs2 != !e.uvs2 || !this.uvs3 != !e.uvs3 || !this.uvs4 != !e.uvs4 || !this.uvs5 != !e.uvs5 || !this.uvs6 != !e.uvs6 || !this.colors != !e.colors || !this.matricesIndices != !e.matricesIndices || !this.matricesWeights != !e.matricesWeights || !this.matricesIndicesExtra != !e.matricesIndicesExtra || !this.matricesWeightsExtra != !e.matricesWeightsExtra) throw new Error("Cannot merge vertex data that do not have the same set of attributes");
            if (e.indices) {
                this.indices || (this.indices = []);
                for (var t = this.positions ? this.positions.length / 3 : 0, i = 0; i < e.indices.length; i++) this.indices.push(e.indices[i] + t)
            }
            return this.positions = this._mergeElement(this.positions, e.positions), this.normals = this._mergeElement(this.normals, e.normals), this.tangents = this._mergeElement(this.tangents, e.tangents), this.uvs = this._mergeElement(this.uvs, e.uvs), this.uvs2 = this._mergeElement(this.uvs2, e.uvs2), this.uvs3 = this._mergeElement(this.uvs3, e.uvs3), this.uvs4 = this._mergeElement(this.uvs4, e.uvs4), this.uvs5 = this._mergeElement(this.uvs5, e.uvs5), this.uvs6 = this._mergeElement(this.uvs6, e.uvs6), this.colors = this._mergeElement(this.colors, e.colors), this.matricesIndices = this._mergeElement(this.matricesIndices, e.matricesIndices), this.matricesWeights = this._mergeElement(this.matricesWeights, e.matricesWeights), this.matricesIndicesExtra = this._mergeElement(this.matricesIndicesExtra, e.matricesIndicesExtra), this.matricesWeightsExtra = this._mergeElement(this.matricesWeightsExtra, e.matricesWeightsExtra), this
        }, t.prototype._mergeElement = function(e, t) {
            if (!e) return t;
            if (!t) return e;
            var i = t.length + e.length,
                r = e instanceof Float32Array,
                n = t instanceof Float32Array;
            if (r) {
                var o = new Float32Array(i);
                return o.set(e), o.set(t, e.length), o
            }
            if (n) {
                for (var s = e.slice(0), a = 0, i = t.length; a < i; a++) s.push(t[a]);
                return s
            }
            return e.concat(t)
        }, t.prototype._validate = function() {
            if (!this.positions) throw new Error("Positions are required");
            var t = function(t, i) {
                    var r = e.VertexBuffer.DeduceStride(t);
                    if (i.length % r != 0) throw new Error("The " + t + "s array count must be a multiple of " + r);
                    return i.length / r
                },
                i = t(e.VertexBuffer.PositionKind, this.positions),
                r = function(e, r) {
                    var n = t(e, r);
                    if (n !== i) throw new Error("The " + e + "s element count (" + n + ") does not match the positions count (" + i + ")")
                };
            this.normals && r(e.VertexBuffer.NormalKind, this.normals), this.tangents && r(e.VertexBuffer.TangentKind, this.tangents), this.uvs && r(e.VertexBuffer.UVKind, this.uvs), this.uvs2 && r(e.VertexBuffer.UV2Kind, this.uvs2), this.uvs3 && r(e.VertexBuffer.UV3Kind, this.uvs3), this.uvs4 && r(e.VertexBuffer.UV4Kind, this.uvs4), this.uvs5 && r(e.VertexBuffer.UV5Kind, this.uvs5), this.uvs6 && r(e.VertexBuffer.UV6Kind, this.uvs6), this.colors && r(e.VertexBuffer.ColorKind, this.colors), this.matricesIndices && r(e.VertexBuffer.MatricesIndicesKind, this.matricesIndices), this.matricesWeights && r(e.VertexBuffer.MatricesWeightsKind, this.matricesWeights), this.matricesIndicesExtra && r(e.VertexBuffer.MatricesIndicesExtraKind, this.matricesIndicesExtra), this.matricesWeightsExtra && r(e.VertexBuffer.MatricesWeightsExtraKind, this.matricesWeightsExtra)
        }, t.prototype.serialize = function() {
            var e = this.serialize();
            return this.positions && (e.positions = this.positions), this.normals && (e.normals = this.normals), this.tangents && (e.tangents = this.tangents), this.uvs && (e.uvs = this.uvs), this.uvs2 && (e.uvs2 = this.uvs2), this.uvs3 && (e.uvs3 = this.uvs3), this.uvs4 && (e.uvs4 = this.uvs4), this.uvs5 && (e.uvs5 = this.uvs5), this.uvs6 && (e.uvs6 = this.uvs6), this.colors && (e.colors = this.colors), this.matricesIndices && (e.matricesIndices = this.matricesIndices, e.matricesIndices._isExpanded = !0), this.matricesWeights && (e.matricesWeights = this.matricesWeights), this.matricesIndicesExtra && (e.matricesIndicesExtra = this.matricesIndicesExtra, e.matricesIndicesExtra._isExpanded = !0), this.matricesWeightsExtra && (e.matricesWeightsExtra = this.matricesWeightsExtra), e.indices = this.indices, e
        }, t.ExtractFromMesh = function(e, i, r) {
            return t._ExtractFrom(e, i, r)
        }, t.ExtractFromGeometry = function(e, i, r) {
            return t._ExtractFrom(e, i, r)
        }, t._ExtractFrom = function(i, r, n) {
            var o = new t;
            return i.isVerticesDataPresent(e.VertexBuffer.PositionKind) && (o.positions = i.getVerticesData(e.VertexBuffer.PositionKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.NormalKind) && (o.normals = i.getVerticesData(e.VertexBuffer.NormalKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.TangentKind) && (o.tangents = i.getVerticesData(e.VertexBuffer.TangentKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.UVKind) && (o.uvs = i.getVerticesData(e.VertexBuffer.UVKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && (o.uvs2 = i.getVerticesData(e.VertexBuffer.UV2Kind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.UV3Kind) && (o.uvs3 = i.getVerticesData(e.VertexBuffer.UV3Kind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.UV4Kind) && (o.uvs4 = i.getVerticesData(e.VertexBuffer.UV4Kind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.UV5Kind) && (o.uvs5 = i.getVerticesData(e.VertexBuffer.UV5Kind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.UV6Kind) && (o.uvs6 = i.getVerticesData(e.VertexBuffer.UV6Kind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.ColorKind) && (o.colors = i.getVerticesData(e.VertexBuffer.ColorKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.MatricesIndicesKind) && (o.matricesIndices = i.getVerticesData(e.VertexBuffer.MatricesIndicesKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.MatricesWeightsKind) && (o.matricesWeights = i.getVerticesData(e.VertexBuffer.MatricesWeightsKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.MatricesIndicesExtraKind) && (o.matricesIndicesExtra = i.getVerticesData(e.VertexBuffer.MatricesIndicesExtraKind, r, n)), i.isVerticesDataPresent(e.VertexBuffer.MatricesWeightsExtraKind) && (o.matricesWeightsExtra = i.getVerticesData(e.VertexBuffer.MatricesWeightsExtraKind, r, n)), o.indices = i.getIndices(r), o
        }, t.CreateRibbon = function(i) {
            var r = i.pathArray,
                n = i.closeArray || !1,
                o = i.closePath || !1,
                s = i.invertUV || !1,
                a = Math.floor(r[0].length / 2),
                l = i.offset || a;
            l = l > a ? a : Math.floor(l);
            var c, h, u, f, d = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE,
                p = i.uvs,
                _ = i.colors,
                m = [],
                g = [],
                v = [],
                y = [],
                b = [],
                x = [],
                T = [],
                E = [],
                A = [],
                P = [];
            if (r.length < 2) {
                var M = [],
                    S = [];
                for (u = 0; u < r[0].length - l; u++) M.push(r[0][u]), S.push(r[0][u + l]);
                r = [M, S]
            }
            var C, R, O = 0,
                I = o ? 1 : 0;
            c = r[0].length;
            var D, B;
            for (h = 0; h < r.length; h++) {
                for (T[h] = 0, b[h] = [0], C = r[h], R = C.length, c = c < R ? c : R, f = 0; f < R;) m.push(C[f].x, C[f].y, C[f].z), f > 0 && (D = C[f].subtract(C[f - 1]).length(), B = D + T[h], b[h].push(B), T[h] = B), f++;
                o && (f--, m.push(C[0].x, C[0].y, C[0].z), D = C[f].subtract(C[0]).length(), B = D + T[h], b[h].push(B), T[h] = B), A[h] = R + I, P[h] = O, O += R + I
            }
            var L, w, F = null,
                N = null;
            for (u = 0; u < c + I; u++) {
                for (E[u] = 0, x[u] = [0], h = 0; h < r.length - 1; h++) L = r[h], w = r[h + 1], u === c ? (F = L[0], N = w[0]) : (F = L[u], N = w[u]), D = N.subtract(F).length(), B = D + E[u], x[u].push(B), E[u] = B;
                n && N && F && (L = r[h], w = r[0], u === c && (N = w[0]), D = N.subtract(F).length(), B = D + E[u], E[u] = B)
            }
            var V, U;
            if (p)
                for (h = 0; h < p.length; h++) y.push(p[h].x, p[h].y);
            else
                for (h = 0; h < r.length; h++)
                    for (u = 0; u < c + I; u++) V = 0 != T[h] ? b[h][u] / T[h] : 0, U = 0 != E[u] ? x[u][h] / E[u] : 0, s ? y.push(U, V) : y.push(V, U);
            h = 0;
            for (var k = 0, z = A[h] - 1, G = A[h + 1] - 1, W = z < G ? z : G, Y = P[1] - P[0], H = n ? A.length : A.length - 1; k <= W && h < H;) g.push(k, k + Y, k + 1), g.push(k + Y + 1, k + 1, k + Y), (k += 1) === W && (h++, h === A.length - 1 ? (Y = P[0] - P[h], z = A[h] - 1, G = A[0] - 1) : (Y = P[h + 1] - P[h], z = A[h] - 1, G = A[h + 1] - 1), k = P[h], W = z < G ? z + k : G + k);
            if (t.ComputeNormals(m, g, v), o) {
                var j = 0,
                    X = 0;
                for (h = 0; h < r.length; h++) j = 3 * P[h], X = h + 1 < r.length ? 3 * (P[h + 1] - 1) : v.length - 3, v[j] = .5 * (v[j] + v[X]), v[j + 1] = .5 * (v[j + 1] + v[X + 1]), v[j + 2] = .5 * (v[j + 2] + v[X + 2]), v[X] = v[j], v[X + 1] = v[j + 1], v[X + 2] = v[j + 2]
            }
            t._ComputeSides(d, m, g, v, y, i.frontUVs, i.backUVs);
            var K = null;
            if (_) {
                K = new Float32Array(4 * _.length);
                for (var Q = 0; Q < _.length; Q++) K[4 * Q] = _[Q].r, K[4 * Q + 1] = _[Q].g, K[4 * Q + 2] = _[Q].b, K[4 * Q + 3] = _[Q].a
            }
            var Z = new t,
                q = new Float32Array(m),
                J = new Float32Array(v),
                $ = new Float32Array(y);
            return Z.indices = g, Z.positions = q, Z.normals = J, Z.uvs = $, K && Z.set(K, e.VertexBuffer.ColorKind), o && (Z._idx = P), Z
        }, t.CreateBox = function(i) {
            for (var r = [new e.Vector3(0, 0, 1), new e.Vector3(0, 0, -1), new e.Vector3(1, 0, 0), new e.Vector3(-1, 0, 0), new e.Vector3(0, 1, 0), new e.Vector3(0, -1, 0)], n = [], o = [], s = [], a = [], l = i.width || i.size || 1, c = i.height || i.size || 1, h = i.depth || i.size || 1, u = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE, f = i.faceUV || new Array(6), d = i.faceColors, p = [], _ = 0; _ < 6; _++) void 0 === f[_] && (f[_] = new e.Vector4(0, 0, 1, 1)), d && void 0 === d[_] && (d[_] = new e.Color4(1, 1, 1, 1));
            for (var m = new e.Vector3(l / 2, c / 2, h / 2), g = 0; g < r.length; g++) {
                var v = r[g],
                    y = new e.Vector3(v.y, v.z, v.x),
                    b = e.Vector3.Cross(v, y),
                    x = o.length / 3;
                n.push(x), n.push(x + 1), n.push(x + 2), n.push(x), n.push(x + 2), n.push(x + 3);
                var T = v.subtract(y).subtract(b).multiply(m);
                o.push(T.x, T.y, T.z), s.push(v.x, v.y, v.z), a.push(f[g].z, f[g].w), d && p.push(d[g].r, d[g].g, d[g].b, d[g].a), T = v.subtract(y).add(b).multiply(m), o.push(T.x, T.y, T.z), s.push(v.x, v.y, v.z), a.push(f[g].x, f[g].w), d && p.push(d[g].r, d[g].g, d[g].b, d[g].a), T = v.add(y).add(b).multiply(m), o.push(T.x, T.y, T.z), s.push(v.x, v.y, v.z), a.push(f[g].x, f[g].y), d && p.push(d[g].r, d[g].g, d[g].b, d[g].a), T = v.add(y).subtract(b).multiply(m), o.push(T.x, T.y, T.z), s.push(v.x, v.y, v.z), a.push(f[g].z, f[g].y), d && p.push(d[g].r, d[g].g, d[g].b, d[g].a)
            }
            t._ComputeSides(u, o, n, s, a, i.frontUVs, i.backUVs);
            var E = new t;
            if (E.indices = n, E.positions = o, E.normals = s, E.uvs = a, d) {
                var A = u === e.Mesh.DOUBLESIDE ? p.concat(p) : p;
                E.colors = A
            }
            return E
        }, t.CreateSphere = function(i) {
            for (var r = i.segments || 32, n = i.diameterX || i.diameter || 1, o = i.diameterY || i.diameter || 1, s = i.diameterZ || i.diameter || 1, a = i.arc && (i.arc <= 0 || i.arc > 1) ? 1 : i.arc || 1, l = i.slice && i.slice <= 0 ? 1 : i.slice || 1, c = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE, h = new e.Vector3(n / 2, o / 2, s / 2), u = 2 + r, f = 2 * u, d = [], p = [], _ = [], m = [], g = 0; g <= u; g++) {
                for (var v = g / u, y = v * Math.PI * l, b = 0; b <= f; b++) {
                    var x = b / f,
                        T = x * Math.PI * 2 * a,
                        E = e.Matrix.RotationZ(-y),
                        A = e.Matrix.RotationY(T),
                        P = e.Vector3.TransformCoordinates(e.Vector3.Up(), E),
                        M = e.Vector3.TransformCoordinates(P, A),
                        S = M.multiply(h),
                        C = M.divide(h).normalize();
                    p.push(S.x, S.y, S.z), _.push(C.x, C.y, C.z), m.push(x, v)
                }
                if (g > 0)
                    for (var R = p.length / 3, O = R - 2 * (f + 1); O + f + 2 < R; O++) d.push(O), d.push(O + 1), d.push(O + f + 1), d.push(O + f + 1), d.push(O + 1), d.push(O + f + 2)
            }
            t._ComputeSides(c, p, d, _, m, i.frontUVs, i.backUVs);
            var I = new t;
            return I.indices = d, I.positions = p, I.normals = _, I.uvs = m, I
        }, t.CreateCylinder = function(i) {
            var r, n = i.height || 2,
                o = 0 === i.diameterTop ? 0 : i.diameterTop || i.diameter || 1,
                s = 0 === i.diameterBottom ? 0 : i.diameterBottom || i.diameter || 1,
                a = i.tessellation || 24,
                l = i.subdivisions || 1,
                c = !!i.hasRings,
                h = !!i.enclose,
                u = i.arc && (i.arc <= 0 || i.arc > 1) ? 1 : i.arc || 1,
                f = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE,
                d = i.faceUV || new Array(3),
                p = i.faceColors,
                _ = 1 !== u && h ? 2 : 0,
                m = c ? l : 1,
                g = 2 + (1 + _) * m;
            for (r = 0; r < g; r++) p && void 0 === p[r] && (p[r] = new e.Color4(1, 1, 1, 1));
            for (r = 0; r < g; r++) d && void 0 === d[r] && (d[r] = new e.Vector4(0, 0, 1, 1));
            var v, y, b, x, T, E, A = new Array,
                P = new Array,
                M = new Array,
                S = new Array,
                C = new Array,
                R = 2 * Math.PI * u / a,
                O = (s - o) / 2 / n,
                I = e.Vector3.Zero(),
                D = e.Vector3.Zero(),
                B = e.Vector3.Zero(),
                L = e.Vector3.Zero(),
                w = e.Vector3.Zero(),
                F = e.Axis.Y,
                N = 1,
                V = 1,
                U = 0,
                k = 0;
            for (x = 0; x <= l; x++)
                for (y = x / l, b = (y * (o - s) + s) / 2, N = c && 0 !== x && x !== l ? 2 : 1, E = 0; E < N; E++) {
                    for (c && (V += E), h && (V += 2 * E), T = 0; T <= a; T++) v = T * R, I.x = Math.cos(-v) * b, I.y = -n / 2 + y * n, I.z = Math.sin(-v) * b, 0 === o && x === l ? (D.x = M[M.length - 3 * (a + 1)], D.y = M[M.length - 3 * (a + 1) + 1], D.z = M[M.length - 3 * (a + 1) + 2]) : (D.x = I.x, D.z = I.z, D.y = Math.sqrt(D.x * D.x + D.z * D.z) * O, D.normalize()), 0 === T && (B.copyFrom(I), L.copyFrom(D)), P.push(I.x, I.y, I.z), M.push(D.x, D.y, D.z), k = c ? U !== V ? d[V].y : d[V].w : d[V].y + (d[V].w - d[V].y) * y, S.push(d[V].x + (d[V].z - d[V].x) * T / a, k), p && C.push(p[V].r, p[V].g, p[V].b, p[V].a);
                    1 !== u && h && (P.push(I.x, I.y, I.z), P.push(0, I.y, 0), P.push(0, I.y, 0), P.push(B.x, B.y, B.z), e.Vector3.CrossToRef(F, D, w), w.normalize(), M.push(w.x, w.y, w.z, w.x, w.y, w.z), e.Vector3.CrossToRef(L, F, w), w.normalize(), M.push(w.x, w.y, w.z, w.x, w.y, w.z), k = c ? U !== V ? d[V + 1].y : d[V + 1].w : d[V + 1].y + (d[V + 1].w - d[V + 1].y) * y, S.push(d[V + 1].x, k), S.push(d[V + 1].z, k), k = c ? U !== V ? d[V + 2].y : d[V + 2].w : d[V + 2].y + (d[V + 2].w - d[V + 2].y) * y, S.push(d[V + 2].x, k), S.push(d[V + 2].z, k), p && (C.push(p[V + 1].r, p[V + 1].g, p[V + 1].b, p[V + 1].a), C.push(p[V + 1].r, p[V + 1].g, p[V + 1].b, p[V + 1].a), C.push(p[V + 2].r, p[V + 2].g, p[V + 2].b, p[V + 2].a), C.push(p[V + 2].r, p[V + 2].g, p[V + 2].b, p[V + 2].a))), U !== V && (U = V)
                }
            var V, z = 1 !== u && h ? a + 4 : a;
            for (x = 0, V = 0; V < l; V++) {
                var G = 0,
                    W = 0,
                    Y = 0,
                    H = 0;
                for (T = 0; T < a; T++) G = x * (z + 1) + T, W = (x + 1) * (z + 1) + T, Y = x * (z + 1) + (T + 1), H = (x + 1) * (z + 1) + (T + 1), A.push(G, W, Y), A.push(H, Y, W);
                1 !== u && h && (A.push(G + 2, W + 2, Y + 2), A.push(H + 2, Y + 2, W + 2), A.push(G + 4, W + 4, Y + 4), A.push(H + 4, Y + 4, W + 4)), x = c ? x + 2 : x + 1
            }
            var j = function(t) {
                var i = t ? o / 2 : s / 2;
                if (0 !== i) {
                    var r, l, c, h = t ? d[g - 1] : d[0],
                        f = null;
                    p && (f = t ? p[g - 1] : p[0]);
                    var _ = P.length / 3,
                        m = t ? n / 2 : -n / 2,
                        v = new e.Vector3(0, m, 0);
                    P.push(v.x, v.y, v.z), M.push(0, t ? 1 : -1, 0), S.push(h.x + .5 * (h.z - h.x), h.y + .5 * (h.w - h.y)), f && C.push(f.r, f.g, f.b, f.a);
                    var y = new e.Vector2(.5, .5);
                    for (c = 0; c <= a; c++) {
                        r = 2 * Math.PI * c * u / a;
                        var b = Math.cos(-r),
                            x = Math.sin(-r);
                        l = new e.Vector3(b * i, m, x * i);
                        var T = new e.Vector2(b * y.x + .5, x * y.y + .5);
                        P.push(l.x, l.y, l.z), M.push(0, t ? 1 : -1, 0), S.push(h.x + (h.z - h.x) * T.x, h.y + (h.w - h.y) * T.y), f && C.push(f.r, f.g, f.b, f.a)
                    }
                    for (c = 0; c < a; c++) t ? (A.push(_), A.push(_ + (c + 2)), A.push(_ + (c + 1))) : (A.push(_), A.push(_ + (c + 1)), A.push(_ + (c + 2)))
                }
            };
            j(!1), j(!0), t._ComputeSides(f, P, A, M, S, i.frontUVs, i.backUVs);
            var X = new t;
            return X.indices = A, X.positions = P, X.normals = M, X.uvs = S, p && (X.colors = C), X
        }, t.CreateTorus = function(i) {
            for (var r = [], n = [], o = [], s = [], a = i.diameter || 1, l = i.thickness || .5, c = i.tessellation || 16, h = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE, u = c + 1, f = 0; f <= c; f++)
                for (var d = f / c, p = f * Math.PI * 2 / c - Math.PI / 2, _ = e.Matrix.Translation(a / 2, 0, 0).multiply(e.Matrix.RotationY(p)), m = 0; m <= c; m++) {
                    var g = 1 - m / c,
                        v = m * Math.PI * 2 / c + Math.PI,
                        y = Math.cos(v),
                        b = Math.sin(v),
                        x = new e.Vector3(y, b, 0),
                        T = x.scale(l / 2),
                        E = new e.Vector2(d, g);
                    T = e.Vector3.TransformCoordinates(T, _), x = e.Vector3.TransformNormal(x, _), n.push(T.x, T.y, T.z), o.push(x.x, x.y, x.z), s.push(E.x, E.y);
                    var A = (f + 1) % u,
                        P = (m + 1) % u;
                    r.push(f * u + m), r.push(f * u + P), r.push(A * u + m), r.push(f * u + P), r.push(A * u + P), r.push(A * u + m)
                }
            t._ComputeSides(h, n, r, o, s, i.frontUVs, i.backUVs);
            var M = new t;
            return M.indices = r, M.positions = n, M.normals = o, M.uvs = s, M
        }, t.CreateLineSystem = function(e) {
            for (var i = [], r = [], n = e.lines, o = e.colors, s = [], a = 0, l = 0; l < n.length; l++)
                for (var c = n[l], h = 0; h < c.length; h++) {
                    if (r.push(c[h].x, c[h].y, c[h].z), o) {
                        var u = o[l];
                        s.push(u[h].r, u[h].g, u[h].b, u[h].a)
                    }
                    h > 0 && (i.push(a - 1), i.push(a)), a++
                }
            var f = new t;
            return f.indices = i, f.positions = r, o && (f.colors = s), f
        }, t.CreateDashedLines = function(i) {
            var r = i.dashSize || 3,
                n = i.gapSize || 1,
                o = i.dashNb || 200,
                s = i.points,
                a = new Array,
                l = new Array,
                c = e.Vector3.Zero(),
                h = 0,
                u = 0,
                f = 0,
                d = 0,
                p = 0,
                _ = 0,
                m = 0;
            for (m = 0; m < s.length - 1; m++) s[m + 1].subtractToRef(s[m], c), h += c.length();
            for (f = h / o, d = r * f / (r + n), m = 0; m < s.length - 1; m++) {
                s[m + 1].subtractToRef(s[m], c), u = Math.floor(c.length() / f), c.normalize();
                for (var g = 0; g < u; g++) p = f * g, a.push(s[m].x + p * c.x, s[m].y + p * c.y, s[m].z + p * c.z), a.push(s[m].x + (p + d) * c.x, s[m].y + (p + d) * c.y, s[m].z + (p + d) * c.z), l.push(_, _ + 1), _ += 2
            }
            var v = new t;
            return v.positions = a, v.indices = l, v
        }, t.CreateGround = function(i) {
            var r, n, o = [],
                s = [],
                a = [],
                l = [],
                c = i.width || 1,
                h = i.height || 1,
                u = i.subdivisionsX || i.subdivisions || 1,
                f = i.subdivisionsY || i.subdivisions || 1;
            for (r = 0; r <= f; r++)
                for (n = 0; n <= u; n++) {
                    var d = new e.Vector3(n * c / u - c / 2, 0, (f - r) * h / f - h / 2),
                        p = new e.Vector3(0, 1, 0);
                    s.push(d.x, d.y, d.z), a.push(p.x, p.y, p.z), l.push(n / u, 1 - r / f)
                }
            for (r = 0; r < f; r++)
                for (n = 0; n < u; n++) o.push(n + 1 + (r + 1) * (u + 1)), o.push(n + 1 + r * (u + 1)), o.push(n + r * (u + 1)), o.push(n + (r + 1) * (u + 1)), o.push(n + 1 + (r + 1) * (u + 1)), o.push(n + r * (u + 1));
            var _ = new t;
            return _.indices = o, _.positions = s, _.normals = a, _.uvs = l, _
        }, t.CreateTiledGround = function(i) {
            var r, n, o, s, a = void 0 !== i.xmin && null !== i.xmin ? i.xmin : -1,
                l = void 0 !== i.zmin && null !== i.zmin ? i.zmin : -1,
                c = void 0 !== i.xmax && null !== i.xmax ? i.xmax : 1,
                h = void 0 !== i.zmax && null !== i.zmax ? i.zmax : 1,
                u = i.subdivisions || {
                    w: 1,
                    h: 1
                },
                f = i.precision || {
                    w: 1,
                    h: 1
                },
                d = new Array,
                p = new Array,
                _ = new Array,
                m = new Array;
            u.h = u.h < 1 ? 1 : u.h, u.w = u.w < 1 ? 1 : u.w, f.w = f.w < 1 ? 1 : f.w, f.h = f.h < 1 ? 1 : f.h;
            var g = {
                w: (c - a) / u.w,
                h: (h - l) / u.h
            };
            for (o = 0; o < u.h; o++)
                for (s = 0; s < u.w; s++) !(function(t, i, o, s) {
                    var a = p.length / 3,
                        l = f.w + 1;
                    for (r = 0; r < f.h; r++)
                        for (n = 0; n < f.w; n++) {
                            var c = [a + n + r * l, a + (n + 1) + r * l, a + (n + 1) + (r + 1) * l, a + n + (r + 1) * l];
                            d.push(c[1]), d.push(c[2]), d.push(c[3]), d.push(c[0]), d.push(c[1]), d.push(c[3])
                        }
                    var h = e.Vector3.Zero(),
                        u = new e.Vector3(0, 1, 0);
                    for (r = 0; r <= f.h; r++)
                        for (h.z = r * (s - i) / f.h + i, n = 0; n <= f.w; n++) h.x = n * (o - t) / f.w + t, h.y = 0, p.push(h.x, h.y, h.z), _.push(u.x, u.y, u.z), m.push(n / f.w, r / f.h)
                })(a + s * g.w, l + o * g.h, a + (s + 1) * g.w, l + (o + 1) * g.h);
            var v = new t;
            return v.indices = d, v.positions = p, v.normals = _, v.uvs = m, v
        }, t.CreateGroundFromHeightMap = function(i) {
            var r, n, o = [],
                s = [],
                a = [],
                l = [],
                c = i.colorFilter || new e.Color3(.3, .59, .11);
            for (r = 0; r <= i.subdivisions; r++)
                for (n = 0; n <= i.subdivisions; n++) {
                    var h = new e.Vector3(n * i.width / i.subdivisions - i.width / 2, 0, (i.subdivisions - r) * i.height / i.subdivisions - i.height / 2),
                        u = (h.x + i.width / 2) / i.width * (i.bufferWidth - 1) | 0,
                        f = (1 - (h.z + i.height / 2) / i.height) * (i.bufferHeight - 1) | 0,
                        d = 4 * (u + f * i.bufferWidth),
                        p = i.buffer[d] / 255,
                        _ = i.buffer[d + 1] / 255,
                        m = i.buffer[d + 2] / 255,
                        g = p * c.r + _ * c.g + m * c.b;
                    h.y = i.minHeight + (i.maxHeight - i.minHeight) * g, s.push(h.x, h.y, h.z), a.push(0, 0, 0), l.push(n / i.subdivisions, 1 - r / i.subdivisions)
                }
            for (r = 0; r < i.subdivisions; r++)
                for (n = 0; n < i.subdivisions; n++) o.push(n + 1 + (r + 1) * (i.subdivisions + 1)), o.push(n + 1 + r * (i.subdivisions + 1)), o.push(n + r * (i.subdivisions + 1)), o.push(n + (r + 1) * (i.subdivisions + 1)), o.push(n + 1 + (r + 1) * (i.subdivisions + 1)), o.push(n + r * (i.subdivisions + 1));
            t.ComputeNormals(s, o, a);
            var v = new t;
            return v.indices = o, v.positions = s, v.normals = a, v.uvs = l, v
        }, t.CreatePlane = function(i) {
            var r = [],
                n = [],
                o = [],
                s = [],
                a = i.width || i.size || 1,
                l = i.height || i.size || 1,
                c = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE,
                h = a / 2,
                u = l / 2;
            n.push(-h, -u, 0), o.push(0, 0, -1), s.push(0, 0), n.push(h, -u, 0), o.push(0, 0, -1), s.push(1, 0), n.push(h, u, 0), o.push(0, 0, -1), s.push(1, 1), n.push(-h, u, 0), o.push(0, 0, -1), s.push(0, 1), r.push(0), r.push(1), r.push(2), r.push(0), r.push(2), r.push(3), t._ComputeSides(c, n, r, o, s, i.frontUVs, i.backUVs);
            var f = new t;
            return f.indices = r, f.positions = n, f.normals = o, f.uvs = s, f
        }, t.CreateDisc = function(i) {
            var r = new Array,
                n = new Array,
                o = new Array,
                s = new Array,
                a = i.radius || .5,
                l = i.tessellation || 64,
                c = i.arc && (i.arc <= 0 || i.arc > 1) ? 1 : i.arc || 1,
                h = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE;
            r.push(0, 0, 0), s.push(.5, .5);
            for (var u = 2 * Math.PI * c, f = u / l, d = 0; d < u; d += f) {
                var p = Math.cos(d),
                    _ = Math.sin(d),
                    m = (p + 1) / 2,
                    g = (1 - _) / 2;
                r.push(a * p, a * _, 0), s.push(m, g)
            }
            1 === c && (r.push(r[3], r[4], r[5]), s.push(s[2], s[3]));
            for (var v = r.length / 3, y = 1; y < v - 1; y++) n.push(y + 1, 0, y);
            t.ComputeNormals(r, n, o), t._ComputeSides(h, r, n, o, s, i.frontUVs, i.backUVs);
            var b = new t;
            return b.indices = n, b.positions = r, b.normals = o, b.uvs = s, b
        }, t.CreatePolygon = function(i, r, n, o, s, a) {
            for (var l = n || new Array(3), c = o, h = [], u = 0; u < 3; u++) void 0 === l[u] && (l[u] = new e.Vector4(0, 0, 1, 1)), c && void 0 === c[u] && (c[u] = new e.Color4(1, 1, 1, 1));
            for (var f = i.getVerticesData(e.VertexBuffer.PositionKind), d = i.getVerticesData(e.VertexBuffer.NormalKind), p = i.getVerticesData(e.VertexBuffer.UVKind), _ = i.getIndices(), m = 0, g = 0, v = 0; v < d.length; v += 3) Math.abs(d[v + 1]) < .001 && (g = 1), Math.abs(d[v + 1] - 1) < .001 && (g = 0), Math.abs(d[v + 1] + 1) < .001 && (g = 2), m = v / 3, p[2 * m] = (1 - p[2 * m]) * l[g].x + p[2 * m] * l[g].z, p[2 * m + 1] = (1 - p[2 * m + 1]) * l[g].y + p[2 * m + 1] * l[g].w, c && h.push(c[g].r, c[g].g, c[g].b, c[g].a);
            t._ComputeSides(r, f, _, d, p, s, a);
            var y = new t;
            if (y.indices = _, y.positions = f, y.normals = d, y.uvs = p, c) {
                var b = r === e.Mesh.DOUBLESIDE ? h.concat(h) : h;
                y.colors = b
            }
            return y
        }, t.CreateIcoSphere = function(i) {
            var r, n = i.sideOrientation || e.Mesh.DEFAULTSIDE,
                o = i.radius || 1,
                s = void 0 === i.flat || i.flat,
                a = i.subdivisions || 4,
                l = i.radiusX || o,
                c = i.radiusY || o,
                h = i.radiusZ || o,
                u = (1 + Math.sqrt(5)) / 2,
                f = [-1, u, -0, 1, u, 0, -1, -u, 0, 1, -u, 0, 0, -1, -u, 0, 1, -u, 0, -1, u, 0, 1, u, u, 0, 1, u, 0, -1, -u, 0, 1, -u, 0, -1],
                d = [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],
                p = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 2, 3, 3, 3, 4, 7, 8, 9, 9, 10, 11],
                _ = [5, 1, 3, 1, 6, 4, 0, 0, 5, 3, 4, 2, 2, 2, 4, 0, 2, 0, 1, 1, 6, 0, 6, 2, 0, 4, 3, 3, 4, 4, 3, 1, 4, 2, 4, 4, 0, 2, 1, 1, 2, 2, 3, 3, 1, 3, 2, 4],
                m = [0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0],
                g = new Array,
                v = new Array,
                y = new Array,
                b = new Array,
                x = 0,
                T = new Array(3),
                E = new Array(3);
            for (r = 0; r < 3; r++) T[r] = e.Vector3.Zero(), E[r] = e.Vector2.Zero();
            for (var A = 0; A < 20; A++) {
                for (r = 0; r < 3; r++) {
                    var P = d[3 * A + r];
                    T[r].copyFromFloats(f[3 * p[P]], f[3 * p[P] + 1], f[3 * p[P] + 2]), T[r].normalize().scaleInPlace(o), E[r].copyFromFloats(_[2 * P] * (138 / 1024) + 60 / 1024 + m[A] * (-40 / 1024), _[2 * P + 1] * (239 / 1024) + 26 / 1024 + m[A] * (20 / 1024))
                }
                for (var M = function(t, i, r, n) {
                        var o = e.Vector3.Lerp(T[0], T[2], i / a),
                            u = e.Vector3.Lerp(T[1], T[2], i / a),
                            f = a === i ? T[2] : e.Vector3.Lerp(o, u, t / (a - i));
                        f.normalize();
                        var d;
                        if (s) {
                            var p = e.Vector3.Lerp(T[0], T[2], n / a),
                                _ = e.Vector3.Lerp(T[1], T[2], n / a);
                            d = e.Vector3.Lerp(p, _, r / (a - n))
                        } else d = new e.Vector3(f.x, f.y, f.z);
                        d.x /= l, d.y /= c, d.z /= h, d.normalize();
                        var m = e.Vector2.Lerp(E[0], E[2], i / a),
                            A = e.Vector2.Lerp(E[1], E[2], i / a),
                            P = a === i ? E[2] : e.Vector2.Lerp(m, A, t / (a - i));
                        v.push(f.x * l, f.y * c, f.z * h), y.push(d.x, d.y, d.z), b.push(P.x, P.y), g.push(x), x++
                    }, S = 0; S < a; S++)
                    for (var C = 0; C + S < a; C++) M(C, S, C + 1 / 3, S + 1 / 3), M(C + 1, S, C + 1 / 3, S + 1 / 3), M(C, S + 1, C + 1 / 3, S + 1 / 3), C + S + 1 < a && (M(C + 1, S, C + 2 / 3, S + 2 / 3), M(C + 1, S + 1, C + 2 / 3, S + 2 / 3), M(C, S + 1, C + 2 / 3, S + 2 / 3))
            }
            t._ComputeSides(n, v, g, y, b, i.frontUVs, i.backUVs);
            var R = new t;
            return R.indices = g, R.positions = v, R.normals = y, R.uvs = b, R
        }, t.CreatePolyhedron = function(i) {
            var r = [];
            r[0] = {
                vertex: [
                    [0, 0, 1.732051],
                    [1.632993, 0, -.5773503],
                    [-.8164966, 1.414214, -.5773503],
                    [-.8164966, -1.414214, -.5773503]
                ],
                face: [
                    [0, 1, 2],
                    [0, 2, 3],
                    [0, 3, 1],
                    [1, 3, 2]
                ]
            }, r[1] = {
                vertex: [
                    [0, 0, 1.414214],
                    [1.414214, 0, 0],
                    [0, 1.414214, 0],
                    [-1.414214, 0, 0],
                    [0, -1.414214, 0],
                    [0, 0, -1.414214]
                ],
                face: [
                    [0, 1, 2],
                    [0, 2, 3],
                    [0, 3, 4],
                    [0, 4, 1],
                    [1, 4, 5],
                    [1, 5, 2],
                    [2, 5, 3],
                    [3, 5, 4]
                ]
            }, r[2] = {
                vertex: [
                    [0, 0, 1.070466],
                    [.7136442, 0, .7978784],
                    [-.3568221, .618034, .7978784],
                    [-.3568221, -.618034, .7978784],
                    [.7978784, .618034, .3568221],
                    [.7978784, -.618034, .3568221],
                    [-.9341724, .381966, .3568221],
                    [.1362939, 1, .3568221],
                    [.1362939, -1, .3568221],
                    [-.9341724, -.381966, .3568221],
                    [.9341724, .381966, -.3568221],
                    [.9341724, -.381966, -.3568221],
                    [-.7978784, .618034, -.3568221],
                    [-.1362939, 1, -.3568221],
                    [-.1362939, -1, -.3568221],
                    [-.7978784, -.618034, -.3568221],
                    [.3568221, .618034, -.7978784],
                    [.3568221, -.618034, -.7978784],
                    [-.7136442, 0, -.7978784],
                    [0, 0, -1.070466]
                ],
                face: [
                    [0, 1, 4, 7, 2],
                    [0, 2, 6, 9, 3],
                    [0, 3, 8, 5, 1],
                    [1, 5, 11, 10, 4],
                    [2, 7, 13, 12, 6],
                    [3, 9, 15, 14, 8],
                    [4, 10, 16, 13, 7],
                    [5, 8, 14, 17, 11],
                    [6, 12, 18, 15, 9],
                    [10, 11, 17, 19, 16],
                    [12, 13, 16, 19, 18],
                    [14, 15, 18, 19, 17]
                ]
            }, r[3] = {
                vertex: [
                    [0, 0, 1.175571],
                    [1.051462, 0, .5257311],
                    [.3249197, 1, .5257311],
                    [-.8506508, .618034, .5257311],
                    [-.8506508, -.618034, .5257311],
                    [.3249197, -1, .5257311],
                    [.8506508, .618034, -.5257311],
                    [.8506508, -.618034, -.5257311],
                    [-.3249197, 1, -.5257311],
                    [-1.051462, 0, -.5257311],
                    [-.3249197, -1, -.5257311],
                    [0, 0, -1.175571]
                ],
                face: [
                    [0, 1, 2],
                    [0, 2, 3],
                    [0, 3, 4],
                    [0, 4, 5],
                    [0, 5, 1],
                    [1, 5, 7],
                    [1, 7, 6],
                    [1, 6, 2],
                    [2, 6, 8],
                    [2, 8, 3],
                    [3, 8, 9],
                    [3, 9, 4],
                    [4, 9, 10],
                    [4, 10, 5],
                    [5, 10, 7],
                    [6, 7, 11],
                    [6, 11, 8],
                    [7, 10, 11],
                    [8, 11, 9],
                    [9, 11, 10]
                ]
            }, r[4] = {
                vertex: [
                    [0, 0, 1.070722],
                    [.7148135, 0, .7971752],
                    [-.104682, .7071068, .7971752],
                    [-.6841528, .2071068, .7971752],
                    [-.104682, -.7071068, .7971752],
                    [.6101315, .7071068, .5236279],
                    [1.04156, .2071068, .1367736],
                    [.6101315, -.7071068, .5236279],
                    [-.3574067, 1, .1367736],
                    [-.7888348, -.5, .5236279],
                    [-.9368776, .5, .1367736],
                    [-.3574067, -1, .1367736],
                    [.3574067, 1, -.1367736],
                    [.9368776, -.5, -.1367736],
                    [.7888348, .5, -.5236279],
                    [.3574067, -1, -.1367736],
                    [-.6101315, .7071068, -.5236279],
                    [-1.04156, -.2071068, -.1367736],
                    [-.6101315, -.7071068, -.5236279],
                    [.104682, .7071068, -.7971752],
                    [.6841528, -.2071068, -.7971752],
                    [.104682, -.7071068, -.7971752],
                    [-.7148135, 0, -.7971752],
                    [0, 0, -1.070722]
                ],
                face: [
                    [0, 2, 3],
                    [1, 6, 5],
                    [4, 9, 11],
                    [7, 15, 13],
                    [8, 16, 10],
                    [12, 14, 19],
                    [17, 22, 18],
                    [20, 21, 23],
                    [0, 1, 5, 2],
                    [0, 3, 9, 4],
                    [0, 4, 7, 1],
                    [1, 7, 13, 6],
                    [2, 5, 12, 8],
                    [2, 8, 10, 3],
                    [3, 10, 17, 9],
                    [4, 11, 15, 7],
                    [5, 6, 14, 12],
                    [6, 13, 20, 14],
                    [8, 12, 19, 16],
                    [9, 17, 18, 11],
                    [10, 16, 22, 17],
                    [11, 18, 21, 15],
                    [13, 15, 21, 20],
                    [14, 20, 23, 19],
                    [16, 19, 23, 22],
                    [18, 22, 23, 21]
                ]
            }, r[5] = {
                vertex: [
                    [0, 0, 1.322876],
                    [1.309307, 0, .1889822],
                    [-.9819805, .8660254, .1889822],
                    [.1636634, -1.299038, .1889822],
                    [.3273268, .8660254, -.9449112],
                    [-.8183171, -.4330127, -.9449112]
                ],
                face: [
                    [0, 3, 1],
                    [2, 4, 5],
                    [0, 1, 4, 2],
                    [0, 2, 5, 3],
                    [1, 3, 5, 4]
                ]
            }, r[6] = {
                vertex: [
                    [0, 0, 1.159953],
                    [1.013464, 0, .5642542],
                    [-.3501431, .9510565, .5642542],
                    [-.7715208, -.6571639, .5642542],
                    [.6633206, .9510565, -.03144481],
                    [.8682979, -.6571639, -.3996071],
                    [-1.121664, .2938926, -.03144481],
                    [-.2348831, -1.063314, -.3996071],
                    [.5181548, .2938926, -.9953061],
                    [-.5850262, -.112257, -.9953061]
                ],
                face: [
                    [0, 1, 4, 2],
                    [0, 2, 6, 3],
                    [1, 5, 8, 4],
                    [3, 6, 9, 7],
                    [5, 7, 9, 8],
                    [0, 3, 7, 5, 1],
                    [2, 4, 8, 9, 6]
                ]
            }, r[7] = {
                vertex: [
                    [0, 0, 1.118034],
                    [.8944272, 0, .6708204],
                    [-.2236068, .8660254, .6708204],
                    [-.7826238, -.4330127, .6708204],
                    [.6708204, .8660254, .2236068],
                    [1.006231, -.4330127, -.2236068],
                    [-1.006231, .4330127, .2236068],
                    [-.6708204, -.8660254, -.2236068],
                    [.7826238, .4330127, -.6708204],
                    [.2236068, -.8660254, -.6708204],
                    [-.8944272, 0, -.6708204],
                    [0, 0, -1.118034]
                ],
                face: [
                    [0, 1, 4, 2],
                    [0, 2, 6, 3],
                    [1, 5, 8, 4],
                    [3, 6, 10, 7],
                    [5, 9, 11, 8],
                    [7, 10, 11, 9],
                    [0, 3, 7, 9, 5, 1],
                    [2, 4, 8, 11, 10, 6]
                ]
            }, r[8] = {
                vertex: [
                    [-.729665, .670121, .319155],
                    [-.655235, -.29213, -.754096],
                    [-.093922, -.607123, .537818],
                    [.702196, .595691, .485187],
                    [.776626, -.36656, -.588064]
                ],
                face: [
                    [1, 4, 2],
                    [0, 1, 2],
                    [3, 0, 2],
                    [4, 3, 2],
                    [4, 1, 0, 3]
                ]
            }, r[9] = {
                vertex: [
                    [-.868849, -.100041, .61257],
                    [-.329458, .976099, .28078],
                    [-.26629, -.013796, -.477654],
                    [-.13392, -1.034115, .229829],
                    [.738834, .707117, -.307018],
                    [.859683, -.535264, -.338508]
                ],
                face: [
                    [3, 0, 2],
                    [5, 3, 2],
                    [4, 5, 2],
                    [1, 4, 2],
                    [0, 1, 2],
                    [0, 3, 5, 4, 1]
                ]
            }, r[10] = {
                vertex: [
                    [-.610389, .243975, .531213],
                    [-.187812, -.48795, -.664016],
                    [-.187812, .9759, -.664016],
                    [.187812, -.9759, .664016],
                    [.798201, .243975, .132803]
                ],
                face: [
                    [1, 3, 0],
                    [3, 4, 0],
                    [3, 1, 4],
                    [0, 2, 1],
                    [0, 4, 2],
                    [2, 4, 1]
                ]
            }, r[11] = {
                vertex: [
                    [-1.028778, .392027, -.048786],
                    [-.640503, -.646161, .621837],
                    [-.125162, -.395663, -.540059],
                    [.004683, .888447, -.651988],
                    [.125161, .395663, .540059],
                    [.632925, -.791376, .433102],
                    [1.031672, .157063, -.354165]
                ],
                face: [
                    [3, 2, 0],
                    [2, 1, 0],
                    [2, 5, 1],
                    [0, 4, 3],
                    [0, 1, 4],
                    [4, 1, 5],
                    [2, 3, 6],
                    [3, 4, 6],
                    [5, 2, 6],
                    [4, 5, 6]
                ]
            }, r[12] = {
                vertex: [
                    [-.669867, .334933, -.529576],
                    [-.669867, .334933, .529577],
                    [-.4043, 1.212901, 0],
                    [-.334933, -.669867, -.529576],
                    [-.334933, -.669867, .529577],
                    [.334933, .669867, -.529576],
                    [.334933, .669867, .529577],
                    [.4043, -1.212901, 0],
                    [.669867, -.334933, -.529576],
                    [.669867, -.334933, .529577]
                ],
                face: [
                    [8, 9, 7],
                    [6, 5, 2],
                    [3, 8, 7],
                    [5, 0, 2],
                    [4, 3, 7],
                    [0, 1, 2],
                    [9, 4, 7],
                    [1, 6, 2],
                    [9, 8, 5, 6],
                    [8, 3, 0, 5],
                    [3, 4, 1, 0],
                    [4, 9, 6, 1]
                ]
            }, r[13] = {
                vertex: [
                    [-.931836, .219976, -.264632],
                    [-.636706, .318353, .692816],
                    [-.613483, -.735083, -.264632],
                    [-.326545, .979634, 0],
                    [-.318353, -.636706, .692816],
                    [-.159176, .477529, -.856368],
                    [.159176, -.477529, -.856368],
                    [.318353, .636706, .692816],
                    [.326545, -.979634, 0],
                    [.613482, .735082, -.264632],
                    [.636706, -.318353, .692816],
                    [.931835, -.219977, -.264632]
                ],
                face: [
                    [11, 10, 8],
                    [7, 9, 3],
                    [6, 11, 8],
                    [9, 5, 3],
                    [2, 6, 8],
                    [5, 0, 3],
                    [4, 2, 8],
                    [0, 1, 3],
                    [10, 4, 8],
                    [1, 7, 3],
                    [10, 11, 9, 7],
                    [11, 6, 5, 9],
                    [6, 2, 0, 5],
                    [2, 4, 1, 0],
                    [4, 10, 7, 1]
                ]
            }, r[14] = {
                vertex: [
                    [-.93465, .300459, -.271185],
                    [-.838689, -.260219, -.516017],
                    [-.711319, .717591, .128359],
                    [-.710334, -.156922, .080946],
                    [-.599799, .556003, -.725148],
                    [-.503838, -.004675, -.969981],
                    [-.487004, .26021, .48049],
                    [-.460089, -.750282, -.512622],
                    [-.376468, .973135, -.325605],
                    [-.331735, -.646985, .084342],
                    [-.254001, .831847, .530001],
                    [-.125239, -.494738, -.966586],
                    [.029622, .027949, .730817],
                    [.056536, -.982543, -.262295],
                    [.08085, 1.087391, .076037],
                    [.125583, -.532729, .485984],
                    [.262625, .599586, .780328],
                    [.391387, -.726999, -.716259],
                    [.513854, -.868287, .139347],
                    [.597475, .85513, .326364],
                    [.641224, .109523, .783723],
                    [.737185, -.451155, .538891],
                    [.848705, -.612742, -.314616],
                    [.976075, .365067, .32976],
                    [1.072036, -.19561, .084927]
                ],
                face: [
                    [15, 18, 21],
                    [12, 20, 16],
                    [6, 10, 2],
                    [3, 0, 1],
                    [9, 7, 13],
                    [2, 8, 4, 0],
                    [0, 4, 5, 1],
                    [1, 5, 11, 7],
                    [7, 11, 17, 13],
                    [13, 17, 22, 18],
                    [18, 22, 24, 21],
                    [21, 24, 23, 20],
                    [20, 23, 19, 16],
                    [16, 19, 14, 10],
                    [10, 14, 8, 2],
                    [15, 9, 13, 18],
                    [12, 15, 21, 20],
                    [6, 12, 16, 10],
                    [3, 6, 2, 0],
                    [9, 3, 1, 7],
                    [9, 15, 12, 6, 3],
                    [22, 17, 11, 5, 4, 8, 14, 19, 23, 24]
                ]
            };
            var n, o, s, a, l, c, h = i.type && (i.type < 0 || i.type >= r.length) ? 0 : i.type || 0,
                u = i.size,
                f = i.sizeX || u || 1,
                d = i.sizeY || u || 1,
                p = i.sizeZ || u || 1,
                _ = i.custom || r[h],
                m = _.face.length,
                g = i.faceUV || new Array(m),
                v = i.faceColors,
                y = void 0 === i.flat || i.flat,
                b = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE,
                x = new Array,
                T = new Array,
                E = new Array,
                A = new Array,
                P = new Array,
                M = 0,
                S = 0,
                C = new Array,
                R = 0,
                O = 0;
            if (y)
                for (O = 0; O < m; O++) v && void 0 === v[O] && (v[O] = new e.Color4(1, 1, 1, 1)), g && void 0 === g[O] && (g[O] = new e.Vector4(0, 0, 1, 1));
            if (y)
                for (O = 0; O < m; O++) {
                    var I = _.face[O].length;
                    for (s = 2 * Math.PI / I, a = .5 * Math.tan(s / 2), l = .5, R = 0; R < I; R++) x.push(_.vertex[_.face[O][R]][0] * f, _.vertex[_.face[O][R]][1] * d, _.vertex[_.face[O][R]][2] * p), C.push(M), M++, n = g[O].x + (g[O].z - g[O].x) * (.5 + a), o = g[O].y + (g[O].w - g[O].y) * (l - .5), A.push(n, o), c = a * Math.cos(s) - l * Math.sin(s), l = a * Math.sin(s) + l * Math.cos(s), a = c, v && P.push(v[O].r, v[O].g, v[O].b, v[O].a);
                    for (R = 0; R < I - 2; R++) T.push(C[0 + S], C[R + 2 + S], C[R + 1 + S]);
                    S += I
                } else {
                    for (R = 0; R < _.vertex.length; R++) x.push(_.vertex[R][0] * f, _.vertex[R][1] * d, _.vertex[R][2] * p), A.push(0, 0);
                    for (O = 0; O < m; O++)
                        for (R = 0; R < _.face[O].length - 2; R++) T.push(_.face[O][0], _.face[O][R + 2], _.face[O][R + 1])
                }
            t.ComputeNormals(x, T, E), t._ComputeSides(b, x, T, E, A, i.frontUVs, i.backUVs);
            var D = new t;
            return D.positions = x, D.indices = T, D.normals = E, D.uvs = A, v && y && (D.colors = P), D
        }, t.CreateTorusKnot = function(i) {
            var r, n, o = new Array,
                s = new Array,
                a = new Array,
                l = new Array,
                c = i.radius || 2,
                h = i.tube || .5,
                u = i.radialSegments || 32,
                f = i.tubularSegments || 32,
                d = i.p || 2,
                p = i.q || 3,
                _ = 0 === i.sideOrientation ? 0 : i.sideOrientation || e.Mesh.DEFAULTSIDE,
                m = function(t) {
                    var i = Math.cos(t),
                        r = Math.sin(t),
                        n = p / d * t,
                        o = Math.cos(n),
                        s = c * (2 + o) * .5 * i,
                        a = c * (2 + o) * r * .5,
                        l = c * Math.sin(n) * .5;
                    return new e.Vector3(s, a, l)
                };
            for (r = 0; r <= u; r++) {
                var g = r % u,
                    v = g / u * 2 * d * Math.PI,
                    y = m(v),
                    b = m(v + .01),
                    x = b.subtract(y),
                    T = b.add(y),
                    E = e.Vector3.Cross(x, T);
                for (T = e.Vector3.Cross(E, x), E.normalize(), T.normalize(), n = 0; n < f; n++) {
                    var A = n % f,
                        P = A / f * 2 * Math.PI,
                        M = -h * Math.cos(P),
                        S = h * Math.sin(P);
                    s.push(y.x + M * T.x + S * E.x), s.push(y.y + M * T.y + S * E.y), s.push(y.z + M * T.z + S * E.z), l.push(r / u), l.push(n / f)
                }
            }
            for (r = 0; r < u; r++)
                for (n = 0; n < f; n++) {
                    var C = (n + 1) % f,
                        R = r * f + n,
                        O = (r + 1) * f + n,
                        I = (r + 1) * f + C,
                        D = r * f + C;
                    o.push(D), o.push(O), o.push(R), o.push(D), o.push(I), o.push(O)
                }
            t.ComputeNormals(s, o, a), t._ComputeSides(_, s, o, a, l, i.frontUVs, i.backUVs);
            var B = new t;
            return B.indices = o, B.positions = s, B.normals = a, B.uvs = l, B
        }, t.ComputeNormals = function(t, i, r, n) {
            var o = 0,
                s = 0,
                a = 0,
                l = 0,
                c = 0,
                h = 0,
                u = 0,
                f = 0,
                d = 0,
                p = 0,
                _ = 0,
                m = 0,
                g = 0,
                v = 0,
                y = 0,
                b = 0,
                x = 0,
                T = 0,
                E = 0,
                A = 0,
                P = !1,
                M = !1,
                S = !1,
                C = !1,
                R = 1,
                O = 0,
                I = null;
            if (n && (P = !!n.facetNormals, M = !!n.facetPositions, S = !!n.facetPartitioning, R = !0 === n.useRightHandedSystem ? -1 : 1, O = n.ratio || 0, C = !!n.depthSort, I = n.distanceTo, C)) {
                void 0 === I && (I = e.Vector3.Zero());
                var D = n.depthSortedFacets
            }
            var B = 0,
                L = 0,
                w = 0,
                F = 0;
            if (S && n && n.bbSize) {
                var N = 0,
                    V = 0,
                    U = 0,
                    k = 0,
                    z = 0,
                    G = 0,
                    W = 0,
                    Y = 0,
                    H = 0,
                    j = 0,
                    X = 0,
                    K = 0,
                    Q = 0,
                    Z = 0,
                    q = 0,
                    J = 0,
                    $ = n.bbSize.x > n.bbSize.y ? n.bbSize.x : n.bbSize.y;
                $ = $ > n.bbSize.z ? $ : n.bbSize.z, B = n.subDiv.X * O / n.bbSize.x, L = n.subDiv.Y * O / n.bbSize.y, w = n.subDiv.Z * O / n.bbSize.z, F = n.subDiv.max * n.subDiv.max, n.facetPartitioning.length = 0
            }
            for (o = 0; o < t.length; o++) r[o] = 0;
            var ee = i.length / 3 | 0;
            for (o = 0; o < ee; o++) {
                if (m = 3 * i[3 * o], g = m + 1, v = m + 2, y = 3 * i[3 * o + 1], b = y + 1, x = y + 2, T = 3 * i[3 * o + 2], E = T + 1, A = T + 2, s = t[m] - t[y], a = t[g] - t[b], l = t[v] - t[x], c = t[T] - t[y], h = t[E] - t[b], u = t[A] - t[x], f = R * (a * u - l * h), d = R * (l * c - s * u), p = R * (s * h - a * c), _ = Math.sqrt(f * f + d * d + p * p), _ = 0 === _ ? 1 : _, f /= _, d /= _, p /= _, P && n && (n.facetNormals[o].x = f, n.facetNormals[o].y = d, n.facetNormals[o].z = p), M && n && (n.facetPositions[o].x = (t[m] + t[y] + t[T]) / 3, n.facetPositions[o].y = (t[g] + t[b] + t[E]) / 3, n.facetPositions[o].z = (t[v] + t[x] + t[A]) / 3), S && n && (N = Math.floor((n.facetPositions[o].x - n.bInfo.minimum.x * O) * B), V = Math.floor((n.facetPositions[o].y - n.bInfo.minimum.y * O) * L), U = Math.floor((n.facetPositions[o].z - n.bInfo.minimum.z * O) * w), k = Math.floor((t[m] - n.bInfo.minimum.x * O) * B), z = Math.floor((t[g] - n.bInfo.minimum.y * O) * L), G = Math.floor((t[v] - n.bInfo.minimum.z * O) * w), W = Math.floor((t[y] - n.bInfo.minimum.x * O) * B), Y = Math.floor((t[b] - n.bInfo.minimum.y * O) * L), H = Math.floor((t[x] - n.bInfo.minimum.z * O) * w), j = Math.floor((t[T] - n.bInfo.minimum.x * O) * B), X = Math.floor((t[E] - n.bInfo.minimum.y * O) * L), K = Math.floor((t[A] - n.bInfo.minimum.z * O) * w), Z = k + n.subDiv.max * z + F * G, q = W + n.subDiv.max * Y + F * H, J = j + n.subDiv.max * X + F * K, Q = N + n.subDiv.max * V + F * U, n.facetPartitioning[Q] = n.facetPartitioning[Q] ? n.facetPartitioning[Q] : new Array, n.facetPartitioning[Z] = n.facetPartitioning[Z] ? n.facetPartitioning[Z] : new Array, n.facetPartitioning[q] = n.facetPartitioning[q] ? n.facetPartitioning[q] : new Array, n.facetPartitioning[J] = n.facetPartitioning[J] ? n.facetPartitioning[J] : new Array, n.facetPartitioning[Z].push(o), q != Z && n.facetPartitioning[q].push(o), J != q && J != Z && n.facetPartitioning[J].push(o), Q != Z && Q != q && Q != J && n.facetPartitioning[Q].push(o)), C && n && n.facetPositions) {
                    var te = D[o];
                    te.ind = 3 * o, te.sqDistance = e.Vector3.DistanceSquared(n.facetPositions[o], I)
                }
                r[m] += f, r[g] += d, r[v] += p, r[y] += f, r[b] += d, r[x] += p, r[T] += f, r[E] += d, r[A] += p
            }
            for (o = 0; o < r.length / 3; o++) f = r[3 * o], d = r[3 * o + 1], p = r[3 * o + 2], _ = Math.sqrt(f * f + d * d + p * p), _ = 0 === _ ? 1 : _, f /= _, d /= _, p /= _, r[3 * o] = f, r[3 * o + 1] = d, r[3 * o + 2] = p
        }, t._ComputeSides = function(t, i, r, n, o, s, a) {
            var l, c, h = r.length,
                u = n.length;
            switch (t = t || e.Mesh.DEFAULTSIDE) {
                case e.Mesh.FRONTSIDE:
                    break;
                case e.Mesh.BACKSIDE:
                    var f;
                    for (l = 0; l < h; l += 3) f = r[l], r[l] = r[l + 2], r[l + 2] = f;
                    for (c = 0; c < u; c++) n[c] = -n[c];
                    break;
                case e.Mesh.DOUBLESIDE:
                    for (var d = i.length, p = d / 3, _ = 0; _ < d; _++) i[d + _] = i[_];
                    for (l = 0; l < h; l += 3) r[l + h] = r[l + 2] + p, r[l + 1 + h] = r[l + 1] + p, r[l + 2 + h] = r[l] + p;
                    for (c = 0; c < u; c++) n[u + c] = -n[c];
                    var m = o.length,
                        g = 0;
                    for (g = 0; g < m; g++) o[g + m] = o[g];
                    for (s = s || new e.Vector4(0, 0, 1, 1), a = a || new e.Vector4(0, 0, 1, 1), g = 0, l = 0; l < m / 2; l++) o[g] = s.x + (s.z - s.x) * o[g], o[g + 1] = s.y + (s.w - s.y) * o[g + 1], o[g + m] = a.x + (a.z - a.x) * o[g + m], o[g + m + 1] = a.y + (a.w - a.y) * o[g + m + 1], g += 2
            }
        }, t.ImportVertexData = function(i, r) {
            var n = new t,
                o = i.positions;
            o && n.set(o, e.VertexBuffer.PositionKind);
            var s = i.normals;
            s && n.set(s, e.VertexBuffer.NormalKind);
            var a = i.tangents;
            a && n.set(a, e.VertexBuffer.TangentKind);
            var l = i.uvs;
            l && n.set(l, e.VertexBuffer.UVKind);
            var c = i.uv2s;
            c && n.set(c, e.VertexBuffer.UV2Kind);
            var h = i.uv3s;
            h && n.set(h, e.VertexBuffer.UV3Kind);
            var u = i.uv4s;
            u && n.set(u, e.VertexBuffer.UV4Kind);
            var f = i.uv5s;
            f && n.set(f, e.VertexBuffer.UV5Kind);
            var d = i.uv6s;
            d && n.set(d, e.VertexBuffer.UV6Kind);
            var p = i.colors;
            p && n.set(e.Color4.CheckColors4(p, o.length / 3), e.VertexBuffer.ColorKind);
            var _ = i.matricesIndices;
            _ && n.set(_, e.VertexBuffer.MatricesIndicesKind);
            var m = i.matricesWeights;
            m && n.set(m, e.VertexBuffer.MatricesWeightsKind);
            var g = i.indices;
            g && (n.indices = g), r.setAllVerticesData(n, i.updatable)
        }, t
    })();
    e.VertexData = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o) {
            void 0 === n && (n = !1), void 0 === o && (o = null), this.delayLoadState = e.Engine.DELAYLOADSTATE_NONE, this._totalVertices = 0, this._isDisposed = !1, this._indexBufferIsUpdatable = !1, this.id = t, this._engine = i.getEngine(), this._meshes = [], this._scene = i, this._vertexBuffers = {}, this._indices = [], this._updatable = n, r ? this.setAllVerticesData(r, n) : (this._totalVertices = 0, this._indices = []), this._engine.getCaps().vertexArrayObject && (this._vertexArrayObjects = {}), o && ("LinesMesh" === o.getClassName() && (this.boundingBias = new e.Vector2(0, o.intersectionThreshold), this.updateExtend()), this.applyToMesh(o), o.computeWorldMatrix(!0))
        }
        return Object.defineProperty(t.prototype, "boundingBias", {
            get: function() {
                return this._boundingBias
            },
            set: function(e) {
                this._boundingBias && this._boundingBias.equals(e) || (this._boundingBias = e.clone(), this.updateBoundingInfo(!0, null))
            },
            enumerable: !0,
            configurable: !0
        }), t.CreateGeometryForMesh = function(e) {
            var i = new t(t.RandomId(), e.getScene());
            return i.applyToMesh(e), i
        }, Object.defineProperty(t.prototype, "extend", {
            get: function() {
                return this._extend
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.getEngine = function() {
            return this._engine
        }, t.prototype.isReady = function() {
            return this.delayLoadState === e.Engine.DELAYLOADSTATE_LOADED || this.delayLoadState === e.Engine.DELAYLOADSTATE_NONE
        }, Object.defineProperty(t.prototype, "doNotSerialize", {
            get: function() {
                for (var e = 0; e < this._meshes.length; e++)
                    if (!this._meshes[e].doNotSerialize) return !1;
                return !0
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._rebuild = function() {
            this._vertexArrayObjects && (this._vertexArrayObjects = {}), 0 !== this._meshes.length && this._indices && (this._indexBuffer = this._engine.createIndexBuffer(this._indices));
            for (var e in this._vertexBuffers) {
                this._vertexBuffers[e]._rebuild()
            }
        }, t.prototype.setAllVerticesData = function(e, t) {
            e.applyToGeometry(this, t), this.notifyUpdate()
        }, t.prototype.setVerticesData = function(t, i, r, n) {
            void 0 === r && (r = !1);
            var o = new e.VertexBuffer(this._engine, i, t, r, 0 === this._meshes.length, n);
            this.setVerticesBuffer(o)
        }, t.prototype.removeVerticesData = function(e) {
            this._vertexBuffers[e] && (this._vertexBuffers[e].dispose(), delete this._vertexBuffers[e])
        }, t.prototype.setVerticesBuffer = function(t) {
            var i = t.getKind();
            if (this._vertexBuffers[i] && this._vertexBuffers[i].dispose(), this._vertexBuffers[i] = t, i === e.VertexBuffer.PositionKind) {
                var r = t.getData(),
                    n = t.getStrideSize();
                this._totalVertices = r.length / n, this.updateExtend(r, n), this._resetPointsArrayCache();
                for (var o = this._meshes, s = o.length, a = 0; a < s; a++) {
                    var l = o[a];
                    l._boundingInfo = new e.BoundingInfo(this._extend.minimum, this._extend.maximum), l._createGlobalSubMesh(!1), l.computeWorldMatrix(!0)
                }
            }
            this.notifyUpdate(i), this._vertexArrayObjects && (this._disposeVertexArrayObjects(), this._vertexArrayObjects = {})
        }, t.prototype.updateVerticesDataDirectly = function(e, t, i) {
            var r = this.getVertexBuffer(e);
            r && (r.updateDirectly(t, i), this.notifyUpdate(e))
        }, t.prototype.updateVerticesData = function(t, i, r) {
            void 0 === r && (r = !1);
            var n = this.getVertexBuffer(t);
            if (n) {
                if (n.update(i), t === e.VertexBuffer.PositionKind) {
                    var o = n.getStrideSize();
                    this._totalVertices = i.length / o, this.updateBoundingInfo(r, i)
                }
                this.notifyUpdate(t)
            }
        }, t.prototype.updateBoundingInfo = function(t, i) {
            t && this.updateExtend(i);
            var r = this._meshes,
                n = r.length;
            this._resetPointsArrayCache();
            for (var o = 0; o < n; o++) {
                var s = r[o];
                if (t) {
                    s._boundingInfo = new e.BoundingInfo(this._extend.minimum, this._extend.maximum);
                    for (var a = 0; a < s.subMeshes.length; a++) {
                        s.subMeshes[a].refreshBoundingInfo()
                    }
                }
            }
        }, t.prototype._bind = function(e, t) {
            if (e) {
                void 0 === t && (t = this._indexBuffer);
                var i = this.getVertexBuffers();
                if (i) {
                    if (t != this._indexBuffer || !this._vertexArrayObjects) return void this._engine.bindBuffers(i, t, e);
                    this._vertexArrayObjects[e.key] || (this._vertexArrayObjects[e.key] = this._engine.recordVertexArrayObject(i, t, e)), this._engine.bindVertexArrayObject(this._vertexArrayObjects[e.key], t)
                }
            }
        }, t.prototype.getTotalVertices = function() {
            return this.isReady() ? this._totalVertices : 0
        }, t.prototype.getVerticesData = function(e, t, i) {
            var r = this.getVertexBuffer(e);
            if (!r) return null;
            var n = r.getData();
            if (i || t && 1 !== this._meshes.length) {
                for (var o = n.length, s = [], a = 0; a < o; a++) s.push(n[a]);
                return s
            }
            return n
        }, t.prototype.isVertexBufferUpdatable = function(e) {
            var t = this._vertexBuffers[e];
            return !!t && t.isUpdatable()
        }, t.prototype.getVertexBuffer = function(e) {
            return this.isReady() ? this._vertexBuffers[e] : null
        }, t.prototype.getVertexBuffers = function() {
            return this.isReady() ? this._vertexBuffers : null
        }, t.prototype.isVerticesDataPresent = function(e) {
            return this._vertexBuffers ? void 0 !== this._vertexBuffers[e] : !!this._delayInfo && -1 !== this._delayInfo.indexOf(e)
        }, t.prototype.getVerticesDataKinds = function() {
            var e, t = [];
            if (!this._vertexBuffers && this._delayInfo)
                for (e in this._delayInfo) t.push(e);
            else
                for (e in this._vertexBuffers) t.push(e);
            return t
        }, t.prototype.updateIndices = function(e, t) {
            this._indexBuffer && (this._indexBufferIsUpdatable ? this._engine.updateDynamicIndexBuffer(this._indexBuffer, e, t) : this.setIndices(e, null, !0))
        }, t.prototype.setIndices = function(e, t, i) {
            void 0 === t && (t = null), void 0 === i && (i = !1), this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer), this._disposeVertexArrayObjects(), this._indices = e, this._indexBufferIsUpdatable = i, 0 !== this._meshes.length && this._indices && (this._indexBuffer = this._engine.createIndexBuffer(this._indices, i)), void 0 != t && (this._totalVertices = t);
            for (var r = this._meshes, n = r.length, o = 0; o < n; o++) r[o]._createGlobalSubMesh(!0);
            this.notifyUpdate()
        }, t.prototype.getTotalIndices = function() {
            return this.isReady() ? this._indices.length : 0
        }, t.prototype.getIndices = function(e) {
            if (!this.isReady()) return null;
            var t = this._indices;
            if (e && 1 !== this._meshes.length) {
                for (var i = t.length, r = [], n = 0; n < i; n++) r.push(t[n]);
                return r
            }
            return t
        }, t.prototype.getIndexBuffer = function() {
            return this.isReady() ? this._indexBuffer : null
        }, t.prototype._releaseVertexArrayObject = function(e) {
            void 0 === e && (e = null), e && this._vertexArrayObjects && this._vertexArrayObjects[e.key] && (this._engine.releaseVertexArrayObject(this._vertexArrayObjects[e.key]), delete this._vertexArrayObjects[e.key])
        }, t.prototype.releaseForMesh = function(e, t) {
            var i = this._meshes,
                r = i.indexOf(e); - 1 !== r && (i.splice(r, 1), e._geometry = null, 0 === i.length && t && this.dispose())
        }, t.prototype.applyToMesh = function(e) {
            if (e._geometry !== this) {
                var t = e._geometry;
                t && t.releaseForMesh(e);
                var i = this._meshes;
                e._geometry = this, this._scene.pushGeometry(this), i.push(e), this.isReady() ? this._applyToMesh(e) : e._boundingInfo = this._boundingInfo
            }
        }, t.prototype.updateExtend = function(t, i) {
            void 0 === t && (t = null), t || (t = this._vertexBuffers[e.VertexBuffer.PositionKind].getData()), this._extend = e.Tools.ExtractMinAndMax(t, 0, this._totalVertices, this.boundingBias, i)
        }, t.prototype._applyToMesh = function(t) {
            var i = this._meshes.length;
            for (var r in this._vertexBuffers) {
                1 === i && this._vertexBuffers[r].create();
                var n = this._vertexBuffers[r].getBuffer();
                n && (n.references = i), r === e.VertexBuffer.PositionKind && (this._extend || this.updateExtend(this._vertexBuffers[r].getData()), t._boundingInfo = new e.BoundingInfo(this._extend.minimum, this._extend.maximum), t._createGlobalSubMesh(!1), t._updateBoundingInfo())
            }
            1 === i && this._indices && this._indices.length > 0 && (this._indexBuffer = this._engine.createIndexBuffer(this._indices)), this._indexBuffer && (this._indexBuffer.references = i)
        }, t.prototype.notifyUpdate = function(e) {
            this.onGeometryUpdated && this.onGeometryUpdated(this, e);
            for (var t = 0, i = this._meshes; t < i.length; t++) {
                i[t]._markSubMeshesAsAttributesDirty()
            }
        }, t.prototype.load = function(t, i) {
            if (this.delayLoadState !== e.Engine.DELAYLOADSTATE_LOADING) {
                if (this.isReady()) return void(i && i());
                this.delayLoadState = e.Engine.DELAYLOADSTATE_LOADING, this._queueLoad(t, i)
            }
        }, t.prototype._queueLoad = function(t, i) {
            var r = this;
            this.delayLoadingFile && (t._addPendingData(this), t._loadFile(this.delayLoadingFile, (function(n) {
                if (r._delayLoadingFunction) {
                    r._delayLoadingFunction(JSON.parse(n), r), r.delayLoadState = e.Engine.DELAYLOADSTATE_LOADED, r._delayInfo = [], t._removePendingData(r);
                    for (var o = r._meshes, s = o.length, a = 0; a < s; a++) r._applyToMesh(o[a]);
                    i && i()
                }
            }), void 0, !0))
        }, t.prototype.toLeftHanded = function() {
            var t = this.getIndices(!1);
            if (null != t && t.length > 0) {
                for (var i = 0; i < t.length; i += 3) {
                    var r = t[i + 0];
                    t[i + 0] = t[i + 2], t[i + 2] = r
                }
                this.setIndices(t)
            }
            var n = this.getVerticesData(e.VertexBuffer.PositionKind, !1);
            if (null != n && n.length > 0) {
                for (var i = 0; i < n.length; i += 3) n[i + 2] = -n[i + 2];
                this.setVerticesData(e.VertexBuffer.PositionKind, n, !1)
            }
            var o = this.getVerticesData(e.VertexBuffer.NormalKind, !1);
            if (null != o && o.length > 0) {
                for (var i = 0; i < o.length; i += 3) o[i + 2] = -o[i + 2];
                this.setVerticesData(e.VertexBuffer.NormalKind, o, !1)
            }
        }, t.prototype._resetPointsArrayCache = function() {
            this._positions = null
        }, t.prototype._generatePointsArray = function() {
            if (this._positions) return !0;
            this._positions = [];
            var t = this.getVerticesData(e.VertexBuffer.PositionKind);
            if (!t) return !1;
            for (var i = 0; i < t.length; i += 3) this._positions.push(e.Vector3.FromArray(t, i));
            return !0
        }, t.prototype.isDisposed = function() {
            return this._isDisposed
        }, t.prototype._disposeVertexArrayObjects = function() {
            if (this._vertexArrayObjects) {
                for (var e in this._vertexArrayObjects) this._engine.releaseVertexArrayObject(this._vertexArrayObjects[e]);
                this._vertexArrayObjects = {}
            }
        }, t.prototype.dispose = function() {
            var t, i = this._meshes,
                r = i.length;
            for (t = 0; t < r; t++) this.releaseForMesh(i[t]);
            this._meshes = [], this._disposeVertexArrayObjects();
            for (var n in this._vertexBuffers) this._vertexBuffers[n].dispose();
            this._vertexBuffers = {}, this._totalVertices = 0, this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer), this._indexBuffer = null, this._indices = [], this.delayLoadState = e.Engine.DELAYLOADSTATE_NONE, this.delayLoadingFile = null, this._delayLoadingFunction = null, this._delayInfo = [], this._boundingInfo = null, this._scene.removeGeometry(this), this._isDisposed = !0
        }, t.prototype.copy = function(i) {
            var r = new e.VertexData;
            r.indices = [];
            var n = this.getIndices();
            if (n)
                for (var o = 0; o < n.length; o++) r.indices.push(n[o]);
            var s, a = !1,
                l = !1;
            for (s in this._vertexBuffers) {
                var c = this.getVerticesData(s);
                if (c instanceof Float32Array ? r.set(new Float32Array(c), s) : r.set(c.slice(0), s), !l) {
                    var h = this.getVertexBuffer(s);
                    h && (a = h.isUpdatable(), l = !a)
                }
            }
            var u = new t(i, this._scene, r, a);
            u.delayLoadState = this.delayLoadState, u.delayLoadingFile = this.delayLoadingFile, u._delayLoadingFunction = this._delayLoadingFunction;
            for (s in this._delayInfo) u._delayInfo = u._delayInfo || [], u._delayInfo.push(s);
            return u._boundingInfo = new e.BoundingInfo(this._extend.minimum, this._extend.maximum), u
        }, t.prototype.serialize = function() {
            var t = {};
            return t.id = this.id, t.updatable = this._updatable, e.Tags && e.Tags.HasTags(this) && (t.tags = e.Tags.GetTags(this)), t
        }, t.prototype.toNumberArray = function(e) {
            return Array.isArray(e) ? e : Array.prototype.slice.call(e)
        }, t.prototype.serializeVerticeData = function() {
            var t = this.serialize();
            return this.isVerticesDataPresent(e.VertexBuffer.PositionKind) && (t.positions = this.toNumberArray(this.getVerticesData(e.VertexBuffer.PositionKind)), this.isVertexBufferUpdatable(e.VertexBuffer.PositionKind) && (t.positions._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.NormalKind) && (t.normals = this.toNumberArray(this.getVerticesData(e.VertexBuffer.NormalKind)), this.isVertexBufferUpdatable(e.VertexBuffer.NormalKind) && (t.normals._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.TangentKind) && (t.tangets = this.toNumberArray(this.getVerticesData(e.VertexBuffer.TangentKind)), this.isVertexBufferUpdatable(e.VertexBuffer.TangentKind) && (t.tangets._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.UVKind) && (t.uvs = this.toNumberArray(this.getVerticesData(e.VertexBuffer.UVKind)), this.isVertexBufferUpdatable(e.VertexBuffer.UVKind) && (t.uvs._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && (t.uv2s = this.toNumberArray(this.getVerticesData(e.VertexBuffer.UV2Kind)), this.isVertexBufferUpdatable(e.VertexBuffer.UV2Kind) && (t.uv2s._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.UV3Kind) && (t.uv3s = this.toNumberArray(this.getVerticesData(e.VertexBuffer.UV3Kind)), this.isVertexBufferUpdatable(e.VertexBuffer.UV3Kind) && (t.uv3s._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.UV4Kind) && (t.uv4s = this.toNumberArray(this.getVerticesData(e.VertexBuffer.UV4Kind)), this.isVertexBufferUpdatable(e.VertexBuffer.UV4Kind) && (t.uv4s._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.UV5Kind) && (t.uv5s = this.toNumberArray(this.getVerticesData(e.VertexBuffer.UV5Kind)), this.isVertexBufferUpdatable(e.VertexBuffer.UV5Kind) && (t.uv5s._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.UV6Kind) && (t.uv6s = this.toNumberArray(this.getVerticesData(e.VertexBuffer.UV6Kind)), this.isVertexBufferUpdatable(e.VertexBuffer.UV6Kind) && (t.uv6s._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.ColorKind) && (t.colors = this.toNumberArray(this.getVerticesData(e.VertexBuffer.ColorKind)), this.isVertexBufferUpdatable(e.VertexBuffer.ColorKind) && (t.colors._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.MatricesIndicesKind) && (t.matricesIndices = this.toNumberArray(this.getVerticesData(e.VertexBuffer.MatricesIndicesKind)), t.matricesIndices._isExpanded = !0, this.isVertexBufferUpdatable(e.VertexBuffer.MatricesIndicesKind) && (t.matricesIndices._updatable = !0)), this.isVerticesDataPresent(e.VertexBuffer.MatricesWeightsKind) && (t.matricesWeights = this.toNumberArray(this.getVerticesData(e.VertexBuffer.MatricesWeightsKind)), this.isVertexBufferUpdatable(e.VertexBuffer.MatricesWeightsKind) && (t.matricesWeights._updatable = !0)), t.indices = this.toNumberArray(this.getIndices()), t
        }, t.ExtractFromMesh = function(e, t) {
            var i = e._geometry;
            return i ? i.copy(t) : null
        }, t.RandomId = function() {
            return e.Tools.RandomId()
        }, t._ImportGeometry = function(i, r) {
            var n = r.getScene(),
                o = i.geometryId;
            if (o) {
                var s = n.getGeometryByID(o);
                s && s.applyToMesh(r)
            } else if (i instanceof ArrayBuffer) {
                var a = r._binaryInfo;
                if (a.positionsAttrDesc && a.positionsAttrDesc.count > 0) {
                    var l = new Float32Array(i, a.positionsAttrDesc.offset, a.positionsAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.PositionKind, l, !1)
                }
                if (a.normalsAttrDesc && a.normalsAttrDesc.count > 0) {
                    var c = new Float32Array(i, a.normalsAttrDesc.offset, a.normalsAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.NormalKind, c, !1)
                }
                if (a.tangetsAttrDesc && a.tangetsAttrDesc.count > 0) {
                    var h = new Float32Array(i, a.tangetsAttrDesc.offset, a.tangetsAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.TangentKind, h, !1)
                }
                if (a.uvsAttrDesc && a.uvsAttrDesc.count > 0) {
                    var u = new Float32Array(i, a.uvsAttrDesc.offset, a.uvsAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.UVKind, u, !1)
                }
                if (a.uvs2AttrDesc && a.uvs2AttrDesc.count > 0) {
                    var f = new Float32Array(i, a.uvs2AttrDesc.offset, a.uvs2AttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.UV2Kind, f, !1)
                }
                if (a.uvs3AttrDesc && a.uvs3AttrDesc.count > 0) {
                    var d = new Float32Array(i, a.uvs3AttrDesc.offset, a.uvs3AttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.UV3Kind, d, !1)
                }
                if (a.uvs4AttrDesc && a.uvs4AttrDesc.count > 0) {
                    var p = new Float32Array(i, a.uvs4AttrDesc.offset, a.uvs4AttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.UV4Kind, p, !1)
                }
                if (a.uvs5AttrDesc && a.uvs5AttrDesc.count > 0) {
                    var _ = new Float32Array(i, a.uvs5AttrDesc.offset, a.uvs5AttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.UV5Kind, _, !1)
                }
                if (a.uvs6AttrDesc && a.uvs6AttrDesc.count > 0) {
                    var m = new Float32Array(i, a.uvs6AttrDesc.offset, a.uvs6AttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.UV6Kind, m, !1)
                }
                if (a.colorsAttrDesc && a.colorsAttrDesc.count > 0) {
                    var g = new Float32Array(i, a.colorsAttrDesc.offset, a.colorsAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.ColorKind, g, !1, a.colorsAttrDesc.stride)
                }
                if (a.matricesIndicesAttrDesc && a.matricesIndicesAttrDesc.count > 0) {
                    var v = new Int32Array(i, a.matricesIndicesAttrDesc.offset, a.matricesIndicesAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.MatricesIndicesKind, v, !1)
                }
                if (a.matricesWeightsAttrDesc && a.matricesWeightsAttrDesc.count > 0) {
                    var y = new Float32Array(i, a.matricesWeightsAttrDesc.offset, a.matricesWeightsAttrDesc.count);
                    r.setVerticesData(e.VertexBuffer.MatricesWeightsKind, y, !1)
                }
                if (a.indicesAttrDesc && a.indicesAttrDesc.count > 0) {
                    var b = new Int32Array(i, a.indicesAttrDesc.offset, a.indicesAttrDesc.count);
                    r.setIndices(b, null)
                }
                if (a.subMeshesAttrDesc && a.subMeshesAttrDesc.count > 0) {
                    var x = new Int32Array(i, a.subMeshesAttrDesc.offset, 5 * a.subMeshesAttrDesc.count);
                    r.subMeshes = [];
                    for (var T = 0; T < a.subMeshesAttrDesc.count; T++) {
                        var E = x[5 * T + 0],
                            A = x[5 * T + 1],
                            P = x[5 * T + 2],
                            M = x[5 * T + 3],
                            S = x[5 * T + 4];
                        e.SubMesh.AddToMesh(E, A, P, M, S, r)
                    }
                }
            } else if (i.positions && i.normals && i.indices) {
                if (r.setVerticesData(e.VertexBuffer.PositionKind, i.positions, i.positions._updatable), r.setVerticesData(e.VertexBuffer.NormalKind, i.normals, i.normals._updatable), i.tangents && r.setVerticesData(e.VertexBuffer.TangentKind, i.tangents, i.tangents._updatable), i.uvs && r.setVerticesData(e.VertexBuffer.UVKind, i.uvs, i.uvs._updatable), i.uvs2 && r.setVerticesData(e.VertexBuffer.UV2Kind, i.uvs2, i.uvs2._updatable), i.uvs3 && r.setVerticesData(e.VertexBuffer.UV3Kind, i.uvs3, i.uvs3._updatable), i.uvs4 && r.setVerticesData(e.VertexBuffer.UV4Kind, i.uvs4, i.uvs4._updatable), i.uvs5 && r.setVerticesData(e.VertexBuffer.UV5Kind, i.uvs5, i.uvs5._updatable), i.uvs6 && r.setVerticesData(e.VertexBuffer.UV6Kind, i.uvs6, i.uvs6._updatable), i.colors && r.setVerticesData(e.VertexBuffer.ColorKind, e.Color4.CheckColors4(i.colors, i.positions.length / 3), i.colors._updatable), i.matricesIndices)
                    if (i.matricesIndices._isExpanded) delete i.matricesIndices._isExpanded, r.setVerticesData(e.VertexBuffer.MatricesIndicesKind, i.matricesIndices, i.matricesIndices._updatable);
                    else {
                        for (var C = [], T = 0; T < i.matricesIndices.length; T++) {
                            var R = i.matricesIndices[T];
                            C.push(255 & R), C.push((65280 & R) >> 8), C.push((16711680 & R) >> 16), C.push(R >> 24)
                        }
                        r.setVerticesData(e.VertexBuffer.MatricesIndicesKind, C, i.matricesIndices._updatable)
                    }
                if (i.matricesIndicesExtra)
                    if (i.matricesIndicesExtra._isExpanded) delete i.matricesIndices._isExpanded, r.setVerticesData(e.VertexBuffer.MatricesIndicesExtraKind, i.matricesIndicesExtra, i.matricesIndicesExtra._updatable);
                    else {
                        for (var C = [], T = 0; T < i.matricesIndicesExtra.length; T++) {
                            var R = i.matricesIndicesExtra[T];
                            C.push(255 & R), C.push((65280 & R) >> 8), C.push((16711680 & R) >> 16), C.push(R >> 24)
                        }
                        r.setVerticesData(e.VertexBuffer.MatricesIndicesExtraKind, C, i.matricesIndicesExtra._updatable)
                    }
                i.matricesWeights && (t._CleanMatricesWeights(i, r), r.setVerticesData(e.VertexBuffer.MatricesWeightsKind, i.matricesWeights, i.matricesWeights._updatable)), i.matricesWeightsExtra && r.setVerticesData(e.VertexBuffer.MatricesWeightsExtraKind, i.matricesWeightsExtra, i.matricesWeights._updatable), r.setIndices(i.indices, null)
            }
            if (i.subMeshes) {
                r.subMeshes = [];
                for (var O = 0; O < i.subMeshes.length; O++) {
                    var I = i.subMeshes[O];
                    e.SubMesh.AddToMesh(I.materialIndex, I.verticesStart, I.verticesCount, I.indexStart, I.indexCount, r)
                }
            }
            r._shouldGenerateFlatShading && (r.convertToFlatShadedMesh(), delete r._shouldGenerateFlatShading), r.computeWorldMatrix(!0);
            var D = n.selectionOctree;
            void 0 !== D && null !== D && D.addMesh(r)
        }, t._CleanMatricesWeights = function(t, i) {
            if (e.SceneLoader.CleanBoneMatrixWeights) {
                var r = 0;
                if (t.skeletonId > -1) {
                    var n = i.getScene().getLastSkeletonByID(t.skeletonId);
                    if (n) {
                        r = n.bones.length;
                        for (var o = i.getVerticesData(e.VertexBuffer.MatricesIndicesKind), s = i.getVerticesData(e.VertexBuffer.MatricesIndicesExtraKind), a = t.matricesWeights, l = t.matricesWeightsExtra, c = t.numBoneInfluencer, h = a.length, u = 0; u < h; u += 4) {
                            for (var f = 0, d = -1, p = 0; p < 4; p++) {
                                var _ = a[u + p];
                                f += _, _ < .001 && d < 0 && (d = p)
                            }
                            if (l)
                                for (var p = 0; p < 4; p++) {
                                    var _ = l[u + p];
                                    f += _, _ < .001 && d < 0 && (d = p + 4)
                                }
                            if ((d < 0 || d > c - 1) && (d = c - 1), f > .001) {
                                for (var m = 1 / f, p = 0; p < 4; p++) a[u + p] *= m;
                                if (l)
                                    for (var p = 0; p < 4; p++) l[u + p] *= m
                            } else d >= 4 ? (l[u + d - 4] = 1 - f, s[u + d - 4] = r) : (a[u + d] = 1 - f, o[u + d] = r)
                        }
                        i.setVerticesData(e.VertexBuffer.MatricesIndicesKind, o), t.matricesWeightsExtra && i.setVerticesData(e.VertexBuffer.MatricesIndicesExtraKind, s)
                    }
                }
            }
        }, t.Parse = function(i, r, n) {
            if (r.getGeometryByID(i.id)) return null;
            var o = new t(i.id, r, void 0, i.updatable);
            return e.Tags && e.Tags.AddTagsTo(o, i.tags), i.delayLoadingFile ? (o.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED, o.delayLoadingFile = n + i.delayLoadingFile, o._boundingInfo = new e.BoundingInfo(e.Vector3.FromArray(i.boundingBoxMinimum), e.Vector3.FromArray(i.boundingBoxMaximum)), o._delayInfo = [], i.hasUVs && o._delayInfo.push(e.VertexBuffer.UVKind), i.hasUVs2 && o._delayInfo.push(e.VertexBuffer.UV2Kind), i.hasUVs3 && o._delayInfo.push(e.VertexBuffer.UV3Kind), i.hasUVs4 && o._delayInfo.push(e.VertexBuffer.UV4Kind), i.hasUVs5 && o._delayInfo.push(e.VertexBuffer.UV5Kind), i.hasUVs6 && o._delayInfo.push(e.VertexBuffer.UV6Kind), i.hasColors && o._delayInfo.push(e.VertexBuffer.ColorKind), i.hasMatricesIndices && o._delayInfo.push(e.VertexBuffer.MatricesIndicesKind), i.hasMatricesWeights && o._delayInfo.push(e.VertexBuffer.MatricesWeightsKind), o._delayLoadingFunction = e.VertexData.ImportVertexData) : e.VertexData.ImportVertexData(i, o), r.pushGeometry(o, !0), o
        }, t
    })();
    e.Geometry = t;
    var i = (function(e) {
        function t(t, i, r, n) {
            void 0 === r && (r = !1), void 0 === n && (n = null);
            var o = e.call(this, t, i, void 0, !1, n) || this;
            return o._canBeRegenerated = r, o._beingRegenerated = !0, o.regenerate(), o._beingRegenerated = !1, o
        }
        return __extends(t, e), t.prototype.canBeRegenerated = function() {
            return this._canBeRegenerated
        }, t.prototype.regenerate = function() {
            this._canBeRegenerated && (this._beingRegenerated = !0, this.setAllVerticesData(this._regenerateVertexData(), !1), this._beingRegenerated = !1)
        }, t.prototype.asNewGeometry = function(t) {
            return e.prototype.copy.call(this, t)
        }, t.prototype.setAllVerticesData = function(t, i) {
            this._beingRegenerated && e.prototype.setAllVerticesData.call(this, t, !1)
        }, t.prototype.setVerticesData = function(t, i, r) {
            this._beingRegenerated && e.prototype.setVerticesData.call(this, t, i, !1)
        }, t.prototype._regenerateVertexData = function() {
            throw new Error("Abstract method")
        }, t.prototype.copy = function(e) {
            throw new Error("Must be overriden in sub-classes.")
        }, t.prototype.serialize = function() {
            var t = e.prototype.serialize.call(this);
            return t.canBeRegenerated = this.canBeRegenerated(), t
        }, t
    })(t);
    e._PrimitiveGeometry = i;
    var r = (function(t) {
        function i(i, r, n, o, s, a, l, c, h) {
            void 0 === h && (h = e.Mesh.DEFAULTSIDE);
            var u = t.call(this, i, r, l, c) || this;
            return u.pathArray = n, u.closeArray = o, u.closePath = s, u.offset = a, u.side = h, u
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateRibbon({
                pathArray: this.pathArray,
                closeArray: this.closeArray,
                closePath: this.closePath,
                offset: this.offset,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.pathArray, this.closeArray, this.closePath, this.offset, this.canBeRegenerated(), void 0, this.side)
        }, i
    })(i);
    e.RibbonGeometry = r;
    var n = (function(t) {
        function i(i, r, n, o, s, a) {
            void 0 === s && (s = null), void 0 === a && (a = e.Mesh.DEFAULTSIDE);
            var l = t.call(this, i, r, o, s) || this;
            return l.size = n, l.side = a, l
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateBox({
                size: this.size,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.size, this.canBeRegenerated(), void 0, this.side)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.size = this.size, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.size, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.BoxGeometry = n;
    var o = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === a && (a = null), void 0 === l && (l = e.Mesh.DEFAULTSIDE);
            var c = t.call(this, i, r, s, a) || this;
            return c.segments = n, c.diameter = o, c.side = l, c
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateSphere({
                segments: this.segments,
                diameter: this.diameter,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.segments, this.diameter, this.canBeRegenerated(), null, this.side)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.segments = this.segments, e.diameter = this.diameter, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.segments, t.diameter, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.SphereGeometry = o;
    var s = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === a && (a = null), void 0 === l && (l = e.Mesh.DEFAULTSIDE);
            var c = t.call(this, i, r, s, a) || this;
            return c.radius = n, c.tessellation = o, c.side = l, c
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateDisc({
                radius: this.radius,
                tessellation: this.tessellation,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.radius, this.tessellation, this.canBeRegenerated(), null, this.side)
        }, i
    })(i);
    e.DiscGeometry = s;
    var a = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u) {
            void 0 === l && (l = 1), void 0 === h && (h = null), void 0 === u && (u = e.Mesh.DEFAULTSIDE);
            var f = t.call(this, i, r, c, h) || this;
            return f.height = n, f.diameterTop = o, f.diameterBottom = s, f.tessellation = a, f.subdivisions = l, f.side = u, f
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateCylinder({
                height: this.height,
                diameterTop: this.diameterTop,
                diameterBottom: this.diameterBottom,
                tessellation: this.tessellation,
                subdivisions: this.subdivisions,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.height, this.diameterTop, this.diameterBottom, this.tessellation, this.subdivisions, this.canBeRegenerated(), null, this.side)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.height = this.height, e.diameterTop = this.diameterTop, e.diameterBottom = this.diameterBottom, e.tessellation = this.tessellation, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.height, t.diameterTop, t.diameterBottom, t.tessellation, t.subdivisions, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.CylinderGeometry = a;
    var l = (function(t) {
        function i(i, r, n, o, s, a, l, c) {
            void 0 === l && (l = null), void 0 === c && (c = e.Mesh.DEFAULTSIDE);
            var h = t.call(this, i, r, a, l) || this;
            return h.diameter = n, h.thickness = o, h.tessellation = s, h.side = c, h
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateTorus({
                diameter: this.diameter,
                thickness: this.thickness,
                tessellation: this.tessellation,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.diameter, this.thickness, this.tessellation, this.canBeRegenerated(), null, this.side)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.diameter = this.diameter, e.thickness = this.thickness, e.tessellation = this.tessellation, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.diameter, t.thickness, t.tessellation, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.TorusGeometry = l;
    var c = (function(t) {
        function i(e, i, r, n, o, s, a) {
            void 0 === a && (a = null);
            var l = t.call(this, e, i, s, a) || this;
            return l.width = r, l.height = n, l.subdivisions = o, l
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateGround({
                width: this.width,
                height: this.height,
                subdivisions: this.subdivisions
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.width, this.height, this.subdivisions, this.canBeRegenerated(), null)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.width = this.width, e.height = this.height, e.subdivisions = this.subdivisions, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.width, t.height, t.subdivisions, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.GroundGeometry = c;
    var h = (function(t) {
        function i(e, i, r, n, o, s, a, l, c, h) {
            void 0 === h && (h = null);
            var u = t.call(this, e, i, c, h) || this;
            return u.xmin = r, u.zmin = n, u.xmax = o, u.zmax = s, u.subdivisions = a, u.precision = l, u
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateTiledGround({
                xmin: this.xmin,
                zmin: this.zmin,
                xmax: this.xmax,
                zmax: this.zmax,
                subdivisions: this.subdivisions,
                precision: this.precision
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.xmin, this.zmin, this.xmax, this.zmax, this.subdivisions, this.precision, this.canBeRegenerated(), null)
        }, i
    })(i);
    e.TiledGroundGeometry = h;
    var u = (function(t) {
        function i(i, r, n, o, s, a) {
            void 0 === s && (s = null), void 0 === a && (a = e.Mesh.DEFAULTSIDE);
            var l = t.call(this, i, r, o, s) || this;
            return l.size = n, l.side = a, l
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreatePlane({
                size: this.size,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.size, this.canBeRegenerated(), null, this.side)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.size = this.size, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.size, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.PlaneGeometry = u;
    var f = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u, f) {
            void 0 === u && (u = null), void 0 === f && (f = e.Mesh.DEFAULTSIDE);
            var d = t.call(this, i, r, h, u) || this;
            return d.radius = n, d.tube = o, d.radialSegments = s, d.tubularSegments = a, d.p = l, d.q = c, d.side = f, d
        }
        return __extends(i, t), i.prototype._regenerateVertexData = function() {
            return e.VertexData.CreateTorusKnot({
                radius: this.radius,
                tube: this.tube,
                radialSegments: this.radialSegments,
                tubularSegments: this.tubularSegments,
                p: this.p,
                q: this.q,
                sideOrientation: this.side
            })
        }, i.prototype.copy = function(e) {
            return new i(e, this.getScene(), this.radius, this.tube, this.radialSegments, this.tubularSegments, this.p, this.q, this.canBeRegenerated(), null, this.side)
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.radius = this.radius, e.tube = this.tube, e.radialSegments = this.radialSegments, e.tubularSegments = this.tubularSegments, e.p = this.p, e.q = this.q, e
        }, i.Parse = function(t, r) {
            if (r.getGeometryByID(t.id)) return null;
            var n = new i(t.id, r, t.radius, t.tube, t.radialSegments, t.tubularSegments, t.p, t.q, t.canBeRegenerated, null);
            return e.Tags && e.Tags.AddTagsTo(n, t.tags), r.pushGeometry(n, !0), n
        }, i
    })(i);
    e.TorusKnotGeometry = f
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            this._vertexBuffers = {}, this._scene = e
        }
        return t.prototype._prepareBuffers = function() {
            if (!this._vertexBuffers[e.VertexBuffer.PositionKind]) {
                var t = [];
                t.push(1, 1), t.push(-1, 1), t.push(-1, -1), t.push(1, -1), this._vertexBuffers[e.VertexBuffer.PositionKind] = new e.VertexBuffer(this._scene.getEngine(), t, e.VertexBuffer.PositionKind, !1, !1, 2), this._buildIndexBuffer()
            }
        }, t.prototype._buildIndexBuffer = function() {
            var e = [];
            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)
        }, t.prototype._rebuild = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && (t._rebuild(), this._buildIndexBuffer())
        }, t.prototype._prepareFrame = function(e, t) {
            void 0 === e && (e = null), void 0 === t && (t = null);
            var i = this._scene.activeCamera;
            if (!i) return !1;
            var t = t || i._postProcesses;
            return !(!t || 0 === t.length || !this._scene.postProcessesEnabled) && (t[0].activate(i, e, null !== t && void 0 !== t), !0)
        }, t.prototype.directRender = function(t, i, r) {
            void 0 === i && (i = null), void 0 === r && (r = !1);
            for (var n = this._scene.getEngine(), o = 0; o < t.length; o++) {
                o < t.length - 1 ? t[o + 1].activate(this._scene.activeCamera, i) : i ? n.bindFramebuffer(i, 0, void 0, void 0, r) : n.restoreDefaultFramebuffer();
                var s = t[o],
                    a = s.apply();
                a && (s.onBeforeRenderObservable.notifyObservers(a), this._prepareBuffers(), n.bindBuffers(this._vertexBuffers, this._indexBuffer, a), n.drawElementsType(e.Material.TriangleFillMode, 0, 6), s.onAfterRenderObservable.notifyObservers(a))
            }
            n.setDepthBuffer(!0), n.setDepthWrite(!0)
        }, t.prototype._finalizeFrame = function(t, i, r, n, o) {
            void 0 === o && (o = !1);
            var s = this._scene.activeCamera;
            if (s && (n = n || s._postProcesses, 0 !== n.length && this._scene.postProcessesEnabled)) {
                for (var a = this._scene.getEngine(), l = 0, c = n.length; l < c && (l < c - 1 ? n[l + 1].activate(s, i) : i ? a.bindFramebuffer(i, r, void 0, void 0, o) : a.restoreDefaultFramebuffer(), !t); l++) {
                    var h = n[l],
                        u = h.apply();
                    u && (h.onBeforeRenderObservable.notifyObservers(u), this._prepareBuffers(), a.bindBuffers(this._vertexBuffers, this._indexBuffer, u), a.drawElementsType(e.Material.TriangleFillMode, 0, 6), h.onAfterRenderObservable.notifyObservers(u))
                }
                a.setDepthBuffer(!0), a.setDepthWrite(!0), a.setAlphaMode(e.Engine.ALPHA_DISABLE)
            }
        }, t.prototype.dispose = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && (t.dispose(), this._vertexBuffers[e.VertexBuffer.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null)
        }, t
    })();
    e.PostProcessManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            void 0 === e && (e = 30), this._enabled = !0, this._rollingFrameTime = new i(e)
        }
        return t.prototype.sampleFrame = function(t) {
            if (void 0 === t && (t = e.Tools.Now), this._enabled) {
                if (null != this._lastFrameTimeMs) {
                    var i = t - this._lastFrameTimeMs;
                    this._rollingFrameTime.add(i)
                }
                this._lastFrameTimeMs = t
            }
        }, Object.defineProperty(t.prototype, "averageFrameTime", {
            get: function() {
                return this._rollingFrameTime.average
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "averageFrameTimeVariance", {
            get: function() {
                return this._rollingFrameTime.variance
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "instantaneousFrameTime", {
            get: function() {
                return this._rollingFrameTime.history(0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "averageFPS", {
            get: function() {
                return 1e3 / this._rollingFrameTime.average
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "instantaneousFPS", {
            get: function() {
                var e = this._rollingFrameTime.history(0);
                return 0 === e ? 0 : 1e3 / e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isSaturated", {
            get: function() {
                return this._rollingFrameTime.isSaturated()
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.enable = function() {
            this._enabled = !0
        }, t.prototype.disable = function() {
            this._enabled = !1, this._lastFrameTimeMs = null
        }, Object.defineProperty(t.prototype, "isEnabled", {
            get: function() {
                return this._enabled
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.reset = function() {
            this._lastFrameTimeMs = null, this._rollingFrameTime.reset()
        }, t
    })();
    e.PerformanceMonitor = t;
    var i = (function() {
        function e(e) {
            this._samples = new Array(e), this.reset()
        }
        return e.prototype.add = function(e) {
            var t;
            if (this.isSaturated()) {
                var i = this._samples[this._pos];
                t = i - this.average, this.average -= t / (this._sampleCount - 1), this._m2 -= t * (i - this.average)
            } else this._sampleCount++;
            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
        }, e.prototype.history = function(e) {
            if (e >= this._sampleCount || e >= this._samples.length) return 0;
            var t = this._wrapPosition(this._pos - 1);
            return this._samples[this._wrapPosition(t - e)]
        }, e.prototype.isSaturated = function() {
            return this._sampleCount >= this._samples.length
        }, e.prototype.reset = function() {
            this.average = 0, this.variance = 0, this._sampleCount = 0, this._pos = 0, this._m2 = 0
        }, e.prototype._wrapPosition = function(e) {
            var t = this._samples.length;
            return (e % t + t) % t
        }, e
    })();
    e.RollingAverage = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.colorCurves = new e.ColorCurves, this._colorCurvesEnabled = !1, this._colorGradingEnabled = !1, this._colorGradingWithGreenDepth = !0, this._colorGradingBGR = !0, this._exposure = 1, this._toneMappingEnabled = !1, this._contrast = 1, this.vignetteStretch = 0, this.vignetteCentreX = 0, this.vignetteCentreY = 0, this.vignetteWeight = 1.5, this.vignetteColor = new e.Color4(0, 0, 0, 0), this.vignetteCameraFov = .5, this._vignetteBlendMode = t.VIGNETTEMODE_MULTIPLY, this._vignetteEnabled = !1, this._applyByPostProcess = !1, this._isEnabled = !0, this.onUpdateParameters = new e.Observable
        }
        return Object.defineProperty(t.prototype, "colorCurvesEnabled", {
            get: function() {
                return this._colorCurvesEnabled
            },
            set: function(e) {
                this._colorCurvesEnabled !== e && (this._colorCurvesEnabled = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "colorGradingEnabled", {
            get: function() {
                return this._colorGradingEnabled
            },
            set: function(e) {
                this._colorGradingEnabled !== e && (this._colorGradingEnabled = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "colorGradingWithGreenDepth", {
            get: function() {
                return this._colorGradingWithGreenDepth
            },
            set: function(e) {
                this._colorGradingWithGreenDepth !== e && (this._colorGradingWithGreenDepth = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "colorGradingBGR", {
            get: function() {
                return this._colorGradingBGR
            },
            set: function(e) {
                this._colorGradingBGR !== e && (this._colorGradingBGR = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "exposure", {
            get: function() {
                return this._exposure
            },
            set: function(e) {
                this._exposure !== e && (this._exposure = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "toneMappingEnabled", {
            get: function() {
                return this._toneMappingEnabled
            },
            set: function(e) {
                this._toneMappingEnabled !== e && (this._toneMappingEnabled = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "contrast", {
            get: function() {
                return this._contrast
            },
            set: function(e) {
                this._contrast !== e && (this._contrast = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "vignetteBlendMode", {
            get: function() {
                return this._vignetteBlendMode
            },
            set: function(e) {
                this._vignetteBlendMode !== e && (this._vignetteBlendMode = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "vignetteEnabled", {
            get: function() {
                return this._vignetteEnabled
            },
            set: function(e) {
                this._vignetteEnabled !== e && (this._vignetteEnabled = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "applyByPostProcess", {
            get: function() {
                return this._applyByPostProcess
            },
            set: function(e) {
                this._applyByPostProcess !== e && (this._applyByPostProcess = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isEnabled", {
            get: function() {
                return this._isEnabled
            },
            set: function(e) {
                this._isEnabled !== e && (this._isEnabled = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._updateParameters = function() {
            this.onUpdateParameters.notifyObservers(this)
        }, t.prototype.getClassName = function() {
            return "ImageProcessingConfiguration"
        }, t.PrepareUniforms = function(t, i) {
            i.EXPOSURE && t.push("exposureLinear"), i.CONTRAST && t.push("contrast"), i.COLORGRADING && t.push("colorTransformSettings"), i.VIGNETTE && (t.push("vInverseScreenSize"), t.push("vignetteSettings1"), t.push("vignetteSettings2")), i.COLORCURVES && e.ColorCurves.PrepareUniforms(t)
        }, t.PrepareSamplers = function(e, t) {
            t.COLORGRADING && e.push("txColorTransform")
        }, t.prototype.prepareDefines = function(e, i) {
            if (void 0 === i && (i = !1), i !== this.applyByPostProcess || !this._isEnabled) return e.VIGNETTE = !1, e.TONEMAPPING = !1, e.CONTRAST = !1, e.EXPOSURE = !1, e.COLORCURVES = !1, e.COLORGRADING = !1, e.COLORGRADING3D = !1, e.IMAGEPROCESSING = !1, void(e.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess && this._isEnabled);
            e.VIGNETTE = this.vignetteEnabled, e.VIGNETTEBLENDMODEMULTIPLY = this.vignetteBlendMode === t._VIGNETTEMODE_MULTIPLY, e.VIGNETTEBLENDMODEOPAQUE = !e.VIGNETTEBLENDMODEMULTIPLY, e.TONEMAPPING = this.toneMappingEnabled, e.CONTRAST = 1 !== this.contrast, e.EXPOSURE = 1 !== this.exposure, 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.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess, e.IMAGEPROCESSING = e.VIGNETTE || e.TONEMAPPING || e.CONTRAST || e.EXPOSURE || e.COLORCURVES || e.COLORGRADING
        }, t.prototype.isReady = function() {
            return !this.colorGradingEnabled || !this.colorGradingTexture || this.colorGradingTexture.isReady()
        }, t.prototype.bind = function(t, i) {
            if (void 0 === i && (i = 1), this._colorCurvesEnabled && this.colorCurves && e.ColorCurves.Bind(this.colorCurves, t), this._vignetteEnabled) {
                var r = 1 / t.getEngine().getRenderWidth(),
                    n = 1 / t.getEngine().getRenderHeight();
                t.setFloat2("vInverseScreenSize", r, n);
                var o = Math.tan(.5 * this.vignetteCameraFov),
                    s = o * i,
                    a = Math.sqrt(s * o);
                s = e.Tools.Mix(s, a, this.vignetteStretch), o = e.Tools.Mix(o, a, this.vignetteStretch), t.setFloat4("vignetteSettings1", s, o, -s * this.vignetteCentreX, -o * this.vignetteCentreY);
                var l = -2 * this.vignetteWeight;
                t.setFloat4("vignetteSettings2", this.vignetteColor.r, this.vignetteColor.g, this.vignetteColor.b, l)
            }
            if (t.setFloat("exposureLinear", this.exposure), t.setFloat("contrast", this.contrast), this.colorGradingTexture) {
                t.setTexture("txColorTransform", this.colorGradingTexture);
                var c = this.colorGradingTexture.getSize().height;
                t.setFloat4("colorTransformSettings", (c - 1) / c, .5 / c, c, this.colorGradingTexture.level)
            }
        }, t.prototype.clone = function() {
            return e.SerializationHelper.Clone((function() {
                return new t
            }), this)
        }, t.prototype.serialize = function() {
            return e.SerializationHelper.Serialize(this)
        }, t.Parse = function(i) {
            return e.SerializationHelper.Parse((function() {
                return new t
            }), i, null, null)
        }, Object.defineProperty(t, "VIGNETTEMODE_MULTIPLY", {
            get: function() {
                return this._VIGNETTEMODE_MULTIPLY
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "VIGNETTEMODE_OPAQUE", {
            get: function() {
                return this._VIGNETTEMODE_OPAQUE
            },
            enumerable: !0,
            configurable: !0
        }), t._VIGNETTEMODE_MULTIPLY = 0, t._VIGNETTEMODE_OPAQUE = 1, __decorate([e.serializeAsColorCurves()], t.prototype, "colorCurves", void 0), __decorate([e.serialize()], t.prototype, "_colorCurvesEnabled", void 0), __decorate([e.serializeAsTexture()], t.prototype, "colorGradingTexture", void 0), __decorate([e.serialize()], t.prototype, "_colorGradingEnabled", void 0), __decorate([e.serialize()], t.prototype, "_colorGradingWithGreenDepth", void 0), __decorate([e.serialize()], t.prototype, "_colorGradingBGR", void 0), __decorate([e.serialize()], t.prototype, "_exposure", void 0), __decorate([e.serialize()], t.prototype, "_toneMappingEnabled", void 0), __decorate([e.serialize()], t.prototype, "_contrast", void 0), __decorate([e.serialize()], t.prototype, "vignetteStretch", void 0), __decorate([e.serialize()], t.prototype, "vignetteCentreX", void 0), __decorate([e.serialize()], t.prototype, "vignetteCentreY", void 0), __decorate([e.serialize()], t.prototype, "vignetteWeight", void 0), __decorate([e.serializeAsColor4()], t.prototype, "vignetteColor", void 0), __decorate([e.serialize()], t.prototype, "vignetteCameraFov", void 0), __decorate([e.serialize()], t.prototype, "_vignetteBlendMode", void 0), __decorate([e.serialize()], t.prototype, "_vignetteEnabled", void 0), __decorate([e.serialize()], t.prototype, "_applyByPostProcess", void 0), __decorate([e.serialize()], t.prototype, "_isEnabled", void 0), t
    })();
    e.ImageProcessingConfiguration = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r) {
            var n = t.call(this, r) || this;
            return i ? (n._engine = r.getEngine(), n._textureMatrix = e.Matrix.Identity(), n.name = i, n.url = i, n.hasAlpha = !1, n.isCube = !1, n.is3D = n._engine.webGLVersion > 1, n.wrapU = e.Texture.CLAMP_ADDRESSMODE, n.wrapV = e.Texture.CLAMP_ADDRESSMODE, n.wrapR = e.Texture.CLAMP_ADDRESSMODE, n.anisotropicFilteringLevel = 1, n._texture = n._getFromCache(i, !0), n._texture || (r.useDelayedTextureLoading ? n.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED : n.loadTexture()), n) : n
        }
        return __extends(i, t), i.prototype.getTextureMatrix = function() {
            return this._textureMatrix
        }, i.prototype.load3dlTexture = function() {
            var t, r = this._engine;
            t = 1 === r.webGLVersion ? r.createRawTexture(null, 1, 1, e.Engine.TEXTUREFORMAT_RGBA, !1, !1, e.Texture.BILINEAR_SAMPLINGMODE) : r.createRawTexture3D(null, 1, 1, 1, e.Engine.TEXTUREFORMAT_RGBA, !1, !1, e.Texture.BILINEAR_SAMPLINGMODE), this._texture = t;
            var n = function(n) {
                    if ("string" == typeof n) {
                        for (var o, s = null, a = null, l = n.split("\n"), c = 0, h = 0, u = 0, f = 0, d = 0, p = 0; p < l.length; p++)
                            if (o = l[p], i._noneEmptyLineRegex.test(o) && 0 !== o.indexOf("#")) {
                                var _ = o.split(" ");
                                if (0 !== c) {
                                    if (0 != c) {
                                        var m = Math.max(parseInt(_[0]), 0),
                                            g = Math.max(parseInt(_[1]), 0),
                                            v = Math.max(parseInt(_[2]), 0);
                                        d = Math.max(m, d), d = Math.max(g, d), d = Math.max(v, d);
                                        var y = 4 * (h + f * c + u * c * c);
                                        a && (a[y + 0] = m, a[y + 1] = g, a[y + 2] = v), f++, f % c == 0 && (u++, f = 0, u % c == 0 && (h++, u = 0))
                                    }
                                } else c = _.length, s = new Uint8Array(c * c * c * 4), a = new Float32Array(c * c * c * 4)
                            }
                        if (a && s)
                            for (var p = 0; p < a.length; p++)
                                if (p > 0 && (p + 1) % 4 == 0) s[p] = 255;
                                else {
                                    var b = a[p];
                                    s[p] = b / d * 255
                                }
                        t.is3D ? (t.updateSize(c, c, c), r.updateRawTexture3D(t, s, e.Engine.TEXTUREFORMAT_RGBA, !1)) : (t.updateSize(c * c, c), r.updateRawTexture(t, s, e.Engine.TEXTUREFORMAT_RGBA, !1))
                    }
                },
                o = this.getScene();
            return o ? o._loadFile(this.url, n) : this._engine._loadFile(this.url, n), this._texture
        }, i.prototype.loadTexture = function() {
            this.url && this.url.toLocaleLowerCase().indexOf(".3dl") == this.url.length - 4 && this.load3dlTexture()
        }, i.prototype.clone = function() {
            var e = new i(this.url, this.getScene());
            return e.level = this.level, e
        }, i.prototype.delayLoad = function() {
            this.delayLoadState === e.Engine.DELAYLOADSTATE_NOTLOADED && (this.delayLoadState = e.Engine.DELAYLOADSTATE_LOADED, this._texture = this._getFromCache(this.url, !0), this._texture || this.loadTexture())
        }, i.Parse = function(e, t, r) {
            var n = null;
            return e.name && !e.isRenderTarget && (n = new i(e.name, t), n.name = e.name, n.level = e.level), n
        }, i.prototype.serialize = function() {
            if (!this.name) return null;
            var e = {};
            return e.name = this.name, e.level = this.level, e.customType = "BABYLON.ColorGradingTexture", e
        }, i._noneEmptyLineRegex = /\S+/, i
    })(e.BaseTexture);
    e.ColorGradingTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._dirty = !0, this._tempColor = new e.Color4(0, 0, 0, 0), this._globalCurve = new e.Color4(0, 0, 0, 0), this._highlightsCurve = new e.Color4(0, 0, 0, 0), this._midtonesCurve = new e.Color4(0, 0, 0, 0), this._shadowsCurve = new e.Color4(0, 0, 0, 0), this._positiveCurve = new e.Color4(0, 0, 0, 0), this._negativeCurve = new e.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
        }
        return Object.defineProperty(t.prototype, "globalHue", {
            get: function() {
                return this._globalHue
            },
            set: function(e) {
                this._globalHue = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "globalDensity", {
            get: function() {
                return this._globalDensity
            },
            set: function(e) {
                this._globalDensity = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "globalSaturation", {
            get: function() {
                return this._globalSaturation
            },
            set: function(e) {
                this._globalSaturation = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "highlightsHue", {
            get: function() {
                return this._highlightsHue
            },
            set: function(e) {
                this._highlightsHue = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "highlightsDensity", {
            get: function() {
                return this._highlightsDensity
            },
            set: function(e) {
                this._highlightsDensity = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "highlightsSaturation", {
            get: function() {
                return this._highlightsSaturation
            },
            set: function(e) {
                this._highlightsSaturation = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "highlightsExposure", {
            get: function() {
                return this._highlightsExposure
            },
            set: function(e) {
                this._highlightsExposure = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "midtonesHue", {
            get: function() {
                return this._midtonesHue
            },
            set: function(e) {
                this._midtonesHue = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "midtonesDensity", {
            get: function() {
                return this._midtonesDensity
            },
            set: function(e) {
                this._midtonesDensity = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "midtonesSaturation", {
            get: function() {
                return this._midtonesSaturation
            },
            set: function(e) {
                this._midtonesSaturation = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "midtonesExposure", {
            get: function() {
                return this._midtonesExposure
            },
            set: function(e) {
                this._midtonesExposure = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "shadowsHue", {
            get: function() {
                return this._shadowsHue
            },
            set: function(e) {
                this._shadowsHue = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "shadowsDensity", {
            get: function() {
                return this._shadowsDensity
            },
            set: function(e) {
                this._shadowsDensity = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "shadowsSaturation", {
            get: function() {
                return this._shadowsSaturation
            },
            set: function(e) {
                this._shadowsSaturation = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "shadowsExposure", {
            get: function() {
                return this._shadowsExposure
            },
            set: function(e) {
                this._shadowsExposure = e, this._dirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getClassName = function() {
            return "ColorCurves"
        }, t.Bind = function(e, t, i, r, n) {
            void 0 === i && (i = "vCameraColorCurvePositive"), void 0 === r && (r = "vCameraColorCurveNeutral"), void 0 === n && (n = "vCameraColorCurveNegative"), 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(n, e._negativeCurve.r, e._negativeCurve.g, e._negativeCurve.b, e._negativeCurve.a))
        }, t.PrepareUniforms = function(e) {
            e.push("vCameraColorCurveNeutral", "vCameraColorCurvePositive", "vCameraColorCurveNegative")
        }, t.prototype.getColorGradingDataToRef = function(e, i, r, n, o) {
            null != e && (e = t.clamp(e, 0, 360), i = t.clamp(i, -100, 100), r = t.clamp(r, -100, 100), n = t.clamp(n, -100, 100), i = t.applyColorGradingSliderNonlinear(i), i *= .5, n = t.applyColorGradingSliderNonlinear(n), i < 0 && (i *= -1, e = (e + 180) % 360), t.fromHSBToRef(e, i, 50 + .25 * n, o), o.scaleToRef(2, o), o.a = 1 + .01 * r)
        }, t.applyColorGradingSliderNonlinear = function(e) {
            e /= 100;
            var t = Math.abs(e);
            return t = Math.pow(t, 2), e < 0 && (t *= -1), t *= 100
        }, t.fromHSBToRef = function(e, i, r, n) {
            var o = t.clamp(e, 0, 360),
                s = t.clamp(i / 100, 0, 1),
                a = t.clamp(r / 100, 0, 1);
            if (0 === s) n.r = a, n.g = a, n.b = a;
            else {
                o /= 60;
                var l = Math.floor(o),
                    c = o - l,
                    h = a * (1 - s),
                    u = a * (1 - s * c),
                    f = a * (1 - s * (1 - c));
                switch (l) {
                    case 0:
                        n.r = a, n.g = f, n.b = h;
                        break;
                    case 1:
                        n.r = u, n.g = a, n.b = h;
                        break;
                    case 2:
                        n.r = h, n.g = a, n.b = f;
                        break;
                    case 3:
                        n.r = h, n.g = u, n.b = a;
                        break;
                    case 4:
                        n.r = f, n.g = h, n.b = a;
                        break;
                    default:
                        n.r = a, n.g = h, n.b = u
                }
            }
            n.a = 1
        }, t.clamp = function(e, t, i) {
            return Math.min(Math.max(e, t), i)
        }, t.prototype.clone = function() {
            return e.SerializationHelper.Clone((function() {
                return new t
            }), this)
        }, t.prototype.serialize = function() {
            return e.SerializationHelper.Serialize(this)
        }, t.Parse = function(i) {
            return e.SerializationHelper.Parse((function() {
                return new t
            }), i, null, null)
        }, __decorate([e.serialize()], t.prototype, "_globalHue", void 0), __decorate([e.serialize()], t.prototype, "_globalDensity", void 0), __decorate([e.serialize()], t.prototype, "_globalSaturation", void 0), __decorate([e.serialize()], t.prototype, "_globalExposure", void 0), __decorate([e.serialize()], t.prototype, "_highlightsHue", void 0), __decorate([e.serialize()], t.prototype, "_highlightsDensity", void 0), __decorate([e.serialize()], t.prototype, "_highlightsSaturation", void 0), __decorate([e.serialize()], t.prototype, "_highlightsExposure", void 0), __decorate([e.serialize()], t.prototype, "_midtonesHue", void 0), __decorate([e.serialize()], t.prototype, "_midtonesDensity", void 0), __decorate([e.serialize()], t.prototype, "_midtonesSaturation", void 0), __decorate([e.serialize()], t.prototype, "_midtonesExposure", void 0), t
    })();
    e.ColorCurves = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.BindEyePosition = function(e, t) {
            if (t._forcedViewPosition) return void e.setVector3("vEyePosition", t._forcedViewPosition);
            e.setVector3("vEyePosition", t._mirroredCameraPosition ? t._mirroredCameraPosition : t.activeCamera.globalPosition)
        }, t.PrepareDefinesForMergedUV = function(e, t, i) {
            t._needUVs = !0, t[i] = !0, e.getTextureMatrix().isIdentity(!0) ? (t[i + "DIRECTUV"] = e.coordinatesIndex + 1, 0 === e.coordinatesIndex ? t.MAINUV1 = !0 : t.MAINUV2 = !0) : t[i + "DIRECTUV"] = 0
        }, t.BindTextureMatrix = function(e, t, i) {
            var r = e.getTextureMatrix();
            r.isIdentity(!0) || t.updateMatrix(i + "Matrix", r)
        }, t.PrepareDefinesForMisc = function(t, i, r, n, o, s, a) {
            a._areMiscDirty && (a.LOGARITHMICDEPTH = r, a.POINTSIZE = n || i.forcePointsCloud, a.FOG = i.fogEnabled && t.applyFog && i.fogMode !== e.Scene.FOGMODE_NONE && o, a.NONUNIFORMSCALING = t.nonUniformScaling, a.ALPHATEST = s)
        }, t.PrepareDefinesForFrameBoundValues = function(e, t, i, r, n) {
            void 0 === n && (n = null);
            var o = !1;
            null == n && (n = void 0 !== e.clipPlane && null !== e.clipPlane), i.CLIPPLANE !== n && (i.CLIPPLANE = n, o = !0), i.DEPTHPREPASS !== !t.getColorWrite() && (i.DEPTHPREPASS = !i.DEPTHPREPASS, o = !0), i.INSTANCES !== r && (i.INSTANCES = r, o = !0), o && i.markAsUnprocessed()
        }, t.PrepareDefinesForAttributes = function(t, i, r, n, o, s) {
            if (void 0 === o && (o = !1), void 0 === s && (s = !0), !i._areAttributesDirty && i._needNormals === i._normals && i._needUVs === i._uvs) return !1;
            if (i._normals = i._needNormals, i._uvs = i._needUVs, i.NORMAL = i._needNormals && t.isVerticesDataPresent(e.VertexBuffer.NormalKind), i._needNormals && t.isVerticesDataPresent(e.VertexBuffer.TangentKind) && (i.TANGENT = !0), i._needUVs ? (i.UV1 = t.isVerticesDataPresent(e.VertexBuffer.UVKind), i.UV2 = t.isVerticesDataPresent(e.VertexBuffer.UV2Kind)) : (i.UV1 = !1, i.UV2 = !1), r) {
                var a = t.useVertexColors && t.isVerticesDataPresent(e.VertexBuffer.ColorKind);
                i.VERTEXCOLOR = a, i.VERTEXALPHA = t.hasVertexAlpha && a && s
            }
            if (n && (t.useBones && t.computeBonesUsingShaders && t.skeleton ? (i.NUM_BONE_INFLUENCERS = t.numBoneInfluencers, i.BonesPerMesh = t.skeleton.bones.length + 1) : (i.NUM_BONE_INFLUENCERS = 0, i.BonesPerMesh = 0)), o) {
                var l = t.morphTargetManager;
                l ? (i.MORPHTARGETS_TANGENT = l.supportsTangents && i.TANGENT, i.MORPHTARGETS_NORMAL = l.supportsNormals && i.NORMAL, i.MORPHTARGETS = l.numInfluencers > 0, i.NUM_MORPH_INFLUENCERS = l.numInfluencers) : (i.MORPHTARGETS_TANGENT = !1, i.MORPHTARGETS_NORMAL = !1, i.MORPHTARGETS = !1, i.NUM_MORPH_INFLUENCERS = 0)
            }
            return !0
        }, t.PrepareDefinesForLights = function(t, i, r, n, o, s) {
            if (void 0 === o && (o = 4), void 0 === s && (s = !1), !r._areLightsDirty) return r._needNormals;
            var a = 0,
                l = !1,
                c = !1,
                h = !1,
                u = !1,
                f = !1;
            if (t.lightsEnabled && !s)
                for (var d = 0, p = i._lightSources; d < p.length; d++) {
                    var _ = p[d];
                    l = !0, void 0 === r["LIGHT" + a] && (c = !0), r["LIGHT" + a] = !0, r["SPOTLIGHT" + a] = !1, r["HEMILIGHT" + a] = !1, r["POINTLIGHT" + a] = !1, r["DIRLIGHT" + a] = !1;
                    var m;
                    if (_.getTypeID() === e.Light.LIGHTTYPEID_SPOTLIGHT) {
                        m = "SPOTLIGHT" + a;
                        var g = _;
                        r["PROJECTEDLIGHTTEXTURE" + a] = !!g.projectionTexture && g.projectionTexture.isReady()
                    } else m = _.getTypeID() === e.Light.LIGHTTYPEID_HEMISPHERICLIGHT ? "HEMILIGHT" + a : _.getTypeID() === e.Light.LIGHTTYPEID_POINTLIGHT ? "POINTLIGHT" + a : "DIRLIGHT" + a;
                    if (r[m] = !0, n && !_.specular.equalsFloats(0, 0, 0) && (f = !0), r["SHADOW" + a] = !1, r["SHADOWPCF" + a] = !1, r["SHADOWESM" + a] = !1, r["SHADOWCUBE" + a] = !1, i && i.receiveShadows && t.shadowsEnabled && _.shadowEnabled) {
                        var v = _.getShadowGenerator();
                        v && (u = !0, v.prepareDefines(r, a))
                    }
                    if (_.lightmapMode != e.Light.LIGHTMAP_DEFAULT ? (h = !0, r["LIGHTMAPEXCLUDED" + a] = !0, r["LIGHTMAPNOSPECULAR" + a] = _.lightmapMode == e.Light.LIGHTMAP_SHADOWSONLY) : (r["LIGHTMAPEXCLUDED" + a] = !1, r["LIGHTMAPNOSPECULAR" + a] = !1), ++a === o) break
                }
            r.SPECULARTERM = f, r.SHADOWS = u;
            for (var y = a; y < o; y++) void 0 !== r["LIGHT" + y] && (r["LIGHT" + y] = !1, r["HEMILIGHT" + a] = !1, r["POINTLIGHT" + a] = !1, r["DIRLIGHT" + a] = !1, r["SPOTLIGHT" + a] = !1, r["SHADOW" + a] = !1);
            var b = t.getEngine().getCaps();
            return void 0 === r.SHADOWFLOAT && (c = !0), r.SHADOWFLOAT = u && (b.textureFloatRender && b.textureFloatLinearFiltering || b.textureHalfFloatRender && b.textureHalfFloatLinearFiltering), r.LIGHTMAPEXCLUDED = h, c && r.rebuild(), l
        }, t.PrepareUniformsAndSamplersList = function(e, t, i, r) {
            void 0 === r && (r = 4);
            var n, o = null;
            if (e.uniformsNames) {
                var s = e;
                n = s.uniformsNames, o = s.uniformBuffersNames, t = s.samplers, i = s.defines, r = s.maxSimultaneousLights
            } else n = e, t || (t = []);
            for (var a = 0; a < r && i["LIGHT" + a]; a++) n.push("vLightData" + a, "vLightDiffuse" + a, "vLightSpecular" + a, "vLightDirection" + a, "vLightGround" + a, "lightMatrix" + a, "shadowsInfo" + a, "depthValues" + a), o && o.push("Light" + a), t.push("shadowSampler" + a), i["PROJECTEDLIGHTTEXTURE" + a] && (t.push("projectionLightSampler" + a), n.push("textureProjectionMatrix" + a));
            i.NUM_MORPH_INFLUENCERS && n.push("morphTargetInfluences")
        }, t.HandleFallbacksForShadows = function(e, t, i, r) {
            void 0 === i && (i = 4), void 0 === r && (r = 0);
            for (var n = 0, o = 0; o < i && e["LIGHT" + o]; o++) o > 0 && (n = r + o, t.addFallback(n, "LIGHT" + o)), e.SHADOWS || (e["SHADOW" + o] && t.addFallback(r, "SHADOW" + o), e["SHADOWPCF" + o] && t.addFallback(r, "SHADOWPCF" + o), e["SHADOWESM" + o] && t.addFallback(r, "SHADOWESM" + o));
            return n++
        }, t.PrepareAttributesForMorphTargets = function(t, i, r) {
            var n = r.NUM_MORPH_INFLUENCERS;
            if (n > 0 && e.Engine.LastCreatedEngine)
                for (var o = e.Engine.LastCreatedEngine.getCaps().maxVertexAttribs, s = i.morphTargetManager, a = s && s.supportsNormals && r.NORMAL, l = s && s.supportsTangents && r.TANGENT, c = 0; c < n; c++) t.push(e.VertexBuffer.PositionKind + c), a && t.push(e.VertexBuffer.NormalKind + c), l && t.push(e.VertexBuffer.TangentKind + c), t.length > o && e.Tools.Error("Cannot add more vertex attributes for mesh " + i.name)
        }, t.PrepareAttributesForBones = function(t, i, r, n) {
            r.NUM_BONE_INFLUENCERS > 0 && (n.addCPUSkinningFallback(0, i), t.push(e.VertexBuffer.MatricesIndicesKind), t.push(e.VertexBuffer.MatricesWeightsKind), r.NUM_BONE_INFLUENCERS > 4 && (t.push(e.VertexBuffer.MatricesIndicesExtraKind), t.push(e.VertexBuffer.MatricesWeightsExtraKind)))
        }, t.PrepareAttributesForInstances = function(e, t) {
            t.INSTANCES && (e.push("world0"), e.push("world1"), e.push("world2"), e.push("world3"))
        }, t.BindLightShadow = function(e, t, i, r, n) {
            if (e.shadowEnabled && i.receiveShadows) {
                var o = e.getShadowGenerator();
                o && o.bindShadowLight(r, n)
            }
        }, t.BindLightProperties = function(e, t, i) {
            e.transferToEffect(t, i + "")
        }, t.BindLights = function(i, r, n, o, s, a) {
            void 0 === s && (s = 4), void 0 === a && (a = !1);
            for (var l = Math.min(r._lightSources.length, s), c = 0; c < l; c++) {
                var h = r._lightSources[c],
                    u = c.toString(),
                    f = h.getScaledIntensity();
                h._uniformBuffer.bindToEffect(n, "Light" + c), t.BindLightProperties(h, n, c), h.diffuse.scaleToRef(f, e.Tmp.Color3[0]), h._uniformBuffer.updateColor4("vLightDiffuse", e.Tmp.Color3[0], a ? h.radius : h.range, u), o.SPECULARTERM && (h.specular.scaleToRef(f, e.Tmp.Color3[1]), h._uniformBuffer.updateColor3("vLightSpecular", e.Tmp.Color3[1], u)), i.shadowsEnabled && this.BindLightShadow(h, i, r, u, n), h._uniformBuffer.update()
            }
        }, t.BindFogParameters = function(t, i, r) {
            t.fogEnabled && i.applyFog && t.fogMode !== e.Scene.FOGMODE_NONE && (r.setFloat4("vFogInfos", t.fogMode, t.fogStart, t.fogEnd, t.fogDensity), r.setColor3("vFogColor", t.fogColor))
        }, t.BindBonesParameters = function(e, t) {
            if (e && e.useBones && e.computeBonesUsingShaders && e.skeleton) {
                var i = e.skeleton.getTransformMatrices(e);
                i && t && t.setMatrices("mBones", i)
            }
        }, t.BindMorphTargetParameters = function(e, t) {
            var i = e.morphTargetManager;
            e && i && t.setFloatArray("morphTargetInfluences", i.influences)
        }, t.BindLogDepth = function(e, t, i) {
            e.LOGARITHMICDEPTH && t.setFloat("logarithmicDepthConstant", 2 / (Math.log(i.activeCamera.maxZ + 1) / Math.LN2))
        }, t.BindClipPlane = function(e, t) {
            if (t.clipPlane) {
                var i = t.clipPlane;
                e.setFloat4("vClipPlane", i.normal.x, i.normal.y, i.normal.z, i.d)
            }
        }, t
    })();
    e.MaterialHelper = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r) {
            var n = t.call(this, i, r) || this;
            return n._normalMatrix = new e.Matrix, n.storeEffectOnSubMeshes = !0, n
        }
        return __extends(i, t), i.prototype.getEffect = function() {
            return this._activeEffect
        }, i.prototype.isReady = function(e, t) {
            return !!e && (!e.subMeshes || 0 === e.subMeshes.length || this.isReadyForSubMesh(e, e.subMeshes[0], t))
        }, i.prototype.bindOnlyWorldMatrix = function(e) {
            this._activeEffect.setMatrix("world", e)
        }, i.prototype.bindOnlyNormalMatrix = function(e) {
            this._activeEffect.setMatrix("normalMatrix", e)
        }, i.prototype.bind = function(e, t) {
            t && this.bindForSubMesh(e, t, t.subMeshes[0])
        }, i.prototype._afterBind = function(e, i) {
            void 0 === i && (i = null), t.prototype._afterBind.call(this, e), this.getScene()._cachedEffect = i
        }, i.prototype._mustRebind = function(e, t, i) {
            return void 0 === i && (i = 1), e.isCachedMaterialInvalid(this, t, i)
        }, i
    })(e.Material);
    e.PushMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t() {
            var t = e.call(this) || this;
            return t.MAINUV1 = !1, t.MAINUV2 = !1, t.DIFFUSE = !1, t.DIFFUSEDIRECTUV = 0, t.AMBIENT = !1, t.AMBIENTDIRECTUV = 0, t.OPACITY = !1, t.OPACITYDIRECTUV = 0, t.OPACITYRGB = !1, t.REFLECTION = !1, t.EMISSIVE = !1, t.EMISSIVEDIRECTUV = 0, t.SPECULAR = !1, t.SPECULARDIRECTUV = 0, t.BUMP = !1, t.BUMPDIRECTUV = 0, t.PARALLAX = !1, t.PARALLAXOCCLUSION = !1, t.SPECULAROVERALPHA = !1, t.CLIPPLANE = !1, t.ALPHATEST = !1, t.DEPTHPREPASS = !1, t.ALPHAFROMDIFFUSE = !1, t.POINTSIZE = !1, t.FOG = !1, t.SPECULARTERM = !1, t.DIFFUSEFRESNEL = !1, t.OPACITYFRESNEL = !1, t.REFLECTIONFRESNEL = !1, t.REFRACTIONFRESNEL = !1, t.EMISSIVEFRESNEL = !1, t.FRESNEL = !1, t.NORMAL = !1, t.UV1 = !1, t.UV2 = !1, t.VERTEXCOLOR = !1, t.VERTEXALPHA = !1, t.NUM_BONE_INFLUENCERS = 0, t.BonesPerMesh = 0, t.INSTANCES = !1, t.GLOSSINESS = !1, t.ROUGHNESS = !1, t.EMISSIVEASILLUMINATION = !1, t.LINKEMISSIVEWITHDIFFUSE = !1, t.REFLECTIONFRESNELFROMSPECULAR = !1, t.LIGHTMAP = !1, t.LIGHTMAPDIRECTUV = 0, t.OBJECTSPACE_NORMALMAP = !1, t.USELIGHTMAPASSHADOWMAP = !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.LOGARITHMICDEPTH = !1, t.REFRACTION = !1, t.REFRACTIONMAP_3D = !1, t.REFLECTIONOVERALPHA = !1, t.TWOSIDEDLIGHTING = !1, t.SHADOWFLOAT = !1, t.MORPHTARGETS = !1, t.MORPHTARGETS_NORMAL = !1, t.MORPHTARGETS_TANGENT = !1, t.NUM_MORPH_INFLUENCERS = 0, t.NONUNIFORMSCALING = !1, t.PREMULTIPLYALPHA = !1, t.IMAGEPROCESSING = !1, t.VIGNETTE = !1, t.VIGNETTEBLENDMODEMULTIPLY = !1, t.VIGNETTEBLENDMODEOPAQUE = !1, t.TONEMAPPING = !1, t.CONTRAST = !1, t.COLORCURVES = !1, t.COLORGRADING = !1, t.COLORGRADING3D = !1, t.SAMPLER3DGREENDEPTH = !1, t.SAMPLER3DBGRMAP = !1, t.IMAGEPROCESSINGPOSTPROCESS = !1, t.EXPOSURE = !1, t.rebuild(), t
        }
        return __extends(t, e), t.prototype.setReflectionMode = function(e) {
            for (var t = ["REFLECTIONMAP_CUBIC", "REFLECTIONMAP_EXPLICIT", "REFLECTIONMAP_PLANAR", "REFLECTIONMAP_PROJECTION", "REFLECTIONMAP_PROJECTION", "REFLECTIONMAP_SKYBOX", "REFLECTIONMAP_SPHERICAL", "REFLECTIONMAP_EQUIRECTANGULAR", "REFLECTIONMAP_EQUIRECTANGULAR_FIXED", "REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED"], i = 0, r = t; i < r.length; i++) {
                var n = r[i];
                this[n] = n === e
            }
        }, t
    })(e.MaterialDefines);
    e.StandardMaterialDefines = t;
    var i = (function(i) {
        function r(t, n) {
            var o = i.call(this, t, n) || this;
            return o.ambientColor = new e.Color3(0, 0, 0), o.diffuseColor = new e.Color3(1, 1, 1), o.specularColor = new e.Color3(1, 1, 1), o.emissiveColor = new e.Color3(0, 0, 0), o.specularPower = 64, o._useAlphaFromDiffuseTexture = !1, o._useEmissiveAsIllumination = !1, o._linkEmissiveWithDiffuse = !1, o._useSpecularOverAlpha = !1, o._useReflectionOverAlpha = !1, o._disableLighting = !1, o._useObjectSpaceNormalMap = !1, o._useParallax = !1, o._useParallaxOcclusion = !1, o.parallaxScaleBias = .05, o._roughness = 0, o.indexOfRefraction = .98, o.invertRefractionY = !0, o._useLightmapAsShadowmap = !1, o._useReflectionFresnelFromSpecular = !1, o._useGlossinessFromSpecularMapAlpha = !1, o._maxSimultaneousLights = 4, o._invertNormalMapX = !1, o._invertNormalMapY = !1, o._twoSidedLighting = !1, o._renderTargets = new e.SmartArray(16), o._worldViewProjectionMatrix = e.Matrix.Zero(), o._globalAmbientColor = new e.Color3(0, 0, 0), o._attachImageProcessingConfiguration(null), o.getRenderTargetTextures = function() {
                return o._renderTargets.reset(), r.ReflectionTextureEnabled && o._reflectionTexture && o._reflectionTexture.isRenderTarget && o._renderTargets.push(o._reflectionTexture), r.RefractionTextureEnabled && o._refractionTexture && o._refractionTexture.isRenderTarget && o._renderTargets.push(o._refractionTexture), o._renderTargets
            }, o
        }
        return __extends(r, i), Object.defineProperty(r.prototype, "imageProcessingConfiguration", {
            get: function() {
                return this._imageProcessingConfiguration
            },
            set: function(e) {
                this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty()
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype._attachImageProcessingConfiguration = function(e) {
            var t = this;
            e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), this._imageProcessingConfiguration = e || this.getScene().imageProcessingConfiguration, this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add((function(e) {
                t._markAllSubMeshesAsImageProcessingDirty()
            })))
        }, Object.defineProperty(r.prototype, "cameraColorCurvesEnabled", {
            get: function() {
                return this.imageProcessingConfiguration.colorCurvesEnabled
            },
            set: function(e) {
                this.imageProcessingConfiguration.colorCurvesEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "cameraColorGradingEnabled", {
            get: function() {
                return this.imageProcessingConfiguration.colorGradingEnabled
            },
            set: function(e) {
                this.imageProcessingConfiguration.colorGradingEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "cameraToneMappingEnabled", {
            get: function() {
                return this._imageProcessingConfiguration.toneMappingEnabled
            },
            set: function(e) {
                this._imageProcessingConfiguration.toneMappingEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "cameraExposure", {
            get: function() {
                return this._imageProcessingConfiguration.exposure
            },
            set: function(e) {
                this._imageProcessingConfiguration.exposure = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "cameraContrast", {
            get: function() {
                return this._imageProcessingConfiguration.contrast
            },
            set: function(e) {
                this._imageProcessingConfiguration.contrast = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "cameraColorGradingTexture", {
            get: function() {
                return this._imageProcessingConfiguration.colorGradingTexture
            },
            set: function(e) {
                this._imageProcessingConfiguration.colorGradingTexture = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "cameraColorCurves", {
            get: function() {
                return this._imageProcessingConfiguration.colorCurves
            },
            set: function(e) {
                this._imageProcessingConfiguration.colorCurves = e
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.getClassName = function() {
            return "StandardMaterial"
        }, Object.defineProperty(r.prototype, "useLogarithmicDepth", {
            get: function() {
                return this._useLogarithmicDepth
            },
            set: function(e) {
                this._useLogarithmicDepth = e && this.getScene().getEngine().getCaps().fragmentDepthSupported, this._markAllSubMeshesAsMiscDirty()
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.needAlphaBlending = function() {
            return this.alpha < 1 || null != this._opacityTexture || this._shouldUseAlphaFromDiffuseTexture() || this._opacityFresnelParameters && this._opacityFresnelParameters.isEnabled
        }, r.prototype.needAlphaTesting = function() {
            return null != this._diffuseTexture && this._diffuseTexture.hasAlpha
        }, r.prototype._shouldUseAlphaFromDiffuseTexture = function() {
            return null != this._diffuseTexture && this._diffuseTexture.hasAlpha && this._useAlphaFromDiffuseTexture
        }, r.prototype.getAlphaTestTexture = function() {
            return this._diffuseTexture
        }, r.prototype.isReadyForSubMesh = function(i, n, o) {
            if (void 0 === o && (o = !1), n.effect && this.isFrozen && this._wasPreviouslyReady && n.effect) return !0;
            n._materialDefines || (n._materialDefines = new t);
            var s = this.getScene(),
                a = n._materialDefines;
            if (!this.checkReadyOnEveryCall && n.effect && a._renderId === s.getRenderId()) return !0;
            var l = s.getEngine();
            if (a._needNormals = e.MaterialHelper.PrepareDefinesForLights(s, i, a, !0, this._maxSimultaneousLights, this._disableLighting), a._areTexturesDirty) {
                if (a._needUVs = !1, a.MAINUV1 = !1, a.MAINUV2 = !1, s.texturesEnabled) {
                    if (this._diffuseTexture && r.DiffuseTextureEnabled) {
                        if (!this._diffuseTexture.isReadyOrNotBlocking()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._diffuseTexture, a, "DIFFUSE")
                    } else a.DIFFUSE = !1;
                    if (this._ambientTexture && r.AmbientTextureEnabled) {
                        if (!this._ambientTexture.isReadyOrNotBlocking()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._ambientTexture, a, "AMBIENT")
                    } else a.AMBIENT = !1;
                    if (this._opacityTexture && r.OpacityTextureEnabled) {
                        if (!this._opacityTexture.isReadyOrNotBlocking()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._opacityTexture, a, "OPACITY"), a.OPACITYRGB = this._opacityTexture.getAlphaFromRGB
                    } else a.OPACITY = !1;
                    if (this._reflectionTexture && r.ReflectionTextureEnabled) {
                        if (!this._reflectionTexture.isReadyOrNotBlocking()) return !1;
                        switch (a._needNormals = !0, a.REFLECTION = !0, a.ROUGHNESS = this._roughness > 0, a.REFLECTIONOVERALPHA = this._useReflectionOverAlpha, a.INVERTCUBICMAP = this._reflectionTexture.coordinatesMode === e.Texture.INVCUBIC_MODE, a.REFLECTIONMAP_3D = this._reflectionTexture.isCube, this._reflectionTexture.coordinatesMode) {
                            case e.Texture.CUBIC_MODE:
                            case e.Texture.INVCUBIC_MODE:
                                a.setReflectionMode("REFLECTIONMAP_CUBIC");
                                break;
                            case e.Texture.EXPLICIT_MODE:
                                a.setReflectionMode("REFLECTIONMAP_EXPLICIT");
                                break;
                            case e.Texture.PLANAR_MODE:
                                a.setReflectionMode("REFLECTIONMAP_PLANAR");
                                break;
                            case e.Texture.PROJECTION_MODE:
                                a.setReflectionMode("REFLECTIONMAP_PROJECTION");
                                break;
                            case e.Texture.SKYBOX_MODE:
                                a.setReflectionMode("REFLECTIONMAP_SKYBOX");
                                break;
                            case e.Texture.SPHERICAL_MODE:
                                a.setReflectionMode("REFLECTIONMAP_SPHERICAL");
                                break;
                            case e.Texture.EQUIRECTANGULAR_MODE:
                                a.setReflectionMode("REFLECTIONMAP_EQUIRECTANGULAR");
                                break;
                            case e.Texture.FIXED_EQUIRECTANGULAR_MODE:
                                a.setReflectionMode("REFLECTIONMAP_EQUIRECTANGULAR_FIXED");
                                break;
                            case e.Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:
                                a.setReflectionMode("REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED")
                        }
                        a.USE_LOCAL_REFLECTIONMAP_CUBIC = !!this._reflectionTexture.boundingBoxSize
                    } else a.REFLECTION = !1;
                    if (this._emissiveTexture && r.EmissiveTextureEnabled) {
                        if (!this._emissiveTexture.isReadyOrNotBlocking()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._emissiveTexture, a, "EMISSIVE")
                    } else a.EMISSIVE = !1;
                    if (this._lightmapTexture && r.LightmapTextureEnabled) {
                        if (!this._lightmapTexture.isReadyOrNotBlocking()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._lightmapTexture, a, "LIGHTMAP"), a.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap
                    } else a.LIGHTMAP = !1;
                    if (this._specularTexture && r.SpecularTextureEnabled) {
                        if (!this._specularTexture.isReadyOrNotBlocking()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._specularTexture, a, "SPECULAR"), a.GLOSSINESS = this._useGlossinessFromSpecularMapAlpha
                    } else a.SPECULAR = !1;
                    if (s.getEngine().getCaps().standardDerivatives && this._bumpTexture && r.BumpTextureEnabled) {
                        if (!this._bumpTexture.isReady()) return !1;
                        e.MaterialHelper.PrepareDefinesForMergedUV(this._bumpTexture, a, "BUMP"), a.PARALLAX = this._useParallax, a.PARALLAXOCCLUSION = this._useParallaxOcclusion, a.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap
                    } else a.BUMP = !1;
                    if (this._refractionTexture && r.RefractionTextureEnabled) {
                        if (!this._refractionTexture.isReadyOrNotBlocking()) return !1;
                        a._needUVs = !0, a.REFRACTION = !0, a.REFRACTIONMAP_3D = this._refractionTexture.isCube
                    } else a.REFRACTION = !1;
                    a.TWOSIDEDLIGHTING = !this._backFaceCulling && this._twoSidedLighting
                } else a.DIFFUSE = !1, a.AMBIENT = !1, a.OPACITY = !1, a.REFLECTION = !1, a.EMISSIVE = !1, a.LIGHTMAP = !1, a.BUMP = !1, a.REFRACTION = !1;
                a.ALPHAFROMDIFFUSE = this._shouldUseAlphaFromDiffuseTexture(), a.EMISSIVEASILLUMINATION = this._useEmissiveAsIllumination, a.LINKEMISSIVEWITHDIFFUSE = this._linkEmissiveWithDiffuse, a.SPECULAROVERALPHA = this._useSpecularOverAlpha, a.PREMULTIPLYALPHA = this.alphaMode === e.Engine.ALPHA_PREMULTIPLIED || this.alphaMode === e.Engine.ALPHA_PREMULTIPLIED_PORTERDUFF
            }
            if (a._areImageProcessingDirty) {
                if (!this._imageProcessingConfiguration.isReady()) return !1;
                this._imageProcessingConfiguration.prepareDefines(a)
            }
            if (a._areFresnelDirty && (r.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), e.MaterialHelper.PrepareDefinesForMisc(i, s, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(i), a), e.MaterialHelper.PrepareDefinesForAttributes(i, a, !0, !0, !0), e.MaterialHelper.PrepareDefinesForFrameBoundValues(s, l, a, o), a.isDirty) {
                a.markAsProcessed(), s.resetCachedMaterial();
                var c = new e.EffectFallbacks;
                a.REFLECTION && c.addFallback(0, "REFLECTION"), a.SPECULAR && c.addFallback(0, "SPECULAR"), a.BUMP && c.addFallback(0, "BUMP"), a.PARALLAX && c.addFallback(1, "PARALLAX"), a.PARALLAXOCCLUSION && c.addFallback(0, "PARALLAXOCCLUSION"), a.SPECULAROVERALPHA && c.addFallback(0, "SPECULAROVERALPHA"), a.FOG && c.addFallback(1, "FOG"), a.POINTSIZE && c.addFallback(0, "POINTSIZE"), a.LOGARITHMICDEPTH && c.addFallback(0, "LOGARITHMICDEPTH"), e.MaterialHelper.HandleFallbacksForShadows(a, c, this._maxSimultaneousLights), a.SPECULARTERM && c.addFallback(0, "SPECULARTERM"), a.DIFFUSEFRESNEL && c.addFallback(1, "DIFFUSEFRESNEL"), a.OPACITYFRESNEL && c.addFallback(2, "OPACITYFRESNEL"), a.REFLECTIONFRESNEL && c.addFallback(3, "REFLECTIONFRESNEL"), a.EMISSIVEFRESNEL && c.addFallback(4, "EMISSIVEFRESNEL"), a.FRESNEL && c.addFallback(4, "FRESNEL");
                var h = [e.VertexBuffer.PositionKind];
                a.NORMAL && h.push(e.VertexBuffer.NormalKind), a.UV1 && h.push(e.VertexBuffer.UVKind), a.UV2 && h.push(e.VertexBuffer.UV2Kind), a.VERTEXCOLOR && h.push(e.VertexBuffer.ColorKind), e.MaterialHelper.PrepareAttributesForBones(h, i, a, c), e.MaterialHelper.PrepareAttributesForInstances(h, a), e.MaterialHelper.PrepareAttributesForMorphTargets(h, i, a);
                var u = "default",
                    f = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vDiffuseColor", "vSpecularColor", "vEmissiveColor", "vFogInfos", "vFogColor", "pointSize", "vDiffuseInfos", "vAmbientInfos", "vOpacityInfos", "vReflectionInfos", "vEmissiveInfos", "vSpecularInfos", "vBumpInfos", "vLightmapInfos", "vRefractionInfos", "mBones", "vClipPlane", "diffuseMatrix", "ambientMatrix", "opacityMatrix", "reflectionMatrix", "emissiveMatrix", "specularMatrix", "bumpMatrix", "normalMatrix", "lightmapMatrix", "refractionMatrix", "diffuseLeftColor", "diffuseRightColor", "opacityParts", "reflectionLeftColor", "reflectionRightColor", "emissiveLeftColor", "emissiveRightColor", "refractionLeftColor", "refractionRightColor", "vReflectionPosition", "vReflectionSize", "logarithmicDepthConstant", "vTangentSpaceParams"],
                    d = ["diffuseSampler", "ambientSampler", "opacitySampler", "reflectionCubeSampler", "reflection2DSampler", "emissiveSampler", "specularSampler", "bumpSampler", "lightmapSampler", "refractionCubeSampler", "refraction2DSampler"],
                    p = ["Material", "Scene"];
                e.ImageProcessingConfiguration.PrepareUniforms(f, a), e.ImageProcessingConfiguration.PrepareSamplers(d, a), e.MaterialHelper.PrepareUniformsAndSamplersList({
                    uniformsNames: f,
                    uniformBuffersNames: p,
                    samplers: d,
                    defines: a,
                    maxSimultaneousLights: this._maxSimultaneousLights
                }), this.customShaderNameResolve && (u = this.customShaderNameResolve(u, f, p, d, a));
                var _ = a.toString();
                n.setEffect(s.getEngine().createEffect(u, {
                    attributes: h,
                    uniformsNames: f,
                    uniformBuffersNames: p,
                    samplers: d,
                    defines: _,
                    fallbacks: c,
                    onCompiled: this.onCompiled,
                    onError: this.onError,
                    indexParameters: {
                        maxSimultaneousLights: this._maxSimultaneousLights,
                        maxSimultaneousMorphTargets: a.NUM_MORPH_INFLUENCERS
                    }
                }, l), a), this.buildUniformLayout()
            }
            return !(!n.effect || !n.effect.isReady()) && (a._renderId = s.getRenderId(), this._wasPreviouslyReady = !0, !0)
        }, r.prototype.buildUniformLayout = function() {
            this._uniformBuffer.addUniform("diffuseLeftColor", 4), this._uniformBuffer.addUniform("diffuseRightColor", 4), this._uniformBuffer.addUniform("opacityParts", 4), this._uniformBuffer.addUniform("reflectionLeftColor", 4), this._uniformBuffer.addUniform("reflectionRightColor", 4), this._uniformBuffer.addUniform("refractionLeftColor", 4), this._uniformBuffer.addUniform("refractionRightColor", 4), this._uniformBuffer.addUniform("emissiveLeftColor", 4), this._uniformBuffer.addUniform("emissiveRightColor", 4), this._uniformBuffer.addUniform("vDiffuseInfos", 2), this._uniformBuffer.addUniform("vAmbientInfos", 2), this._uniformBuffer.addUniform("vOpacityInfos", 2), this._uniformBuffer.addUniform("vReflectionInfos", 2), this._uniformBuffer.addUniform("vReflectionPosition", 3), this._uniformBuffer.addUniform("vReflectionSize", 3), this._uniformBuffer.addUniform("vEmissiveInfos", 2), this._uniformBuffer.addUniform("vLightmapInfos", 2), this._uniformBuffer.addUniform("vSpecularInfos", 2), this._uniformBuffer.addUniform("vBumpInfos", 3), this._uniformBuffer.addUniform("diffuseMatrix", 16), this._uniformBuffer.addUniform("ambientMatrix", 16), this._uniformBuffer.addUniform("opacityMatrix", 16), this._uniformBuffer.addUniform("reflectionMatrix", 16), this._uniformBuffer.addUniform("emissiveMatrix", 16), this._uniformBuffer.addUniform("lightmapMatrix", 16), this._uniformBuffer.addUniform("specularMatrix", 16), this._uniformBuffer.addUniform("bumpMatrix", 16), this._uniformBuffer.addUniform("vTangentSpaceParams", 2), this._uniformBuffer.addUniform("refractionMatrix", 16), this._uniformBuffer.addUniform("vRefractionInfos", 4), this._uniformBuffer.addUniform("vSpecularColor", 4), this._uniformBuffer.addUniform("vEmissiveColor", 3), this._uniformBuffer.addUniform("vDiffuseColor", 4), this._uniformBuffer.addUniform("pointSize", 1), this._uniformBuffer.create()
        }, r.prototype.unbind = function() {
            this._activeEffect && (this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._activeEffect.setTexture("reflection2DSampler", null), this._refractionTexture && this._refractionTexture.isRenderTarget && this._activeEffect.setTexture("refraction2DSampler", null)), i.prototype.unbind.call(this)
        }, r.prototype.bindForSubMesh = function(t, i, n) {
            var o = this.getScene(),
                s = n._materialDefines;
            if (s) {
                var a = n.effect;
                if (a) {
                    this._activeEffect = a, this.bindOnlyWorldMatrix(t), s.OBJECTSPACE_NORMALMAP && (t.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix));
                    var l = this._mustRebind(o, a, i.visibility);
                    if (e.MaterialHelper.BindBonesParameters(i, a), l) {
                        if (this._uniformBuffer.bindToEffect(a, "Material"), this.bindViewProjection(a), !this._uniformBuffer.useUbo || !this.isFrozen || !this._uniformBuffer.isSync) {
                            if (r.FresnelEnabled && s.FRESNEL && (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled && (this._uniformBuffer.updateColor4("diffuseLeftColor", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power), this._uniformBuffer.updateColor4("diffuseRightColor", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias)), this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled && this._uniformBuffer.updateColor4("opacityParts", new e.Color3(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power), this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled && (this._uniformBuffer.updateColor4("reflectionLeftColor", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power), this._uniformBuffer.updateColor4("reflectionRightColor", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias)), this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled && (this._uniformBuffer.updateColor4("refractionLeftColor", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power), this._uniformBuffer.updateColor4("refractionRightColor", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias)), this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled && (this._uniformBuffer.updateColor4("emissiveLeftColor", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power), this._uniformBuffer.updateColor4("emissiveRightColor", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias))), o.texturesEnabled) {
                                if (this._diffuseTexture && r.DiffuseTextureEnabled && (this._uniformBuffer.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level), e.MaterialHelper.BindTextureMatrix(this._diffuseTexture, this._uniformBuffer, "diffuse")), this._ambientTexture && r.AmbientTextureEnabled && (this._uniformBuffer.updateFloat2("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level), e.MaterialHelper.BindTextureMatrix(this._ambientTexture, this._uniformBuffer, "ambient")), this._opacityTexture && r.OpacityTextureEnabled && (this._uniformBuffer.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level), e.MaterialHelper.BindTextureMatrix(this._opacityTexture, this._uniformBuffer, "opacity")), this._reflectionTexture && r.ReflectionTextureEnabled && (this._uniformBuffer.updateFloat2("vReflectionInfos", this._reflectionTexture.level, this.roughness), this._uniformBuffer.updateMatrix("reflectionMatrix", this._reflectionTexture.getReflectionTextureMatrix()), this._reflectionTexture.boundingBoxSize)) {
                                    var c = this._reflectionTexture;
                                    this._uniformBuffer.updateVector3("vReflectionPosition", c.boundingBoxPosition), this._uniformBuffer.updateVector3("vReflectionSize", c.boundingBoxSize)
                                }
                                if (this._emissiveTexture && r.EmissiveTextureEnabled && (this._uniformBuffer.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), e.MaterialHelper.BindTextureMatrix(this._emissiveTexture, this._uniformBuffer, "emissive")), this._lightmapTexture && r.LightmapTextureEnabled && (this._uniformBuffer.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), e.MaterialHelper.BindTextureMatrix(this._lightmapTexture, this._uniformBuffer, "lightmap")), this._specularTexture && r.SpecularTextureEnabled && (this._uniformBuffer.updateFloat2("vSpecularInfos", this._specularTexture.coordinatesIndex, this._specularTexture.level), e.MaterialHelper.BindTextureMatrix(this._specularTexture, this._uniformBuffer, "specular")), this._bumpTexture && o.getEngine().getCaps().standardDerivatives && r.BumpTextureEnabled && (this._uniformBuffer.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, 1 / this._bumpTexture.level, this.parallaxScaleBias), e.MaterialHelper.BindTextureMatrix(this._bumpTexture, this._uniformBuffer, "bump"), o._mirroredCameraPosition ? this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1)), this._refractionTexture && r.RefractionTextureEnabled) {
                                    var h = 1;
                                    this._refractionTexture.isCube || (this._uniformBuffer.updateMatrix("refractionMatrix", this._refractionTexture.getReflectionTextureMatrix()), this._refractionTexture.depth && (h = this._refractionTexture.depth)), this._uniformBuffer.updateFloat4("vRefractionInfos", this._refractionTexture.level, this.indexOfRefraction, h, this.invertRefractionY ? -1 : 1)
                                }
                            }
                            this.pointsCloud && this._uniformBuffer.updateFloat("pointSize", this.pointSize), s.SPECULARTERM && this._uniformBuffer.updateColor4("vSpecularColor", this.specularColor, this.specularPower), this._uniformBuffer.updateColor3("vEmissiveColor", this.emissiveColor), this._uniformBuffer.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha * i.visibility)
                        }
                        if (o.texturesEnabled && (this._diffuseTexture && r.DiffuseTextureEnabled && a.setTexture("diffuseSampler", this._diffuseTexture), this._ambientTexture && r.AmbientTextureEnabled && a.setTexture("ambientSampler", this._ambientTexture), this._opacityTexture && r.OpacityTextureEnabled && a.setTexture("opacitySampler", this._opacityTexture), this._reflectionTexture && r.ReflectionTextureEnabled && (this._reflectionTexture.isCube ? a.setTexture("reflectionCubeSampler", this._reflectionTexture) : a.setTexture("reflection2DSampler", this._reflectionTexture)), this._emissiveTexture && r.EmissiveTextureEnabled && a.setTexture("emissiveSampler", this._emissiveTexture), this._lightmapTexture && r.LightmapTextureEnabled && a.setTexture("lightmapSampler", this._lightmapTexture), this._specularTexture && r.SpecularTextureEnabled && a.setTexture("specularSampler", this._specularTexture), this._bumpTexture && o.getEngine().getCaps().standardDerivatives && r.BumpTextureEnabled && a.setTexture("bumpSampler", this._bumpTexture), this._refractionTexture && r.RefractionTextureEnabled)) {
                            var h = 1;
                            this._refractionTexture.isCube ? a.setTexture("refractionCubeSampler", this._refractionTexture) : a.setTexture("refraction2DSampler", this._refractionTexture)
                        }
                        e.MaterialHelper.BindClipPlane(a, o), o.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor), e.MaterialHelper.BindEyePosition(a, o), a.setColor3("vAmbientColor", this._globalAmbientColor)
                    }!l && this.isFrozen || (o.lightsEnabled && !this._disableLighting && e.MaterialHelper.BindLights(o, i, a, s, this._maxSimultaneousLights), (o.fogEnabled && i.applyFog && o.fogMode !== e.Scene.FOGMODE_NONE || this._reflectionTexture || this._refractionTexture) && this.bindView(a), e.MaterialHelper.BindFogParameters(o, i, a), s.NUM_MORPH_INFLUENCERS && e.MaterialHelper.BindMorphTargetParameters(i, a), e.MaterialHelper.BindLogDepth(s, a, o), this._imageProcessingConfiguration.applyByPostProcess || this._imageProcessingConfiguration.bind(this._activeEffect)), this._uniformBuffer.update(), this._afterBind(i, this._activeEffect)
                }
            }
        }, r.prototype.getAnimatables = function() {
            var e = [];
            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
        }, r.prototype.getActiveTextures = function() {
            var e = i.prototype.getActiveTextures.call(this);
            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
        }, r.prototype.hasTexture = function(e) {
            return !!i.prototype.hasTexture.call(this, 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))))))))
        }, r.prototype.dispose = function(e, t) {
            t && (this._diffuseTexture && this._diffuseTexture.dispose(), this._ambientTexture && this._ambientTexture.dispose(), this._opacityTexture && this._opacityTexture.dispose(), this._reflectionTexture && this._reflectionTexture.dispose(), this._emissiveTexture && this._emissiveTexture.dispose(), this._specularTexture && this._specularTexture.dispose(), this._bumpTexture && this._bumpTexture.dispose(), this._lightmapTexture && this._lightmapTexture.dispose(), this._refractionTexture && this._refractionTexture.dispose()), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), i.prototype.dispose.call(this, e, t)
        }, r.prototype.clone = function(t) {
            var i = this,
                n = e.SerializationHelper.Clone((function() {
                    return new r(t, i.getScene())
                }), this);
            return n.name = t, n.id = t, n
        }, r.prototype.serialize = function() {
            return e.SerializationHelper.Serialize(this)
        }, r.Parse = function(t, i, n) {
            return e.SerializationHelper.Parse((function() {
                return new r(t.name, i)
            }), t, i, n)
        }, Object.defineProperty(r, "DiffuseTextureEnabled", {
            get: function() {
                return r._DiffuseTextureEnabled
            },
            set: function(t) {
                r._DiffuseTextureEnabled !== t && (r._DiffuseTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "AmbientTextureEnabled", {
            get: function() {
                return r._AmbientTextureEnabled
            },
            set: function(t) {
                r._AmbientTextureEnabled !== t && (r._AmbientTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "OpacityTextureEnabled", {
            get: function() {
                return r._OpacityTextureEnabled
            },
            set: function(t) {
                r._OpacityTextureEnabled !== t && (r._OpacityTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "ReflectionTextureEnabled", {
            get: function() {
                return r._ReflectionTextureEnabled
            },
            set: function(t) {
                r._ReflectionTextureEnabled !== t && (r._ReflectionTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "EmissiveTextureEnabled", {
            get: function() {
                return r._EmissiveTextureEnabled
            },
            set: function(t) {
                r._EmissiveTextureEnabled !== t && (r._EmissiveTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "SpecularTextureEnabled", {
            get: function() {
                return r._SpecularTextureEnabled
            },
            set: function(t) {
                r._SpecularTextureEnabled !== t && (r._SpecularTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "BumpTextureEnabled", {
            get: function() {
                return r._BumpTextureEnabled
            },
            set: function(t) {
                r._BumpTextureEnabled !== t && (r._BumpTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "LightmapTextureEnabled", {
            get: function() {
                return r._LightmapTextureEnabled
            },
            set: function(t) {
                r._LightmapTextureEnabled !== t && (r._LightmapTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "RefractionTextureEnabled", {
            get: function() {
                return r._RefractionTextureEnabled
            },
            set: function(t) {
                r._RefractionTextureEnabled !== t && (r._RefractionTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "ColorGradingTextureEnabled", {
            get: function() {
                return r._ColorGradingTextureEnabled
            },
            set: function(t) {
                r._ColorGradingTextureEnabled !== t && (r._ColorGradingTextureEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.TextureDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r, "FresnelEnabled", {
            get: function() {
                return r._FresnelEnabled
            },
            set: function(t) {
                r._FresnelEnabled !== t && (r._FresnelEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.FresnelDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), r._DiffuseTextureEnabled = !0, r._AmbientTextureEnabled = !0, r._OpacityTextureEnabled = !0, r._ReflectionTextureEnabled = !0, r._EmissiveTextureEnabled = !0, r._SpecularTextureEnabled = !0, r._BumpTextureEnabled = !0, r._LightmapTextureEnabled = !0, r._RefractionTextureEnabled = !0, r._ColorGradingTextureEnabled = !0, r._FresnelEnabled = !0, __decorate([e.serializeAsTexture("diffuseTexture")], r.prototype, "_diffuseTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty")], r.prototype, "diffuseTexture", void 0), __decorate([e.serializeAsTexture("ambientTexture")], r.prototype, "_ambientTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "ambientTexture", void 0), __decorate([e.serializeAsTexture("opacityTexture")], r.prototype, "_opacityTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty")], r.prototype, "opacityTexture", void 0), __decorate([e.serializeAsTexture("reflectionTexture")], r.prototype, "_reflectionTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionTexture", void 0), __decorate([e.serializeAsTexture("emissiveTexture")], r.prototype, "_emissiveTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "emissiveTexture", void 0), __decorate([e.serializeAsTexture("specularTexture")], r.prototype, "_specularTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "specularTexture", void 0), __decorate([e.serializeAsTexture("bumpTexture")], r.prototype, "_bumpTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "bumpTexture", void 0), __decorate([e.serializeAsTexture("lightmapTexture")], r.prototype, "_lightmapTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "lightmapTexture", void 0), __decorate([e.serializeAsTexture("refractionTexture")], r.prototype, "_refractionTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "refractionTexture", void 0), __decorate([e.serializeAsColor3("ambient")], r.prototype, "ambientColor", void 0), __decorate([e.serializeAsColor3("diffuse")], r.prototype, "diffuseColor", void 0), __decorate([e.serializeAsColor3("specular")], r.prototype, "specularColor", void 0), __decorate([e.serializeAsColor3("emissive")], r.prototype, "emissiveColor", void 0), __decorate([e.serialize()], r.prototype, "specularPower", void 0), __decorate([e.serialize("useAlphaFromDiffuseTexture")], r.prototype, "_useAlphaFromDiffuseTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useAlphaFromDiffuseTexture", void 0), __decorate([e.serialize("useEmissiveAsIllumination")], r.prototype, "_useEmissiveAsIllumination", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useEmissiveAsIllumination", void 0), __decorate([e.serialize("linkEmissiveWithDiffuse")], r.prototype, "_linkEmissiveWithDiffuse", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "linkEmissiveWithDiffuse", void 0), __decorate([e.serialize("useSpecularOverAlpha")], r.prototype, "_useSpecularOverAlpha", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useSpecularOverAlpha", void 0), __decorate([e.serialize("useReflectionOverAlpha")], r.prototype, "_useReflectionOverAlpha", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useReflectionOverAlpha", void 0), __decorate([e.serialize("disableLighting")], r.prototype, "_disableLighting", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "disableLighting", void 0), __decorate([e.serialize("useObjectSpaceNormalMap")], r.prototype, "_useObjectSpaceNormalMap", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useObjectSpaceNormalMap", void 0), __decorate([e.serialize("useParallax")], r.prototype, "_useParallax", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useParallax", void 0), __decorate([e.serialize("useParallaxOcclusion")], r.prototype, "_useParallaxOcclusion", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useParallaxOcclusion", void 0), __decorate([e.serialize()], r.prototype, "parallaxScaleBias", void 0), __decorate([e.serialize("roughness")], r.prototype, "_roughness", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "roughness", void 0), __decorate([e.serialize()], r.prototype, "indexOfRefraction", void 0), __decorate([e.serialize()], r.prototype, "invertRefractionY", void 0), __decorate([e.serialize("useLightmapAsShadowmap")], r.prototype, "_useLightmapAsShadowmap", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useLightmapAsShadowmap", void 0), __decorate([e.serializeAsFresnelParameters("diffuseFresnelParameters")], r.prototype, "_diffuseFresnelParameters", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsFresnelDirty")], r.prototype, "diffuseFresnelParameters", void 0), __decorate([e.serializeAsFresnelParameters("opacityFresnelParameters")], r.prototype, "_opacityFresnelParameters", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsFresnelAndMiscDirty")], r.prototype, "opacityFresnelParameters", void 0), __decorate([e.serializeAsFresnelParameters("reflectionFresnelParameters")], r.prototype, "_reflectionFresnelParameters", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsFresnelDirty")], r.prototype, "reflectionFresnelParameters", void 0), __decorate([e.serializeAsFresnelParameters("refractionFresnelParameters")], r.prototype, "_refractionFresnelParameters", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsFresnelDirty")], r.prototype, "refractionFresnelParameters", void 0), __decorate([e.serializeAsFresnelParameters("emissiveFresnelParameters")], r.prototype, "_emissiveFresnelParameters", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsFresnelDirty")], r.prototype, "emissiveFresnelParameters", void 0), __decorate([e.serialize("useReflectionFresnelFromSpecular")], r.prototype, "_useReflectionFresnelFromSpecular", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsFresnelDirty")], r.prototype, "useReflectionFresnelFromSpecular", void 0), __decorate([e.serialize("useGlossinessFromSpecularMapAlpha")], r.prototype, "_useGlossinessFromSpecularMapAlpha", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useGlossinessFromSpecularMapAlpha", void 0), __decorate([e.serialize("maxSimultaneousLights")], r.prototype, "_maxSimultaneousLights", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "maxSimultaneousLights", void 0), __decorate([e.serialize("invertNormalMapX")], r.prototype, "_invertNormalMapX", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "invertNormalMapX", void 0), __decorate([e.serialize("invertNormalMapY")], r.prototype, "_invertNormalMapY", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "invertNormalMapY", void 0), __decorate([e.serialize("twoSidedLighting")], r.prototype, "_twoSidedLighting", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "twoSidedLighting", void 0), __decorate([e.serialize()], r.prototype, "useLogarithmicDepth", null), r
    })(e.PushMaterial);
    e.StandardMaterial = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
            function t() {
                var t = e.call(this) || this;
                return t.PBR = !0, t.MAINUV1 = !1, t.MAINUV2 = !1, t.UV1 = !1, t.UV2 = !1, t.ALBEDO = !1, t.ALBEDODIRECTUV = 0, t.VERTEXCOLOR = !1, t.AMBIENT = !1, t.AMBIENTDIRECTUV = 0, t.AMBIENTINGRAYSCALE = !1, t.OPACITY = !1, t.VERTEXALPHA = !1, t.OPACITYDIRECTUV = 0, t.OPACITYRGB = !1, t.ALPHATEST = !1, t.DEPTHPREPASS = !1, t.ALPHABLEND = !1, t.ALPHAFROMALBEDO = !1, t.ALPHATESTVALUE = .5, t.SPECULAROVERALPHA = !1, t.RADIANCEOVERALPHA = !1, t.ALPHAFRESNEL = !1, t.LINEARALPHAFRESNEL = !1, t.PREMULTIPLYALPHA = !1, t.EMISSIVE = !1, t.EMISSIVEDIRECTUV = 0, t.REFLECTIVITY = !1, t.REFLECTIVITYDIRECTUV = 0, t.SPECULARTERM = !1, t.MICROSURFACEFROMREFLECTIVITYMAP = !1, t.MICROSURFACEAUTOMATIC = !1, t.LODBASEDMICROSFURACE = !1, t.MICROSURFACEMAP = !1, t.MICROSURFACEMAPDIRECTUV = 0, t.METALLICWORKFLOW = !1, t.ROUGHNESSSTOREINMETALMAPALPHA = !1, t.ROUGHNESSSTOREINMETALMAPGREEN = !1, t.METALLNESSSTOREINMETALMAPBLUE = !1, t.AOSTOREINMETALMAPRED = !1,
                    t.ENVIRONMENTBRDF = !1, t.NORMAL = !1, t.TANGENT = !1, t.BUMP = !1, t.BUMPDIRECTUV = 0, t.OBJECTSPACE_NORMALMAP = !1, t.PARALLAX = !1, t.PARALLAXOCCLUSION = !1, t.NORMALXYSCALE = !0, t.LIGHTMAP = !1, t.LIGHTMAPDIRECTUV = 0, t.USELIGHTMAPASSHADOWMAP = !1, 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.USESPHERICALINVERTEX = !1, t.REFLECTIONMAP_OPPOSITEZ = !1, t.LODINREFLECTIONALPHA = !1, t.GAMMAREFLECTION = !1, t.RADIANCEOCCLUSION = !1, t.HORIZONOCCLUSION = !1, t.REFRACTION = !1, t.REFRACTIONMAP_3D = !1, t.REFRACTIONMAP_OPPOSITEZ = !1, t.LODINREFRACTIONALPHA = !1, t.GAMMAREFRACTION = !1, t.LINKREFRACTIONTOTRANSPARENCY = !1, t.INSTANCES = !1, t.NUM_BONE_INFLUENCERS = 0, t.BonesPerMesh = 0, t.NONUNIFORMSCALING = !1, t.MORPHTARGETS = !1, t.MORPHTARGETS_NORMAL = !1, t.MORPHTARGETS_TANGENT = !1, t.NUM_MORPH_INFLUENCERS = 0, t.IMAGEPROCESSING = !1, t.VIGNETTE = !1, t.VIGNETTEBLENDMODEMULTIPLY = !1, t.VIGNETTEBLENDMODEOPAQUE = !1, t.TONEMAPPING = !1, t.CONTRAST = !1, t.COLORCURVES = !1, t.COLORGRADING = !1, t.COLORGRADING3D = !1, t.SAMPLER3DGREENDEPTH = !1, t.SAMPLER3DBGRMAP = !1, t.IMAGEPROCESSINGPOSTPROCESS = !1, t.EXPOSURE = !1, t.USEPHYSICALLIGHTFALLOFF = !1, t.TWOSIDEDLIGHTING = !1, t.SHADOWFLOAT = !1, t.CLIPPLANE = !1, t.POINTSIZE = !1, t.FOG = !1, t.LOGARITHMICDEPTH = !1, t.FORCENORMALFORWARD = !1, t.rebuild(), t
            }
            return __extends(t, e), t.prototype.reset = function() {
                e.prototype.reset.call(this), this.ALPHATESTVALUE = .5, this.PBR = !0
            }, t
        })(e.MaterialDefines),
        i = (function(i) {
            function r(t, r) {
                var n = i.call(this, t, r) || this;
                return n._directIntensity = 1, n._emissiveIntensity = 1, n._environmentIntensity = 1, n._specularIntensity = 1, n._lightingInfos = new e.Vector4(n._directIntensity, n._emissiveIntensity, n._environmentIntensity, n._specularIntensity), n._disableBumpMap = !1, n._ambientTextureStrength = 1, n._ambientColor = new e.Color3(0, 0, 0), n._albedoColor = new e.Color3(1, 1, 1), n._reflectivityColor = new e.Color3(1, 1, 1), n._reflectionColor = new e.Color3(1, 1, 1), n._emissiveColor = new e.Color3(0, 0, 0), n._microSurface = .9, n._indexOfRefraction = .66, n._invertRefractionY = !1, n._linkRefractionWithTransparency = !1, n._useLightmapAsShadowmap = !1, n._useHorizonOcclusion = !0, n._useRadianceOcclusion = !0, n._useAlphaFromAlbedoTexture = !1, n._useSpecularOverAlpha = !0, n._useMicroSurfaceFromReflectivityMapAlpha = !1, n._useRoughnessFromMetallicTextureAlpha = !0, n._useRoughnessFromMetallicTextureGreen = !1, n._useMetallnessFromMetallicTextureBlue = !1, n._useAmbientOcclusionFromMetallicTextureRed = !1, n._useAmbientInGrayScale = !1, n._useAutoMicroSurfaceFromReflectivityMap = !1, n._usePhysicalLightFalloff = !0, n._useRadianceOverAlpha = !0, n._useObjectSpaceNormalMap = !1, n._useParallax = !1, n._useParallaxOcclusion = !1, n._parallaxScaleBias = .05, n._disableLighting = !1, n._maxSimultaneousLights = 4, n._invertNormalMapX = !1, n._invertNormalMapY = !1, n._twoSidedLighting = !1, n._alphaCutOff = .4, n._forceAlphaTest = !1, n._useAlphaFresnel = !1, n._useLinearAlphaFresnel = !1, n._transparencyMode = null, n._environmentBRDFTexture = null, n._forceIrradianceInFragment = !1, n._forceNormalForward = !1, n._forceMetallicWorkflow = !1, n._renderTargets = new e.SmartArray(16), n._globalAmbientColor = new e.Color3(0, 0, 0), n._attachImageProcessingConfiguration(null), n.getRenderTargetTextures = function() {
                    return n._renderTargets.reset(), e.StandardMaterial.ReflectionTextureEnabled && n._reflectionTexture && n._reflectionTexture.isRenderTarget && n._renderTargets.push(n._reflectionTexture), e.StandardMaterial.RefractionTextureEnabled && n._refractionTexture && n._refractionTexture.isRenderTarget && n._renderTargets.push(n._refractionTexture), n._renderTargets
                }, n._environmentBRDFTexture = e.TextureTools.GetEnvironmentBRDFTexture(r), n
            }
            return __extends(r, i), r.prototype._attachImageProcessingConfiguration = function(e) {
                var t = this;
                e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), this._imageProcessingConfiguration = e || this.getScene().imageProcessingConfiguration, this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add((function(e) {
                    t._markAllSubMeshesAsImageProcessingDirty()
                })))
            }, r.prototype.getClassName = function() {
                return "PBRBaseMaterial"
            }, Object.defineProperty(r.prototype, "useLogarithmicDepth", {
                get: function() {
                    return this._useLogarithmicDepth
                },
                set: function(e) {
                    this._useLogarithmicDepth = e && this.getScene().getEngine().getCaps().fragmentDepthSupported
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "transparencyMode", {
                get: function() {
                    return this._transparencyMode
                },
                set: function(t) {
                    this._transparencyMode !== t && (this._transparencyMode = t, this._forceAlphaTest = t === e.PBRMaterial.PBRMATERIAL_ALPHATESTANDBLEND, this._markAllSubMeshesAsTexturesAndMiscDirty())
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "_disableAlphaBlending", {
                get: function() {
                    return this._linkRefractionWithTransparency || this._transparencyMode === e.PBRMaterial.PBRMATERIAL_OPAQUE || this._transparencyMode === e.PBRMaterial.PBRMATERIAL_ALPHATEST
                },
                enumerable: !0,
                configurable: !0
            }), r.prototype.needAlphaBlending = function() {
                return !this._disableAlphaBlending && (this.alpha < 1 || null != this._opacityTexture || this._shouldUseAlphaFromAlbedoTexture())
            }, r.prototype.needAlphaBlendingForMesh = function(e) {
                return !this._disableAlphaBlending && i.prototype.needAlphaBlendingForMesh.call(this, e)
            }, r.prototype.needAlphaTesting = function() {
                return !!this._forceAlphaTest || !this._linkRefractionWithTransparency && (null != this._albedoTexture && this._albedoTexture.hasAlpha && (null == this._transparencyMode || this._transparencyMode === e.PBRMaterial.PBRMATERIAL_ALPHATEST))
            }, r.prototype._shouldUseAlphaFromAlbedoTexture = function() {
                return null != this._albedoTexture && this._albedoTexture.hasAlpha && this._useAlphaFromAlbedoTexture && this._transparencyMode !== e.PBRMaterial.PBRMATERIAL_OPAQUE
            }, r.prototype.getAlphaTestTexture = function() {
                return this._albedoTexture
            }, r.prototype.isReadyForSubMesh = function(i, r, n) {
                if (r.effect && this.isFrozen && this._wasPreviouslyReady) return !0;
                r._materialDefines || (r._materialDefines = new t);
                var o = r._materialDefines;
                if (!this.checkReadyOnEveryCall && r.effect && o._renderId === this.getScene().getRenderId()) return !0;
                var s = this.getScene(),
                    a = s.getEngine();
                if (o._areTexturesDirty && s.texturesEnabled) {
                    if (this._albedoTexture && e.StandardMaterial.DiffuseTextureEnabled && !this._albedoTexture.isReadyOrNotBlocking()) return !1;
                    if (this._ambientTexture && e.StandardMaterial.AmbientTextureEnabled && !this._ambientTexture.isReadyOrNotBlocking()) return !1;
                    if (this._opacityTexture && e.StandardMaterial.OpacityTextureEnabled && !this._opacityTexture.isReadyOrNotBlocking()) return !1;
                    var l = this._getReflectionTexture();
                    if (l && e.StandardMaterial.ReflectionTextureEnabled && !l.isReadyOrNotBlocking()) return !1;
                    if (this._lightmapTexture && e.StandardMaterial.LightmapTextureEnabled && !this._lightmapTexture.isReadyOrNotBlocking()) return !1;
                    if (this._emissiveTexture && e.StandardMaterial.EmissiveTextureEnabled && !this._emissiveTexture.isReadyOrNotBlocking()) return !1;
                    if (e.StandardMaterial.SpecularTextureEnabled) {
                        if (this._metallicTexture) {
                            if (!this._metallicTexture.isReadyOrNotBlocking()) return !1
                        } else if (this._reflectivityTexture && !this._reflectivityTexture.isReadyOrNotBlocking()) return !1;
                        if (this._microSurfaceTexture && !this._microSurfaceTexture.isReadyOrNotBlocking()) return !1
                    }
                    if (a.getCaps().standardDerivatives && this._bumpTexture && e.StandardMaterial.BumpTextureEnabled && !this._disableBumpMap && !this._bumpTexture.isReady()) return !1;
                    var c = this._getRefractionTexture();
                    if (c && e.StandardMaterial.RefractionTextureEnabled && !c.isReadyOrNotBlocking()) return !1;
                    if (this._environmentBRDFTexture && e.StandardMaterial.ReflectionTextureEnabled && !this._environmentBRDFTexture.isReady()) return !1
                }
                if (o._areImageProcessingDirty && !this._imageProcessingConfiguration.isReady()) return !1;
                if (!a.getCaps().standardDerivatives) {
                    var h = null;
                    "InstancedMesh" === i.getClassName() ? h = i.sourceMesh : "Mesh" === i.getClassName() && (h = i), h && h.geometry && h.geometry.isReady() && !h.geometry.isVerticesDataPresent(e.VertexBuffer.NormalKind) && (h.createNormals(!0), e.Tools.Warn("PBRMaterial: Normals have been created for the mesh: " + h.name))
                }
                var u = this._prepareEffect(i, o, this.onCompiled, this.onError, n);
                return u && (s.resetCachedMaterial(), r.setEffect(u, o), this.buildUniformLayout()), !(!r.effect || !r.effect.isReady()) && (o._renderId = s.getRenderId(), this._wasPreviouslyReady = !0, !0)
            }, r.prototype._prepareEffect = function(t, i, r, n, o, s) {
                if (void 0 === r && (r = null), void 0 === n && (n = null), void 0 === o && (o = null), void 0 === s && (s = null), this._prepareDefines(t, i, o, s), !i.isDirty) return null;
                i.markAsProcessed();
                var a = this.getScene(),
                    l = a.getEngine(),
                    c = new e.EffectFallbacks,
                    h = 0;
                i.USESPHERICALINVERTEX && c.addFallback(h++, "USESPHERICALINVERTEX"), i.FOG && c.addFallback(h, "FOG"), i.POINTSIZE && c.addFallback(h, "POINTSIZE"), i.LOGARITHMICDEPTH && c.addFallback(h, "LOGARITHMICDEPTH"), i.PARALLAX && c.addFallback(h, "PARALLAX"), i.PARALLAXOCCLUSION && c.addFallback(h++, "PARALLAXOCCLUSION"), i.ENVIRONMENTBRDF && c.addFallback(h++, "ENVIRONMENTBRDF"), i.TANGENT && c.addFallback(h++, "TANGENT"), i.BUMP && c.addFallback(h++, "BUMP"), h = e.MaterialHelper.HandleFallbacksForShadows(i, c, this._maxSimultaneousLights, h++), i.SPECULARTERM && c.addFallback(h++, "SPECULARTERM"), i.USESPHERICALFROMREFLECTIONMAP && c.addFallback(h++, "USESPHERICALFROMREFLECTIONMAP"), i.LIGHTMAP && c.addFallback(h++, "LIGHTMAP"), i.NORMAL && c.addFallback(h++, "NORMAL"), i.AMBIENT && c.addFallback(h++, "AMBIENT"), i.EMISSIVE && c.addFallback(h++, "EMISSIVE"), i.VERTEXCOLOR && c.addFallback(h++, "VERTEXCOLOR"), i.NUM_BONE_INFLUENCERS > 0 && c.addCPUSkinningFallback(h++, t), i.MORPHTARGETS && c.addFallback(h++, "MORPHTARGETS");
                var u = [e.VertexBuffer.PositionKind];
                i.NORMAL && u.push(e.VertexBuffer.NormalKind), i.TANGENT && u.push(e.VertexBuffer.TangentKind), i.UV1 && u.push(e.VertexBuffer.UVKind), i.UV2 && u.push(e.VertexBuffer.UV2Kind), i.VERTEXCOLOR && u.push(e.VertexBuffer.ColorKind), e.MaterialHelper.PrepareAttributesForBones(u, t, i, c), e.MaterialHelper.PrepareAttributesForInstances(u, i), e.MaterialHelper.PrepareAttributesForMorphTargets(u, t, i);
                var f = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vAlbedoColor", "vReflectivityColor", "vEmissiveColor", "vReflectionColor", "vFogInfos", "vFogColor", "pointSize", "vAlbedoInfos", "vAmbientInfos", "vOpacityInfos", "vReflectionInfos", "vReflectionPosition", "vReflectionSize", "vEmissiveInfos", "vReflectivityInfos", "vMicroSurfaceSamplerInfos", "vBumpInfos", "vLightmapInfos", "vRefractionInfos", "mBones", "vClipPlane", "albedoMatrix", "ambientMatrix", "opacityMatrix", "reflectionMatrix", "emissiveMatrix", "reflectivityMatrix", "normalMatrix", "microSurfaceSamplerMatrix", "bumpMatrix", "lightmapMatrix", "refractionMatrix", "vLightingIntensity", "logarithmicDepthConstant", "vSphericalX", "vSphericalY", "vSphericalZ", "vSphericalXX", "vSphericalYY", "vSphericalZZ", "vSphericalXY", "vSphericalYZ", "vSphericalZX", "vReflectionMicrosurfaceInfos", "vRefractionMicrosurfaceInfos", "vTangentSpaceParams"],
                    d = ["albedoSampler", "reflectivitySampler", "ambientSampler", "emissiveSampler", "bumpSampler", "lightmapSampler", "opacitySampler", "refractionSampler", "refractionSamplerLow", "refractionSamplerHigh", "reflectionSampler", "reflectionSamplerLow", "reflectionSamplerHigh", "microSurfaceSampler", "environmentBrdfSampler"],
                    p = ["Material", "Scene"];
                e.ImageProcessingConfiguration.PrepareUniforms(f, i), e.ImageProcessingConfiguration.PrepareSamplers(d, i), e.MaterialHelper.PrepareUniformsAndSamplersList({
                    uniformsNames: f,
                    uniformBuffersNames: p,
                    samplers: d,
                    defines: i,
                    maxSimultaneousLights: this._maxSimultaneousLights
                });
                var _ = i.toString();
                return l.createEffect("pbr", {
                    attributes: u,
                    uniformsNames: f,
                    uniformBuffersNames: p,
                    samplers: d,
                    defines: _,
                    fallbacks: c,
                    onCompiled: r,
                    onError: n,
                    indexParameters: {
                        maxSimultaneousLights: this._maxSimultaneousLights,
                        maxSimultaneousMorphTargets: i.NUM_MORPH_INFLUENCERS
                    }
                }, l)
            }, r.prototype._prepareDefines = function(t, i, r, n) {
                void 0 === r && (r = null), void 0 === n && (n = null);
                var o = this.getScene(),
                    s = o.getEngine();
                if (e.MaterialHelper.PrepareDefinesForLights(o, t, i, !0, this._maxSimultaneousLights, this._disableLighting), i._needNormals = !0, i._areTexturesDirty) {
                    if (i._needUVs = !1, o.texturesEnabled) {
                        o.getEngine().getCaps().textureLOD && (i.LODBASEDMICROSFURACE = !0), this._albedoTexture && e.StandardMaterial.DiffuseTextureEnabled ? e.MaterialHelper.PrepareDefinesForMergedUV(this._albedoTexture, i, "ALBEDO") : i.ALBEDO = !1, this._ambientTexture && e.StandardMaterial.AmbientTextureEnabled ? (e.MaterialHelper.PrepareDefinesForMergedUV(this._ambientTexture, i, "AMBIENT"), i.AMBIENTINGRAYSCALE = this._useAmbientInGrayScale) : i.AMBIENT = !1, this._opacityTexture && e.StandardMaterial.OpacityTextureEnabled ? (e.MaterialHelper.PrepareDefinesForMergedUV(this._opacityTexture, i, "OPACITY"), i.OPACITYRGB = this._opacityTexture.getAlphaFromRGB) : i.OPACITY = !1;
                        var a = this._getReflectionTexture();
                        if (a && e.StandardMaterial.ReflectionTextureEnabled) {
                            switch (i.REFLECTION = !0, i.GAMMAREFLECTION = a.gammaSpace, i.REFLECTIONMAP_OPPOSITEZ = this.getScene().useRightHandedSystem ? !a.invertZ : a.invertZ, i.LODINREFLECTIONALPHA = a.lodLevelInAlpha, a.coordinatesMode === e.Texture.INVCUBIC_MODE && (i.INVERTCUBICMAP = !0), i.REFLECTIONMAP_3D = a.isCube, a.coordinatesMode) {
                                case e.Texture.CUBIC_MODE:
                                case e.Texture.INVCUBIC_MODE:
                                    i.REFLECTIONMAP_CUBIC = !0, i.USE_LOCAL_REFLECTIONMAP_CUBIC = !!a.boundingBoxSize;
                                    break;
                                case e.Texture.EXPLICIT_MODE:
                                    i.REFLECTIONMAP_EXPLICIT = !0;
                                    break;
                                case e.Texture.PLANAR_MODE:
                                    i.REFLECTIONMAP_PLANAR = !0;
                                    break;
                                case e.Texture.PROJECTION_MODE:
                                    i.REFLECTIONMAP_PROJECTION = !0;
                                    break;
                                case e.Texture.SKYBOX_MODE:
                                    i.REFLECTIONMAP_SKYBOX = !0;
                                    break;
                                case e.Texture.SPHERICAL_MODE:
                                    i.REFLECTIONMAP_SPHERICAL = !0;
                                    break;
                                case e.Texture.EQUIRECTANGULAR_MODE:
                                    i.REFLECTIONMAP_EQUIRECTANGULAR = !0;
                                    break;
                                case e.Texture.FIXED_EQUIRECTANGULAR_MODE:
                                    i.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !0;
                                    break;
                                case e.Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:
                                    i.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !0
                            }
                            a.coordinatesMode !== e.Texture.SKYBOX_MODE && a.sphericalPolynomial && (i.USESPHERICALFROMREFLECTIONMAP = !0, this._forceIrradianceInFragment || o.getEngine().getCaps().maxVaryingVectors <= 8 ? i.USESPHERICALINVERTEX = !1 : i.USESPHERICALINVERTEX = !0)
                        } else i.REFLECTION = !1, i.REFLECTIONMAP_3D = !1, i.REFLECTIONMAP_SPHERICAL = !1, i.REFLECTIONMAP_PLANAR = !1, i.REFLECTIONMAP_CUBIC = !1, i.USE_LOCAL_REFLECTIONMAP_CUBIC = !1, i.REFLECTIONMAP_PROJECTION = !1, i.REFLECTIONMAP_SKYBOX = !1, i.REFLECTIONMAP_EXPLICIT = !1, i.REFLECTIONMAP_EQUIRECTANGULAR = !1, i.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, i.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, i.INVERTCUBICMAP = !1, i.USESPHERICALFROMREFLECTIONMAP = !1, i.USESPHERICALINVERTEX = !1, i.REFLECTIONMAP_OPPOSITEZ = !1, i.LODINREFLECTIONALPHA = !1, i.GAMMAREFLECTION = !1;
                        this._lightmapTexture && e.StandardMaterial.LightmapTextureEnabled ? (e.MaterialHelper.PrepareDefinesForMergedUV(this._lightmapTexture, i, "LIGHTMAP"), i.USELIGHTMAPASSHADOWMAP = this._useLightmapAsShadowmap) : i.LIGHTMAP = !1, this._emissiveTexture && e.StandardMaterial.EmissiveTextureEnabled ? e.MaterialHelper.PrepareDefinesForMergedUV(this._emissiveTexture, i, "EMISSIVE") : i.EMISSIVE = !1, e.StandardMaterial.SpecularTextureEnabled ? (this._metallicTexture ? (e.MaterialHelper.PrepareDefinesForMergedUV(this._metallicTexture, i, "REFLECTIVITY"), i.METALLICWORKFLOW = !0, i.ROUGHNESSSTOREINMETALMAPALPHA = this._useRoughnessFromMetallicTextureAlpha, i.ROUGHNESSSTOREINMETALMAPGREEN = !this._useRoughnessFromMetallicTextureAlpha && this._useRoughnessFromMetallicTextureGreen, i.METALLNESSSTOREINMETALMAPBLUE = this._useMetallnessFromMetallicTextureBlue, i.AOSTOREINMETALMAPRED = this._useAmbientOcclusionFromMetallicTextureRed) : this._reflectivityTexture ? (i.METALLICWORKFLOW = !1, e.MaterialHelper.PrepareDefinesForMergedUV(this._reflectivityTexture, i, "REFLECTIVITY"), i.MICROSURFACEFROMREFLECTIVITYMAP = this._useMicroSurfaceFromReflectivityMapAlpha, i.MICROSURFACEAUTOMATIC = this._useAutoMicroSurfaceFromReflectivityMap) : (i.METALLICWORKFLOW = !1, i.REFLECTIVITY = !1), this._microSurfaceTexture ? e.MaterialHelper.PrepareDefinesForMergedUV(this._microSurfaceTexture, i, "MICROSURFACEMAP") : i.MICROSURFACEMAP = !1) : (i.REFLECTIVITY = !1, i.MICROSURFACEMAP = !1), o.getEngine().getCaps().standardDerivatives && this._bumpTexture && e.StandardMaterial.BumpTextureEnabled && !this._disableBumpMap ? (e.MaterialHelper.PrepareDefinesForMergedUV(this._bumpTexture, i, "BUMP"), this._useParallax && this._albedoTexture && e.StandardMaterial.DiffuseTextureEnabled ? (i.PARALLAX = !0, i.PARALLAXOCCLUSION = !!this._useParallaxOcclusion) : i.PARALLAX = !1, i.OBJECTSPACE_NORMALMAP = this._useObjectSpaceNormalMap) : i.BUMP = !1;
                        var l = this._getRefractionTexture();
                        l && e.StandardMaterial.RefractionTextureEnabled ? (i.REFRACTION = !0, i.REFRACTIONMAP_3D = l.isCube, i.GAMMAREFRACTION = l.gammaSpace, i.REFRACTIONMAP_OPPOSITEZ = l.invertZ, i.LODINREFRACTIONALPHA = l.lodLevelInAlpha, this._linkRefractionWithTransparency && (i.LINKREFRACTIONTOTRANSPARENCY = !0)) : i.REFRACTION = !1, this._environmentBRDFTexture && e.StandardMaterial.ReflectionTextureEnabled ? i.ENVIRONMENTBRDF = !0 : i.ENVIRONMENTBRDF = !1, this._shouldUseAlphaFromAlbedoTexture() ? i.ALPHAFROMALBEDO = !0 : i.ALPHAFROMALBEDO = !1
                    }
                    i.SPECULAROVERALPHA = this._useSpecularOverAlpha, i.USEPHYSICALLIGHTFALLOFF = this._usePhysicalLightFalloff, i.RADIANCEOVERALPHA = this._useRadianceOverAlpha, this._forceMetallicWorkflow || void 0 !== this._metallic && null !== this._metallic || void 0 !== this._roughness && null !== this._roughness ? i.METALLICWORKFLOW = !0 : i.METALLICWORKFLOW = !1, !this.backFaceCulling && this._twoSidedLighting ? i.TWOSIDEDLIGHTING = !0 : i.TWOSIDEDLIGHTING = !1, i.ALPHATESTVALUE = this._alphaCutOff, i.PREMULTIPLYALPHA = this.alphaMode === e.Engine.ALPHA_PREMULTIPLIED || this.alphaMode === e.Engine.ALPHA_PREMULTIPLIED_PORTERDUFF, i.ALPHABLEND = this.needAlphaBlendingForMesh(t), i.ALPHAFRESNEL = this._useAlphaFresnel || this._useLinearAlphaFresnel, i.LINEARALPHAFRESNEL = this._useLinearAlphaFresnel
                }
                i._areImageProcessingDirty && this._imageProcessingConfiguration.prepareDefines(i), i.FORCENORMALFORWARD = this._forceNormalForward, i.RADIANCEOCCLUSION = this._useRadianceOcclusion, i.HORIZONOCCLUSION = this._useHorizonOcclusion, e.MaterialHelper.PrepareDefinesForMisc(t, o, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(t) || this._forceAlphaTest, i), e.MaterialHelper.PrepareDefinesForFrameBoundValues(o, s, i, !!r, n), e.MaterialHelper.PrepareDefinesForAttributes(t, i, !0, !0, !0, this._transparencyMode !== e.PBRMaterial.PBRMATERIAL_OPAQUE)
            }, r.prototype.forceCompilation = function(e, i, r) {
                var n = this,
                    o = __assign({
                        clipPlane: !1
                    }, r),
                    s = new t,
                    a = this._prepareEffect(e, s, void 0, void 0, void 0, o.clipPlane);
                a.isReady() ? i && i(this) : a.onCompileObservable.add((function() {
                    i && i(n)
                }))
            }, r.prototype.buildUniformLayout = function() {
                this._uniformBuffer.addUniform("vAlbedoInfos", 2), this._uniformBuffer.addUniform("vAmbientInfos", 3), this._uniformBuffer.addUniform("vOpacityInfos", 2), this._uniformBuffer.addUniform("vEmissiveInfos", 2), this._uniformBuffer.addUniform("vLightmapInfos", 2), this._uniformBuffer.addUniform("vReflectivityInfos", 3), this._uniformBuffer.addUniform("vMicroSurfaceSamplerInfos", 2), this._uniformBuffer.addUniform("vRefractionInfos", 4), this._uniformBuffer.addUniform("vReflectionInfos", 2), this._uniformBuffer.addUniform("vReflectionPosition", 3), this._uniformBuffer.addUniform("vReflectionSize", 3), this._uniformBuffer.addUniform("vBumpInfos", 3), this._uniformBuffer.addUniform("albedoMatrix", 16), this._uniformBuffer.addUniform("ambientMatrix", 16), this._uniformBuffer.addUniform("opacityMatrix", 16), this._uniformBuffer.addUniform("emissiveMatrix", 16), this._uniformBuffer.addUniform("lightmapMatrix", 16), this._uniformBuffer.addUniform("reflectivityMatrix", 16), this._uniformBuffer.addUniform("microSurfaceSamplerMatrix", 16), this._uniformBuffer.addUniform("bumpMatrix", 16), this._uniformBuffer.addUniform("vTangentSpaceParams", 2), this._uniformBuffer.addUniform("refractionMatrix", 16), this._uniformBuffer.addUniform("reflectionMatrix", 16), this._uniformBuffer.addUniform("vReflectionColor", 3), this._uniformBuffer.addUniform("vAlbedoColor", 4), this._uniformBuffer.addUniform("vLightingIntensity", 4), this._uniformBuffer.addUniform("vRefractionMicrosurfaceInfos", 3), this._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3), this._uniformBuffer.addUniform("vReflectivityColor", 4), this._uniformBuffer.addUniform("vEmissiveColor", 3), this._uniformBuffer.addUniform("pointSize", 1), this._uniformBuffer.create()
            }, r.prototype.unbind = function() {
                this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._uniformBuffer.setTexture("reflectionSampler", null), this._refractionTexture && this._refractionTexture.isRenderTarget && this._uniformBuffer.setTexture("refractionSampler", null), i.prototype.unbind.call(this)
            }, r.prototype.bindForSubMesh = function(t, i, r) {
                var n = this.getScene(),
                    o = r._materialDefines;
                if (o) {
                    var s = r.effect;
                    if (s) {
                        this._activeEffect = s, this.bindOnlyWorldMatrix(t), o.OBJECTSPACE_NORMALMAP && (t.toNormalMatrix(this._normalMatrix), this.bindOnlyNormalMatrix(this._normalMatrix));
                        var a = this._mustRebind(n, s, i.visibility);
                        e.MaterialHelper.BindBonesParameters(i, this._activeEffect);
                        var l = null;
                        if (a) {
                            this._uniformBuffer.bindToEffect(s, "Material"), this.bindViewProjection(s), l = this._getReflectionTexture();
                            var c = this._getRefractionTexture();
                            if (!this._uniformBuffer.useUbo || !this.isFrozen || !this._uniformBuffer.isSync) {
                                if (n.texturesEnabled) {
                                    if (this._albedoTexture && e.StandardMaterial.DiffuseTextureEnabled && (this._uniformBuffer.updateFloat2("vAlbedoInfos", this._albedoTexture.coordinatesIndex, this._albedoTexture.level), e.MaterialHelper.BindTextureMatrix(this._albedoTexture, this._uniformBuffer, "albedo")), this._ambientTexture && e.StandardMaterial.AmbientTextureEnabled && (this._uniformBuffer.updateFloat3("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level, this._ambientTextureStrength), e.MaterialHelper.BindTextureMatrix(this._ambientTexture, this._uniformBuffer, "ambient")), this._opacityTexture && e.StandardMaterial.OpacityTextureEnabled && (this._uniformBuffer.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level), e.MaterialHelper.BindTextureMatrix(this._opacityTexture, this._uniformBuffer, "opacity")), l && e.StandardMaterial.ReflectionTextureEnabled) {
                                        if (this._uniformBuffer.updateMatrix("reflectionMatrix", l.getReflectionTextureMatrix()), this._uniformBuffer.updateFloat2("vReflectionInfos", l.level, 0), l.boundingBoxSize) {
                                            var h = l;
                                            this._uniformBuffer.updateVector3("vReflectionPosition", h.boundingBoxPosition), this._uniformBuffer.updateVector3("vReflectionSize", h.boundingBoxSize)
                                        }
                                        var u = l.sphericalPolynomial;
                                        o.USESPHERICALFROMREFLECTIONMAP && u && (this._activeEffect.setFloat3("vSphericalX", u.x.x, u.x.y, u.x.z), this._activeEffect.setFloat3("vSphericalY", u.y.x, u.y.y, u.y.z), this._activeEffect.setFloat3("vSphericalZ", u.z.x, u.z.y, u.z.z), this._activeEffect.setFloat3("vSphericalXX_ZZ", u.xx.x - u.zz.x, u.xx.y - u.zz.y, u.xx.z - u.zz.z), this._activeEffect.setFloat3("vSphericalYY_ZZ", u.yy.x - u.zz.x, u.yy.y - u.zz.y, u.yy.z - u.zz.z), this._activeEffect.setFloat3("vSphericalZZ", u.zz.x, u.zz.y, u.zz.z), this._activeEffect.setFloat3("vSphericalXY", u.xy.x, u.xy.y, u.xy.z), this._activeEffect.setFloat3("vSphericalYZ", u.yz.x, u.yz.y, u.yz.z), this._activeEffect.setFloat3("vSphericalZX", u.zx.x, u.zx.y, u.zx.z)), this._uniformBuffer.updateFloat3("vReflectionMicrosurfaceInfos", l.getSize().width, l.lodGenerationScale, l.lodGenerationOffset)
                                    }
                                    if (this._emissiveTexture && e.StandardMaterial.EmissiveTextureEnabled && (this._uniformBuffer.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level), e.MaterialHelper.BindTextureMatrix(this._emissiveTexture, this._uniformBuffer, "emissive")), this._lightmapTexture && e.StandardMaterial.LightmapTextureEnabled && (this._uniformBuffer.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level), e.MaterialHelper.BindTextureMatrix(this._lightmapTexture, this._uniformBuffer, "lightmap")), e.StandardMaterial.SpecularTextureEnabled && (this._metallicTexture ? (this._uniformBuffer.updateFloat3("vReflectivityInfos", this._metallicTexture.coordinatesIndex, this._metallicTexture.level, this._ambientTextureStrength), e.MaterialHelper.BindTextureMatrix(this._metallicTexture, this._uniformBuffer, "reflectivity")) : this._reflectivityTexture && (this._uniformBuffer.updateFloat3("vReflectivityInfos", this._reflectivityTexture.coordinatesIndex, this._reflectivityTexture.level, 1), e.MaterialHelper.BindTextureMatrix(this._reflectivityTexture, this._uniformBuffer, "reflectivity")), this._microSurfaceTexture && (this._uniformBuffer.updateFloat2("vMicroSurfaceSamplerInfos", this._microSurfaceTexture.coordinatesIndex, this._microSurfaceTexture.level), e.MaterialHelper.BindTextureMatrix(this._microSurfaceTexture, this._uniformBuffer, "microSurfaceSampler"))), this._bumpTexture && n.getEngine().getCaps().standardDerivatives && e.StandardMaterial.BumpTextureEnabled && !this._disableBumpMap && (this._uniformBuffer.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, this._bumpTexture.level, this._parallaxScaleBias), e.MaterialHelper.BindTextureMatrix(this._bumpTexture, this._uniformBuffer, "bump"), n._mirroredCameraPosition ? this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1 : -1, this._invertNormalMapY ? 1 : -1) : this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1 : 1, this._invertNormalMapY ? -1 : 1)), c && e.StandardMaterial.RefractionTextureEnabled) {
                                        this._uniformBuffer.updateMatrix("refractionMatrix", c.getReflectionTextureMatrix());
                                        var f = 1;
                                        c.isCube || c.depth && (f = c.depth), this._uniformBuffer.updateFloat4("vRefractionInfos", c.level, this._indexOfRefraction, f, this._invertRefractionY ? -1 : 1), this._uniformBuffer.updateFloat3("vRefractionMicrosurfaceInfos", c.getSize().width, c.lodGenerationScale, c.lodGenerationOffset)
                                    }
                                }
                                this.pointsCloud && this._uniformBuffer.updateFloat("pointSize", this.pointSize), o.METALLICWORKFLOW ? (e.PBRMaterial._scaledReflectivity.r = void 0 === this._metallic || null === this._metallic ? 1 : this._metallic, e.PBRMaterial._scaledReflectivity.g = void 0 === this._roughness || null === this._roughness ? 1 : this._roughness, this._uniformBuffer.updateColor4("vReflectivityColor", e.PBRMaterial._scaledReflectivity, 0)) : this._uniformBuffer.updateColor4("vReflectivityColor", this._reflectivityColor, this._microSurface), this._uniformBuffer.updateColor3("vEmissiveColor", this._emissiveColor), this._uniformBuffer.updateColor3("vReflectionColor", this._reflectionColor), this._uniformBuffer.updateColor4("vAlbedoColor", this._albedoColor, this.alpha * i.visibility), this._lightingInfos.x = this._directIntensity, this._lightingInfos.y = this._emissiveIntensity, this._lightingInfos.z = this._environmentIntensity, this._lightingInfos.w = this._specularIntensity, this._uniformBuffer.updateVector4("vLightingIntensity", this._lightingInfos)
                            }
                            n.texturesEnabled && (this._albedoTexture && e.StandardMaterial.DiffuseTextureEnabled && this._uniformBuffer.setTexture("albedoSampler", this._albedoTexture), this._ambientTexture && e.StandardMaterial.AmbientTextureEnabled && this._uniformBuffer.setTexture("ambientSampler", this._ambientTexture), this._opacityTexture && e.StandardMaterial.OpacityTextureEnabled && this._uniformBuffer.setTexture("opacitySampler", this._opacityTexture), l && e.StandardMaterial.ReflectionTextureEnabled && (o.LODBASEDMICROSFURACE ? this._uniformBuffer.setTexture("reflectionSampler", l) : (this._uniformBuffer.setTexture("reflectionSampler", l._lodTextureMid || l), this._uniformBuffer.setTexture("reflectionSamplerLow", l._lodTextureLow || l), this._uniformBuffer.setTexture("reflectionSamplerHigh", l._lodTextureHigh || l))), o.ENVIRONMENTBRDF && this._uniformBuffer.setTexture("environmentBrdfSampler", this._environmentBRDFTexture), c && e.StandardMaterial.RefractionTextureEnabled && (o.LODBASEDMICROSFURACE ? this._uniformBuffer.setTexture("refractionSampler", c) : (this._uniformBuffer.setTexture("refractionSampler", c._lodTextureMid || c), this._uniformBuffer.setTexture("refractionSamplerLow", c._lodTextureLow || c), this._uniformBuffer.setTexture("refractionSamplerHigh", c._lodTextureHigh || c))), this._emissiveTexture && e.StandardMaterial.EmissiveTextureEnabled && this._uniformBuffer.setTexture("emissiveSampler", this._emissiveTexture), this._lightmapTexture && e.StandardMaterial.LightmapTextureEnabled && this._uniformBuffer.setTexture("lightmapSampler", this._lightmapTexture), e.StandardMaterial.SpecularTextureEnabled && (this._metallicTexture ? this._uniformBuffer.setTexture("reflectivitySampler", this._metallicTexture) : this._reflectivityTexture && this._uniformBuffer.setTexture("reflectivitySampler", this._reflectivityTexture), this._microSurfaceTexture && this._uniformBuffer.setTexture("microSurfaceSampler", this._microSurfaceTexture)), this._bumpTexture && n.getEngine().getCaps().standardDerivatives && e.StandardMaterial.BumpTextureEnabled && !this._disableBumpMap && this._uniformBuffer.setTexture("bumpSampler", this._bumpTexture)), e.MaterialHelper.BindClipPlane(this._activeEffect, n), n.ambientColor.multiplyToRef(this._ambientColor, this._globalAmbientColor);
                            var d = n._forcedViewPosition ? n._forcedViewPosition : n._mirroredCameraPosition ? n._mirroredCameraPosition : n.activeCamera.globalPosition,
                                p = n.useRightHandedSystem === (null != n._mirroredCameraPosition);
                            s.setFloat4("vEyePosition", d.x, d.y, d.z, p ? -1 : 1), s.setColor3("vAmbientColor", this._globalAmbientColor)
                        }!a && this.isFrozen || (n.lightsEnabled && !this._disableLighting && e.MaterialHelper.BindLights(n, i, this._activeEffect, o, this._maxSimultaneousLights, this._usePhysicalLightFalloff), (n.fogEnabled && i.applyFog && n.fogMode !== e.Scene.FOGMODE_NONE || l) && this.bindView(s), e.MaterialHelper.BindFogParameters(n, i, this._activeEffect), o.NUM_MORPH_INFLUENCERS && e.MaterialHelper.BindMorphTargetParameters(i, this._activeEffect), this._imageProcessingConfiguration.bind(this._activeEffect), e.MaterialHelper.BindLogDepth(o, this._activeEffect, n)), this._uniformBuffer.update(), this._afterBind(i)
                    }
                }
            }, r.prototype.getAnimatables = function() {
                var e = [];
                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._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0 && e.push(this._refractionTexture), e
            }, r.prototype._getReflectionTexture = function() {
                return this._reflectionTexture ? this._reflectionTexture : this.getScene().environmentTexture
            }, r.prototype._getRefractionTexture = function() {
                return this._refractionTexture ? this._refractionTexture : this._linkRefractionWithTransparency ? this.getScene().environmentTexture : null
            }, r.prototype.dispose = function(e, t) {
                t && (this._albedoTexture && this._albedoTexture.dispose(), this._ambientTexture && this._ambientTexture.dispose(), this._opacityTexture && this._opacityTexture.dispose(), this._reflectionTexture && this._reflectionTexture.dispose(), this._environmentBRDFTexture && this.getScene()._environmentBRDFTexture !== this._environmentBRDFTexture && this._environmentBRDFTexture.dispose(), this._emissiveTexture && this._emissiveTexture.dispose(), this._metallicTexture && this._metallicTexture.dispose(), this._reflectivityTexture && this._reflectivityTexture.dispose(), this._bumpTexture && this._bumpTexture.dispose(),
                    this._lightmapTexture && this._lightmapTexture.dispose(), this._refractionTexture && this._refractionTexture.dispose()), this._renderTargets.dispose(), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), i.prototype.dispose.call(this, e, t)
            }, r._scaledReflectivity = new e.Color3, __decorate([e.serializeAsImageProcessingConfiguration()], r.prototype, "_imageProcessingConfiguration", void 0), __decorate([e.serialize()], r.prototype, "useLogarithmicDepth", null), __decorate([e.serialize()], r.prototype, "transparencyMode", null), r
        })(e.PushMaterial);
    e.PBRBaseMaterial = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r) {
            var n = t.call(this, i, r) || this;
            return n.maxSimultaneousLights = 4, n.disableLighting = !1, n.invertNormalMapX = !1, n.invertNormalMapY = !1, n.emissiveColor = new e.Color3(0, 0, 0), n.occlusionStrength = 1, n.useLightmapAsShadowmap = !1, n._useAlphaFromAlbedoTexture = !0, n._useAmbientInGrayScale = !0, n
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "doubleSided", {
            get: function() {
                return this._twoSidedLighting
            },
            set: function(e) {
                this._twoSidedLighting !== e && (this._twoSidedLighting = e, this.backFaceCulling = !e, this._markAllSubMeshesAsTexturesDirty())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getActiveTextures = function() {
            var e = t.prototype.getActiveTextures.call(this);
            return this.environmentTexture && e.push(this.environmentTexture), this.normalTexture && e.push(this.normalTexture), this.emissiveTexture && e.push(this.emissiveTexture), this.occlusionTexture && e.push(this.occlusionTexture), this.lightmapTexture && e.push(this.lightmapTexture), e
        }, i.prototype.hasTexture = function(e) {
            return !!t.prototype.hasTexture.call(this, e) || this.lightmapTexture === e
        }, i.prototype.getClassName = function() {
            return "PBRBaseSimpleMaterial"
        }, __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsLightsDirty")], i.prototype, "maxSimultaneousLights", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsLightsDirty")], i.prototype, "disableLighting", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_reflectionTexture")], i.prototype, "environmentTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "invertNormalMapX", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "invertNormalMapY", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_bumpTexture")], i.prototype, "normalTexture", void 0), __decorate([e.serializeAsColor3("emissive"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "emissiveColor", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "emissiveTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_ambientTextureStrength")], i.prototype, "occlusionStrength", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_ambientTexture")], i.prototype, "occlusionTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_alphaCutOff")], i.prototype, "alphaCutOff", void 0), __decorate([e.serialize()], i.prototype, "doubleSided", null), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", null)], i.prototype, "lightmapTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useLightmapAsShadowmap", void 0), i
    })(e.PBRBaseMaterial);
    e.PBRBaseSimpleMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r) {
            var n = t.call(this, i, r) || this;
            return n.directIntensity = 1, n.emissiveIntensity = 1, n.environmentIntensity = 1, n.specularIntensity = 1, n.disableBumpMap = !1, n.ambientTextureStrength = 1, n.ambientColor = new e.Color3(0, 0, 0), n.albedoColor = new e.Color3(1, 1, 1), n.reflectivityColor = new e.Color3(1, 1, 1), n.reflectionColor = new e.Color3(1, 1, 1), n.emissiveColor = new e.Color3(0, 0, 0), n.microSurface = 1, n.indexOfRefraction = .66, n.invertRefractionY = !1, n.linkRefractionWithTransparency = !1, n.useLightmapAsShadowmap = !1, n.useAlphaFromAlbedoTexture = !1, n.forceAlphaTest = !1, n.alphaCutOff = .4, n.useSpecularOverAlpha = !0, n.useMicroSurfaceFromReflectivityMapAlpha = !1, n.useRoughnessFromMetallicTextureAlpha = !0, n.useRoughnessFromMetallicTextureGreen = !1, n.useMetallnessFromMetallicTextureBlue = !1, n.useAmbientOcclusionFromMetallicTextureRed = !1, n.useAmbientInGrayScale = !1, n.useAutoMicroSurfaceFromReflectivityMap = !1, n.usePhysicalLightFalloff = !0, n.useRadianceOverAlpha = !0, n.useObjectSpaceNormalMap = !1, n.useParallax = !1, n.useParallaxOcclusion = !1, n.parallaxScaleBias = .05, n.disableLighting = !1, n.forceIrradianceInFragment = !1, n.maxSimultaneousLights = 4, n.invertNormalMapX = !1, n.invertNormalMapY = !1, n.twoSidedLighting = !1, n.useAlphaFresnel = !1, n.useLinearAlphaFresnel = !1, n.environmentBRDFTexture = null, n.forceNormalForward = !1, n.useHorizonOcclusion = !0, n.useRadianceOcclusion = !0, n._environmentBRDFTexture = e.TextureTools.GetEnvironmentBRDFTexture(r), n
        }
        return __extends(i, t), Object.defineProperty(i, "PBRMATERIAL_OPAQUE", {
            get: function() {
                return this._PBRMATERIAL_OPAQUE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "PBRMATERIAL_ALPHATEST", {
            get: function() {
                return this._PBRMATERIAL_ALPHATEST
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "PBRMATERIAL_ALPHABLEND", {
            get: function() {
                return this._PBRMATERIAL_ALPHABLEND
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "PBRMATERIAL_ALPHATESTANDBLEND", {
            get: function() {
                return this._PBRMATERIAL_ALPHATESTANDBLEND
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "imageProcessingConfiguration", {
            get: function() {
                return this._imageProcessingConfiguration
            },
            set: function(e) {
                this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraColorCurvesEnabled", {
            get: function() {
                return this.imageProcessingConfiguration.colorCurvesEnabled
            },
            set: function(e) {
                this.imageProcessingConfiguration.colorCurvesEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraColorGradingEnabled", {
            get: function() {
                return this.imageProcessingConfiguration.colorGradingEnabled
            },
            set: function(e) {
                this.imageProcessingConfiguration.colorGradingEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraToneMappingEnabled", {
            get: function() {
                return this._imageProcessingConfiguration.toneMappingEnabled
            },
            set: function(e) {
                this._imageProcessingConfiguration.toneMappingEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraExposure", {
            get: function() {
                return this._imageProcessingConfiguration.exposure
            },
            set: function(e) {
                this._imageProcessingConfiguration.exposure = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraContrast", {
            get: function() {
                return this._imageProcessingConfiguration.contrast
            },
            set: function(e) {
                this._imageProcessingConfiguration.contrast = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraColorGradingTexture", {
            get: function() {
                return this._imageProcessingConfiguration.colorGradingTexture
            },
            set: function(e) {
                this._imageProcessingConfiguration.colorGradingTexture = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "cameraColorCurves", {
            get: function() {
                return this._imageProcessingConfiguration.colorCurves
            },
            set: function(e) {
                this._imageProcessingConfiguration.colorCurves = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "PBRMaterial"
        }, i.prototype.getActiveTextures = function() {
            var e = t.prototype.getActiveTextures.call(this);
            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._microSurfaceTexture && e.push(this._microSurfaceTexture), this._bumpTexture && e.push(this._bumpTexture), this._lightmapTexture && e.push(this._lightmapTexture), this._refractionTexture && e.push(this._refractionTexture), e
        }, i.prototype.hasTexture = function(e) {
            return !!t.prototype.hasTexture.call(this, e) || (this._albedoTexture === e || (this._ambientTexture === e || (this._opacityTexture === e || (this._reflectionTexture === e || (this._reflectivityTexture === e || (this._metallicTexture === e || (this._microSurfaceTexture === e || (this._bumpTexture === e || (this._lightmapTexture === e || this._refractionTexture === e)))))))))
        }, i.prototype.clone = function(t) {
            var r = this,
                n = e.SerializationHelper.Clone((function() {
                    return new i(t, r.getScene())
                }), this);
            return n.id = t, n.name = t, n
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.customType = "BABYLON.PBRMaterial", t
        }, i.Parse = function(t, r, n) {
            return e.SerializationHelper.Parse((function() {
                return new i(t.name, r)
            }), t, r, n)
        }, i._PBRMATERIAL_OPAQUE = 0, i._PBRMATERIAL_ALPHATEST = 1, i._PBRMATERIAL_ALPHABLEND = 2, i._PBRMATERIAL_ALPHATESTANDBLEND = 3, __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "directIntensity", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "emissiveIntensity", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "environmentIntensity", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "specularIntensity", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "disableBumpMap", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "albedoTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "ambientTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "ambientTextureStrength", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty")], i.prototype, "opacityTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "reflectionTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "emissiveTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "reflectivityTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "metallicTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "metallic", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "roughness", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "microSurfaceTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "bumpTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", null)], i.prototype, "lightmapTexture", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "refractionTexture", void 0), __decorate([e.serializeAsColor3("ambient"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "ambientColor", void 0), __decorate([e.serializeAsColor3("albedo"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "albedoColor", void 0), __decorate([e.serializeAsColor3("reflectivity"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "reflectivityColor", void 0), __decorate([e.serializeAsColor3("reflection"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "reflectionColor", void 0), __decorate([e.serializeAsColor3("emissive"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "emissiveColor", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "microSurface", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "indexOfRefraction", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "invertRefractionY", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "linkRefractionWithTransparency", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useLightmapAsShadowmap", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty")], i.prototype, "useAlphaFromAlbedoTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty")], i.prototype, "forceAlphaTest", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesAndMiscDirty")], i.prototype, "alphaCutOff", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useSpecularOverAlpha", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useMicroSurfaceFromReflectivityMapAlpha", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useRoughnessFromMetallicTextureAlpha", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useRoughnessFromMetallicTextureGreen", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useMetallnessFromMetallicTextureBlue", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useAmbientOcclusionFromMetallicTextureRed", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useAmbientInGrayScale", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useAutoMicroSurfaceFromReflectivityMap", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "usePhysicalLightFalloff", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useRadianceOverAlpha", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useObjectSpaceNormalMap", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useParallax", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useParallaxOcclusion", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "parallaxScaleBias", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsLightsDirty")], i.prototype, "disableLighting", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "forceIrradianceInFragment", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsLightsDirty")], i.prototype, "maxSimultaneousLights", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "invertNormalMapX", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "invertNormalMapY", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "twoSidedLighting", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useAlphaFresnel", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useLinearAlphaFresnel", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "environmentBRDFTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "forceNormalForward", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useHorizonOcclusion", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "useRadianceOcclusion", void 0), i
    })(e.PBRBaseMaterial);
    e.PBRMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i) {
            var r = t.call(this, e, i) || this;
            return r._useRoughnessFromMetallicTextureAlpha = !1, r._useRoughnessFromMetallicTextureGreen = !0, r._useMetallnessFromMetallicTextureBlue = !0, r._forceMetallicWorkflow = !0, r
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "PBRMetallicRoughnessMaterial"
        }, i.prototype.getActiveTextures = function() {
            var e = t.prototype.getActiveTextures.call(this);
            return this.baseTexture && e.push(this.baseTexture), this.metallicRoughnessTexture && e.push(this.metallicRoughnessTexture), e
        }, i.prototype.hasTexture = function(e) {
            return !!t.prototype.hasTexture.call(this, e) || (this.baseTexture === e || this.metallicRoughnessTexture === e)
        }, i.prototype.clone = function(t) {
            var r = this,
                n = e.SerializationHelper.Clone((function() {
                    return new i(t, r.getScene())
                }), this);
            return n.id = t, n.name = t, n
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.customType = "BABYLON.PBRMetallicRoughnessMaterial", t
        }, i.Parse = function(t, r, n) {
            return e.SerializationHelper.Parse((function() {
                return new i(t.name, r)
            }), t, r, n)
        }, __decorate([e.serializeAsColor3(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_albedoColor")], i.prototype, "baseColor", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_albedoTexture")], i.prototype, "baseTexture", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "metallic", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], i.prototype, "roughness", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_metallicTexture")], i.prototype, "metallicRoughnessTexture", void 0), i
    })(e.PBRBaseSimpleMaterial);
    e.PBRMetallicRoughnessMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i) {
            var r = t.call(this, e, i) || this;
            return r._useMicroSurfaceFromReflectivityMapAlpha = !0, r
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "PBRSpecularGlossinessMaterial"
        }, i.prototype.getActiveTextures = function() {
            var e = t.prototype.getActiveTextures.call(this);
            return this.diffuseTexture && e.push(this.diffuseTexture), this.specularGlossinessTexture && e.push(this.specularGlossinessTexture), e
        }, i.prototype.hasTexture = function(e) {
            return !!t.prototype.hasTexture.call(this, e) || (this.diffuseTexture === e || this.specularGlossinessTexture === e)
        }, i.prototype.clone = function(t) {
            var r = this,
                n = e.SerializationHelper.Clone((function() {
                    return new i(t, r.getScene())
                }), this);
            return n.id = t, n.name = t, n
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.customType = "BABYLON.PBRSpecularGlossinessMaterial", t
        }, i.Parse = function(t, r, n) {
            return e.SerializationHelper.Parse((function() {
                return new i(t.name, r)
            }), t, r, n)
        }, __decorate([e.serializeAsColor3("diffuse"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_albedoColor")], i.prototype, "diffuseColor", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_albedoTexture")], i.prototype, "diffuseTexture", void 0), __decorate([e.serializeAsColor3("specular"), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_reflectivityColor")], i.prototype, "specularColor", void 0), __decorate([e.serialize(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_microSurface")], i.prototype, "glossiness", void 0), __decorate([e.serializeAsTexture(), e.expandToProperty("_markAllSubMeshesAsTexturesDirty", "_reflectivityTexture")], i.prototype, "specularGlossinessTexture", void 0), i
    })(e.PBRBaseSimpleMaterial);
    e.PBRSpecularGlossinessMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    e.CameraInputTypes = {};
    var t = (function() {
        function t(e) {
            this.attached = {}, this.camera = e, this.checkInputs = function() {}
        }
        return t.prototype.add = function(t) {
            var i = t.getSimpleName();
            if (this.attached[i]) return void e.Tools.Warn("camera input of type " + i + " already exists on camera");
            this.attached[i] = t, t.camera = this.camera, t.checkInputs && (this.checkInputs = this._addCheckInputs(t.checkInputs.bind(t))), this.attachedElement && t.attachControl(this.attachedElement)
        }, t.prototype.remove = function(e) {
            for (var t in this.attached) {
                var i = this.attached[t];
                i === e && (i.detachControl(this.attachedElement), i.camera = null, delete this.attached[t], this.rebuildInputCheck())
            }
        }, t.prototype.removeByType = function(e) {
            for (var t in this.attached) {
                var i = this.attached[t];
                i.getClassName() === e && (i.detachControl(this.attachedElement), i.camera = null, delete this.attached[t], this.rebuildInputCheck())
            }
        }, t.prototype._addCheckInputs = function(e) {
            var t = this.checkInputs;
            return function() {
                t(), e()
            }
        }, t.prototype.attachInput = function(e) {
            this.attachedElement && e.attachControl(this.attachedElement, this.noPreventDefault)
        }, t.prototype.attachElement = function(t, i) {
            if (void 0 === i && (i = !1), !this.attachedElement) {
                i = !e.Camera.ForceAttachControlToAlwaysPreventDefault && i, this.attachedElement = t, this.noPreventDefault = i;
                for (var r in this.attached) this.attached[r].attachControl(t, i)
            }
        }, t.prototype.detachElement = function(e, t) {
            if (void 0 === t && (t = !1), this.attachedElement === e) {
                for (var i in this.attached) this.attached[i].detachControl(e), t && (this.attached[i].camera = null);
                this.attachedElement = null
            }
        }, t.prototype.rebuildInputCheck = function() {
            this.checkInputs = function() {};
            for (var e in this.attached) {
                var t = this.attached[e];
                t.checkInputs && (this.checkInputs = this._addCheckInputs(t.checkInputs.bind(t)))
            }
        }, t.prototype.clear = function() {
            this.attachedElement && this.detachElement(this.attachedElement, !0), this.attached = {}, this.attachedElement = null, this.checkInputs = function() {}
        }, t.prototype.serialize = function(t) {
            var i = {};
            for (var r in this.attached) {
                var n = this.attached[r],
                    o = e.SerializationHelper.Serialize(n);
                i[n.getClassName()] = o
            }
            t.inputsmgr = i
        }, t.prototype.parse = function(t) {
            var i = t.inputsmgr;
            if (i) {
                this.clear();
                for (var r in i) {
                    var n = e.CameraInputTypes[r];
                    if (n) {
                        var o = i[r],
                            s = e.SerializationHelper.Parse((function() {
                                return new n
                            }), o, null);
                        this.add(s)
                    }
                }
            } else
                for (var r in this.attached) {
                    var n = e.CameraInputTypes[this.attached[r].getClassName()];
                    if (n) {
                        var s = e.SerializationHelper.Parse((function() {
                            return new n
                        }), t, null);
                        this.remove(this.attached[r]), this.add(s)
                    }
                }
        }, t
    })();
    e.CameraInputsManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n) {
            var o = t.call(this, i, r, n) || this;
            return o.cameraDirection = new e.Vector3(0, 0, 0), o.cameraRotation = new e.Vector2(0, 0), o.rotation = new e.Vector3(0, 0, 0), o.speed = 2, o.noRotationConstraint = !1, o.lockedTarget = null, o._currentTarget = e.Vector3.Zero(), o._viewMatrix = e.Matrix.Zero(), o._camMatrix = e.Matrix.Zero(), o._cameraTransformMatrix = e.Matrix.Zero(), o._cameraRotationMatrix = e.Matrix.Zero(), o._referencePoint = new e.Vector3(0, 0, 1), o._currentUpVector = new e.Vector3(0, 1, 0), o._transformedReferencePoint = e.Vector3.Zero(), o._lookAtTemp = e.Matrix.Zero(), o._tempMatrix = e.Matrix.Zero(), o
        }
        return __extends(i, t), i.prototype.getFrontPosition = function(e) {
            this.getWorldMatrix();
            var t = this.getTarget().subtract(this.position);
            return t.normalize(), t.scaleInPlace(e), this.globalPosition.add(t)
        }, i.prototype._getLockedTargetPosition = function() {
            return this.lockedTarget ? (this.lockedTarget.absolutePosition && this.lockedTarget.computeWorldMatrix(), this.lockedTarget.absolutePosition || this.lockedTarget) : null
        }, i.prototype.storeState = function() {
            return this._storedPosition = this.position.clone(), this._storedRotation = this.rotation.clone(), this.rotationQuaternion && (this._storedRotationQuaternion = this.rotationQuaternion.clone()), t.prototype.storeState.call(this)
        }, i.prototype._restoreStateValues = function() {
            return !!t.prototype._restoreStateValues.call(this) && (this.position = this._storedPosition.clone(), this.rotation = this._storedRotation.clone(), this.rotationQuaternion && (this.rotationQuaternion = this._storedRotationQuaternion.clone()), this.cameraDirection.copyFromFloats(0, 0, 0), this.cameraRotation.copyFromFloats(0, 0), !0)
        }, i.prototype._initCache = function() {
            t.prototype._initCache.call(this), this._cache.lockedTarget = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.rotation = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.rotationQuaternion = new e.Quaternion(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)
        }, i.prototype._updateCache = function(e) {
            e || t.prototype._updateCache.call(this);
            var i = this._getLockedTargetPosition();
            i ? this._cache.lockedTarget ? this._cache.lockedTarget.copyFrom(i) : this._cache.lockedTarget = i.clone() : this._cache.lockedTarget = null, this._cache.rotation.copyFrom(this.rotation), this.rotationQuaternion && this._cache.rotationQuaternion.copyFrom(this.rotationQuaternion)
        }, i.prototype._isSynchronizedViewMatrix = function() {
            if (!t.prototype._isSynchronizedViewMatrix.call(this)) return !1;
            var e = this._getLockedTargetPosition();
            return (this._cache.lockedTarget ? this._cache.lockedTarget.equals(e) : !e) && (this.rotationQuaternion ? this.rotationQuaternion.equals(this._cache.rotationQuaternion) : this._cache.rotation.equals(this.rotation))
        }, i.prototype._computeLocalCameraSpeed = function() {
            var e = this.getEngine();
            return this.speed * Math.sqrt(e.getDeltaTime() / (100 * e.getFps()))
        }, i.prototype.setTarget = function(t) {
            this.upVector.normalize(), e.Matrix.LookAtLHToRef(this.position, t, this.upVector, this._camMatrix), this._camMatrix.invert(), this.rotation.x = Math.atan(this._camMatrix.m[6] / this._camMatrix.m[10]);
            var i = t.subtract(this.position);
            i.x >= 0 ? this.rotation.y = -Math.atan(i.z / i.x) + Math.PI / 2 : this.rotation.y = -Math.atan(i.z / i.x) - Math.PI / 2, this.rotation.z = 0, isNaN(this.rotation.x) && (this.rotation.x = 0), isNaN(this.rotation.y) && (this.rotation.y = 0), isNaN(this.rotation.z) && (this.rotation.z = 0), this.rotationQuaternion && e.Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this.rotationQuaternion)
        }, i.prototype.getTarget = function() {
            return this._currentTarget
        }, i.prototype._decideIfNeedsToMove = function() {
            return Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0
        }, i.prototype._updatePosition = function() {
            if (this.parent) return this.parent.getWorldMatrix().invertToRef(e.Tmp.Matrix[0]), e.Vector3.TransformNormalToRef(this.cameraDirection, e.Tmp.Matrix[0], e.Tmp.Vector3[0]), void this.position.addInPlace(e.Tmp.Vector3[0]);
            this.position.addInPlace(this.cameraDirection)
        }, i.prototype._checkInputs = function() {
            var i = this._decideIfNeedsToMove(),
                r = Math.abs(this.cameraRotation.x) > 0 || Math.abs(this.cameraRotation.y) > 0;
            if (i && this._updatePosition(), r) {
                if (this.rotation.x += this.cameraRotation.x, this.rotation.y += this.cameraRotation.y, this.rotationQuaternion) {
                    this.rotation.lengthSquared() && e.Quaternion.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this.rotationQuaternion)
                }
                if (!this.noRotationConstraint) {
                    var n = Math.PI / 2 * .95;
                    this.rotation.x > n && (this.rotation.x = n), this.rotation.x < -n && (this.rotation.x = -n)
                }
            }
            i && (Math.abs(this.cameraDirection.x) < this.speed * e.Epsilon && (this.cameraDirection.x = 0), Math.abs(this.cameraDirection.y) < this.speed * e.Epsilon && (this.cameraDirection.y = 0), Math.abs(this.cameraDirection.z) < this.speed * e.Epsilon && (this.cameraDirection.z = 0), this.cameraDirection.scaleInPlace(this.inertia)), r && (Math.abs(this.cameraRotation.x) < this.speed * e.Epsilon && (this.cameraRotation.x = 0), Math.abs(this.cameraRotation.y) < this.speed * e.Epsilon && (this.cameraRotation.y = 0), this.cameraRotation.scaleInPlace(this.inertia)), t.prototype._checkInputs.call(this)
        }, i.prototype._updateCameraRotationMatrix = function() {
            this.rotationQuaternion ? this.rotationQuaternion.toRotationMatrix(this._cameraRotationMatrix) : e.Matrix.RotationYawPitchRollToRef(this.rotation.y, this.rotation.x, this.rotation.z, this._cameraRotationMatrix), e.Vector3.TransformNormalToRef(this.upVector, this._cameraRotationMatrix, this._currentUpVector)
        }, i.prototype._getViewMatrix = function() {
            return this.lockedTarget && this.setTarget(this._getLockedTargetPosition()), this._updateCameraRotationMatrix(), e.Vector3.TransformCoordinatesToRef(this._referencePoint, this._cameraRotationMatrix, this._transformedReferencePoint), this.position.addToRef(this._transformedReferencePoint, this._currentTarget), this.getScene().useRightHandedSystem ? e.Matrix.LookAtRHToRef(this.position, this._currentTarget, this._currentUpVector, this._viewMatrix) : e.Matrix.LookAtLHToRef(this.position, this._currentTarget, this._currentUpVector, this._viewMatrix), this._viewMatrix
        }, i.prototype.createRigCamera = function(t, r) {
            if (this.cameraRigMode !== e.Camera.RIG_MODE_NONE) {
                var n = new i(t, this.position.clone(), this.getScene());
                return this.cameraRigMode !== e.Camera.RIG_MODE_VR && this.cameraRigMode !== e.Camera.RIG_MODE_WEBVR || (this.rotationQuaternion || (this.rotationQuaternion = new e.Quaternion), n._cameraRigParams = {}, n.rotationQuaternion = new e.Quaternion), n
            }
            return null
        }, i.prototype._updateRigCameras = function() {
            var i = this._rigCameras[0],
                r = this._rigCameras[1];
            switch (this.cameraRigMode) {
                case e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:
                case e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:
                case e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:
                case e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:
                    var n = this.cameraRigMode === e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED ? 1 : -1,
                        o = this.cameraRigMode === e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED ? -1 : 1;
                    this._getRigCamPosition(this._cameraRigParams.stereoHalfAngle * n, i.position), this._getRigCamPosition(this._cameraRigParams.stereoHalfAngle * o, r.position), i.setTarget(this.getTarget()), r.setTarget(this.getTarget());
                    break;
                case e.Camera.RIG_MODE_VR:
                    i.rotationQuaternion ? (i.rotationQuaternion.copyFrom(this.rotationQuaternion), r.rotationQuaternion.copyFrom(this.rotationQuaternion)) : (i.rotation.copyFrom(this.rotation), r.rotation.copyFrom(this.rotation)), i.position.copyFrom(this.position), r.position.copyFrom(this.position)
            }
            t.prototype._updateRigCameras.call(this)
        }, i.prototype._getRigCamPosition = function(t, i) {
            this._rigCamTransformMatrix || (this._rigCamTransformMatrix = new e.Matrix);
            var r = this.getTarget();
            e.Matrix.Translation(-r.x, -r.y, -r.z).multiplyToRef(e.Matrix.RotationY(t), this._rigCamTransformMatrix), this._rigCamTransformMatrix = this._rigCamTransformMatrix.multiply(e.Matrix.Translation(r.x, r.y, r.z)), e.Vector3.TransformCoordinatesToRef(this.position, this._rigCamTransformMatrix, i)
        }, i.prototype.getClassName = function() {
            return "TargetCamera"
        }, __decorate([e.serializeAsVector3()], i.prototype, "rotation", void 0), __decorate([e.serialize()], i.prototype, "speed", void 0), __decorate([e.serializeAsMeshReference("lockedTargetId")], i.prototype, "lockedTarget", void 0), i
    })(e.Camera);
    e.TargetCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            void 0 === e && (e = !0), this.touchEnabled = e, this.buttons = [0, 1, 2], this.angularSensibility = 2e3, this.previousPosition = null
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this,
                n = this.camera.getEngine();
            this._pointerInput || (this._pointerInput = function(o, s) {
                var a = o.event;
                if (!n.isInVRExclusivePointerMode && (r.touchEnabled || "touch" !== a.pointerType) && (o.type === e.PointerEventTypes.POINTERMOVE || -1 !== r.buttons.indexOf(a.button))) {
                    var l = a.srcElement || a.target;
                    if (o.type === e.PointerEventTypes.POINTERDOWN && l) {
                        try {
                            l.setPointerCapture(a.pointerId)
                        } catch (e) {}
                        r.previousPosition = {
                            x: a.clientX,
                            y: a.clientY
                        }, i || (a.preventDefault(), t.focus())
                    } else if (o.type === e.PointerEventTypes.POINTERUP && l) {
                        try {
                            l.releasePointerCapture(a.pointerId)
                        } catch (e) {}
                        r.previousPosition = null, i || a.preventDefault()
                    } else if (o.type === e.PointerEventTypes.POINTERMOVE) {
                        if (!r.previousPosition || n.isPointerLock) return;
                        var c = a.clientX - r.previousPosition.x,
                            h = a.clientY - r.previousPosition.y;
                        r.camera.getScene().useRightHandedSystem ? r.camera.cameraRotation.y -= c / r.angularSensibility : r.camera.cameraRotation.y += c / r.angularSensibility, r.camera.cameraRotation.x += h / r.angularSensibility, r.previousPosition = {
                            x: a.clientX,
                            y: a.clientY
                        }, i || a.preventDefault()
                    }
                }
            }), this._onMouseMove = function(e) {
                if (n.isPointerLock && !n.isInVRExclusivePointerMode) {
                    var t = e.movementX || e.mozMovementX || e.webkitMovementX || e.msMovementX || 0,
                        o = e.movementY || e.mozMovementY || e.webkitMovementY || e.msMovementY || 0;
                    r.camera.getScene().useRightHandedSystem ? r.camera.cameraRotation.y -= t / r.angularSensibility : r.camera.cameraRotation.y += t / r.angularSensibility, r.camera.cameraRotation.x += o / r.angularSensibility, r.previousPosition = null, i || e.preventDefault()
                }
            }, this._observer = this.camera.getScene().onPointerObservable.add(this._pointerInput, e.PointerEventTypes.POINTERDOWN | e.PointerEventTypes.POINTERUP | e.PointerEventTypes.POINTERMOVE), t.addEventListener("mousemove", this._onMouseMove, !1)
        }, t.prototype.detachControl = function(e) {
            this._observer && e && (this.camera.getScene().onPointerObservable.remove(this._observer), this._onMouseMove && e.removeEventListener("mousemove", this._onMouseMove), this._observer = null, this._onMouseMove = null, this.previousPosition = null)
        }, t.prototype.getClassName = function() {
            return "FreeCameraMouseInput"
        }, t.prototype.getSimpleName = function() {
            return "mouse"
        }, __decorate([e.serialize()], t.prototype, "buttons", void 0), __decorate([e.serialize()], t.prototype, "angularSensibility", void 0), t
    })();
    e.FreeCameraMouseInput = t, e.CameraInputTypes.FreeCameraMouseInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._keys = new Array, this.keysUp = [38], this.keysDown = [40], this.keysLeft = [37], this.keysRight = [39]
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this;
            this._onCanvasBlurObserver || (this._scene = this.camera.getScene(), this._engine = this._scene.getEngine(), this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add((function() {
                r._keys = []
            })), this._onKeyboardObserver = this._scene.onKeyboardObservable.add((function(t) {
                var n = t.event;
                if (t.type === e.KeyboardEventTypes.KEYDOWN) {
                    if (-1 !== r.keysUp.indexOf(n.keyCode) || -1 !== r.keysDown.indexOf(n.keyCode) || -1 !== r.keysLeft.indexOf(n.keyCode) || -1 !== r.keysRight.indexOf(n.keyCode)) {
                        var o = r._keys.indexOf(n.keyCode); - 1 === o && r._keys.push(n.keyCode), i || n.preventDefault()
                    }
                } else if (-1 !== r.keysUp.indexOf(n.keyCode) || -1 !== r.keysDown.indexOf(n.keyCode) || -1 !== r.keysLeft.indexOf(n.keyCode) || -1 !== r.keysRight.indexOf(n.keyCode)) {
                    var o = r._keys.indexOf(n.keyCode);
                    o >= 0 && r._keys.splice(o, 1), i || n.preventDefault()
                }
            })))
        }, t.prototype.detachControl = function(e) {
            this._scene && (this._onKeyboardObserver && this._scene.onKeyboardObservable.remove(this._onKeyboardObserver), this._onCanvasBlurObserver && this._engine.onCanvasBlurObservable.remove(this._onCanvasBlurObserver), this._onKeyboardObserver = null, this._onCanvasBlurObserver = null), this._keys = []
        }, t.prototype.checkInputs = function() {
            if (this._onKeyboardObserver)
                for (var t = this.camera, i = 0; i < this._keys.length; i++) {
                    var r = this._keys[i],
                        n = t._computeLocalCameraSpeed(); - 1 !== this.keysLeft.indexOf(r) ? t._localDirection.copyFromFloats(-n, 0, 0) : -1 !== this.keysUp.indexOf(r) ? t._localDirection.copyFromFloats(0, 0, n) : -1 !== this.keysRight.indexOf(r) ? t._localDirection.copyFromFloats(n, 0, 0) : -1 !== this.keysDown.indexOf(r) && t._localDirection.copyFromFloats(0, 0, -n), t.getScene().useRightHandedSystem && (t._localDirection.z *= -1), t.getViewMatrix().invertToRef(t._cameraTransformMatrix), e.Vector3.TransformNormalToRef(t._localDirection, t._cameraTransformMatrix, t._transformedDirection), t.cameraDirection.addInPlace(t._transformedDirection)
                }
        }, t.prototype.getClassName = function() {
            return "FreeCameraKeyboardMoveInput"
        }, t.prototype._onLostFocus = function(e) {
            this._keys = []
        }, t.prototype.getSimpleName = function() {
            return "keyboard"
        }, __decorate([e.serialize()], t.prototype, "keysUp", void 0), __decorate([e.serialize()], t.prototype, "keysDown", void 0), __decorate([e.serialize()], t.prototype, "keysLeft", void 0), __decorate([e.serialize()], t.prototype, "keysRight", void 0), t
    })();
    e.FreeCameraKeyboardMoveInput = t, e.CameraInputTypes.FreeCameraKeyboardMoveInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e) {
            return t.call(this, e) || this
        }
        return __extends(i, t), i.prototype.addKeyboard = function() {
            return this.add(new e.FreeCameraKeyboardMoveInput), this
        }, i.prototype.addMouse = function(t) {
            return void 0 === t && (t = !0), this.add(new e.FreeCameraMouseInput(t)), this
        }, i.prototype.addGamepad = function() {
            return this.add(new e.FreeCameraGamepadInput), this
        }, i.prototype.addDeviceOrientation = function() {
            return this.add(new e.FreeCameraDeviceOrientationInput), this
        }, i.prototype.addTouch = function() {
            return this.add(new e.FreeCameraTouchInput), this
        }, i.prototype.addVirtualJoystick = function() {
            return this.add(new e.FreeCameraVirtualJoystickInput), this
        }, i
    })(e.CameraInputsManager);
    e.FreeCameraInputsManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n) {
            var o = t.call(this, i, r, n) || this;
            return o.ellipsoid = new e.Vector3(.5, 1, .5), o.ellipsoidOffset = new e.Vector3(0, 0, 0), o.checkCollisions = !1, o.applyGravity = !1, o._needMoveForGravity = !1, o._oldPosition = e.Vector3.Zero(), o._diffPosition = e.Vector3.Zero(), o._newPosition = e.Vector3.Zero(), o._collisionMask = -1, o._onCollisionPositionChange = function(t, i, r) {
                void 0 === r && (r = null), o.getScene().workerCollisions && i.multiplyInPlace(o._collider._radius);
                !(function(t) {
                    o._newPosition.copyFrom(t), o._newPosition.subtractToRef(o._oldPosition, o._diffPosition), o._diffPosition.length() > e.Engine.CollisionsEpsilon && (o.position.addInPlace(o._diffPosition), o.onCollide && r && o.onCollide(r))
                })(i)
            }, o.inputs = new e.FreeCameraInputsManager(o), o.inputs.addKeyboard().addMouse(), o
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "angularSensibility", {
            get: function() {
                var e = this.inputs.attached.mouse;
                return e ? e.angularSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.mouse;
                t && (t.angularSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysUp", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysUp : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysUp = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysDown", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysDown : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysDown = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysLeft", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysLeft : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysLeft = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysRight", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysRight : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysRight = e)
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.attachControl = function(e, t) {
            this.inputs.attachElement(e, t)
        }, i.prototype.detachControl = function(t) {
            this.inputs.detachElement(t), this.cameraDirection = new e.Vector3(0, 0, 0), this.cameraRotation = new e.Vector2(0, 0)
        }, Object.defineProperty(i.prototype, "collisionMask", {
            get: function() {
                return this._collisionMask
            },
            set: function(e) {
                this._collisionMask = isNaN(e) ? -1 : e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._collideWithWorld = function(t) {
            var i;
            i = this.parent ? e.Vector3.TransformCoordinates(this.position, this.parent.getWorldMatrix()) : this.position, i.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition), this._oldPosition.addInPlace(this.ellipsoidOffset), this._collider || (this._collider = new e.Collider), this._collider._radius = this.ellipsoid, this._collider.collisionMask = this._collisionMask;
            var r = t;
            this.applyGravity && (r = t.add(this.getScene().gravity)), this.getScene().collisionCoordinator.getNewPosition(this._oldPosition, r, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId)
        }, i.prototype._checkInputs = function() {
            this._localDirection || (this._localDirection = e.Vector3.Zero(), this._transformedDirection = e.Vector3.Zero()), this.inputs.checkInputs(), t.prototype._checkInputs.call(this)
        }, i.prototype._decideIfNeedsToMove = function() {
            return this._needMoveForGravity || Math.abs(this.cameraDirection.x) > 0 || Math.abs(this.cameraDirection.y) > 0 || Math.abs(this.cameraDirection.z) > 0
        }, i.prototype._updatePosition = function() {
            this.checkCollisions && this.getScene().collisionsEnabled ? this._collideWithWorld(this.cameraDirection) : t.prototype._updatePosition.call(this)
        }, i.prototype.dispose = function() {
            this.inputs.clear(), t.prototype.dispose.call(this)
        }, i.prototype.getClassName = function() {
            return "FreeCamera"
        }, __decorate([e.serializeAsVector3()], i.prototype, "ellipsoid", void 0), __decorate([e.serializeAsVector3()], i.prototype, "ellipsoidOffset", void 0), __decorate([e.serialize()], i.prototype, "checkCollisions", void 0), __decorate([e.serialize()], i.prototype, "applyGravity", void 0), i
    })(e.TargetCamera);
    e.FreeCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._keys = new Array, this.keysUp = [38], this.keysDown = [40], this.keysLeft = [37], this.keysRight = [39], this.keysReset = [220], this.panningSensibility = 50, this.zoomingSensibility = 25, this.useAltToZoom = !0
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this;
            this._onCanvasBlurObserver || (this._scene = this.camera.getScene(), this._engine = this._scene.getEngine(), this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add((function() {
                r._keys = []
            })), this._onKeyboardObserver = this._scene.onKeyboardObservable.add((function(t) {
                var n = t.event;
                if (t.type === e.KeyboardEventTypes.KEYDOWN) {
                    if (r._ctrlPressed = n.ctrlKey, r._altPressed = n.altKey, -1 !== r.keysUp.indexOf(n.keyCode) || -1 !== r.keysDown.indexOf(n.keyCode) || -1 !== r.keysLeft.indexOf(n.keyCode) || -1 !== r.keysRight.indexOf(n.keyCode) || -1 !== r.keysReset.indexOf(n.keyCode)) {
                        var o = r._keys.indexOf(n.keyCode); - 1 === o && r._keys.push(n.keyCode), n.preventDefault && (i || n.preventDefault())
                    }
                } else if (-1 !== r.keysUp.indexOf(n.keyCode) || -1 !== r.keysDown.indexOf(n.keyCode) || -1 !== r.keysLeft.indexOf(n.keyCode) || -1 !== r.keysRight.indexOf(n.keyCode) || -1 !== r.keysReset.indexOf(n.keyCode)) {
                    var o = r._keys.indexOf(n.keyCode);
                    o >= 0 && r._keys.splice(o, 1), n.preventDefault && (i || n.preventDefault())
                }
            })))
        }, t.prototype.detachControl = function(e) {
            this._scene && (this._onKeyboardObserver && this._scene.onKeyboardObservable.remove(this._onKeyboardObserver), this._onCanvasBlurObserver && this._engine.onCanvasBlurObservable.remove(this._onCanvasBlurObserver), this._onKeyboardObserver = null, this._onCanvasBlurObserver = null), this._keys = []
        }, t.prototype.checkInputs = function() {
            if (this._onKeyboardObserver)
                for (var e = this.camera, t = 0; t < this._keys.length; t++) {
                    var i = this._keys[t]; - 1 !== this.keysLeft.indexOf(i) ? this._ctrlPressed && this.camera._useCtrlForPanning ? e.inertialPanningX -= 1 / this.panningSensibility : e.inertialAlphaOffset -= .01 : -1 !== this.keysUp.indexOf(i) ? this._ctrlPressed && this.camera._useCtrlForPanning ? e.inertialPanningY += 1 / this.panningSensibility : this._altPressed && this.useAltToZoom ? e.inertialRadiusOffset += 1 / this.zoomingSensibility : e.inertialBetaOffset -= .01 : -1 !== this.keysRight.indexOf(i) ? this._ctrlPressed && this.camera._useCtrlForPanning ? e.inertialPanningX += 1 / this.panningSensibility : e.inertialAlphaOffset += .01 : -1 !== this.keysDown.indexOf(i) ? this._ctrlPressed && this.camera._useCtrlForPanning ? e.inertialPanningY -= 1 / this.panningSensibility : this._altPressed && this.useAltToZoom ? e.inertialRadiusOffset -= 1 / this.zoomingSensibility : e.inertialBetaOffset += .01 : -1 !== this.keysReset.indexOf(i) && e.restoreState()
                }
        }, t.prototype.getClassName = function() {
            return "ArcRotateCameraKeyboardMoveInput"
        }, t.prototype.getSimpleName = function() {
            return "keyboard"
        }, __decorate([e.serialize()], t.prototype, "keysUp", void 0), __decorate([e.serialize()], t.prototype, "keysDown", void 0), __decorate([e.serialize()], t.prototype, "keysLeft", void 0), __decorate([e.serialize()], t.prototype, "keysRight", void 0), __decorate([e.serialize()], t.prototype, "keysReset", void 0), __decorate([e.serialize()], t.prototype, "panningSensibility", void 0), __decorate([e.serialize()], t.prototype, "zoomingSensibility", void 0), __decorate([e.serialize()], t.prototype, "useAltToZoom", void 0), t
    })();
    e.ArcRotateCameraKeyboardMoveInput = t, e.CameraInputTypes.ArcRotateCameraKeyboardMoveInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.wheelPrecision = 3, this.wheelDeltaPercentage = 0
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this;
            this._wheel = function(t, n) {
                if (t.type === e.PointerEventTypes.POINTERWHEEL) {
                    var o = t.event,
                        s = 0;
                    o.wheelDelta ? s = r.wheelDeltaPercentage ? .01 * o.wheelDelta * r.camera.radius * r.wheelDeltaPercentage : o.wheelDelta / (40 * r.wheelPrecision) : o.detail && (s = -o.detail / r.wheelPrecision), s && (r.camera.inertialRadiusOffset += s), o.preventDefault && (i || o.preventDefault())
                }
            }, this._observer = this.camera.getScene().onPointerObservable.add(this._wheel, e.PointerEventTypes.POINTERWHEEL)
        }, t.prototype.detachControl = function(e) {
            this._observer && e && (this.camera.getScene().onPointerObservable.remove(this._observer), this._observer = null, this._wheel = null)
        }, t.prototype.getClassName = function() {
            return "ArcRotateCameraMouseWheelInput"
        }, t.prototype.getSimpleName = function() {
            return "mousewheel"
        }, __decorate([e.serialize()], t.prototype, "wheelPrecision", void 0), __decorate([e.serialize()], t.prototype, "wheelDeltaPercentage", void 0), t
    })();
    e.ArcRotateCameraMouseWheelInput = t, e.CameraInputTypes.ArcRotateCameraMouseWheelInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.buttons = [0, 1, 2], this.angularSensibilityX = 1e3, this.angularSensibilityY = 1e3, this.pinchPrecision = 12, this.pinchDeltaPercentage = 0, this.panningSensibility = 1e3, this.multiTouchPanning = !0, this.multiTouchPanAndZoom = !0, this._isPanClick = !1, this.pinchInwards = !0
        }
        return t.prototype.attachControl = function(t, i) {
            var r, n = this,
                o = this.camera.getEngine(),
                s = null,
                a = null,
                l = 0,
                c = 0,
                h = 0,
                u = {
                    x: 0,
                    y: 0,
                    isPaning: !1,
                    isPinching: !1
                };
            this._pointerInput = function(f, d) {
                var p = f.event,
                    _ = "touch" === f.event.pointerType;
                if (!o.isInVRExclusivePointerMode && (f.type === e.PointerEventTypes.POINTERMOVE || -1 !== n.buttons.indexOf(p.button))) {
                    var m = p.srcElement || p.target;
                    if (f.type === e.PointerEventTypes.POINTERDOWN && m) {
                        try {
                            m.setPointerCapture(p.pointerId)
                        } catch (e) {}
                        n._isPanClick = p.button === n.camera._panningMouseButton, r = {
                            x: p.clientX,
                            y: p.clientY,
                            pointerId: p.pointerId,
                            type: p.pointerType
                        }, null === s ? s = r : null === a && (a = r), i || (p.preventDefault(), t.focus())
                    } else if (f.type === e.PointerEventTypes.POINTERDOUBLETAP) n.camera.restoreState();
                    else if (f.type === e.PointerEventTypes.POINTERUP && m) {
                        try {
                            m.releasePointerCapture(p.pointerId)
                        } catch (e) {}
                        r = null, l = 0, u.isPaning = !1, u.isPinching = !1, h = 0, c = 0, _ || (a = null), o.badOS ? s = a = null : a && s && s.pointerId == p.pointerId ? (s = a, a = null, r = {
                            x: s.x,
                            y: s.y,
                            pointerId: s.pointerId,
                            type: p.pointerType
                        }) : s && a && a.pointerId == p.pointerId ? (a = null, r = {
                            x: s.x,
                            y: s.y,
                            pointerId: s.pointerId,
                            type: p.pointerType
                        }) : s = a = null, i || p.preventDefault()
                    } else if (f.type === e.PointerEventTypes.POINTERMOVE)
                        if (i || p.preventDefault(), s && null === a && r) {
                            if (0 !== n.panningSensibility && (p.ctrlKey && n.camera._useCtrlForPanning || n._isPanClick)) n.camera.inertialPanningX += -(p.clientX - r.x) / n.panningSensibility, n.camera.inertialPanningY += (p.clientY - r.y) / n.panningSensibility;
                            else {
                                var g = p.clientX - r.x,
                                    v = p.clientY - r.y;
                                n.camera.inertialAlphaOffset -= g / n.angularSensibilityX, n.camera.inertialBetaOffset -= v / n.angularSensibilityY
                            }
                            r.x = p.clientX, r.y = p.clientY
                        } else if (s && a) {
                        var y = s.pointerId === p.pointerId ? s : a;
                        y.x = p.clientX, y.y = p.clientY;
                        var b = n.pinchInwards ? 1 : -1,
                            x = s.x - a.x,
                            T = s.y - a.y,
                            E = x * x + T * T,
                            A = Math.sqrt(E);
                        if (0 === l) return c = A, l = E, u.x = (s.x + a.x) / 2, void(u.y = (s.y + a.y) / 2);
                        if (n.multiTouchPanAndZoom) {
                            if (n.pinchDeltaPercentage ? n.camera.inertialRadiusOffset += .001 * (E - l) * n.camera.radius * n.pinchDeltaPercentage : n.camera.inertialRadiusOffset += (E - l) / (n.pinchPrecision * ((n.angularSensibilityX + n.angularSensibilityY) / 2) * b), 0 !== n.panningSensibility) {
                                var P = (s.x + a.x) / 2,
                                    M = (s.y + a.y) / 2,
                                    S = P - u.x,
                                    C = M - u.y;
                                u.x = P, u.y = M, n.camera.inertialPanningX += -S / n.panningSensibility, n.camera.inertialPanningY += C / n.panningSensibility
                            }
                        } else {
                            if (h++, u.isPinching || h < 20 && Math.abs(A - c) > n.camera.pinchToPanMaxDistance) n.pinchDeltaPercentage ? n.camera.inertialRadiusOffset += .001 * (E - l) * n.camera.radius * n.pinchDeltaPercentage : n.camera.inertialRadiusOffset += (E - l) / (n.pinchPrecision * ((n.angularSensibilityX + n.angularSensibilityY) / 2) * b), u.isPaning = !1, u.isPinching = !0;
                            else if (r && r.pointerId === y.pointerId && 0 !== n.panningSensibility && n.multiTouchPanning) {
                                if (!u.isPaning) return u.isPaning = !0, u.isPinching = !1, u.x = y.x, void(u.y = y.y);
                                n.camera.inertialPanningX += -(y.x - u.x) / n.panningSensibility, n.camera.inertialPanningY += (y.y - u.y) / n.panningSensibility
                            }
                            r && r.pointerId === p.pointerId && (u.x = y.x, u.y = y.y)
                        }
                        l = E
                    }
                }
            }, this._observer = this.camera.getScene().onPointerObservable.add(this._pointerInput, e.PointerEventTypes.POINTERDOWN | e.PointerEventTypes.POINTERUP | e.PointerEventTypes.POINTERMOVE | e.PointerEventTypes._POINTERDOUBLETAP), this._onContextMenu = function(e) {
                e.preventDefault()
            }, this.camera._useCtrlForPanning || t.addEventListener("contextmenu", this._onContextMenu, !1), this._onLostFocus = function() {
                s = a = null, l = 0, u.isPaning = !1, u.isPinching = !1, h = 0, r = null, c = 0
            }, this._onMouseMove = function(e) {
                if (o.isPointerLock) {
                    var t = e.movementX || e.mozMovementX || e.webkitMovementX || e.msMovementX || 0,
                        r = e.movementY || e.mozMovementY || e.webkitMovementY || e.msMovementY || 0;
                    n.camera.inertialAlphaOffset -= t / n.angularSensibilityX, n.camera.inertialBetaOffset -= r / n.angularSensibilityY, i || e.preventDefault()
                }
            }, this._onGestureStart = function(e) {
                void 0 !== window.MSGesture && (n._MSGestureHandler || (n._MSGestureHandler = new MSGesture, n._MSGestureHandler.target = t), n._MSGestureHandler.addPointer(e.pointerId))
            }, this._onGesture = function(e) {
                n.camera.radius *= e.scale, e.preventDefault && (i || (e.stopPropagation(), e.preventDefault()))
            }, t.addEventListener("mousemove", this._onMouseMove, !1), t.addEventListener("MSPointerDown", this._onGestureStart, !1), t.addEventListener("MSGestureChange", this._onGesture, !1), e.Tools.RegisterTopRootEvents([{
                name: "blur",
                handler: this._onLostFocus
            }])
        }, t.prototype.detachControl = function(t) {
            this._onLostFocus && e.Tools.UnregisterTopRootEvents([{
                name: "blur",
                handler: this._onLostFocus
            }]), t && this._observer && (this.camera.getScene().onPointerObservable.remove(this._observer), this._observer = null, this._onContextMenu && t.removeEventListener("contextmenu", this._onContextMenu), this._onMouseMove && t.removeEventListener("mousemove", this._onMouseMove), this._onGestureStart && t.removeEventListener("MSPointerDown", this._onGestureStart), this._onGesture && t.removeEventListener("MSGestureChange", this._onGesture), this._isPanClick = !1, this.pinchInwards = !0, this._onMouseMove = null, this._onGestureStart = null, this._onGesture = null, this._MSGestureHandler = null, this._onLostFocus = null, this._onContextMenu = null)
        }, t.prototype.getClassName = function() {
            return "ArcRotateCameraPointersInput"
        }, t.prototype.getSimpleName = function() {
            return "pointers"
        }, __decorate([e.serialize()], t.prototype, "buttons", void 0), __decorate([e.serialize()], t.prototype, "angularSensibilityX", void 0), __decorate([e.serialize()], t.prototype, "angularSensibilityY", void 0), __decorate([e.serialize()], t.prototype, "pinchPrecision", void 0), __decorate([e.serialize()], t.prototype, "pinchDeltaPercentage", void 0), __decorate([e.serialize()], t.prototype, "panningSensibility", void 0), __decorate([e.serialize()], t.prototype, "multiTouchPanning", void 0), __decorate([e.serialize()], t.prototype, "multiTouchPanAndZoom", void 0), t
    })();
    e.ArcRotateCameraPointersInput = t, e.CameraInputTypes.ArcRotateCameraPointersInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e) {
            return t.call(this, e) || this
        }
        return __extends(i, t), i.prototype.addMouseWheel = function() {
            return this.add(new e.ArcRotateCameraMouseWheelInput), this
        }, i.prototype.addPointers = function() {
            return this.add(new e.ArcRotateCameraPointersInput), this
        }, i.prototype.addKeyboard = function() {
            return this.add(new e.ArcRotateCameraKeyboardMoveInput), this
        }, i.prototype.addGamepad = function() {
            return this.add(new e.ArcRotateCameraGamepadInput), this
        }, i.prototype.addVRDeviceOrientation = function() {
            return this.add(new e.ArcRotateCameraVRDeviceOrientationInput), this
        }, i
    })(e.CameraInputsManager);
    e.ArcRotateCameraInputsManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a) {
            var l = t.call(this, i, e.Vector3.Zero(), a) || this;
            return l.inertialAlphaOffset = 0, l.inertialBetaOffset = 0, l.inertialRadiusOffset = 0, l.lowerAlphaLimit = null, l.upperAlphaLimit = null, l.lowerBetaLimit = .01, l.upperBetaLimit = Math.PI, l.lowerRadiusLimit = null, l.upperRadiusLimit = null, l.inertialPanningX = 0, l.inertialPanningY = 0, l.pinchToPanMaxDistance = 20, l.panningDistanceLimit = null, l.panningOriginTarget = e.Vector3.Zero(), l.panningInertia = .9, l.zoomOnFactor = 1, l.targetScreenOffset = e.Vector2.Zero(), l.allowUpsideDown = !0, l._viewMatrix = new e.Matrix, l.panningAxis = new e.Vector3(1, 1, 0), l.onMeshTargetChangedObservable = new e.Observable, l.checkCollisions = !1, l.collisionRadius = new e.Vector3(.5, .5, .5), l._previousPosition = e.Vector3.Zero(), l._collisionVelocity = e.Vector3.Zero(), l._newPosition = e.Vector3.Zero(), l._onCollisionPositionChange = function(t, i, r) {
                void 0 === r && (r = null), l.getScene().workerCollisions && l.checkCollisions && i.multiplyInPlace(l._collider._radius), r ? (l.setPosition(i), l.onCollide && l.onCollide(r)) : l._previousPosition.copyFrom(l.position);
                var n = Math.cos(l.alpha),
                    o = Math.sin(l.alpha),
                    s = Math.cos(l.beta),
                    a = Math.sin(l.beta);
                0 === a && (a = 1e-4);
                var c = l._getTargetPosition();
                c.addToRef(new e.Vector3(l.radius * n * a, l.radius * s, l.radius * o * a), l._newPosition), l.position.copyFrom(l._newPosition);
                var h = l.upVector;
                l.allowUpsideDown && l.beta < 0 && (h = h.clone(), h = h.negate()), e.Matrix.LookAtLHToRef(l.position, c, h, l._viewMatrix), l._viewMatrix.m[12] += l.targetScreenOffset.x, l._viewMatrix.m[13] += l.targetScreenOffset.y, l._collisionTriggered = !1
            }, l._target = e.Vector3.Zero(), s && l.setTarget(s), l.alpha = r, l.beta = n, l.radius = o, l.getViewMatrix(), l.inputs = new e.ArcRotateCameraInputsManager(l), l.inputs.addKeyboard().addMouseWheel().addPointers(), l
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "target", {
            get: function() {
                return this._target
            },
            set: function(e) {
                this.setTarget(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "angularSensibilityX", {
            get: function() {
                var e = this.inputs.attached.pointers;
                return e ? e.angularSensibilityX : 0
            },
            set: function(e) {
                var t = this.inputs.attached.pointers;
                t && (t.angularSensibilityX = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "angularSensibilityY", {
            get: function() {
                var e = this.inputs.attached.pointers;
                return e ? e.angularSensibilityY : 0
            },
            set: function(e) {
                var t = this.inputs.attached.pointers;
                t && (t.angularSensibilityY = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "pinchPrecision", {
            get: function() {
                var e = this.inputs.attached.pointers;
                return e ? e.pinchPrecision : 0
            },
            set: function(e) {
                var t = this.inputs.attached.pointers;
                t && (t.pinchPrecision = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "pinchDeltaPercentage", {
            get: function() {
                var e = this.inputs.attached.pointers;
                return e ? e.pinchDeltaPercentage : 0
            },
            set: function(e) {
                var t = this.inputs.attached.pointers;
                t && (t.pinchDeltaPercentage = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "panningSensibility", {
            get: function() {
                var e = this.inputs.attached.pointers;
                return e ? e.panningSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.pointers;
                t && (t.panningSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysUp", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysUp : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysUp = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysDown", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysDown : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysDown = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysLeft", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysLeft : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysLeft = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "keysRight", {
            get: function() {
                var e = this.inputs.attached.keyboard;
                return e ? e.keysRight : []
            },
            set: function(e) {
                var t = this.inputs.attached.keyboard;
                t && (t.keysRight = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "wheelPrecision", {
            get: function() {
                var e = this.inputs.attached.mousewheel;
                return e ? e.wheelPrecision : 0
            },
            set: function(e) {
                var t = this.inputs.attached.mousewheel;
                t && (t.wheelPrecision = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "wheelDeltaPercentage", {
            get: function() {
                var e = this.inputs.attached.mousewheel;
                return e ? e.wheelDeltaPercentage : 0
            },
            set: function(e) {
                var t = this.inputs.attached.mousewheel;
                t && (t.wheelDeltaPercentage = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "bouncingBehavior", {
            get: function() {
                return this._bouncingBehavior
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "useBouncingBehavior", {
            get: function() {
                return null != this._bouncingBehavior
            },
            set: function(t) {
                t !== this.useBouncingBehavior && (t ? (this._bouncingBehavior = new e.BouncingBehavior, this.addBehavior(this._bouncingBehavior)) : this._bouncingBehavior && (this.removeBehavior(this._bouncingBehavior), this._bouncingBehavior = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "framingBehavior", {
            get: function() {
                return this._framingBehavior
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "useFramingBehavior", {
            get: function() {
                return null != this._framingBehavior
            },
            set: function(t) {
                t !== this.useFramingBehavior && (t ? (this._framingBehavior = new e.FramingBehavior, this.addBehavior(this._framingBehavior)) : this._framingBehavior && (this.removeBehavior(this._framingBehavior), this._framingBehavior = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "autoRotationBehavior", {
            get: function() {
                return this._autoRotationBehavior
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "useAutoRotationBehavior", {
            get: function() {
                return null != this._autoRotationBehavior
            },
            set: function(t) {
                t !== this.useAutoRotationBehavior && (t ? (this._autoRotationBehavior = new e.AutoRotationBehavior, this.addBehavior(this._autoRotationBehavior)) : this._autoRotationBehavior && (this.removeBehavior(this._autoRotationBehavior), this._autoRotationBehavior = null))
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._initCache = function() {
            t.prototype._initCache.call(this), this._cache._target = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), this._cache.alpha = void 0, this._cache.beta = void 0, this._cache.radius = void 0, this._cache.targetScreenOffset = e.Vector2.Zero()
        }, i.prototype._updateCache = function(e) {
            e || t.prototype._updateCache.call(this), this._cache._target.copyFrom(this._getTargetPosition()), this._cache.alpha = this.alpha, this._cache.beta = this.beta, this._cache.radius = this.radius, this._cache.targetScreenOffset.copyFrom(this.targetScreenOffset)
        }, i.prototype._getTargetPosition = function() {
            if (this._targetHost && this._targetHost.getAbsolutePosition) {
                var e = this._targetHost.getAbsolutePosition();
                this._targetBoundingCenter ? e.addToRef(this._targetBoundingCenter, this._target) : this._target.copyFrom(e)
            }
            var t = this._getLockedTargetPosition();
            return t || this._target
        }, i.prototype.storeState = function() {
            return this._storedAlpha = this.alpha, this._storedBeta = this.beta, this._storedRadius = this.radius, this._storedTarget = this._getTargetPosition().clone(), t.prototype.storeState.call(this)
        }, i.prototype._restoreStateValues = function() {
            return !!t.prototype._restoreStateValues.call(this) && (this.alpha = this._storedAlpha, this.beta = this._storedBeta, this.radius = this._storedRadius, this.setTarget(this._storedTarget.clone()), this.inertialAlphaOffset = 0, this.inertialBetaOffset = 0, this.inertialRadiusOffset = 0, this.inertialPanningX = 0, this.inertialPanningY = 0, !0)
        }, i.prototype._isSynchronizedViewMatrix = function() {
            return !!t.prototype._isSynchronizedViewMatrix.call(this) && (this._cache._target.equals(this._getTargetPosition()) && this._cache.alpha === this.alpha && this._cache.beta === this.beta && this._cache.radius === this.radius && this._cache.targetScreenOffset.equals(this.targetScreenOffset))
        }, i.prototype.attachControl = function(e, t, i, r) {
            var n = this;
            void 0 === i && (i = !0), void 0 === r && (r = 2), this._useCtrlForPanning = i, this._panningMouseButton = r, this.inputs.attachElement(e, t), this._reset = function() {
                n.inertialAlphaOffset = 0, n.inertialBetaOffset = 0, n.inertialRadiusOffset = 0, n.inertialPanningX = 0, n.inertialPanningY = 0
            }
        }, i.prototype.detachControl = function(e) {
            this.inputs.detachElement(e), this._reset && this._reset()
        }, i.prototype._checkInputs = function() {
            if (!this._collisionTriggered) {
                if (this.inputs.checkInputs(), 0 === this.inertialAlphaOffset && 0 === this.inertialBetaOffset && 0 === this.inertialRadiusOffset || (this.getScene().useRightHandedSystem ? this.alpha -= this.beta <= 0 ? -this.inertialAlphaOffset : this.inertialAlphaOffset : this.alpha += this.beta <= 0 ? -this.inertialAlphaOffset : this.inertialAlphaOffset, this.beta += this.inertialBetaOffset, this.radius -= this.inertialRadiusOffset, this.inertialAlphaOffset *= this.inertia, this.inertialBetaOffset *= this.inertia, this.inertialRadiusOffset *= this.inertia, Math.abs(this.inertialAlphaOffset) < e.Epsilon && (this.inertialAlphaOffset = 0), Math.abs(this.inertialBetaOffset) < e.Epsilon && (this.inertialBetaOffset = 0), Math.abs(this.inertialRadiusOffset) < this.speed * e.Epsilon && (this.inertialRadiusOffset = 0)), 0 !== this.inertialPanningX || 0 !== this.inertialPanningY) {
                    if (this._localDirection || (this._localDirection = e.Vector3.Zero(), this._transformedDirection = e.Vector3.Zero()), this._localDirection.copyFromFloats(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY), this._localDirection.multiplyInPlace(this.panningAxis), this._viewMatrix.invertToRef(this._cameraTransformMatrix), e.Vector3.TransformNormalToRef(this._localDirection, this._cameraTransformMatrix, this._transformedDirection), this.panningAxis.y || (this._transformedDirection.y = 0), !this._targetHost)
                        if (this.panningDistanceLimit) {
                            this._transformedDirection.addInPlace(this._target);
                            var i = e.Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget);
                            i <= this.panningDistanceLimit * this.panningDistanceLimit && this._target.copyFrom(this._transformedDirection)
                        } else this._target.addInPlace(this._transformedDirection);
                    this.inertialPanningX *= this.panningInertia, this.inertialPanningY *= this.panningInertia, Math.abs(this.inertialPanningX) < this.speed * e.Epsilon && (this.inertialPanningX = 0), Math.abs(this.inertialPanningY) < this.speed * e.Epsilon && (this.inertialPanningY = 0)
                }
                this._checkLimits(), t.prototype._checkInputs.call(this)
            }
        }, i.prototype._checkLimits = function() {
            null === this.lowerBetaLimit || void 0 === this.lowerBetaLimit ? this.allowUpsideDown && this.beta > Math.PI && (this.beta = this.beta - 2 * Math.PI) : this.beta < this.lowerBetaLimit && (this.beta = this.lowerBetaLimit), null === this.upperBetaLimit || void 0 === this.upperBetaLimit ? this.allowUpsideDown && this.beta < -Math.PI && (this.beta = this.beta + 2 * Math.PI) : this.beta > this.upperBetaLimit && (this.beta = this.upperBetaLimit), this.lowerAlphaLimit && this.alpha < this.lowerAlphaLimit && (this.alpha = this.lowerAlphaLimit), this.upperAlphaLimit && this.alpha > this.upperAlphaLimit && (this.alpha = this.upperAlphaLimit), this.lowerRadiusLimit && this.radius < this.lowerRadiusLimit && (this.radius = this.lowerRadiusLimit), this.upperRadiusLimit && this.radius > this.upperRadiusLimit && (this.radius = this.upperRadiusLimit)
        }, i.prototype.rebuildAnglesAndRadius = function() {
            var e = this.position.subtract(this._getTargetPosition());
            this.radius = e.length(), 0 === this.radius && (this.radius = 1e-4), this.alpha = Math.acos(e.x / Math.sqrt(Math.pow(e.x, 2) + Math.pow(e.z, 2))), e.z < 0 && (this.alpha = 2 * Math.PI - this.alpha), this.beta = Math.acos(e.y / this.radius), this._checkLimits()
        }, i.prototype.setPosition = function(e) {
            this.position.equals(e) || (this.position.copyFrom(e), this.rebuildAnglesAndRadius())
        }, i.prototype.setTarget = function(e, t, i) {
            if (void 0 === t && (t = !1), void 0 === i && (i = !1), e.getBoundingInfo) this._targetBoundingCenter = t ? e.getBoundingInfo().boundingBox.centerWorld.clone() : null,
                this._targetHost = e, this._target = this._getTargetPosition(), this.onMeshTargetChangedObservable.notifyObservers(this._targetHost);
            else {
                var r = e,
                    n = this._getTargetPosition();
                if (n && !i && n.equals(r)) return;
                this._targetHost = null, this._target = r, this._targetBoundingCenter = null, this.onMeshTargetChangedObservable.notifyObservers(null)
            }
            this.rebuildAnglesAndRadius()
        }, i.prototype._getViewMatrix = function() {
            var t = Math.cos(this.alpha),
                i = Math.sin(this.alpha),
                r = Math.cos(this.beta),
                n = Math.sin(this.beta);
            0 === n && (n = 1e-4);
            var o = this._getTargetPosition();
            if (o.addToRef(new e.Vector3(this.radius * t * n, this.radius * r, this.radius * i * n), this._newPosition), this.getScene().collisionsEnabled && this.checkCollisions) this._collider || (this._collider = new e.Collider), this._collider._radius = this.collisionRadius, this._newPosition.subtractToRef(this.position, this._collisionVelocity), this._collisionTriggered = !0, this.getScene().collisionCoordinator.getNewPosition(this.position, this._collisionVelocity, this._collider, 3, null, this._onCollisionPositionChange, this.uniqueId);
            else {
                this.position.copyFrom(this._newPosition);
                var s = this.upVector;
                this.allowUpsideDown && n < 0 && (s = s.clone(), s = s.negate()), this.getScene().useRightHandedSystem ? e.Matrix.LookAtRHToRef(this.position, o, s, this._viewMatrix) : e.Matrix.LookAtLHToRef(this.position, o, s, this._viewMatrix), this._viewMatrix.m[12] += this.targetScreenOffset.x, this._viewMatrix.m[13] += this.targetScreenOffset.y
            }
            return this._currentTarget = o, this._viewMatrix
        }, i.prototype.zoomOn = function(t, i) {
            void 0 === i && (i = !1), t = t || this.getScene().meshes;
            var r = e.Mesh.MinMax(t),
                n = e.Vector3.Distance(r.min, r.max);
            this.radius = n * this.zoomOnFactor, this.focusOn({
                min: r.min,
                max: r.max,
                distance: n
            }, i)
        }, i.prototype.focusOn = function(t, i) {
            void 0 === i && (i = !1);
            var r, n;
            if (void 0 === t.min) {
                var o = t || this.getScene().meshes;
                r = e.Mesh.MinMax(o), n = e.Vector3.Distance(r.min, r.max)
            } else {
                var s = t;
                r = s, n = s.distance
            }
            this._target = e.Mesh.Center(r), i || (this.maxZ = 2 * n)
        }, i.prototype.createRigCamera = function(t, r) {
            var n = 0;
            switch (this.cameraRigMode) {
                case e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:
                case e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:
                case e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:
                case e.Camera.RIG_MODE_VR:
                    n = this._cameraRigParams.stereoHalfAngle * (0 === r ? 1 : -1);
                    break;
                case e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:
                    n = this._cameraRigParams.stereoHalfAngle * (0 === r ? -1 : 1)
            }
            var o = new i(t, this.alpha + n, this.beta, this.radius, this._target, this.getScene());
            return o._cameraRigParams = {}, o
        }, i.prototype._updateRigCameras = function() {
            var i = this._rigCameras[0],
                r = this._rigCameras[1];
            switch (i.beta = r.beta = this.beta, i.radius = r.radius = this.radius, this.cameraRigMode) {
                case e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH:
                case e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL:
                case e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER:
                case e.Camera.RIG_MODE_VR:
                    i.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle, r.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle;
                    break;
                case e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_CROSSEYED:
                    i.alpha = this.alpha + this._cameraRigParams.stereoHalfAngle, r.alpha = this.alpha - this._cameraRigParams.stereoHalfAngle
            }
            t.prototype._updateRigCameras.call(this)
        }, i.prototype.dispose = function() {
            this.inputs.clear(), t.prototype.dispose.call(this)
        }, i.prototype.getClassName = function() {
            return "ArcRotateCamera"
        }, __decorate([e.serialize()], i.prototype, "alpha", void 0), __decorate([e.serialize()], i.prototype, "beta", void 0), __decorate([e.serialize()], i.prototype, "radius", void 0), __decorate([e.serializeAsVector3("target")], i.prototype, "_target", void 0), __decorate([e.serialize()], i.prototype, "inertialAlphaOffset", void 0), __decorate([e.serialize()], i.prototype, "inertialBetaOffset", void 0), __decorate([e.serialize()], i.prototype, "inertialRadiusOffset", void 0), __decorate([e.serialize()], i.prototype, "lowerAlphaLimit", void 0), __decorate([e.serialize()], i.prototype, "upperAlphaLimit", void 0), __decorate([e.serialize()], i.prototype, "lowerBetaLimit", void 0), __decorate([e.serialize()], i.prototype, "upperBetaLimit", void 0), __decorate([e.serialize()], i.prototype, "lowerRadiusLimit", void 0), __decorate([e.serialize()], i.prototype, "upperRadiusLimit", void 0), __decorate([e.serialize()], i.prototype, "inertialPanningX", void 0), __decorate([e.serialize()], i.prototype, "inertialPanningY", void 0), __decorate([e.serialize()], i.prototype, "pinchToPanMaxDistance", void 0), __decorate([e.serialize()], i.prototype, "panningDistanceLimit", void 0), __decorate([e.serializeAsVector3()], i.prototype, "panningOriginTarget", void 0), __decorate([e.serialize()], i.prototype, "panningInertia", void 0), __decorate([e.serialize()], i.prototype, "zoomOnFactor", void 0), __decorate([e.serialize()], i.prototype, "allowUpsideDown", void 0), i
    })(e.TargetCamera);
    e.ArcRotateCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n) {
            var o = t.call(this, i, n) || this;
            return o.groundColor = new e.Color3(0, 0, 0), o.direction = r || e.Vector3.Up(), o
        }
        return __extends(i, t), i.prototype._buildUniformLayout = function() {
            this._uniformBuffer.addUniform("vLightData", 4), this._uniformBuffer.addUniform("vLightDiffuse", 4), this._uniformBuffer.addUniform("vLightSpecular", 3), this._uniformBuffer.addUniform("vLightGround", 3), this._uniformBuffer.addUniform("shadowsInfo", 3), this._uniformBuffer.addUniform("depthValues", 2), this._uniformBuffer.create()
        }, i.prototype.getClassName = function() {
            return "HemisphericLight"
        }, i.prototype.setDirectionToTarget = function(t) {
            return this.direction = e.Vector3.Normalize(t.subtract(e.Vector3.Zero())), this.direction
        }, i.prototype.getShadowGenerator = function() {
            return null
        }, i.prototype.transferToEffect = function(t, i) {
            var r = e.Vector3.Normalize(this.direction);
            return this._uniformBuffer.updateFloat4("vLightData", r.x, r.y, r.z, 0, i), this._uniformBuffer.updateColor3("vLightGround", this.groundColor.scale(this.intensity), i), this
        }, i.prototype._getWorldMatrix = function() {
            return this._worldMatrix || (this._worldMatrix = e.Matrix.Identity()), this._worldMatrix
        }, i.prototype.getTypeID = function() {
            return e.Light.LIGHTTYPEID_HEMISPHERICLIGHT
        }, __decorate([e.serializeAsColor3()], i.prototype, "groundColor", void 0), __decorate([e.serializeAsVector3()], i.prototype, "direction", void 0), i
    })(e.Light);
    e.HemisphericLight = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i() {
            var e = null !== t && t.apply(this, arguments) || this;
            return e._needProjectionMatrixCompute = !0, e
        }
        return __extends(i, t), i.prototype._setPosition = function(e) {
            this._position = e
        }, Object.defineProperty(i.prototype, "position", {
            get: function() {
                return this._position
            },
            set: function(e) {
                this._setPosition(e)
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._setDirection = function(e) {
            this._direction = e
        }, Object.defineProperty(i.prototype, "direction", {
            get: function() {
                return this._direction
            },
            set: function(e) {
                this._setDirection(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "shadowMinZ", {
            get: function() {
                return this._shadowMinZ
            },
            set: function(e) {
                this._shadowMinZ = e, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "shadowMaxZ", {
            get: function() {
                return this._shadowMaxZ
            },
            set: function(e) {
                this._shadowMaxZ = e, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.computeTransformedInformation = function() {
            return !(!this.parent || !this.parent.getWorldMatrix) && (this.transformedPosition || (this.transformedPosition = e.Vector3.Zero()), e.Vector3.TransformCoordinatesToRef(this.position, this.parent.getWorldMatrix(), this.transformedPosition), this.direction && (this.transformedDirection || (this.transformedDirection = e.Vector3.Zero()), e.Vector3.TransformNormalToRef(this.direction, this.parent.getWorldMatrix(), this.transformedDirection)), !0)
        }, i.prototype.getDepthScale = function() {
            return 50
        }, i.prototype.getShadowDirection = function(e) {
            return this.transformedDirection ? this.transformedDirection : this.direction
        }, i.prototype.getAbsolutePosition = function() {
            return this.transformedPosition ? this.transformedPosition : this.position
        }, i.prototype.setDirectionToTarget = function(t) {
            return this.direction = e.Vector3.Normalize(t.subtract(this.position)), this.direction
        }, i.prototype.getRotation = function() {
            this.direction.normalize();
            var t = e.Vector3.Cross(this.direction, e.Axis.Y),
                i = e.Vector3.Cross(t, this.direction);
            return e.Vector3.RotationFromAxis(t, i, this.direction)
        }, i.prototype.needCube = function() {
            return !1
        }, i.prototype.needProjectionMatrixCompute = function() {
            return this._needProjectionMatrixCompute
        }, i.prototype.forceProjectionMatrixCompute = function() {
            this._needProjectionMatrixCompute = !0
        }, i.prototype._getWorldMatrix = function() {
            return this._worldMatrix || (this._worldMatrix = e.Matrix.Identity()), e.Matrix.TranslationToRef(this.position.x, this.position.y, this.position.z, this._worldMatrix), this._worldMatrix
        }, i.prototype.getDepthMinZ = function(e) {
            return void 0 !== this.shadowMinZ ? this.shadowMinZ : e.minZ
        }, i.prototype.getDepthMaxZ = function(e) {
            return void 0 !== this.shadowMaxZ ? this.shadowMaxZ : e.maxZ
        }, i.prototype.setShadowProjectionMatrix = function(e, t, i) {
            return this.customProjectionMatrixBuilder ? this.customProjectionMatrixBuilder(t, i, e) : this._setDefaultShadowProjectionMatrix(e, t, i), this
        }, __decorate([e.serializeAsVector3()], i.prototype, "position", null), __decorate([e.serializeAsVector3()], i.prototype, "direction", null), __decorate([e.serialize()], i.prototype, "shadowMinZ", null), __decorate([e.serialize()], i.prototype, "shadowMaxZ", null), i
    })(e.Light);
    e.ShadowLight = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i, r) {
            var n = t.call(this, e, r) || this;
            return n._shadowAngle = Math.PI / 2, n.position = i, n
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "shadowAngle", {
            get: function() {
                return this._shadowAngle
            },
            set: function(e) {
                this._shadowAngle = e, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "direction", {
            get: function() {
                return this._direction
            },
            set: function(e) {
                var t = this.needCube();
                this._direction = e, this.needCube() !== t && this._shadowGenerator && this._shadowGenerator.recreateShadowMap()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "PointLight"
        }, i.prototype.getTypeID = function() {
            return e.Light.LIGHTTYPEID_POINTLIGHT
        }, i.prototype.needCube = function() {
            return !this.direction
        }, i.prototype.getShadowDirection = function(i) {
            if (this.direction) return t.prototype.getShadowDirection.call(this, i);
            switch (i) {
                case 0:
                    return new e.Vector3(1, 0, 0);
                case 1:
                    return new e.Vector3(-1, 0, 0);
                case 2:
                    return new e.Vector3(0, -1, 0);
                case 3:
                    return new e.Vector3(0, 1, 0);
                case 4:
                    return new e.Vector3(0, 0, 1);
                case 5:
                    return new e.Vector3(0, 0, -1)
            }
            return e.Vector3.Zero()
        }, i.prototype._setDefaultShadowProjectionMatrix = function(t, i, r) {
            var n = this.getScene().activeCamera;
            n && e.Matrix.PerspectiveFovLHToRef(this.shadowAngle, 1, this.getDepthMinZ(n), this.getDepthMaxZ(n), t)
        }, i.prototype._buildUniformLayout = function() {
            this._uniformBuffer.addUniform("vLightData", 4), this._uniformBuffer.addUniform("vLightDiffuse", 4), this._uniformBuffer.addUniform("vLightSpecular", 3), this._uniformBuffer.addUniform("shadowsInfo", 3), this._uniformBuffer.addUniform("depthValues", 2), this._uniformBuffer.create()
        }, i.prototype.transferToEffect = function(e, t) {
            return this.computeTransformedInformation() ? (this._uniformBuffer.updateFloat4("vLightData", this.transformedPosition.x, this.transformedPosition.y, this.transformedPosition.z, 0, t), this) : (this._uniformBuffer.updateFloat4("vLightData", this.position.x, this.position.y, this.position.z, 0, t), this)
        }, __decorate([e.serialize()], i.prototype, "shadowAngle", null), i
    })(e.ShadowLight);
    e.PointLight = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i, r) {
            var n = t.call(this, e, r) || this;
            return n._shadowFrustumSize = 0, n._shadowOrthoScale = .5, n.autoUpdateExtends = !0, n._orthoLeft = Number.MAX_VALUE, n._orthoRight = Number.MIN_VALUE, n._orthoTop = Number.MIN_VALUE, n._orthoBottom = Number.MAX_VALUE, n.position = i.scale(-1), n.direction = i, n
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "shadowFrustumSize", {
            get: function() {
                return this._shadowFrustumSize
            },
            set: function(e) {
                this._shadowFrustumSize = e, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "shadowOrthoScale", {
            get: function() {
                return this._shadowOrthoScale
            },
            set: function(e) {
                this._shadowOrthoScale = e, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "DirectionalLight"
        }, i.prototype.getTypeID = function() {
            return e.Light.LIGHTTYPEID_DIRECTIONALLIGHT
        }, i.prototype._setDefaultShadowProjectionMatrix = function(e, t, i) {
            this.shadowFrustumSize > 0 ? this._setDefaultFixedFrustumShadowProjectionMatrix(e, t) : this._setDefaultAutoExtendShadowProjectionMatrix(e, t, i)
        }, i.prototype._setDefaultFixedFrustumShadowProjectionMatrix = function(t, i) {
            var r = this.getScene().activeCamera;
            r && e.Matrix.OrthoLHToRef(this.shadowFrustumSize, this.shadowFrustumSize, void 0 !== this.shadowMinZ ? this.shadowMinZ : r.minZ, void 0 !== this.shadowMaxZ ? this.shadowMaxZ : r.maxZ, t)
        }, i.prototype._setDefaultAutoExtendShadowProjectionMatrix = function(t, i, r) {
            var n = this.getScene().activeCamera;
            if (n) {
                if (this.autoUpdateExtends || this._orthoLeft === Number.MAX_VALUE) {
                    var o = e.Vector3.Zero();
                    this._orthoLeft = Number.MAX_VALUE, this._orthoRight = Number.MIN_VALUE, this._orthoTop = Number.MIN_VALUE, this._orthoBottom = Number.MAX_VALUE;
                    for (var s = 0; s < r.length; s++) {
                        var a = r[s];
                        if (a)
                            for (var l = a.getBoundingInfo(), c = l.boundingBox, h = 0; h < c.vectorsWorld.length; h++) e.Vector3.TransformCoordinatesToRef(c.vectorsWorld[h], i, o), o.x < this._orthoLeft && (this._orthoLeft = o.x), o.y < this._orthoBottom && (this._orthoBottom = o.y), o.x > this._orthoRight && (this._orthoRight = o.x), o.y > this._orthoTop && (this._orthoTop = o.y)
                    }
                }
                var u = this._orthoRight - this._orthoLeft,
                    f = this._orthoTop - this._orthoBottom;
                e.Matrix.OrthoOffCenterLHToRef(this._orthoLeft - u * this.shadowOrthoScale, this._orthoRight + u * this.shadowOrthoScale, this._orthoBottom - f * this.shadowOrthoScale, this._orthoTop + f * this.shadowOrthoScale, void 0 !== this.shadowMinZ ? this.shadowMinZ : n.minZ, void 0 !== this.shadowMaxZ ? this.shadowMaxZ : n.maxZ, t)
            }
        }, i.prototype._buildUniformLayout = function() {
            this._uniformBuffer.addUniform("vLightData", 4), this._uniformBuffer.addUniform("vLightDiffuse", 4), this._uniformBuffer.addUniform("vLightSpecular", 3), this._uniformBuffer.addUniform("shadowsInfo", 3), this._uniformBuffer.addUniform("depthValues", 2), this._uniformBuffer.create()
        }, i.prototype.transferToEffect = function(e, t) {
            return this.computeTransformedInformation() ? (this._uniformBuffer.updateFloat4("vLightData", this.transformedDirection.x, this.transformedDirection.y, this.transformedDirection.z, 1, t), this) : (this._uniformBuffer.updateFloat4("vLightData", this.direction.x, this.direction.y, this.direction.z, 1, t), this)
        }, i.prototype.getDepthMinZ = function(e) {
            return 1
        }, i.prototype.getDepthMaxZ = function(e) {
            return 1
        }, __decorate([e.serialize()], i.prototype, "shadowFrustumSize", null), __decorate([e.serialize()], i.prototype, "shadowOrthoScale", null), __decorate([e.serialize()], i.prototype, "autoUpdateExtends", void 0), i
    })(e.ShadowLight);
    e.DirectionalLight = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a) {
            var l = t.call(this, i, a) || this;
            return l._projectionTextureMatrix = e.Matrix.Zero(), l._projectionTextureLightNear = 1e-6, l._projectionTextureLightFar = 1e3, l._projectionTextureUpDirection = e.Vector3.Up(), l._projectionTextureViewLightDirty = !0, l._projectionTextureProjectionLightDirty = !0, l._projectionTextureDirty = !0, l._projectionTextureViewTargetVector = e.Vector3.Zero(), l._projectionTextureViewLightMatrix = e.Matrix.Zero(), l._projectionTextureProjectionLightMatrix = e.Matrix.Zero(), l._projectionTextureScalingMatrix = e.Matrix.FromValues(.5, 0, 0, 0, 0, .5, 0, 0, 0, 0, .5, 0, .5, .5, .5, 1), l.position = r, l.direction = n, l.angle = o, l.exponent = s, l
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "angle", {
            get: function() {
                return this._angle
            },
            set: function(e) {
                this._angle = e, this._projectionTextureProjectionLightDirty = !0, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "shadowAngleScale", {
            get: function() {
                return this._shadowAngleScale
            },
            set: function(e) {
                this._shadowAngleScale = e, this.forceProjectionMatrixCompute()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "projectionTextureMatrix", {
            get: function() {
                return this._projectionTextureMatrix
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "projectionTextureLightNear", {
            get: function() {
                return this._projectionTextureLightNear
            },
            set: function(e) {
                this._projectionTextureLightNear = e, this._projectionTextureProjectionLightDirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "projectionTextureLightFar", {
            get: function() {
                return this._projectionTextureLightFar
            },
            set: function(e) {
                this._projectionTextureLightFar = e, this._projectionTextureProjectionLightDirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "projectionTextureUpDirection", {
            get: function() {
                return this._projectionTextureUpDirection
            },
            set: function(e) {
                this._projectionTextureUpDirection = e, this._projectionTextureProjectionLightDirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "projectionTexture", {
            get: function() {
                return this._projectionTexture
            },
            set: function(e) {
                this._projectionTexture = e, this._projectionTextureDirty = !0
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "SpotLight"
        }, i.prototype.getTypeID = function() {
            return e.Light.LIGHTTYPEID_SPOTLIGHT
        }, i.prototype._setDirection = function(e) {
            t.prototype._setDirection.call(this, e), this._projectionTextureViewLightDirty = !0
        }, i.prototype._setPosition = function(e) {
            t.prototype._setPosition.call(this, e), this._projectionTextureViewLightDirty = !0
        }, i.prototype._setDefaultShadowProjectionMatrix = function(t, i, r) {
            var n = this.getScene().activeCamera;
            if (n) {
                this._shadowAngleScale = this._shadowAngleScale || 1;
                var o = this._shadowAngleScale * this._angle;
                e.Matrix.PerspectiveFovLHToRef(o, 1, this.getDepthMinZ(n), this.getDepthMaxZ(n), t)
            }
        }, i.prototype._computeProjectionTextureViewLightMatrix = function() {
            this._projectionTextureViewLightDirty = !1, this._projectionTextureDirty = !0, this.position.addToRef(this.direction, this._projectionTextureViewTargetVector), e.Matrix.LookAtLHToRef(this.position, this._projectionTextureViewTargetVector, this._projectionTextureUpDirection, this._projectionTextureViewLightMatrix)
        }, i.prototype._computeProjectionTextureProjectionLightMatrix = function() {
            this._projectionTextureProjectionLightDirty = !1, this._projectionTextureDirty = !0;
            var t = this.projectionTextureLightFar,
                i = this.projectionTextureLightNear,
                r = t / (t - i),
                n = -r * i,
                o = 1 / Math.tan(this._angle / 2);
            e.Matrix.FromValuesToRef(o / 1, 0, 0, 0, 0, o, 0, 0, 0, 0, r, 1, 0, 0, n, 0, this._projectionTextureProjectionLightMatrix)
        }, i.prototype._computeProjectionTextureMatrix = function() {
            this._projectionTextureDirty = !1, this._projectionTextureViewLightMatrix.multiplyToRef(this._projectionTextureProjectionLightMatrix, this._projectionTextureMatrix), this._projectionTextureMatrix.multiplyToRef(this._projectionTextureScalingMatrix, this._projectionTextureMatrix)
        }, i.prototype._buildUniformLayout = function() {
            this._uniformBuffer.addUniform("vLightData", 4), this._uniformBuffer.addUniform("vLightDiffuse", 4), this._uniformBuffer.addUniform("vLightSpecular", 3), this._uniformBuffer.addUniform("vLightDirection", 3), this._uniformBuffer.addUniform("shadowsInfo", 3), this._uniformBuffer.addUniform("depthValues", 2), this._uniformBuffer.create()
        }, i.prototype.transferToEffect = function(t, i) {
            var r;
            return this.computeTransformedInformation() ? (this._uniformBuffer.updateFloat4("vLightData", this.transformedPosition.x, this.transformedPosition.y, this.transformedPosition.z, this.exponent, i), r = e.Vector3.Normalize(this.transformedDirection)) : (this._uniformBuffer.updateFloat4("vLightData", this.position.x, this.position.y, this.position.z, this.exponent, i), r = e.Vector3.Normalize(this.direction)), this._uniformBuffer.updateFloat4("vLightDirection", r.x, r.y, r.z, Math.cos(.5 * this.angle), i), this.projectionTexture && this.projectionTexture.isReady() && (this._projectionTextureViewLightDirty && this._computeProjectionTextureViewLightMatrix(), this._projectionTextureProjectionLightDirty && this._computeProjectionTextureProjectionLightMatrix(), this._projectionTextureDirty && this._computeProjectionTextureMatrix(), t.setMatrix("textureProjectionMatrix" + i, this._projectionTextureMatrix), t.setTexture("projectionLightSampler" + i, this.projectionTexture)), this
        }, i.prototype.dispose = function() {
            t.prototype.dispose.call(this), this._projectionTexture && this._projectionTexture.dispose()
        }, __decorate([e.serialize()], i.prototype, "angle", null), __decorate([e.serialize()], i.prototype, "shadowAngleScale", null), __decorate([e.serialize()], i.prototype, "exponent", void 0), __decorate([e.serialize()], i.prototype, "projectionTextureLightNear", null), __decorate([e.serialize()], i.prototype, "projectionTextureLightFar", null), __decorate([e.serialize()], i.prototype, "projectionTextureUpDirection", null), __decorate([e.serializeAsTexture("projectedLightTexture")], i.prototype, "_projectionTexture", void 0), i
    })(e.ShadowLight);
    e.SpotLight = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i) {
            this.name = e, this.from = t, this.to = i
        }
        return e.prototype.clone = function() {
            return new e(this.name, this.from, this.to)
        }, e
    })();
    e.AnimationRange = t;
    var i = (function() {
        function e(e, t, i) {
            this.frame = e, this.action = t, this.onlyOnce = i, this.isDone = !1
        }
        return e
    })();
    e.AnimationEvent = i;
    var r = (function() {
        function t(e) {
            this.path = e, this._onchange = new Array, this.value = 0, this.animations = new Array
        }
        return t.prototype.getPoint = function() {
            var t = this.path.getPointAtLengthPosition(this.value);
            return new e.Vector3(t.x, 0, t.y)
        }, t.prototype.moveAhead = function(e) {
            return void 0 === e && (e = .002), this.move(e), this
        }, t.prototype.moveBack = function(e) {
            return void 0 === e && (e = .002), this.move(-e), this
        }, t.prototype.move = function(e) {
            if (Math.abs(e) > 1) throw "step size should be less than 1.";
            return this.value += e, this.ensureLimits(), this.raiseOnChange(), this
        }, t.prototype.ensureLimits = function() {
            for (; this.value > 1;) this.value -= 1;
            for (; this.value < 0;) this.value += 1;
            return this
        }, t.prototype.raiseOnChange = function() {
            var e = this;
            return this._onchange.forEach((function(t) {
                return t(e)
            })), this
        }, t.prototype.onchange = function(e) {
            return this._onchange.push(e), this
        }, t
    })();
    e.PathCursor = r;
    !(function(e) {
        e[e.STEP = 1] = "STEP"
    })(e.AnimationKeyInterpolation || (e.AnimationKeyInterpolation = {}));
    var n = (function() {
        function i(e, t, r, n, o, s) {
            this.name = e, this.targetProperty = t, this.framePerSecond = r, this.dataType = n, this.loopMode = o, this.enableBlending = s, this._runtimeAnimations = new Array, this._events = new Array, this.blendingSpeed = .01, this._ranges = {}, this.targetPropertyPath = t.split("."), this.dataType = n, this.loopMode = void 0 === o ? i.ANIMATIONLOOPMODE_CYCLE : o
        }
        return i._PrepareAnimation = function(t, r, n, o, s, a, l, c) {
            var h = void 0;
            if (!isNaN(parseFloat(s)) && isFinite(s) ? h = i.ANIMATIONTYPE_FLOAT : s instanceof e.Quaternion ? h = i.ANIMATIONTYPE_QUATERNION : s instanceof e.Vector3 ? h = i.ANIMATIONTYPE_VECTOR3 : s instanceof e.Vector2 ? h = i.ANIMATIONTYPE_VECTOR2 : s instanceof e.Color3 ? h = i.ANIMATIONTYPE_COLOR3 : s instanceof e.Size && (h = i.ANIMATIONTYPE_SIZE), void 0 == h) return null;
            var u = new i(t, r, n, h, l),
                f = [{
                    frame: 0,
                    value: s
                }, {
                    frame: o,
                    value: a
                }];
            return u.setKeys(f), void 0 !== c && u.setEasingFunction(c), u
        }, i.CreateAnimation = function(e, t, r, n) {
            var o = new i(e + "Animation", e, r, t, i.ANIMATIONLOOPMODE_CONSTANT);
            return o.setEasingFunction(n), o
        }, i.CreateAndStartAnimation = function(e, t, r, n, o, s, a, l, c, h) {
            var u = i._PrepareAnimation(e, r, n, o, s, a, l, c);
            return u ? t.getScene().beginDirectAnimation(t, [u], 0, o, 1 === u.loopMode, 1, h) : null
        }, i.CreateAndStartHierarchyAnimation = function(e, t, r, n, o, s, a, l, c, h, u) {
            var f = i._PrepareAnimation(e, n, o, s, a, l, c, h);
            return f ? t.getScene().beginDirectHierarchyAnimation(t, r, [f], 0, s, 1 === f.loopMode, 1, u) : null
        }, i.CreateMergeAndStartAnimation = function(e, t, r, n, o, s, a, l, c, h) {
            var u = i._PrepareAnimation(e, r, n, o, s, a, l, c);
            return u ? (t.animations.push(u), t.getScene().beginAnimation(t, 0, o, 1 === u.loopMode, 1, h)) : null
        }, i.TransitionTo = function(e, t, i, r, n, o, s, a) {
            if (void 0 === a && (a = null), s <= 0) return i[e] = t, a && a(), null;
            var l = n * (s / 1e3);
            o.setKeys([{
                frame: 0,
                value: i[e].clone ? i[e].clone() : i[e]
            }, {
                frame: l,
                value: t
            }]), i.animations || (i.animations = []), i.animations.push(o);
            var c = r.beginAnimation(i, 0, l, !1);
            return c.onAnimationEnd = a, c
        }, Object.defineProperty(i.prototype, "runtimeAnimations", {
            get: function() {
                return this._runtimeAnimations
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "hasRunningRuntimeAnimations", {
            get: function() {
                for (var e = 0, t = this._runtimeAnimations; e < t.length; e++) {
                    if (!t[e].isStopped) return !0
                }
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.toString = function(e) {
            var t = "Name: " + this.name + ", property: " + this.targetProperty;
            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) {
                t += ", Ranges: {";
                var i = !0;
                for (var r in this._ranges) i && (t += ", ", i = !1), t += r;
                t += "}"
            }
            return t
        }, i.prototype.addEvent = function(e) {
            this._events.push(e)
        }, i.prototype.removeEvents = function(e) {
            for (var t = 0; t < this._events.length; t++) this._events[t].frame === e && (this._events.splice(t, 1), t--)
        }, i.prototype.getEvents = function() {
            return this._events
        }, i.prototype.createRange = function(e, i, r) {
            this._ranges[e] || (this._ranges[e] = new t(e, i, r))
        }, i.prototype.deleteRange = function(e, t) {
            void 0 === t && (t = !0);
            var i = this._ranges[e];
            if (i) {
                if (t)
                    for (var r = i.from, n = i.to, o = this._keys.length - 1; o >= 0; o--) this._keys[o].frame >= r && this._keys[o].frame <= n && this._keys.splice(o, 1);
                this._ranges[e] = null
            }
        }, i.prototype.getRange = function(e) {
            return this._ranges[e]
        }, i.prototype.getKeys = function() {
            return this._keys
        }, i.prototype.getHighestFrame = function() {
            for (var e = 0, t = 0, i = this._keys.length; t < i; t++) e < this._keys[t].frame && (e = this._keys[t].frame);
            return e
        }, i.prototype.getEasingFunction = function() {
            return this._easingFunction
        }, i.prototype.setEasingFunction = function(e) {
            this._easingFunction = e
        }, i.prototype.floatInterpolateFunction = function(t, i, r) {
            return e.Scalar.Lerp(t, i, r)
        }, i.prototype.floatInterpolateFunctionWithTangents = function(t, i, r, n, o) {
            return e.Scalar.Hermite(t, i, r, n, o)
        }, i.prototype.quaternionInterpolateFunction = function(t, i, r) {
            return e.Quaternion.Slerp(t, i, r)
        }, i.prototype.quaternionInterpolateFunctionWithTangents = function(t, i, r, n, o) {
            return e.Quaternion.Hermite(t, i, r, n, o).normalize()
        }, i.prototype.vector3InterpolateFunction = function(t, i, r) {
            return e.Vector3.Lerp(t, i, r)
        }, i.prototype.vector3InterpolateFunctionWithTangents = function(t, i, r, n, o) {
            return e.Vector3.Hermite(t, i, r, n, o)
        }, i.prototype.vector2InterpolateFunction = function(t, i, r) {
            return e.Vector2.Lerp(t, i, r)
        }, i.prototype.vector2InterpolateFunctionWithTangents = function(t, i, r, n, o) {
            return e.Vector2.Hermite(t, i, r, n, o)
        }, i.prototype.sizeInterpolateFunction = function(t, i, r) {
            return e.Size.Lerp(t, i, r)
        }, i.prototype.color3InterpolateFunction = function(t, i, r) {
            return e.Color3.Lerp(t, i, r)
        }, i.prototype.matrixInterpolateFunction = function(t, i, r) {
            return e.Matrix.Lerp(t, i, r)
        }, i.prototype.clone = function() {
            var e = new i(this.name, this.targetPropertyPath.join("."), this.framePerSecond, this.dataType, this.loopMode);
            if (e.enableBlending = this.enableBlending, e.blendingSpeed = this.blendingSpeed, this._keys && e.setKeys(this._keys), this._ranges) {
                e._ranges = {};
                for (var t in this._ranges) {
                    var r = this._ranges[t];
                    r && (e._ranges[t] = r.clone())
                }
            }
            return e
        }, i.prototype.setKeys = function(e) {
            this._keys = e.slice(0)
        }, i.prototype.serialize = function() {
            var e = {};
            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;
            var t = this.dataType;
            e.keys = [];
            for (var r = this.getKeys(), n = 0; n < r.length; n++) {
                var o = r[n],
                    s = {};
                switch (s.frame = o.frame, t) {
                    case i.ANIMATIONTYPE_FLOAT:
                        s.values = [o.value];
                        break;
                    case i.ANIMATIONTYPE_QUATERNION:
                    case i.ANIMATIONTYPE_MATRIX:
                    case i.ANIMATIONTYPE_VECTOR3:
                    case i.ANIMATIONTYPE_COLOR3:
                        s.values = o.value.asArray()
                }
                e.keys.push(s)
            }
            e.ranges = [];
            for (var a in this._ranges) {
                var l = this._ranges[a];
                if (l) {
                    var c = {};
                    c.name = a, c.from = l.from, c.to = l.to, e.ranges.push(c)
                }
            }
            return e
        }, Object.defineProperty(i, "ANIMATIONTYPE_FLOAT", {
            get: function() {
                return i._ANIMATIONTYPE_FLOAT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONTYPE_VECTOR3", {
            get: function() {
                return i._ANIMATIONTYPE_VECTOR3
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONTYPE_VECTOR2", {
            get: function() {
                return i._ANIMATIONTYPE_VECTOR2
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONTYPE_SIZE", {
            get: function() {
                return i._ANIMATIONTYPE_SIZE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONTYPE_QUATERNION", {
            get: function() {
                return i._ANIMATIONTYPE_QUATERNION
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONTYPE_MATRIX", {
            get: function() {
                return i._ANIMATIONTYPE_MATRIX
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONTYPE_COLOR3", {
            get: function() {
                return i._ANIMATIONTYPE_COLOR3
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONLOOPMODE_RELATIVE", {
            get: function() {
                return i._ANIMATIONLOOPMODE_RELATIVE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONLOOPMODE_CYCLE", {
            get: function() {
                return i._ANIMATIONLOOPMODE_CYCLE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ANIMATIONLOOPMODE_CONSTANT", {
            get: function() {
                return i._ANIMATIONLOOPMODE_CONSTANT
            },
            enumerable: !0,
            configurable: !0
        }), i.Parse = function(t) {
            var r, n, o = new i(t.name, t.property, t.framePerSecond, t.dataType, t.loopBehavior),
                s = t.dataType,
                a = [];
            for (t.enableBlending && (o.enableBlending = t.enableBlending), t.blendingSpeed && (o.blendingSpeed = t.blendingSpeed), n = 0; n < t.keys.length; n++) {
                var l, c, h = t.keys[n];
                switch (s) {
                    case i.ANIMATIONTYPE_FLOAT:
                        r = h.values[0], h.values.length >= 1 && (l = h.values[1]), h.values.length >= 2 && (c = h.values[2]);
                        break;
                    case i.ANIMATIONTYPE_QUATERNION:
                        if (r = e.Quaternion.FromArray(h.values), h.values.length >= 8) {
                            var u = e.Quaternion.FromArray(h.values.slice(4, 8));
                            u.equals(e.Quaternion.Zero()) || (l = u)
                        }
                        if (h.values.length >= 12) {
                            var f = e.Quaternion.FromArray(h.values.slice(8, 12));
                            f.equals(e.Quaternion.Zero()) || (c = f)
                        }
                        break;
                    case i.ANIMATIONTYPE_MATRIX:
                        r = e.Matrix.FromArray(h.values);
                        break;
                    case i.ANIMATIONTYPE_COLOR3:
                        r = e.Color3.FromArray(h.values);
                        break;
                    case i.ANIMATIONTYPE_VECTOR3:
                    default:
                        r = e.Vector3.FromArray(h.values)
                }
                var d = {};
                d.frame = h.frame, d.value = r, void 0 != l && (d.inTangent = l), void 0 != c && (d.outTangent = c), a.push(d)
            }
            if (o.setKeys(a), t.ranges)
                for (n = 0; n < t.ranges.length; n++) r = t.ranges[n], o.createRange(r.name, r.from, r.to);
            return o
        }, i.AppendSerializedAnimations = function(e, t) {
            if (e.animations) {
                t.animations = [];
                for (var i = 0; i < e.animations.length; i++) {
                    var r = e.animations[i];
                    t.animations.push(r.serialize())
                }
            }
        }, i.AllowMatricesInterpolation = !1, i._ANIMATIONTYPE_FLOAT = 0, i._ANIMATIONTYPE_VECTOR3 = 1, i._ANIMATIONTYPE_QUATERNION = 2, i._ANIMATIONTYPE_MATRIX = 3, i._ANIMATIONTYPE_COLOR3 = 4, i._ANIMATIONTYPE_VECTOR2 = 5, i._ANIMATIONTYPE_SIZE = 6, i._ANIMATIONLOOPMODE_RELATIVE = 0, i._ANIMATIONLOOPMODE_CYCLE = 1, i._ANIMATIONLOOPMODE_CONSTANT = 2, i
    })();
    e.Animation = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {}
        return e
    })();
    e.TargetedAnimation = t;
    var i = (function() {
        function t(t, i) {
            void 0 === i && (i = null), this.name = t, this._targetedAnimations = new Array, this._animatables = new Array, this._from = Number.MAX_VALUE, this._to = -Number.MAX_VALUE, this._speedRatio = 1, this.onAnimationEndObservable = new e.Observable, this._scene = i || e.Engine.LastCreatedScene, this._scene.animationGroups.push(this)
        }
        return Object.defineProperty(t.prototype, "isStarted", {
            get: function() {
                return this._isStarted
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "speedRatio", {
            get: function() {
                return this._speedRatio
            },
            set: function(e) {
                if (this._speedRatio !== e) {
                    this._speedRatio = e;
                    for (var t = 0; t < this._animatables.length; t++) {
                        this._animatables[t].speedRatio = this._speedRatio
                    }
                }
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "targetedAnimations", {
            get: function() {
                return this._targetedAnimations
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.addTargetedAnimation = function(e, t) {
            var i = {
                    animation: e,
                    target: t
                },
                r = e.getKeys();
            return this._from > r[0].frame && (this._from = r[0].frame),
                this._to < r[r.length - 1].frame && (this._to = r[r.length - 1].frame), this._targetedAnimations.push(i), i
        }, t.prototype.normalize = function(e, t) {
            void 0 === e && (e = -Number.MAX_VALUE), void 0 === t && (t = Number.MAX_VALUE), e = Math.max(e, this._from), t = Math.min(t, this._to);
            for (var i = 0; i < this._targetedAnimations.length; i++) {
                var r = this._targetedAnimations[i],
                    n = r.animation.getKeys(),
                    o = n[0],
                    s = n[n.length - 1];
                if (o.frame > e) {
                    var a = {
                        frame: e,
                        value: o.value,
                        inTangent: o.inTangent,
                        outTangent: o.outTangent,
                        interpolation: o.interpolation
                    };
                    n.splice(0, 0, a)
                }
                if (s.frame < t) {
                    var a = {
                        frame: t,
                        value: s.value,
                        inTangent: s.outTangent,
                        outTangent: s.outTangent,
                        interpolation: s.interpolation
                    };
                    n.push(a)
                }
            }
            return this
        }, t.prototype.start = function(e, t) {
            var i = this;
            if (void 0 === e && (e = !1), void 0 === t && (t = 1), this._isStarted || 0 === this._targetedAnimations.length) return this;
            for (var r = this, n = 0; n < this._targetedAnimations.length; n++) !(function() {
                var o = r._targetedAnimations[n];
                r._animatables.push(r._scene.beginDirectAnimation(o.target, [o.animation], r._from, r._to, e, t, (function() {
                    i.onAnimationEndObservable.notifyObservers(o)
                })))
            })();
            return this._speedRatio = t, this._isStarted = !0, this
        }, t.prototype.pause = function() {
            if (!this._isStarted) return this;
            for (var e = 0; e < this._animatables.length; e++) {
                this._animatables[e].pause()
            }
            return this
        }, t.prototype.play = function(e) {
            if (this.isStarted) {
                if (void 0 !== e)
                    for (var t = 0; t < this._animatables.length; t++) {
                        var i = this._animatables[t];
                        i.loopAnimation = e
                    }
                this.restart()
            } else this.start(e, this._speedRatio);
            return this
        }, t.prototype.reset = function() {
            if (!this._isStarted) return this;
            for (var e = 0; e < this._animatables.length; e++) {
                this._animatables[e].reset()
            }
            return this
        }, t.prototype.restart = function() {
            if (!this._isStarted) return this;
            for (var e = 0; e < this._animatables.length; e++) {
                this._animatables[e].restart()
            }
            return this
        }, t.prototype.stop = function() {
            if (!this._isStarted) return this;
            for (var e = 0; e < this._animatables.length; e++) {
                this._animatables[e].stop()
            }
            return this._isStarted = !1, this
        }, t.prototype.dispose = function() {
            this._targetedAnimations = [], this._animatables = [];
            var e = this._scene.animationGroups.indexOf(this);
            e > -1 && this._scene.animationGroups.splice(e, 1)
        }, t
    })();
    e.AnimationGroup = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t) {
            this._offsetsCache = {}, this._highLimitsCache = {}, this._stopped = !1, this._blendingFactor = 0, this._ratioOffset = 0, this._animation = t, this._target = e, t._runtimeAnimations.push(this)
        }
        return Object.defineProperty(t.prototype, "animation", {
            get: function() {
                return this._animation
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.reset = function() {
            this._offsetsCache = {}, this._highLimitsCache = {}, this.currentFrame = 0, this._blendingFactor = 0, this._originalBlendValue = null
        }, t.prototype.isStopped = function() {
            return this._stopped
        }, t.prototype.dispose = function() {
            var e = this._animation.runtimeAnimations.indexOf(this);
            e > -1 && this._animation.runtimeAnimations.splice(e, 1)
        }, t.prototype._getKeyValue = function(e) {
            return "function" == typeof e ? e() : e
        }, t.prototype._interpolate = function(t, i, r, n, o) {
            if (r === e.Animation.ANIMATIONLOOPMODE_CONSTANT && i > 0) return o.clone ? o.clone() : o;
            this.currentFrame = t;
            var s = this._animation.getKeys(),
                a = Math.max(0, Math.min(s.length - 1, Math.floor(s.length * (t - s[0].frame) / (s[s.length - 1].frame - s[0].frame)) - 1));
            if (s[a].frame >= t)
                for (; a - 1 >= 0 && s[a].frame >= t;) a--;
            for (var l = a; l < s.length; l++) {
                var c = s[l + 1];
                if (c.frame >= t) {
                    var h = s[l],
                        u = this._getKeyValue(h.value);
                    if (h.interpolation === e.AnimationKeyInterpolation.STEP) return u;
                    var f = this._getKeyValue(c.value),
                        d = void 0 !== h.outTangent && void 0 !== c.inTangent,
                        p = c.frame - h.frame,
                        _ = (t - h.frame) / p,
                        m = this._animation.getEasingFunction();
                    switch (null != m && (_ = m.ease(_)), this._animation.dataType) {
                        case e.Animation.ANIMATIONTYPE_FLOAT:
                            var g = d ? this._animation.floatInterpolateFunctionWithTangents(u, h.outTangent * p, f, c.inTangent * p, _) : this._animation.floatInterpolateFunction(u, f, _);
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    return g;
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return n * i + g
                            }
                            break;
                        case e.Animation.ANIMATIONTYPE_QUATERNION:
                            var v = d ? this._animation.quaternionInterpolateFunctionWithTangents(u, h.outTangent.scale(p), f, c.inTangent.scale(p), _) : this._animation.quaternionInterpolateFunction(u, f, _);
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    return v;
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return v.add(n.scale(i))
                            }
                            return v;
                        case e.Animation.ANIMATIONTYPE_VECTOR3:
                            var y = d ? this._animation.vector3InterpolateFunctionWithTangents(u, h.outTangent.scale(p), f, c.inTangent.scale(p), _) : this._animation.vector3InterpolateFunction(u, f, _);
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    return y;
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return y.add(n.scale(i))
                            }
                        case e.Animation.ANIMATIONTYPE_VECTOR2:
                            var b = d ? this._animation.vector2InterpolateFunctionWithTangents(u, h.outTangent.scale(p), f, c.inTangent.scale(p), _) : this._animation.vector2InterpolateFunction(u, f, _);
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    return b;
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return b.add(n.scale(i))
                            }
                        case e.Animation.ANIMATIONTYPE_SIZE:
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    return this._animation.sizeInterpolateFunction(u, f, _);
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return this._animation.sizeInterpolateFunction(u, f, _).add(n.scale(i))
                            }
                        case e.Animation.ANIMATIONTYPE_COLOR3:
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    return this._animation.color3InterpolateFunction(u, f, _);
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return this._animation.color3InterpolateFunction(u, f, _).add(n.scale(i))
                            }
                        case e.Animation.ANIMATIONTYPE_MATRIX:
                            switch (r) {
                                case e.Animation.ANIMATIONLOOPMODE_CYCLE:
                                case e.Animation.ANIMATIONLOOPMODE_CONSTANT:
                                    if (e.Animation.AllowMatricesInterpolation) return this._animation.matrixInterpolateFunction(u, f, _);
                                case e.Animation.ANIMATIONLOOPMODE_RELATIVE:
                                    return u
                            }
                    }
                    break
                }
            }
            return this._getKeyValue(s[s.length - 1].value)
        }, t.prototype.setValue = function(t, i) {
            void 0 === i && (i = !1);
            var r, n, o = this._animation.targetPropertyPath;
            if (o.length > 1) {
                for (var s = this._target[o[0]], a = 1; a < o.length - 1; a++) s = s[o[a]];
                r = o[o.length - 1], n = s
            } else r = o[0], n = this._target;
            this._animation.enableBlending && this._blendingFactor <= 1 ? (this._originalBlendValue || (n[r].clone ? this._originalBlendValue = n[r].clone() : this._originalBlendValue = n[r]), this._originalBlendValue.prototype ? this._originalBlendValue.prototype.Lerp ? n[r] = this._originalBlendValue.construtor.prototype.Lerp(t, this._originalBlendValue, this._blendingFactor) : n[r] = t : this._originalBlendValue.m ? n[r] = e.Matrix.Lerp(this._originalBlendValue, t, this._blendingFactor) : n[r] = this._originalBlendValue * (1 - this._blendingFactor) + this._blendingFactor * t, this._blendingFactor += this._animation.blendingSpeed) : n[r] = t, this._target.markAsDirty && this._target.markAsDirty(this._animation.targetProperty)
        }, t.prototype.goToFrame = function(e) {
            var t = this._animation.getKeys();
            e < t[0].frame ? e = t[0].frame : e > t[t.length - 1].frame && (e = t[t.length - 1].frame);
            var i = this._interpolate(e, 0, this._animation.loopMode);
            this.setValue(i)
        }, t.prototype._prepareForSpeedRatioChange = function(e) {
            var t = this._previousDelay * (this._animation.framePerSecond * e) / 1e3;
            this._ratioOffset = this._previousRatio - t
        }, t.prototype.animate = function(t, i, r, n, o, s) {
            void 0 === s && (s = !1);
            var a = this._animation.targetPropertyPath;
            if (!a || a.length < 1) return this._stopped = !0, !1;
            var l = !0,
                c = this._animation.getKeys();
            if (0 !== c[0].frame) {
                var h = {
                    frame: 0,
                    value: c[0].value
                };
                c.splice(0, 0, h)
            }(i < c[0].frame || i > c[c.length - 1].frame) && (i = c[0].frame), (r < c[0].frame || r > c[c.length - 1].frame) && (r = c[c.length - 1].frame), i === r && (i > c[0].frame ? i-- : r < c[c.length - 1].frame && r++);
            var u, f = r - i,
                d = t * (this._animation.framePerSecond * o) / 1e3 + this._ratioOffset,
                p = 0;
            if (this._previousDelay = t, this._previousRatio = d, (r > i && d > f || i > r && d < f) && !n) l = !1, p = this._getKeyValue(c[c.length - 1].value);
            else if (this._animation.loopMode !== e.Animation.ANIMATIONLOOPMODE_CYCLE) {
                var _ = r.toString() + i.toString();
                if (!this._offsetsCache[_]) {
                    var m = this._interpolate(i, 0, e.Animation.ANIMATIONLOOPMODE_CYCLE),
                        g = this._interpolate(r, 0, e.Animation.ANIMATIONLOOPMODE_CYCLE);
                    switch (this._animation.dataType) {
                        case e.Animation.ANIMATIONTYPE_FLOAT:
                            this._offsetsCache[_] = g - m;
                            break;
                        case e.Animation.ANIMATIONTYPE_QUATERNION:
                            this._offsetsCache[_] = g.subtract(m);
                            break;
                        case e.Animation.ANIMATIONTYPE_VECTOR3:
                            this._offsetsCache[_] = g.subtract(m);
                        case e.Animation.ANIMATIONTYPE_VECTOR2:
                            this._offsetsCache[_] = g.subtract(m);
                        case e.Animation.ANIMATIONTYPE_SIZE:
                            this._offsetsCache[_] = g.subtract(m);
                        case e.Animation.ANIMATIONTYPE_COLOR3:
                            this._offsetsCache[_] = g.subtract(m)
                    }
                    this._highLimitsCache[_] = g
                }
                p = this._highLimitsCache[_], u = this._offsetsCache[_]
            }
            if (void 0 === u) switch (this._animation.dataType) {
                case e.Animation.ANIMATIONTYPE_FLOAT:
                    u = 0;
                    break;
                case e.Animation.ANIMATIONTYPE_QUATERNION:
                    u = new e.Quaternion(0, 0, 0, 0);
                    break;
                case e.Animation.ANIMATIONTYPE_VECTOR3:
                    u = e.Vector3.Zero();
                    break;
                case e.Animation.ANIMATIONTYPE_VECTOR2:
                    u = e.Vector2.Zero();
                    break;
                case e.Animation.ANIMATIONTYPE_SIZE:
                    u = e.Size.Zero();
                    break;
                case e.Animation.ANIMATIONTYPE_COLOR3:
                    u = e.Color3.Black()
            }
            var v = d / f >> 0,
                y = l ? i + d % f : r,
                b = this._interpolate(y, v, this._animation.loopMode, u, p);
            this.setValue(b);
            for (var x = this._animation.getEvents(), T = 0; T < x.length; T++)
                if (f > 0 && y >= x[T].frame && x[T].frame >= i || f < 0 && y <= x[T].frame && x[T].frame <= i) {
                    var E = x[T];
                    E.isDone || (E.onlyOnce && (x.splice(T, 1), T--), E.isDone = !0, E.action())
                } else x[T].isDone && !x[T].onlyOnce && (x[T].isDone = !1);
            return l || (this._stopped = !0), l
        }, t
    })();
    e.RuntimeAnimation = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i, r, n, o, s, a) {
            void 0 === i && (i = 0), void 0 === r && (r = 100), void 0 === n && (n = !1), void 0 === o && (o = 1), this.target = t, this.fromFrame = i, this.toFrame = r, this.loopAnimation = n, this.onAnimationEnd = s, this._localDelayOffset = null, this._pausedDelay = null, this._runtimeAnimations = new Array, this._paused = !1, this._speedRatio = 1, this.animationStarted = !1, a && this.appendAnimations(t, a), this._speedRatio = o, this._scene = e, e._activeAnimatables.push(this)
        }
        return Object.defineProperty(t.prototype, "speedRatio", {
            get: function() {
                return this._speedRatio
            },
            set: function(e) {
                for (var t = 0; t < this._runtimeAnimations.length; t++) {
                    this._runtimeAnimations[t]._prepareForSpeedRatioChange(e)
                }
                this._speedRatio = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getAnimations = function() {
            return this._runtimeAnimations
        }, t.prototype.appendAnimations = function(t, i) {
            for (var r = 0; r < i.length; r++) {
                var n = i[r];
                this._runtimeAnimations.push(new e.RuntimeAnimation(t, n))
            }
        }, t.prototype.getAnimationByTargetProperty = function(e) {
            for (var t = this._runtimeAnimations, i = 0; i < t.length; i++)
                if (t[i].animation.targetProperty === e) return t[i].animation;
            return null
        }, t.prototype.getRuntimeAnimationByTargetProperty = function(e) {
            for (var t = this._runtimeAnimations, i = 0; i < t.length; i++)
                if (t[i].animation.targetProperty === e) return t[i];
            return null
        }, t.prototype.reset = function() {
            for (var e = this._runtimeAnimations, t = 0; t < e.length; t++) e[t].reset();
            for (t = 0; t < e.length; t++) {
                e[t].animate(0, this.fromFrame, this.toFrame, !1, this._speedRatio)
            }
            this._localDelayOffset = null, this._pausedDelay = null
        }, t.prototype.enableBlending = function(e) {
            for (var t = this._runtimeAnimations, i = 0; i < t.length; i++) t[i].animation.enableBlending = !0, t[i].animation.blendingSpeed = e
        }, t.prototype.disableBlending = function() {
            for (var e = this._runtimeAnimations, t = 0; t < e.length; t++) e[t].animation.enableBlending = !1
        }, t.prototype.goToFrame = function(e) {
            var t = this._runtimeAnimations;
            if (t[0]) {
                var i = t[0].animation.framePerSecond,
                    r = t[0].currentFrame,
                    n = e - r,
                    o = 1e3 * n / (i * this.speedRatio);
                null === this._localDelayOffset && (this._localDelayOffset = 0), this._localDelayOffset -= o
            }
            for (var s = 0; s < t.length; s++) t[s].goToFrame(e)
        }, t.prototype.pause = function() {
            this._paused || (this._paused = !0)
        }, t.prototype.restart = function() {
            this._paused = !1
        }, t.prototype.stop = function(e) {
            if (e) {
                var t = this._scene._activeAnimatables.indexOf(this);
                if (t > -1) {
                    for (var i = this._runtimeAnimations, r = i.length - 1; r >= 0; r--) "string" == typeof e && i[r].animation.name != e || (i[r].dispose(), i.splice(r, 1));
                    0 == i.length && (this._scene._activeAnimatables.splice(t, 1), this.onAnimationEnd && this.onAnimationEnd())
                }
            } else {
                var r = this._scene._activeAnimatables.indexOf(this);
                if (r > -1) {
                    this._scene._activeAnimatables.splice(r, 1);
                    for (var i = this._runtimeAnimations, r = 0; r < i.length; r++) i[r].dispose();
                    this.onAnimationEnd && this.onAnimationEnd()
                }
            }
        }, t.prototype._animate = function(e) {
            if (this._paused) return this.animationStarted = !1, null === this._pausedDelay && (this._pausedDelay = e), !0;
            null === this._localDelayOffset ? (this._localDelayOffset = e, this._pausedDelay = null) : null !== this._pausedDelay && (this._localDelayOffset += e - this._pausedDelay, this._pausedDelay = null);
            var t, i = !1,
                r = this._runtimeAnimations;
            for (t = 0; t < r.length; t++) {
                var n = r[t],
                    o = n.animate(e - this._localDelayOffset, this.fromFrame, this.toFrame, this.loopAnimation, this._speedRatio);
                i = i || o
            }
            if (this.animationStarted = i, !i)
                for (t = this._scene._activeAnimatables.indexOf(this), this._scene._activeAnimatables.splice(t, 1), t = 0; t < r.length; t++) r[t].dispose();
            return !i && this.onAnimationEnd && (this.onAnimationEnd(), this.onAnimationEnd = null), i
        }, t
    })();
    e.Animatable = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._easingMode = e.EASINGMODE_EASEIN
        }
        return Object.defineProperty(e, "EASINGMODE_EASEIN", {
            get: function() {
                return e._EASINGMODE_EASEIN
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "EASINGMODE_EASEOUT", {
            get: function() {
                return e._EASINGMODE_EASEOUT
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e, "EASINGMODE_EASEINOUT", {
            get: function() {
                return e._EASINGMODE_EASEINOUT
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.setEasingMode = function(e) {
            var t = Math.min(Math.max(e, 0), 2);
            this._easingMode = t
        }, e.prototype.getEasingMode = function() {
            return this._easingMode
        }, e.prototype.easeInCore = function(e) {
            throw new Error("You must implement this method")
        }, e.prototype.ease = function(t) {
            switch (this._easingMode) {
                case e.EASINGMODE_EASEIN:
                    return this.easeInCore(t);
                case e.EASINGMODE_EASEOUT:
                    return 1 - this.easeInCore(1 - t)
            }
            return t >= .5 ? .5 * (1 - this.easeInCore(2 * (1 - t))) + .5 : .5 * this.easeInCore(2 * t)
        }, e._EASINGMODE_EASEIN = 0, e._EASINGMODE_EASEOUT = 1, e._EASINGMODE_EASEINOUT = 2, e
    })();
    e.EasingFunction = t;
    var i = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return e = Math.max(0, Math.min(1, e)), 1 - Math.sqrt(1 - e * e)
        }, t
    })(t);
    e.CircleEase = i;
    var r = (function(e) {
        function t(t) {
            void 0 === t && (t = 1);
            var i = e.call(this) || this;
            return i.amplitude = t, i
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            var t = Math.max(0, this.amplitude);
            return Math.pow(e, 3) - e * t * Math.sin(3.141592653589793 * e)
        }, t
    })(t);
    e.BackEase = r;
    var n = (function(e) {
        function t(t, i) {
            void 0 === t && (t = 3), void 0 === i && (i = 2);
            var r = e.call(this) || this;
            return r.bounces = t, r.bounciness = i, r
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            var t = Math.max(0, this.bounces),
                i = this.bounciness;
            i <= 1 && (i = 1.001);
            var r = Math.pow(i, t),
                n = 1 - i,
                o = (1 - r) / n + .5 * r,
                s = e * o,
                a = Math.log(-s * (1 - i) + 1) / Math.log(i),
                l = Math.floor(a),
                c = l + 1,
                h = (1 - Math.pow(i, l)) / (n * o),
                u = (1 - Math.pow(i, c)) / (n * o),
                f = .5 * (h + u),
                d = e - f,
                p = f - h;
            return -Math.pow(1 / i, t - l) / (p * p) * (d - p) * (d + p)
        }, t
    })(t);
    e.BounceEase = n;
    var o = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return e * e * e
        }, t
    })(t);
    e.CubicEase = o;
    var s = (function(e) {
        function t(t, i) {
            void 0 === t && (t = 3), void 0 === i && (i = 3);
            var r = e.call(this) || this;
            return r.oscillations = t, r.springiness = i, r
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            var t = Math.max(0, this.oscillations),
                i = Math.max(0, this.springiness);
            return (0 == i ? e : (Math.exp(i * e) - 1) / (Math.exp(i) - 1)) * Math.sin((6.283185307179586 * t + 1.5707963267948966) * e)
        }, t
    })(t);
    e.ElasticEase = s;
    var a = (function(e) {
        function t(t) {
            void 0 === t && (t = 2);
            var i = e.call(this) || this;
            return i.exponent = t, i
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return this.exponent <= 0 ? e : (Math.exp(this.exponent * e) - 1) / (Math.exp(this.exponent) - 1)
        }, t
    })(t);
    e.ExponentialEase = a;
    var l = (function(e) {
        function t(t) {
            void 0 === t && (t = 2);
            var i = e.call(this) || this;
            return i.power = t, i
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            var t = Math.max(0, this.power);
            return Math.pow(e, t)
        }, t
    })(t);
    e.PowerEase = l;
    var c = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return e * e
        }, t
    })(t);
    e.QuadraticEase = c;
    var h = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return e * e * e * e
        }, t
    })(t);
    e.QuarticEase = h;
    var u = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return e * e * e * e * e
        }, t
    })(t);
    e.QuinticEase = u;
    var f = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.easeInCore = function(e) {
            return 1 - Math.sin(1.5707963267948966 * (1 - e))
        }, t
    })(t);
    e.SineEase = f;
    var d = (function(t) {
        function i(e, i, r, n) {
            void 0 === e && (e = 0), void 0 === i && (i = 0), void 0 === r && (r = 1), void 0 === n && (n = 1);
            var o = t.call(this) || this;
            return o.x1 = e, o.y1 = i, o.x2 = r, o.y2 = n, o
        }
        return __extends(i, t), i.prototype.easeInCore = function(t) {
            return e.BezierCurve.interpolate(t, this.x1, this.y1, this.x2, this.y2)
        }, i
    })(t);
    e.BezierCurveEase = d
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e) {
            this._actionManager = e
        }
        return e.prototype.isValid = function() {
            return !0
        }, e.prototype._getProperty = function(e) {
            return this._actionManager._getProperty(e)
        }, e.prototype._getEffectiveTarget = function(e, t) {
            return this._actionManager._getEffectiveTarget(e, t)
        }, e.prototype.serialize = function() {}, e.prototype._serialize = function(e) {
            return {
                type: 2,
                children: [],
                name: e.name,
                properties: e.properties
            }
        }, e
    })();
    e.Condition = t;
    var i = (function(t) {
        function i(e, r, n, o, s) {
            void 0 === s && (s = i.IsEqual);
            var a = t.call(this, e) || this;
            return a.propertyPath = n, a.value = o, a.operator = s, a._target = r, a._effectiveTarget = a._getEffectiveTarget(r, a.propertyPath), a._property = a._getProperty(a.propertyPath), a
        }
        return __extends(i, t), Object.defineProperty(i, "IsEqual", {
            get: function() {
                return i._IsEqual
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "IsDifferent", {
            get: function() {
                return i._IsDifferent
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "IsGreater", {
            get: function() {
                return i._IsGreater
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "IsLesser", {
            get: function() {
                return i._IsLesser
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.isValid = function() {
            switch (this.operator) {
                case i.IsGreater:
                    return this._effectiveTarget[this._property] > this.value;
                case i.IsLesser:
                    return this._effectiveTarget[this._property] < this.value;
                case i.IsEqual:
                case i.IsDifferent:
                    var e;
                    return e = this.value.equals ? this.value.equals(this._effectiveTarget[this._property]) : this.value === this._effectiveTarget[this._property], this.operator === i.IsEqual ? e : !e
            }
            return !1
        }, i.prototype.serialize = function() {
            return this._serialize({
                name: "ValueCondition",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "propertyPath",
                    value: this.propertyPath
                }, {
                    name: "value",
                    value: e.Action._SerializeValueAsString(this.value)
                }, {
                    name: "operator",
                    value: i.GetOperatorName(this.operator)
                }]
            })
        }, i.GetOperatorName = function(e) {
            switch (e) {
                case i._IsEqual:
                    return "IsEqual";
                case i._IsDifferent:
                    return "IsDifferent";
                case i._IsGreater:
                    return "IsGreater";
                case i._IsLesser:
                    return "IsLesser";
                default:
                    return ""
            }
        }, i._IsEqual = 0, i._IsDifferent = 1, i._IsGreater = 2, i._IsLesser = 3, i
    })(t);
    e.ValueCondition = i;
    var r = (function(e) {
        function t(t, i) {
            var r = e.call(this, t) || this;
            return r.predicate = i, r
        }
        return __extends(t, e), t.prototype.isValid = function() {
            return this.predicate()
        }, t
    })(t);
    e.PredicateCondition = r;
    var n = (function(t) {
        function i(e, i, r) {
            var n = t.call(this, e) || this;
            return n.value = r, n._target = i, n
        }
        return __extends(i, t), i.prototype.isValid = function() {
            return this._target.state === this.value
        }, i.prototype.serialize = function() {
            return this._serialize({
                name: "StateCondition",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "value",
                    value: this.value
                }]
            })
        }, i
    })(t);
    e.StateCondition = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            this.triggerOptions = t, this.onBeforeExecuteObservable = new e.Observable, t.parameter ? (this.trigger = t.trigger, this._triggerParameter = t.parameter) : this.trigger = t, this._nextActiveAction = this, this._condition = i
        }
        return t.prototype._prepare = function() {}, t.prototype.getTriggerParameter = function() {
            return this._triggerParameter
        }, t.prototype._executeCurrent = function(e) {
            if (this._nextActiveAction._condition) {
                var t = this._nextActiveAction._condition,
                    i = this._actionManager.getScene().getRenderId();
                if (t._evaluationId === i) {
                    if (!t._currentResult) return
                } else {
                    if (t._evaluationId = i, !t.isValid()) return void(t._currentResult = !1);
                    t._currentResult = !0
                }
            }
            this.onBeforeExecuteObservable.notifyObservers(this), this._nextActiveAction.execute(e), this.skipToNextActiveAction()
        }, t.prototype.execute = function(e) {}, t.prototype.skipToNextActiveAction = function() {
            this._nextActiveAction._child ? (this._nextActiveAction._child._actionManager || (this._nextActiveAction._child._actionManager = this._actionManager), this._nextActiveAction = this._nextActiveAction._child) : this._nextActiveAction = this
        }, t.prototype.then = function(e) {
            return this._child = e, e._actionManager = this._actionManager, e._prepare(), e
        }, t.prototype._getProperty = function(e) {
            return this._actionManager._getProperty(e)
        }, t.prototype._getEffectiveTarget = function(e, t) {
            return this._actionManager._getEffectiveTarget(e, t)
        }, t.prototype.serialize = function(e) {}, t.prototype._serialize = function(e, t) {
            var i = {
                type: 1,
                children: [],
                name: e.name,
                properties: e.properties || []
            };
            if (this._child && this._child.serialize(i), this._condition) {
                var r = this._condition.serialize();
                return r.children.push(i), t && t.children.push(r), r
            }
            return t && t.children.push(i), i
        }, t._SerializeValueAsString = function(t) {
            return "number" == typeof t ? t.toString() : "boolean" == typeof t ? t ? "true" : "false" : t instanceof e.Vector2 ? t.x + ", " + t.y : t instanceof e.Vector3 ? t.x + ", " + t.y + ", " + t.z : t instanceof e.Color3 ? t.r + ", " + t.g + ", " + t.b : t instanceof e.Color4 ? t.r + ", " + t.g + ", " + t.b + ", " + t.a : t
        }, t._GetTargetProperty = function(t) {
            return {
                name: "target",
                targetType: t instanceof e.Mesh ? "MeshProperties" : t instanceof e.Light ? "LightProperties" : t instanceof e.Camera ? "CameraProperties" : "SceneProperties",
                value: t instanceof e.Scene ? "Scene" : t.name
            }
        }, t
    })();
    e.Action = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i, r, n, o) {
            this.source = e, this.pointerX = t, this.pointerY = i, this.meshUnderPointer = r, this.sourceEvent = n, this.additionalData = o
        }
        return e.CreateNew = function(t, i, r) {
            var n = t.getScene();
            return new e(t, n.pointerX, n.pointerY, n.meshUnderPointer, i, r)
        }, e.CreateNewFromSprite = function(t, i, r, n) {
            return new e(t, i.pointerX, i.pointerY, i.meshUnderPointer, r, n)
        }, e.CreateNewFromScene = function(t, i) {
            return new e(null, t.pointerX, t.pointerY, t.meshUnderPointer, i)
        }, e.CreateNewFromPrimitive = function(t, i, r, n) {
            return new e(t, i.x, i.y, null, r, n)
        }, e
    })();
    e.ActionEvent = t;
    var i = (function() {
        function t(e) {
            this.actions = new Array, this.hoverCursor = "", this._scene = e, e._actionManagers.push(this)
        }
        return Object.defineProperty(t, "NothingTrigger", {
            get: function() {
                return t._NothingTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnPickTrigger", {
            get: function() {
                return t._OnPickTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnLeftPickTrigger", {
            get: function() {
                return t._OnLeftPickTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnRightPickTrigger", {
            get: function() {
                return t._OnRightPickTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnCenterPickTrigger", {
            get: function() {
                return t._OnCenterPickTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnPickDownTrigger", {
            get: function() {
                return t._OnPickDownTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnDoublePickTrigger", {
            get: function() {
                return t._OnDoublePickTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnPickUpTrigger", {
            get: function() {
                return t._OnPickUpTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnPickOutTrigger", {
            get: function() {
                return t._OnPickOutTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnLongPressTrigger", {
            get: function() {
                return t._OnLongPressTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnPointerOverTrigger", {
            get: function() {
                return t._OnPointerOverTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnPointerOutTrigger", {
            get: function() {
                return t._OnPointerOutTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnEveryFrameTrigger", {
            get: function() {
                return t._OnEveryFrameTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnIntersectionEnterTrigger", {
            get: function() {
                return t._OnIntersectionEnterTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnIntersectionExitTrigger", {
            get: function() {
                return t._OnIntersectionExitTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnKeyDownTrigger", {
            get: function() {
                return t._OnKeyDownTrigger
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "OnKeyUpTrigger", {
            get: function() {
                return t._OnKeyUpTrigger
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.dispose = function() {
            for (var e = this._scene._actionManagers.indexOf(this), i = 0; i < this.actions.length; i++) {
                var r = this.actions[i];
                t.Triggers[r.trigger]--, 0 === t.Triggers[r.trigger] && delete t.Triggers[r.trigger]
            }
            e > -1 && this._scene._actionManagers.splice(e, 1)
        }, t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.hasSpecificTriggers = function(e) {
            for (var t = 0; t < this.actions.length; t++) {
                var i = this.actions[t];
                if (e.indexOf(i.trigger) > -1) return !0
            }
            return !1
        }, t.prototype.hasSpecificTrigger = function(e) {
            for (var t = 0; t < this.actions.length; t++) {
                if (this.actions[t].trigger === e) return !0
            }
            return !1
        }, Object.defineProperty(t.prototype, "hasPointerTriggers", {
            get: function() {
                for (var e = 0; e < this.actions.length; e++) {
                    var i = this.actions[e];
                    if (i.trigger >= t._OnPickTrigger && i.trigger <= t._OnPointerOutTrigger) return !0
                }
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "hasPickTriggers", {
            get: function() {
                for (var e = 0; e < this.actions.length; e++) {
                    var i = this.actions[e];
                    if (i.trigger >= t._OnPickTrigger && i.trigger <= t._OnPickUpTrigger) return !0
                }
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "HasTriggers", {
            get: function() {
                for (var e in t.Triggers)
                    if (t.Triggers.hasOwnProperty(e)) return !0;
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "HasPickTriggers", {
            get: function() {
                for (var e in t.Triggers)
                    if (t.Triggers.hasOwnProperty(e)) {
                        var i = parseInt(e);
                        if (i >= t._OnPickTrigger && i <= t._OnPickUpTrigger) return !0
                    }
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), t.HasSpecificTrigger = function(e) {
            for (var i in t.Triggers)
                if (t.Triggers.hasOwnProperty(i)) {
                    var r = parseInt(i);
                    if (r === e) return !0
                }
            return !1
        }, t.prototype.registerAction = function(i) {
            return i.trigger === t.OnEveryFrameTrigger && this.getScene().actionManager !== this ? (e.Tools.Warn("OnEveryFrameTrigger can only be used with scene.actionManager"), null) : (this.actions.push(i), t.Triggers[i.trigger] ? t.Triggers[i.trigger]++ : t.Triggers[i.trigger] = 1, i._actionManager = this, i._prepare(), i)
        }, t.prototype.unregisterAction = function(e) {
            var i = this.actions.indexOf(e);
            return -1 !== i && (this.actions.splice(i, 1), t.Triggers[e.trigger] -= 1, 0 === t.Triggers[e.trigger] && delete t.Triggers[e.trigger], delete e._actionManager, !0)
        }, t.prototype.processTrigger = function(e, i) {
            for (var r = 0; r < this.actions.length; r++) {
                var n = this.actions[r];
                if (n.trigger === e) {
                    if (i && (e === t.OnKeyUpTrigger || e === t.OnKeyDownTrigger)) {
                        var o = n.getTriggerParameter();
                        if (o && o !== i.sourceEvent.keyCode) {
                            if (!o.toLowerCase) continue;
                            var s = o.toLowerCase();
                            if (s !== i.sourceEvent.key) {
                                var a = i.sourceEvent.charCode ? i.sourceEvent.charCode : i.sourceEvent.keyCode;
                                if (String.fromCharCode(a).toLowerCase() !== s) continue
                            }
                        }
                    }
                    n._executeCurrent(i)
                }
            }
        }, t.prototype._getEffectiveTarget = function(e, t) {
            for (var i = t.split("."), r = 0; r < i.length - 1; r++) e = e[i[r]];
            return e
        }, t.prototype._getProperty = function(e) {
            var t = e.split(".");
            return t[t.length - 1]
        }, t.prototype.serialize = function(i) {
            for (var r = {
                    children: new Array,
                    name: i,
                    type: 3,
                    properties: new Array
                }, n = 0; n < this.actions.length; n++) {
                var o = {
                        type: 0,
                        children: new Array,
                        name: t.GetTriggerName(this.actions[n].trigger),
                        properties: new Array
                    },
                    s = this.actions[n].triggerOptions;
                if (s && "number" != typeof s)
                    if (s.parameter instanceof e.Node) o.properties.push(e.Action._GetTargetProperty(s.parameter));
                    else {
                        var a = {};
                        e.Tools.DeepCopy(s.parameter, a, ["mesh"]), s.parameter.mesh && (a._meshId = s.parameter.mesh.id), o.properties.push({
                            name: "parameter",
                            targetType: null,
                            value: a
                        })
                    }
                this.actions[n].serialize(o), r.children.push(o)
            }
            return r
        }, t.Parse = function(i, r, n) {
            var o = new t(n);
            null === r ? n.actionManager = o : r.actionManager = o;
            for (var s = function(t, i) {
                    var r = Object.create(e.Tools.Instantiate("BABYLON." + t).prototype);
                    return r.constructor.apply(r, i), r
                }, a = function(t, i, r, n) {
                    if (null === n) {
                        var o = parseFloat(i);
                        return "true" === i || "false" === i ? "true" === i : isNaN(o) ? i : o
                    }
                    for (var s = n.split("."), a = i.split(","), l = 0; l < s.length; l++) r = r[s[l]];
                    if ("boolean" == typeof r) return "true" === a[0];
                    if ("string" == typeof r) return a[0];
                    for (var c = new Array, l = 0; l < a.length; l++) c.push(parseFloat(a[l]));
                    return r instanceof e.Vector3 ? e.Vector3.FromArray(c) : r instanceof e.Vector4 ? e.Vector4.FromArray(c) : r instanceof e.Color3 ? e.Color3.FromArray(c) : r instanceof e.Color4 ? e.Color4.FromArray(c) : parseFloat(a[0])
                }, l = function(i, r, c, h, u) {
                    if (void 0 === u && (u = null), !i.detached) {
                        var f = new Array,
                            d = null,
                            p = null,
                            _ = i.combine && i.combine.length > 0;
                        if (2 === i.type ? f.push(o) : f.push(r), _) {
                            for (var m = new Array, g = 0; g < i.combine.length; g++) l(i.combine[g], t.NothingTrigger, c, h, m);
                            f.push(m)
                        } else
                            for (var v = 0; v < i.properties.length; v++) {
                                var y = i.properties[v].value,
                                    b = i.properties[v].name,
                                    x = i.properties[v].targetType;
                                "target" === b ? y = d = null !== x && "SceneProperties" === x ? n : n.getNodeByName(y) : "parent" === b ? y = n.getNodeByName(y) : "sound" === b ? y = n.getSoundByName(y) : "propertyPath" !== b ? y = 2 === i.type && "operator" === b ? e.ValueCondition[y] : a(0, y, d, "value" === b ? p : null) : p = y, f.push(y)
                            }
                        if (null === u ? f.push(c) : f.push(null), "InterpolateValueAction" === i.name) {
                            var T = f[f.length - 2];
                            f[f.length - 1] = T, f[f.length - 2] = c
                        }
                        var E = s(i.name, f);
                        if (E instanceof e.Condition && null !== c) {
                            var A = new e.DoNothingAction(r, c);
                            h ? h.then(A) : o.registerAction(A), h = A
                        }
                        null === u ? E instanceof e.Condition ? (c = E, E = h) : (c = null, h ? h.then(E) : o.registerAction(E)) : u.push(E);
                        for (var v = 0; v < i.children.length; v++) l(i.children[v], r, c, E, null)
                    }
                }, c = 0; c < i.children.length; c++) {
                var h, u = i.children[c];
                if (u.properties.length > 0) {
                    var f = u.properties[0].value,
                        d = null === u.properties[0].targetType ? f : n.getMeshByName(f);
                    d._meshId && (d.mesh = n.getMeshByID(d._meshId)), h = {
                        trigger: t[u.name],
                        parameter: d
                    }
                } else h = t[u.name];
                for (var p = 0; p < u.children.length; p++) u.detached || l(u.children[p], h, null, null)
            }
        }, t.GetTriggerName = function(e) {
            switch (e) {
                case 0:
                    return "NothingTrigger";
                case 1:
                    return "OnPickTrigger";
                case 2:
                    return "OnLeftPickTrigger";
                case 3:
                    return "OnRightPickTrigger";
                case 4:
                    return "OnCenterPickTrigger";
                case 5:
                    return "OnPickDownTrigger";
                case 6:
                    return "OnPickUpTrigger";
                case 7:
                    return "OnLongPressTrigger";
                case 8:
                    return "OnPointerOverTrigger";
                case 9:
                    return "OnPointerOutTrigger";
                case 10:
                    return "OnEveryFrameTrigger";
                case 11:
                    return "OnIntersectionEnterTrigger";
                case 12:
                    return "OnIntersectionExitTrigger";
                case 13:
                    return "OnKeyDownTrigger";
                case 14:
                    return "OnKeyUpTrigger";
                case 15:
                    return "OnPickOutTrigger";
                default:
                    return ""
            }
        }, t._NothingTrigger = 0, t._OnPickTrigger = 1, t._OnLeftPickTrigger = 2, t._OnRightPickTrigger = 3, t._OnCenterPickTrigger = 4, t._OnPickDownTrigger = 5, t._OnDoublePickTrigger = 6, t._OnPickUpTrigger = 7, t._OnLongPressTrigger = 8, t._OnPointerOverTrigger = 9, t._OnPointerOutTrigger = 10, t._OnEveryFrameTrigger = 11, t._OnIntersectionEnterTrigger = 12, t._OnIntersectionExitTrigger = 13, t._OnKeyDownTrigger = 14, t._OnKeyUpTrigger = 15, t._OnPickOutTrigger = 16, t.Triggers = {}, t
    })();
    e.ActionManager = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c) {
            void 0 === s && (s = 1e3);
            var h = t.call(this, i, a) || this;
            return h.propertyPath = n, h.value = o, h.duration = s, h.stopOtherAnimations = l, h.onInterpolationDone = c, h.onInterpolationDoneObservable = new e.Observable,
                h._target = h._effectiveTarget = r, h
        }
        return __extends(i, t), i.prototype._prepare = function() {
            this._effectiveTarget = this._getEffectiveTarget(this._effectiveTarget, this.propertyPath), this._property = this._getProperty(this.propertyPath)
        }, i.prototype.execute = function() {
            var t, i = this,
                r = this._actionManager.getScene(),
                n = [{
                    frame: 0,
                    value: this._effectiveTarget[this._property]
                }, {
                    frame: 100,
                    value: this.value
                }];
            if ("number" == typeof this.value) t = e.Animation.ANIMATIONTYPE_FLOAT;
            else if (this.value instanceof e.Color3) t = e.Animation.ANIMATIONTYPE_COLOR3;
            else if (this.value instanceof e.Vector3) t = e.Animation.ANIMATIONTYPE_VECTOR3;
            else if (this.value instanceof e.Matrix) t = e.Animation.ANIMATIONTYPE_MATRIX;
            else {
                if (!(this.value instanceof e.Quaternion)) return void e.Tools.Warn("InterpolateValueAction: Unsupported type (" + typeof this.value + ")");
                t = e.Animation.ANIMATIONTYPE_QUATERNION
            }
            var o = new e.Animation("InterpolateValueAction", this._property, 1e3 / this.duration * 100, t, e.Animation.ANIMATIONLOOPMODE_CONSTANT);
            o.setKeys(n), this.stopOtherAnimations && r.stopAnimation(this._effectiveTarget);
            var s = function() {
                i.onInterpolationDoneObservable.notifyObservers(i), i.onInterpolationDone && i.onInterpolationDone()
            };
            r.beginDirectAnimation(this._effectiveTarget, [o], 0, 100, !1, 1, s)
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "InterpolateValueAction",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "propertyPath",
                    value: this.propertyPath
                }, {
                    name: "value",
                    value: e.Action._SerializeValueAsString(this.value)
                }, {
                    name: "duration",
                    value: e.Action._SerializeValueAsString(this.duration)
                }, {
                    name: "stopOtherAnimations",
                    value: e.Action._SerializeValueAsString(this.stopOtherAnimations) || !1
                }]
            }, i)
        }, i
    })(e.Action);
    e.InterpolateValueAction = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i, r, n) {
            var o = t.call(this, e, n) || this;
            return o.propertyPath = r, o._target = o._effectiveTarget = i, o
        }
        return __extends(i, t), i.prototype._prepare = function() {
            this._effectiveTarget = this._getEffectiveTarget(this._effectiveTarget, this.propertyPath), this._property = this._getProperty(this.propertyPath)
        }, i.prototype.execute = function() {
            this._effectiveTarget[this._property] = !this._effectiveTarget[this._property]
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "SwitchBooleanAction",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "propertyPath",
                    value: this.propertyPath
                }]
            }, i)
        }, i
    })(e.Action);
    e.SwitchBooleanAction = t;
    var i = (function(t) {
        function i(e, i, r, n) {
            var o = t.call(this, e, n) || this;
            return o.value = r, o._target = i, o
        }
        return __extends(i, t), i.prototype.execute = function() {
            this._target.state = this.value
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "SetStateAction",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "value",
                    value: this.value
                }]
            }, i)
        }, i
    })(e.Action);
    e.SetStateAction = i;
    var r = (function(t) {
        function i(e, i, r, n, o) {
            var s = t.call(this, e, o) || this;
            return s.propertyPath = r, s.value = n, s._target = s._effectiveTarget = i, s
        }
        return __extends(i, t), i.prototype._prepare = function() {
            this._effectiveTarget = this._getEffectiveTarget(this._effectiveTarget, this.propertyPath), this._property = this._getProperty(this.propertyPath)
        }, i.prototype.execute = function() {
            this._effectiveTarget[this._property] = this.value, this._target.markAsDirty && this._target.markAsDirty(this._property)
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "SetValueAction",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "propertyPath",
                    value: this.propertyPath
                }, {
                    name: "value",
                    value: e.Action._SerializeValueAsString(this.value)
                }]
            }, i)
        }, i
    })(e.Action);
    e.SetValueAction = r;
    var n = (function(t) {
        function i(e, i, r, n, o) {
            var s = t.call(this, e, o) || this;
            return s.propertyPath = r, s.value = n, s._target = s._effectiveTarget = i, s
        }
        return __extends(i, t), i.prototype._prepare = function() {
            this._effectiveTarget = this._getEffectiveTarget(this._effectiveTarget, this.propertyPath), this._property = this._getProperty(this.propertyPath), "number" != typeof this._effectiveTarget[this._property] && e.Tools.Warn("Warning: IncrementValueAction can only be used with number values")
        }, i.prototype.execute = function() {
            this._effectiveTarget[this._property] += this.value, this._target.markAsDirty && this._target.markAsDirty(this._property)
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "IncrementValueAction",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "propertyPath",
                    value: this.propertyPath
                }, {
                    name: "value",
                    value: e.Action._SerializeValueAsString(this.value)
                }]
            }, i)
        }, i
    })(e.Action);
    e.IncrementValueAction = n;
    var o = (function(t) {
        function i(e, i, r, n, o, s) {
            var a = t.call(this, e, s) || this;
            return a.from = r, a.to = n, a.loop = o, a._target = i, a
        }
        return __extends(i, t), i.prototype._prepare = function() {}, i.prototype.execute = function() {
            this._actionManager.getScene().beginAnimation(this._target, this.from, this.to, this.loop)
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "PlayAnimationAction",
                properties: [e.Action._GetTargetProperty(this._target), {
                    name: "from",
                    value: String(this.from)
                }, {
                    name: "to",
                    value: String(this.to)
                }, {
                    name: "loop",
                    value: e.Action._SerializeValueAsString(this.loop) || !1
                }]
            }, i)
        }, i
    })(e.Action);
    e.PlayAnimationAction = o;
    var s = (function(t) {
        function i(e, i, r) {
            var n = t.call(this, e, r) || this;
            return n._target = i, n
        }
        return __extends(i, t), i.prototype._prepare = function() {}, i.prototype.execute = function() {
            this._actionManager.getScene().stopAnimation(this._target)
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "StopAnimationAction",
                properties: [e.Action._GetTargetProperty(this._target)]
            }, i)
        }, i
    })(e.Action);
    e.StopAnimationAction = s;
    var a = (function(t) {
        function i(i, r) {
            return void 0 === i && (i = e.ActionManager.NothingTrigger), t.call(this, i, r) || this
        }
        return __extends(i, t), i.prototype.execute = function() {}, i.prototype.serialize = function(e) {
            return t.prototype._serialize.call(this, {
                name: "DoNothingAction",
                properties: []
            }, e)
        }, i
    })(e.Action);
    e.DoNothingAction = a;
    var l = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, r) || this;
            return n.children = i, n
        }
        return __extends(t, e), t.prototype._prepare = function() {
            for (var e = 0; e < this.children.length; e++) this.children[e]._actionManager = this._actionManager, this.children[e]._prepare()
        }, t.prototype.execute = function(e) {
            for (var t = 0; t < this.children.length; t++) this.children[t].execute(e)
        }, t.prototype.serialize = function(t) {
            for (var i = e.prototype._serialize.call(this, {
                    name: "CombineAction",
                    properties: [],
                    combine: []
                }, t), r = 0; r < this.children.length; r++) i.combine.push(this.children[r].serialize(null));
            return i
        }, t
    })(e.Action);
    e.CombineAction = l;
    var c = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, r) || this;
            return n.func = i, n
        }
        return __extends(t, e), t.prototype.execute = function(e) {
            this.func(e)
        }, t
    })(e.Action);
    e.ExecuteCodeAction = c;
    var h = (function(t) {
        function i(e, i, r, n) {
            var o = t.call(this, e, n) || this;
            return o._target = i, o._parent = r, o
        }
        return __extends(i, t), i.prototype._prepare = function() {}, i.prototype.execute = function() {
            if (this._target.parent !== this._parent) {
                var t = this._parent.getWorldMatrix().clone();
                t.invert(), this._target.position = e.Vector3.TransformCoordinates(this._target.position, t), this._target.parent = this._parent
            }
        }, i.prototype.serialize = function(i) {
            return t.prototype._serialize.call(this, {
                name: "SetParentAction",
                properties: [e.Action._GetTargetProperty(this._target), e.Action._GetTargetProperty(this._parent)]
            }, i)
        }, i
    })(e.Action);
    e.SetParentAction = h;
    var u = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, r) || this;
            return n._sound = i, n
        }
        return __extends(t, e), t.prototype._prepare = function() {}, t.prototype.execute = function() {
            void 0 !== this._sound && this._sound.play()
        }, t.prototype.serialize = function(t) {
            return e.prototype._serialize.call(this, {
                name: "PlaySoundAction",
                properties: [{
                    name: "sound",
                    value: this._sound.name
                }]
            }, t)
        }, t
    })(e.Action);
    e.PlaySoundAction = u;
    var f = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, r) || this;
            return n._sound = i, n
        }
        return __extends(t, e), t.prototype._prepare = function() {}, t.prototype.execute = function() {
            void 0 !== this._sound && this._sound.stop()
        }, t.prototype.serialize = function(t) {
            return e.prototype._serialize.call(this, {
                name: "StopSoundAction",
                properties: [{
                    name: "sound",
                    value: this._sound.name
                }]
            }, t)
        }, t
    })(e.Action);
    e.StopSoundAction = f
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o, s, a) {
            if (void 0 === s && (s = .01), void 0 === a && (a = e.Texture.TRILINEAR_SAMPLINGMODE), this.name = t, this.sprites = new Array, this.renderingGroupId = 0, this.layerMask = 268435455, this.fogEnabled = !0, this.isPickable = !1, this.onDisposeObservable = new e.Observable, this._vertexBuffers = {}, this._capacity = r, this._spriteTexture = new e.Texture(i, o, !0, !1, a), this._spriteTexture.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._spriteTexture.wrapV = e.Texture.CLAMP_ADDRESSMODE, n.width && n.height) this.cellWidth = n.width, this.cellHeight = n.height;
            else {
                if (void 0 === n) return;
                this.cellWidth = n, this.cellHeight = n
            }
            this._epsilon = s, this._scene = o, this._scene.spriteManagers.push(this);
            for (var l = [], c = 0, h = 0; h < r; h++) l.push(c), l.push(c + 1), l.push(c + 2), l.push(c), l.push(c + 2), l.push(c + 3), c += 4;
            this._indexBuffer = o.getEngine().createIndexBuffer(l), this._vertexData = new Float32Array(16 * r * 4), this._buffer = new e.Buffer(o.getEngine(), this._vertexData, !0, 16);
            var u = this._buffer.createVertexBuffer(e.VertexBuffer.PositionKind, 0, 4),
                f = this._buffer.createVertexBuffer("options", 4, 4),
                d = this._buffer.createVertexBuffer("cellInfo", 8, 4),
                p = this._buffer.createVertexBuffer(e.VertexBuffer.ColorKind, 12, 4);
            this._vertexBuffers[e.VertexBuffer.PositionKind] = u, this._vertexBuffers.options = f, this._vertexBuffers.cellInfo = d, this._vertexBuffers[e.VertexBuffer.ColorKind] = p, this._effectBase = this._scene.getEngine().createEffect("sprites", [e.VertexBuffer.PositionKind, "options", "cellInfo", e.VertexBuffer.ColorKind], ["view", "projection", "textureInfos", "alphaTest"], ["diffuseSampler"], ""), this._effectFog = this._scene.getEngine().createEffect("sprites", [e.VertexBuffer.PositionKind, "options", "cellInfo", e.VertexBuffer.ColorKind], ["view", "projection", "textureInfos", "alphaTest", "vFogInfos", "vFogColor"], ["diffuseSampler"], "#define FOG")
        }
        return Object.defineProperty(t.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "texture", {
            get: function() {
                return this._spriteTexture
            },
            set: function(e) {
                this._spriteTexture = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._appendSpriteVertex = function(e, t, i, r, n) {
            var o = 16 * e;
            0 === i ? i = this._epsilon : 1 === i && (i = 1 - this._epsilon), 0 === r ? r = this._epsilon : 1 === r && (r = 1 - this._epsilon), this._vertexData[o] = t.position.x, this._vertexData[o + 1] = t.position.y, this._vertexData[o + 2] = t.position.z, this._vertexData[o + 3] = t.angle, this._vertexData[o + 4] = t.width, this._vertexData[o + 5] = t.height, this._vertexData[o + 6] = i, this._vertexData[o + 7] = r, this._vertexData[o + 8] = t.invertU ? 1 : 0, this._vertexData[o + 9] = t.invertV ? 1 : 0;
            var s = t.cellIndex / n >> 0;
            this._vertexData[o + 10] = t.cellIndex - s * n, this._vertexData[o + 11] = s, this._vertexData[o + 12] = t.color.r, this._vertexData[o + 13] = t.color.g, this._vertexData[o + 14] = t.color.b, this._vertexData[o + 15] = t.color.a
        }, t.prototype.intersects = function(t, i, r, n) {
            for (var o = Math.min(this._capacity, this.sprites.length), s = e.Vector3.Zero(), a = e.Vector3.Zero(), l = Number.MAX_VALUE, c = null, h = e.Vector3.Zero(), u = i.getViewMatrix(), f = 0; f < o; f++) {
                var d = this.sprites[f];
                if (d) {
                    if (r) {
                        if (!r(d)) continue
                    } else if (!d.isPickable) continue;
                    if (e.Vector3.TransformCoordinatesToRef(d.position, u, h), s.copyFromFloats(h.x - d.width / 2, h.y - d.height / 2, h.z), a.copyFromFloats(h.x + d.width / 2, h.y + d.height / 2, h.z), t.intersectsBoxMinMax(s, a)) {
                        var p = e.Vector3.Distance(h, t.origin);
                        if (l > p && (l = p, c = d, n)) break
                    }
                }
            }
            if (c) {
                var _ = new e.PickingInfo;
                return _.hit = !0, _.pickedSprite = c, _.distance = l, _
            }
            return null
        }, t.prototype.render = function() {
            if (this._effectBase.isReady() && this._effectFog.isReady() && this._spriteTexture && this._spriteTexture.isReady()) {
                for (var t = this._scene.getEngine(), i = this._spriteTexture.getBaseSize(), r = t.getDeltaTime(), n = Math.min(this._capacity, this.sprites.length), o = i.width / this.cellWidth, s = 0, a = 0; a < n; a++) {
                    var l = this.sprites[a];
                    l && (l._animate(r), this._appendSpriteVertex(s++, l, 0, 0, o), this._appendSpriteVertex(s++, l, 1, 0, o), this._appendSpriteVertex(s++, l, 1, 1, o), this._appendSpriteVertex(s++, l, 0, 1, o))
                }
                this._buffer.update(this._vertexData);
                var c = this._effectBase;
                this._scene.fogEnabled && this._scene.fogMode !== e.Scene.FOGMODE_NONE && this.fogEnabled && (c = this._effectFog), t.enableEffect(c);
                var h = this._scene.getViewMatrix();
                c.setTexture("diffuseSampler", this._spriteTexture), c.setMatrix("view", h), c.setMatrix("projection", this._scene.getProjectionMatrix()), c.setFloat2("textureInfos", this.cellWidth / i.width, this.cellHeight / i.height), this._scene.fogEnabled && this._scene.fogMode !== e.Scene.FOGMODE_NONE && this.fogEnabled && (c.setFloat4("vFogInfos", this._scene.fogMode, this._scene.fogStart, this._scene.fogEnd, this._scene.fogDensity), c.setColor3("vFogColor", this._scene.fogColor)), t.bindBuffers(this._vertexBuffers, this._indexBuffer, c), t.setDepthFunctionToLessOrEqual(), c.setBool("alphaTest", !0), t.setColorWrite(!1), t.drawElementsType(e.Material.TriangleFillMode, 0, 6 * n), t.setColorWrite(!0), c.setBool("alphaTest", !1), t.setAlphaMode(e.Engine.ALPHA_COMBINE), t.drawElementsType(e.Material.TriangleFillMode, 0, 6 * n), t.setAlphaMode(e.Engine.ALPHA_DISABLE)
            }
        }, t.prototype.dispose = function() {
            this._buffer && (this._buffer.dispose(), this._buffer = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null), this._spriteTexture && (this._spriteTexture.dispose(), this._spriteTexture = null);
            var e = this._scene.spriteManagers.indexOf(this);
            this._scene.spriteManagers.splice(e, 1), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear()
        }, t
    })();
    e.SpriteManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            this.name = t, this.color = new e.Color4(1, 1, 1, 1), this.width = 1, this.height = 1, this.angle = 0, this.cellIndex = 0, this.invertU = 0, this.invertV = 0, this.animations = new Array, this.isPickable = !1, this._animationStarted = !1, this._loopAnimation = !1, this._fromIndex = 0, this._toIndex = 0, this._delay = 0, this._direction = 1, this._time = 0, this._manager = i, this._manager.sprites.push(this), this.position = e.Vector3.Zero()
        }
        return Object.defineProperty(t.prototype, "size", {
            get: function() {
                return this.width
            },
            set: function(e) {
                this.width = e, this.height = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.playAnimation = function(e, t, i, r, n) {
            this._fromIndex = e, this._toIndex = t, this._loopAnimation = i, this._delay = r, this._animationStarted = !0, this._direction = e < t ? 1 : -1, this.cellIndex = e, this._time = 0, this._onAnimationEnd = n
        }, t.prototype.stopAnimation = function() {
            this._animationStarted = !1
        }, t.prototype._animate = function(e) {
            this._animationStarted && (this._time += e, this._time > this._delay && (this._time = this._time % this._delay, this.cellIndex += this._direction, this.cellIndex > this._toIndex && (this._loopAnimation ? this.cellIndex = this._fromIndex : (this.cellIndex = this._toIndex, this._animationStarted = !1, this._onAnimationEnd && this._onAnimationEnd(), this.disposeWhenFinishedAnimating && this.dispose()))))
        }, t.prototype.dispose = function() {
            for (var e = 0; e < this._manager.sprites.length; e++) this._manager.sprites[e] == this && this._manager.sprites.splice(e, 1)
        }, t
    })();
    e.Sprite = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i) {
            this.bu = e, this.bv = t, this.distance = i, this.faceId = 0, this.subMeshId = 0
        }
        return e
    })();
    e.IntersectionInfo = t;
    var i = (function() {
        function t() {
            this.hit = !1, this.distance = 0, this.pickedPoint = null, this.pickedMesh = null, this.bu = 0, this.bv = 0, this.faceId = -1, this.subMeshId = 0, this.pickedSprite = null
        }
        return t.prototype.getNormal = function(t, i) {
            if (void 0 === t && (t = !1), void 0 === i && (i = !0), !this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(e.VertexBuffer.NormalKind)) return null;
            var r = this.pickedMesh.getIndices();
            if (!r) return null;
            var n;
            if (i) {
                var o = this.pickedMesh.getVerticesData(e.VertexBuffer.NormalKind),
                    s = e.Vector3.FromArray(o, 3 * r[3 * this.faceId]),
                    a = e.Vector3.FromArray(o, 3 * r[3 * this.faceId + 1]),
                    l = e.Vector3.FromArray(o, 3 * r[3 * this.faceId + 2]);
                s = s.scale(this.bu), a = a.scale(this.bv), l = l.scale(1 - this.bu - this.bv), n = new e.Vector3(s.x + a.x + l.x, s.y + a.y + l.y, s.z + a.z + l.z)
            } else {
                var c = this.pickedMesh.getVerticesData(e.VertexBuffer.PositionKind),
                    h = e.Vector3.FromArray(c, 3 * r[3 * this.faceId]),
                    u = e.Vector3.FromArray(c, 3 * r[3 * this.faceId + 1]),
                    f = e.Vector3.FromArray(c, 3 * r[3 * this.faceId + 2]),
                    d = h.subtract(u),
                    p = f.subtract(u);
                n = e.Vector3.Cross(d, p)
            }
            return t && (n = e.Vector3.TransformNormal(n, this.pickedMesh.getWorldMatrix())), e.Vector3.Normalize(n)
        }, t.prototype.getTextureCoordinates = function() {
            if (!this.pickedMesh || !this.pickedMesh.isVerticesDataPresent(e.VertexBuffer.UVKind)) return null;
            var t = this.pickedMesh.getIndices();
            if (!t) return null;
            var i = this.pickedMesh.getVerticesData(e.VertexBuffer.UVKind);
            if (!i) return null;
            var r = e.Vector2.FromArray(i, 2 * t[3 * this.faceId]),
                n = e.Vector2.FromArray(i, 2 * t[3 * this.faceId + 1]),
                o = e.Vector2.FromArray(i, 2 * t[3 * this.faceId + 2]);
            return r = r.scale(1 - this.bu - this.bv), n = n.scale(this.bu), o = o.scale(this.bv), new e.Vector2(r.x + n.x + o.x, r.y + n.y + o.y)
        }, t
    })();
    e.PickingInfo = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i) {
            void 0 === i && (i = Number.MAX_VALUE), this.origin = e, this.direction = t, this.length = i
        }
        return t.prototype.intersectsBoxMinMax = function(e, t) {
            var i, r, n, o, s = 0,
                a = Number.MAX_VALUE;
            if (Math.abs(this.direction.x) < 1e-7) {
                if (this.origin.x < e.x || this.origin.x > t.x) return !1
            } else if (i = 1 / this.direction.x, r = (e.x - this.origin.x) * i, n = (t.x - this.origin.x) * i, n === -1 / 0 && (n = 1 / 0), r > n && (o = r, r = n, n = o), s = Math.max(r, s), a = Math.min(n, a), s > a) return !1;
            if (Math.abs(this.direction.y) < 1e-7) {
                if (this.origin.y < e.y || this.origin.y > t.y) return !1
            } else if (i = 1 / this.direction.y, r = (e.y - this.origin.y) * i, n = (t.y - this.origin.y) * i, n === -1 / 0 && (n = 1 / 0), r > n && (o = r, r = n, n = o), s = Math.max(r, s), a = Math.min(n, a), s > a) return !1;
            if (Math.abs(this.direction.z) < 1e-7) {
                if (this.origin.z < e.z || this.origin.z > t.z) return !1
            } else if (i = 1 / this.direction.z, r = (e.z - this.origin.z) * i, n = (t.z - this.origin.z) * i, n === -1 / 0 && (n = 1 / 0), r > n && (o = r, r = n, n = o), s = Math.max(r, s), a = Math.min(n, a), s > a) return !1;
            return !0
        }, t.prototype.intersectsBox = function(e) {
            return this.intersectsBoxMinMax(e.minimum, e.maximum)
        }, t.prototype.intersectsSphere = function(e) {
            var t = e.center.x - this.origin.x,
                i = e.center.y - this.origin.y,
                r = e.center.z - this.origin.z,
                n = t * t + i * i + r * r,
                o = e.radius * e.radius;
            if (n <= o) return !0;
            var s = t * this.direction.x + i * this.direction.y + r * this.direction.z;
            return !(s < 0) && n - s * s <= o
        }, t.prototype.intersectsTriangle = function(t, i, r) {
            this._edge1 || (this._edge1 = e.Vector3.Zero(), this._edge2 = e.Vector3.Zero(), this._pvec = e.Vector3.Zero(), this._tvec = e.Vector3.Zero(), this._qvec = e.Vector3.Zero()), i.subtractToRef(t, this._edge1), r.subtractToRef(t, this._edge2), e.Vector3.CrossToRef(this.direction, this._edge2, this._pvec);
            var n = e.Vector3.Dot(this._edge1, this._pvec);
            if (0 === n) return null;
            var o = 1 / n;
            this.origin.subtractToRef(t, this._tvec);
            var s = e.Vector3.Dot(this._tvec, this._pvec) * o;
            if (s < 0 || s > 1) return null;
            e.Vector3.CrossToRef(this._tvec, this._edge1, this._qvec);
            var a = e.Vector3.Dot(this.direction, this._qvec) * o;
            if (a < 0 || s + a > 1) return null;
            var l = e.Vector3.Dot(this._edge2, this._qvec) * o;
            return l > this.length ? null : new e.IntersectionInfo(s, a, l)
        }, t.prototype.intersectsPlane = function(t) {
            var i, r = e.Vector3.Dot(t.normal, this.direction);
            if (Math.abs(r) < 9.99999997475243e-7) return null;
            var n = e.Vector3.Dot(t.normal, this.origin);
            return i = (-t.d - n) / r, i < 0 ? i < -9.99999997475243e-7 ? null : 0 : i
        }, t.prototype.intersectsMesh = function(i, r) {
            var n = e.Tmp.Matrix[0];
            return i.getWorldMatrix().invertToRef(n), this._tmpRay ? t.TransformToRef(this, n, this._tmpRay) : this._tmpRay = t.Transform(this, n), i.intersects(this._tmpRay, r)
        }, t.prototype.intersectsMeshes = function(e, t, i) {
            i ? i.length = 0 : i = [];
            for (var r = 0; r < e.length; r++) {
                var n = this.intersectsMesh(e[r], t);
                n.hit && i.push(n)
            }
            return i.sort(this._comparePickingInfo), i
        }, t.prototype._comparePickingInfo = function(e, t) {
            return e.distance < t.distance ? -1 : e.distance > t.distance ? 1 : 0
        }, t.prototype.intersectionSegment = function(i, r, n) {
            var o, s, a, l, c = this.origin.add(this.direction.multiplyByFloats(t.rayl, t.rayl, t.rayl)),
                h = r.subtract(i),
                u = c.subtract(this.origin),
                f = i.subtract(this.origin),
                d = e.Vector3.Dot(h, h),
                p = e.Vector3.Dot(h, u),
                _ = e.Vector3.Dot(u, u),
                m = e.Vector3.Dot(h, f),
                g = e.Vector3.Dot(u, f),
                v = d * _ - p * p,
                y = v,
                b = v;
            v < t.smallnum ? (s = 0, y = 1, l = g, b = _) : (s = p * g - _ * m, l = d * g - p * m, s < 0 ? (s = 0, l = g, b = _) : s > y && (s = y, l = g + p, b = _)), l < 0 ? (l = 0, -m < 0 ? s = 0 : -m > d ? s = y : (s = -m, y = d)) : l > b && (l = b, -m + p < 0 ? s = 0 : -m + p > d ? s = y : (s = -m + p, y = d)), o = Math.abs(s) < t.smallnum ? 0 : s / y, a = Math.abs(l) < t.smallnum ? 0 : l / b;
            var x = u.multiplyByFloats(a, a, a),
                T = f.add(h.multiplyByFloats(o, o, o)).subtract(x);
            return a > 0 && a <= this.length && T.lengthSquared() < n * n ? x.length() : -1
        }, t.prototype.update = function(t, i, r, n, o, s, a) {
            return e.Vector3.UnprojectFloatsToRef(t, i, 0, r, n, o, s, a, this.origin), e.Vector3.UnprojectFloatsToRef(t, i, 1, r, n, o, s, a, e.Tmp.Vector3[0]), e.Tmp.Vector3[0].subtractToRef(this.origin, this.direction), this.direction.normalize(), this
        }, t.Zero = function() {
            return new t(e.Vector3.Zero(), e.Vector3.Zero())
        }, t.CreateNew = function(e, i, r, n, o, s, a) {
            return t.Zero().update(e, i, r, n, o, s, a)
        }, t.CreateNewFromTo = function(i, r, n) {
            void 0 === n && (n = e.Matrix.Identity());
            var o = r.subtract(i),
                s = Math.sqrt(o.x * o.x + o.y * o.y + o.z * o.z);
            return o.normalize(), t.Transform(new t(i, o, s), n)
        }, t.Transform = function(i, r) {
            var n = new t(new e.Vector3(0, 0, 0), new e.Vector3(0, 0, 0));
            return t.TransformToRef(i, r, n), n
        }, t.TransformToRef = function(t, i, r) {
            e.Vector3.TransformCoordinatesToRef(t.origin, i, r.origin), e.Vector3.TransformNormalToRef(t.direction, i, r.direction), r.length = t.length;
            var n = r.direction,
                o = n.length();
            if (0 !== o && 1 !== o) {
                var s = 1 / o;
                n.x *= s, n.y *= s, n.z *= s, r.length *= o
            }
        }, t.smallnum = 1e-8, t.rayl = 1e9, t
    })();
    e.Ray = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = function(e, t, i, r) {
            return !(e.x > i.x + r) && (!(i.x - r > t.x) && (!(e.y > i.y + r) && (!(i.y - r > t.y) && (!(e.z > i.z + r) && !(i.z - r > t.z)))))
        },
        i = (function() {
            var e = {
                root: 0,
                found: !1
            };
            return function(t, i, r, n) {
                e.root = 0, e.found = !1;
                var o = i * i - 4 * t * r;
                if (o < 0) return e;
                var s = Math.sqrt(o),
                    a = (-i - s) / (2 * t),
                    l = (-i + s) / (2 * t);
                if (a > l) {
                    var c = l;
                    l = a, a = c
                }
                return a > 0 && a < n ? (e.root = a, e.found = !0, e) : l > 0 && l < n ? (e.root = l, e.found = !0, e) : e
            }
        })(),
        r = (function() {
            function r() {
                this._collisionPoint = e.Vector3.Zero(), this._planeIntersectionPoint = e.Vector3.Zero(), this._tempVector = e.Vector3.Zero(), this._tempVector2 = e.Vector3.Zero(), this._tempVector3 = e.Vector3.Zero(), this._tempVector4 = e.Vector3.Zero(), this._edge = e.Vector3.Zero(), this._baseToVertex = e.Vector3.Zero(), this._destinationPoint = e.Vector3.Zero(), this._slidePlaneNormal = e.Vector3.Zero(), this._displacementVector = e.Vector3.Zero(), this._radius = e.Vector3.One(), this._retry = 0, this._basePointWorld = e.Vector3.Zero(), this._velocityWorld = e.Vector3.Zero(), this._normalizedVelocity = e.Vector3.Zero(), this._collisionMask = -1
            }
            return Object.defineProperty(r.prototype, "collisionMask", {
                get: function() {
                    return this._collisionMask
                },
                set: function(e) {
                    this._collisionMask = isNaN(e) ? -1 : e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "slidePlaneNormal", {
                get: function() {
                    return this._slidePlaneNormal
                },
                enumerable: !0,
                configurable: !0
            }), r.prototype._initialize = function(t, i, r) {
                this._velocity = i, e.Vector3.NormalizeToRef(i, this._normalizedVelocity), this._basePoint = t, t.multiplyToRef(this._radius, this._basePointWorld), i.multiplyToRef(this._radius, this._velocityWorld), this._velocityWorldLength = this._velocityWorld.length(), this._epsilon = r, this.collisionFound = !1
            }, r.prototype._checkPointInTriangle = function(t, i, r, n, o) {
                i.subtractToRef(t, this._tempVector), r.subtractToRef(t, this._tempVector2), e.Vector3.CrossToRef(this._tempVector, this._tempVector2, this._tempVector4);
                var s = e.Vector3.Dot(this._tempVector4, o);
                return !(s < 0) && (n.subtractToRef(t, this._tempVector3), e.Vector3.CrossToRef(this._tempVector2, this._tempVector3, this._tempVector4), !((s = e.Vector3.Dot(this._tempVector4, o)) < 0) && (e.Vector3.CrossToRef(this._tempVector3, this._tempVector, this._tempVector4), (s = e.Vector3.Dot(this._tempVector4, o)) >= 0))
            }, r.prototype._canDoCollision = function(i, r, n, o) {
                var s = e.Vector3.Distance(this._basePointWorld, i),
                    a = Math.max(this._radius.x, this._radius.y, this._radius.z);
                return !(s > this._velocityWorldLength + a + r) && !!t(n, o, this._basePointWorld, this._velocityWorldLength + a)
            }, r.prototype._testTriangle = function(t, r, n, o, s, a) {
                var l, c = !1;
                r || (r = []), r[t] || (r[t] = new e.Plane(0, 0, 0, 0), r[t].copyFromPoints(n, o, s));
                var h = r[t];
                if (a || h.isFrontFacingTo(this._normalizedVelocity, 0)) {
                    var u = h.signedDistanceTo(this._basePoint),
                        f = e.Vector3.Dot(h.normal, this._velocity);
                    if (0 == f) {
                        if (Math.abs(u) >= 1) return;
                        c = !0, l = 0
                    } else {
                        l = (-1 - u) / f;
                        var d = (1 - u) / f;
                        if (l > d) {
                            var p = d;
                            d = l, l = p
                        }
                        if (l > 1 || d < 0) return;
                        l < 0 && (l = 0), l > 1 && (l = 1)
                    }
                    this._collisionPoint.copyFromFloats(0, 0, 0);
                    var _ = !1,
                        m = 1;
                    if (c || (this._basePoint.subtractToRef(h.normal, this._planeIntersectionPoint), this._velocity.scaleToRef(l, this._tempVector), this._planeIntersectionPoint.addInPlace(this._tempVector), this._checkPointInTriangle(this._planeIntersectionPoint, n, o, s, h.normal) && (_ = !0, m = l, this._collisionPoint.copyFrom(this._planeIntersectionPoint))), !_) {
                        var g = this._velocity.lengthSquared(),
                            v = g;
                        this._basePoint.subtractToRef(n, this._tempVector);
                        var y = 2 * e.Vector3.Dot(this._velocity, this._tempVector),
                            b = this._tempVector.lengthSquared() - 1,
                            x = i(v, y, b, m);
                        x.found && (m = x.root, _ = !0, this._collisionPoint.copyFrom(n)), this._basePoint.subtractToRef(o, this._tempVector), y = 2 * e.Vector3.Dot(this._velocity, this._tempVector), b = this._tempVector.lengthSquared() - 1, x = i(v, y, b, m), x.found && (m = x.root, _ = !0, this._collisionPoint.copyFrom(o)), this._basePoint.subtractToRef(s, this._tempVector), y = 2 * e.Vector3.Dot(this._velocity, this._tempVector), b = this._tempVector.lengthSquared() - 1, x = i(v, y, b, m), x.found && (m = x.root, _ = !0, this._collisionPoint.copyFrom(s)), o.subtractToRef(n, this._edge), n.subtractToRef(this._basePoint, this._baseToVertex);
                        var T = this._edge.lengthSquared(),
                            E = e.Vector3.Dot(this._edge, this._velocity),
                            A = e.Vector3.Dot(this._edge, this._baseToVertex);
                        if (v = T * -g + E * E, y = T * (2 * e.Vector3.Dot(this._velocity, this._baseToVertex)) - 2 * E * A, b = T * (1 - this._baseToVertex.lengthSquared()) + A * A, x = i(v, y, b, m), x.found) {
                            var P = (E * x.root - A) / T;
                            P >= 0 && P <= 1 && (m = x.root, _ = !0, this._edge.scaleInPlace(P), n.addToRef(this._edge, this._collisionPoint))
                        }
                        s.subtractToRef(o, this._edge), o.subtractToRef(this._basePoint, this._baseToVertex), T = this._edge.lengthSquared(), E = e.Vector3.Dot(this._edge, this._velocity), A = e.Vector3.Dot(this._edge, this._baseToVertex), v = T * -g + E * E, y = T * (2 * e.Vector3.Dot(this._velocity, this._baseToVertex)) - 2 * E * A, b = T * (1 - this._baseToVertex.lengthSquared()) + A * A, x = i(v, y, b, m), x.found && (P = (E * x.root - A) / T) >= 0 && P <= 1 && (m = x.root, _ = !0, this._edge.scaleInPlace(P), o.addToRef(this._edge, this._collisionPoint)), n.subtractToRef(s, this._edge), s.subtractToRef(this._basePoint, this._baseToVertex), T = this._edge.lengthSquared(), E = e.Vector3.Dot(this._edge, this._velocity), A = e.Vector3.Dot(this._edge, this._baseToVertex), v = T * -g + E * E, y = T * (2 * e.Vector3.Dot(this._velocity, this._baseToVertex)) - 2 * E * A, b = T * (1 - this._baseToVertex.lengthSquared()) + A * A, x = i(v, y, b, m), x.found && (P = (E * x.root - A) / T) >= 0 && P <= 1 && (m = x.root, _ = !0, this._edge.scaleInPlace(P), s.addToRef(this._edge, this._collisionPoint))
                    }
                    if (_) {
                        var M = m * this._velocity.length();
                        (!this.collisionFound || M < this._nearestDistance) && (this.intersectionPoint ? this.intersectionPoint.copyFrom(this._collisionPoint) : this.intersectionPoint = this._collisionPoint.clone(), this._nearestDistance = M, this.collisionFound = !0)
                    }
                }
            }, r.prototype._collide = function(e, t, i, r, n, o, s) {
                for (var a = r; a < n; a += 3) {
                    var l = t[i[a] - o],
                        c = t[i[a + 1] - o],
                        h = t[i[a + 2] - o];
                    this._testTriangle(a, e, h, c, l, s)
                }
            }, r.prototype._getResponse = function(t, i) {
                t.addToRef(i, this._destinationPoint), i.scaleInPlace(this._nearestDistance / i.length()), this._basePoint.addToRef(i, t), t.subtractToRef(this.intersectionPoint, this._slidePlaneNormal), this._slidePlaneNormal.normalize(), this._slidePlaneNormal.scaleToRef(this._epsilon, this._displacementVector), t.addInPlace(this._displacementVector), this.intersectionPoint.addInPlace(this._displacementVector), this._slidePlaneNormal.scaleInPlace(e.Plane.SignedDistanceToPlaneFromPositionAndNormal(this.intersectionPoint, this._slidePlaneNormal, this._destinationPoint)), this._destinationPoint.subtractInPlace(this._slidePlaneNormal), this._destinationPoint.subtractToRef(this.intersectionPoint, i)
            }, r
        })();
    e.Collider = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    e.CollisionWorker = "";
    var t;
    !(function(e) {
        e[e.INIT = 0] = "INIT", e[e.UPDATE = 1] = "UPDATE", e[e.COLLIDE = 2] = "COLLIDE"
    })(t = e.WorkerTaskType || (e.WorkerTaskType = {}));
    var i;
    !(function(e) {
        e[e.SUCCESS = 0] = "SUCCESS", e[e.UNKNOWN_ERROR = 1] = "UNKNOWN_ERROR"
    })(i = e.WorkerReplyType || (e.WorkerReplyType = {}));
    var r = (function() {
        function r() {
            var n = this;
            this._scaledPosition = e.Vector3.Zero(), this._scaledVelocity = e.Vector3.Zero(), this.onMeshUpdated = function(e) {
                n._addUpdateMeshesList[e.uniqueId] = r.SerializeMesh(e)
            }, this.onGeometryUpdated = function(e) {
                n._addUpdateGeometriesList[e.id] = r.SerializeGeometry(e)
            }, this._afterRender = function() {
                if (n._init && !(0 == n._toRemoveGeometryArray.length && 0 == n._toRemoveMeshesArray.length && 0 == Object.keys(n._addUpdateGeometriesList).length && 0 == Object.keys(n._addUpdateMeshesList).length || n._runningUpdated > 4)) {
                    ++n._runningUpdated;
                    var e = {
                            updatedMeshes: n._addUpdateMeshesList,
                            updatedGeometries: n._addUpdateGeometriesList,
                            removedGeometries: n._toRemoveGeometryArray,
                            removedMeshes: n._toRemoveMeshesArray
                        },
                        i = {
                            payload: e,
                            taskType: t.UPDATE
                        },
                        r = [];
                    for (var o in e.updatedGeometries) e.updatedGeometries.hasOwnProperty(o) && (r.push(i.payload.updatedGeometries[o].indices.buffer), r.push(i.payload.updatedGeometries[o].normals.buffer), r.push(i.payload.updatedGeometries[o].positions.buffer));
                    n._worker.postMessage(i, r), n._addUpdateMeshesList = {}, n._addUpdateGeometriesList = {}, n._toRemoveGeometryArray = [], n._toRemoveMeshesArray = []
                }
            }, this._onMessageFromWorker = function(r) {
                var o = r.data;
                if (o.error != i.SUCCESS) return void e.Tools.Warn("error returned from worker!");
                switch (o.taskType) {
                    case t.INIT:
                        n._init = !0, n._scene.meshes.forEach((function(e) {
                            n.onMeshAdded(e)
                        })), n._scene.getGeometries().forEach((function(e) {
                            n.onGeometryAdded(e)
                        }));
                        break;
                    case t.UPDATE:
                        n._runningUpdated--;
                        break;
                    case t.COLLIDE:
                        var s = o.payload;
                        if (!n._collisionsCallbackArray[s.collisionId]) return;
                        var a = n._collisionsCallbackArray[s.collisionId];
                        if (a) {
                            var l = n._scene.getMeshByUniqueID(s.collidedMeshUniqueId);
                            l && a(s.collisionId, e.Vector3.FromArray(s.newPosition), l)
                        }
                        n._collisionsCallbackArray[s.collisionId] = null
                }
            }, this._collisionsCallbackArray = [], this._init = !1, this._runningUpdated = 0, this._addUpdateMeshesList = {}, this._addUpdateGeometriesList = {}, this._toRemoveGeometryArray = [], this._toRemoveMeshesArray = []
        }
        return r.prototype.getNewPosition = function(e, i, r, n, o, s, a) {
            if (this._init && !this._collisionsCallbackArray[a] && !this._collisionsCallbackArray[a + 1e5]) {
                e.divideToRef(r._radius, this._scaledPosition), i.divideToRef(r._radius, this._scaledVelocity), this._collisionsCallbackArray[a] = s;
                var l = {
                        collider: {
                            position: this._scaledPosition.asArray(),
                            velocity: this._scaledVelocity.asArray(),
                            radius: r._radius.asArray()
                        },
                        collisionId: a,
                        excludedMeshUniqueId: o ? o.uniqueId : null,
                        maximumRetry: n
                    },
                    c = {
                        payload: l,
                        taskType: t.COLLIDE
                    };
                this._worker.postMessage(c)
            }
        }, r.prototype.init = function(i) {
            this._scene = i, this._scene.registerAfterRender(this._afterRender);
            var r = e.WorkerIncluded ? e.Engine.CodeRepository + "Collisions/babylon.collisionWorker.js" : URL.createObjectURL(new Blob([e.CollisionWorker], {
                type: "application/javascript"
            }));
            this._worker = new Worker(r), this._worker.onmessage = this._onMessageFromWorker;
            var n = {
                payload: {},
                taskType: t.INIT
            };
            this._worker.postMessage(n)
        }, r.prototype.destroy = function() {
            this._scene.unregisterAfterRender(this._afterRender), this._worker.terminate()
        }, r.prototype.onMeshAdded = function(e) {
            e.registerAfterWorldMatrixUpdate(this.onMeshUpdated), this.onMeshUpdated(e)
        }, r.prototype.onMeshRemoved = function(e) {
            this._toRemoveMeshesArray.push(e.uniqueId)
        }, r.prototype.onGeometryAdded = function(e) {
            e.onGeometryUpdated = this.onGeometryUpdated, this.onGeometryUpdated(e)
        }, r.prototype.onGeometryDeleted = function(e) {
            this._toRemoveGeometryArray.push(e.id)
        }, r.SerializeMesh = function(t) {
            var i = [];
            t.subMeshes && (i = t.subMeshes.map((function(e, t) {
                var i = e.getBoundingInfo();
                return {
                    position: t,
                    verticesStart: e.verticesStart,
                    verticesCount: e.verticesCount,
                    indexStart: e.indexStart,
                    indexCount: e.indexCount,
                    hasMaterial: !!e.getMaterial(),
                    sphereCenter: i.boundingSphere.centerWorld.asArray(),
                    sphereRadius: i.boundingSphere.radiusWorld,
                    boxMinimum: i.boundingBox.minimumWorld.asArray(),
                    boxMaximum: i.boundingBox.maximumWorld.asArray()
                }
            })));
            var r = null;
            if (t instanceof e.Mesh) {
                var n = t.geometry;
                r = n ? n.id : null
            } else if (t instanceof e.InstancedMesh) {
                var n = t.sourceMesh.geometry;
                r = n ? n.id : null
            }
            var o = t.getBoundingInfo();
            return {
                uniqueId: t.uniqueId,
                id: t.id,
                name: t.name,
                geometryId: r,
                sphereCenter: o.boundingSphere.centerWorld.asArray(),
                sphereRadius: o.boundingSphere.radiusWorld,
                boxMinimum: o.boundingBox.minimumWorld.asArray(),
                boxMaximum: o.boundingBox.maximumWorld.asArray(),
                worldMatrixFromCache: t.worldMatrixFromCache.asArray(),
                subMeshes: i,
                checkCollisions: t.checkCollisions
            }
        }, r.SerializeGeometry = function(t) {
            return {
                id: t.id,
                positions: new Float32Array(t.getVerticesData(e.VertexBuffer.PositionKind) || []),
                normals: new Float32Array(t.getVerticesData(e.VertexBuffer.NormalKind) || []),
                indices: new Uint32Array(t.getIndices() || [])
            }
        }, r
    })();
    e.CollisionCoordinatorWorker = r;
    var n = (function() {
        function t() {
            this._scaledPosition = e.Vector3.Zero(), this._scaledVelocity = e.Vector3.Zero(), this._finalPosition = e.Vector3.Zero()
        }
        return t.prototype.getNewPosition = function(e, t, i, r, n, o, s) {
            e.divideToRef(i._radius, this._scaledPosition), t.divideToRef(i._radius, this._scaledVelocity), i.collidedMesh = null, i._retry = 0, i._initialVelocity = this._scaledVelocity, i._initialPosition = this._scaledPosition, this._collideWithWorld(this._scaledPosition, this._scaledVelocity, i, r, this._finalPosition, n), this._finalPosition.multiplyInPlace(i._radius), o(s, this._finalPosition, i.collidedMesh)
        }, t.prototype.init = function(e) {
            this._scene = e
        }, t.prototype.destroy = function() {}, t.prototype.onMeshAdded = function(e) {}, t.prototype.onMeshUpdated = function(e) {}, t.prototype.onMeshRemoved = function(e) {}, t.prototype.onGeometryAdded = function(e) {}, t.prototype.onGeometryUpdated = function(e) {}, t.prototype.onGeometryDeleted = function(e) {}, t.prototype._collideWithWorld = function(t, i, r, n, o, s) {
            void 0 === s && (s = null);
            var a = 10 * e.Engine.CollisionsEpsilon;
            if (r._retry >= n) return void o.copyFrom(t);
            var l = s ? s.collisionMask : r.collisionMask;
            r._initialize(t, i, a);
            for (var c = 0; c < this._scene.meshes.length; c++) {
                var h = this._scene.meshes[c];
                h.isEnabled() && h.checkCollisions && h.subMeshes && h !== s && 0 != (l & h.collisionGroup) && h._checkCollision(r)
            }
            return r.collisionFound ? (0 === i.x && 0 === i.y && 0 === i.z || r._getResponse(t, i), i.length() <= a ? void o.copyFrom(t) : (r._retry++, void this._collideWithWorld(t, i, r, n, o, s))) : void t.addToRef(i, o)
        }, t
    })();
    e.CollisionCoordinatorLegacy = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            this.particleSystem = t, this.position = e.Vector3.Zero(), this.direction = e.Vector3.Zero(), this.color = new e.Color4(0, 0, 0, 0), this.colorStep = new e.Color4(0, 0, 0, 0), this.lifeTime = 1, this.age = 0, this.size = 0, this.angle = 0, this.angularSpeed = 0, this.cellIndex = 0, this._currentFrameCounter = 0, this.particleSystem.isAnimationSheetEnabled && (this.cellIndex = this.particleSystem.startSpriteCellID, 0 == this.particleSystem.spriteCellChangeSpeed ? this.updateCellIndex = this.updateCellIndexWithSpeedCalculated : this.updateCellIndex = this.updateCellIndexWithCustomSpeed)
        }
        return t.prototype.updateCellIndexWithSpeedCalculated = function(e) {
            var t = (this.lifeTime - this.age) / e / (this.particleSystem.endSpriteCellID + 1 - this.cellIndex);
            this._currentFrameCounter += e, this._currentFrameCounter >= t * e && (this._currentFrameCounter = 0, ++this.cellIndex > this.particleSystem.endSpriteCellID && (this.cellIndex = this.particleSystem.endSpriteCellID))
        }, t.prototype.updateCellIndexWithCustomSpeed = function() {
            this._currentFrameCounter >= this.particleSystem.spriteCellChangeSpeed ? (this.cellIndex++, this._currentFrameCounter = 0, this.cellIndex > this.particleSystem.endSpriteCellID && (this.particleSystem.spriteCellLoop ? this.cellIndex = this.particleSystem.startSpriteCellID : this.cellIndex = this.particleSystem.endSpriteCellID)) : this._currentFrameCounter++
        }, t.prototype.copyTo = function(e) {
            e.position.copyFrom(this.position), e.direction.copyFrom(this.direction), e.color.copyFrom(this.color), e.colorStep.copyFrom(this.colorStep), e.lifeTime = this.lifeTime, e.age = this.age, e.size = this.size, e.angle = this.angle, e.angularSpeed = this.angularSpeed, e.particleSystem = this.particleSystem, e.cellIndex = this.cellIndex
        }, t
    })();
    e.Particle = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(i, r, n, o, s, a) {
            void 0 === o && (o = null), void 0 === s && (s = !1), void 0 === a && (a = .01);
            var l = this;
            this.animations = [], this.renderingGroupId = 0, this.emitter = null, this.emitRate = 10, this.manualEmitCount = -1, this.updateSpeed = .01, this.targetStopDuration = 0, this.disposeOnStop = !1, this.minEmitPower = 1, this.maxEmitPower = 1, this.minLifeTime = 1, this.maxLifeTime = 1, this.minSize = 1, this.maxSize = 1, this.minAngularSpeed = 0, this.maxAngularSpeed = 0, this.layerMask = 268435455, this.customShader = null, this.preventAutoStart = !1, this.onAnimationEnd = null, this.blendMode = t.BLENDMODE_ONEONE, this.forceDepthWrite = !1, this.gravity = e.Vector3.Zero(), this.color1 = new e.Color4(1, 1, 1, 1), this.color2 = new e.Color4(1, 1, 1, 1), this.colorDead = new e.Color4(0, 0, 0, 1), this.textureMask = new e.Color4(1, 1, 1, 1), this.spriteCellLoop = !0, this.spriteCellChangeSpeed = 0, this.startSpriteCellID = 0, this.endSpriteCellID = 0, this.spriteCellWidth = 0, this.spriteCellHeight = 0, this.onDisposeObservable = new e.Observable, this._particles = new Array, this._stockParticles = new Array, this._newPartsExcess = 0, this._vertexBuffers = {}, this._scaledColorStep = new e.Color4(0, 0, 0, 0), this._colorDiff = new e.Color4(0, 0, 0, 0), this._scaledDirection = e.Vector3.Zero(), this._scaledGravity = e.Vector3.Zero(), this._currentRenderId = -1, this._started = !1, this._stopped = !1, this._actualFrame = 0, this._vertexBufferSize = 11, this._appendParticleVertexes = null, this.id = i, this.name = i, this._capacity = r, this._epsilon = a, this._isAnimationSheetEnabled = s, s && (this._vertexBufferSize = 12), this._scene = n || e.Engine.LastCreatedScene, this._customEffect = o, n.particleSystems.push(this), this._createIndexBuffer(), this._vertexData = new Float32Array(r * this._vertexBufferSize * 4), this._vertexBuffer = new e.Buffer(n.getEngine(), this._vertexData, !0, this._vertexBufferSize);
            var c = this._vertexBuffer.createVertexBuffer(e.VertexBuffer.PositionKind, 0, 3),
                h = this._vertexBuffer.createVertexBuffer(e.VertexBuffer.ColorKind, 3, 4),
                u = this._vertexBuffer.createVertexBuffer("options", 7, 4);
            if (this._isAnimationSheetEnabled) {
                var f = this._vertexBuffer.createVertexBuffer("cellIndex", 11, 1);
                this._vertexBuffers.cellIndex = f
            }
            this._vertexBuffers[e.VertexBuffer.PositionKind] = c, this._vertexBuffers[e.VertexBuffer.ColorKind] = h, this._vertexBuffers.options = u, this.particleEmitterType = new e.BoxParticleEmitter, this.updateFunction = function(e) {
                for (var t = 0; t < e.length; t++) {
                    var i = e[t];
                    i.age += l._scaledUpdateSpeed, i.age >= i.lifeTime ? (l.recycleParticle(i), t--) : (i.colorStep.scaleToRef(l._scaledUpdateSpeed, l._scaledColorStep), i.color.addInPlace(l._scaledColorStep), i.color.a < 0 && (i.color.a = 0), i.angle += i.angularSpeed * l._scaledUpdateSpeed, i.direction.scaleToRef(l._scaledUpdateSpeed, l._scaledDirection), i.position.addInPlace(l._scaledDirection), l.gravity.scaleToRef(l._scaledUpdateSpeed, l._scaledGravity), i.direction.addInPlace(l._scaledGravity), l._isAnimationSheetEnabled && i.updateCellIndex(l._scaledUpdateSpeed))
                }
            }
        }
        return Object.defineProperty(t.prototype, "direction1", {
            get: function() {
                return this.particleEmitterType.direction1 ? this.particleEmitterType.direction1 : e.Vector3.Zero()
            },
            set: function(e) {
                this.particleEmitterType.direction1 && (this.particleEmitterType.direction1 = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "direction2", {
            get: function() {
                return this.particleEmitterType.direction2 ? this.particleEmitterType.direction2 : e.Vector3.Zero()
            },
            set: function(e) {
                this.particleEmitterType.direction2 && (this.particleEmitterType.direction2 = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "minEmitBox", {
            get: function() {
                return this.particleEmitterType.minEmitBox ? this.particleEmitterType.minEmitBox : e.Vector3.Zero()
            },
            set: function(e) {
                this.particleEmitterType.minEmitBox && (this.particleEmitterType.minEmitBox = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "maxEmitBox", {
            get: function() {
                return this.particleEmitterType.maxEmitBox ? this.particleEmitterType.maxEmitBox : e.Vector3.Zero()
            },
            set: function(e) {
                this.particleEmitterType.maxEmitBox && (this.particleEmitterType.maxEmitBox = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isAnimationSheetEnabled", {
            get: function() {
                return this._isAnimationSheetEnabled
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "particles", {
            get: function() {
                return this._particles
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getClassName = function() {
            return "ParticleSystem"
        }, t.prototype._createIndexBuffer = function() {
            for (var e = [], t = 0, i = 0; i < this._capacity; i++) e.push(t), e.push(t + 1), e.push(t + 2), e.push(t), e.push(t + 2), e.push(t + 3), t += 4;
            this._indexBuffer = this._scene.getEngine().createIndexBuffer(e)
        }, t.prototype.recycleParticle = function(e) {
            var t = this._particles.pop();
            t !== e && (t.copyTo(e), this._stockParticles.push(t))
        }, t.prototype.getCapacity = function() {
            return this._capacity
        }, t.prototype.isAlive = function() {
            return this._alive
        }, t.prototype.isStarted = function() {
            return this._started
        }, t.prototype.start = function() {
            this._started = !0, this._stopped = !1, this._actualFrame = 0
        }, t.prototype.stop = function() {
            this._stopped = !0
        }, t.prototype.reset = function() {
            this._stockParticles = [], this._particles = []
        }, t.prototype._appendParticleVertex = function(e, t, i, r) {
            var n = e * this._vertexBufferSize;
            this._vertexData[n] = t.position.x, this._vertexData[n + 1] = t.position.y, this._vertexData[n + 2] = t.position.z, this._vertexData[n + 3] = t.color.r, this._vertexData[n + 4] = t.color.g, this._vertexData[n + 5] = t.color.b, this._vertexData[n + 6] = t.color.a, this._vertexData[n + 7] = t.angle, this._vertexData[n + 8] = t.size, this._vertexData[n + 9] = i, this._vertexData[n + 10] = r
        }, t.prototype._appendParticleVertexWithAnimation = function(e, t, i, r) {
            0 === i ? i = this._epsilon : 1 === i && (i = 1 - this._epsilon), 0 === r ? r = this._epsilon : 1 === r && (r = 1 - this._epsilon);
            var n = e * this._vertexBufferSize;
            this._vertexData[n] = t.position.x, this._vertexData[n + 1] = t.position.y, this._vertexData[n + 2] = t.position.z, this._vertexData[n + 3] = t.color.r, this._vertexData[n + 4] = t.color.g, this._vertexData[n + 5] = t.color.b, this._vertexData[n + 6] = t.color.a, this._vertexData[n + 7] = t.angle, this._vertexData[n + 8] = t.size, this._vertexData[n + 9] = i, this._vertexData[n + 10] = r, this._vertexData[n + 11] = t.cellIndex
        }, t.prototype._update = function(t) {
            this._alive = this._particles.length > 0, this.updateFunction(this._particles);
            var i;
            if (this.emitter.position) {
                i = this.emitter.getWorldMatrix()
            } else {
                var r = this.emitter;
                i = e.Matrix.Translation(r.x, r.y, r.z)
            }
            for (var n, o = 0; o < t && this._particles.length !== this._capacity; o++) {
                0 !== this._stockParticles.length ? (n = this._stockParticles.pop(), n.age = 0, n.cellIndex = this.startSpriteCellID) : n = new e.Particle(this), this._particles.push(n);
                var s = e.Scalar.RandomRange(this.minEmitPower, this.maxEmitPower);
                this.startPositionFunction ? this.startPositionFunction(i, n.position, n) : this.particleEmitterType.startPositionFunction(i, n.position, n), this.startDirectionFunction ? this.startDirectionFunction(s, i, n.direction, n) : this.particleEmitterType.startDirectionFunction(s, i, n.direction, n), n.lifeTime = e.Scalar.RandomRange(this.minLifeTime, this.maxLifeTime), n.size = e.Scalar.RandomRange(this.minSize, this.maxSize), n.angularSpeed = e.Scalar.RandomRange(this.minAngularSpeed, this.maxAngularSpeed);
                var a = e.Scalar.RandomRange(0, 1);
                e.Color4.LerpToRef(this.color1, this.color2, a, n.color), this.colorDead.subtractToRef(n.color, this._colorDiff), this._colorDiff.scaleToRef(1 / n.lifeTime, n.colorStep)
            }
        }, t.prototype._getEffect = function() {
            if (this._customEffect) return this._customEffect;
            var t = [];
            this._scene.clipPlane && t.push("#define CLIPPLANE"), this._isAnimationSheetEnabled && t.push("#define ANIMATESHEET");
            var i = t.join("\n");
            if (this._cachedDefines !== i) {
                this._cachedDefines = i;
                var r, n;
                this._isAnimationSheetEnabled ? (r = [e.VertexBuffer.PositionKind, e.VertexBuffer.ColorKind, "options", "cellIndex"], n = ["invView", "view", "projection", "particlesInfos", "vClipPlane", "textureMask"]) : (r = [e.VertexBuffer.PositionKind, e.VertexBuffer.ColorKind, "options"], n = ["invView", "view", "projection", "vClipPlane", "textureMask"]), this._effect = this._scene.getEngine().createEffect("particles", r, n, ["diffuseSampler"], i)
            }
            return this._effect
        }, t.prototype.animate = function() {
            if (this._started) {
                var e = this._getEffect();
                if (this.emitter && e.isReady() && this.particleTexture && this.particleTexture.isReady() && this._currentRenderId !== this._scene.getRenderId()) {
                    this._currentRenderId = this._scene.getRenderId(), this._scaledUpdateSpeed = this.updateSpeed * this._scene.getAnimationRatio();
                    var t;
                    this.manualEmitCount > -1 ? (t = this.manualEmitCount, this._newPartsExcess = 0, this.manualEmitCount = 0) : (t = this.emitRate * this._scaledUpdateSpeed >> 0, this._newPartsExcess += this.emitRate * this._scaledUpdateSpeed - t), this._newPartsExcess > 1 && (t += this._newPartsExcess >> 0, this._newPartsExcess -= this._newPartsExcess >> 0), this._alive = !1, this._stopped ? t = 0 : (this._actualFrame += this._scaledUpdateSpeed, this.targetStopDuration && this._actualFrame >= this.targetStopDuration && this.stop()), this._update(t), this._stopped && (this._alive || (this._started = !1, this.onAnimationEnd && this.onAnimationEnd(), this.disposeOnStop && this._scene._toBeDisposed.push(this))), this._isAnimationSheetEnabled ? this._appendParticleVertexes = this._appenedParticleVertexesWithSheet : this._appendParticleVertexes = this._appenedParticleVertexesNoSheet;
                    for (var i = 0, r = 0; r < this._particles.length; r++) {
                        var n = this._particles[r];
                        this._appendParticleVertexes(i, n), i += 4
                    }
                    this._vertexBuffer && this._vertexBuffer.update(this._vertexData)
                }
            }
        }, t.prototype._appenedParticleVertexesWithSheet = function(e, t) {
            this._appendParticleVertexWithAnimation(e++, t, 0, 0), this._appendParticleVertexWithAnimation(e++, t, 1, 0), this._appendParticleVertexWithAnimation(e++, t, 1, 1), this._appendParticleVertexWithAnimation(e++, t, 0, 1)
        }, t.prototype._appenedParticleVertexesNoSheet = function(e, t) {
            this._appendParticleVertex(e++, t, 0, 0), this._appendParticleVertex(e++, t, 1, 0), this._appendParticleVertex(e++, t, 1, 1), this._appendParticleVertex(e++, t, 0, 1)
        }, t.prototype.rebuild = function() {
            this._createIndexBuffer(), this._vertexBuffer && this._vertexBuffer._rebuild()
        }, t.prototype.render = function() {
            var i = this._getEffect();
            if (!(this.emitter && i.isReady() && this.particleTexture && this.particleTexture.isReady() && this._particles.length)) return 0;
            var r = this._scene.getEngine();
            r.enableEffect(i), r.setState(!1);
            var n = this._scene.getViewMatrix();
            if (i.setTexture("diffuseSampler", this.particleTexture), i.setMatrix("view", n), i.setMatrix("projection", this._scene.getProjectionMatrix()), this._isAnimationSheetEnabled) {
                var o = this.particleTexture.getBaseSize();
                i.setFloat3("particlesInfos", this.spriteCellWidth / o.width, this.spriteCellHeight / o.height, o.width / this.spriteCellWidth)
            }
            if (i.setFloat4("textureMask", this.textureMask.r, this.textureMask.g, this.textureMask.b, this.textureMask.a), this._scene.clipPlane) {
                var s = this._scene.clipPlane,
                    a = n.clone();
                a.invert(), i.setMatrix("invView", a), i.setFloat4("vClipPlane", s.normal.x, s.normal.y, s.normal.z, s.d)
            }
            return r.bindBuffers(this._vertexBuffers, this._indexBuffer, i), this.blendMode === t.BLENDMODE_ONEONE ? r.setAlphaMode(e.Engine.ALPHA_ONEONE) : r.setAlphaMode(e.Engine.ALPHA_COMBINE), this.forceDepthWrite && r.setDepthWrite(!0), r.drawElementsType(e.Material.TriangleFillMode, 0, 6 * this._particles.length), r.setAlphaMode(e.Engine.ALPHA_DISABLE), this._particles.length
        }, t.prototype.dispose = function(e) {
            void 0 === e && (e = !0), this._vertexBuffer && (this._vertexBuffer.dispose(), this._vertexBuffer = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null), e && this.particleTexture && (this.particleTexture.dispose(), this.particleTexture = null);
            var t = this._scene.particleSystems.indexOf(this);
            t > -1 && this._scene.particleSystems.splice(t, 1), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear()
        }, t.prototype.createSphereEmitter = function(t) {
            void 0 === t && (t = 1);
            var i = new e.SphereParticleEmitter(t);
            return this.particleEmitterType = i, i
        }, t.prototype.createDirectedSphereEmitter = function(t, i, r) {
            void 0 === t && (t = 1), void 0 === i && (i = new e.Vector3(0, 1, 0)), void 0 === r && (r = new e.Vector3(0, 1, 0));
            var n = new e.SphereDirectedParticleEmitter(t, i, r);
            return this.particleEmitterType = n, n
        }, t.prototype.createConeEmitter = function(t, i) {
            void 0 === t && (t = 1), void 0 === i && (i = Math.PI / 4);
            var r = new e.ConeParticleEmitter(t, i);
            return this.particleEmitterType = r, r
        }, t.prototype.createBoxEmitter = function(t, i, r, n) {
            var o = new e.BoxParticleEmitter;
            return this.direction1 = t, this.direction2 = i, this.minEmitBox = r, this.maxEmitBox = n, this.particleEmitterType = o, o
        }, t.prototype.clone = function(i, r) {
            var n = null,
                o = null;
            if (null != this.customShader) {
                o = this.customShader;
                var s = o.shaderOptions.defines.length > 0 ? o.shaderOptions.defines.join("\n") : "";
                n = this._scene.getEngine().createEffectForParticles(o.shaderPath.fragmentElement, o.shaderOptions.uniforms, o.shaderOptions.samplers, s)
            }
            var a = new t(i, this._capacity, this._scene, n);
            return a.customShader = o, e.Tools.DeepCopy(this, a, ["particles", "customShader"]), void 0 === r && (r = this.emitter), a.emitter = r, this.particleTexture && (a.particleTexture = new e.Texture(this.particleTexture.url, this._scene)), this.preventAutoStart || a.start(), a
        }, t.prototype.serialize = function() {
            var t = {};
            if (t.name = this.name, t.id = this.id, this.emitter.position) {
                var i = this.emitter;
                t.emitterId = i.id
            } else {
                var r = this.emitter;
                t.emitter = r.asArray()
            }
            return t.capacity = this.getCapacity(), this.particleTexture && (t.textureName = this.particleTexture.name), e.Animation.AppendSerializedAnimations(this, t), t.minAngularSpeed = this.minAngularSpeed, t.maxAngularSpeed = this.maxAngularSpeed, t.minSize = this.minSize, t.maxSize = this.maxSize, t.minEmitPower = this.minEmitPower, t.maxEmitPower = this.maxEmitPower, t.minLifeTime = this.minLifeTime, t.maxLifeTime = this.maxLifeTime, t.emitRate = this.emitRate, t.minEmitBox = this.minEmitBox.asArray(), t.maxEmitBox = this.maxEmitBox.asArray(), t.gravity = this.gravity.asArray(), t.direction1 = this.direction1.asArray(), t.direction2 = this.direction2.asArray(), t.color1 = this.color1.asArray(), t.color2 = this.color2.asArray(), t.colorDead = this.colorDead.asArray(), t.updateSpeed = this.updateSpeed, t.targetStopDuration = this.targetStopDuration, t.textureMask = this.textureMask.asArray(), t.blendMode = this.blendMode, t.customShader = this.customShader, t.preventAutoStart = this.preventAutoStart, t.startSpriteCellID = this.startSpriteCellID, t.endSpriteCellID = this.endSpriteCellID, t.spriteCellLoop = this.spriteCellLoop, t.spriteCellChangeSpeed = this.spriteCellChangeSpeed, t.spriteCellWidth = this.spriteCellWidth, t.spriteCellHeight = this.spriteCellHeight, t.isAnimationSheetEnabled = this._isAnimationSheetEnabled, this.particleEmitterType && (t.particleEmitterType = this.particleEmitterType.serialize()), t
        }, t.Parse = function(i, r, n) {
            var o = i.name,
                s = null,
                a = null;
            if (i.customShader) {
                a = i.customShader;
                var l = a.shaderOptions.defines.length > 0 ? a.shaderOptions.defines.join("\n") : "";
                s = r.getEngine().createEffectForParticles(a.shaderPath.fragmentElement, a.shaderOptions.uniforms, a.shaderOptions.samplers, l)
            }
            var c = new t(o, i.capacity, r, s, i.isAnimationSheetEnabled);
            if (c.customShader = a, i.id && (c.id = i.id), i.preventAutoStart && (c.preventAutoStart = i.preventAutoStart), i.textureName && (c.particleTexture = new e.Texture(n + i.textureName, r), c.particleTexture.name = i.textureName), i.emitterId ? c.emitter = r.getLastMeshByID(i.emitterId) : c.emitter = e.Vector3.FromArray(i.emitter), i.animations)
                for (var h = 0; h < i.animations.length; h++) {
                    var u = i.animations[h];
                    c.animations.push(e.Animation.Parse(u))
                }
            return i.autoAnimate && r.beginAnimation(c, i.autoAnimateFrom, i.autoAnimateTo, i.autoAnimateLoop, i.autoAnimateSpeed || 1), c.minAngularSpeed = i.minAngularSpeed, c.maxAngularSpeed = i.maxAngularSpeed, c.minSize = i.minSize, c.maxSize = i.maxSize, c.minLifeTime = i.minLifeTime, c.maxLifeTime = i.maxLifeTime, c.minEmitPower = i.minEmitPower, c.maxEmitPower = i.maxEmitPower, c.emitRate = i.emitRate, c.minEmitBox = e.Vector3.FromArray(i.minEmitBox), c.maxEmitBox = e.Vector3.FromArray(i.maxEmitBox), c.gravity = e.Vector3.FromArray(i.gravity), c.direction1 = e.Vector3.FromArray(i.direction1), c.direction2 = e.Vector3.FromArray(i.direction2), c.color1 = e.Color4.FromArray(i.color1), c.color2 = e.Color4.FromArray(i.color2), c.colorDead = e.Color4.FromArray(i.colorDead), c.updateSpeed = i.updateSpeed, c.targetStopDuration = i.targetStopDuration, c.textureMask = e.Color4.FromArray(i.textureMask), c.blendMode = i.blendMode, c.startSpriteCellID = i.startSpriteCellID, c.endSpriteCellID = i.endSpriteCellID, c.spriteCellLoop = i.spriteCellLoop, c.spriteCellChangeSpeed = i.spriteCellChangeSpeed, c.spriteCellWidth = i.spriteCellWidth, c.spriteCellHeight = i.spriteCellHeight, c.preventAutoStart || c.start(), c
        }, t.BLENDMODE_ONEONE = 0, t.BLENDMODE_STANDARD = 1, t
    })();
    e.ParticleSystem = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.direction1 = new e.Vector3(0, 1, 0), this.direction2 = new e.Vector3(0, 1, 0), this.minEmitBox = new e.Vector3(-.5, -.5, -.5), this.maxEmitBox = new e.Vector3(.5, .5, .5)
        }
        return t.prototype.startDirectionFunction = function(t, i, r, n) {
            var o = e.Scalar.RandomRange(this.direction1.x, this.direction2.x),
                s = e.Scalar.RandomRange(this.direction1.y, this.direction2.y),
                a = e.Scalar.RandomRange(this.direction1.z, this.direction2.z);
            e.Vector3.TransformNormalFromFloatsToRef(o * t, s * t, a * t, i, r)
        }, t.prototype.startPositionFunction = function(t, i, r) {
            var n = e.Scalar.RandomRange(this.minEmitBox.x, this.maxEmitBox.x),
                o = e.Scalar.RandomRange(this.minEmitBox.y, this.maxEmitBox.y),
                s = e.Scalar.RandomRange(this.minEmitBox.z, this.maxEmitBox.z);
            e.Vector3.TransformCoordinatesFromFloatsToRef(n, o, s, t, i)
        }, t.prototype.clone = function() {
            var i = new t;
            return e.Tools.DeepCopy(this, i), i
        }, t.prototype.applyToShader = function(e) {
            e.setVector3("direction1", this.direction1), e.setVector3("direction2", this.direction2), e.setVector3("minEmitBox", this.minEmitBox), e.setVector3("maxEmitBox", this.maxEmitBox)
        }, t.prototype.getEffectDefines = function() {
            return "#define BOXEMITTER"
        }, t.prototype.getClassName = function() {
            return "BoxEmitter"
        }, t.prototype.serialize = function() {
            var e = {};
            return e.type = this.getClassName(), e.direction1 = this.direction1.asArray(), e.direction2 = this.direction2.asArray(), e.minEmitBox = this.minEmitBox.asArray(), e.maxEmitBox = this.maxEmitBox.asArray(), e
        }, t.prototype.parse = function(e) {
            this.direction1.copyFrom(e.direction1), this.direction2.copyFrom(e.direction2), this.minEmitBox.copyFrom(e.minEmitBox), this.maxEmitBox.copyFrom(e.maxEmitBox)
        }, t
    })();
    e.BoxParticleEmitter = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i) {
            void 0 === e && (e = 1), void 0 === t && (t = Math.PI), void 0 === i && (i = 0), this.angle = t, this.directionRandomizer = i, this.radius = e
        }
        return Object.defineProperty(t.prototype, "radius", {
            get: function() {
                return this._radius
            },
            set: function(e) {
                this._radius = e, 0 !== this.angle ? this._height = e / Math.tan(this.angle / 2) : this._height = 1
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.startDirectionFunction = function(t, i, r, n) {
            if (0 === this.angle) e.Vector3.TransformNormalFromFloatsToRef(0, t, 0, i, r);
            else {
                var o = n.position.subtract(i.getTranslation()).normalize(),
                    s = e.Scalar.RandomRange(0, this.directionRandomizer),
                    a = e.Scalar.RandomRange(0, this.directionRandomizer),
                    l = e.Scalar.RandomRange(0, this.directionRandomizer);
                o.x += s, o.y += a, o.z += l, o.normalize(), e.Vector3.TransformNormalFromFloatsToRef(o.x * t, o.y * t, o.z * t, i, r)
            }
        }, t.prototype.startPositionFunction = function(t, i, r) {
            var n = e.Scalar.RandomRange(0, 2 * Math.PI),
                o = e.Scalar.RandomRange(0, 1);
            o = 1 - o * o;
            var s = e.Scalar.RandomRange(0, this._radius);
            s = s * o / this._height;
            var a = s * Math.sin(n),
                l = s * Math.cos(n),
                c = o * this._height;
            e.Vector3.TransformCoordinatesFromFloatsToRef(a, c, l, t, i)
        }, t.prototype.clone = function() {
            var i = new t(this.radius, this.angle, this.directionRandomizer);
            return e.Tools.DeepCopy(this, i), i
        }, t.prototype.applyToShader = function(e) {
            e.setFloat("radius", this.radius), e.setFloat("angle", this.angle), e.setFloat("height", this._height), e.setFloat("directionRandomizer", this.directionRandomizer)
        }, t.prototype.getEffectDefines = function() {
            return "#define CONEEMITTER"
        }, t.prototype.getClassName = function() {
            return "ConeEmitter"
        }, t.prototype.serialize = function() {
            var e = {};
            return e.type = this.getClassName(), e.radius = this.radius, e.angle = this.angle, e.directionRandomizer = this.directionRandomizer, e
        }, t.prototype.parse = function(e) {
            this.radius = e.radius, this.angle = e.angle, this.directionRandomizer = e.directionRandomizer
        }, t
    })();
    e.ConeParticleEmitter = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t) {
            void 0 === e && (e = 1), void 0 === t && (t = 0), this.radius = e, this.directionRandomizer = t
        }
        return t.prototype.startDirectionFunction = function(t, i, r, n) {
            var o = n.position.subtract(i.getTranslation()).normalize(),
                s = e.Scalar.RandomRange(0, this.directionRandomizer),
                a = e.Scalar.RandomRange(0, this.directionRandomizer),
                l = e.Scalar.RandomRange(0, this.directionRandomizer);
            o.x += s, o.y += a, o.z += l, o.normalize(), e.Vector3.TransformNormalFromFloatsToRef(o.x * t, o.y * t, o.z * t, i, r)
        }, t.prototype.startPositionFunction = function(t, i, r) {
            var n = e.Scalar.RandomRange(0, 2 * Math.PI),
                o = e.Scalar.RandomRange(0, Math.PI),
                s = e.Scalar.RandomRange(0, this.radius),
                a = s * Math.cos(n) * Math.sin(o),
                l = s * Math.cos(o),
                c = s * Math.sin(n) * Math.sin(o);
            e.Vector3.TransformCoordinatesFromFloatsToRef(a, l, c, t, i)
        }, t.prototype.clone = function() {
            var i = new t(this.radius, this.directionRandomizer);
            return e.Tools.DeepCopy(this, i), i
        }, t.prototype.applyToShader = function(e) {
            e.setFloat("radius", this.radius), e.setFloat("directionRandomizer", this.directionRandomizer)
        }, t.prototype.getEffectDefines = function() {
            return "#define SPHEREEMITTER"
        }, t.prototype.getClassName = function() {
            return "SphereParticleEmitter"
        }, t.prototype.serialize = function() {
            var e = {};
            return e.type = this.getClassName(), e.radius = this.radius, e.directionRandomizer = this.directionRandomizer, e
        }, t.prototype.parse = function(e) {
            this.radius = e.radius, this.directionRandomizer = e.directionRandomizer
        }, t
    })();
    e.SphereParticleEmitter = t;
    var i = (function(t) {
        function i(i, r, n) {
            void 0 === i && (i = 1), void 0 === r && (r = new e.Vector3(0, 1, 0)), void 0 === n && (n = new e.Vector3(0, 1, 0));
            var o = t.call(this, i) || this;
            return o.direction1 = r, o.direction2 = n, o
        }
        return __extends(i, t), i.prototype.startDirectionFunction = function(t, i, r, n) {
            var o = e.Scalar.RandomRange(this.direction1.x, this.direction2.x),
                s = e.Scalar.RandomRange(this.direction1.y, this.direction2.y),
                a = e.Scalar.RandomRange(this.direction1.z, this.direction2.z);
            e.Vector3.TransformNormalFromFloatsToRef(o * t, s * t, a * t, i, r)
        }, i.prototype.clone = function() {
            var t = new i(this.radius, this.direction1, this.direction2);
            return e.Tools.DeepCopy(this, t), t
        }, i.prototype.applyToShader = function(e) {
            e.setFloat("radius", this.radius), e.setVector3("direction1", this.direction1), e.setVector3("direction2", this.direction2)
        }, i.prototype.getEffectDefines = function() {
            return "#define SPHEREEMITTER\n#define DIRECTEDSPHEREEMITTER"
        }, i.prototype.getClassName = function() {
            return "SphereDirectedParticleEmitter"
        }, i.prototype.serialize = function() {
            var e = t.prototype.serialize.call(this);
            return e.direction1 = this.direction1.asArray(), e.direction2 = this.direction2.asArray(), e
        }, i.prototype.parse = function(e) {
            t.prototype.parse.call(this, e), this.direction1.copyFrom(e.direction1), this.direction2.copyFrom(e.direction2)
        }, i
    })(t);
    e.SphereDirectedParticleEmitter = i
})(BABYLON || (BABYLON = {}));
var __assign = this && this.__assign || Object.assign || function(e) {
        for (var t, i = 1, r = arguments.length; i < r; i++) {
            t = arguments[i];
            for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n])
        }
        return e
    },
    BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            this.emitter = null, this.renderingGroupId = 0, this.layerMask = 268435455, this._targetIndex = 0, this._currentRenderId = -1, this._started = !1, this._stopped = !1, this._timeDelta = 0, this._attributesStrideSize = 14, this._actualFrame = 0, this.animations = [], this.onDisposeObservable = new e.Observable, this.updateSpeed = .01, this.targetStopDuration = 0, this.blendMode = e.ParticleSystem.BLENDMODE_ONEONE, this.minLifeTime = 1, this.maxLifeTime = 1, this.minSize = 1, this.maxSize = 1, this.color1 = new e.Color4(1, 1, 1, 1), this.color2 = new e.Color4(1, 1, 1, 1), this.colorDead = new e.Color4(0, 0, 0, 0), this.emitRate = 100, this.gravity = e.Vector3.Zero(), this.minEmitPower = 1, this.maxEmitPower = 1, this.id = t, this.name = t, this._scene = r || e.Engine.LastCreatedScene, this._engine = this._scene.getEngine();
            var n = __assign({
                capacity: 5e4,
                randomTextureSize: this._engine.getCaps().maxTextureSize
            }, i);
            this._capacity = n.capacity, this._activeCount = n.capacity, this._currentActiveCount = 0, this._scene.particleSystems.push(this), this._updateEffectOptions = {
                attributes: ["position", "age", "life", "seed", "size", "color", "direction"],
                uniformsNames: ["currentCount", "timeDelta", "generalRandoms", "emitterWM", "lifeTime", "color1", "color2", "sizeRange", "gravity", "emitPower", "direction1", "direction2", "minEmitBox", "maxEmitBox", "radius", "directionRandomizer", "height", "angle"],
                uniformBuffersNames: [],
                samplers: ["randomSampler"],
                defines: "",
                fallbacks: null,
                onCompiled: null,
                onError: null,
                indexParameters: null,
                maxSimultaneousLights: 0,
                transformFeedbackVaryings: ["outPosition", "outAge", "outLife", "outSeed", "outSize", "outColor", "outDirection"]
            };
            for (var o = Math.min(this._engine.getCaps().maxTextureSize, n.randomTextureSize), s = [], a = 0; a < o; ++a) s.push(Math.random()), s.push(Math.random()), s.push(Math.random()), s.push(Math.random());
            this._randomTexture = new e.RawTexture(new Float32Array(s), o, 1, e.Engine.TEXTUREFORMAT_RGBA32F, this._scene, !1, !1, e.Texture.NEAREST_SAMPLINGMODE, e.Engine.TEXTURETYPE_FLOAT), this._randomTexture.wrapU = e.Texture.WRAP_ADDRESSMODE, this._randomTexture.wrapV = e.Texture.WRAP_ADDRESSMODE, this._randomTextureSize = o, this.particleEmitterType = new e.BoxParticleEmitter
        }
        return Object.defineProperty(t, "IsSupported", {
                get: function() {
                    return !!e.Engine.LastCreatedEngine && e.Engine.LastCreatedEngine.webGLVersion > 1
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "direction1", {
                get: function() {
                    return this.particleEmitterType.direction1 ? this.particleEmitterType.direction1 : e.Vector3.Zero()
                },
                set: function(e) {
                    this.particleEmitterType.direction1 && (this.particleEmitterType.direction1 = e)
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "direction2", {
                get: function() {
                    return this.particleEmitterType.direction2 ? this.particleEmitterType.direction2 : e.Vector3.Zero()
                },
                set: function(e) {
                    this.particleEmitterType.direction2 && (this.particleEmitterType.direction2 = e)
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "minEmitBox", {
                get: function() {
                    return this.particleEmitterType.minEmitBox ? this.particleEmitterType.minEmitBox : e.Vector3.Zero()
                },
                set: function(e) {
                    this.particleEmitterType.minEmitBox && (this.particleEmitterType.minEmitBox = e)
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "maxEmitBox", {
                get: function() {
                    return this.particleEmitterType.maxEmitBox ? this.particleEmitterType.maxEmitBox : e.Vector3.Zero()
                },
                set: function(e) {
                    this.particleEmitterType.maxEmitBox && (this.particleEmitterType.maxEmitBox = e)
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.getCapacity = function() {
                return this._capacity
            }, Object.defineProperty(t.prototype, "activeParticleCount", {
                get: function() {
                    return this._activeCount
                },
                set: function(e) {
                    this._activeCount = Math.min(e, this._capacity)
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.isStarted = function() {
                return this._started
            }, t.prototype.start = function() {
                this._started = !0, this._stopped = !1
            }, t.prototype.stop = function() {
                this._stopped = !0
            }, t.prototype.reset = function() {
                this._releaseBuffers(), this._releaseVAOs(), this._currentActiveCount = 0, this._targetIndex = 0
            }, t.prototype.getClassName = function() {
                return "GPUParticleSystem"
            }, t.prototype._createUpdateVAO = function(e) {
                var t = {};
                t.position = e.createVertexBuffer("position", 0, 3), t.age = e.createVertexBuffer("age", 3, 1), t.life = e.createVertexBuffer("life", 4, 1), t.seed = e.createVertexBuffer("seed", 5, 1), t.size = e.createVertexBuffer("size", 6, 1), t.color = e.createVertexBuffer("color", 7, 4), t.direction = e.createVertexBuffer("direction", 11, 3);
                var i = this._engine.recordVertexArrayObject(t, null, this._updateEffect);
                return this._engine.bindArrayBuffer(null), i
            },
            t.prototype._createRenderVAO = function(e, t) {
                var i = {};
                i.position = e.createVertexBuffer("position", 0, 3, this._attributesStrideSize, !0), i.age = e.createVertexBuffer("age", 3, 1, this._attributesStrideSize, !0), i.life = e.createVertexBuffer("life", 4, 1, this._attributesStrideSize, !0), i.size = e.createVertexBuffer("size", 6, 1, this._attributesStrideSize, !0), i.color = e.createVertexBuffer("color", 7, 4, this._attributesStrideSize, !0), i.offset = t.createVertexBuffer("offset", 0, 2), i.uv = t.createVertexBuffer("uv", 2, 2);
                var r = this._engine.recordVertexArrayObject(i, null, this._renderEffect);
                return this._engine.bindArrayBuffer(null), r
            }, t.prototype._initialize = function(t) {
                if (void 0 === t && (t = !1), !this._buffer0 || t) {
                    for (var i = this._scene.getEngine(), r = new Array, n = 0; n < this._capacity; n++) r.push(0), r.push(0), r.push(0), r.push(0), r.push(0), r.push(Math.random()), r.push(0), r.push(0), r.push(0), r.push(0), r.push(0), r.push(0), r.push(0), r.push(0);
                    var o = new Float32Array([.5, .5, 1, 1, -.5, .5, 0, 1, -.5, -.5, 0, 0, .5, -.5, 1, 0]);
                    this._buffer0 = new e.Buffer(i, r, !1, this._attributesStrideSize), this._buffer1 = new e.Buffer(i, r, !1, this._attributesStrideSize), this._spriteBuffer = new e.Buffer(i, o, !1, 4), this._updateVAO = [], this._updateVAO.push(this._createUpdateVAO(this._buffer0)), this._updateVAO.push(this._createUpdateVAO(this._buffer1)), this._renderVAO = [], this._renderVAO.push(this._createRenderVAO(this._buffer1, this._spriteBuffer)), this._renderVAO.push(this._createRenderVAO(this._buffer0, this._spriteBuffer)), this._sourceBuffer = this._buffer0, this._targetBuffer = this._buffer1
                }
            }, t.prototype._recreateUpdateEffect = function() {
                var t = this.particleEmitterType ? this.particleEmitterType.getEffectDefines() : "";
                this._updateEffect && this._updateEffectOptions.defines === t || (this._updateEffectOptions.defines = t, this._updateEffect = new e.Effect("gpuUpdateParticles", this._updateEffectOptions, this._scene.getEngine()))
            }, t.prototype._recreateRenderEffect = function() {
                var t = "";
                this._scene.clipPlane && (t = "\n#define CLIPPLANE"), this._renderEffect && this._renderEffect.defines === t || (this._renderEffect = new e.Effect("gpuRenderParticles", ["position", "age", "life", "size", "color", "offset", "uv"], ["view", "projection", "colorDead", "invView", "vClipPlane"], ["textureSampler"], this._scene.getEngine(), t))
            }, t.prototype.animate = function() {
                this._stopped ? this._timeDelta = 0 : (this._timeDelta = this.updateSpeed * this._scene.getAnimationRatio(), this._actualFrame += this._timeDelta, this.targetStopDuration && this._actualFrame >= this.targetStopDuration && this.stop())
            }, t.prototype.render = function() {
                if (!this._started) return 0;
                if (this._recreateUpdateEffect(), this._recreateRenderEffect(), !this.emitter || !this._updateEffect.isReady() || !this._renderEffect.isReady()) return 0;
                if (this._currentRenderId === this._scene.getRenderId()) return 0;
                this._currentRenderId = this._scene.getRenderId(), this._initialize(), this._currentActiveCount = Math.min(this._activeCount, this._currentActiveCount + this.emitRate * this._timeDelta | 0), this._engine.enableEffect(this._updateEffect), this._engine.setState(!1), this._updateEffect.setFloat("currentCount", this._currentActiveCount), this._updateEffect.setFloat("timeDelta", this._timeDelta), this._updateEffect.setFloat3("generalRandoms", Math.random(), Math.random(), Math.random()), this._updateEffect.setTexture("randomSampler", this._randomTexture), this._updateEffect.setFloat2("lifeTime", this.minLifeTime, this.maxLifeTime), this._updateEffect.setFloat2("emitPower", this.minEmitPower, this.maxEmitPower), this._updateEffect.setDirectColor4("color1", this.color1), this._updateEffect.setDirectColor4("color2", this.color2), this._updateEffect.setFloat2("sizeRange", this.minSize, this.maxSize), this._updateEffect.setVector3("gravity", this.gravity), this.particleEmitterType && this.particleEmitterType.applyToShader(this._updateEffect);
                var t;
                if (this.emitter.position) {
                    t = this.emitter.getWorldMatrix()
                } else {
                    var i = this.emitter;
                    t = e.Matrix.Translation(i.x, i.y, i.z)
                }
                this._updateEffect.setMatrix("emitterWM", t), this._engine.bindVertexArrayObject(this._updateVAO[this._targetIndex], null), this._engine.bindTransformFeedbackBuffer(this._targetBuffer.getBuffer()), this._engine.setRasterizerState(!1), this._engine.beginTransformFeedback(), this._engine.drawArraysType(e.Material.PointListDrawMode, 0, this._currentActiveCount), this._engine.endTransformFeedback(), this._engine.setRasterizerState(!0), this._engine.bindTransformFeedbackBuffer(null), this._engine.enableEffect(this._renderEffect);
                var r = this._scene.getViewMatrix();
                if (this._renderEffect.setMatrix("view", r), this._renderEffect.setMatrix("projection", this._scene.getProjectionMatrix()), this._renderEffect.setTexture("textureSampler", this.particleTexture), this._renderEffect.setDirectColor4("colorDead", this.colorDead), this._scene.clipPlane) {
                    var n = this._scene.clipPlane,
                        o = r.clone();
                    o.invert(), this._renderEffect.setMatrix("invView", o), this._renderEffect.setFloat4("vClipPlane", n.normal.x, n.normal.y, n.normal.z, n.d)
                }
                this.blendMode === e.ParticleSystem.BLENDMODE_ONEONE ? this._engine.setAlphaMode(e.Engine.ALPHA_ONEONE) : this._engine.setAlphaMode(e.Engine.ALPHA_COMBINE), this._engine.bindVertexArrayObject(this._renderVAO[this._targetIndex], null), this._engine.drawArraysType(e.Material.TriangleFanDrawMode, 0, 4, this._currentActiveCount), this._engine.setAlphaMode(e.Engine.ALPHA_DISABLE), 2 === ++this._targetIndex && (this._targetIndex = 0);
                var s = this._sourceBuffer;
                return this._sourceBuffer = this._targetBuffer, this._targetBuffer = s, this._currentActiveCount
            }, t.prototype.rebuild = function() {
                this._initialize(!0)
            }, t.prototype._releaseBuffers = function() {
                this._buffer0 && (this._buffer0.dispose(), this._buffer0 = null), this._buffer1 && (this._buffer1.dispose(), this._buffer1 = null), this._spriteBuffer && (this._spriteBuffer.dispose(), this._spriteBuffer = null)
            }, t.prototype._releaseVAOs = function() {
                for (var e = 0; e < this._updateVAO.length; e++) this._engine.releaseVertexArrayObject(this._updateVAO[e]);
                this._updateVAO = [];
                for (var e = 0; e < this._renderVAO.length; e++) this._engine.releaseVertexArrayObject(this._renderVAO[e]);
                this._renderVAO = []
            }, t.prototype.dispose = function(e) {
                void 0 === e && (e = !0);
                var t = this._scene.particleSystems.indexOf(this);
                t > -1 && this._scene.particleSystems.splice(t, 1), this._releaseBuffers(), this._releaseVAOs(), this._randomTexture && (this._randomTexture.dispose(), this._randomTexture = null), e && this.particleTexture && (this.particleTexture.dispose(), this.particleTexture = null), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear()
            }, t.prototype.clone = function(i, r) {
                var n = new t(i, {
                    capacity: this._capacity,
                    randomTextureSize: this._randomTextureSize
                }, this._scene);
                return e.Tools.DeepCopy(this, n), void 0 === r && (r = this.emitter), n.emitter = r, this.particleTexture && (n.particleTexture = new e.Texture(this.particleTexture.url, this._scene)), n
            }, t.prototype.serialize = function() {
                var t = {};
                if (t.name = this.name, t.id = this.id, this.emitter.position) {
                    var i = this.emitter;
                    t.emitterId = i.id
                } else {
                    var r = this.emitter;
                    t.emitter = r.asArray()
                }
                return t.capacity = this.getCapacity(), this.particleTexture && (t.textureName = this.particleTexture.name), e.Animation.AppendSerializedAnimations(this, t), t.activeParticleCount = this.activeParticleCount, t.randomTextureSize = this._randomTextureSize, t.minSize = this.minSize, t.maxSize = this.maxSize, t.minEmitPower = this.minEmitPower, t.maxEmitPower = this.maxEmitPower, t.minLifeTime = this.minLifeTime, t.maxLifeTime = this.maxLifeTime, t.emitRate = this.emitRate, t.gravity = this.gravity.asArray(), t.color1 = this.color1.asArray(), t.color2 = this.color2.asArray(), t.colorDead = this.colorDead.asArray(), t.updateSpeed = this.updateSpeed, t.targetStopDuration = this.targetStopDuration, t.blendMode = this.blendMode, this.particleEmitterType && (t.particleEmitterType = this.particleEmitterType.serialize()), t
            }, t.Parse = function(i, r, n) {
                var o = i.name,
                    s = new t(o, {
                        capacity: i.capacity,
                        randomTextureSize: i.randomTextureSize
                    }, r);
                if (i.id && (s.id = i.id), i.textureName && (s.particleTexture = new e.Texture(n + i.textureName, r), s.particleTexture.name = i.textureName), i.emitterId ? s.emitter = r.getLastMeshByID(i.emitterId) : s.emitter = e.Vector3.FromArray(i.emitter), i.animations)
                    for (var a = 0; a < i.animations.length; a++) {
                        var l = i.animations[a];
                        s.animations.push(e.Animation.Parse(l))
                    }
                if (s.activeParticleCount = i.activeParticleCount, s.minSize = i.minSize, s.maxSize = i.maxSize, s.minLifeTime = i.minLifeTime, s.maxLifeTime = i.maxLifeTime, s.minEmitPower = i.minEmitPower, s.maxEmitPower = i.maxEmitPower, s.emitRate = i.emitRate, s.gravity = e.Vector3.FromArray(i.gravity), s.color1 = e.Color4.FromArray(i.color1), s.color2 = e.Color4.FromArray(i.color2), s.colorDead = e.Color4.FromArray(i.colorDead), s.updateSpeed = i.updateSpeed, s.targetStopDuration = i.targetStopDuration, s.blendMode = i.blendMode, i.particleEmitterType) {
                    var c = void 0;
                    switch (i.particleEmitterType.type) {
                        case "SphereEmitter":
                            c = new e.SphereParticleEmitter;
                            break;
                        case "SphereDirectedParticleEmitter":
                            c = new e.SphereDirectedParticleEmitter;
                            break;
                        case "ConeEmitter":
                            c = new e.ConeParticleEmitter;
                            break;
                        case "BoxEmitter":
                        default:
                            c = new e.BoxParticleEmitter
                    }
                    c.parse(i.particleEmitterType), s.particleEmitterType = c
                }
                return s
            }, t
    })();
    e.GPUParticleSystem = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o, s, a, l) {
            void 0 === l && (l = null), this.idx = 0, this.color = new e.Color4(1, 1, 1, 1), this.position = e.Vector3.Zero(), this.rotation = e.Vector3.Zero(), this.scaling = e.Vector3.One(), this.uvs = new e.Vector4(0, 0, 1, 1), this.velocity = e.Vector3.Zero(), this.pivot = e.Vector3.Zero(), this.translateFromPivot = !1, this.alive = !0, this.isVisible = !0, this._pos = 0, this._ind = 0, this.shapeId = 0, this.idxInShape = 0, this._stillInvisible = !1, this._rotationMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1], this.parentId = null, this._globalPosition = e.Vector3.Zero(), this.idx = t, this._pos = i, this._ind = r, this._model = n, this.shapeId = o, this.idxInShape = s, this._sps = a, l && (this._modelBoundingInfo = l, this._boundingInfo = new e.BoundingInfo(l.minimum, l.maximum))
        }
        return Object.defineProperty(t.prototype, "scale", {
            get: function() {
                return this.scaling
            },
            set: function(e) {
                this.scaling = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "quaternion", {
            get: function() {
                return this.rotationQuaternion
            },
            set: function(e) {
                this.rotationQuaternion = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.intersectsMesh = function(t) {
            return !(!this._boundingInfo || !t._boundingInfo) && (this._sps._bSphereOnly ? e.BoundingSphere.Intersects(this._boundingInfo.boundingSphere, t._boundingInfo.boundingSphere) : this._boundingInfo.intersects(t._boundingInfo, !1))
        }, t
    })();
    e.SolidParticle = t;
    var i = (function() {
        function e(e, t, i, r, n, o) {
            this._indicesLength = 0, this.shapeID = e, this._shape = t, this._indicesLength = i, this._shapeUV = r, this._positionFunction = n, this._vertexFunction = o
        }
        return e
    })();
    e.ModelShape = i;
    var r = (function() {
        function e() {
            this.ind = 0, this.indicesLength = 0, this.sqDistance = 0
        }
        return e
    })();
    e.DepthSortedParticle = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            this.particles = new Array, this.nbParticles = 0, this.billboard = !1, this.recomputeNormals = !0, this.counter = 0, this.vars = {}, this._bSphereOnly = !1, this._bSphereRadiusFactor = 1, this._positions = new Array, this._indices = new Array, this._normals = new Array, this._colors = new Array, this._uvs = new Array, this._index = 0, this._updatable = !0, this._pickable = !1, this._isVisibilityBoxLocked = !1, this._alwaysVisible = !1, this._depthSort = !1, this._shapeCounter = 0, this._copy = new e.SolidParticle(0, 0, 0, null, 0, 0, this), this._color = new e.Color4(0, 0, 0, 0), this._computeParticleColor = !0, this._computeParticleTexture = !0, this._computeParticleRotation = !0, this._computeParticleVertex = !1, this._computeBoundingBox = !1, this._depthSortParticles = !0, this._cam_axisZ = e.Vector3.Zero(), this._cam_axisY = e.Vector3.Zero(), this._cam_axisX = e.Vector3.Zero(), this._axisZ = e.Axis.Z, this._camDir = e.Vector3.Zero(), this._camInvertedPosition = e.Vector3.Zero(), this._rotMatrix = new e.Matrix, this._invertMatrix = new e.Matrix, this._rotated = e.Vector3.Zero(), this._quaternion = new e.Quaternion, this._vertex = e.Vector3.Zero(), this._normal = e.Vector3.Zero(), this._yaw = 0, this._pitch = 0, this._roll = 0, this._halfroll = 0, this._halfpitch = 0, this._halfyaw = 0, this._sinRoll = 0, this._cosRoll = 0, this._sinPitch = 0, this._cosPitch = 0, this._sinYaw = 0, this._cosYaw = 0, this._mustUnrotateFixedNormals = !1, this._minimum = e.Vector3.Zero(), this._maximum = e.Vector3.Zero(), this._minBbox = e.Vector3.Zero(), this._maxBbox = e.Vector3.Zero(), this._particlesIntersect = !1, this._depthSortFunction = function(e, t) {
                return t.sqDistance - e.sqDistance
            }, this._needs32Bits = !1, this._pivotBackTranslation = e.Vector3.Zero(), this._scaledPivot = e.Vector3.Zero(), this._particleHasParent = !1, this.name = t, this._scene = i || e.Engine.LastCreatedScene, this._camera = i.activeCamera, this._pickable = !!r && r.isPickable, this._depthSort = !!r && r.enableDepthSort, this._particlesIntersect = !!r && r.particleIntersection, this._bSphereOnly = !!r && r.boundingSphereOnly, this._bSphereRadiusFactor = r && r.bSphereRadiusFactor ? r.bSphereRadiusFactor : 1, r && r.updatable ? this._updatable = r.updatable : this._updatable = !0, this._pickable && (this.pickedParticles = []), this._depthSort && (this.depthSortedParticles = [])
        }
        return t.prototype.buildMesh = function() {
            if (0 === this.nbParticles) {
                var t = e.MeshBuilder.CreateDisc("", {
                    radius: 1,
                    tessellation: 3
                }, this._scene);
                this.addShape(t, 1), t.dispose()
            }
            this._indices32 = this._needs32Bits ? new Uint32Array(this._indices) : new Uint16Array(this._indices), this._positions32 = new Float32Array(this._positions), this._uvs32 = new Float32Array(this._uvs), this._colors32 = new Float32Array(this._colors), this.recomputeNormals && e.VertexData.ComputeNormals(this._positions32, this._indices32, this._normals), this._normals32 = new Float32Array(this._normals), this._fixedNormal32 = new Float32Array(this._normals), this._mustUnrotateFixedNormals && this._unrotateFixedNormals();
            var i = new e.VertexData;
            i.indices = this._depthSort ? this._indices : this._indices32, i.set(this._positions32, e.VertexBuffer.PositionKind), i.set(this._normals32, e.VertexBuffer.NormalKind), this._uvs32 && i.set(this._uvs32, e.VertexBuffer.UVKind), this._colors32 && i.set(this._colors32, e.VertexBuffer.ColorKind);
            var r = new e.Mesh(this.name, this._scene);
            return i.applyToMesh(r, this._updatable), this.mesh = r, this.mesh.isPickable = this._pickable, this._depthSort || (this._indices = null), this._positions = null, this._normals = null, this._uvs = null, this._colors = null, this._updatable || (this.particles.length = 0), r
        }, t.prototype.digest = function(t, i) {
            var r = i && i.facetNb || 1,
                n = i && i.number || 0,
                o = i && i.delta || 0,
                s = t.getVerticesData(e.VertexBuffer.PositionKind),
                a = t.getIndices(),
                l = t.getVerticesData(e.VertexBuffer.UVKind),
                c = t.getVerticesData(e.VertexBuffer.ColorKind),
                h = t.getVerticesData(e.VertexBuffer.NormalKind),
                u = 0,
                f = a.length / 3;
            n ? (n = n > f ? f : n, r = Math.round(f / n), o = 0) : r = r > f ? f : r;
            for (var d = [], p = [], _ = [], m = [], g = e.Vector3.Zero(), v = r; u < f;) {
                r = v + Math.floor((1 + o) * Math.random()), u > f - r && (r = f - u), d.length = 0, p.length = 0, _.length = 0, m.length = 0;
                for (var y = 0, b = 3 * u; b < 3 * (u + r); b++) {
                    p.push(y);
                    var x = a[b];
                    d.push(s[3 * x], s[3 * x + 1], s[3 * x + 2]), l && _.push(l[2 * x], l[2 * x + 1]), c && m.push(c[4 * x], c[4 * x + 1], c[4 * x + 2], c[4 * x + 3]), y++
                }
                var T, E = this.nbParticles,
                    A = this._posToShape(d),
                    P = this._uvsToShapeUV(_);
                for (T = 0; T < A.length; T++) g.addInPlace(A[T]);
                for (g.scaleInPlace(1 / A.length), T = 0; T < A.length; T++) A[T].subtractInPlace(g);
                var M;
                this._particlesIntersect && (M = new e.BoundingInfo(g, g));
                var S = new e.ModelShape(this._shapeCounter, A, 3 * r, P, null, null),
                    C = this._positions.length,
                    R = this._indices.length;
                this._meshBuilder(this._index, A, this._positions, p, this._indices, _, this._uvs, m, this._colors, h, this._normals, E, 0, null), this._addParticle(E, C, R, S, this._shapeCounter, 0, M), this.particles[this.nbParticles].position.addInPlace(g), this._index += A.length, E++, this.nbParticles++, this._shapeCounter++, u += r
            }
            return this
        }, t.prototype._unrotateFixedNormals = function() {
            for (var t = 0, i = 0, r = 0; r < this.particles.length; r++) {
                this._particle = this.particles[r], this._shape = this._particle._model._shape, this._particle.rotationQuaternion ? this._quaternion.copyFrom(this._particle.rotationQuaternion) : (this._yaw = this._particle.rotation.y, this._pitch = this._particle.rotation.x, this._roll = this._particle.rotation.z, this._quaternionRotationYPR()), this._quaternionToRotationMatrix(), this._rotMatrix.invertToRef(this._invertMatrix);
                for (var n = 0; n < this._shape.length; n++) i = t + 3 * n, e.Vector3.TransformNormalFromFloatsToRef(this._normals32[i], this._normals32[i + 1], this._normals32[i + 2], this._invertMatrix, this._normal), this._fixedNormal32[i] = this._normal.x, this._fixedNormal32[i + 1] = this._normal.y, this._fixedNormal32[i + 2] = this._normal.z;
                t = i + 3
            }
        }, t.prototype._resetCopy = function() {
            this._copy.position.x = 0, this._copy.position.y = 0, this._copy.position.z = 0, this._copy.rotation.x = 0, this._copy.rotation.y = 0, this._copy.rotation.z = 0, this._copy.rotationQuaternion = null, this._copy.scaling.x = 1, this._copy.scaling.y = 1, this._copy.scaling.z = 1, this._copy.uvs.x = 0, this._copy.uvs.y = 0, this._copy.uvs.z = 1, this._copy.uvs.w = 1, this._copy.color = null, this._copy.translateFromPivot = !1
        }, t.prototype._meshBuilder = function(t, i, r, n, o, s, a, l, c, h, u, f, d, p) {
            var _, m = 0,
                g = 0,
                v = 0;
            for (this._resetCopy(), p && p.positionFunction && (p.positionFunction(this._copy, f, d), this._mustUnrotateFixedNormals = !0), this._copy.rotationQuaternion ? this._quaternion.copyFrom(this._copy.rotationQuaternion) : (this._yaw = this._copy.rotation.y, this._pitch = this._copy.rotation.x, this._roll = this._copy.rotation.z, this._quaternionRotationYPR()), this._quaternionToRotationMatrix(), this._scaledPivot.x = this._copy.pivot.x * this._copy.scaling.x, this._scaledPivot.y = this._copy.pivot.y * this._copy.scaling.y, this._scaledPivot.z = this._copy.pivot.z * this._copy.scaling.z, this._copy.translateFromPivot ? this._pivotBackTranslation.copyFromFloats(0, 0, 0) : this._pivotBackTranslation.copyFrom(this._scaledPivot), _ = 0; _ < i.length; _++) this._vertex.x = i[_].x, this._vertex.y = i[_].y, this._vertex.z = i[_].z, p && p.vertexFunction && p.vertexFunction(this._copy, this._vertex, _), this._vertex.x *= this._copy.scaling.x, this._vertex.y *= this._copy.scaling.y, this._vertex.z *= this._copy.scaling.z, this._vertex.x -= this._scaledPivot.x, this._vertex.y -= this._scaledPivot.y, this._vertex.z -= this._scaledPivot.z, e.Vector3.TransformCoordinatesToRef(this._vertex, this._rotMatrix, this._rotated), this._rotated.addInPlace(this._pivotBackTranslation), r.push(this._copy.position.x + this._rotated.x, this._copy.position.y + this._rotated.y, this._copy.position.z + this._rotated.z), s && (a.push((this._copy.uvs.z - this._copy.uvs.x) * s[m] + this._copy.uvs.x, (this._copy.uvs.w - this._copy.uvs.y) * s[m + 1] + this._copy.uvs.y), m += 2), this._copy.color ? this._color = this._copy.color : l && void 0 !== l[g] ? (this._color.r = l[g], this._color.g = l[g + 1], this._color.b = l[g + 2], this._color.a = l[g + 3]) : (this._color.r = 1, this._color.g = 1, this._color.b = 1, this._color.a = 1), c.push(this._color.r, this._color.g, this._color.b, this._color.a), g += 4, !this.recomputeNormals && h && (this._normal.x = h[v], this._normal.y = h[v + 1], this._normal.z = h[v + 2], e.Vector3.TransformNormalToRef(this._normal, this._rotMatrix, this._normal), u.push(this._normal.x, this._normal.y, this._normal.z), v += 3);
            for (_ = 0; _ < n.length; _++) {
                var y = t + n[_];
                o.push(y), y > 65535 && (this._needs32Bits = !0)
            }
            if (this._pickable) {
                var b = n.length / 3;
                for (_ = 0; _ < b; _++) this.pickedParticles.push({
                    idx: f,
                    faceId: _
                })
            }
            return this._depthSort && this.depthSortedParticles.push(new e.DepthSortedParticle), this._copy
        }, t.prototype._posToShape = function(t) {
            for (var i = [], r = 0; r < t.length; r += 3) i.push(new e.Vector3(t[r], t[r + 1], t[r + 2]));
            return i
        }, t.prototype._uvsToShapeUV = function(e) {
            var t = [];
            if (e)
                for (var i = 0; i < e.length; i++) t.push(e[i]);
            return t
        }, t.prototype._addParticle = function(t, i, r, n, o, s, a) {
            void 0 === a && (a = null);
            var l = new e.SolidParticle(t, i, r, n, o, s, this, a);
            return this.particles.push(l), l
        }, t.prototype.addShape = function(t, i, r) {
            var n, o = t.getVerticesData(e.VertexBuffer.PositionKind),
                s = t.getIndices(),
                a = t.getVerticesData(e.VertexBuffer.UVKind),
                l = t.getVerticesData(e.VertexBuffer.ColorKind),
                c = t.getVerticesData(e.VertexBuffer.NormalKind);
            this._particlesIntersect && (n = t.getBoundingInfo());
            for (var h, u, f = this._posToShape(o), d = this._uvsToShapeUV(a), p = r ? r.positionFunction : null, _ = r ? r.vertexFunction : null, m = new e.ModelShape(this._shapeCounter, f, s.length, d, p, _), g = this.nbParticles, v = 0; v < i; v++) {
                var y = this._positions.length,
                    b = this._indices.length;
                u = this._meshBuilder(this._index, f, this._positions, s, this._indices, a, this._uvs, l, this._colors, c, this._normals, g, v, r), this._updatable && (h = this._addParticle(g, y, b, m, this._shapeCounter, v, n), h.position.copyFrom(u.position), h.rotation.copyFrom(u.rotation), u.rotationQuaternion && h.rotationQuaternion && h.rotationQuaternion.copyFrom(u.rotationQuaternion), u.color && h.color && h.color.copyFrom(u.color), h.scaling.copyFrom(u.scaling), h.uvs.copyFrom(u.uvs)), this._index += f.length, g++
            }
            return this.nbParticles += i, ++this._shapeCounter - 1
        }, t.prototype._rebuildParticle = function(t) {
            this._resetCopy(), t._model._positionFunction && t._model._positionFunction(this._copy, t.idx, t.idxInShape), this._copy.rotationQuaternion ? this._quaternion.copyFrom(this._copy.rotationQuaternion) : (this._yaw = this._copy.rotation.y, this._pitch = this._copy.rotation.x, this._roll = this._copy.rotation.z, this._quaternionRotationYPR()), this._quaternionToRotationMatrix(), this._scaledPivot.x = this._particle.pivot.x * this._particle.scaling.x, this._scaledPivot.y = this._particle.pivot.y * this._particle.scaling.y, this._scaledPivot.z = this._particle.pivot.z * this._particle.scaling.z, this._copy.translateFromPivot ? this._pivotBackTranslation.copyFromFloats(0, 0, 0) : this._pivotBackTranslation.copyFrom(this._scaledPivot), this._shape = t._model._shape;
            for (var i = 0; i < this._shape.length; i++) this._vertex.x = this._shape[i].x, this._vertex.y = this._shape[i].y, this._vertex.z = this._shape[i].z, t._model._vertexFunction && t._model._vertexFunction(this._copy, this._vertex, i), this._vertex.x *= this._copy.scaling.x, this._vertex.y *= this._copy.scaling.y, this._vertex.z *= this._copy.scaling.z, this._vertex.x -= this._scaledPivot.x, this._vertex.y -= this._scaledPivot.y, this._vertex.z -= this._scaledPivot.z, e.Vector3.TransformCoordinatesToRef(this._vertex, this._rotMatrix, this._rotated), this._rotated.addInPlace(this._pivotBackTranslation), this._positions32[t._pos + 3 * i] = this._copy.position.x + this._rotated.x, this._positions32[t._pos + 3 * i + 1] = this._copy.position.y + this._rotated.y, this._positions32[t._pos + 3 * i + 2] = this._copy.position.z + this._rotated.z;
            t.position.x = 0, t.position.y = 0, t.position.z = 0, t.rotation.x = 0, t.rotation.y = 0, t.rotation.z = 0, t.rotationQuaternion = null, t.scaling.x = 1, t.scaling.y = 1, t.scaling.z = 1, t.uvs.x = 0, t.uvs.y = 0, t.uvs.z = 1, t.uvs.w = 1, t.pivot.x = 0, t.pivot.y = 0, t.pivot.z = 0, t.translateFromPivot = !1, t.parentId = null
        }, t.prototype.rebuildMesh = function() {
            for (var t = 0; t < this.particles.length; t++) this._rebuildParticle(this.particles[t]);
            return this.mesh.updateVerticesData(e.VertexBuffer.PositionKind, this._positions32, !1, !1), this
        }, t.prototype.setParticles = function(t, i, r) {
            if (void 0 === t && (t = 0), void 0 === i && (i = this.nbParticles - 1), void 0 === r && (r = !0), !this._updatable) return this;
            if (this.beforeUpdateParticles(t, i, r), this._cam_axisX.x = 1, this._cam_axisX.y = 0, this._cam_axisX.z = 0, this._cam_axisY.x = 0, this._cam_axisY.y = 1, this._cam_axisY.z = 0, this._cam_axisZ.x = 0, this._cam_axisZ.y = 0, this._cam_axisZ.z = 1, (this.billboard || this._depthSort) && (this.mesh.computeWorldMatrix(!0), this.mesh._worldMatrix.invertToRef(this._invertMatrix)), this.billboard) {
                this._camera.getDirectionToRef(this._axisZ, this._camDir), e.Vector3.TransformNormalToRef(this._camDir, this._invertMatrix, this._cam_axisZ), this._cam_axisZ.normalize();
                var n = this._camera.getViewMatrix(!0);
                e.Vector3.TransformNormalFromFloatsToRef(n.m[1], n.m[5], n.m[9], this._invertMatrix, this._cam_axisY), e.Vector3.CrossToRef(this._cam_axisY, this._cam_axisZ, this._cam_axisX), this._cam_axisY.normalize(), this._cam_axisX.normalize()
            }
            this._depthSort && e.Vector3.TransformCoordinatesToRef(this._camera.globalPosition, this._invertMatrix, this._camInvertedPosition), e.Matrix.IdentityToRef(this._rotMatrix);
            var o = 0,
                s = 0,
                a = 0,
                l = 0,
                c = 0,
                h = 0,
                u = 0;
            this.mesh.isFacetDataEnabled && (this._computeBoundingBox = !0), i = i >= this.nbParticles ? this.nbParticles - 1 : i, this._computeBoundingBox && (0 == t && i == this.nbParticles - 1 ? (e.Vector3.FromFloatsToRef(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, this._minimum), e.Vector3.FromFloatsToRef(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, this._maximum)) : this.mesh._boundingInfo && (this._minimum.copyFrom(this.mesh._boundingInfo.boundingBox.minimum), this._maximum.copyFrom(this.mesh._boundingInfo.boundingBox.maximum))), s = this.particles[t]._pos;
            var f = s / 3 | 0;
            l = 4 * f, h = 2 * f;
            for (var d = t; d <= i; d++) {
                if (this._particle = this.particles[d], this._shape = this._particle._model._shape, this._shapeUV = this._particle._model._shapeUV, this.updateParticle(this._particle), this._depthSort && this._depthSortParticles) {
                    var p = this.depthSortedParticles[d];
                    p.ind = this._particle._ind, p.indicesLength = this._particle._model._indicesLength, p.sqDistance = e.Vector3.DistanceSquared(this._particle.position, this._camInvertedPosition)
                }
                if (!this._particle.alive || this._particle._stillInvisible && !this._particle.isVisible) u = this._shape.length, s += 3 * u, l += 4 * u, h += 2 * u;
                else {
                    if (this._particle.isVisible)
                        for (this._particle._stillInvisible = !1, this._particleHasParent = null !== this._particle.parentId, this._scaledPivot.x = this._particle.pivot.x * this._particle.scaling.x, this._scaledPivot.y = this._particle.pivot.y * this._particle.scaling.y, this._scaledPivot.z = this._particle.pivot.z * this._particle.scaling.z, this.billboard && (this._particle.rotation.x = 0, this._particle.rotation.y = 0), (this._computeParticleRotation || this.billboard) && (this._particle.rotationQuaternion ? this._quaternion.copyFrom(this._particle.rotationQuaternion) : (this._yaw = this._particle.rotation.y, this._pitch = this._particle.rotation.x, this._roll = this._particle.rotation.z, this._quaternionRotationYPR()), this._quaternionToRotationMatrix()), this._particleHasParent ? (this._parent = this.particles[this._particle.parentId], this._rotated.x = this._particle.position.x * this._parent._rotationMatrix[0] + this._particle.position.y * this._parent._rotationMatrix[3] + this._particle.position.z * this._parent._rotationMatrix[6], this._rotated.y = this._particle.position.x * this._parent._rotationMatrix[1] + this._particle.position.y * this._parent._rotationMatrix[4] + this._particle.position.z * this._parent._rotationMatrix[7], this._rotated.z = this._particle.position.x * this._parent._rotationMatrix[2] + this._particle.position.y * this._parent._rotationMatrix[5] + this._particle.position.z * this._parent._rotationMatrix[8], this._particle._globalPosition.x = this._parent._globalPosition.x + this._rotated.x, this._particle._globalPosition.y = this._parent._globalPosition.y + this._rotated.y, this._particle._globalPosition.z = this._parent._globalPosition.z + this._rotated.z, (this._computeParticleRotation || this.billboard) && (this._particle._rotationMatrix[0] = this._rotMatrix.m[0] * this._parent._rotationMatrix[0] + this._rotMatrix.m[1] * this._parent._rotationMatrix[3] + this._rotMatrix.m[2] * this._parent._rotationMatrix[6], this._particle._rotationMatrix[1] = this._rotMatrix.m[0] * this._parent._rotationMatrix[1] + this._rotMatrix.m[1] * this._parent._rotationMatrix[4] + this._rotMatrix.m[2] * this._parent._rotationMatrix[7], this._particle._rotationMatrix[2] = this._rotMatrix.m[0] * this._parent._rotationMatrix[2] + this._rotMatrix.m[1] * this._parent._rotationMatrix[5] + this._rotMatrix.m[2] * this._parent._rotationMatrix[8], this._particle._rotationMatrix[3] = this._rotMatrix.m[4] * this._parent._rotationMatrix[0] + this._rotMatrix.m[5] * this._parent._rotationMatrix[3] + this._rotMatrix.m[6] * this._parent._rotationMatrix[6], this._particle._rotationMatrix[4] = this._rotMatrix.m[4] * this._parent._rotationMatrix[1] + this._rotMatrix.m[5] * this._parent._rotationMatrix[4] + this._rotMatrix.m[6] * this._parent._rotationMatrix[7], this._particle._rotationMatrix[5] = this._rotMatrix.m[4] * this._parent._rotationMatrix[2] + this._rotMatrix.m[5] * this._parent._rotationMatrix[5] + this._rotMatrix.m[6] * this._parent._rotationMatrix[8], this._particle._rotationMatrix[6] = this._rotMatrix.m[8] * this._parent._rotationMatrix[0] + this._rotMatrix.m[9] * this._parent._rotationMatrix[3] + this._rotMatrix.m[10] * this._parent._rotationMatrix[6], this._particle._rotationMatrix[7] = this._rotMatrix.m[8] * this._parent._rotationMatrix[1] + this._rotMatrix.m[9] * this._parent._rotationMatrix[4] + this._rotMatrix.m[10] * this._parent._rotationMatrix[7], this._particle._rotationMatrix[8] = this._rotMatrix.m[8] * this._parent._rotationMatrix[2] + this._rotMatrix.m[9] * this._parent._rotationMatrix[5] + this._rotMatrix.m[10] * this._parent._rotationMatrix[8])) : (this._particle._globalPosition.x = this._particle.position.x, this._particle._globalPosition.y = this._particle.position.y, this._particle._globalPosition.z = this._particle.position.z, (this._computeParticleRotation || this.billboard) && (this._particle._rotationMatrix[0] = this._rotMatrix.m[0], this._particle._rotationMatrix[1] = this._rotMatrix.m[1], this._particle._rotationMatrix[2] = this._rotMatrix.m[2], this._particle._rotationMatrix[3] = this._rotMatrix.m[4], this._particle._rotationMatrix[4] = this._rotMatrix.m[5], this._particle._rotationMatrix[5] = this._rotMatrix.m[6], this._particle._rotationMatrix[6] = this._rotMatrix.m[8], this._particle._rotationMatrix[7] = this._rotMatrix.m[9], this._particle._rotationMatrix[8] = this._rotMatrix.m[10])), this._particle.translateFromPivot ? (this._pivotBackTranslation.x = 0, this._pivotBackTranslation.y = 0, this._pivotBackTranslation.z = 0) : (this._pivotBackTranslation.x = this._scaledPivot.x, this._pivotBackTranslation.y = this._scaledPivot.y, this._pivotBackTranslation.z = this._scaledPivot.z), u = 0; u < this._shape.length; u++) o = s + 3 * u, a = l + 4 * u, c = h + 2 * u, this._vertex.x = this._shape[u].x, this._vertex.y = this._shape[u].y, this._vertex.z = this._shape[u].z, this._computeParticleVertex && this.updateParticleVertex(this._particle, this._vertex, u), this._vertex.x *= this._particle.scaling.x, this._vertex.y *= this._particle.scaling.y, this._vertex.z *= this._particle.scaling.z, this._vertex.x -= this._scaledPivot.x, this._vertex.y -= this._scaledPivot.y, this._vertex.z -= this._scaledPivot.z, this._rotated.x = this._vertex.x * this._particle._rotationMatrix[0] + this._vertex.y * this._particle._rotationMatrix[3] + this._vertex.z * this._particle._rotationMatrix[6], this._rotated.y = this._vertex.x * this._particle._rotationMatrix[1] + this._vertex.y * this._particle._rotationMatrix[4] + this._vertex.z * this._particle._rotationMatrix[7], this._rotated.z = this._vertex.x * this._particle._rotationMatrix[2] + this._vertex.y * this._particle._rotationMatrix[5] + this._vertex.z * this._particle._rotationMatrix[8], this._rotated.x += this._pivotBackTranslation.x, this._rotated.y += this._pivotBackTranslation.y, this._rotated.z += this._pivotBackTranslation.z, this._positions32[o] = this._particle._globalPosition.x + this._cam_axisX.x * this._rotated.x + this._cam_axisY.x * this._rotated.y + this._cam_axisZ.x * this._rotated.z, this._positions32[o + 1] = this._particle._globalPosition.y + this._cam_axisX.y * this._rotated.x + this._cam_axisY.y * this._rotated.y + this._cam_axisZ.y * this._rotated.z, this._positions32[o + 2] = this._particle._globalPosition.z + this._cam_axisX.z * this._rotated.x + this._cam_axisY.z * this._rotated.y + this._cam_axisZ.z * this._rotated.z, this._computeBoundingBox && (this._positions32[o] < this._minimum.x && (this._minimum.x = this._positions32[o]), this._positions32[o] > this._maximum.x && (this._maximum.x = this._positions32[o]), this._positions32[o + 1] < this._minimum.y && (this._minimum.y = this._positions32[o + 1]), this._positions32[o + 1] > this._maximum.y && (this._maximum.y = this._positions32[o + 1]), this._positions32[o + 2] < this._minimum.z && (this._minimum.z = this._positions32[o + 2]), this._positions32[o + 2] > this._maximum.z && (this._maximum.z = this._positions32[o + 2])), this._computeParticleVertex || (this._normal.x = this._fixedNormal32[o], this._normal.y = this._fixedNormal32[o + 1], this._normal.z = this._fixedNormal32[o + 2], this._rotated.x = this._normal.x * this._particle._rotationMatrix[0] + this._normal.y * this._particle._rotationMatrix[3] + this._normal.z * this._particle._rotationMatrix[6], this._rotated.y = this._normal.x * this._particle._rotationMatrix[1] + this._normal.y * this._particle._rotationMatrix[4] + this._normal.z * this._particle._rotationMatrix[7], this._rotated.z = this._normal.x * this._particle._rotationMatrix[2] + this._normal.y * this._particle._rotationMatrix[5] + this._normal.z * this._particle._rotationMatrix[8], this._normals32[o] = this._cam_axisX.x * this._rotated.x + this._cam_axisY.x * this._rotated.y + this._cam_axisZ.x * this._rotated.z, this._normals32[o + 1] = this._cam_axisX.y * this._rotated.x + this._cam_axisY.y * this._rotated.y + this._cam_axisZ.y * this._rotated.z,
                            this._normals32[o + 2] = this._cam_axisX.z * this._rotated.x + this._cam_axisY.z * this._rotated.y + this._cam_axisZ.z * this._rotated.z), this._computeParticleColor && this._particle.color && (this._colors32[a] = this._particle.color.r, this._colors32[a + 1] = this._particle.color.g, this._colors32[a + 2] = this._particle.color.b, this._colors32[a + 3] = this._particle.color.a), this._computeParticleTexture && (this._uvs32[c] = this._shapeUV[2 * u] * (this._particle.uvs.z - this._particle.uvs.x) + this._particle.uvs.x, this._uvs32[c + 1] = this._shapeUV[2 * u + 1] * (this._particle.uvs.w - this._particle.uvs.y) + this._particle.uvs.y);
                    else
                        for (this._particle._stillInvisible = !0, u = 0; u < this._shape.length; u++) o = s + 3 * u, a = l + 4 * u, c = h + 2 * u, this._positions32[o] = 0, this._positions32[o + 1] = 0, this._positions32[o + 2] = 0, this._normals32[o] = 0, this._normals32[o + 1] = 0, this._normals32[o + 2] = 0, this._computeParticleColor && this._particle.color && (this._colors32[a] = this._particle.color.r, this._colors32[a + 1] = this._particle.color.g, this._colors32[a + 2] = this._particle.color.b, this._colors32[a + 3] = this._particle.color.a), this._computeParticleTexture && (this._uvs32[c] = this._shapeUV[2 * u] * (this._particle.uvs.z - this._particle.uvs.x) + this._particle.uvs.x, this._uvs32[c + 1] = this._shapeUV[2 * u + 1] * (this._particle.uvs.w - this._particle.uvs.y) + this._particle.uvs.y);
                    if (this._particlesIntersect) {
                        var _ = this._particle._boundingInfo,
                            m = _.boundingBox,
                            g = _.boundingSphere;
                        if (!this._bSphereOnly) {
                            for (var v = 0; v < m.vectors.length; v++) this._vertex.x = this._particle._modelBoundingInfo.boundingBox.vectors[v].x * this._particle.scaling.x, this._vertex.y = this._particle._modelBoundingInfo.boundingBox.vectors[v].y * this._particle.scaling.y, this._vertex.z = this._particle._modelBoundingInfo.boundingBox.vectors[v].z * this._particle.scaling.z, this._rotated.x = this._vertex.x * this._particle._rotationMatrix[0] + this._vertex.y * this._particle._rotationMatrix[3] + this._vertex.z * this._particle._rotationMatrix[6], this._rotated.y = this._vertex.x * this._particle._rotationMatrix[1] + this._vertex.y * this._particle._rotationMatrix[4] + this._vertex.z * this._particle._rotationMatrix[7], this._rotated.z = this._vertex.x * this._particle._rotationMatrix[2] + this._vertex.y * this._particle._rotationMatrix[5] + this._vertex.z * this._particle._rotationMatrix[8], m.vectors[v].x = this._particle.position.x + this._cam_axisX.x * this._rotated.x + this._cam_axisY.x * this._rotated.y + this._cam_axisZ.x * this._rotated.z, m.vectors[v].y = this._particle.position.y + this._cam_axisX.y * this._rotated.x + this._cam_axisY.y * this._rotated.y + this._cam_axisZ.y * this._rotated.z, m.vectors[v].z = this._particle.position.z + this._cam_axisX.z * this._rotated.x + this._cam_axisY.z * this._rotated.y + this._cam_axisZ.z * this._rotated.z;
                            m._update(this.mesh._worldMatrix)
                        }
                        this._minBbox.x = this._particle._modelBoundingInfo.minimum.x * this._particle.scaling.x, this._minBbox.y = this._particle._modelBoundingInfo.minimum.y * this._particle.scaling.y, this._minBbox.z = this._particle._modelBoundingInfo.minimum.z * this._particle.scaling.z, this._maxBbox.x = this._particle._modelBoundingInfo.maximum.x * this._particle.scaling.x, this._maxBbox.y = this._particle._modelBoundingInfo.maximum.y * this._particle.scaling.y, this._maxBbox.z = this._particle._modelBoundingInfo.maximum.z * this._particle.scaling.z, g.center.x = this._particle._globalPosition.x + .5 * (this._minBbox.x + this._maxBbox.x), g.center.y = this._particle._globalPosition.y + .5 * (this._minBbox.y + this._maxBbox.y), g.center.z = this._particle._globalPosition.z + .5 * (this._minBbox.z + this._maxBbox.z), g.radius = .5 * this._bSphereRadiusFactor * Math.sqrt((this._maxBbox.x - this._minBbox.x) * (this._maxBbox.x - this._minBbox.x) + (this._maxBbox.y - this._minBbox.y) * (this._maxBbox.y - this._minBbox.y) + (this._maxBbox.z - this._minBbox.z) * (this._maxBbox.z - this._minBbox.z)), g._update(this.mesh._worldMatrix)
                    }
                    s = o + 3, l = a + 4, h = c + 2
                }
            }
            if (r) {
                if (this._computeParticleColor && this.mesh.updateVerticesData(e.VertexBuffer.ColorKind, this._colors32, !1, !1), this._computeParticleTexture && this.mesh.updateVerticesData(e.VertexBuffer.UVKind, this._uvs32, !1, !1), this.mesh.updateVerticesData(e.VertexBuffer.PositionKind, this._positions32, !1, !1), !this.mesh.areNormalsFrozen || this.mesh.isFacetDataEnabled) {
                    if (this._computeParticleVertex || this.mesh.isFacetDataEnabled) {
                        var y = this.mesh.isFacetDataEnabled ? this.mesh.getFacetDataParameters() : null;
                        e.VertexData.ComputeNormals(this._positions32, this._indices32, this._normals32, y);
                        for (var b = 0; b < this._normals32.length; b++) this._fixedNormal32[b] = this._normals32[b]
                    }
                    this.mesh.areNormalsFrozen || this.mesh.updateVerticesData(e.VertexBuffer.NormalKind, this._normals32, !1, !1)
                }
                if (this._depthSort && this._depthSortParticles) {
                    this.depthSortedParticles.sort(this._depthSortFunction);
                    var x = this.depthSortedParticles.length,
                        T = 0,
                        E = 0,
                        A = 0,
                        P = 0;
                    for (T = 0; T < x; T++) {
                        E = this.depthSortedParticles[T].indicesLength, A = this.depthSortedParticles[T].ind;
                        for (var b = 0; b < E; b++) this._indices32[P] = this._indices[A + b], P++
                    }
                    this.mesh.updateIndices(this._indices32)
                }
            }
            return this._computeBoundingBox && (this.mesh._boundingInfo = new e.BoundingInfo(this._minimum, this._maximum), this.mesh._boundingInfo.update(this.mesh._worldMatrix)), this.afterUpdateParticles(t, i, r), this
        }, t.prototype._quaternionRotationYPR = function() {
            this._halfroll = .5 * this._roll, this._halfpitch = .5 * this._pitch, this._halfyaw = .5 * this._yaw, this._sinRoll = Math.sin(this._halfroll), this._cosRoll = Math.cos(this._halfroll), this._sinPitch = Math.sin(this._halfpitch), this._cosPitch = Math.cos(this._halfpitch), this._sinYaw = Math.sin(this._halfyaw), this._cosYaw = Math.cos(this._halfyaw), this._quaternion.x = this._cosYaw * this._sinPitch * this._cosRoll + this._sinYaw * this._cosPitch * this._sinRoll, this._quaternion.y = this._sinYaw * this._cosPitch * this._cosRoll - this._cosYaw * this._sinPitch * this._sinRoll, this._quaternion.z = this._cosYaw * this._cosPitch * this._sinRoll - this._sinYaw * this._sinPitch * this._cosRoll, this._quaternion.w = this._cosYaw * this._cosPitch * this._cosRoll + this._sinYaw * this._sinPitch * this._sinRoll
        }, t.prototype._quaternionToRotationMatrix = function() {
            this._rotMatrix.m[0] = 1 - 2 * (this._quaternion.y * this._quaternion.y + this._quaternion.z * this._quaternion.z), this._rotMatrix.m[1] = 2 * (this._quaternion.x * this._quaternion.y + this._quaternion.z * this._quaternion.w), this._rotMatrix.m[2] = 2 * (this._quaternion.z * this._quaternion.x - this._quaternion.y * this._quaternion.w), this._rotMatrix.m[3] = 0, this._rotMatrix.m[4] = 2 * (this._quaternion.x * this._quaternion.y - this._quaternion.z * this._quaternion.w), this._rotMatrix.m[5] = 1 - 2 * (this._quaternion.z * this._quaternion.z + this._quaternion.x * this._quaternion.x), this._rotMatrix.m[6] = 2 * (this._quaternion.y * this._quaternion.z + this._quaternion.x * this._quaternion.w), this._rotMatrix.m[7] = 0, this._rotMatrix.m[8] = 2 * (this._quaternion.z * this._quaternion.x + this._quaternion.y * this._quaternion.w), this._rotMatrix.m[9] = 2 * (this._quaternion.y * this._quaternion.z - this._quaternion.x * this._quaternion.w), this._rotMatrix.m[10] = 1 - 2 * (this._quaternion.y * this._quaternion.y + this._quaternion.x * this._quaternion.x), this._rotMatrix.m[11] = 0, this._rotMatrix.m[12] = 0, this._rotMatrix.m[13] = 0, this._rotMatrix.m[14] = 0, this._rotMatrix.m[15] = 1
        }, t.prototype.dispose = function() {
            this.mesh.dispose(), this.vars = null, this._positions = null, this._indices = null, this._normals = null, this._uvs = null, this._colors = null, this._indices32 = null, this._positions32 = null, this._normals32 = null, this._fixedNormal32 = null, this._uvs32 = null, this._colors32 = null, this.pickedParticles = null
        }, t.prototype.refreshVisibleSize = function() {
            return this._isVisibilityBoxLocked || this.mesh.refreshBoundingInfo(), this
        }, t.prototype.setVisibilityBox = function(t) {
            var i = t / 2;
            this.mesh._boundingInfo = new e.BoundingInfo(new e.Vector3(-i, -i, -i), new e.Vector3(i, i, i))
        }, Object.defineProperty(t.prototype, "isAlwaysVisible", {
            get: function() {
                return this._alwaysVisible
            },
            set: function(e) {
                this._alwaysVisible = e, this.mesh.alwaysSelectAsActiveMesh = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isVisibilityBoxLocked", {
            get: function() {
                return this._isVisibilityBoxLocked
            },
            set: function(e) {
                this._isVisibilityBoxLocked = e, this.mesh.getBoundingInfo().isLocked = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "computeParticleRotation", {
            get: function() {
                return this._computeParticleRotation
            },
            set: function(e) {
                this._computeParticleRotation = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "computeParticleColor", {
            get: function() {
                return this._computeParticleColor
            },
            set: function(e) {
                this._computeParticleColor = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "computeParticleTexture", {
            get: function() {
                return this._computeParticleTexture
            },
            set: function(e) {
                this._computeParticleTexture = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "computeParticleVertex", {
            get: function() {
                return this._computeParticleVertex
            },
            set: function(e) {
                this._computeParticleVertex = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "computeBoundingBox", {
            get: function() {
                return this._computeBoundingBox
            },
            set: function(e) {
                this._computeBoundingBox = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "depthSortParticles", {
            get: function() {
                return this._depthSortParticles
            },
            set: function(e) {
                this._depthSortParticles = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.initParticles = function() {}, t.prototype.recycleParticle = function(e) {
            return e
        }, t.prototype.updateParticle = function(e) {
            return e
        }, t.prototype.updateParticleVertex = function(e, t, i) {
            return t
        }, t.prototype.beforeUpdateParticles = function(e, t, i) {}, t.prototype.afterUpdateParticles = function(e, t, i) {}, t
    })();
    e.SolidParticleSystem = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, r) || this;
            return s._textures = {}, s._textureArrays = {}, s._floats = {}, s._ints = {}, s._floatsArrays = {}, s._colors3 = {}, s._colors3Arrays = {}, s._colors4 = {}, s._vectors2 = {}, s._vectors3 = {}, s._vectors4 = {}, s._matrices = {}, s._matrices3x3 = {}, s._matrices2x2 = {}, s._vectors2Arrays = {}, s._vectors3Arrays = {}, s._cachedWorldViewMatrix = new e.Matrix, s._shaderPath = n, o.needAlphaBlending = o.needAlphaBlending || !1, o.needAlphaTesting = o.needAlphaTesting || !1, o.attributes = o.attributes || ["position", "normal", "uv"], o.uniforms = o.uniforms || ["worldViewProjection"], o.uniformBuffers = o.uniformBuffers || [], o.samplers = o.samplers || [], o.defines = o.defines || [], s._options = o, s
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "ShaderMaterial"
        }, i.prototype.needAlphaBlending = function() {
            return this._options.needAlphaBlending
        }, i.prototype.needAlphaTesting = function() {
            return this._options.needAlphaTesting
        }, i.prototype._checkUniform = function(e) {
            -1 === this._options.uniforms.indexOf(e) && this._options.uniforms.push(e)
        }, i.prototype.setTexture = function(e, t) {
            return -1 === this._options.samplers.indexOf(e) && this._options.samplers.push(e), this._textures[e] = t, this
        }, i.prototype.setTextureArray = function(e, t) {
            return -1 === this._options.samplers.indexOf(e) && this._options.samplers.push(e), this._checkUniform(e), this._textureArrays[e] = t, this
        }, i.prototype.setFloat = function(e, t) {
            return this._checkUniform(e), this._floats[e] = t, this
        }, i.prototype.setInt = function(e, t) {
            return this._checkUniform(e), this._ints[e] = t, this
        }, i.prototype.setFloats = function(e, t) {
            return this._checkUniform(e), this._floatsArrays[e] = t, this
        }, i.prototype.setColor3 = function(e, t) {
            return this._checkUniform(e), this._colors3[e] = t, this
        }, i.prototype.setColor3Array = function(e, t) {
            return this._checkUniform(e), this._colors3Arrays[e] = t.reduce((function(e, t) {
                return t.toArray(e, e.length), e
            }), []), this
        }, i.prototype.setColor4 = function(e, t) {
            return this._checkUniform(e), this._colors4[e] = t, this
        }, i.prototype.setVector2 = function(e, t) {
            return this._checkUniform(e), this._vectors2[e] = t, this
        }, i.prototype.setVector3 = function(e, t) {
            return this._checkUniform(e), this._vectors3[e] = t, this
        }, i.prototype.setVector4 = function(e, t) {
            return this._checkUniform(e), this._vectors4[e] = t, this
        }, i.prototype.setMatrix = function(e, t) {
            return this._checkUniform(e), this._matrices[e] = t, this
        }, i.prototype.setMatrix3x3 = function(e, t) {
            return this._checkUniform(e), this._matrices3x3[e] = t, this
        }, i.prototype.setMatrix2x2 = function(e, t) {
            return this._checkUniform(e), this._matrices2x2[e] = t, this
        }, i.prototype.setArray2 = function(e, t) {
            return this._checkUniform(e), this._vectors2Arrays[e] = t, this
        }, i.prototype.setArray3 = function(e, t) {
            return this._checkUniform(e), this._vectors3Arrays[e] = t, this
        }, i.prototype._checkCache = function(e, t, i) {
            return !t || (this._effect && this._effect.defines.indexOf("#define INSTANCES"), !1)
        }, i.prototype.isReady = function(t, i) {
            var r = this.getScene(),
                n = r.getEngine();
            if (!this.checkReadyOnEveryCall && this._renderId === r.getRenderId() && this._checkCache(r, t, i)) return !0;
            var o = [],
                s = [],
                a = new e.EffectFallbacks;
            i && o.push("#define INSTANCES");
            for (var l = 0; l < this._options.defines.length; l++) o.push(this._options.defines[l]);
            for (var l = 0; l < this._options.attributes.length; l++) s.push(this._options.attributes[l]);
            t && t.isVerticesDataPresent(e.VertexBuffer.ColorKind) && (s.push(e.VertexBuffer.ColorKind), o.push("#define VERTEXCOLOR")), t && t.useBones && t.computeBonesUsingShaders && t.skeleton ? (s.push(e.VertexBuffer.MatricesIndicesKind), s.push(e.VertexBuffer.MatricesWeightsKind), t.numBoneInfluencers > 4 && (s.push(e.VertexBuffer.MatricesIndicesExtraKind), s.push(e.VertexBuffer.MatricesWeightsExtraKind)), o.push("#define NUM_BONE_INFLUENCERS " + t.numBoneInfluencers), o.push("#define BonesPerMesh " + (t.skeleton.bones.length + 1)), a.addCPUSkinningFallback(0, t), -1 === this._options.uniforms.indexOf("mBones") && this._options.uniforms.push("mBones")) : o.push("#define NUM_BONE_INFLUENCERS 0");
            for (var c in this._textures)
                if (!this._textures[c].isReady()) return !1;
            t && this._shouldTurnAlphaTestOn(t) && o.push("#define ALPHATEST");
            var h = this._effect,
                u = o.join("\n");
            return this._effect = n.createEffect(this._shaderPath, {
                attributes: s,
                uniformsNames: this._options.uniforms,
                uniformBuffersNames: this._options.uniformBuffers,
                samplers: this._options.samplers,
                defines: u,
                fallbacks: a,
                onCompiled: this.onCompiled,
                onError: this.onError
            }, n), !!this._effect.isReady() && (h !== this._effect && r.resetCachedMaterial(), this._renderId = r.getRenderId(), !0)
        }, i.prototype.bindOnlyWorldMatrix = function(e) {
            var t = this.getScene();
            this._effect && (-1 !== this._options.uniforms.indexOf("world") && this._effect.setMatrix("world", e), -1 !== this._options.uniforms.indexOf("worldView") && (e.multiplyToRef(t.getViewMatrix(), this._cachedWorldViewMatrix), this._effect.setMatrix("worldView", this._cachedWorldViewMatrix)), -1 !== this._options.uniforms.indexOf("worldViewProjection") && this._effect.setMatrix("worldViewProjection", e.multiply(t.getTransformMatrix())))
        }, i.prototype.bind = function(t, i) {
            if (this.bindOnlyWorldMatrix(t), this._effect && this.getScene().getCachedMaterial() !== this) {
                -1 !== this._options.uniforms.indexOf("view") && this._effect.setMatrix("view", this.getScene().getViewMatrix()), -1 !== this._options.uniforms.indexOf("projection") && this._effect.setMatrix("projection", this.getScene().getProjectionMatrix()), -1 !== this._options.uniforms.indexOf("viewProjection") && this._effect.setMatrix("viewProjection", this.getScene().getTransformMatrix()), e.MaterialHelper.BindBonesParameters(i, this._effect);
                var r;
                for (r in this._textures) this._effect.setTexture(r, this._textures[r]);
                for (r in this._textureArrays) this._effect.setTextureArray(r, this._textureArrays[r]);
                for (r in this._ints) this._effect.setInt(r, this._ints[r]);
                for (r in this._floats) this._effect.setFloat(r, this._floats[r]);
                for (r in this._floatsArrays) this._effect.setArray(r, this._floatsArrays[r]);
                for (r in this._colors3) this._effect.setColor3(r, this._colors3[r]);
                for (r in this._colors3Arrays) this._effect.setArray3(r, this._colors3Arrays[r]);
                for (r in this._colors4) {
                    var n = this._colors4[r];
                    this._effect.setFloat4(r, n.r, n.g, n.b, n.a)
                }
                for (r in this._vectors2) this._effect.setVector2(r, this._vectors2[r]);
                for (r in this._vectors3) this._effect.setVector3(r, this._vectors3[r]);
                for (r in this._vectors4) this._effect.setVector4(r, this._vectors4[r]);
                for (r in this._matrices) this._effect.setMatrix(r, this._matrices[r]);
                for (r in this._matrices3x3) this._effect.setMatrix3x3(r, this._matrices3x3[r]);
                for (r in this._matrices2x2) this._effect.setMatrix2x2(r, this._matrices2x2[r]);
                for (r in this._vectors2Arrays) this._effect.setArray2(r, this._vectors2Arrays[r]);
                for (r in this._vectors3Arrays) this._effect.setArray3(r, this._vectors3Arrays[r])
            }
            this._afterBind(i)
        }, i.prototype.getActiveTextures = function() {
            var e = t.prototype.getActiveTextures.call(this);
            for (var i in this._textures) e.push(this._textures[i]);
            for (var i in this._textureArrays)
                for (var r = this._textureArrays[i], n = 0; n < r.length; n++) e.push(r[n]);
            return e
        }, i.prototype.hasTexture = function(e) {
            if (t.prototype.hasTexture.call(this, e)) return !0;
            for (var i in this._textures)
                if (this._textures[i] === e) return !0;
            for (var i in this._textureArrays)
                for (var r = this._textureArrays[i], n = 0; n < r.length; n++)
                    if (r[n] === e) return !0;
            return !1
        }, i.prototype.clone = function(e) {
            return new i(e, this.getScene(), this._shaderPath, this._options)
        }, i.prototype.dispose = function(e, i) {
            if (i) {
                var r;
                for (r in this._textures) this._textures[r].dispose();
                for (r in this._textureArrays)
                    for (var n = this._textureArrays[r], o = 0; o < n.length; o++) n[o].dispose()
            }
            this._textures = {}, t.prototype.dispose.call(this, e, i)
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            t.customType = "BABYLON.ShaderMaterial", t.options = this._options, t.shaderPath = this._shaderPath;
            var i;
            t.textures = {};
            for (i in this._textures) t.textures[i] = this._textures[i].serialize();
            t.textureArrays = {};
            for (i in this._textureArrays) {
                t.textureArrays[i] = [];
                for (var r = this._textureArrays[i], n = 0; n < r.length; n++) t.textureArrays[i].push(r[n].serialize())
            }
            t.floats = {};
            for (i in this._floats) t.floats[i] = this._floats[i];
            t.FloatArrays = {};
            for (i in this._floatsArrays) t.FloatArrays[i] = this._floatsArrays[i];
            t.colors3 = {};
            for (i in this._colors3) t.colors3[i] = this._colors3[i].asArray();
            t.colors3Arrays = {};
            for (i in this._colors3Arrays) t.colors3Arrays[i] = this._colors3Arrays[i];
            t.colors4 = {};
            for (i in this._colors4) t.colors4[i] = this._colors4[i].asArray();
            t.vectors2 = {};
            for (i in this._vectors2) t.vectors2[i] = this._vectors2[i].asArray();
            t.vectors3 = {};
            for (i in this._vectors3) t.vectors3[i] = this._vectors3[i].asArray();
            t.vectors4 = {};
            for (i in this._vectors4) t.vectors4[i] = this._vectors4[i].asArray();
            t.matrices = {};
            for (i in this._matrices) t.matrices[i] = this._matrices[i].asArray();
            t.matrices3x3 = {};
            for (i in this._matrices3x3) t.matrices3x3[i] = this._matrices3x3[i];
            t.matrices2x2 = {};
            for (i in this._matrices2x2) t.matrices2x2[i] = this._matrices2x2[i];
            t.vectors2Arrays = {};
            for (i in this._vectors2Arrays) t.vectors2Arrays[i] = this._vectors2Arrays[i];
            t.vectors3Arrays = {};
            for (i in this._vectors3Arrays) t.vectors3Arrays[i] = this._vectors3Arrays[i];
            return t
        }, i.Parse = function(t, r, n) {
            var o, s = e.SerializationHelper.Parse((function() {
                return new i(t.name, r, t.shaderPath, t.options)
            }), t, r, n);
            for (o in t.textures) s.setTexture(o, e.Texture.Parse(t.textures[o], r, n));
            for (o in t.textureArrays) {
                for (var a = t.textureArrays[o], l = new Array, c = 0; c < a.length; c++) l.push(e.Texture.Parse(a[c], r, n));
                s.setTextureArray(o, l)
            }
            for (o in t.floats) s.setFloat(o, t.floats[o]);
            for (o in t.floatsArrays) s.setFloats(o, t.floatsArrays[o]);
            for (o in t.colors3) s.setColor3(o, e.Color3.FromArray(t.colors3[o]));
            for (o in t.colors3Arrays) {
                var h = t.colors3Arrays[o].reduce((function(e, t, i) {
                    return i % 3 == 0 ? e.push([t]) : e[e.length - 1].push(t), e
                }), []).map((function(t) {
                    return e.Color3.FromArray(t)
                }));
                s.setColor3Array(o, h)
            }
            for (o in t.colors4) s.setColor4(o, e.Color4.FromArray(t.colors4[o]));
            for (o in t.vectors2) s.setVector2(o, e.Vector2.FromArray(t.vectors2[o]));
            for (o in t.vectors3) s.setVector3(o, e.Vector3.FromArray(t.vectors3[o]));
            for (o in t.vectors4) s.setVector4(o, e.Vector4.FromArray(t.vectors4[o]));
            for (o in t.matrices) s.setMatrix(o, e.Matrix.FromArray(t.matrices[o]));
            for (o in t.matrices3x3) s.setMatrix3x3(o, t.matrices3x3[o]);
            for (o in t.matrices2x2) s.setMatrix2x2(o, t.matrices2x2[o]);
            for (o in t.vectors2Arrays) s.setArray2(o, t.vectors2Arrays[o]);
            for (o in t.vectors3Arrays) s.setArray3(o, t.vectors3Arrays[o]);
            return s
        }, i
    })(e.Material);
    e.ShaderMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i) {
            var r = t.call(this, e, i) || this;
            return r.generateOctree = !1, r
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "GroundMesh"
        }, Object.defineProperty(i.prototype, "subdivisions", {
            get: function() {
                return Math.min(this._subdivisionsX, this._subdivisionsY)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "subdivisionsX", {
            get: function() {
                return this._subdivisionsX
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "subdivisionsY", {
            get: function() {
                return this._subdivisionsY
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.optimize = function(e, t) {
            void 0 === t && (t = 32), this._subdivisionsX = e, this._subdivisionsY = e, this.subdivide(e), this.createOrUpdateSubmeshesOctree(t)
        }, i.prototype.getHeightAtCoordinates = function(t, i) {
            var r = this.getWorldMatrix(),
                n = e.Tmp.Matrix[5];
            r.invertToRef(n);
            var o = e.Tmp.Vector3[8];
            if (e.Vector3.TransformCoordinatesFromFloatsToRef(t, 0, i, n, o), t = o.x, i = o.z, t < this._minX || t > this._maxX || i < this._minZ || i > this._maxZ) return this.position.y;
            this._heightQuads && 0 != this._heightQuads.length || (this._initHeightQuads(), this._computeHeightQuads());
            var s = this._getFacetAt(t, i),
                a = -(s.x * t + s.z * i + s.w) / s.y;
            return e.Vector3.TransformCoordinatesFromFloatsToRef(0, a, 0, r, o), o.y
        }, i.prototype.getNormalAtCoordinates = function(t, i) {
            var r = new e.Vector3(0, 1, 0);
            return this.getNormalAtCoordinatesToRef(t, i, r), r
        }, i.prototype.getNormalAtCoordinatesToRef = function(t, i, r) {
            var n = this.getWorldMatrix(),
                o = e.Tmp.Matrix[5];
            n.invertToRef(o);
            var s = e.Tmp.Vector3[8];
            if (e.Vector3.TransformCoordinatesFromFloatsToRef(t, 0, i, o, s), t = s.x, i = s.z, t < this._minX || t > this._maxX || i < this._minZ || i > this._maxZ) return this;
            this._heightQuads && 0 != this._heightQuads.length || (this._initHeightQuads(), this._computeHeightQuads());
            var a = this._getFacetAt(t, i);
            return e.Vector3.TransformNormalFromFloatsToRef(a.x, a.y, a.z, n, r), this
        }, i.prototype.updateCoordinateHeights = function() {
            return this._heightQuads && 0 != this._heightQuads.length || this._initHeightQuads(), this._computeHeightQuads(), this
        }, i.prototype._getFacetAt = function(e, t) {
            var i = Math.floor((e + this._maxX) * this._subdivisionsX / this._width),
                r = Math.floor(-(t + this._maxZ) * this._subdivisionsY / this._height + this._subdivisionsY),
                n = this._heightQuads[r * this._subdivisionsX + i];
            return t < n.slope.x * e + n.slope.y ? n.facet1 : n.facet2
        }, i.prototype._initHeightQuads = function() {
            var t = this._subdivisionsX,
                i = this._subdivisionsY;
            this._heightQuads = new Array;
            for (var r = 0; r < i; r++)
                for (var n = 0; n < t; n++) {
                    var o = {
                        slope: e.Vector2.Zero(),
                        facet1: new e.Vector4(0, 0, 0, 0),
                        facet2: new e.Vector4(0, 0, 0, 0)
                    };
                    this._heightQuads[r * t + n] = o
                }
            return this
        }, i.prototype._computeHeightQuads = function() {
            var t = this.getVerticesData(e.VertexBuffer.PositionKind);
            if (!t) return this;
            for (var i = e.Tmp.Vector3[3], r = e.Tmp.Vector3[2], n = e.Tmp.Vector3[1], o = e.Tmp.Vector3[0], s = e.Tmp.Vector3[4], a = e.Tmp.Vector3[5], l = e.Tmp.Vector3[6], c = e.Tmp.Vector3[7], h = e.Tmp.Vector3[8], u = 0, f = 0, d = 0, p = 0, _ = 0, m = 0, g = 0, v = this._subdivisionsX, y = this._subdivisionsY, b = 0; b < y; b++)
                for (var x = 0; x < v; x++) {
                    u = 3 * x, f = b * (v + 1) * 3, d = (b + 1) * (v + 1) * 3, i.x = t[f + u], i.y = t[f + u + 1], i.z = t[f + u + 2], r.x = t[f + u + 3], r.y = t[f + u + 4], r.z = t[f + u + 5], n.x = t[d + u], n.y = t[d + u + 1], n.z = t[d + u + 2], o.x = t[d + u + 3], o.y = t[d + u + 4], o.z = t[d + u + 5], p = (o.z - i.z) / (o.x - i.x), _ = i.z - p * i.x, r.subtractToRef(i, s), n.subtractToRef(i, a), o.subtractToRef(i, l), e.Vector3.CrossToRef(l, a, c), e.Vector3.CrossToRef(s, l, h), c.normalize(), h.normalize(), m = -(c.x * i.x + c.y * i.y + c.z * i.z), g = -(h.x * r.x + h.y * r.y + h.z * r.z);
                    var T = this._heightQuads[b * v + x];
                    T.slope.copyFromFloats(p, _), T.facet1.copyFromFloats(c.x, c.y, c.z, m), T.facet2.copyFromFloats(h.x, h.y, h.z, g)
                }
            return this
        }, i.prototype.serialize = function(e) {
            t.prototype.serialize.call(this, 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
        }, i.Parse = function(e, t) {
            var r = new i(e.name, t);
            return r._subdivisionsX = e.subdivisionsX || 1, r._subdivisionsY = e.subdivisionsY || 1, r._minX = e.minX, r._maxX = e.maxX, r._minZ = e.minZ, r._maxZ = e.maxZ, r._width = e.width, r._height = e.height, r
        }, i
    })(e.Mesh);
    e.GroundMesh = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i) {
            var r = t.call(this, e, i.getScene()) || this;
            return i.instances.push(r), r._sourceMesh = i, r.position.copyFrom(i.position), r.rotation.copyFrom(i.rotation), r.scaling.copyFrom(i.scaling), i.rotationQuaternion && (r.rotationQuaternion = i.rotationQuaternion.clone()), r.infiniteDistance = i.infiniteDistance, r.setPivotMatrix(i.getPivotMatrix()), r.refreshBoundingInfo(), r._syncSubMeshes(), r
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "InstancedMesh"
        }, Object.defineProperty(i.prototype, "receiveShadows", {
            get: function() {
                return this._sourceMesh.receiveShadows
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "material", {
            get: function() {
                return this._sourceMesh.material
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "visibility", {
            get: function() {
                return this._sourceMesh.visibility
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "skeleton", {
            get: function() {
                return this._sourceMesh.skeleton
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "renderingGroupId", {
            get: function() {
                return this._sourceMesh.renderingGroupId
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getTotalVertices = function() {
            return this._sourceMesh.getTotalVertices()
        }, Object.defineProperty(i.prototype, "sourceMesh", {
            get: function() {
                return this._sourceMesh
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.isReady = function(e) {
            return void 0 === e && (e = !1), this._sourceMesh.isReady(e, !0)
        }, i.prototype.getVerticesData = function(e, t) {
            return this._sourceMesh.getVerticesData(e, t)
        }, i.prototype.setVerticesData = function(e, t, i, r) {
            return this.sourceMesh && this.sourceMesh.setVerticesData(e, t, i, r), this.sourceMesh
        }, i.prototype.updateVerticesData = function(e, t, i, r) {
            return this.sourceMesh && this.sourceMesh.updateVerticesData(e, t, i, r), this.sourceMesh
        }, i.prototype.setIndices = function(e, t) {
            return void 0 === t && (t = null), this.sourceMesh && this.sourceMesh.setIndices(e, t), this.sourceMesh
        }, i.prototype.isVerticesDataPresent = function(e) {
            return this._sourceMesh.isVerticesDataPresent(e)
        }, i.prototype.getIndices = function() {
            return this._sourceMesh.getIndices()
        }, Object.defineProperty(i.prototype, "_positions", {
            get: function() {
                return this._sourceMesh._positions
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.refreshBoundingInfo = function() {
            var t = this._sourceMesh.getBoundingInfo();
            return this._boundingInfo = new e.BoundingInfo(t.minimum.clone(), t.maximum.clone()), this._updateBoundingInfo(), this
        }, i.prototype._preActivate = function() {
            return this._currentLOD && this._currentLOD._preActivate(), this
        }, i.prototype._activate = function(e) {
            return this._currentLOD && this._currentLOD._registerInstanceForRenderId(this, e), this
        }, i.prototype.getLOD = function(e) {
            if (!e) return this;
            var t = this.getBoundingInfo();
            return this._currentLOD = this.sourceMesh.getLOD(e, t.boundingSphere), this._currentLOD === this.sourceMesh ? this : this._currentLOD
        }, i.prototype._syncSubMeshes = function() {
            if (this.releaseSubMeshes(), this._sourceMesh.subMeshes)
                for (var e = 0; e < this._sourceMesh.subMeshes.length; e++) this._sourceMesh.subMeshes[e].clone(this, this._sourceMesh);
            return this
        }, i.prototype._generatePointsArray = function() {
            return this._sourceMesh._generatePointsArray()
        }, i.prototype.clone = function(t, i, r) {
            var n = this._sourceMesh.createInstance(t);
            if (e.Tools.DeepCopy(this, n, ["name", "subMeshes", "uniqueId"], []), this.refreshBoundingInfo(), i && (n.parent = i), !r)
                for (var o = 0; o < this.getScene().meshes.length; o++) {
                    var s = this.getScene().meshes[o];
                    s.parent === this && s.clone(s.name, n)
                }
            return n.computeWorldMatrix(!0), n
        }, i.prototype.dispose = function(e) {
            var i = this._sourceMesh.instances.indexOf(this);
            this._sourceMesh.instances.splice(i, 1), t.prototype.dispose.call(this, e)
        }, i
    })(e.AbstractMesh);
    e.InstancedMesh = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === r && (r = null), void 0 === n && (n = null);
            var c = t.call(this, i, r, n, o, s) || this;
            c.useVertexColor = a, c.useVertexAlpha = l, c.color = new e.Color3(1, 1, 1), c.alpha = 1, o && (c.color = o.color.clone(), c.alpha = o.alpha, c.useVertexColor = o.useVertexColor, c.useVertexAlpha = o.useVertexAlpha), c._intersectionThreshold = .1;
            var h = [],
                u = {
                    attributes: [e.VertexBuffer.PositionKind],
                    uniforms: ["world", "viewProjection"],
                    needAlphaBlending: !0,
                    defines: h
                };
            return !1 === l && (u.needAlphaBlending = !1), a ? (u.defines.push("#define VERTEXCOLOR"), u.attributes.push(e.VertexBuffer.ColorKind)) : u.uniforms.push("color"), c._colorShader = new e.ShaderMaterial("colorShader", c.getScene(), "color", u), c
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "intersectionThreshold", {
            get: function() {
                return this._intersectionThreshold
            },
            set: function(t) {
                this._intersectionThreshold !== t && (this._intersectionThreshold = t, this.geometry && (this.geometry.boundingBias = new e.Vector2(0, t)))
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "LinesMesh"
        }, Object.defineProperty(i.prototype, "material", {
            get: function() {
                return this._colorShader
            },
            set: function(e) {},
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "checkCollisions", {
            get: function() {
                return !1
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.createInstance = function(e) {
            throw new Error("LinesMeshes do not support createInstance.")
        }, i.prototype._bind = function(e, t, i) {
            return this._geometry ? (this._geometry._bind(this._colorShader.getEffect()), this.useVertexColor || this._colorShader.setColor4("color", this.color.toColor4(this.alpha)), this) : this
        }, i.prototype._draw = function(t, i, r) {
            return this._geometry && this._geometry.getVertexBuffers() && this._geometry.getIndexBuffer() ? (this.getScene().getEngine().drawElementsType(e.Material.LineListDrawMode, t.indexStart, t.indexCount), this) : this
        }, i.prototype.dispose = function(e) {
            this._colorShader.dispose(), t.prototype.dispose.call(this, e)
        }, i.prototype.clone = function(e, t, r) {
            return new i(e, this.getScene(), t, this, r)
        }, i
    })(e.Mesh);
    e.LinesMesh = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.updateSideOrientation = function(t) {
            return t == e.Mesh.DOUBLESIDE ? e.Mesh.DOUBLESIDE : void 0 === t || null === t ? e.Mesh.FRONTSIDE : t
        }, t.CreateBox = function(i, r, n) {
            void 0 === n && (n = null);
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateBox(r).applyToMesh(o, r.updatable), o
        }, t.CreateSphere = function(i, r, n) {
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateSphere(r).applyToMesh(o, r.updatable), o
        }, t.CreateDisc = function(i, r, n) {
            void 0 === n && (n = null);
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateDisc(r).applyToMesh(o, r.updatable), o
        }, t.CreateIcoSphere = function(i, r, n) {
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateIcoSphere(r).applyToMesh(o, r.updatable), o
        }, t.CreateRibbon = function(i, r, n) {
            void 0 === n && (n = null);
            var o = r.pathArray,
                s = r.closeArray,
                a = r.closePath,
                l = t.updateSideOrientation(r.sideOrientation),
                c = r.instance,
                h = r.updatable;
            if (c) {
                e.Vector3.FromFloatsToRef(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, e.Tmp.Vector3[0]), e.Vector3.FromFloatsToRef(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, e.Tmp.Vector3[1]);
                var u = c.getVerticesData(e.VertexBuffer.PositionKind);
                if (function(t) {
                        for (var i = o[0].length, r = 0, n = c._originalBuilderSideOrientation === e.Mesh.DOUBLESIDE ? 2 : 1, s = 1; s <= n; s++)
                            for (var a = 0; a < o.length; a++) {
                                var l = o[a],
                                    h = l.length;
                                i = i < h ? i : h;
                                for (var u = 0; u < i;) t[r] = l[u].x, t[r + 1] = l[u].y, t[r + 2] = l[u].z, l[u].x < e.Tmp.Vector3[0].x && (e.Tmp.Vector3[0].x = l[u].x), l[u].x > e.Tmp.Vector3[1].x && (e.Tmp.Vector3[1].x = l[u].x), l[u].y < e.Tmp.Vector3[0].y && (e.Tmp.Vector3[0].y = l[u].y), l[u].y > e.Tmp.Vector3[1].y && (e.Tmp.Vector3[1].y = l[u].y), l[u].z < e.Tmp.Vector3[0].z && (e.Tmp.Vector3[0].z = l[u].z), l[u].z > e.Tmp.Vector3[1].z && (e.Tmp.Vector3[1].z = l[u].z), u++, r += 3;
                                c._closePath && (t[r] = l[0].x, t[r + 1] = l[0].y, t[r + 2] = l[0].z, r += 3)
                            }
                    }(u),
                    c._boundingInfo = new e.BoundingInfo(e.Tmp.Vector3[0], e.Tmp.Vector3[1]), c._boundingInfo.update(c._worldMatrix), c.updateVerticesData(e.VertexBuffer.PositionKind, u, !1, !1), r.colors) {
                    for (var f = c.getVerticesData(e.VertexBuffer.ColorKind), d = 0; d < r.colors.length; d++) f[4 * d] = r.colors[d].r, f[4 * d + 1] = r.colors[d].g, f[4 * d + 2] = r.colors[d].b, f[4 * d + 3] = r.colors[d].a;
                    c.updateVerticesData(e.VertexBuffer.ColorKind, f, !1, !1)
                }
                if (r.uvs) {
                    for (var p = c.getVerticesData(e.VertexBuffer.UVKind), _ = 0; _ < r.uvs.length; _++) p[2 * _] = r.uvs[_].x, p[2 * _ + 1] = r.uvs[_].y;
                    c.updateVerticesData(e.VertexBuffer.UVKind, p, !1, !1)
                }
                if (!c.areNormalsFrozen || c.isFacetDataEnabled) {
                    var m = c.getIndices(),
                        g = c.getVerticesData(e.VertexBuffer.NormalKind),
                        v = c.isFacetDataEnabled ? c.getFacetDataParameters() : null;
                    if (e.VertexData.ComputeNormals(u, m, g, v), c._closePath)
                        for (var y = 0, b = 0, x = 0; x < o.length; x++) y = 3 * c._idx[x], b = x + 1 < o.length ? 3 * (c._idx[x + 1] - 1) : g.length - 3, g[y] = .5 * (g[y] + g[b]), g[y + 1] = .5 * (g[y + 1] + g[b + 1]), g[y + 2] = .5 * (g[y + 2] + g[b + 2]), g[b] = g[y], g[b + 1] = g[y + 1], g[b + 2] = g[y + 2];
                    c.areNormalsFrozen || c.updateVerticesData(e.VertexBuffer.NormalKind, g, !1, !1)
                }
                return c
            }
            var T = new e.Mesh(i, n);
            T._originalBuilderSideOrientation = l;
            var E = e.VertexData.CreateRibbon(r);
            return a && (T._idx = E._idx), T._closePath = a, T._closeArray = s, E.applyToMesh(T, h), T
        }, t.CreateCylinder = function(i, r, n) {
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateCylinder(r).applyToMesh(o, r.updatable), o
        }, t.CreateTorus = function(i, r, n) {
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateTorus(r).applyToMesh(o, r.updatable), o
        }, t.CreateTorusKnot = function(i, r, n) {
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreateTorusKnot(r).applyToMesh(o, r.updatable), o
        }, t.CreateLineSystem = function(t, i, r) {
            var n = i.instance,
                o = i.lines,
                s = i.colors;
            if (n) {
                var a, l, c = n.getVerticesData(e.VertexBuffer.PositionKind);
                s && (a = n.getVerticesData(e.VertexBuffer.ColorKind));
                for (var h = 0, u = 0, f = 0; f < o.length; f++)
                    for (var d = o[f], p = 0; p < d.length; p++) c[h] = d[p].x, c[h + 1] = d[p].y, c[h + 2] = d[p].z, s && a && (l = s[f], a[u] = l[p].r, a[u + 1] = l[p].g, a[u + 2] = l[p].b, a[u + 3] = l[p].a, u += 4), h += 3;
                return n.updateVerticesData(e.VertexBuffer.PositionKind, c, !1, !1), s && a && n.updateVerticesData(e.VertexBuffer.ColorKind, a, !1, !1), n
            }
            var _ = !!s,
                m = new e.LinesMesh(t, r, null, void 0, void 0, _, i.useVertexAlpha);
            return e.VertexData.CreateLineSystem(i).applyToMesh(m, i.updatable), m
        }, t.CreateLines = function(e, i, r) {
            void 0 === r && (r = null);
            var n = i.colors ? [i.colors] : null;
            return t.CreateLineSystem(e, {
                lines: [i.points],
                updatable: i.updatable,
                instance: i.instance,
                colors: n,
                useVertexAlpha: i.useVertexAlpha
            }, r)
        }, t.CreateDashedLines = function(t, i, r) {
            void 0 === r && (r = null);
            var n = i.points,
                o = i.instance,
                s = i.gapSize || 1,
                a = i.dashSize || 3;
            if (o) {
                var l = function(t) {
                    var i = e.Vector3.Zero(),
                        r = t.length / 6,
                        s = 0,
                        a = 0,
                        l = 0,
                        c = 0,
                        h = 0,
                        u = 0,
                        f = 0,
                        d = 0;
                    for (f = 0; f < n.length - 1; f++) n[f + 1].subtractToRef(n[f], i), s += i.length();
                    for (l = s / r, c = o.dashSize * l / (o.dashSize + o.gapSize), f = 0; f < n.length - 1; f++)
                        for (n[f + 1].subtractToRef(n[f], i), a = Math.floor(i.length() / l), i.normalize(), d = 0; d < a && u < t.length;) h = l * d, t[u] = n[f].x + h * i.x, t[u + 1] = n[f].y + h * i.y, t[u + 2] = n[f].z + h * i.z, t[u + 3] = n[f].x + (h + c) * i.x, t[u + 4] = n[f].y + (h + c) * i.y, t[u + 5] = n[f].z + (h + c) * i.z, u += 6, d++;
                    for (; u < t.length;) t[u] = n[f].x, t[u + 1] = n[f].y, t[u + 2] = n[f].z, u += 3
                };
                return o.updateMeshPositions(l, !1), o
            }
            var c = new e.LinesMesh(t, r);
            return e.VertexData.CreateDashedLines(i).applyToMesh(c, i.updatable), c.dashSize = a, c.gapSize = s, c
        }, t.ExtrudeShape = function(i, r, n) {
            void 0 === n && (n = null);
            var o = r.path,
                s = r.shape,
                a = r.scale || 1,
                l = r.rotation || 0,
                c = 0 === r.cap ? 0 : r.cap || e.Mesh.NO_CAP,
                h = r.updatable,
                u = t.updateSideOrientation(r.sideOrientation),
                f = r.instance || null,
                d = r.invertUV || !1;
            return t._ExtrudeShapeGeneric(i, s, o, a, l, null, null, !1, !1, c, !1, n, !!h, u, f, d, r.frontUVs || null, r.backUVs || null)
        }, t.ExtrudeShapeCustom = function(i, r, n) {
            var o = r.path,
                s = r.shape,
                a = r.scaleFunction || function() {
                    return 1
                },
                l = r.rotationFunction || function() {
                    return 0
                },
                c = r.ribbonCloseArray || !1,
                h = r.ribbonClosePath || !1,
                u = 0 === r.cap ? 0 : r.cap || e.Mesh.NO_CAP,
                f = r.updatable,
                d = t.updateSideOrientation(r.sideOrientation),
                p = r.instance,
                _ = r.invertUV || !1;
            return t._ExtrudeShapeGeneric(i, s, o, null, null, a, l, c, h, u, !0, n, !!f, d, p || null, _, r.frontUVs || null, r.backUVs || null)
        }, t.CreateLathe = function(i, r, n) {
            var o, s = r.arc ? r.arc <= 0 || r.arc > 1 ? 1 : r.arc : 1,
                a = void 0 === r.closed || r.closed,
                l = r.shape,
                c = r.radius || 1,
                h = r.tessellation || 64,
                u = r.updatable,
                f = t.updateSideOrientation(r.sideOrientation),
                d = r.cap || e.Mesh.NO_CAP,
                p = 2 * Math.PI,
                _ = new Array,
                m = r.invertUV || !1,
                g = 0,
                v = 0,
                y = p / h * s,
                b = new Array;
            for (g = 0; g <= h; g++) {
                var b = [];
                for (d != e.Mesh.CAP_START && d != e.Mesh.CAP_ALL || (b.push(new e.Vector3(0, l[0].y, 0)), b.push(new e.Vector3(Math.cos(g * y) * l[0].x * c, l[0].y, Math.sin(g * y) * l[0].x * c))), v = 0; v < l.length; v++) o = new e.Vector3(Math.cos(g * y) * l[v].x * c, l[v].y, Math.sin(g * y) * l[v].x * c), b.push(o);
                d != e.Mesh.CAP_END && d != e.Mesh.CAP_ALL || (b.push(new e.Vector3(Math.cos(g * y) * l[l.length - 1].x * c, l[l.length - 1].y, Math.sin(g * y) * l[l.length - 1].x * c)), b.push(new e.Vector3(0, l[l.length - 1].y, 0))), _.push(b)
            }
            return t.CreateRibbon(i, {
                pathArray: _,
                closeArray: a,
                sideOrientation: f,
                updatable: u,
                invertUV: m,
                frontUVs: r.frontUVs,
                backUVs: r.backUVs
            }, n)
        }, t.CreatePlane = function(i, r, n) {
            var o = new e.Mesh(i, n);
            if (r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreatePlane(r).applyToMesh(o, r.updatable), r.sourcePlane) {
                o.translate(r.sourcePlane.normal, r.sourcePlane.d);
                var s = Math.acos(e.Vector3.Dot(r.sourcePlane.normal, e.Axis.Z)),
                    a = e.Vector3.Cross(e.Axis.Z, r.sourcePlane.normal);
                o.rotate(a, s)
            }
            return o
        }, t.CreateGround = function(t, i, r) {
            var n = new e.GroundMesh(t, r);
            return n._setReady(!1), n._subdivisionsX = i.subdivisionsX || i.subdivisions || 1, n._subdivisionsY = i.subdivisionsY || i.subdivisions || 1, n._width = i.width || 1, n._height = i.height || 1, n._maxX = n._width / 2, n._maxZ = n._height / 2, n._minX = -n._maxX, n._minZ = -n._maxZ, e.VertexData.CreateGround(i).applyToMesh(n, i.updatable), n._setReady(!0), n
        }, t.CreateTiledGround = function(t, i, r) {
            var n = new e.Mesh(t, r);
            return e.VertexData.CreateTiledGround(i).applyToMesh(n, i.updatable), n
        }, t.CreateGroundFromHeightMap = function(t, i, r, n) {
            var o = r.width || 10,
                s = r.height || 10,
                a = r.subdivisions || 1,
                l = r.minHeight || 0,
                c = r.maxHeight || 1,
                h = r.colorFilter || new e.Color3(.3, .59, .11),
                u = r.updatable,
                f = r.onReady,
                d = new e.GroundMesh(t, n);
            d._subdivisionsX = a, d._subdivisionsY = a, d._width = o, d._height = s, d._maxX = d._width / 2, d._maxZ = d._height / 2, d._minX = -d._maxX, d._minZ = -d._maxZ, d._setReady(!1);
            var p = function(t) {
                var i = document.createElement("canvas"),
                    r = i.getContext("2d");
                if (!r) throw new Error("Unable to get 2d context for CreateGroundFromHeightMap");
                if (!n.isDisposed) {
                    var p = t.width,
                        _ = t.height;
                    i.width = p, i.height = _, r.drawImage(t, 0, 0);
                    var m = r.getImageData(0, 0, p, _).data;
                    e.VertexData.CreateGroundFromHeightMap({
                        width: o,
                        height: s,
                        subdivisions: a,
                        minHeight: l,
                        maxHeight: c,
                        colorFilter: h,
                        buffer: m,
                        bufferWidth: p,
                        bufferHeight: _
                    }).applyToMesh(d, u), d._setReady(!0), f && f(d)
                }
            };
            return e.Tools.LoadImage(i, p, (function() {}), n.database), d
        }, t.CreatePolygon = function(i, r, n) {
            r.sideOrientation = t.updateSideOrientation(r.sideOrientation);
            for (var o = r.shape, s = r.holes || [], a = r.depth || 0, l = [], c = [], h = 0; h < o.length; h++) l[h] = new e.Vector2(o[h].x, o[h].z);
            l[0].equalsWithEpsilon(l[l.length - 1], 1e-8) && l.pop();
            for (var u = new e.PolygonMeshBuilder(i, l, n), f = 0; f < s.length; f++) {
                c = [];
                for (var d = 0; d < s[f].length; d++) c.push(new e.Vector2(s[f][d].x, s[f][d].z));
                u.addHole(c)
            }
            var p = u.build(r.updatable, a);
            return p._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreatePolygon(p, r.sideOrientation, r.faceUV, r.faceColors, r.frontUVs, r.backUVs).applyToMesh(p, r.updatable), p
        }, t.ExtrudePolygon = function(e, i, r) {
            return t.CreatePolygon(e, i, r)
        }, t.CreateTube = function(i, r, n) {
            var o = r.path,
                s = r.instance,
                a = 1;
            s && (a = s.radius), void 0 !== r.radius && (a = r.radius);
            var l = r.tessellation || 64,
                c = r.radiusFunction || null,
                h = r.cap || e.Mesh.NO_CAP,
                u = r.invertUV || !1,
                f = r.updatable,
                d = t.updateSideOrientation(r.sideOrientation);
            r.arc = r.arc && (r.arc <= 0 || r.arc > 1) ? 1 : r.arc || 1;
            var p, _, m = function(t, i, r, n, o, s, a, l) {
                for (var c, h, u, f, d = i.getTangents(), p = i.getNormals(), _ = i.getDistances(), m = 2 * Math.PI, g = m / o * l, v = function() {
                        return n
                    }, y = s || v, b = e.Tmp.Matrix[0], x = a === e.Mesh._NO_CAP || a === e.Mesh.CAP_END ? 0 : 2, T = 0; T < t.length; T++) {
                    h = y(T, _[T]), c = Array(), u = p[T];
                    for (var E = 0; E < o; E++) e.Matrix.RotationAxisToRef(d[T], g * E, b), f = c[E] ? c[E] : e.Vector3.Zero(), e.Vector3.TransformCoordinatesToRef(u, b, f), f.scaleInPlace(h).addInPlace(t[T]), c[E] = f;
                    r[x] = c, x++
                }
                var A = function(e, i) {
                    for (var r = Array(), n = 0; n < e; n++) r.push(t[i]);
                    return r
                };
                switch (a) {
                    case e.Mesh.NO_CAP:
                        break;
                    case e.Mesh.CAP_START:
                        r[0] = A(o, 0), r[1] = r[2].slice(0);
                        break;
                    case e.Mesh.CAP_END:
                        r[x] = r[x - 1].slice(0), r[x + 1] = A(o, t.length - 1);
                        break;
                    case e.Mesh.CAP_ALL:
                        r[0] = A(o, 0), r[1] = r[2].slice(0), r[x] = r[x - 1].slice(0), r[x + 1] = A(o, t.length - 1)
                }
                return r
            };
            if (s) {
                var g = r.arc || s.arc;
                return p = s.path3D.update(o), _ = m(o, p, s.pathArray, a, s.tessellation, c, s.cap, g), s = t.CreateRibbon("", {
                    pathArray: _,
                    instance: s
                }), s.path3D = p, s.pathArray = _, s.arc = g, s.radius = a, s
            }
            p = new e.Path3D(o);
            var v = new Array;
            h = h < 0 || h > 3 ? 0 : h, _ = m(o, p, v, a, l, c, h, r.arc);
            var y = t.CreateRibbon(i, {
                pathArray: _,
                closePath: !0,
                closeArray: !1,
                updatable: f,
                sideOrientation: d,
                invertUV: u,
                frontUVs: r.frontUVs,
                backUVs: r.backUVs
            }, n);
            return y.pathArray = _, y.path3D = p, y.tessellation = l, y.cap = h, y.arc = r.arc, y.radius = a, y
        }, t.CreatePolyhedron = function(i, r, n) {
            var o = new e.Mesh(i, n);
            return r.sideOrientation = t.updateSideOrientation(r.sideOrientation), o._originalBuilderSideOrientation = r.sideOrientation, e.VertexData.CreatePolyhedron(r).applyToMesh(o, r.updatable), o
        }, t.CreateDecal = function(t, i, r) {
            var n = i.getIndices(),
                o = i.getVerticesData(e.VertexBuffer.PositionKind),
                s = i.getVerticesData(e.VertexBuffer.NormalKind),
                a = r.position || e.Vector3.Zero(),
                l = r.normal || e.Vector3.Up(),
                c = r.size || e.Vector3.One(),
                h = r.angle || 0;
            if (!l) {
                var u = new e.Vector3(0, 0, 1),
                    f = i.getScene().activeCamera,
                    d = e.Vector3.TransformCoordinates(u, f.getWorldMatrix());
                l = f.globalPosition.subtract(d)
            }
            var p = -Math.atan2(l.z, l.x) - Math.PI / 2,
                _ = Math.sqrt(l.x * l.x + l.z * l.z),
                m = Math.atan2(l.y, _),
                g = e.Matrix.RotationYawPitchRoll(p, m, h).multiply(e.Matrix.Translation(a.x, a.y, a.z)),
                v = e.Matrix.Invert(g),
                y = i.getWorldMatrix(),
                b = y.multiply(v),
                x = new e.VertexData;
            x.indices = [], x.positions = [], x.normals = [], x.uvs = [];
            for (var T = 0, E = function(t) {
                    var i = new e.PositionNormalVertex;
                    if (!n || !o || !s) return i;
                    var r = n[t];
                    return i.position = new e.Vector3(o[3 * r], o[3 * r + 1], o[3 * r + 2]), i.position = e.Vector3.TransformCoordinates(i.position, b), i.normal = new e.Vector3(s[3 * r], s[3 * r + 1], s[3 * r + 2]), i.normal = e.Vector3.TransformNormal(i.normal, b), i
                }, A = function(t, i) {
                    if (0 === t.length) return t;
                    for (var r = .5 * Math.abs(e.Vector3.Dot(c, i)), n = function(t, n) {
                            var o = e.Vector3.GetClipFactor(t.position, n.position, i, r);
                            return new e.PositionNormalVertex(e.Vector3.Lerp(t.position, n.position, o), e.Vector3.Lerp(t.normal, n.normal, o))
                        }, o = new Array, s = 0; s < t.length; s += 3) {
                        var a, l, h, u = null,
                            f = null,
                            d = null,
                            p = null,
                            _ = e.Vector3.Dot(t[s].position, i) - r,
                            m = e.Vector3.Dot(t[s + 1].position, i) - r,
                            g = e.Vector3.Dot(t[s + 2].position, i) - r;
                        switch (a = _ > 0, l = m > 0, h = g > 0, (a ? 1 : 0) + (l ? 1 : 0) + (h ? 1 : 0)) {
                            case 0:
                                o.push(t[s]), o.push(t[s + 1]), o.push(t[s + 2]);
                                break;
                            case 1:
                                if (a && (u = t[s + 1], f = t[s + 2], d = n(t[s], u), p = n(t[s], f)), l) {
                                    u = t[s], f = t[s + 2], d = n(t[s + 1], u), p = n(t[s + 1], f), o.push(d), o.push(f.clone()), o.push(u.clone()), o.push(f.clone()), o.push(d.clone()), o.push(p);
                                    break
                                }
                                h && (u = t[s], f = t[s + 1], d = n(t[s + 2], u), p = n(t[s + 2], f)), u && f && d && p && (o.push(u.clone()), o.push(f.clone()), o.push(d), o.push(p), o.push(d.clone()), o.push(f.clone()));
                                break;
                            case 2:
                                a || (u = t[s].clone(), f = n(u, t[s + 1]), d = n(u, t[s + 2]), o.push(u), o.push(f), o.push(d)), l || (u = t[s + 1].clone(), f = n(u, t[s + 2]), d = n(u, t[s]), o.push(u), o.push(f), o.push(d)), h || (u = t[s + 2].clone(), f = n(u, t[s]), d = n(u, t[s + 1]), o.push(u), o.push(f), o.push(d))
                        }
                    }
                    return o
                }, P = 0; P < n.length; P += 3) {
                var M = new Array;
                if (M.push(E(P)), M.push(E(P + 1)), M.push(E(P + 2)), M = A(M, new e.Vector3(1, 0, 0)), M = A(M, new e.Vector3(-1, 0, 0)), M = A(M, new e.Vector3(0, 1, 0)), M = A(M, new e.Vector3(0, -1, 0)), M = A(M, new e.Vector3(0, 0, 1)), M = A(M, new e.Vector3(0, 0, -1)), 0 !== M.length)
                    for (var S = 0; S < M.length; S++) {
                        var C = M[S];
                        x.indices.push(T), C.position.toArray(x.positions, 3 * T), C.normal.toArray(x.normals, 3 * T), x.uvs.push(.5 + C.position.x / c.x), x.uvs.push(.5 + C.position.y / c.y), T++
                    }
            }
            var R = new e.Mesh(t, i.getScene());
            return x.applyToMesh(R), R.position = a.clone(), R.rotation = new e.Vector3(m, p, h), R
        }, t._ExtrudeShapeGeneric = function(i, r, n, o, s, a, l, c, h, u, f, d, p, _, m, g, v, y) {
            var b, x, T = function(t, i, r, n, o, s, a, l, c, h) {
                for (var u = r.getTangents(), f = r.getNormals(), d = r.getBinormals(), p = r.getDistances(), _ = 0, m = function() {
                        return null !== o ? o : 1
                    }, g = function() {
                        return null !== s ? s : 0
                    }, v = h && l ? l : g, y = h && a ? a : m, b = c === e.Mesh.NO_CAP || c === e.Mesh.CAP_END ? 0 : 2, x = e.Tmp.Matrix[0], T = 0; T < i.length; T++) {
                    for (var E = new Array, A = v(T, p[T]), P = y(T, p[T]), M = 0; M < t.length; M++) {
                        e.Matrix.RotationAxisToRef(u[T], _, x);
                        var S = u[T].scale(t[M].z).add(f[T].scale(t[M].x)).add(d[T].scale(t[M].y)),
                            C = E[M] ? E[M] : e.Vector3.Zero();
                        e.Vector3.TransformCoordinatesToRef(S, x, C), C.scaleInPlace(P).addInPlace(i[T]), E[M] = C
                    }
                    n[b] = E, _ += A, b++
                }
                var R = function(t) {
                    var i, r = Array(),
                        n = e.Vector3.Zero();
                    for (i = 0; i < t.length; i++) n.addInPlace(t[i]);
                    for (n.scaleInPlace(1 / t.length), i = 0; i < t.length; i++) r.push(n);
                    return r
                };
                switch (c) {
                    case e.Mesh.NO_CAP:
                        break;
                    case e.Mesh.CAP_START:
                        n[0] = R(n[2]), n[1] = n[2];
                        break;
                    case e.Mesh.CAP_END:
                        n[b] = n[b - 1], n[b + 1] = R(n[b - 1]);
                        break;
                    case e.Mesh.CAP_ALL:
                        n[0] = R(n[2]), n[1] = n[2], n[b] = n[b - 1], n[b + 1] = R(n[b - 1])
                }
                return n
            };
            if (m) return b = m.path3D.update(n), x = T(r, n, m.path3D, m.pathArray, o, s, a, l, m.cap, f), m = e.Mesh.CreateRibbon("", x, !1, !1, 0, d || void 0, !1, 0, m);
            b = new e.Path3D(n);
            var E = new Array;
            u = u < 0 || u > 3 ? 0 : u, x = T(r, n, b, E, o, s, a, l, u, f);
            var A = t.CreateRibbon(i, {
                pathArray: x,
                closeArray: c,
                closePath: h,
                updatable: p,
                sideOrientation: _,
                invertUV: g,
                frontUVs: v || void 0,
                backUVs: y || void 0
            }, d);
            return A.pathArray = x, A.path3D = b, A.cap = u, A
        }, t
    })();
    e.MeshBuilder = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(i) {
            void 0 === i && (i = navigator.hardwareConcurrency || 4);
            for (var r = new Array(i), n = 0; n < r.length; n++) {
                var o = new Worker(t._WorkerBlobUrl);
                o.postMessage({
                    id: "initDecoder",
                    url: t.DecoderUrl
                }), r[n] = o
            }
            this._workerPool = new e.WorkerPool(r)
        }
        return t.prototype.dispose = function() {
            this._workerPool.dispose(), delete this._workerPool
        }, t.prototype.decodeMeshAsync = function(t, i) {
            var r = this;
            return new Promise(function(n, o) {
                r._workerPool.push((function(r, s) {
                    var a = new e.VertexData,
                        l = function(e) {
                            r.removeEventListener("error", l), r.removeEventListener("message", c), o(e), s()
                        },
                        c = function(e) {
                            "done" === e.data ? (r.removeEventListener("error", l), r.removeEventListener("message", c), n(a), s()) : "indices" === e.data.id ? a.indices = e.data.value : a.set(e.data.value, e.data.id)
                        };
                    r.addEventListener("error", l), r.addEventListener("message", c);
                    var h = new Uint8Array(t.byteLength);
                    h.set(new Uint8Array(t.buffer, t.byteOffset, t.byteLength)), r.postMessage({
                        id: "decodeMesh",
                        data: h,
                        attributes: i
                    }, [h.buffer])
                }))
            })
        }, t._Worker = function() {
            var e = self,
                t = function(t, i) {
                    var r = new DracoDecoderModule,
                        n = new r.DecoderBuffer;
                    n.Init(t, t.byteLength);
                    var o, s, a = new r.Decoder;
                    try {
                        var l = a.GetEncodedGeometryType(n);
                        switch (l) {
                            case r.TRIANGULAR_MESH:
                                o = new r.Mesh, s = a.DecodeBufferToMesh(n, o);
                                break;
                            case r.POINT_CLOUD:
                                o = new r.PointCloud, s = a.DecodeBufferToPointCloud(n, o);
                                break;
                            default:
                                throw new Error("Invalid geometry type " + l)
                        }
                        if (!s.ok() || !o.ptr) throw new Error(s.error_msg());
                        var c = o.num_points();
                        if (l === r.TRIANGULAR_MESH) {
                            var h = o.num_faces(),
                                u = new r.DracoInt32Array;
                            try {
                                for (var f = new Uint32Array(3 * h), d = 0; d < h; d++) {
                                    a.GetFaceFromMesh(o, d, u);
                                    var p = 3 * d;
                                    f[p + 0] = u.GetValue(0), f[p + 1] = u.GetValue(1), f[p + 2] = u.GetValue(2)
                                }
                                e.postMessage({
                                    id: "indices",
                                    value: f
                                }, [f.buffer])
                            } finally {
                                r.destroy(u)
                            }
                        }
                        for (var _ in i) {
                            var m = i[_],
                                g = a.GetAttributeByUniqueId(o, m),
                                v = new r.DracoFloat32Array;
                            try {
                                a.GetAttributeFloatForAllPoints(o, g, v);
                                for (var y = new Float32Array(c * g.num_components()), d = 0; d < y.length; d++) y[d] = v.GetValue(d);
                                e.postMessage({
                                    id: _,
                                    value: y
                                }, [y.buffer])
                            } finally {
                                r.destroy(v)
                            }
                        }
                    } finally {
                        o && r.destroy(o), r.destroy(a), r.destroy(n)
                    }
                    e.postMessage("done")
                };
            e.onmessage = function(e) {
                switch (e.data.id) {
                    case "initDecoder":
                        importScripts(e.data.url);
                        break;
                    case "decodeMesh":
                        t(e.data.data, e.data.attributes)
                }
            }
        }, t._GetDefaultDecoderUrl = function() {
            for (var e = 0; e < document.scripts.length; e++)
                if ("text/x-draco-decoder" === document.scripts[e].type) return document.scripts[e].src;
            return null
        }, t.DecoderUrl = t._GetDefaultDecoderUrl(), t._WorkerBlobUrl = URL.createObjectURL(new Blob(["(" + t._Worker.toString() + ")()"], {
            type: "application/javascript"
        })), t
    })();
    e.DracoCompression = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._audioContext = null, this._audioContextInitialized = !1, this.canUseWebAudio = !1, this.WarnedWebAudioUnsupported = !1, this.unlocked = !1, this.isMP3supported = !1, this.isOGGsupported = !1, void 0 === window.AudioContext && void 0 === window.webkitAudioContext || (window.AudioContext = window.AudioContext || window.webkitAudioContext, this.canUseWebAudio = !0);
            var e = document.createElement("audio");
            try {
                e && e.canPlayType && e.canPlayType('audio/mpeg; codecs="mp3"').replace(/^no$/, "") && (this.isMP3supported = !0)
            } catch (e) {}
            try {
                e && e.canPlayType && e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, "") && (this.isOGGsupported = !0)
            } catch (e) {}
            /iPad|iPhone|iPod/.test(navigator.platform) ? this._unlockiOSaudio() : this.unlocked = !0
        }
        return Object.defineProperty(t.prototype, "audioContext", {
            get: function() {
                return this._audioContextInitialized || this._initializeAudioContext(), this._audioContext
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._unlockiOSaudio = function() {
            var e = this,
                t = function() {
                    if (e.audioContext) {
                        var i = e.audioContext.createBuffer(1, 1, 22050),
                            r = e.audioContext.createBufferSource();
                        r.buffer = i, r.connect(e.audioContext.destination), r.start(0), setTimeout((function() {
                            r.playbackState !== r.PLAYING_STATE && r.playbackState !== r.FINISHED_STATE || (e.unlocked = !0, window.removeEventListener("touchend", t, !1), e.onAudioUnlocked && e.onAudioUnlocked())
                        }), 0)
                    }
                };
            window.addEventListener("touchend", t, !1)
        }, t.prototype._initializeAudioContext = function() {
            try {
                this.canUseWebAudio && (this._audioContext = new AudioContext, this.masterGain = this._audioContext.createGain(), this.masterGain.gain.value = 1, this.masterGain.connect(this._audioContext.destination), this._audioContextInitialized = !0)
            } catch (t) {
                this.canUseWebAudio = !1, e.Tools.Error("Web Audio: " + t.message)
            }
        }, t.prototype.dispose = function() {
            this.canUseWebAudio && this._audioContextInitialized && (this._connectedAnalyser && this._audioContext && (this._connectedAnalyser.stopDebugCanvas(), this._connectedAnalyser.dispose(), this.masterGain.disconnect(), this.masterGain.connect(this._audioContext.destination), this._connectedAnalyser = null), this.masterGain.gain.value = 1), this.WarnedWebAudioUnsupported = !1
        }, t.prototype.getGlobalVolume = function() {
            return this.canUseWebAudio && this._audioContextInitialized ? this.masterGain.gain.value : -1
        }, t.prototype.setGlobalVolume = function(e) {
            this.canUseWebAudio && this._audioContextInitialized && (this.masterGain.gain.value = e)
        }, t.prototype.connectToAnalyser = function(e) {
            this._connectedAnalyser && this._connectedAnalyser.stopDebugCanvas(), this.canUseWebAudio && this._audioContextInitialized && this._audioContext && (this._connectedAnalyser = e, this.masterGain.disconnect(), this._connectedAnalyser.connectAudioNodes(this.masterGain, this._audioContext.destination))
        }, t
    })();
    e.AudioEngine = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o) {
            void 0 === n && (n = null);
            var s = this;
            if (this.autoplay = !1, this.loop = !1, this.useCustomAttenuation = !1, this.spatialSound = !1, this.refDistance = 1, this.rolloffFactor = 1, this.maxDistance = 100, this.distanceModel = "linear", this._panningModel = "equalpower", this._playbackRate = 1, this._streaming = !1, this._startTime = 0, this._startOffset = 0, this._position = e.Vector3.Zero(), this._localDirection = new e.Vector3(1, 0, 0), this._volume = 1, this._isReadyToPlay = !1, this.isPlaying = !1, this.isPaused = !1, this._isDirectional = !1, this._coneInnerAngle = 360, this._coneOuterAngle = 360, this._coneOuterGain = 0, this._isOutputConnected = !1, this._urlType = "Unknown", this.name = t, this._scene = r, this._readyToPlayCallback = n, this._customAttenuationFunction = function(e, t, i, r, n) {
                    return t < i ? e * (1 - t / i) : 0
                }, o && (this.autoplay = o.autoplay || !1, this.loop = o.loop || !1, void 0 !== o.volume && (this._volume = o.volume), this.spatialSound = o.spatialSound || !1, this.maxDistance = o.maxDistance || 100, this.useCustomAttenuation = o.useCustomAttenuation || !1, this.rolloffFactor = o.rolloffFactor || 1, this.refDistance = o.refDistance || 1, this.distanceModel = o.distanceModel || "linear", this._playbackRate = o.playbackRate || 1, this._streaming = o.streaming || !1), e.Engine.audioEngine.canUseWebAudio && e.Engine.audioEngine.audioContext) {
                this._soundGain = e.Engine.audioEngine.audioContext.createGain(), this._soundGain.gain.value = this._volume, this._inputAudioNode = this._soundGain, this._ouputAudioNode = this._soundGain, this.spatialSound && this._createSpatialParameters(), this._scene.mainSoundTrack.AddSound(this);
                var a = !0;
                if (i) {
                    "string" == typeof i && (this._urlType = "String"), Array.isArray(i) && (this._urlType = "Array"), i instanceof ArrayBuffer && (this._urlType = "ArrayBuffer");
                    var l = [],
                        c = !1;
                    switch (this._urlType) {
                        case "ArrayBuffer":
                            i.byteLength > 0 && (c = !0, this._soundLoaded(i));
                            break;
                        case "String":
                            l.push(i);
                        case "Array":
                            0 === l.length && (l = i);
                            for (var h = 0; h < l.length; h++) {
                                var u = l[h];
                                if (-1 !== u.indexOf(".mp3", u.length - 4) && e.Engine.audioEngine.isMP3supported && (c = !0), -1 !== u.indexOf(".ogg", u.length - 4) && e.Engine.audioEngine.isOGGsupported && (c = !0), -1 !== u.indexOf(".wav", u.length - 4) && (c = !0), -1 !== u.indexOf("blob:") && (c = !0), c) {
                                    this._streaming ? (this._htmlAudioElement = new Audio(u), this._htmlAudioElement.controls = !1, this._htmlAudioElement.loop = this.loop, e.Tools.SetCorsBehavior(u, this._htmlAudioElement), this._htmlAudioElement.preload = "auto", this._htmlAudioElement.addEventListener("canplaythrough", (function() {
                                        s._isReadyToPlay = !0, s.autoplay && s.play(), s._readyToPlayCallback && s._readyToPlayCallback()
                                    })), document.body.appendChild(this._htmlAudioElement)) : this._scene._loadFile(u, (function(e) {
                                        s._soundLoaded(e)
                                    }), void 0, !0, !0);
                                    break
                                }
                            }
                            break;
                        default:
                            a = !1
                    }
                    a ? c || (this._isReadyToPlay = !0, this._readyToPlayCallback && window.setTimeout((function() {
                        s._readyToPlayCallback && s._readyToPlayCallback()
                    }), 1e3)) : e.Tools.Error("Parameter must be a URL to the sound, an Array of URLs (.mp3 & .ogg) or an ArrayBuffer of the sound.")
                }
            } else this._scene.mainSoundTrack.AddSound(this), e.Engine.audioEngine.WarnedWebAudioUnsupported || (e.Tools.Error("Web Audio is not supported by your browser."), e.Engine.audioEngine.WarnedWebAudioUnsupported = !0), this._readyToPlayCallback && window.setTimeout((function() {
                s._readyToPlayCallback && s._readyToPlayCallback()
            }), 1e3)
        }
        return t.prototype.dispose = function() {
            e.Engine.audioEngine.canUseWebAudio && this._isReadyToPlay && (this.isPlaying && this.stop(), this._isReadyToPlay = !1, -1 === this.soundTrackId ? this._scene.mainSoundTrack.RemoveSound(this) : this._scene.soundTracks[this.soundTrackId].RemoveSound(this), this._soundGain && (this._soundGain.disconnect(), this._soundGain = null), this._soundPanner && (this._soundPanner.disconnect(), this._soundPanner = null), this._soundSource && (this._soundSource.disconnect(), this._soundSource = null), this._audioBuffer = null, this._htmlAudioElement && (this._htmlAudioElement.pause(), this._htmlAudioElement.src = "", document.body.removeChild(this._htmlAudioElement)), this._connectedMesh && this._registerFunc && (this._connectedMesh.unregisterAfterWorldMatrixUpdate(this._registerFunc), this._connectedMesh = null))
        }, t.prototype.isReady = function() {
            return this._isReadyToPlay
        }, t.prototype._soundLoaded = function(t) {
            var i = this;
            e.Engine.audioEngine.audioContext && e.Engine.audioEngine.audioContext.decodeAudioData(t, (function(e) {
                i._audioBuffer = e, i._isReadyToPlay = !0, i.autoplay && i.play(), i._readyToPlayCallback && i._readyToPlayCallback()
            }), (function(t) {
                e.Tools.Error("Error while decoding audio data for: " + i.name + " / Error: " + t)
            }))
        }, t.prototype.setAudioBuffer = function(t) {
            e.Engine.audioEngine.canUseWebAudio && (this._audioBuffer = t, this._isReadyToPlay = !0)
        }, t.prototype.updateOptions = function(e) {
            e && (this.loop = e.loop || this.loop, this.maxDistance = e.maxDistance || this.maxDistance, this.useCustomAttenuation = e.useCustomAttenuation || this.useCustomAttenuation, this.rolloffFactor = e.rolloffFactor || this.rolloffFactor, this.refDistance = e.refDistance || this.refDistance, this.distanceModel = e.distanceModel || this.distanceModel, this._playbackRate = e.playbackRate || this._playbackRate, this._updateSpatialParameters(), this.isPlaying && (this._streaming ? this._htmlAudioElement.playbackRate = this._playbackRate : this._soundSource && (this._soundSource.playbackRate.value = this._playbackRate)))
        }, t.prototype._createSpatialParameters = function() {
            e.Engine.audioEngine.canUseWebAudio && e.Engine.audioEngine.audioContext && (this._scene.headphone && (this._panningModel = "HRTF"), this._soundPanner = e.Engine.audioEngine.audioContext.createPanner(), this._updateSpatialParameters(), this._soundPanner.connect(this._ouputAudioNode), this._inputAudioNode = this._soundPanner)
        }, t.prototype._updateSpatialParameters = function() {
            this.spatialSound && this._soundPanner && (this.useCustomAttenuation ? (this._soundPanner.distanceModel = "linear", this._soundPanner.maxDistance = Number.MAX_VALUE, this._soundPanner.refDistance = 1, this._soundPanner.rolloffFactor = 1, this._soundPanner.panningModel = this._panningModel) : (this._soundPanner.distanceModel = this.distanceModel, this._soundPanner.maxDistance = this.maxDistance, this._soundPanner.refDistance = this.refDistance, this._soundPanner.rolloffFactor = this.rolloffFactor, this._soundPanner.panningModel = this._panningModel))
        }, t.prototype.switchPanningModelToHRTF = function() {
            this._panningModel = "HRTF", this._switchPanningModel()
        }, t.prototype.switchPanningModelToEqualPower = function() {
            this._panningModel = "equalpower", this._switchPanningModel()
        }, t.prototype._switchPanningModel = function() {
            e.Engine.audioEngine.canUseWebAudio && this.spatialSound && this._soundPanner && (this._soundPanner.panningModel = this._panningModel)
        }, t.prototype.connectToSoundTrackAudioNode = function(t) {
            e.Engine.audioEngine.canUseWebAudio && (this._isOutputConnected && this._ouputAudioNode.disconnect(), this._ouputAudioNode.connect(t), this._isOutputConnected = !0)
        }, t.prototype.setDirectionalCone = function(t, i, r) {
            if (i < t) return void e.Tools.Error("setDirectionalCone(): outer angle of the cone must be superior or equal to the inner angle.");
            this._coneInnerAngle = t, this._coneOuterAngle = i, this._coneOuterGain = r, this._isDirectional = !0, this.isPlaying && this.loop && (this.stop(), this.play())
        }, t.prototype.setPosition = function(t) {
            this._position = t, e.Engine.audioEngine.canUseWebAudio && this.spatialSound && this._soundPanner && this._soundPanner.setPosition(this._position.x, this._position.y, this._position.z)
        }, t.prototype.setLocalDirectionToMesh = function(t) {
            this._localDirection = t, e.Engine.audioEngine.canUseWebAudio && this._connectedMesh && this.isPlaying && this._updateDirection()
        }, t.prototype._updateDirection = function() {
            if (this._connectedMesh && this._soundPanner) {
                var t = this._connectedMesh.getWorldMatrix(),
                    i = e.Vector3.TransformNormal(this._localDirection, t);
                i.normalize(), this._soundPanner.setOrientation(i.x, i.y, i.z)
            }
        }, t.prototype.updateDistanceFromListener = function() {
            if (e.Engine.audioEngine.canUseWebAudio && this._connectedMesh && this.useCustomAttenuation && this._soundGain && this._scene.activeCamera) {
                var t = this._connectedMesh.getDistanceToCamera(this._scene.activeCamera);
                this._soundGain.gain.value = this._customAttenuationFunction(this._volume, t, this.maxDistance, this.refDistance, this.rolloffFactor)
            }
        }, t.prototype.setAttenuationFunction = function(e) {
            this._customAttenuationFunction = e
        }, t.prototype.play = function(t, i) {
            var r = this;
            if (this._isReadyToPlay && this._scene.audioEnabled && e.Engine.audioEngine.audioContext) try {
                this._startOffset < 0 && (t = -this._startOffset, this._startOffset = 0);
                var n = t ? e.Engine.audioEngine.audioContext.currentTime + t : e.Engine.audioEngine.audioContext.currentTime;
                this._soundSource && this._streamingSource || this.spatialSound && this._soundPanner && (this._soundPanner.setPosition(this._position.x, this._position.y, this._position.z), this._isDirectional && (this._soundPanner.coneInnerAngle = this._coneInnerAngle, this._soundPanner.coneOuterAngle = this._coneOuterAngle, this._soundPanner.coneOuterGain = this._coneOuterGain, this._connectedMesh ? this._updateDirection() : this._soundPanner.setOrientation(this._localDirection.x, this._localDirection.y, this._localDirection.z))), this._streaming ? (this._streamingSource || (this._streamingSource = e.Engine.audioEngine.audioContext.createMediaElementSource(this._htmlAudioElement), this._htmlAudioElement.onended = function() {
                    r._onended()
                }, this._htmlAudioElement.playbackRate = this._playbackRate), this._streamingSource.disconnect(), this._streamingSource.connect(this._inputAudioNode), this._htmlAudioElement.play()) : (this._soundSource = e.Engine.audioEngine.audioContext.createBufferSource(), this._soundSource.buffer = this._audioBuffer, this._soundSource.connect(this._inputAudioNode), this._soundSource.loop = this.loop, this._soundSource.playbackRate.value = this._playbackRate, this._soundSource.onended = function() {
                    r._onended()
                }, this._soundSource.buffer && this._soundSource.start(n, this.isPaused ? this._startOffset % this._soundSource.buffer.duration : i || 0)), this._startTime = n, this.isPlaying = !0, this.isPaused = !1
            } catch (t) {
                e.Tools.Error("Error while trying to play audio: " + this.name + ", " + t.message)
            }
        }, t.prototype._onended = function() {
            this.isPlaying = !1, this.onended && this.onended()
        }, t.prototype.stop = function(t) {
            if (this.isPlaying) {
                if (this._streaming) this._htmlAudioElement.pause(), this._htmlAudioElement.currentTime > 0 && (this._htmlAudioElement.currentTime = 0);
                else if (e.Engine.audioEngine.audioContext && this._soundSource) {
                    var i = t ? e.Engine.audioEngine.audioContext.currentTime + t : e.Engine.audioEngine.audioContext.currentTime;
                    this._soundSource.stop(i), this._soundSource.onended = function() {}, this.isPaused || (this._startOffset = 0)
                }
                this.isPlaying = !1
            }
        }, t.prototype.pause = function() {
            this.isPlaying && (this.isPaused = !0, this._streaming ? this._htmlAudioElement.pause() : e.Engine.audioEngine.audioContext && (this.stop(0), this._startOffset += e.Engine.audioEngine.audioContext.currentTime - this._startTime))
        }, t.prototype.setVolume = function(t, i) {
            e.Engine.audioEngine.canUseWebAudio && this._soundGain && (i && e.Engine.audioEngine.audioContext ? (this._soundGain.gain.cancelScheduledValues(e.Engine.audioEngine.audioContext.currentTime), this._soundGain.gain.setValueAtTime(this._soundGain.gain.value, e.Engine.audioEngine.audioContext.currentTime), this._soundGain.gain.linearRampToValueAtTime(t, e.Engine.audioEngine.audioContext.currentTime + i)) : this._soundGain.gain.value = t), this._volume = t
        }, t.prototype.setPlaybackRate = function(e) {
            this._playbackRate = e, this.isPlaying && (this._streaming ? this._htmlAudioElement.playbackRate = this._playbackRate : this._soundSource && (this._soundSource.playbackRate.value = this._playbackRate))
        }, t.prototype.getVolume = function() {
            return this._volume
        }, t.prototype.attachToMesh = function(e) {
            var t = this;
            this._connectedMesh && this._registerFunc && (this._connectedMesh.unregisterAfterWorldMatrixUpdate(this._registerFunc), this._registerFunc = null), this._connectedMesh = e, this.spatialSound || (this.spatialSound = !0, this._createSpatialParameters(), this.isPlaying && this.loop && (this.stop(), this.play())), this._onRegisterAfterWorldMatrixUpdate(this._connectedMesh), this._registerFunc = function(e) {
                return t._onRegisterAfterWorldMatrixUpdate(e)
            }, e.registerAfterWorldMatrixUpdate(this._registerFunc)
        }, t.prototype.detachFromMesh = function() {
            this._connectedMesh && this._registerFunc && (this._connectedMesh.unregisterAfterWorldMatrixUpdate(this._registerFunc), this._registerFunc = null, this._connectedMesh = null)
        }, t.prototype._onRegisterAfterWorldMatrixUpdate = function(t) {
            if (t.getBoundingInfo) {
                var i = t,
                    r = i.getBoundingInfo();
                this.setPosition(r.boundingSphere.centerWorld), e.Engine.audioEngine.canUseWebAudio && this._isDirectional && this.isPlaying && this._updateDirection()
            }
        }, t.prototype.clone = function() {
            var e = this;
            if (this._streaming) return null;
            var i = function() {
                    e._isReadyToPlay ? (n._audioBuffer = e.getAudioBuffer(), n._isReadyToPlay = !0, n.autoplay && n.play()) : window.setTimeout(i, 300)
                },
                r = {
                    autoplay: this.autoplay,
                    loop: this.loop,
                    volume: this._volume,
                    spatialSound: this.spatialSound,
                    maxDistance: this.maxDistance,
                    useCustomAttenuation: this.useCustomAttenuation,
                    rolloffFactor: this.rolloffFactor,
                    refDistance: this.refDistance,
                    distanceModel: this.distanceModel
                },
                n = new t(this.name + "_cloned", new ArrayBuffer(0), this._scene, null, r);
            return this.useCustomAttenuation && n.setAttenuationFunction(this._customAttenuationFunction), n.setPosition(this._position), n.setPlaybackRate(this._playbackRate), i(), n
        }, t.prototype.getAudioBuffer = function() {
            return this._audioBuffer
        }, t.prototype.serialize = function() {
            var e = {
                name: this.name,
                url: this.name,
                autoplay: this.autoplay,
                loop: this.loop,
                volume: this._volume,
                spatialSound: this.spatialSound,
                maxDistance: this.maxDistance,
                rolloffFactor: this.rolloffFactor,
                refDistance: this.refDistance,
                distanceModel: this.distanceModel,
                playbackRate: this._playbackRate,
                panningModel: this._panningModel,
                soundTrackId: this.soundTrackId
            };
            return this.spatialSound && (this._connectedMesh && (e.connectedMeshId = this._connectedMesh.id), e.position = this._position.asArray(), e.refDistance = this.refDistance, e.distanceModel = this.distanceModel, e.isDirectional = this._isDirectional, e.localDirectionToMesh = this._localDirection.asArray(), e.coneInnerAngle = this._coneInnerAngle, e.coneOuterAngle = this._coneOuterAngle, e.coneOuterGain = this._coneOuterGain), e
        }, t.Parse = function(i, r, n, o) {
            var s, a = i.name;
            s = i.url ? n + i.url : n + a;
            var l, c = {
                autoplay: i.autoplay,
                loop: i.loop,
                volume: i.volume,
                spatialSound: i.spatialSound,
                maxDistance: i.maxDistance,
                rolloffFactor: i.rolloffFactor,
                refDistance: i.refDistance,
                distanceModel: i.distanceModel,
                playbackRate: i.playbackRate
            };
            if (o) {
                var h = function() {
                    o._isReadyToPlay ? (l._audioBuffer = o.getAudioBuffer(), l._isReadyToPlay = !0, l.autoplay && l.play()) : window.setTimeout(h, 300)
                };
                l = new t(a, new ArrayBuffer(0), r, null, c), h()
            } else l = new t(a, s, r, function() {
                r._removePendingData(l)
            }, c), r._addPendingData(l);
            if (i.position) {
                var u = e.Vector3.FromArray(i.position);
                l.setPosition(u)
            }
            if (i.isDirectional && (l.setDirectionalCone(i.coneInnerAngle || 360, i.coneOuterAngle || 360, i.coneOuterGain || 0), i.localDirectionToMesh)) {
                var f = e.Vector3.FromArray(i.localDirectionToMesh);
                l.setLocalDirectionToMesh(f)
            }
            if (i.connectedMeshId) {
                var d = r.getMeshByID(i.connectedMeshId);
                d && l.attachToMesh(d)
            }
            return l
        }, t
    })();
    e.Sound = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t) {
            this.id = -1, this._isMainTrack = !1, this._isInitialized = !1, this._scene = e, this.soundCollection = new Array, this._options = t, this._isMainTrack || (this._scene.soundTracks.push(this), this.id = this._scene.soundTracks.length - 1)
        }
        return t.prototype._initializeSoundTrackAudioGraph = function() {
            e.Engine.audioEngine.canUseWebAudio && e.Engine.audioEngine.audioContext && (this._outputAudioNode = e.Engine.audioEngine.audioContext.createGain(), this._outputAudioNode.connect(e.Engine.audioEngine.masterGain), this._options && (this._options.volume && (this._outputAudioNode.gain.value = this._options.volume), this._options.mainTrack && (this._isMainTrack = this._options.mainTrack)), this._isInitialized = !0)
        }, t.prototype.dispose = function() {
            if (e.Engine.audioEngine && e.Engine.audioEngine.canUseWebAudio) {
                for (this._connectedAnalyser && this._connectedAnalyser.stopDebugCanvas(); this.soundCollection.length;) this.soundCollection[0].dispose();
                this._outputAudioNode && this._outputAudioNode.disconnect(), this._outputAudioNode = null
            }
        }, t.prototype.AddSound = function(t) {
            this._isInitialized || this._initializeSoundTrackAudioGraph(), e.Engine.audioEngine.canUseWebAudio && this._outputAudioNode && t.connectToSoundTrackAudioNode(this._outputAudioNode), t.soundTrackId && (-1 === t.soundTrackId ? this._scene.mainSoundTrack.RemoveSound(t) : this._scene.soundTracks[t.soundTrackId].RemoveSound(t)), this.soundCollection.push(t), t.soundTrackId = this.id
        }, t.prototype.RemoveSound = function(e) {
            var t = this.soundCollection.indexOf(e); - 1 !== t && this.soundCollection.splice(t, 1)
        }, t.prototype.setVolume = function(t) {
            e.Engine.audioEngine.canUseWebAudio && this._outputAudioNode && (this._outputAudioNode.gain.value = t)
        }, t.prototype.switchPanningModelToHRTF = function() {
            if (e.Engine.audioEngine.canUseWebAudio)
                for (var t = 0; t < this.soundCollection.length; t++) this.soundCollection[t].switchPanningModelToHRTF()
        }, t.prototype.switchPanningModelToEqualPower = function() {
            if (e.Engine.audioEngine.canUseWebAudio)
                for (var t = 0; t < this.soundCollection.length; t++) this.soundCollection[t].switchPanningModelToEqualPower()
        }, t.prototype.connectToAnalyser = function(t) {
            this._connectedAnalyser && this._connectedAnalyser.stopDebugCanvas(), this._connectedAnalyser = t, e.Engine.audioEngine.canUseWebAudio && this._outputAudioNode && (this._outputAudioNode.disconnect(), this._connectedAnalyser.connectAudioNodes(this._outputAudioNode, e.Engine.audioEngine.masterGain))
        }, t
    })();
    e.SoundTrack = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            this.SMOOTHING = .75, this.FFT_SIZE = 512, this.BARGRAPHAMPLITUDE = 256, this.DEBUGCANVASPOS = {
                x: 20,
                y: 20
            }, this.DEBUGCANVASSIZE = {
                width: 320,
                height: 200
            }, this._scene = t, this._audioEngine = e.Engine.audioEngine, this._audioEngine.canUseWebAudio && this._audioEngine.audioContext && (this._webAudioAnalyser = this._audioEngine.audioContext.createAnalyser(), this._webAudioAnalyser.minDecibels = -140, this._webAudioAnalyser.maxDecibels = 0, this._byteFreqs = new Uint8Array(this._webAudioAnalyser.frequencyBinCount), this._byteTime = new Uint8Array(this._webAudioAnalyser.frequencyBinCount), this._floatFreqs = new Float32Array(this._webAudioAnalyser.frequencyBinCount))
        }
        return t.prototype.getFrequencyBinCount = function() {
            return this._audioEngine.canUseWebAudio ? this._webAudioAnalyser.frequencyBinCount : 0
        }, t.prototype.getByteFrequencyData = function() {
            return this._audioEngine.canUseWebAudio && (this._webAudioAnalyser.smoothingTimeConstant = this.SMOOTHING, this._webAudioAnalyser.fftSize = this.FFT_SIZE, this._webAudioAnalyser.getByteFrequencyData(this._byteFreqs)), this._byteFreqs
        }, t.prototype.getByteTimeDomainData = function() {
            return this._audioEngine.canUseWebAudio && (this._webAudioAnalyser.smoothingTimeConstant = this.SMOOTHING, this._webAudioAnalyser.fftSize = this.FFT_SIZE, this._webAudioAnalyser.getByteTimeDomainData(this._byteTime)), this._byteTime
        }, t.prototype.getFloatFrequencyData = function() {
            return this._audioEngine.canUseWebAudio && (this._webAudioAnalyser.smoothingTimeConstant = this.SMOOTHING, this._webAudioAnalyser.fftSize = this.FFT_SIZE, this._webAudioAnalyser.getFloatFrequencyData(this._floatFreqs)), this._floatFreqs
        }, t.prototype.drawDebugCanvas = function() {
            var e = this;
            if (this._audioEngine.canUseWebAudio && (this._debugCanvas || (this._debugCanvas = document.createElement("canvas"), this._debugCanvas.width = this.DEBUGCANVASSIZE.width, this._debugCanvas.height = this.DEBUGCANVASSIZE.height, this._debugCanvas.style.position = "absolute", this._debugCanvas.style.top = this.DEBUGCANVASPOS.y + "px", this._debugCanvas.style.left = this.DEBUGCANVASPOS.x + "px", this._debugCanvasContext = this._debugCanvas.getContext("2d"), document.body.appendChild(this._debugCanvas), this._registerFunc = function() {
                    e.drawDebugCanvas()
                }, this._scene.registerBeforeRender(this._registerFunc)), this._registerFunc && this._debugCanvasContext)) {
                var t = this.getByteFrequencyData();
                this._debugCanvasContext.fillStyle = "rgb(0, 0, 0)", this._debugCanvasContext.fillRect(0, 0, this.DEBUGCANVASSIZE.width, this.DEBUGCANVASSIZE.height);
                for (var i = 0; i < this.getFrequencyBinCount(); i++) {
                    var r = t[i],
                        n = r / this.BARGRAPHAMPLITUDE,
                        o = this.DEBUGCANVASSIZE.height * n,
                        s = this.DEBUGCANVASSIZE.height - o - 1,
                        a = this.DEBUGCANVASSIZE.width / this.getFrequencyBinCount(),
                        l = i / this.getFrequencyBinCount() * 360;
                    this._debugCanvasContext.fillStyle = "hsl(" + l + ", 100%, 50%)", this._debugCanvasContext.fillRect(i * a, s, a, o)
                }
            }
        }, t.prototype.stopDebugCanvas = function() {
            this._debugCanvas && (this._registerFunc && (this._scene.unregisterBeforeRender(this._registerFunc), this._registerFunc = null), document.body.removeChild(this._debugCanvas), this._debugCanvas = null, this._debugCanvasContext = null)
        }, t.prototype.connectAudioNodes = function(e, t) {
            this._audioEngine.canUseWebAudio && (e.connect(this._webAudioAnalyser), this._webAudioAnalyser.connect(t))
        }, t.prototype.dispose = function() {
            this._audioEngine.canUseWebAudio && this._webAudioAnalyser.disconnect()
        }, t
    })();
    e.Analyser = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u) {
            void 0 === n && (n = null), void 0 === o && (o = !1), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null), void 0 === c && (c = e.Engine.TEXTUREFORMAT_RGBA), void 0 === h && (h = !1), void 0 === u && (u = null);
            var f = t.call(this, r) || this;
            if (f.coordinatesMode = e.Texture.CUBIC_MODE, f.boundingBoxPosition = e.Vector3.Zero(), f.name = i, f.url = i, f._noMipmap = o, f.hasAlpha = !1, f._format = c, f._prefiltered = h, f.isCube = !0, f._textureMatrix = e.Matrix.Identity(), h && (f.gammaSpace = !1), !i && !s) return f;
            f._texture = f._getFromCache(i, o);
            var d = i.lastIndexOf("."),
                p = u || (d > -1 ? i.substring(d).toLowerCase() : ""),
                _ = ".dds" === p;
            if (!s && (_ || n || (n = ["_px.jpg", "_py.jpg", "_pz.jpg", "_nx.jpg", "_ny.jpg", "_nz.jpg"]), s = [], n))
                for (var m = 0; m < n.length; m++) s.push(i + n[m]);
            return f._files = s, f._texture ? a && (f._texture.isReady ? e.Tools.SetImmediate((function() {
                return a()
            })) : f._texture.onLoadedObservable.add(a)) : r.useDelayedTextureLoading ? f.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED : f._texture = h ? r.getEngine().createPrefilteredCubeTexture(i, r, f.lodGenerationScale, f.lodGenerationOffset, a, l, c, u) : r.getEngine().createCubeTexture(i, r, s, o, a, l, f._format, u), f
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "boundingBoxSize", {
            get: function() {
                return this._boundingBoxSize
            },
            set: function(t) {
                if (!this._boundingBoxSize || !this._boundingBoxSize.equals(t)) {
                    this._boundingBoxSize = t;
                    var i = this.getScene();
                    i && i.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag)
                }
            },
            enumerable: !0,
            configurable: !0
        }), i.CreateFromImages = function(e, t, r) {
            var n = "";
            return e.forEach((function(e) {
                return n += e
            })), new i(n, t, null, r, e)
        }, i.CreateFromPrefilteredData = function(e, t, r) {
            return void 0 === r && (r = null), new i(e, t, null, !1, null, null, null, void 0, !0, r)
        }, i.prototype.delayLoad = function() {
            if (this.delayLoadState === e.Engine.DELAYLOADSTATE_NOTLOADED) {
                var t = this.getScene();
                t && (this.delayLoadState = e.Engine.DELAYLOADSTATE_LOADED, this._texture = this._getFromCache(this.url, this._noMipmap), this._texture || (this._prefiltered ? this._texture = t.getEngine().createPrefilteredCubeTexture(this.url, t, this.lodGenerationScale, this.lodGenerationOffset, void 0, void 0, this._format) : this._texture = t.getEngine().createCubeTexture(this.url, t, this._files, this._noMipmap, void 0, void 0, this._format)))
            }
        }, i.prototype.getReflectionTextureMatrix = function() {
            return this._textureMatrix
        }, i.prototype.setReflectionTextureMatrix = function(e) {
            this._textureMatrix = e
        }, i.Parse = function(t, r, n) {
            var o = e.SerializationHelper.Parse((function() {
                return new i(n + t.name, r, t.extensions)
            }), t, r);
            if (t.boundingBoxPosition && (o.boundingBoxPosition = e.Vector3.FromArray(t.boundingBoxPosition)), t.boundingBoxSize && (o.boundingBoxSize = e.Vector3.FromArray(t.boundingBoxSize)), t.animations)
                for (var s = 0; s < t.animations.length; s++) {
                    var a = t.animations[s];
                    o.animations.push(e.Animation.Parse(a))
                }
            return o
        }, i.prototype.clone = function() {
            var t = this;
            return e.SerializationHelper.Clone((function() {
                var e = t.getScene();
                return e ? new i(t.url, e, t._extensions, t._noMipmap, t._files) : t
            }), this)
        }, i
    })(e.BaseTexture);
    e.CubeTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u, f) {
            void 0 === s && (s = !0), void 0 === a && (a = e.Engine.TEXTURETYPE_UNSIGNED_INT), void 0 === l && (l = !1), void 0 === c && (c = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === h && (h = !0), void 0 === u && (u = !1), void 0 === f && (f = !1);
            var d = t.call(this, null, n, !o) || this;
            return d.isCube = l, d.renderList = new Array, d.renderParticles = !0, d.renderSprites = !1, d.coordinatesMode = e.Texture.PROJECTION_MODE, d.ignoreCameraViewport = !1, d.onBeforeBindObservable = new e.Observable, d.onAfterUnbindObservable = new e.Observable, d.onBeforeRenderObservable = new e.Observable, d.onAfterRenderObservable = new e.Observable, d.onClearObservable = new e.Observable, d._currentRefreshId = -1, d._refreshRate = 1, d._samples = 1, d.boundingBoxPosition = e.Vector3.Zero(), (n = d.getScene()) ? (d._engine = n.getEngine(), d.name = i, d.isRenderTarget = !0, d._initialSizeParameter = r, d._processSizeParameter(r), d._resizeObserver = d.getScene().getEngine().onResizeObservable.add((function() {})), d._generateMipMaps = !!o, d._doNotChangeAspectRatio = s, d._renderingManager = new e.RenderingManager(n), f ? d : (d._renderTargetOptions = {
                generateMipMaps: o,
                type: a,
                samplingMode: c,
                generateDepthBuffer: h,
                generateStencilBuffer: u
            }, c === e.Texture.NEAREST_SAMPLINGMODE && (d.wrapU = e.Texture.CLAMP_ADDRESSMODE, d.wrapV = e.Texture.CLAMP_ADDRESSMODE), l ? (d._texture = n.getEngine().createRenderTargetCubeTexture(d.getRenderSize(), d._renderTargetOptions), d.coordinatesMode = e.Texture.INVCUBIC_MODE, d._textureMatrix = e.Matrix.Identity()) : d._texture = n.getEngine().createRenderTargetTexture(d._size, d._renderTargetOptions), d)) : d
        }
        return __extends(i, t), Object.defineProperty(i, "REFRESHRATE_RENDER_ONCE", {
            get: function() {
                return i._REFRESHRATE_RENDER_ONCE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "REFRESHRATE_RENDER_ONEVERYFRAME", {
            get: function() {
                return i._REFRESHRATE_RENDER_ONEVERYFRAME
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "REFRESHRATE_RENDER_ONEVERYTWOFRAMES", {
            get: function() {
                return i._REFRESHRATE_RENDER_ONEVERYTWOFRAMES
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onAfterUnbind", {
            set: function(e) {
                this._onAfterUnbindObserver && this.onAfterUnbindObservable.remove(this._onAfterUnbindObserver), this._onAfterUnbindObserver = this.onAfterUnbindObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onBeforeRender", {
            set: function(e) {
                this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onAfterRender", {
            set: function(e) {
                this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onClear", {
            set: function(e) {
                this._onClearObserver && this.onClearObservable.remove(this._onClearObserver), this._onClearObserver = this.onClearObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "renderTargetOptions", {
            get: function() {
                return this._renderTargetOptions
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._onRatioRescale = function() {
            this._sizeRatio && this.resize(this._initialSizeParameter)
        }, Object.defineProperty(i.prototype, "boundingBoxSize", {
            get: function() {
                return this._boundingBoxSize
            },
            set: function(t) {
                if (!this._boundingBoxSize || !this._boundingBoxSize.equals(t)) {
                    this._boundingBoxSize = t;
                    var i = this.getScene();
                    i && i.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag)
                }
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._processSizeParameter = function(e) {
            e.ratio ? (this._sizeRatio = e.ratio, this._size = {
                width: this._bestReflectionRenderTargetDimension(this._engine.getRenderWidth(), this._sizeRatio),
                height: this._bestReflectionRenderTargetDimension(this._engine.getRenderHeight(), this._sizeRatio)
            }) : this._size = e
        }, Object.defineProperty(i.prototype, "samples", {
            get: function() {
                return this._samples
            },
            set: function(e) {
                if (this._samples !== e) {
                    var t = this.getScene();
                    t && (this._samples = t.getEngine().updateRenderTargetTextureSampleCount(this._texture, e))
                }
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.resetRefreshCounter = function() {
            this._currentRefreshId = -1
        }, Object.defineProperty(i.prototype, "refreshRate", {
            get: function() {
                return this._refreshRate
            },
            set: function(e) {
                this._refreshRate = e, this.resetRefreshCounter()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.addPostProcess = function(t) {
            if (!this._postProcessManager) {
                var i = this.getScene();
                if (!i) return;
                this._postProcessManager = new e.PostProcessManager(i), this._postProcesses = new Array
            }
            this._postProcesses.push(t), this._postProcesses[0].autoClear = !1
        }, i.prototype.clearPostProcesses = function(e) {
            if (this._postProcesses) {
                if (e)
                    for (var t = 0, i = this._postProcesses; t < i.length; t++) {
                        var r = i[t];
                        r.dispose()
                    }
                this._postProcesses = []
            }
        }, i.prototype.removePostProcess = function(e) {
            if (this._postProcesses) {
                var t = this._postProcesses.indexOf(e); - 1 !== t && (this._postProcesses.splice(t, 1), this._postProcesses.length > 0 && (this._postProcesses[0].autoClear = !1))
            }
        }, i.prototype._shouldRender = function() {
            return -1 === this._currentRefreshId ? (this._currentRefreshId = 1, !0) : this.refreshRate === this._currentRefreshId ? (this._currentRefreshId = 1, !0) : (this._currentRefreshId++, !1)
        }, i.prototype.getRenderSize = function() {
            return this._size.width ? this._size.width : this._size
        }, i.prototype.getRenderWidth = function() {
            return this._size.width ? this._size.width : this._size
        }, i.prototype.getRenderHeight = function() {
            return this._size.width ? this._size.height : this._size
        }, Object.defineProperty(i.prototype, "canRescale", {
            get: function() {
                return !0
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.scale = function(e) {
            var t = this.getRenderSize() * e;
            this.resize(t)
        }, i.prototype.getReflectionTextureMatrix = function() {
            return this.isCube ? this._textureMatrix : t.prototype.getReflectionTextureMatrix.call(this)
        }, i.prototype.resize = function(e) {
            this.releaseInternalTexture();
            var t = this.getScene();
            t && (this._processSizeParameter(e), this.isCube ? this._texture = t.getEngine().createRenderTargetCubeTexture(this.getRenderSize(), this._renderTargetOptions) : this._texture = t.getEngine().createRenderTargetTexture(this._size, this._renderTargetOptions))
        }, i.prototype.render = function(e, t) {
            void 0 === e && (e = !1), void 0 === t && (t = !1);
            var i = this.getScene();
            if (i) {
                var r = i.getEngine();
                if (void 0 !== this.useCameraPostProcesses && (e = this.useCameraPostProcesses), this._waitingRenderList) {
                    this.renderList = [];
                    for (var n = 0; n < this._waitingRenderList.length; n++) {
                        var o = this._waitingRenderList[n],
                            s = i.getMeshByID(o);
                        s && this.renderList.push(s)
                    }
                    delete this._waitingRenderList
                }
                if (this.renderListPredicate) {
                    this.renderList ? this.renderList.splice(0) : this.renderList = [];
                    var i = this.getScene();
                    if (!i) return;
                    for (var a = i.meshes, n = 0; n < a.length; n++) {
                        var l = a[n];
                        this.renderListPredicate(l) && this.renderList.push(l)
                    }
                }
                this.onBeforeBindObservable.notifyObservers(this);
                var c;
                this.activeCamera ? (c = this.activeCamera, r.setViewport(this.activeCamera.viewport, this.getRenderWidth(), this.getRenderHeight()), this.activeCamera !== i.activeCamera && i.setTransformMatrix(this.activeCamera.getViewMatrix(), this.activeCamera.getProjectionMatrix(!0))) : (c = i.activeCamera) && r.setViewport(c.viewport, this.getRenderWidth(), this.getRenderHeight()), this._renderingManager.reset();
                for (var h = this.renderList ? this.renderList : i.getActiveMeshes().data, u = this.renderList ? this.renderList.length : i.getActiveMeshes().length, f = i.getRenderId(), d = 0; d < u; d++) {
                    var l = h[d];
                    if (l) {
                        if (!l.isReady()) {
                            this.resetRefreshCounter();
                            continue
                        }
                        l._preActivateForIntermediateRendering(f);
                        var p = void 0;
                        if (p = !(this.renderList || !c) && 0 == (l.layerMask & c.layerMask), l.isEnabled() && l.isVisible && l.subMeshes && !p) {
                            l._activate(f);
                            for (var _ = 0; _ < l.subMeshes.length; _++) {
                                var m = l.subMeshes[_];
                                i._activeIndices.addCount(m.indexCount, !1), this._renderingManager.dispatch(m, l)
                            }
                        }
                    }
                }
                for (var g = 0; g < i.particleSystems.length; g++) {
                    var v = i.particleSystems[g],
                        y = v.emitter;
                    v.isStarted() && y && y.position && y.isEnabled() && (h.indexOf(y) >= 0 && this._renderingManager.dispatchParticles(v))
                }
                if (this.isCube)
                    for (var b = 0; b < 6; b++) this.renderToTarget(b, h, u, e, t), i.incrementRenderId(), i.resetCachedMaterial();
                else this.renderToTarget(0, h, u, e, t);
                this.onAfterUnbindObservable.notifyObservers(this), i.activeCamera && (this.activeCamera && this.activeCamera !== i.activeCamera && i.setTransformMatrix(i.activeCamera.getViewMatrix(), i.activeCamera.getProjectionMatrix(!0)), r.setViewport(i.activeCamera.viewport)), i.resetCachedMaterial()
            }
        }, i.prototype._bestReflectionRenderTargetDimension = function(t, i) {
            var r = t * i,
                n = e.Tools.NearestPOT(r + 16384 / (128 + r));
            return Math.min(e.Tools.FloorPOT(t), n)
        }, i.prototype.unbindFrameBuffer = function(e, t) {
            var i = this;
            this._texture && e.unBindFramebuffer(this._texture, this.isCube, (function() {
                i.onAfterRenderObservable.notifyObservers(t)
            }))
        }, i.prototype.renderToTarget = function(t, i, r, n, o) {
            var s = this.getScene();
            if (s) {
                var a = s.getEngine();
                this._texture && (this._postProcessManager ? this._postProcessManager._prepareFrame(this._texture, this._postProcesses) : n && s.postProcessManager._prepareFrame(this._texture) || this._texture && a.bindFramebuffer(this._texture, this.isCube ? t : void 0, void 0, void 0, this.ignoreCameraViewport, this.depthStencilTexture ? this.depthStencilTexture : void 0), this.onBeforeRenderObservable.notifyObservers(t), this.onClearObservable.hasObservers() ? this.onClearObservable.notifyObservers(a) : a.clear(this.clearColor || s.clearColor, !0, !0, !0), this._doNotChangeAspectRatio || s.updateTransformMatrix(!0), this._renderingManager.render(this.customRenderFunction, i, this.renderParticles, this.renderSprites), this._postProcessManager ? this._postProcessManager._finalizeFrame(!1, this._texture, t, this._postProcesses, this.ignoreCameraViewport) : n && s.postProcessManager._finalizeFrame(!1, this._texture, t), this._doNotChangeAspectRatio || s.updateTransformMatrix(!0), o && e.Tools.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), a), this.isCube && 5 !== t ? this.onAfterRenderObservable.notifyObservers(t) : (this.isCube && 5 === t && a.generateMipMapsForCubemap(this._texture), this.unbindFrameBuffer(a, t)))
            }
        }, i.prototype.setRenderingOrder = function(e, t, i, r) {
            void 0 === t && (t = null), void 0 === i && (i = null), void 0 === r && (r = null), this._renderingManager.setRenderingOrder(e, t, i, r)
        }, i.prototype.setRenderingAutoClearDepthStencil = function(e, t) {
            this._renderingManager.setRenderingAutoClearDepthStencil(e, t)
        }, i.prototype.clone = function() {
            var e = this.getSize(),
                t = new i(this.name, e.width, this.getScene(), this._renderTargetOptions.generateMipMaps, this._doNotChangeAspectRatio, this._renderTargetOptions.type, this.isCube, this._renderTargetOptions.samplingMode, this._renderTargetOptions.generateDepthBuffer, this._renderTargetOptions.generateStencilBuffer);
            return t.hasAlpha = this.hasAlpha, t.level = this.level, t.coordinatesMode = this.coordinatesMode, this.renderList && (t.renderList = this.renderList.slice(0)), t
        }, i.prototype.serialize = function() {
            if (!this.name) return null;
            var e = t.prototype.serialize.call(this);
            if (e.renderTargetSize = this.getRenderSize(), e.renderList = [], this.renderList)
                for (var i = 0; i < this.renderList.length; i++) e.renderList.push(this.renderList[i].id);
            return e
        }, i.prototype.disposeFramebufferObjects = function() {
            var e = this.getInternalTexture(),
                t = this.getScene();
            e && t && t.getEngine()._releaseFramebufferObjects(e)
        }, i.prototype.dispose = function() {
            this._postProcessManager && (this._postProcessManager.dispose(), this._postProcessManager = null), this.clearPostProcesses(!0), this._resizeObserver && (this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver), this._resizeObserver = null), this.renderList = null;
            var e = this.getScene();
            if (e) {
                var i = e.customRenderTargets.indexOf(this);
                i >= 0 && e.customRenderTargets.splice(i, 1);
                for (var r = 0, n = e.cameras; r < n.length; r++) {
                    var o = n[r];
                    i = o.customRenderTargets.indexOf(this), i >= 0 && o.customRenderTargets.splice(i, 1)
                }
                t.prototype.dispose.call(this)
            }
        }, i.prototype._rebuild = function() {
            this.refreshRate === i.REFRESHRATE_RENDER_ONCE && (this.refreshRate = i.REFRESHRATE_RENDER_ONCE), this._postProcessManager && this._postProcessManager._rebuild()
        }, i._REFRESHRATE_RENDER_ONCE = 0, i._REFRESHRATE_RENDER_ONEVERYFRAME = 1, i._REFRESHRATE_RENDER_ONEVERYTWOFRAMES = 2, i
    })(e.Texture);
    e.RenderTargetTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s) {
            var a = this,
                l = !(!s || !s.generateMipMaps) && s.generateMipMaps,
                c = !(!s || !s.generateDepthTexture) && s.generateDepthTexture,
                h = !s || void 0 === s.doNotChangeAspectRatio || s.doNotChangeAspectRatio;
            if (a = t.call(this, i, r, o, l, h) || this, a._engine = o.getEngine(), !a.isSupported) return void a.dispose();
            for (var u = [], f = [], d = 0; d < n; d++) s && s.types && void 0 !== s.types[d] ? u.push(s.types[d]) : u.push(s && s.defaultType ? s.defaultType : e.Engine.TEXTURETYPE_UNSIGNED_INT), s && s.samplingModes && void 0 !== s.samplingModes[d] ? f.push(s.samplingModes[d]) : f.push(e.Texture.BILINEAR_SAMPLINGMODE);
            var p = !s || void 0 === s.generateDepthBuffer || s.generateDepthBuffer,
                _ = !(!s || void 0 === s.generateStencilBuffer) && s.generateStencilBuffer;
            return a._size = r, a._multiRenderTargetOptions = {
                samplingModes: f,
                generateMipMaps: l,
                generateDepthBuffer: p,
                generateStencilBuffer: _,
                generateDepthTexture: c,
                types: u,
                textureCount: n
            }, a._createInternalTextures(), a._createTextures(), a
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "isSupported", {
            get: function() {
                return this._engine.webGLVersion > 1 || this._engine.getCaps().drawBuffersExtension
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "textures", {
            get: function() {
                return this._textures
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "depthTexture", {
            get: function() {
                return this._textures[this._textures.length - 1]
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "wrapU", {
            set: function(e) {
                if (this._textures)
                    for (var t = 0; t < this._textures.length; t++) this._textures[t].wrapU = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "wrapV", {
            set: function(e) {
                if (this._textures)
                    for (var t = 0; t < this._textures.length; t++) this._textures[t].wrapV = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._rebuild = function() {
            this.releaseInternalTextures(), this._createInternalTextures();
            for (var e = 0; e < this._internalTextures.length; e++) {
                this._textures[e]._texture = this._internalTextures[e]
            }
            this._texture = this._internalTextures[0]
        }, i.prototype._createInternalTextures = function() {
            this._internalTextures = this._engine.createMultipleRenderTarget(this._size, this._multiRenderTargetOptions)
        }, i.prototype._createTextures = function() {
            this._textures = [];
            for (var t = 0; t < this._internalTextures.length; t++) {
                var i = new e.Texture(null, this.getScene());
                i._texture = this._internalTextures[t], this._textures.push(i)
            }
            this._texture = this._internalTextures[0]
        }, Object.defineProperty(i.prototype, "samples", {
            get: function() {
                return this._samples
            },
            set: function(e) {
                this._samples !== e && (this._samples = this._engine.updateMultipleRenderTargetTextureSampleCount(this._internalTextures, e))
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.resize = function(e) {
            this.releaseInternalTextures(), this._internalTextures = this._engine.createMultipleRenderTarget(e, this._multiRenderTargetOptions), this._createInternalTextures()
        }, i.prototype.unbindFrameBuffer = function(e, t) {
            var i = this;
            e.unBindMultiColorAttachmentFramebuffer(this._internalTextures, this.isCube, (function() {
                i.onAfterRenderObservable.notifyObservers(t)
            }))
        }, i.prototype.dispose = function() {
            this.releaseInternalTextures(), t.prototype.dispose.call(this)
        }, i.prototype.releaseInternalTextures = function() {
            if (this._internalTextures)
                for (var e = this._internalTextures.length - 1; e >= 0; e--) void 0 !== this._internalTextures[e] && (this._internalTextures[e].dispose(), this._internalTextures.splice(e, 1))
        }, i
    })(e.RenderTargetTexture);
    e.MultiRenderTarget = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === s && (s = e.Engine.TEXTURETYPE_UNSIGNED_INT), void 0 === a && (a = e.Texture.BILINEAR_SAMPLINGMODE), void 0 === l && (l = !0);
            var c = t.call(this, i, r, n, o, !0, s, !1, a, l) || this;
            return c.mirrorPlane = new e.Plane(0, 1, 0, 1), c._transformMatrix = e.Matrix.Zero(), c._mirrorMatrix = e.Matrix.Zero(), c._adaptiveBlurKernel = 0, c._blurKernelX = 0, c._blurKernelY = 0, c._blurRatio = 1, c.ignoreCameraViewport = !0, c.onBeforeRenderObservable.add((function() {
                e.Matrix.ReflectionToRef(c.mirrorPlane, c._mirrorMatrix), c._savedViewMatrix = n.getViewMatrix(), c._mirrorMatrix.multiplyToRef(c._savedViewMatrix, c._transformMatrix), n.setTransformMatrix(c._transformMatrix, n.getProjectionMatrix()), n.clipPlane = c.mirrorPlane, n.getEngine().cullBackFaces = !1, n._mirroredCameraPosition = e.Vector3.TransformCoordinates(n.activeCamera.globalPosition, c._mirrorMatrix)
            })), c.onAfterRenderObservable.add((function() {
                n.setTransformMatrix(c._savedViewMatrix, n.getProjectionMatrix()), n.getEngine().cullBackFaces = !0, n._mirroredCameraPosition = null, delete n.clipPlane
            })), c
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "blurRatio", {
            get: function() {
                return this._blurRatio
            },
            set: function(e) {
                this._blurRatio !== e && (this._blurRatio = e, this._preparePostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "adaptiveBlurKernel", {
            set: function(e) {
                this._adaptiveBlurKernel = e, this._autoComputeBlurKernel()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "blurKernel", {
            set: function(e) {
                this.blurKernelX = e, this.blurKernelY = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "blurKernelX", {
            get: function() {
                return this._blurKernelX
            },
            set: function(e) {
                this._blurKernelX !== e && (this._blurKernelX = e, this._preparePostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "blurKernelY", {
            get: function() {
                return this._blurKernelY
            },
            set: function(e) {
                this._blurKernelY !== e && (this._blurKernelY = e, this._preparePostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._autoComputeBlurKernel = function() {
            var e = this.getScene().getEngine(),
                t = this.getRenderWidth() / e.getRenderWidth(),
                i = this.getRenderHeight() / e.getRenderHeight();
            this.blurKernelX = this._adaptiveBlurKernel * t, this.blurKernelY = this._adaptiveBlurKernel * i
        }, i.prototype._onRatioRescale = function() {
            this._sizeRatio && (this.resize(this._initialSizeParameter), this._adaptiveBlurKernel || this._preparePostProcesses()), this._adaptiveBlurKernel && this._autoComputeBlurKernel()
        }, i.prototype._preparePostProcesses = function() {
            if (this.clearPostProcesses(!0), this._blurKernelX && this._blurKernelY) {
                var t = this.getScene().getEngine(),
                    i = t.getCaps().textureFloatRender ? e.Engine.TEXTURETYPE_FLOAT : e.Engine.TEXTURETYPE_HALF_FLOAT;
                this._blurX = new e.BlurPostProcess("horizontal blur", new e.Vector2(1, 0), this._blurKernelX, this._blurRatio, null, e.Texture.BILINEAR_SAMPLINGMODE, t, !1, i), this._blurX.autoClear = !1, 1 === this._blurRatio && this.samples < 2 && this._texture ? this._blurX.inputTexture = this._texture : this._blurX.alwaysForcePOT = !0, this._blurY = new e.BlurPostProcess("vertical blur", new e.Vector2(0, 1), this._blurKernelY, this._blurRatio, null, e.Texture.BILINEAR_SAMPLINGMODE, t, !1, i), this._blurY.autoClear = !1, this._blurY.alwaysForcePOT = 1 !== this._blurRatio, this.addPostProcess(this._blurX), this.addPostProcess(this._blurY)
            } else this._blurY && (this.removePostProcess(this._blurY), this._blurY.dispose(), this._blurY = null), this._blurX && (this.removePostProcess(this._blurX), this._blurX.dispose(), this._blurX = null)
        }, i.prototype.clone = function() {
            var e = this.getScene();
            if (!e) return this;
            var t = this.getSize(),
                r = new i(this.name, t.width, e, this._renderTargetOptions.generateMipMaps, this._renderTargetOptions.type, this._renderTargetOptions.samplingMode, this._renderTargetOptions.generateDepthBuffer);
            return r.hasAlpha = this.hasAlpha, r.level = this.level, r.mirrorPlane = this.mirrorPlane.clone(), this.renderList && (r.renderList = this.renderList.slice(0)), r
        }, i.prototype.serialize = function() {
            if (!this.name) return null;
            var e = t.prototype.serialize.call(this);
            return e.mirrorPlane = this.mirrorPlane.asArray(), e
        }, i
    })(e.RenderTargetTexture);
    e.MirrorTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, r, n, o, !0) || this;
            return s.refractionPlane = new e.Plane(0, 1, 0, 1), s.depth = 2, s.onBeforeRenderObservable.add((function() {
                n.clipPlane = s.refractionPlane
            })), s.onAfterRenderObservable.add((function() {
                delete n.clipPlane
            })), s
        }
        return __extends(i, t), i.prototype.clone = function() {
            var e = this.getScene();
            if (!e) return this;
            var t = this.getSize(),
                r = new i(this.name, t.width, e, this._generateMipMaps);
            return r.hasAlpha = this.hasAlpha, r.level = this.level, r.refractionPlane = this.refractionPlane.clone(), this.renderList && (r.renderList = this.renderList.slice(0)), r.depth = this.depth, r
        }, i.prototype.serialize = function() {
            if (!this.name) return null;
            var e = t.prototype.serialize.call(this);
            return e.mirrorPlane = this.refractionPlane.asArray(), e.depth = this.depth, e
        }, i
    })(e.RenderTargetTexture);
    e.RefractionTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a) {
            void 0 === n && (n = null), void 0 === s && (s = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === a && (a = e.Engine.TEXTUREFORMAT_RGBA);
            var l = t.call(this, null, n, !o, void 0, s, void 0, void 0, void 0, void 0, a) || this;
            l.name = i, l._engine = l.getScene().getEngine(), l.wrapU = e.Texture.CLAMP_ADDRESSMODE, l.wrapV = e.Texture.CLAMP_ADDRESSMODE, l._generateMipMaps = o, r.getContext ? (l._canvas = r,
                l._texture = l._engine.createDynamicTexture(r.width, r.height, o, s)) : (l._canvas = document.createElement("canvas"), r.width ? l._texture = l._engine.createDynamicTexture(r.width, r.height, o, s) : l._texture = l._engine.createDynamicTexture(r, r, o, s));
            var c = l.getSize();
            return l._canvas.width = c.width, l._canvas.height = c.height, l._context = l._canvas.getContext("2d"), l
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "canRescale", {
            get: function() {
                return !0
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._recreate = function(e) {
            this._canvas.width = e.width, this._canvas.height = e.height, this.releaseInternalTexture(), this._texture = this._engine.createDynamicTexture(e.width, e.height, this._generateMipMaps, this._samplingMode)
        }, i.prototype.scale = function(e) {
            var t = this.getSize();
            t.width *= e, t.height *= e, this._recreate(t)
        }, i.prototype.scaleTo = function(e, t) {
            var i = this.getSize();
            i.width = e, i.height = t, this._recreate(i)
        }, i.prototype.getContext = function() {
            return this._context
        }, i.prototype.clear = function() {
            var e = this.getSize();
            this._context.fillRect(0, 0, e.width, e.height)
        }, i.prototype.update = function(e) {
            this._engine.updateDynamicTexture(this._texture, this._canvas, void 0 === e || e, void 0, this._format || void 0)
        }, i.prototype.drawText = function(e, t, i, r, n, o, s, a) {
            void 0 === a && (a = !0);
            var l = this.getSize();
            if (o && (this._context.fillStyle = o, this._context.fillRect(0, 0, l.width, l.height)), this._context.font = r, null === t || void 0 === t) {
                var c = this._context.measureText(e);
                t = (l.width - c.width) / 2
            }
            if (null === i || void 0 === i) {
                var h = parseInt(r.replace(/\D/g, ""));
                i = l.height / 2 + h / 3.65
            }
            this._context.fillStyle = n, this._context.fillText(e, t, i), a && this.update(s)
        }, i.prototype.clone = function() {
            var e = this.getScene();
            if (!e) return this;
            var t = this.getSize(),
                r = new i(this.name, t, e, this._generateMipMaps);
            return r.hasAlpha = this.hasAlpha, r.level = this.level, r.wrapU = this.wrapU, r.wrapV = this.wrapV, r
        }, i.prototype._rebuild = function() {
            this.update()
        }, i
    })(e.Texture);
    e.DynamicTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === o && (o = !1), void 0 === s && (s = !1), void 0 === a && (a = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === l && (l = {
                autoPlay: !0,
                loop: !0,
                autoUpdateTexture: !0
            });
            var c = t.call(this, null, n, !o, s) || this;
            return c._createInternalTexture = function() {
                null == c._texture && (!c._engine.needPOTTextures || e.Tools.IsExponentOfTwo(c.video.videoWidth) && e.Tools.IsExponentOfTwo(c.video.videoHeight) ? (c.wrapU = e.Texture.WRAP_ADDRESSMODE, c.wrapV = e.Texture.WRAP_ADDRESSMODE) : (c.wrapU = e.Texture.CLAMP_ADDRESSMODE, c.wrapV = e.Texture.CLAMP_ADDRESSMODE, c._generateMipMaps = !1), c._texture = c._engine.createDynamicTexture(c.video.videoWidth, c.video.videoHeight, c._generateMipMaps, c._samplingMode), c._texture.isReady = !0, c._updateInternalTexture())
            }, c.reset = function() {
                null != c._texture && (c._texture.dispose(), c._texture = null)
            }, c._updateInternalTexture = function(e) {
                null != c._texture && c._texture.isReady && (c.video.readyState < c.video.HAVE_CURRENT_DATA || c._engine.updateVideoTexture(c._texture, c.video, c._invertY))
            }, c._engine = c.getScene().getEngine(), c._generateMipMaps = o, c._samplingMode = a, c.autoUpdateTexture = l.autoUpdateTexture, c.name = i || c._getName(r), c.video = c._getVideo(r), void 0 !== l.autoPlay && (c.video.autoplay = l.autoPlay), void 0 !== l.loop && (c.video.loop = l.loop), c.video.addEventListener("canplay", c._createInternalTexture), c.video.addEventListener("paused", c._updateInternalTexture), c.video.addEventListener("seeked", c._updateInternalTexture), c.video.addEventListener("emptied", c.reset), c.video.readyState >= c.video.HAVE_CURRENT_DATA && c._createInternalTexture(), c
        }
        return __extends(i, t), i.prototype._getName = function(e) {
            return e instanceof HTMLVideoElement ? e.currentSrc : "object" == typeof e ? e.toString() : e
        }, i.prototype._getVideo = function(t) {
            if (t instanceof HTMLVideoElement) return e.Tools.SetCorsBehavior(t.currentSrc, t), t;
            var i = document.createElement("video");
            return "string" == typeof t ? (e.Tools.SetCorsBehavior(t, i), i.src = t) : (e.Tools.SetCorsBehavior(t[0], i), t.forEach((function(e) {
                var t = document.createElement("source");
                t.src = e, i.appendChild(t)
            }))), i
        }, i.prototype._rebuild = function() {
            this.update()
        }, i.prototype.update = function() {
            this.autoUpdateTexture && this.updateTexture(!0)
        }, i.prototype.updateTexture = function(e) {
            e && (this.video.paused || this._updateInternalTexture())
        }, i.prototype.updateURL = function(e) {
            this.video.src = e
        }, i.prototype.dispose = function() {
            t.prototype.dispose.call(this), this.video.removeEventListener("canplay", this._createInternalTexture), this.video.removeEventListener("paused", this._updateInternalTexture), this.video.removeEventListener("seeked", this._updateInternalTexture), this.video.removeEventListener("emptied", this.reset), this.video.pause()
        }, i.CreateFromWebCam = function(t, r, n) {
            var o, s = document.createElement("video");
            n && n.deviceId && (o = {
                exact: n.deviceId
            }), navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia, window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL, navigator.getUserMedia && navigator.getUserMedia({
                video: {
                    deviceId: o,
                    width: {
                        min: n && n.minWidth || 256,
                        max: n && n.maxWidth || 640
                    },
                    height: {
                        min: n && n.minHeight || 256,
                        max: n && n.maxHeight || 480
                    }
                }
            }, (function(e) {
                void 0 !== s.mozSrcObject ? s.mozSrcObject = e : s.src = window.URL && window.URL.createObjectURL(e) || e, s.play(), r && r(new i("video", s, t, !0, !0))
            }), (function(t) {
                e.Tools.Error(t.name)
            }))
        }, i
    })(e.Texture);
    e.VideoTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h) {
            void 0 === a && (a = !0), void 0 === l && (l = !1), void 0 === c && (c = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === h && (h = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var u = t.call(this, null, s, !a, l) || this;
            return u.format = o, u._engine = s.getEngine(), u._texture = s.getEngine().createRawTexture(i, r, n, o, a, l, c, null, h), u.wrapU = e.Texture.CLAMP_ADDRESSMODE, u.wrapV = e.Texture.CLAMP_ADDRESSMODE, u
        }
        return __extends(i, t), i.prototype.update = function(e) {
            this._engine.updateRawTexture(this._texture, e, this._texture.format, this._texture.invertY, void 0, this._texture.type)
        }, i.CreateLuminanceTexture = function(t, r, n, o, s, a, l) {
            return void 0 === s && (s = !0), void 0 === a && (a = !1), void 0 === l && (l = e.Texture.TRILINEAR_SAMPLINGMODE), new i(t, r, n, e.Engine.TEXTUREFORMAT_LUMINANCE, o, s, a, l)
        }, i.CreateLuminanceAlphaTexture = function(t, r, n, o, s, a, l) {
            return void 0 === s && (s = !0), void 0 === a && (a = !1), void 0 === l && (l = e.Texture.TRILINEAR_SAMPLINGMODE), new i(t, r, n, e.Engine.TEXTUREFORMAT_LUMINANCE_ALPHA, o, s, a, l)
        }, i.CreateAlphaTexture = function(t, r, n, o, s, a, l) {
            return void 0 === s && (s = !0), void 0 === a && (a = !1), void 0 === l && (l = e.Texture.TRILINEAR_SAMPLINGMODE), new i(t, r, n, e.Engine.TEXTUREFORMAT_ALPHA, o, s, a, l)
        }, i.CreateRGBTexture = function(t, r, n, o, s, a, l, c) {
            return void 0 === s && (s = !0), void 0 === a && (a = !1), void 0 === l && (l = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === c && (c = e.Engine.TEXTURETYPE_UNSIGNED_INT), new i(t, r, n, e.Engine.TEXTUREFORMAT_RGB, o, s, a, l, c)
        }, i.CreateRGBATexture = function(t, r, n, o, s, a, l, c) {
            return void 0 === s && (s = !0), void 0 === a && (a = !1), void 0 === l && (l = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === c && (c = e.Engine.TEXTURETYPE_UNSIGNED_INT), new i(t, r, n, e.Engine.TEXTUREFORMAT_RGBA, o, s, a, l, c)
        }, i
    })(e.Texture);
    e.RawTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o, s, a, l, c, h, u, f, d, p) {
            void 0 === a && (a = e.Texture.NEAREST_SAMPLINGMODE), void 0 === h && (h = null), void 0 === u && (u = e.Engine.TEXTURETYPE_UNSIGNED_INT), void 0 === f && (f = "postprocess"), void 0 === p && (p = !1), this.name = t, this.width = -1, this.height = -1, this.autoClear = !0, this.alphaMode = e.Engine.ALPHA_DISABLE, this.animations = new Array, this.enablePixelPerfectMode = !1, this.scaleMode = e.Engine.SCALEMODE_FLOOR, this.alwaysForcePOT = !1, this.samples = 1, this.adaptScaleToCurrentViewport = !1, this._reusable = !1, this._textures = new e.SmartArray(2), this._currentRenderTextureInd = 0, this._scaleRatio = new e.Vector2(1, 1), this._texelSize = e.Vector2.Zero(), this.onActivateObservable = new e.Observable, this.onSizeChangedObservable = new e.Observable, this.onApplyObservable = new e.Observable, this.onBeforeRenderObservable = new e.Observable, this.onAfterRenderObservable = new e.Observable, null != s ? (this._camera = s, this._scene = s.getScene(), s.attachPostProcess(this), this._engine = this._scene.getEngine(), this._scene.postProcesses.push(this)) : l && (this._engine = l, this._engine.postProcesses.push(this)), this._options = o, this.renderTargetSamplingMode = a || e.Texture.NEAREST_SAMPLINGMODE, this._reusable = c || !1, this._textureType = u, this._samplers = n || [], this._samplers.push("textureSampler"), this._fragmentUrl = i, this._vertexUrl = f, this._parameters = r || [], this._parameters.push("scale"), this._indexParameters = d, p || this.updateEffect(h)
        }
        return Object.defineProperty(t.prototype, "onActivate", {
            set: function(e) {
                this._onActivateObserver && this.onActivateObservable.remove(this._onActivateObserver), e && (this._onActivateObserver = this.onActivateObservable.add(e))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onSizeChanged", {
            set: function(e) {
                this._onSizeChangedObserver && this.onSizeChangedObservable.remove(this._onSizeChangedObserver), this._onSizeChangedObserver = this.onSizeChangedObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onApply", {
            set: function(e) {
                this._onApplyObserver && this.onApplyObservable.remove(this._onApplyObserver), this._onApplyObserver = this.onApplyObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onBeforeRender", {
            set: function(e) {
                this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onAfterRender", {
            set: function(e) {
                this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "inputTexture", {
            get: function() {
                return this._textures.data[this._currentRenderTextureInd]
            },
            set: function(e) {
                this._forcedOutputTexture = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getCamera = function() {
            return this._camera
        }, Object.defineProperty(t.prototype, "texelSize", {
            get: function() {
                return this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.texelSize : (this._forcedOutputTexture && this._texelSize.copyFromFloats(1 / this._forcedOutputTexture.width, 1 / this._forcedOutputTexture.height), this._texelSize)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getEngine = function() {
            return this._engine
        }, t.prototype.getEffect = function() {
            return this._effect
        }, t.prototype.shareOutputWith = function(e) {
            return this._disposeTextures(), this._shareOutputWithPostProcess = e, this
        }, t.prototype.updateEffect = function(e, t, i, r, n, o) {
            void 0 === e && (e = null), void 0 === t && (t = null), void 0 === i && (i = null), this._effect = this._engine.createEffect({
                vertex: this._vertexUrl,
                fragment: this._fragmentUrl
            }, ["position"], t || this._parameters, i || this._samplers, null !== e ? e : "", void 0, n, o, r || this._indexParameters)
        }, t.prototype.isReusable = function() {
            return this._reusable
        }, t.prototype.markTextureDirty = function() {
            this.width = -1
        }, t.prototype.activate = function(t, i, r) {
            var n = this;
            void 0 === i && (i = null), t = t || this._camera;
            var o = t.getScene(),
                s = o.getEngine(),
                a = s.getCaps().maxTextureSize,
                l = (i ? i.width : this._engine.getRenderWidth(!0)) * this._options | 0,
                c = (i ? i.height : this._engine.getRenderHeight(!0)) * this._options | 0,
                h = t.parent;
            !h || h.leftCamera != t && h.rightCamera != t || (l /= 2);
            var u = this._options.width || l,
                f = this._options.height || c;
            if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) {
                if (this.adaptScaleToCurrentViewport) {
                    var d = s.currentViewport;
                    d && (u *= d.width, f *= d.height)
                }
                if ((this.renderTargetSamplingMode === e.Texture.TRILINEAR_SAMPLINGMODE || this.alwaysForcePOT) && (this._options.width || (u = s.needPOTTextures ? e.Tools.GetExponentOfTwo(u, a, this.scaleMode) : u), this._options.height || (f = s.needPOTTextures ? e.Tools.GetExponentOfTwo(f, a, this.scaleMode) : f)), this.width !== u || this.height !== f) {
                    if (this._textures.length > 0) {
                        for (var p = 0; p < this._textures.length; p++) this._engine._releaseTexture(this._textures.data[p]);
                        this._textures.reset()
                    }
                    this.width = u, this.height = f;
                    var _ = {
                            width: this.width,
                            height: this.height
                        },
                        m = {
                            generateMipMaps: !1,
                            generateDepthBuffer: r || 0 === t._postProcesses.indexOf(this),
                            generateStencilBuffer: (r || 0 === t._postProcesses.indexOf(this)) && this._engine.isStencilEnable,
                            samplingMode: this.renderTargetSamplingMode,
                            type: this._textureType
                        };
                    this._textures.push(this._engine.createRenderTargetTexture(_, m)), this._reusable && this._textures.push(this._engine.createRenderTargetTexture(_, m)), this._texelSize.copyFromFloats(1 / this.width, 1 / this.height), this.onSizeChangedObservable.notifyObservers(this)
                }
                this._textures.forEach((function(e) {
                    e.samples !== n.samples && n._engine.updateRenderTargetTextureSampleCount(e, n.samples)
                }))
            }
            var g;
            this._shareOutputWithPostProcess ? g = this._shareOutputWithPostProcess.inputTexture : this._forcedOutputTexture ? (g = this._forcedOutputTexture, this.width = this._forcedOutputTexture.width, this.height = this._forcedOutputTexture.height) : g = this.inputTexture, this.enablePixelPerfectMode ? (this._scaleRatio.copyFromFloats(l / u, c / f), this._engine.bindFramebuffer(g, 0, l, c, !0)) : (this._scaleRatio.copyFromFloats(1, 1), this._engine.bindFramebuffer(g, 0, void 0, void 0, !0)), this.onActivateObservable.notifyObservers(t), this.autoClear && this.alphaMode === e.Engine.ALPHA_DISABLE && this._engine.clear(this.clearColor ? this.clearColor : o.clearColor, !0, !0, !0), this._reusable && (this._currentRenderTextureInd = (this._currentRenderTextureInd + 1) % 2)
        }, Object.defineProperty(t.prototype, "isSupported", {
            get: function() {
                return this._effect.isSupported
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "aspectRatio", {
            get: function() {
                return this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.aspectRatio : this._forcedOutputTexture ? this._forcedOutputTexture.width / this._forcedOutputTexture.height : this.width / this.height
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.isReady = function() {
            return this._effect && this._effect.isReady()
        }, t.prototype.apply = function() {
            if (!this._effect || !this._effect.isReady()) return null;
            this._engine.enableEffect(this._effect), 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);
            var e;
            return e = this._shareOutputWithPostProcess ? this._shareOutputWithPostProcess.inputTexture : this._forcedOutputTexture ? this._forcedOutputTexture : this.inputTexture, this._effect._bindTexture("textureSampler", e), this._effect.setVector2("scale", this._scaleRatio), this.onApplyObservable.notifyObservers(this._effect), this._effect
        }, t.prototype._disposeTextures = function() {
            if (!this._shareOutputWithPostProcess && !this._forcedOutputTexture) {
                if (this._textures.length > 0)
                    for (var e = 0; e < this._textures.length; e++) this._engine._releaseTexture(this._textures.data[e]);
                this._textures.dispose()
            }
        }, t.prototype.dispose = function(e) {
            if (e = e || this._camera, this._disposeTextures(), this._scene) {
                var t = this._scene.postProcesses.indexOf(this); - 1 !== t && this._scene.postProcesses.splice(t, 1)
            } else {
                var i = this._engine.postProcesses.indexOf(this); - 1 !== i && this._engine.postProcesses.splice(i, 1)
            }
            if (e) {
                e.detachPostProcess(this);
                0 === e._postProcesses.indexOf(this) && e._postProcesses.length > 0 && this._camera._postProcesses[0].markTextureDirty(), this.onActivateObservable.clear(), this.onAfterRenderObservable.clear(), this.onApplyObservable.clear(), this.onBeforeRenderObservable.clear(), this.onSizeChangedObservable.clear()
            }
        }, t
    })();
    e.PostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            return void 0 === n && (n = null), void 0 === l && (l = e.Engine.TEXTURETYPE_UNSIGNED_INT), t.call(this, i, "pass", null, null, r, n, o, s, a, void 0, l) || this
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.PassPostProcess = t
})(BABYLON || (BABYLON = {}));
var __assign = this && this.__assign || Object.assign || function(e) {
        for (var t, i = 1, r = arguments.length; i < r; i++) {
            t = arguments[i];
            for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n])
        }
        return e
    },
    BABYLON;
!(function(e) {
    var t = (function() {
        function t(i, r, n) {
            this._bias = 5e-5, this._blurBoxOffset = 1, this._blurScale = 2, this._blurKernel = 1, this._useKernelBlur = !1, this._filter = t.FILTER_NONE, this._darkness = 0, this._transparencyShadow = !1, this.frustumEdgeFalloff = 0, this.forceBackFacesOnly = !1, this._lightDirection = e.Vector3.Zero(), this._viewMatrix = e.Matrix.Zero(), this._projectionMatrix = e.Matrix.Zero(), this._transformMatrix = e.Matrix.Zero(), this._currentFaceIndex = 0, this._currentFaceIndexCache = 0, this._defaultTextureMatrix = e.Matrix.Identity(), this._mapSize = i, this._light = r, this._scene = r.getScene(), r._shadowGenerator = this;
            var o = this._scene.getEngine().getCaps();
            n ? o.textureFloatRender && o.textureFloatLinearFiltering ? this._textureType = e.Engine.TEXTURETYPE_FLOAT : o.textureHalfFloatRender && o.textureHalfFloatLinearFiltering ? this._textureType = e.Engine.TEXTURETYPE_HALF_FLOAT : this._textureType = e.Engine.TEXTURETYPE_UNSIGNED_INT : o.textureHalfFloatRender && o.textureHalfFloatLinearFiltering ? this._textureType = e.Engine.TEXTURETYPE_HALF_FLOAT : o.textureFloatRender && o.textureFloatLinearFiltering ? this._textureType = e.Engine.TEXTURETYPE_FLOAT : this._textureType = e.Engine.TEXTURETYPE_UNSIGNED_INT, this._initializeGenerator()
        }
        return Object.defineProperty(t, "FILTER_NONE", {
            get: function() {
                return t._FILTER_NONE
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "FILTER_POISSONSAMPLING", {
            get: function() {
                return t._FILTER_POISSONSAMPLING
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "FILTER_EXPONENTIALSHADOWMAP", {
            get: function() {
                return t._FILTER_EXPONENTIALSHADOWMAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "FILTER_BLUREXPONENTIALSHADOWMAP", {
            get: function() {
                return t._FILTER_BLUREXPONENTIALSHADOWMAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "FILTER_CLOSEEXPONENTIALSHADOWMAP", {
            get: function() {
                return t._FILTER_CLOSEEXPONENTIALSHADOWMAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t, "FILTER_BLURCLOSEEXPONENTIALSHADOWMAP", {
            get: function() {
                return t._FILTER_BLURCLOSEEXPONENTIALSHADOWMAP
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "bias", {
            get: function() {
                return this._bias
            },
            set: function(e) {
                this._bias = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "blurBoxOffset", {
            get: function() {
                return this._blurBoxOffset
            },
            set: function(e) {
                this._blurBoxOffset !== e && (this._blurBoxOffset = e, this._disposeBlurPostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "blurScale", {
            get: function() {
                return this._blurScale
            },
            set: function(e) {
                this._blurScale !== e && (this._blurScale = e, this._disposeBlurPostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "blurKernel", {
            get: function() {
                return this._blurKernel
            },
            set: function(e) {
                this._blurKernel !== e && (this._blurKernel = e, this._disposeBlurPostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useKernelBlur", {
            get: function() {
                return this._useKernelBlur
            },
            set: function(e) {
                this._useKernelBlur !== e && (this._useKernelBlur = e, this._disposeBlurPostProcesses())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "depthScale", {
            get: function() {
                return void 0 !== this._depthScale ? this._depthScale : this._light.getDepthScale()
            },
            set: function(e) {
                this._depthScale = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "filter", {
            get: function() {
                return this._filter
            },
            set: function(e) {
                if (this._light.needCube()) {
                    if (e === t.FILTER_BLUREXPONENTIALSHADOWMAP) return void(this.useExponentialShadowMap = !0);
                    if (e === t.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP) return void(this.useCloseExponentialShadowMap = !0)
                }
                this._filter !== e && (this._filter = e, this._disposeBlurPostProcesses(), this._applyFilterValues(), this._light._markMeshesAsLightDirty())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "usePoissonSampling", {
            get: function() {
                return this.filter === t.FILTER_POISSONSAMPLING
            },
            set: function(e) {
                (e || this.filter === t.FILTER_POISSONSAMPLING) && (this.filter = e ? t.FILTER_POISSONSAMPLING : t.FILTER_NONE)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useVarianceShadowMap", {
            get: function() {
                return e.Tools.Warn("VSM are now replaced by ESM. Please use useExponentialShadowMap instead."), this.useExponentialShadowMap
            },
            set: function(t) {
                e.Tools.Warn("VSM are now replaced by ESM. Please use useExponentialShadowMap instead."), this.useExponentialShadowMap = t
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useBlurVarianceShadowMap", {
            get: function() {
                return e.Tools.Warn("VSM are now replaced by ESM. Please use useBlurExponentialShadowMap instead."), this.useBlurExponentialShadowMap
            },
            set: function(t) {
                e.Tools.Warn("VSM are now replaced by ESM. Please use useBlurExponentialShadowMap instead."), this.useBlurExponentialShadowMap = t
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useExponentialShadowMap", {
            get: function() {
                return this.filter === t.FILTER_EXPONENTIALSHADOWMAP
            },
            set: function(e) {
                (e || this.filter === t.FILTER_EXPONENTIALSHADOWMAP) && (this.filter = e ? t.FILTER_EXPONENTIALSHADOWMAP : t.FILTER_NONE)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useBlurExponentialShadowMap", {
            get: function() {
                return this.filter === t.FILTER_BLUREXPONENTIALSHADOWMAP
            },
            set: function(e) {
                (e || this.filter === t.FILTER_BLUREXPONENTIALSHADOWMAP) && (this.filter = e ? t.FILTER_BLUREXPONENTIALSHADOWMAP : t.FILTER_NONE)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useCloseExponentialShadowMap", {
            get: function() {
                return this.filter === t.FILTER_CLOSEEXPONENTIALSHADOWMAP
            },
            set: function(e) {
                (e || this.filter === t.FILTER_CLOSEEXPONENTIALSHADOWMAP) && (this.filter = e ? t.FILTER_CLOSEEXPONENTIALSHADOWMAP : t.FILTER_NONE)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "useBlurCloseExponentialShadowMap", {
            get: function() {
                return this.filter === t.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP
            },
            set: function(e) {
                (e || this.filter === t.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP) && (this.filter = e ? t.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP : t.FILTER_NONE)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getDarkness = function() {
            return this._darkness
        }, t.prototype.setDarkness = function(e) {
            return this._darkness = e >= 1 ? 1 : e <= 0 ? 0 : e, this
        }, t.prototype.setTransparencyShadow = function(e) {
            return this._transparencyShadow = e, this
        }, t.prototype.getShadowMap = function() {
            return this._shadowMap
        }, t.prototype.getShadowMapForRendering = function() {
            return this._shadowMap2 ? this._shadowMap2 : this._shadowMap
        }, t.prototype.addShadowCaster = function(e, t) {
            return void 0 === t && (t = !0), this._shadowMap ? (this._shadowMap.renderList || (this._shadowMap.renderList = []), this._shadowMap.renderList.push(e), t && (i = this._shadowMap.renderList).push.apply(i, e.getChildMeshes()), this) : this;
            var i
        }, t.prototype.removeShadowCaster = function(e, t) {
            if (void 0 === t && (t = !0), !this._shadowMap || !this._shadowMap.renderList) return this;
            var i = this._shadowMap.renderList.indexOf(e);
            if (-1 !== i && this._shadowMap.renderList.splice(i, 1), t)
                for (var r = 0, n = e.getChildren(); r < n.length; r++) {
                    var o = n[r];
                    this.removeShadowCaster(o)
                }
            return this
        }, t.prototype.getLight = function() {
            return this._light
        }, t.prototype._initializeGenerator = function() {
            this._light._markMeshesAsLightDirty(), this._initializeShadowMap()
        }, t.prototype._initializeShadowMap = function() {
            var t = this;
            this._shadowMap = new e.RenderTargetTexture(this._light.name + "_shadowMap", this._mapSize, this._scene, !1, !0, this._textureType, this._light.needCube()), this._shadowMap.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._shadowMap.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._shadowMap.anisotropicFilteringLevel = 1, this._shadowMap.updateSamplingMode(e.Texture.BILINEAR_SAMPLINGMODE), this._shadowMap.renderParticles = !1, this._shadowMap.ignoreCameraViewport = !0, this._shadowMap.onBeforeRenderObservable.add((function(e) {
                t._currentFaceIndex = e
            })), this._shadowMap.customRenderFunction = this._renderForShadowMap.bind(this), this._shadowMap.onAfterUnbindObservable.add((function() {
                if (t.useBlurExponentialShadowMap || t.useBlurCloseExponentialShadowMap) {
                    var e = t.getShadowMapForRendering();
                    e && t._scene.postProcessManager.directRender(t._blurPostProcesses, e.getInternalTexture(), !0)
                }
            })), this._shadowMap.onClearObservable.add((function(i) {
                t.useExponentialShadowMap || t.useBlurExponentialShadowMap ? i.clear(new e.Color4(0, 0, 0, 0), !0, !0, !0) : i.clear(new e.Color4(1, 1, 1, 1), !0, !0, !0)
            }))
        }, t.prototype._initializeBlurRTTAndPostProcesses = function() {
            var t = this,
                i = this._scene.getEngine(),
                r = this._mapSize / this.blurScale;
            this.useKernelBlur && 1 === this.blurScale || (this._shadowMap2 = new e.RenderTargetTexture(this._light.name + "_shadowMap2", r, this._scene, !1, !0, this._textureType), this._shadowMap2.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._shadowMap2.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._shadowMap2.updateSamplingMode(e.Texture.BILINEAR_SAMPLINGMODE)), this.useKernelBlur ? (this._kernelBlurXPostprocess = new e.BlurPostProcess(this._light.name + "KernelBlurX", new e.Vector2(1, 0), this.blurKernel, 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._textureType), this._kernelBlurXPostprocess.width = r, this._kernelBlurXPostprocess.height = r, this._kernelBlurXPostprocess.onApplyObservable.add((function(e) {
                e.setTexture("textureSampler", t._shadowMap)
            })), this._kernelBlurYPostprocess = new e.BlurPostProcess(this._light.name + "KernelBlurY", new e.Vector2(0, 1), this.blurKernel, 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._textureType), this._kernelBlurXPostprocess.autoClear = !1, this._kernelBlurYPostprocess.autoClear = !1, this._textureType === e.Engine.TEXTURETYPE_UNSIGNED_INT && (this._kernelBlurXPostprocess.packedFloat = !0, this._kernelBlurYPostprocess.packedFloat = !0), this._blurPostProcesses = [this._kernelBlurXPostprocess, this._kernelBlurYPostprocess]) : (this._boxBlurPostprocess = new e.PostProcess(this._light.name + "DepthBoxBlur", "depthBoxBlur", ["screenSize", "boxOffset"], [], 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, "#define OFFSET " + this._blurBoxOffset, this._textureType), this._boxBlurPostprocess.onApplyObservable.add((function(e) {
                e.setFloat2("screenSize", r, r), e.setTexture("textureSampler", t._shadowMap)
            })), this._boxBlurPostprocess.autoClear = !1, this._blurPostProcesses = [this._boxBlurPostprocess])
        }, t.prototype._renderForShadowMap = function(e, t, i, r) {
            var n, o = this._scene.getEngine();
            if (r.length) {
                for (o.setColorWrite(!1), n = 0; n < r.length; n++) this._renderSubMeshForShadowMap(r.data[n]);
                o.setColorWrite(!0)
            }
            for (n = 0; n < e.length; n++) this._renderSubMeshForShadowMap(e.data[n]);
            for (n = 0; n < t.length; n++) this._renderSubMeshForShadowMap(t.data[n]);
            if (this._transparencyShadow)
                for (n = 0; n < i.length; n++) this._renderSubMeshForShadowMap(i.data[n])
        }, t.prototype._renderSubMeshForShadowMap = function(t) {
            var i = this,
                r = t.getRenderingMesh(),
                n = this._scene,
                o = n.getEngine(),
                s = t.getMaterial();
            if (s) {
                o.setState(s.backFaceCulling);
                var a = r._getInstancesRenderList(t._id);
                if (!a.mustReturn) {
                    var l = o.getCaps().instancedArrays && null !== a.visibleInstances[t._id] && void 0 !== a.visibleInstances[t._id];
                    if (this.isReady(t, l)) {
                        if (o.enableEffect(this._effect), r._bind(t, this._effect, e.Material.TriangleFillMode), this._effect.setFloat2("biasAndScale", this.bias, this.depthScale), this._effect.setMatrix("viewProjection", this.getTransformMatrix()), this._effect.setVector3("lightPosition", this.getLight().position), n.activeCamera && this._effect.setFloat2("depthValues", this.getLight().getDepthMinZ(n.activeCamera), this.getLight().getDepthMinZ(n.activeCamera) + this.getLight().getDepthMaxZ(n.activeCamera)), s && s.needAlphaTesting()) {
                            var c = s.getAlphaTestTexture();
                            c && (this._effect.setTexture("diffuseSampler", c), this._effect.setMatrix("diffuseMatrix", c.getTextureMatrix() || this._defaultTextureMatrix))
                        }
                        r.useBones && r.computeBonesUsingShaders && this._effect.setMatrices("mBones", r.skeleton.getTransformMatrices(r)), this.forceBackFacesOnly && o.setState(!0, 0, !1, !0), r._processRendering(t, this._effect, e.Material.TriangleFillMode, a, l, (function(e, t) {
                            return i._effect.setMatrix("world", t)
                        })), this.forceBackFacesOnly && o.setState(!0, 0, !1, !1)
                    } else this._shadowMap && this._shadowMap.resetRefreshCounter()
                }
            }
        }, t.prototype._applyFilterValues = function() {
            this._shadowMap && (this.filter === t.FILTER_NONE ? this._shadowMap.updateSamplingMode(e.Texture.NEAREST_SAMPLINGMODE) : this._shadowMap.updateSamplingMode(e.Texture.BILINEAR_SAMPLINGMODE))
        }, t.prototype.forceCompilation = function(e, t) {
            var i = this,
                r = __assign({
                    useInstances: !1
                }, t),
                n = this.getShadowMap();
            if (!n) return void(e && e(this));
            var o = n.renderList;
            if (!o) return void(e && e(this));
            for (var s = new Array, a = 0, l = o; a < l.length; a++) {
                var c = l[a];
                s.push.apply(s, c.subMeshes)
            }
            if (0 === s.length) return void(e && e(this));
            var h = 0,
                u = function() {
                    if (i._scene && i._scene.getEngine()) {
                        for (; i.isReady(s[h], r.useInstances);)
                            if (++h >= s.length) return void(e && e(i));
                        setTimeout(u, 16)
                    }
                };
            u()
        }, t.prototype.forceCompilationAsync = function(e) {
            var t = this;
            return new Promise(function(i) {
                t.forceCompilation((function() {
                    i()
                }), e)
            })
        }, t.prototype.isReady = function(t, i) {
            var r = [];
            this._textureType !== e.Engine.TEXTURETYPE_UNSIGNED_INT && r.push("#define FLOAT"), (this.useExponentialShadowMap || this.useBlurExponentialShadowMap) && r.push("#define ESM");
            var n = [e.VertexBuffer.PositionKind],
                o = t.getMesh(),
                s = t.getMaterial();
            if (s && s.needAlphaTesting()) {
                var a = s.getAlphaTestTexture();
                a && (r.push("#define ALPHATEST"), o.isVerticesDataPresent(e.VertexBuffer.UVKind) && (n.push(e.VertexBuffer.UVKind), r.push("#define UV1")), o.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && 1 === a.coordinatesIndex && (n.push(e.VertexBuffer.UV2Kind), r.push("#define UV2")))
            }
            o.useBones && o.computeBonesUsingShaders ? (n.push(e.VertexBuffer.MatricesIndicesKind), n.push(e.VertexBuffer.MatricesWeightsKind), o.numBoneInfluencers > 4 && (n.push(e.VertexBuffer.MatricesIndicesExtraKind), n.push(e.VertexBuffer.MatricesWeightsExtraKind)), r.push("#define NUM_BONE_INFLUENCERS " + o.numBoneInfluencers), r.push("#define BonesPerMesh " + (o.skeleton.bones.length + 1))) : r.push("#define NUM_BONE_INFLUENCERS 0"), i && (r.push("#define INSTANCES"), n.push("world0"), n.push("world1"), n.push("world2"), n.push("world3"));
            var l = r.join("\n");
            return this._cachedDefines !== l && (this._cachedDefines = l, this._effect = this._scene.getEngine().createEffect("shadowMap", n, ["world", "mBones", "viewProjection", "diffuseMatrix", "lightPosition", "depthValues", "biasAndScale"], ["diffuseSampler"], l)), !!this._effect.isReady() && ((this.useBlurExponentialShadowMap || this.useBlurCloseExponentialShadowMap) && (this._blurPostProcesses && this._blurPostProcesses.length || this._initializeBlurRTTAndPostProcesses()), !(this._kernelBlurXPostprocess && !this._kernelBlurXPostprocess.isReady()) && (!(this._kernelBlurYPostprocess && !this._kernelBlurYPostprocess.isReady()) && !(this._boxBlurPostprocess && !this._boxBlurPostprocess.isReady())))
        }, t.prototype.prepareDefines = function(e, t) {
            var i = this._scene,
                r = this._light;
            i.shadowsEnabled && r.shadowEnabled && (e["SHADOW" + t] = !0, this.usePoissonSampling ? e["SHADOWPCF" + t] = !0 : this.useExponentialShadowMap || this.useBlurExponentialShadowMap ? e["SHADOWESM" + t] = !0 : (this.useCloseExponentialShadowMap || this.useBlurCloseExponentialShadowMap) && (e["SHADOWCLOSEESM" + t] = !0), r.needCube() && (e["SHADOWCUBE" + t] = !0))
        }, t.prototype.bindShadowLight = function(e, t) {
            var i = this._light,
                r = this._scene;
            if (r.shadowsEnabled && i.shadowEnabled) {
                var n = r.activeCamera;
                if (n) {
                    var o = this.getShadowMap();
                    o && (i.needCube() || t.setMatrix("lightMatrix" + e, this.getTransformMatrix()), t.setTexture("shadowSampler" + e, this.getShadowMapForRendering()), i._uniformBuffer.updateFloat4("shadowsInfo", this.getDarkness(), this.blurScale / o.getSize().width, this.depthScale, this.frustumEdgeFalloff, e), i._uniformBuffer.updateFloat2("depthValues", this.getLight().getDepthMinZ(n), this.getLight().getDepthMinZ(n) + this.getLight().getDepthMaxZ(n), e))
                }
            }
        }, t.prototype.getTransformMatrix = function() {
            var t = this._scene;
            if (this._currentRenderID === t.getRenderId() && this._currentFaceIndexCache === this._currentFaceIndex) return this._transformMatrix;
            this._currentRenderID = t.getRenderId(), this._currentFaceIndexCache = this._currentFaceIndex;
            var i = this._light.position;
            if (this._light.computeTransformedInformation() && (i = this._light.transformedPosition), e.Vector3.NormalizeToRef(this._light.getShadowDirection(this._currentFaceIndex), this._lightDirection), 1 === Math.abs(e.Vector3.Dot(this._lightDirection, e.Vector3.Up())) && (this._lightDirection.z = 1e-13),
                this._light.needProjectionMatrixCompute() || !this._cachedPosition || !this._cachedDirection || !i.equals(this._cachedPosition) || !this._lightDirection.equals(this._cachedDirection)) {
                this._cachedPosition = i.clone(), this._cachedDirection = this._lightDirection.clone(), e.Matrix.LookAtLHToRef(i, i.add(this._lightDirection), e.Vector3.Up(), this._viewMatrix);
                var r = this.getShadowMap();
                if (r) {
                    var n = r.renderList;
                    n && this._light.setShadowProjectionMatrix(this._projectionMatrix, this._viewMatrix, n)
                }
                this._viewMatrix.multiplyToRef(this._projectionMatrix, this._transformMatrix)
            }
            return this._transformMatrix
        }, t.prototype.recreateShadowMap = function() {
            var e = this._shadowMap;
            if (e) {
                var t = e.renderList;
                this._disposeRTTandPostProcesses(), this._initializeGenerator(), this.filter = this.filter, this._applyFilterValues(), this._shadowMap.renderList = t
            }
        }, t.prototype._disposeBlurPostProcesses = function() {
            this._shadowMap2 && (this._shadowMap2.dispose(), this._shadowMap2 = null), this._boxBlurPostprocess && (this._boxBlurPostprocess.dispose(), this._boxBlurPostprocess = null), this._kernelBlurXPostprocess && (this._kernelBlurXPostprocess.dispose(), this._kernelBlurXPostprocess = null), this._kernelBlurYPostprocess && (this._kernelBlurYPostprocess.dispose(), this._kernelBlurYPostprocess = null), this._blurPostProcesses = []
        }, t.prototype._disposeRTTandPostProcesses = function() {
            this._shadowMap && (this._shadowMap.dispose(), this._shadowMap = null), this._disposeBlurPostProcesses()
        }, t.prototype.dispose = function() {
            this._disposeRTTandPostProcesses(), this._light && (this._light._shadowGenerator = null, this._light._markMeshesAsLightDirty())
        }, t.prototype.serialize = function() {
            var e = {},
                t = this.getShadowMap();
            if (!t) return e;
            if (e.lightId = this._light.id, e.mapSize = t.getRenderSize(), e.useExponentialShadowMap = this.useExponentialShadowMap, e.useBlurExponentialShadowMap = this.useBlurExponentialShadowMap, e.useCloseExponentialShadowMap = this.useBlurExponentialShadowMap, e.useBlurCloseExponentialShadowMap = this.useBlurExponentialShadowMap, e.usePoissonSampling = this.usePoissonSampling, e.forceBackFacesOnly = this.forceBackFacesOnly, e.depthScale = this.depthScale, e.darkness = this.getDarkness(), e.blurBoxOffset = this.blurBoxOffset, e.blurKernel = this.blurKernel, e.blurScale = this.blurScale, e.useKernelBlur = this.useKernelBlur, e.transparencyShadow = this._transparencyShadow, e.renderList = [], t.renderList)
                for (var i = 0; i < t.renderList.length; i++) {
                    var r = t.renderList[i];
                    e.renderList.push(r.id)
                }
            return e
        }, t.Parse = function(e, i) {
            for (var r = i.getLightByID(e.lightId), n = new t(e.mapSize, r), o = n.getShadowMap(), s = 0; s < e.renderList.length; s++) {
                i.getMeshesByID(e.renderList[s]).forEach((function(e) {
                    o && (o.renderList || (o.renderList = []), o.renderList.push(e))
                }))
            }
            return e.usePoissonSampling ? n.usePoissonSampling = !0 : e.useExponentialShadowMap ? n.useExponentialShadowMap = !0 : e.useBlurExponentialShadowMap ? n.useBlurExponentialShadowMap = !0 : e.useCloseExponentialShadowMap ? n.useCloseExponentialShadowMap = !0 : e.useBlurCloseExponentialShadowMap ? n.useBlurCloseExponentialShadowMap = !0 : e.useVarianceShadowMap ? n.useExponentialShadowMap = !0 : e.useBlurVarianceShadowMap && (n.useBlurExponentialShadowMap = !0), e.depthScale && (n.depthScale = e.depthScale), e.blurScale && (n.blurScale = e.blurScale), e.blurBoxOffset && (n.blurBoxOffset = e.blurBoxOffset), e.useKernelBlur && (n.useKernelBlur = e.useKernelBlur), e.blurKernel && (n.blurKernel = e.blurKernel), void 0 !== e.bias && (n.bias = e.bias), e.darkness && n.setDarkness(e.darkness), e.transparencyShadow && n.setTransparencyShadow(!0), n.forceBackFacesOnly = e.forceBackFacesOnly, n
        }, t._FILTER_NONE = 0, t._FILTER_EXPONENTIALSHADOWMAP = 1, t._FILTER_POISSONSAMPLING = 2, t._FILTER_BLUREXPONENTIALSHADOWMAP = 3, t._FILTER_CLOSEEXPONENTIALSHADOWMAP = 4, t._FILTER_BLURCLOSEEXPONENTIALSHADOWMAP = 5, t
    })();
    e.ShadowGenerator = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i) {
            void 0 === t && (t = ""), void 0 === i && (i = "black");
            var r = this;
            this._renderingCanvas = e, this._loadingText = t, this._loadingDivBackgroundColor = i, this._resizeLoadingUI = function() {
                var e = r._renderingCanvas.getBoundingClientRect(),
                    t = window.getComputedStyle(r._renderingCanvas).position;
                r._loadingDiv && (r._loadingDiv.style.position = "fixed" === t ? "fixed" : "absolute", r._loadingDiv.style.left = e.left + "px", r._loadingDiv.style.top = e.top + "px", r._loadingDiv.style.width = e.width + "px", r._loadingDiv.style.height = e.height + "px")
            }
        }
        return e.prototype.displayLoadingUI = function() {
            if (!this._loadingDiv) {
                this._loadingDiv = document.createElement("div"), this._loadingDiv.id = "babylonjsLoadingDiv", this._loadingDiv.style.opacity = "0", this._loadingDiv.style.transition = "opacity 1.5s ease", this._loadingDiv.style.pointerEvents = "none", this._loadingTextDiv = document.createElement("div"), this._loadingTextDiv.style.position = "absolute", this._loadingTextDiv.style.left = "0", this._loadingTextDiv.style.top = "50%", this._loadingTextDiv.style.marginTop = "80px", this._loadingTextDiv.style.width = "100%", this._loadingTextDiv.style.height = "20px", this._loadingTextDiv.style.fontFamily = "Arial", this._loadingTextDiv.style.fontSize = "14px", this._loadingTextDiv.style.color = "white", this._loadingTextDiv.style.textAlign = "center", this._loadingTextDiv.innerHTML = "Loading", this._loadingDiv.appendChild(this._loadingTextDiv), this._loadingTextDiv.innerHTML = this._loadingText;
                var e = document.createElement("style");
                e.type = "text/css";
                e.innerHTML = "@-webkit-keyframes spin1 {                    0% { -webkit-transform: rotate(0deg);}\n                    100% { -webkit-transform: rotate(360deg);}\n                }                @keyframes spin1 {                    0% { transform: rotate(0deg);}\n                    100% { transform: rotate(360deg);}\n                }", document.getElementsByTagName("head")[0].appendChild(e);
                var t = new Image;
                t.src = "data:image/png;base64, ", t.style.position = "absolute", t.style.left = "50%", t.style.top = "50%", t.style.marginLeft = "-60px", t.style.marginTop = "-60px", t.style.animation = "spin1 2s infinite ease-in-out", t.style.webkitAnimation = "spin1 2s infinite ease-in-out", t.style.transformOrigin = "50% 50%", t.style.webkitTransformOrigin = "50% 50%", this._loadingDiv.appendChild(t), this._resizeLoadingUI(), window.addEventListener("resize", this._resizeLoadingUI), this._loadingDiv.style.backgroundColor = this._loadingDivBackgroundColor, document.body.appendChild(this._loadingDiv), this._loadingDiv.style.opacity = "1"
            }
        }, e.prototype.hideLoadingUI = function() {
            var e = this;
            if (this._loadingDiv) {
                var t = function() {
                    e._loadingDiv && (document.body.removeChild(e._loadingDiv), window.removeEventListener("resize", e._resizeLoadingUI), e._loadingDiv = null)
                };
                this._loadingDiv.style.opacity = "0", this._loadingDiv.addEventListener("transitionend", t)
            }
        }, Object.defineProperty(e.prototype, "loadingUIText", {
            set: function(e) {
                this._loadingText = e, this._loadingTextDiv && (this._loadingTextDiv.innerHTML = this._loadingText)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "loadingUIBackgroundColor", {
            get: function() {
                return this._loadingDivBackgroundColor
            },
            set: function(e) {
                this._loadingDivBackgroundColor = e, this._loadingDiv && (this._loadingDiv.style.backgroundColor = this._loadingDivBackgroundColor)
            },
            enumerable: !0,
            configurable: !0
        }), e
    })();
    e.DefaultLoadingScreen = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i) {
            this.lengthComputable = e, this.loaded = t, this.total = i
        }
        return e.FromProgressEvent = function(t) {
            return new e(t.lengthComputable, t.loaded, t.total)
        }, e
    })();
    e.SceneLoaderProgressEvent = t;
    var i = (function() {
        function i() {}
        return Object.defineProperty(i, "NO_LOGGING", {
            get: function() {
                return 0
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "MINIMAL_LOGGING", {
            get: function() {
                return 1
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "SUMMARY_LOGGING", {
            get: function() {
                return 2
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "DETAILED_LOGGING", {
            get: function() {
                return 3
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ForceFullSceneLoadingForIncremental", {
            get: function() {
                return i._ForceFullSceneLoadingForIncremental
            },
            set: function(e) {
                i._ForceFullSceneLoadingForIncremental = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "ShowLoadingScreen", {
            get: function() {
                return i._ShowLoadingScreen
            },
            set: function(e) {
                i._ShowLoadingScreen = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "loggingLevel", {
            get: function() {
                return i._loggingLevel
            },
            set: function(e) {
                i._loggingLevel = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i, "CleanBoneMatrixWeights", {
            get: function() {
                return i._CleanBoneMatrixWeights
            },
            set: function(e) {
                i._CleanBoneMatrixWeights = e
            },
            enumerable: !0,
            configurable: !0
        }), i._getDefaultPlugin = function() {
            return i._registeredPlugins[".babylon"]
        }, i._getPluginForExtension = function(t) {
            var r = i._registeredPlugins[t];
            return r || (e.Tools.Warn("Unable to find a plugin to load " + t + " files. Trying to use .babylon default plugin."), i._getDefaultPlugin())
        }, i._getPluginForDirectLoad = function(e) {
            for (var t in i._registeredPlugins) {
                var r = i._registeredPlugins[t].plugin;
                if (r.canDirectLoad && r.canDirectLoad(e)) return i._registeredPlugins[t]
            }
            return i._getDefaultPlugin()
        }, i._getPluginForFilename = function(e) {
            e.name && (e = e.name);
            var t = e.indexOf("?"); - 1 !== t && (e = e.substring(0, t));
            var r = e.lastIndexOf("."),
                n = e.substring(r, e.length).toLowerCase();
            return i._getPluginForExtension(n)
        }, i._getDirectLoad = function(e) {
            return e.substr && "data:" === e.substr(0, 5) ? e.substr(5) : null
        }, i._loadData = function(r, n, o, s, a, l, c, h) {
            var u, f = i._getDirectLoad(n),
                d = h ? i._getPluginForExtension(h) : f ? i._getPluginForDirectLoad(n) : i._getPluginForFilename(n);
            u = d.plugin.createPlugin ? d.plugin.createPlugin() : d.plugin;
            var p, _ = d.isBinary;
            i.OnPluginActivatedObservable.notifyObservers(u);
            var m = function(e, t) {
                    if (o.isDisposed) return void l("Scene has been disposed");
                    o.database = p, s(u, e, t)
                },
                g = null,
                v = !1,
                y = u.onDisposeObservable;
            y && y.add((function() {
                v = !0, g && (g.abort(), g = null), c()
            }));
            var b = function() {
                if (!v) {
                    var i = r + n;
                    g = e.Tools.LoadFile(i, m, a ? function(e) {
                        a(t.FromProgressEvent(e))
                    } : void 0, p, _, (function(e, t) {
                        l("Failed to load scene." + (t ? "" : " " + t.message), t)
                    }))
                }
            };
            if (f) return m(f), u;
            if (-1 === r.indexOf("file:")) o.getEngine().enableOfflineSupport ? p = new e.Database(r + n, b) : b();
            else {
                var x = n;
                x.name ? g = e.Tools.ReadFile(x, m, a, _) : e.FilesInput.FilesToLoad[n] ? g = e.Tools.ReadFile(e.FilesInput.FilesToLoad[n], m, a, _) : l("Unable to find file named " + n)
            }
            return u
        }, i.GetPluginForExtension = function(e) {
            return i._getPluginForExtension(e).plugin
        }, i.IsPluginForExtensionAvailable = function(e) {
            return !!i._registeredPlugins[e]
        }, i.RegisterPlugin = function(e) {
            if ("string" == typeof e.extensions) {
                var t = e.extensions;
                i._registeredPlugins[t.toLowerCase()] = {
                    plugin: e,
                    isBinary: !1
                }
            } else {
                var r = e.extensions;
                Object.keys(r).forEach((function(t) {
                    i._registeredPlugins[t.toLowerCase()] = {
                        plugin: e,
                        isBinary: r[t].isBinary
                    }
                }))
            }
        }, i.ImportMesh = function(t, r, n, o, s, a, l, c) {
            if (void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null), void 0 === c && (c = null), n.substr && "/" === n.substr(0, 1)) return e.Tools.Error("Wrong sceneFilename parameter"), null;
            var h = {};
            o._addPendingData(h);
            var u = function() {
                    o._removePendingData(h)
                },
                f = function(t, i) {
                    var s = "Unable to import meshes from " + r + n + ": " + t;
                    l ? l(o, s, i) : e.Tools.Error(s), u()
                },
                d = a ? function(e) {
                    try {
                        a(e)
                    } catch (e) {
                        f("Error in onProgress callback", e)
                    }
                } : void 0,
                p = function(e, t, i) {
                    if (o.importedMeshesFiles.push(r + n), s) try {
                        s(e, t, i)
                    } catch (e) {
                        f("Error in onSuccess callback", e)
                    }
                    o._removePendingData(h)
                };
            return i._loadData(r, n, o, (function(i, s, a) {
                if (i.rewriteRootURL && (r = i.rewriteRootURL(r, a)), "" === n && "" === n && (r = e.Tools.GetFolderPath(r, !0)), i.importMesh) {
                    var l = i,
                        c = new Array,
                        h = new Array,
                        u = new Array;
                    if (!l.importMesh(t, o, s, r, c, h, u, f)) return;
                    o.loadingPluginName = i.name, p(c, h, u)
                } else {
                    i.importMeshAsync(t, o, s, r, d).then((function(e) {
                        o.loadingPluginName = i.name, p(e.meshes, e.particleSystems, e.skeletons)
                    })).catch((function(e) {
                        f(e.message, e)
                    }))
                }
            }), d, f, u, c)
        }, i.ImportMeshAsync = function(e, t, r, n, o, s) {
            return void 0 === o && (o = null), void 0 === s && (s = null), new Promise(function(s, a) {
                i.ImportMesh(e, t, r, n, (function(e, t, i) {
                    s({
                        meshes: e,
                        particleSystems: t,
                        skeletons: i
                    })
                }), o, (function(e, t, i) {
                    a(i || new Error(t))
                }))
            })
        }, i.Load = function(t, r, n, o, s, a, l) {
            return void 0 === o && (o = null), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null), i.Append(t, r, new e.Scene(n), o, s, a, l)
        }, i.LoadAsync = function(e, t, r, n, o) {
            return void 0 === n && (n = null), void 0 === o && (o = null), new Promise(function(s, a) {
                i.Load(e, t, r, (function(e) {
                    s(e)
                }), n, (function(e, t, i) {
                    a(i || new Error(t))
                }), o)
            })
        }, i.Append = function(t, r, n, o, s, a, l) {
            if (void 0 === o && (o = null), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null), r.substr && "/" === r.substr(0, 1)) return e.Tools.Error("Wrong sceneFilename parameter"), null;
            i.ShowLoadingScreen && n.getEngine().displayLoadingUI();
            var c = {};
            n._addPendingData(c);
            var h = function() {
                    n._removePendingData(c), n.getEngine().hideLoadingUI()
                },
                u = function(i, o) {
                    var s = "Unable to load from " + t + r + (i ? ": " + i : "");
                    a ? a(n, s, o) : e.Tools.Error(s), h()
                },
                f = s ? function(e) {
                    try {
                        s(e)
                    } catch (e) {
                        u("Error in onProgress callback", e)
                    }
                } : void 0,
                d = function() {
                    if (o) try {
                        o(n)
                    } catch (e) {
                        u("Error in onSuccess callback", e)
                    }
                    n._removePendingData(c)
                };
            return i._loadData(t, r, n, (function(o, s, a) {
                if ("" === r && (t = e.Tools.GetFolderPath(t, !0)), o.load) {
                    if (!o.load(n, s, t, u)) return;
                    n.loadingPluginName = o.name, d()
                } else {
                    o.loadAsync(n, s, t, f).then((function() {
                        n.loadingPluginName = o.name, d()
                    })).catch((function(e) {
                        u(e.message, e)
                    }))
                }
                i.ShowLoadingScreen && n.executeWhenReady((function() {
                    n.getEngine().hideLoadingUI()
                }))
            }), f, u, h, l)
        }, i.AppendAsync = function(e, t, r, n, o) {
            return void 0 === n && (n = null), void 0 === o && (o = null), new Promise(function(s, a) {
                i.Append(e, t, r, (function(e) {
                    s(e)
                }), n, (function(e, t, i) {
                    a(i || new Error(t))
                }), o)
            })
        }, i.LoadAssetContainer = function(t, r, n, o, s, a, l) {
            if (void 0 === o && (o = null), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null), r.substr && "/" === r.substr(0, 1)) return e.Tools.Error("Wrong sceneFilename parameter"), null;
            var c = {};
            n._addPendingData(c);
            var h = function() {
                    n._removePendingData(c)
                },
                u = function(i, o) {
                    var s = "Unable to load assets from " + t + r + (i ? ": " + i : "");
                    a ? a(n, s, o) : e.Tools.Error(s), h()
                },
                f = s ? function(e) {
                    try {
                        s(e)
                    } catch (e) {
                        u("Error in onProgress callback", e)
                    }
                } : void 0,
                d = function(e) {
                    if (o) try {
                        o(e)
                    } catch (e) {
                        u("Error in onSuccess callback", e)
                    }
                    n._removePendingData(c)
                };
            return i._loadData(t, r, n, (function(e, r, o) {
                if (e.loadAssetContainer) {
                    var s = e,
                        a = s.loadAssetContainer(n, r, t, u);
                    if (!a) return;
                    n.loadingPluginName = e.name, d(a)
                } else if (e.loadAssetContainerAsync) {
                    var l = e;
                    l.loadAssetContainerAsync(n, r, t, f).then((function(t) {
                        n.loadingPluginName = e.name, d(t)
                    })).catch((function(e) {
                        u(e.message, e)
                    }))
                } else u("LoadAssetContainer is not supported by this plugin. Plugin did not provide a loadAssetContainer or loadAssetContainerAsync method.");
                i.ShowLoadingScreen && n.executeWhenReady((function() {
                    n.getEngine().hideLoadingUI()
                }))
            }), f, u, h, l)
        }, i.LoadAssetContainerAsync = function(e, t, r, n, o) {
            return void 0 === n && (n = null), void 0 === o && (o = null), new Promise(function(s, a) {
                i.LoadAssetContainer(e, t, r, (function(e) {
                    s(e)
                }), n, (function(e, t, i) {
                    a(i || new Error(t))
                }), o)
            })
        }, i._ForceFullSceneLoadingForIncremental = !1, i._ShowLoadingScreen = !0, i._CleanBoneMatrixWeights = !1, i._loggingLevel = i.NO_LOGGING, i.OnPluginActivatedObservable = new e.Observable, i._registeredPlugins = {}, i
    })();
    e.SceneLoader = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = function(t, i, r, n) {
            for (var o = 0, s = i.materials.length; o < s; o++) {
                var a = i.materials[o];
                if (a.id === t) return e.Material.Parse(a, r, n)
            }
            return null
        },
        i = function(e, t, i) {
            for (var r in t)
                if (e.name === t[r]) return i.push(e.id), !0;
            return !(!e.parentId || -1 === i.indexOf(e.parentId)) && (i.push(e.id), !0)
        },
        r = function(e, t) {
            return e + " of " + (t ? t.file + " from " + t.name + " version: " + t.version + ", exporter version: " + t.exporter_version : "unknown")
        },
        n = function(t, i, n, o, s) {
            void 0 === s && (s = !1);
            var a = new e.AssetContainer(t),
                l = "importScene has failed JSON parse";
            try {
                var c = JSON.parse(i);
                l = "";
                var h, u, f = e.SceneLoader.loggingLevel === e.SceneLoader.DETAILED_LOGGING;
                if (void 0 !== c.lights && null !== c.lights)
                    for (h = 0, u = c.lights.length; h < u; h++) {
                        var d = c.lights[h],
                            p = e.Light.Parse(d, t);
                        p && (a.lights.push(p), l += 0 === h ? "\n\tLights:" : "", l += "\n\t\t" + p.toString(f))
                    }
                if (void 0 !== c.animations && null !== c.animations)
                    for (h = 0, u = c.animations.length; h < u; h++) {
                        var _ = c.animations[h],
                            m = e.Animation.Parse(_);
                        t.animations.push(m), a.animations.push(m), l += 0 === h ? "\n\tAnimations:" : "", l += "\n\t\t" + m.toString(f)
                    }
                if (void 0 !== c.materials && null !== c.materials)
                    for (h = 0, u = c.materials.length; h < u; h++) {
                        var g = c.materials[h],
                            v = e.Material.Parse(g, t, n);
                        a.materials.push(v), l += 0 === h ? "\n\tMaterials:" : "", l += "\n\t\t" + v.toString(f)
                    }
                if (void 0 !== c.multiMaterials && null !== c.multiMaterials)
                    for (h = 0, u = c.multiMaterials.length; h < u; h++) {
                        var y = c.multiMaterials[h],
                            b = e.Material.ParseMultiMaterial(y, t);
                        a.multiMaterials.push(b), l += 0 === h ? "\n\tMultiMaterials:" : "", l += "\n\t\t" + b.toString(f)
                    }
                if (void 0 !== c.morphTargetManagers && null !== c.morphTargetManagers)
                    for (var x = 0, T = c.morphTargetManagers; x < T.length; x++) {
                        var E = T[x];
                        a.morphTargetManagers.push(e.MorphTargetManager.Parse(E, t))
                    }
                if (void 0 !== c.skeletons && null !== c.skeletons)
                    for (h = 0, u = c.skeletons.length; h < u; h++) {
                        var A = c.skeletons[h],
                            P = e.Skeleton.Parse(A, t);
                        a.skeletons.push(P), l += 0 === h ? "\n\tSkeletons:" : "", l += "\n\t\t" + P.toString(f)
                    }
                var M = c.geometries;
                if (void 0 !== M && null !== M) {
                    var S = new Array,
                        C = M.boxes;
                    if (void 0 !== C && null !== C)
                        for (h = 0, u = C.length; h < u; h++) {
                            var R = C[h];
                            S.push(e.BoxGeometry.Parse(R, t))
                        }
                    var O = M.spheres;
                    if (void 0 !== O && null !== O)
                        for (h = 0, u = O.length; h < u; h++) {
                            var I = O[h];
                            S.push(e.SphereGeometry.Parse(I, t))
                        }
                    var D = M.cylinders;
                    if (void 0 !== D && null !== D)
                        for (h = 0, u = D.length; h < u; h++) {
                            var B = D[h];
                            S.push(e.CylinderGeometry.Parse(B, t))
                        }
                    var L = M.toruses;
                    if (void 0 !== L && null !== L)
                        for (h = 0, u = L.length; h < u; h++) {
                            var w = L[h];
                            S.push(e.TorusGeometry.Parse(w, t))
                        }
                    var F = M.grounds;
                    if (void 0 !== F && null !== F)
                        for (h = 0, u = F.length; h < u; h++) {
                            var N = F[h];
                            S.push(e.GroundGeometry.Parse(N, t))
                        }
                    var V = M.planes;
                    if (void 0 !== V && null !== V)
                        for (h = 0, u = V.length; h < u; h++) {
                            var U = V[h];
                            S.push(e.PlaneGeometry.Parse(U, t))
                        }
                    var k = M.torusKnots;
                    if (void 0 !== k && null !== k)
                        for (h = 0, u = k.length; h < u; h++) {
                            var z = k[h];
                            S.push(e.TorusKnotGeometry.Parse(z, t))
                        }
                    var G = M.vertexData;
                    if (void 0 !== G && null !== G)
                        for (h = 0, u = G.length; h < u; h++) {
                            var W = G[h];
                            S.push(e.Geometry.Parse(W, t, n))
                        }
                    S.forEach((function(e) {
                        e && a.geometries.push(e)
                    }))
                }
                if (void 0 !== c.transformNodes && null !== c.transformNodes)
                    for (h = 0, u = c.transformNodes.length; h < u; h++) {
                        var Y = c.transformNodes[h],
                            H = e.TransformNode.Parse(Y, t, n);
                        a.transformNodes.push(H)
                    }
                if (void 0 !== c.meshes && null !== c.meshes)
                    for (h = 0, u = c.meshes.length; h < u; h++) {
                        var j = c.meshes[h],
                            X = e.Mesh.Parse(j, t, n);
                        a.meshes.push(X), l += 0 === h ? "\n\tMeshes:" : "", l += "\n\t\t" + X.toString(f)
                    }
                if (void 0 !== c.cameras && null !== c.cameras)
                    for (h = 0, u = c.cameras.length; h < u; h++) {
                        var K = c.cameras[h],
                            Q = e.Camera.Parse(K, t);
                        a.cameras.push(Q), l += 0 === h ? "\n\tCameras:" : "", l += "\n\t\t" + Q.toString(f)
                    }
                for (h = 0, u = t.cameras.length; h < u; h++) {
                    var Q = t.cameras[h];
                    Q._waitingParentId && (Q.parent = t.getLastEntryByID(Q._waitingParentId), Q._waitingParentId = null)
                }
                for (h = 0, u = t.lights.length; h < u; h++) {
                    var Z = t.lights[h];
                    Z && Z._waitingParentId && (Z.parent = t.getLastEntryByID(Z._waitingParentId), Z._waitingParentId = null)
                }
                var q, J = [];
                if (e.AudioEngine && void 0 !== c.sounds && null !== c.sounds)
                    for (h = 0, u = c.sounds.length; h < u; h++) {
                        var $ = c.sounds[h];
                        e.Engine.audioEngine.canUseWebAudio ? ($.url || ($.url = $.name), J[$.url] ? a.sounds.push(e.Sound.Parse($, t, n, J[$.url])) : (q = e.Sound.Parse($, t, n), J[$.url] = q, a.sounds.push(q))) : a.sounds.push(new e.Sound($.name, null, t))
                    }
                for (J = [], h = 0, u = t.transformNodes.length; h < u; h++) {
                    var ee = t.transformNodes[h];
                    ee._waitingParentId && (ee.parent = t.getLastEntryByID(ee._waitingParentId), ee._waitingParentId = null)
                }
                for (h = 0, u = t.meshes.length; h < u; h++) {
                    var X = t.meshes[h];
                    X._waitingParentId && (X.parent = t.getLastEntryByID(X._waitingParentId), X._waitingParentId = null), X._waitingActions && (e.ActionManager.Parse(X._waitingActions, X, t), X._waitingActions = null)
                }
                for (h = 0, u = t.meshes.length; h < u; h++) {
                    var te = t.meshes[h];
                    te._waitingFreezeWorldMatrix ? (te.freezeWorldMatrix(), te._waitingFreezeWorldMatrix = null) : te.computeWorldMatrix(!0)
                }
                if (void 0 !== c.particleSystems && null !== c.particleSystems)
                    for (h = 0, u = c.particleSystems.length; h < u; h++) {
                        var ie = c.particleSystems[h];
                        if (ie.activeParticleCount) {
                            var re = e.GPUParticleSystem.Parse(ie, t, n);
                            a.particleSystems.push(re)
                        } else {
                            var re = e.ParticleSystem.Parse(ie, t, n);
                            a.particleSystems.push(re)
                        }
                    }
                if (void 0 !== c.lensFlareSystems && null !== c.lensFlareSystems)
                    for (h = 0, u = c.lensFlareSystems.length; h < u; h++) {
                        var ne = c.lensFlareSystems[h],
                            oe = e.LensFlareSystem.Parse(ne, t, n);
                        a.lensFlareSystems.push(oe)
                    }
                if (void 0 !== c.shadowGenerators && null !== c.shadowGenerators)
                    for (h = 0, u = c.shadowGenerators.length; h < u; h++) {
                        var se = c.shadowGenerators[h],
                            ae = e.ShadowGenerator.Parse(se, t);
                        a.shadowGenerators.push(ae)
                    }
                for (h = 0, u = t.lights.length; h < u; h++) {
                    var le = t.lights[h];
                    if (le._excludedMeshesIds.length > 0) {
                        for (var ce = 0; ce < le._excludedMeshesIds.length; ce++) {
                            var he = t.getMeshByID(le._excludedMeshesIds[ce]);
                            he && le.excludedMeshes.push(he)
                        }
                        le._excludedMeshesIds = []
                    }
                    if (le._includedOnlyMeshesIds.length > 0) {
                        for (var ue = 0; ue < le._includedOnlyMeshesIds.length; ue++) {
                            var fe = t.getMeshByID(le._includedOnlyMeshesIds[ue]);
                            fe && le.includedOnlyMeshes.push(fe)
                        }
                        le._includedOnlyMeshesIds = []
                    }
                }
                void 0 !== c.actions && null !== c.actions && e.ActionManager.Parse(c.actions, null, t), s || a.removeAllFromScene()
            } catch (t) {
                var de = r("loadAssts", c ? c.producer : "Unknown") + l;
                if (!o) throw e.Tools.Log(de), t;
                o(de, t)
            } finally {
                null !== l && e.SceneLoader.loggingLevel !== e.SceneLoader.NO_LOGGING && e.Tools.Log(r("loadAssts", c ? c.producer : "Unknown") + (e.SceneLoader.loggingLevel !== e.SceneLoader.MINIMAL_LOGGING ? l : ""))
            }
            return a
        };
    e.SceneLoader.RegisterPlugin({
        name: "babylon.js",
        extensions: ".babylon",
        canDirectLoad: function(e) {
            return -1 !== e.indexOf("babylon")
        },
        importMesh: function(n, o, s, a, l, c, h, u) {
            var f = "importMesh has failed JSON parse";
            try {
                var d = JSON.parse(s);
                f = "";
                var p = e.SceneLoader.loggingLevel === e.SceneLoader.DETAILED_LOGGING;
                n ? Array.isArray(n) || (n = [n]) : n = null;
                var _ = new Array;
                if (void 0 !== d.meshes && null !== d.meshes) {
                    var m, g, v = [],
                        y = [];
                    for (m = 0, g = d.meshes.length; m < g; m++) {
                        var b = d.meshes[m];
                        if (null === n || i(b, n, _)) {
                            if (null !== n && delete n[n.indexOf(b.name)], void 0 !== b.geometryId && null !== b.geometryId && void 0 !== d.geometries && null !== d.geometries) {
                                var x = !1;
                                ["boxes", "spheres", "cylinders", "toruses", "grounds", "planes", "torusKnots", "vertexData"].forEach((function(t) {
                                    !0 !== x && d.geometries[t] && Array.isArray(d.geometries[t]) && d.geometries[t].forEach((function(i) {
                                        if (i.id === b.geometryId) {
                                            switch (t) {
                                                case "boxes":
                                                    e.BoxGeometry.Parse(i, o);
                                                    break;
                                                case "spheres":
                                                    e.SphereGeometry.Parse(i, o);
                                                    break;
                                                case "cylinders":
                                                    e.CylinderGeometry.Parse(i, o);
                                                    break;
                                                case "toruses":
                                                    e.TorusGeometry.Parse(i, o);
                                                    break;
                                                case "grounds":
                                                    e.GroundGeometry.Parse(i, o);
                                                    break;
                                                case "planes":
                                                    e.PlaneGeometry.Parse(i, o);
                                                    break;
                                                case "torusKnots":
                                                    e.TorusKnotGeometry.Parse(i, o);
                                                    break;
                                                case "vertexData":
                                                    e.Geometry.Parse(i, o, a)
                                            }
                                            x = !0
                                        }
                                    }))
                                })), !1 === x && e.Tools.Warn("Geometry not found for mesh " + b.id)
                            }
                            if (b.materialId) {
                                var T = -1 !== y.indexOf(b.materialId);
                                if (!1 === T && void 0 !== d.multiMaterials && null !== d.multiMaterials)
                                    for (var E = 0, A = d.multiMaterials.length; E < A; E++) {
                                        var P = d.multiMaterials[E];
                                        if (P.id === b.materialId) {
                                            for (var M = 0, S = P.materials.length; M < S; M++) {
                                                var C = P.materials[M];
                                                y.push(C);
                                                var R = t(C, d, o, a);
                                                R && (f += "\n\tMaterial " + R.toString(p))
                                            }
                                            y.push(P.id);
                                            var O = e.Material.ParseMultiMaterial(P, o);
                                            O && (T = !0, f += "\n\tMulti-Material " + O.toString(p));
                                            break
                                        }
                                    }
                                if (!1 === T) {
                                    y.push(b.materialId);
                                    var R = t(b.materialId, d, o, a);
                                    R ? f += "\n\tMaterial " + R.toString(p) : e.Tools.Warn("Material not found for mesh " + b.id)
                                }
                            }
                            if (b.skeletonId > -1 && void 0 !== d.skeletons && null !== d.skeletons) {
                                if (!1 === v.indexOf(b.skeletonId) > -1)
                                    for (var I = 0, D = d.skeletons.length; I < D; I++) {
                                        var B = d.skeletons[I];
                                        if (B.id === b.skeletonId) {
                                            var L = e.Skeleton.Parse(B, o);
                                            h.push(L), v.push(B.id), f += "\n\tSkeleton " + L.toString(p)
                                        }
                                    }
                            }
                            var w = e.Mesh.Parse(b, o, a);
                            l.push(w),
                                f += "\n\tMesh " + w.toString(p)
                        }
                    }
                    var F;
                    for (m = 0, g = o.meshes.length; m < g; m++) F = o.meshes[m], F._waitingParentId && (F.parent = o.getLastEntryByID(F._waitingParentId), F._waitingParentId = null);
                    for (m = 0, g = o.meshes.length; m < g; m++) F = o.meshes[m], F._waitingFreezeWorldMatrix ? (F.freezeWorldMatrix(), F._waitingFreezeWorldMatrix = null) : F.computeWorldMatrix(!0)
                }
                if (void 0 !== d.particleSystems && null !== d.particleSystems)
                    for (m = 0, g = d.particleSystems.length; m < g; m++) {
                        var N = d.particleSystems[m]; - 1 !== _.indexOf(N.emitterId) && c.push(e.ParticleSystem.Parse(N, o, a))
                    }
                return !0
            } catch (t) {
                var V = r("importMesh", d ? d.producer : "Unknown") + f;
                if (!u) throw e.Tools.Log(V), t;
                u(V, t)
            } finally {
                null !== f && e.SceneLoader.loggingLevel !== e.SceneLoader.NO_LOGGING && e.Tools.Log(r("importMesh", d ? d.producer : "Unknown") + (e.SceneLoader.loggingLevel !== e.SceneLoader.MINIMAL_LOGGING ? f : ""))
            }
            return !1
        },
        load: function(t, i, o, s) {
            var a = "importScene has failed JSON parse";
            try {
                var l = JSON.parse(i);
                if (a = "", void 0 !== l.useDelayedTextureLoading && null !== l.useDelayedTextureLoading && (t.useDelayedTextureLoading = l.useDelayedTextureLoading && !e.SceneLoader.ForceFullSceneLoadingForIncremental), void 0 !== l.autoClear && null !== l.autoClear && (t.autoClear = l.autoClear), void 0 !== l.clearColor && null !== l.clearColor && (t.clearColor = e.Color4.FromArray(l.clearColor)), void 0 !== l.ambientColor && null !== l.ambientColor && (t.ambientColor = e.Color3.FromArray(l.ambientColor)), void 0 !== l.gravity && null !== l.gravity && (t.gravity = e.Vector3.FromArray(l.gravity)), l.fogMode && 0 !== l.fogMode) switch (t.fogMode = l.fogMode, t.fogColor = e.Color3.FromArray(l.fogColor), t.fogStart = l.fogStart, t.fogEnd = l.fogEnd, t.fogDensity = l.fogDensity, a += "\tFog mode for scene:  ", t.fogMode) {
                    case 1:
                        a += "exp\n";
                        break;
                    case 2:
                        a += "exp2\n";
                        break;
                    case 3:
                        a += "linear\n"
                }
                if (l.physicsEnabled) {
                    var c;
                    "cannon" === l.physicsEngine ? c = new e.CannonJSPlugin : "oimo" === l.physicsEngine && (c = new e.OimoJSPlugin), a = "\tPhysics engine " + (l.physicsEngine ? l.physicsEngine : "oimo") + " enabled\n";
                    var h = l.physicsGravity ? e.Vector3.FromArray(l.physicsGravity) : null;
                    t.enablePhysics(h, c)
                }
                void 0 !== l.metadata && null !== l.metadata && (t.metadata = l.metadata), void 0 !== l.collisionsEnabled && null !== l.collisionsEnabled && (t.collisionsEnabled = l.collisionsEnabled), t.workerCollisions = !!l.workerCollisions;
                if (!n(t, i, o, s, !0)) return !1;
                if (l.autoAnimate && t.beginAnimation(t, l.autoAnimateFrom, l.autoAnimateTo, l.autoAnimateLoop, l.autoAnimateSpeed || 1), void 0 !== l.activeCameraID && null !== l.activeCameraID && t.setActiveCameraByID(l.activeCameraID), void 0 !== l.environmentTexture && null !== l.environmentTexture && (t.environmentTexture = e.CubeTexture.CreateFromPrefilteredData(o + l.environmentTexture, t), !0 === l.createDefaultSkybox)) {
                    var u = void 0 !== t.activeCamera && null !== t.activeCamera ? (t.activeCamera.maxZ - t.activeCamera.minZ) / 2 : 1e3,
                        f = l.skyboxBlurLevel || 0;
                    t.createDefaultSkybox(void 0, !0, u, f)
                }
                return !0
            } catch (t) {
                var d = r("importScene", l ? l.producer : "Unknown") + a;
                if (!s) throw e.Tools.Log(d), t;
                s(d, t)
            } finally {
                null !== a && e.SceneLoader.loggingLevel !== e.SceneLoader.NO_LOGGING && e.Tools.Log(r("importScene", l ? l.producer : "Unknown") + (e.SceneLoader.loggingLevel !== e.SceneLoader.MINIMAL_LOGGING ? a : ""))
            }
            return !1
        },
        loadAssetContainer: function(e, t, i, r) {
            return n(e, t, i, r)
        }
    })
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i, r, n, o, s, a, l) {
            this.onProcessFileCallback = function() {
                return !0
            }, this._engine = e, this._currentScene = t, this._sceneLoadedCallback = i, this._progressCallback = r, this._additionalRenderLoopLogicCallback = n, this._textureLoadingCallback = o, this._startingProcessingFilesCallback = s, this._onReloadCallback = a, this._errorCallback = l
        }
        return t.prototype.monitorElementForDragNDrop = function(e) {
            var t = this;
            e && (this._elementToMonitor = e, this._dragEnterHandler = function(e) {
                t.drag(e)
            }, this._dragOverHandler = function(e) {
                t.drag(e)
            }, this._dropHandler = function(e) {
                t.drop(e)
            }, this._elementToMonitor.addEventListener("dragenter", this._dragEnterHandler, !1), this._elementToMonitor.addEventListener("dragover", this._dragOverHandler, !1), this._elementToMonitor.addEventListener("drop", this._dropHandler, !1))
        }, t.prototype.dispose = function() {
            this._elementToMonitor && (this._elementToMonitor.removeEventListener("dragenter", this._dragEnterHandler), this._elementToMonitor.removeEventListener("dragover", this._dragOverHandler), this._elementToMonitor.removeEventListener("drop", this._dropHandler))
        }, t.prototype.renderFunction = function() {
            if (this._additionalRenderLoopLogicCallback && this._additionalRenderLoopLogicCallback(), this._currentScene) {
                if (this._textureLoadingCallback) {
                    var e = this._currentScene.getWaitingItemsCount();
                    e > 0 && this._textureLoadingCallback(e)
                }
                this._currentScene.render()
            }
        }, t.prototype.drag = function(e) {
            e.stopPropagation(), e.preventDefault()
        }, t.prototype.drop = function(e) {
            e.stopPropagation(), e.preventDefault(), this.loadFiles(e)
        }, t.prototype._traverseFolder = function(e, t, i, r) {
            var n = this,
                o = e.createReader(),
                s = e.fullPath.replace(/^\//, "").replace(/(.+?)\/?$/, "$1/");
            o.readEntries((function(e) {
                i.count += e.length;
                for (var o = 0, a = e; o < a.length; o++) {
                    var l = a[o];
                    l.isFile ? l.file((function(e) {
                        e.correctName = s + e.name, t.push(e), 0 == --i.count && r()
                    })) : l.isDirectory && n._traverseFolder(l, t, i, r)
                }--i.count && r()
            }))
        }, t.prototype._processFiles = function(e) {
            for (var i = 0; i < e.length; i++) {
                var r = e[i].correctName.toLowerCase(),
                    n = r.split(".").pop();
                this.onProcessFileCallback(e[i], r, n) && ("babylon" !== n && "stl" !== n && "obj" !== n && "gltf" !== n && "glb" !== n || -1 !== r.indexOf(".binary.babylon") || -1 !== r.indexOf(".incremental.babylon") ? t.FilesToLoad[r] = e[i] : this._sceneFileToLoad = e[i])
            }
        }, t.prototype.loadFiles = function(e) {
            var t = this;
            if (this._startingProcessingFilesCallback && this._startingProcessingFilesCallback(), e && e.dataTransfer && e.dataTransfer.files && (this._filesToLoad = e.dataTransfer.files), e && e.target && e.target.files && (this._filesToLoad = e.target.files), this._filesToLoad && this._filesToLoad.length > 0) {
                for (var i = new Array, r = [], n = e.dataTransfer ? e.dataTransfer.items : null, o = 0; o < this._filesToLoad.length; o++) {
                    var s = this._filesToLoad[o],
                        a = s.name.toLowerCase(),
                        l = void 0;
                    if (s.correctName = a, n) {
                        var c = n[o];
                        c.getAsEntry ? l = c.getAsEntry() : c.webkitGetAsEntry && (l = c.webkitGetAsEntry())
                    }
                    l && l.isDirectory ? r.push(l) : i.push(s)
                }
                if (0 === r.length) this._processFiles(i), this._processReload();
                else
                    for (var h = {
                            count: r.length
                        }, u = 0, f = r; u < f.length; u++) {
                        var d = f[u];
                        this._traverseFolder(d, i, h, (function() {
                            t._processFiles(i), 0 === h.count && t._processReload()
                        }))
                    }
            }
        }, t.prototype._processReload = function() {
            this._onReloadCallback ? this._onReloadCallback(this._sceneFileToLoad) : this.reload()
        }, t.prototype.reload = function() {
            var t = this;
            this._sceneFileToLoad ? (this._currentScene && (e.Tools.errorsCount > 0 && e.Tools.ClearLogCache(), this._engine.stopRenderLoop(), this._currentScene.dispose()), e.SceneLoader.LoadAsync("file:", this._sceneFileToLoad, this._engine, (function(e) {
                t._progressCallback && t._progressCallback(e)
            })).then((function(e) {
                t._currentScene = e, t._sceneLoadedCallback && t._sceneLoadedCallback(t._sceneFileToLoad, t._currentScene), t._currentScene.executeWhenReady((function() {
                    t._engine.runRenderLoop((function() {
                        t.renderFunction()
                    }))
                }))
            })).catch((function(e) {
                t._errorCallback && t._errorCallback(t._sceneFileToLoad, t._currentScene, e.message)
            }))) : e.Tools.Error("Please provide a valid .babylon file.")
        }, t.FilesToLoad = {}, t
    })();
    e.FilesInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._count = 0, this._data = {}
        }
        return e.prototype.copyFrom = function(e) {
            var t = this;
            this.clear(), e.forEach((function(e, i) {
                return t.add(e, i)
            }))
        }, e.prototype.get = function(e) {
            var t = this._data[e];
            if (void 0 !== t) return t
        }, e.prototype.getOrAddWithFactory = function(e, t) {
            var i = this.get(e);
            return void 0 !== i ? i : (i = t(e), i && this.add(e, i), i)
        }, e.prototype.getOrAdd = function(e, t) {
            var i = this.get(e);
            return void 0 !== i ? i : (this.add(e, t), t)
        }, e.prototype.contains = function(e) {
            return void 0 !== this._data[e]
        }, e.prototype.add = function(e, t) {
            return void 0 === this._data[e] && (this._data[e] = t, ++this._count, !0)
        }, e.prototype.set = function(e, t) {
            return void 0 !== this._data[e] && (this._data[e] = t, !0)
        }, e.prototype.getAndRemove = function(e) {
            var t = this.get(e);
            return void 0 !== t ? (delete this._data[e], --this._count, t) : null
        }, e.prototype.remove = function(e) {
            return !!this.contains(e) && (delete this._data[e], --this._count, !0)
        }, e.prototype.clear = function() {
            this._data = {}, this._count = 0
        }, Object.defineProperty(e.prototype, "count", {
            get: function() {
                return this._count
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.forEach = function(e) {
            for (var t in this._data) {
                e(t, this._data[t])
            }
        }, e.prototype.first = function(e) {
            for (var t in this._data) {
                var i = this._data[t],
                    r = e(t, i);
                if (r) return r
            }
            return null
        }, e
    })();
    e.StringDictionary = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.EnableFor = function(e) {
            e._tags = e._tags || {}, e.hasTags = function() {
                return t.HasTags(e)
            }, e.addTags = function(i) {
                return t.AddTagsTo(e, i)
            }, e.removeTags = function(i) {
                return t.RemoveTagsFrom(e, i)
            }, e.matchesTagsQuery = function(i) {
                return t.MatchesQuery(e, i)
            }
        }, t.DisableFor = function(e) {
            delete e._tags, delete e.hasTags, delete e.addTags, delete e.removeTags, delete e.matchesTagsQuery
        }, t.HasTags = function(t) {
            return !!t._tags && !e.Tools.IsEmpty(t._tags)
        }, t.GetTags = function(e, t) {
            if (void 0 === t && (t = !0), !e._tags) return null;
            if (t) {
                var i = [];
                for (var r in e._tags) e._tags.hasOwnProperty(r) && !0 === e._tags[r] && i.push(r);
                return i.join(" ")
            }
            return e._tags
        }, t.AddTagsTo = function(e, i) {
            if (i && "string" == typeof i) {
                i.split(" ").forEach((function(i, r, n) {
                    t._AddTagTo(e, i)
                }))
            }
        }, t._AddTagTo = function(e, i) {
            "" !== (i = i.trim()) && "true" !== i && "false" !== i && (i.match(/[\s]/) || i.match(/^([!]|([|]|[&]){2})/) || (t.EnableFor(e), e._tags[i] = !0))
        }, t.RemoveTagsFrom = function(e, i) {
            if (t.HasTags(e)) {
                var r = i.split(" ");
                for (var n in r) t._RemoveTagFrom(e, r[n])
            }
        }, t._RemoveTagFrom = function(e, t) {
            delete e._tags[t]
        }, t.MatchesQuery = function(i, r) {
            return void 0 === r || ("" === r ? t.HasTags(i) : e.AndOrNotEvaluator.Eval(r, (function(e) {
                return t.HasTags(i) && i._tags[e]
            })))
        }, t
    })();
    e.Tags = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {}
        return e.Eval = function(t, i) {
            return "true" === (t = t.match(/\([^\(\)]*\)/g) ? t.replace(/\([^\(\)]*\)/g, (function(t) {
                return t = t.slice(1, t.length - 1), e._HandleParenthesisContent(t, i)
            })) : e._HandleParenthesisContent(t, i)) || "false" !== t && e.Eval(t, i)
        }, e._HandleParenthesisContent = function(t, i) {
            i = i || function(e) {
                return "true" === e
            };
            var r, n = t.split("||");
            for (var o in n)
                if (n.hasOwnProperty(o)) {
                    var s = e._SimplifyNegation(n[o].trim()),
                        a = s.split("&&");
                    if (a.length > 1)
                        for (var l = 0; l < a.length; ++l) {
                            var c = e._SimplifyNegation(a[l].trim());
                            if (!(r = "true" !== c && "false" !== c ? "!" === c[0] ? !i(c.substring(1)) : i(c) : "true" === c)) {
                                s = "false";
                                break
                            }
                        }
                    if (r || "true" === s) {
                        r = !0;
                        break
                    }
                    r = "true" !== s && "false" !== s ? "!" === s[0] ? !i(s.substring(1)) : i(s) : "true" === s
                }
            return r ? "true" : "false"
        }, e._SimplifyNegation = function(e) {
            return e = e.replace(/^[\s!]+/, (function(e) {
                return e = e.replace(/[\s]/g, (function() {
                    return ""
                })), e.length % 2 ? "!" : ""
            })), e = e.trim(), "!true" === e ? e = "false" : "!false" === e && (e = "true"), e
        }, e
    })();
    e.AndOrNotEvaluator = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, i) {
            this.idbFactory = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB, this.callbackManifestChecked = i, this.currentSceneUrl = t.ReturnFullUrlLocation(e), this.db = null, this._enableSceneOffline = !1, this._enableTexturesOffline = !1, this.manifestVersionFound = 0, this.mustUpdateRessources = !1, this.hasReachedQuota = !1, t.IDBStorageEnabled ? this.checkManifestFile() : this.callbackManifestChecked(!0)
        }
        return Object.defineProperty(t.prototype, "enableSceneOffline", {
            get: function() {
                return this._enableSceneOffline
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "enableTexturesOffline", {
            get: function() {
                return this._enableTexturesOffline
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.checkManifestFile = function() {
            var t = this,
                i = function() {
                    t._enableSceneOffline = !1, t._enableTexturesOffline = !1, t.callbackManifestChecked(!1)
                },
                r = !1,
                n = this.currentSceneUrl + ".manifest",
                o = new XMLHttpRequest;
            navigator.onLine && (r = !0, n = n + (null == n.match(/\?/) ? "?" : "&") + (new Date).getTime()), o.open("GET", n, !0), o.addEventListener("load", (function() {
                if (200 === o.status || e.Tools.ValidateXHRData(o, 1)) try {
                    var r = JSON.parse(o.response);
                    t._enableSceneOffline = r.enableSceneOffline, t._enableTexturesOffline = r.enableTexturesOffline, r.version && !isNaN(parseInt(r.version)) && (t.manifestVersionFound = r.version), t.callbackManifestChecked && t.callbackManifestChecked(!0)
                } catch (e) {
                    i()
                } else i()
            }), !1), o.addEventListener("error", (function(e) {
                if (r) {
                    r = !1;
                    var n = t.currentSceneUrl + ".manifest";
                    o.open("GET", n, !0), o.send()
                } else i()
            }), !1);
            try {
                o.send()
            } catch (t) {
                e.Tools.Error("Error on XHR send request."), this.callbackManifestChecked(!1)
            }
        }, t.prototype.openAsync = function(t, i) {
            var r = this,
                n = function() {
                    r.isSupported = !1, i && i()
                };
            if (this.idbFactory && (this._enableSceneOffline || this._enableTexturesOffline))
                if (this.db) t && t();
                else {
                    this.hasReachedQuota = !1, this.isSupported = !0;
                    var o = this.idbFactory.open("babylonjs", 1);
                    o.onerror = function(e) {
                        n()
                    }, o.onblocked = function(t) {
                        e.Tools.Error("IDB request blocked. Please reload the page."), n()
                    }, o.onsuccess = function(e) {
                        r.db = o.result, t()
                    }, o.onupgradeneeded = function(t) {
                        if (r.db = t.target.result, r.db) try {
                            r.db.createObjectStore("scenes", {
                                keyPath: "sceneUrl"
                            }), r.db.createObjectStore("versions", {
                                keyPath: "sceneUrl"
                            }), r.db.createObjectStore("textures", {
                                keyPath: "textureUrl"
                            })
                        } catch (t) {
                            e.Tools.Error("Error while creating object stores. Exception: " + t.message), n()
                        }
                    }
                }
            else this.isSupported = !1, i && i()
        }, t.prototype.loadImageFromDB = function(e, i) {
            var r = this,
                n = t.ReturnFullUrlLocation(e),
                o = function() {
                    r.hasReachedQuota || null === r.db ? i.src = e : r._saveImageIntoDBAsync(n, i)
                };
            this.mustUpdateRessources ? o() : this._loadImageFromDBAsync(n, i, o)
        }, t.prototype._loadImageFromDBAsync = function(t, i, r) {
            if (this.isSupported && null !== this.db) {
                var n, o = this.db.transaction(["textures"]);
                o.onabort = function(e) {
                    i.src = t
                }, o.oncomplete = function(o) {
                    var s;
                    if (n) {
                        var a = window.URL || window.webkitURL;
                        s = a.createObjectURL(n.data, {
                            oneTimeOnly: !0
                        }), i.onerror = function() {
                            e.Tools.Error("Error loading image from blob URL: " + s + " switching back to web url: " + t), i.src = t
                        }, i.src = s
                    } else r()
                };
                var s = o.objectStore("textures").get(t);
                s.onsuccess = function(e) {
                    n = e.target.result
                }, s.onerror = function(r) {
                    e.Tools.Error("Error loading texture " + t + " from DB."), i.src = t
                }
            } else e.Tools.Error("Error: IndexedDB not supported by your browser or BabylonJS Database is not open."), i.src = t
        }, t.prototype._saveImageIntoDBAsync = function(i, r) {
            var n = this;
            if (this.isSupported) {
                var o = function() {
                    var e;
                    if (s) {
                        var t = window.URL || window.webkitURL;
                        try {
                            e = t.createObjectURL(s, {
                                oneTimeOnly: !0
                            })
                        } catch (i) {
                            e = t.createObjectURL(s)
                        }
                    }
                    e && (r.src = e)
                };
                if (t.IsUASupportingBlobStorage) {
                    var s, a = new XMLHttpRequest;
                    a.open("GET", i, !0), a.responseType = "blob", a.addEventListener("load", (function() {
                        if (200 === a.status && n.db) {
                            s = a.response;
                            var e = n.db.transaction(["textures"], "readwrite");
                            e.onabort = function(e) {
                                try {
                                    var t = e.srcElement || e.target,
                                        i = t.error;
                                    i && "QuotaExceededError" === i.name && (n.hasReachedQuota = !0)
                                } catch (e) {}
                                o()
                            }, e.oncomplete = function(e) {
                                o()
                            };
                            var l = {
                                textureUrl: i,
                                data: s
                            };
                            try {
                                var c = e.objectStore("textures").put(l);
                                c.onsuccess = function(e) {}, c.onerror = function(e) {
                                    o()
                                }
                            } catch (e) {
                                25 === e.code && (t.IsUASupportingBlobStorage = !1), r.src = i
                            }
                        } else r.src = i
                    }), !1), a.addEventListener("error", (function(t) {
                        e.Tools.Error("Error in XHR request in BABYLON.Database."), r.src = i
                    }), !1), a.send()
                } else r.src = i
            } else e.Tools.Error("Error: IndexedDB not supported by your browser or BabylonJS Database is not open."), r.src = i
        }, t.prototype._checkVersionFromDB = function(e, t) {
            var i = this,
                r = function() {
                    i._saveVersionIntoDBAsync(e, t)
                };
            this._loadVersionFromDBAsync(e, t, r)
        }, t.prototype._loadVersionFromDBAsync = function(t, i, r) {
            var n = this;
            if (this.isSupported && this.db) {
                var o;
                try {
                    var s = this.db.transaction(["versions"]);
                    s.oncomplete = function(e) {
                        o ? n.manifestVersionFound > o.data ? (n.mustUpdateRessources = !0, r()) : i(o.data) : (n.mustUpdateRessources = !0, r())
                    }, s.onabort = function(e) {
                        i(-1)
                    };
                    var a = s.objectStore("versions").get(t);
                    a.onsuccess = function(e) {
                        o = e.target.result
                    }, a.onerror = function(r) {
                        e.Tools.Error("Error loading version for scene " + t + " from DB."), i(-1)
                    }
                } catch (t) {
                    e.Tools.Error("Error while accessing 'versions' object store (READ OP). Exception: " + t.message), i(-1)
                }
            } else e.Tools.Error("Error: IndexedDB not supported by your browser or BabylonJS Database is not open."), i(-1)
        }, t.prototype._saveVersionIntoDBAsync = function(t, i) {
            var r = this;
            if (this.isSupported && !this.hasReachedQuota && this.db) try {
                var n = this.db.transaction(["versions"], "readwrite");
                n.onabort = function(e) {
                    try {
                        var t = e.srcElement.error;
                        t && "QuotaExceededError" === t.name && (r.hasReachedQuota = !0)
                    } catch (e) {}
                    i(-1)
                }, n.oncomplete = function(e) {
                    i(r.manifestVersionFound)
                };
                var o = {
                        sceneUrl: t,
                        data: this.manifestVersionFound
                    },
                    s = n.objectStore("versions").put(o);
                s.onsuccess = function(e) {}, s.onerror = function(t) {
                    e.Tools.Error("Error in DB add version request in BABYLON.Database.")
                }
            } catch (t) {
                e.Tools.Error("Error while accessing 'versions' object store (WRITE OP). Exception: " + t.message), i(-1)
            } else i(-1)
        }, t.prototype.loadFileFromDB = function(e, i, r, n, o) {
            var s = this,
                a = t.ReturnFullUrlLocation(e),
                l = function() {
                    s._saveFileIntoDBAsync(a, i, r)
                };
            this._checkVersionFromDB(a, (function(e) {
                -1 !== e ? s.mustUpdateRessources ? s._saveFileIntoDBAsync(a, i, r, o) : s._loadFileFromDBAsync(a, i, l, o) : n && n()
            }))
        }, t.prototype._loadFileFromDBAsync = function(t, i, r, n) {
            if (this.isSupported && this.db) {
                var o;
                o = -1 !== t.indexOf(".babylon") ? "scenes" : "textures";
                var s, a = this.db.transaction([o]);
                a.oncomplete = function(e) {
                    s ? i(s.data) : r()
                }, a.onabort = function(e) {
                    r()
                };
                var l = a.objectStore(o).get(t);
                l.onsuccess = function(e) {
                    s = e.target.result
                }, l.onerror = function(i) {
                    e.Tools.Error("Error loading file " + t + " from DB."), r()
                }
            } else e.Tools.Error("Error: IndexedDB not supported by your browser or BabylonJS Database is not open."), i()
        }, t.prototype._saveFileIntoDBAsync = function(t, i, r, n) {
            var o = this;
            if (this.isSupported) {
                var s;
                s = -1 !== t.indexOf(".babylon") ? "scenes" : "textures";
                var a, l = new XMLHttpRequest;
                l.open("GET", t, !0), n && (l.responseType = "arraybuffer"), r && (l.onprogress = r), l.addEventListener("load", (function() {
                    if (200 === l.status || e.Tools.ValidateXHRData(l, n ? 6 : 1))
                        if (a = n ? l.response : l.responseText, !o.hasReachedQuota && o.db) {
                            var r = o.db.transaction([s], "readwrite");
                            r.onabort = function(e) {
                                try {
                                    var t = e.srcElement.error;
                                    t && "QuotaExceededError" === t.name && (o.hasReachedQuota = !0)
                                } catch (e) {}
                                i(a)
                            }, r.oncomplete = function(e) {
                                i(a)
                            };
                            var c;
                            c = "scenes" === s ? {
                                sceneUrl: t,
                                data: a,
                                version: o.manifestVersionFound
                            } : {
                                textureUrl: t,
                                data: a
                            };
                            try {
                                var h = r.objectStore(s).put(c);
                                h.onsuccess = function(e) {}, h.onerror = function(t) {
                                    e.Tools.Error("Error in DB add file request in BABYLON.Database.")
                                }
                            } catch (e) {
                                i(a)
                            }
                        } else i(a);
                    else i()
                }), !1), l.addEventListener("error", (function(t) {
                    e.Tools.Error("error on XHR request."), i()
                }), !1), l.send()
            } else e.Tools.Error("Error: IndexedDB not supported by your browser or BabylonJS Database is not open."), i()
        }, t.IsUASupportingBlobStorage = !0, t.IDBStorageEnabled = !0, t.parseURL = function(e) {
            document.createElement("a").href = e;
            var t = e.substring(0, e.lastIndexOf("#")),
                i = e.substring(t.lastIndexOf("/") + 1, e.length);
            return e.substring(0, e.indexOf(i, 0))
        }, t.ReturnFullUrlLocation = function(e) {
            return -1 === e.indexOf("http:/") && -1 === e.indexOf("https:/") ? t.parseURL(window.location.href) + e : e
        }, t
    })();
    e.Database = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._isEnabled = !0, this.leftColor = e.Color3.White(), this.rightColor = e.Color3.Black(), this.bias = 0, this.power = 1
        }
        return Object.defineProperty(t.prototype, "isEnabled", {
            get: function() {
                return this._isEnabled
            },
            set: function(t) {
                this._isEnabled !== t && (this._isEnabled = t, e.Engine.MarkAllMaterialsAsDirty(e.Material.FresnelDirtyFlag | e.Material.MiscDirtyFlag))
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.clone = function() {
            var i = new t;
            return e.Tools.DeepCopy(this, i), i
        }, t.prototype.serialize = function() {
            var e = {};
            return e.isEnabled = this.isEnabled, e.leftColor = this.leftColor, e.rightColor = this.rightColor, e.bias = this.bias, e.power = this.power, e
        }, t.Parse = function(i) {
            var r = new t;
            return r.isEnabled = i.isEnabled, r.leftColor = e.Color3.FromArray(i.leftColor), r.rightColor = e.Color3.FromArray(i.rightColor), r.bias = i.bias, r.power = i.power || 1, r
        }, t
    })();
    e.FresnelParameters = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i) {
            var r = t.call(this, e, i, !0) || this;
            return i.multiMaterials.push(r), r.subMaterials = new Array, r.storeEffectOnSubMeshes = !0, r
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "subMaterials", {
            get: function() {
                return this._subMaterials
            },
            set: function(e) {
                this._subMaterials = e, this._hookArray(e)
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._hookArray = function(e) {
            var t = this,
                i = e.push;
            e.push = function() {
                for (var r = [], n = 0; n < arguments.length; n++) r[n] = arguments[n];
                var o = i.apply(e, r);
                return t._markAllSubMeshesAsTexturesDirty(), o
            };
            var r = e.splice;
            e.splice = function(i, n) {
                var o = r.apply(e, [i, n]);
                return t._markAllSubMeshesAsTexturesDirty(), o
            }
        }, i.prototype.getSubMaterial = function(e) {
            return e < 0 || e >= this.subMaterials.length ? this.getScene().defaultMaterial : this.subMaterials[e]
        }, i.prototype.getActiveTextures = function() {
            return (e = t.prototype.getActiveTextures.call(this)).concat.apply(e, this.subMaterials.map((function(e) {
                return e ? e.getActiveTextures() : []
            })));
            var e
        }, i.prototype.getClassName = function() {
            return "MultiMaterial"
        }, i.prototype.isReadyForSubMesh = function(e, t, i) {
            for (var r = 0; r < this.subMaterials.length; r++) {
                var n = this.subMaterials[r];
                if (n) {
                    if (n.storeEffectOnSubMeshes) {
                        if (!n.isReadyForSubMesh(e, t, i)) return !1;
                        continue
                    }
                    if (!n.isReady(e)) return !1
                }
            }
            return !0
        }, i.prototype.clone = function(e, t) {
            for (var r = new i(e, this.getScene()), n = 0; n < this.subMaterials.length; n++) {
                var o = null,
                    s = this.subMaterials[n];
                o = t && s ? s.clone(e + "-" + s.name) : this.subMaterials[n], r.subMaterials.push(o)
            }
            return r
        }, i.prototype.serialize = function() {
            var t = {};
            t.name = this.name, t.id = this.id, e.Tags && (t.tags = e.Tags.GetTags(this)), t.materials = [];
            for (var i = 0; i < this.subMaterials.length; i++) {
                var r = this.subMaterials[i];
                r ? t.materials.push(r.id) : t.materials.push(null)
            }
            return t
        }, i.prototype.dispose = function(e, i) {
            var r = this.getScene();
            if (r) {
                var n = r.multiMaterials.indexOf(this);
                n >= 0 && r.multiMaterials.splice(n, 1), t.prototype.dispose.call(this, e, i)
            }
        }, i
    })(e.Material);
    e.MultiMaterial = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._offsetX = null, this._offsetY = null, this._pointerPressed = new Array, this.touchAngularSensibility = 2e5, this.touchMoveSensibility = 250
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this,
                n = null;
            void 0 === this._pointerInput && (this._onLostFocus = function(e) {
                r._offsetX = null, r._offsetY = null
            }, this._pointerInput = function(t, o) {
                var s = t.event;
                if ("mouse" !== s.pointerType)
                    if (t.type === e.PointerEventTypes.POINTERDOWN) {
                        if (i || s.preventDefault(), r._pointerPressed.push(s.pointerId), 1 !== r._pointerPressed.length) return;
                        n = {
                            x: s.clientX,
                            y: s.clientY
                        }
                    } else if (t.type === e.PointerEventTypes.POINTERUP) {
                    i || s.preventDefault();
                    var a = r._pointerPressed.indexOf(s.pointerId);
                    if (-1 === a) return;
                    if (r._pointerPressed.splice(a, 1), 0 != a) return;
                    n = null, r._offsetX = null, r._offsetY = null
                } else if (t.type === e.PointerEventTypes.POINTERMOVE) {
                    if (i || s.preventDefault(), !n) return;
                    var a = r._pointerPressed.indexOf(s.pointerId);
                    if (0 != a) return;
                    r._offsetX = s.clientX - n.x, r._offsetY = -(s.clientY - n.y)
                }
            }), this._observer = this.camera.getScene().onPointerObservable.add(this._pointerInput, e.PointerEventTypes.POINTERDOWN | e.PointerEventTypes.POINTERUP | e.PointerEventTypes.POINTERMOVE), this._onLostFocus && t.addEventListener("blur", this._onLostFocus)
        }, t.prototype.detachControl = function(e) {
            this._pointerInput && e && (this._observer && (this.camera.getScene().onPointerObservable.remove(this._observer), this._observer = null), this._onLostFocus && (e.removeEventListener("blur", this._onLostFocus), this._onLostFocus = null), this._pointerPressed = [], this._offsetX = null, this._offsetY = null)
        }, t.prototype.checkInputs = function() {
            if (this._offsetX && this._offsetY) {
                var t = this.camera;
                if (t.cameraRotation.y += this._offsetX / this.touchAngularSensibility, this._pointerPressed.length > 1) t.cameraRotation.x += -this._offsetY / this.touchAngularSensibility;
                else {
                    var i = t._computeLocalCameraSpeed(),
                        r = new e.Vector3(0, 0, i * this._offsetY / this.touchMoveSensibility);
                    e.Matrix.RotationYawPitchRollToRef(t.rotation.y, t.rotation.x, 0, t._cameraRotationMatrix), t.cameraDirection.addInPlace(e.Vector3.TransformCoordinates(r, t._cameraRotationMatrix))
                }
            }
        }, t.prototype.getClassName = function() {
            return "FreeCameraTouchInput"
        }, t.prototype.getSimpleName = function() {
            return "touch"
        }, __decorate([e.serialize()], t.prototype, "touchAngularSensibility", void 0), __decorate([e.serialize()], t.prototype, "touchMoveSensibility", void 0), t
    })();
    e.FreeCameraTouchInput = t, e.CameraInputTypes.FreeCameraTouchInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, i, r) || this;
            return n.inputs.addTouch(), n._setupInputs(), n
        }
        return __extends(t, e), Object.defineProperty(t.prototype, "touchAngularSensibility", {
            get: function() {
                var e = this.inputs.attached.touch;
                return e ? e.touchAngularSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.touch;
                t && (t.touchAngularSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "touchMoveSensibility", {
            get: function() {
                var e = this.inputs.attached.touch;
                return e ? e.touchMoveSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.touch;
                t && (t.touchMoveSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getClassName = function() {
            return "TouchCamera"
        }, t.prototype._setupInputs = function() {
            var e = this.inputs.attached.mouse;
            e && (e.touchEnabled = !1)
        }, t
    })(e.FreeCamera);
    e.TouchCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === s && (s = null), void 0 === a && (a = !0), void 0 === l && (l = !1);
            var c = t.call(this, null, o, !a) || this;
            c.isCube = l, c.isEnabled = !0, c._currentRefreshId = -1, c._refreshRate = 1, c._vertexBuffers = {}, c._uniforms = new Array, c._samplers = new Array, c._textures = {}, c._floats = {}, c._floatsArrays = {}, c._colors3 = {}, c._colors4 = {}, c._vectors2 = {}, c._vectors3 = {}, c._matrices = {}, c._fallbackTextureUsed = !1, o._proceduralTextures.push(c), c._engine = o.getEngine(), c.name = i, c.isRenderTarget = !0, c._size = r, c._generateMipMaps = a, c.setFragment(n), c._fallbackTexture = s, l ? (c._texture = c._engine.createRenderTargetCubeTexture(r, {
                generateMipMaps: a
            }), c.setFloat("face", 0)) : c._texture = c._engine.createRenderTargetTexture(r, a);
            var h = [];
            return h.push(1, 1), h.push(-1, 1), h.push(-1, -1), h.push(1, -1), c._vertexBuffers[e.VertexBuffer.PositionKind] = new e.VertexBuffer(c._engine, h, e.VertexBuffer.PositionKind, !1, !1, 2), c._createIndexBuffer(), c
        }
        return __extends(i, t), i.prototype._createIndexBuffer = function() {
            var e = this._engine,
                t = [];
            t.push(0), t.push(1), t.push(2), t.push(0), t.push(2), t.push(3), this._indexBuffer = e.createIndexBuffer(t)
        }, i.prototype._rebuild = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && t._rebuild(), this._createIndexBuffer(), this.refreshRate === e.RenderTargetTexture.REFRESHRATE_RENDER_ONCE && (this.refreshRate = e.RenderTargetTexture.REFRESHRATE_RENDER_ONCE)
        }, i.prototype.reset = function() {
            if (void 0 !== this._effect) {
                this._engine._releaseEffect(this._effect)
            }
        }, i.prototype.isReady = function() {
            var t, i = this,
                r = this._engine;
            return !!this._fragment && (!!this._fallbackTextureUsed || (t = void 0 !== this._fragment.fragmentElement ? {
                vertex: "procedural",
                fragmentElement: this._fragment.fragmentElement
            } : {
                vertex: "procedural",
                fragment: this._fragment
            }, this._effect = r.createEffect(t, [e.VertexBuffer.PositionKind], this._uniforms, this._samplers, "", void 0, void 0, (function() {
                i.releaseInternalTexture(), i._fallbackTexture && (i._texture = i._fallbackTexture._texture, i._texture && i._texture.incrementReferences()), i._fallbackTextureUsed = !0
            })), this._effect.isReady()))
        }, i.prototype.resetRefreshCounter = function() {
            this._currentRefreshId = -1
        }, i.prototype.setFragment = function(e) {
            this._fragment = e
        }, Object.defineProperty(i.prototype, "refreshRate", {
            get: function() {
                return this._refreshRate
            },
            set: function(e) {
                this._refreshRate = e, this.resetRefreshCounter()
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._shouldRender = function() {
            return !!(this.isEnabled && this.isReady() && this._texture) && (!this._fallbackTextureUsed && (-1 === this._currentRefreshId ? (this._currentRefreshId = 1, !0) : this.refreshRate === this._currentRefreshId ? (this._currentRefreshId = 1, !0) : (this._currentRefreshId++, !1)))
        }, i.prototype.getRenderSize = function() {
            return this._size
        }, i.prototype.resize = function(e, t) {
            this._fallbackTextureUsed || (this.releaseInternalTexture(), this._texture = this._engine.createRenderTargetTexture(e, t))
        }, i.prototype._checkUniform = function(e) {
            -1 === this._uniforms.indexOf(e) && this._uniforms.push(e)
        }, i.prototype.setTexture = function(e, t) {
            return -1 === this._samplers.indexOf(e) && this._samplers.push(e), this._textures[e] = t, this
        }, i.prototype.setFloat = function(e, t) {
            return this._checkUniform(e), this._floats[e] = t, this
        }, i.prototype.setFloats = function(e, t) {
            return this._checkUniform(e), this._floatsArrays[e] = t, this
        }, i.prototype.setColor3 = function(e, t) {
            return this._checkUniform(e), this._colors3[e] = t, this
        }, i.prototype.setColor4 = function(e, t) {
            return this._checkUniform(e), this._colors4[e] = t, this
        }, i.prototype.setVector2 = function(e, t) {
            return this._checkUniform(e), this._vectors2[e] = t, this
        }, i.prototype.setVector3 = function(e, t) {
            return this._checkUniform(e), this._vectors3[e] = t, this
        }, i.prototype.setMatrix = function(e, t) {
            return this._checkUniform(e), this._matrices[e] = t, this
        }, i.prototype.render = function(t) {
            var i = this.getScene();
            if (i) {
                var r = this._engine;
                r.enableEffect(this._effect), r.setState(!1);
                for (var n in this._textures) this._effect.setTexture(n, this._textures[n]);
                for (n in this._floats) this._effect.setFloat(n, this._floats[n]);
                for (n in this._floatsArrays) this._effect.setArray(n, this._floatsArrays[n]);
                for (n in this._colors3) this._effect.setColor3(n, this._colors3[n]);
                for (n in this._colors4) {
                    var o = this._colors4[n];
                    this._effect.setFloat4(n, o.r, o.g, o.b, o.a)
                }
                for (n in this._vectors2) this._effect.setVector2(n, this._vectors2[n]);
                for (n in this._vectors3) this._effect.setVector3(n, this._vectors3[n]);
                for (n in this._matrices) this._effect.setMatrix(n, this._matrices[n]);
                if (this._texture) {
                    if (this.isCube)
                        for (var s = 0; s < 6; s++) r.bindFramebuffer(this._texture, s, void 0, void 0, !0), r.bindBuffers(this._vertexBuffers, this._indexBuffer, this._effect), this._effect.setFloat("face", s), r.clear(i.clearColor, !0, !0, !0), r.drawElementsType(e.Material.TriangleFillMode, 0, 6), 5 === s && r.generateMipMapsForCubemap(this._texture);
                    else r.bindFramebuffer(this._texture, 0, void 0, void 0, !0), r.bindBuffers(this._vertexBuffers, this._indexBuffer, this._effect), r.clear(i.clearColor, !0, !0, !0), r.drawElementsType(e.Material.TriangleFillMode, 0, 6);
                    r.unBindFramebuffer(this._texture, this.isCube), this.onGenerated && this.onGenerated()
                }
            }
        }, i.prototype.clone = function() {
            var e = this.getSize(),
                t = new i(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
        }, i.prototype.dispose = function() {
            var i = this.getScene();
            if (i) {
                var r = i._proceduralTextures.indexOf(this);
                r >= 0 && i._proceduralTextures.splice(r, 1);
                var n = this._vertexBuffers[e.VertexBuffer.PositionKind];
                n && (n.dispose(), this._vertexBuffers[e.VertexBuffer.PositionKind] = null), this._indexBuffer && this._engine._releaseBuffer(this._indexBuffer) && (this._indexBuffer = null), t.prototype.dispose.call(this)
            }
        }, i
    })(e.Texture);
    e.ProceduralTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i, r, n, o, s) {
            var a = t.call(this, e, r, null, n, o, s) || this;
            return a._animate = !0, a._time = 0, a._texturePath = i, a.loadJson(i), a.refreshRate = 1, a
        }
        return __extends(i, t), i.prototype.loadJson = function(t) {
            var i = this,
                r = function() {
                    e.Tools.Log("No config file found in " + t + " trying to use ShadersStore or DOM element");
                    try {
                        i.setFragment(i._texturePath)
                    } catch (t) {
                        e.Tools.Error("No json or ShaderStore or DOM element found for CustomProceduralTexture")
                    }
                },
                n = t + "/config.json",
                o = new XMLHttpRequest;
            o.open("GET", n, !0), o.addEventListener("load", (function() {
                if (200 === o.status || e.Tools.ValidateXHRData(o, 1)) try {
                    i._config = JSON.parse(o.response), i.updateShaderUniforms(), i.updateTextures(), i.setFragment(i._texturePath + "/custom"), i._animate = i._config.animate, i.refreshRate = i._config.refreshrate
                } catch (e) {
                    r()
                } else r()
            }), !1), o.addEventListener("error", (function() {
                r()
            }), !1);
            try {
                o.send()
            } catch (t) {
                e.Tools.Error("CustomProceduralTexture: Error on XHR send request.")
            }
        }, i.prototype.isReady = function() {
            if (!t.prototype.isReady.call(this)) return !1;
            for (var e in this._textures) {
                if (!this._textures[e].isReady()) return !1
            }
            return !0
        }, i.prototype.render = function(e) {
            var i = this.getScene();
            this._animate && i && (this._time += .03 * i.getAnimationRatio(), this.updateShaderUniforms()), t.prototype.render.call(this, e)
        }, i.prototype.updateTextures = function() {
            for (var t = 0; t < this._config.sampler2Ds.length; t++) this.setTexture(this._config.sampler2Ds[t].sample2Dname, new e.Texture(this._texturePath + "/" + this._config.sampler2Ds[t].textureRelativeUrl, this.getScene()))
        }, i.prototype.updateShaderUniforms = function() {
            if (this._config)
                for (var t = 0; t < this._config.uniforms.length; t++) {
                    var i = this._config.uniforms[t];
                    switch (i.type) {
                        case "float":
                            this.setFloat(i.name, i.value);
                            break;
                        case "color3":
                            this.setColor3(i.name, new e.Color3(i.r, i.g, i.b));
                            break;
                        case "color4":
                            this.setColor4(i.name, new e.Color4(i.r, i.g, i.b, i.a));
                            break;
                        case "vector2":
                            this.setVector2(i.name, new e.Vector2(i.x, i.y));
                            break;
                        case "vector3":
                            this.setVector3(i.name, new e.Vector3(i.x, i.y, i.z))
                    }
                }
            this.setFloat("time", this._time)
        }, Object.defineProperty(i.prototype, "animate", {
            get: function() {
                return this._animate
            },
            set: function(e) {
                this._animate = e
            },
            enumerable: !0,
            configurable: !0
        }), i
    })(e.ProceduralTexture);
    e.CustomProceduralTexture = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.gamepadAngularSensibility = 200, this.gamepadMoveSensibility = 40, this._cameraTransform = e.Matrix.Identity(), this._deltaTransform = e.Vector3.Zero(), this._vector3 = e.Vector3.Zero(), this._vector2 = e.Vector2.Zero()
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this,
                n = this.camera.getScene().gamepadManager;
            this._onGamepadConnectedObserver = n.onGamepadConnectedObservable.add((function(t) {
                t.type !== e.Gamepad.POSE_ENABLED && (r.gamepad && t.type !== e.Gamepad.XBOX || (r.gamepad = t))
            })), this._onGamepadDisconnectedObserver = n.onGamepadDisconnectedObservable.add((function(e) {
                r.gamepad === e && (r.gamepad = null)
            })), this.gamepad = n.getGamepadByType(e.Gamepad.XBOX)
        }, t.prototype.detachControl = function(e) {
            this.camera.getScene().gamepadManager.onGamepadConnectedObservable.remove(this._onGamepadConnectedObserver), this.camera.getScene().gamepadManager.onGamepadDisconnectedObservable.remove(this._onGamepadDisconnectedObserver), this.gamepad = null
        }, t.prototype.checkInputs = function() {
            if (this.gamepad && this.gamepad.leftStick) {
                var t = this.camera,
                    i = this.gamepad.leftStick,
                    r = i.x / this.gamepadMoveSensibility,
                    n = i.y / this.gamepadMoveSensibility;
                i.x = Math.abs(r) > .005 ? 0 + r : 0, i.y = Math.abs(n) > .005 ? 0 + n : 0;
                var o = this.gamepad.rightStick;
                if (o) {
                    var s = o.x / this.gamepadAngularSensibility,
                        a = o.y / this.gamepadAngularSensibility;
                    o.x = Math.abs(s) > .001 ? 0 + s : 0, o.y = Math.abs(a) > .001 ? 0 + a : 0
                } else o = {
                    x: 0,
                    y: 0
                };
                t.rotationQuaternion ? t.rotationQuaternion.toRotationMatrix(this._cameraTransform) : e.Matrix.RotationYawPitchRollToRef(t.rotation.y, t.rotation.x, 0, this._cameraTransform);
                var l = 50 * t._computeLocalCameraSpeed();
                this._vector3.copyFromFloats(i.x * l, 0, -i.y * l), e.Vector3.TransformCoordinatesToRef(this._vector3, this._cameraTransform, this._deltaTransform), t.cameraDirection.addInPlace(this._deltaTransform), this._vector2.copyFromFloats(o.y, o.x), t.cameraRotation.addInPlace(this._vector2)
            }
        }, t.prototype.getClassName = function() {
            return "FreeCameraGamepadInput"
        }, t.prototype.getSimpleName = function() {
            return "gamepad"
        }, __decorate([e.serialize()], t.prototype, "gamepadAngularSensibility", void 0), __decorate([e.serialize()], t.prototype, "gamepadMoveSensibility", void 0), t
    })();
    e.FreeCameraGamepadInput = t, e.CameraInputTypes.FreeCameraGamepadInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.gamepadRotationSensibility = 80, this.gamepadMoveSensibility = 40
        }
        return t.prototype.attachControl = function(t, i) {
            var r = this,
                n = this.camera.getScene().gamepadManager;
            this._onGamepadConnectedObserver = n.onGamepadConnectedObservable.add((function(t) {
                t.type !== e.Gamepad.POSE_ENABLED && (r.gamepad && t.type !== e.Gamepad.XBOX || (r.gamepad = t))
            })), this._onGamepadDisconnectedObserver = n.onGamepadDisconnectedObservable.add((function(e) {
                r.gamepad === e && (r.gamepad = null)
            })), this.gamepad = n.getGamepadByType(e.Gamepad.XBOX)
        }, t.prototype.detachControl = function(e) {
            this.camera.getScene().gamepadManager.onGamepadConnectedObservable.remove(this._onGamepadConnectedObserver), this.camera.getScene().gamepadManager.onGamepadDisconnectedObservable.remove(this._onGamepadDisconnectedObserver), this.gamepad = null
        }, t.prototype.checkInputs = function() {
            if (this.gamepad) {
                var e = this.camera,
                    t = this.gamepad.rightStick;
                if (t) {
                    if (0 != t.x) {
                        var i = t.x / this.gamepadRotationSensibility;
                        0 != i && Math.abs(i) > .005 && (e.inertialAlphaOffset += i)
                    }
                    if (0 != t.y) {
                        var r = t.y / this.gamepadRotationSensibility;
                        0 != r && Math.abs(r) > .005 && (e.inertialBetaOffset += r)
                    }
                }
                var n = this.gamepad.leftStick;
                if (n && 0 != n.y) {
                    var o = n.y / this.gamepadMoveSensibility;
                    0 != o && Math.abs(o) > .005 && (this.camera.inertialRadiusOffset -= o)
                }
            }
        }, t.prototype.getClassName = function() {
            return "ArcRotateCameraGamepadInput"
        }, t.prototype.getSimpleName = function() {
            return "gamepad"
        }, __decorate([e.serialize()], t.prototype, "gamepadRotationSensibility", void 0), __decorate([e.serialize()], t.prototype, "gamepadMoveSensibility", void 0), t
    })();
    e.ArcRotateCameraGamepadInput = t, e.CameraInputTypes.ArcRotateCameraGamepadInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            var i = this;
            this._scene = t, this._babylonGamepads = [], this._oneGamepadConnected = !1, this._isMonitoring = !1, this.onGamepadDisconnectedObservable = new e.Observable, e.Tools.IsWindowObjectExist() ? (this._gamepadEventSupported = "GamepadEvent" in window, this._gamepadSupport = navigator.getGamepads || navigator.webkitGetGamepads || navigator.msGetGamepads || navigator.webkitGamepads) : this._gamepadEventSupported = !1, this.onGamepadConnectedObservable = new e.Observable(function(e) {
                for (var t in i._babylonGamepads) {
                    var r = i._babylonGamepads[t];
                    r && r._isConnected && i.onGamepadConnectedObservable.notifyObserver(e, r)
                }
            }), this._onGamepadConnectedEvent = function(e) {
                var t = e.gamepad;
                if (!(t.index in i._babylonGamepads && i._babylonGamepads[t.index].isConnected)) {
                    var r;
                    i._babylonGamepads[t.index] ? (r = i._babylonGamepads[t.index], r.browserGamepad = t, r._isConnected = !0) : r = i._addNewGamepad(t), i.onGamepadConnectedObservable.notifyObservers(r), i._startMonitoringGamepads()
                }
            }, this._onGamepadDisconnectedEvent = function(e) {
                var t = e.gamepad;
                for (var r in i._babylonGamepads)
                    if (i._babylonGamepads[r].index === t.index) {
                        var n = i._babylonGamepads[r];
                        n._isConnected = !1, i.onGamepadDisconnectedObservable.notifyObservers(n);
                        break
                    }
            }, this._gamepadSupport && (this._updateGamepadObjects(), this._babylonGamepads.length && this._startMonitoringGamepads(), this._gamepadEventSupported ? (window.addEventListener("gamepadconnected", this._onGamepadConnectedEvent, !1), window.addEventListener("gamepaddisconnected", this._onGamepadDisconnectedEvent, !1)) : this._startMonitoringGamepads())
        }
        return Object.defineProperty(t.prototype, "gamepads", {
            get: function() {
                return this._babylonGamepads
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getGamepadByType = function(t) {
            void 0 === t && (t = e.Gamepad.XBOX);
            for (var i = 0, r = this._babylonGamepads; i < r.length; i++) {
                var n = r[i];
                if (n && n.type === t) return n
            }
            return null
        }, t.prototype.dispose = function() {
            this._gamepadEventSupported && (this._onGamepadConnectedEvent && window.removeEventListener("gamepadconnected", this._onGamepadConnectedEvent), this._onGamepadDisconnectedEvent && window.removeEventListener("gamepaddisconnected", this._onGamepadDisconnectedEvent), this._onGamepadConnectedEvent = null, this._onGamepadDisconnectedEvent = null), this._babylonGamepads.forEach((function(e) {
                e.dispose()
            })), this.onGamepadConnectedObservable.clear(), this.onGamepadDisconnectedObservable.clear(), this._oneGamepadConnected = !1, this._stopMonitoringGamepads(), this._babylonGamepads = []
        }, t.prototype._addNewGamepad = function(t) {
            this._oneGamepadConnected || (this._oneGamepadConnected = !0);
            var i, r = -1 !== t.id.search("Xbox One");
            return i = r || -1 !== t.id.search("Xbox 360") || -1 !== t.id.search("xinput") ? new e.Xbox360Pad(t.id, t.index, t, r) : t.pose ? e.PoseEnabledControllerHelper.InitiateController(t) : new e.GenericPad(t.id, t.index, t), this._babylonGamepads[i.index] = i, i
        }, t.prototype._startMonitoringGamepads = function() {
            this._isMonitoring || (this._isMonitoring = !0, this._scene || this._checkGamepadsStatus())
        }, t.prototype._stopMonitoringGamepads = function() {
            this._isMonitoring = !1
        }, t.prototype._checkGamepadsStatus = function() {
            var t = this;
            this._updateGamepadObjects();
            for (var i in this._babylonGamepads) {
                var r = this._babylonGamepads[i];
                r && r.isConnected && r.update()
            }
            this._isMonitoring && !this._scene && e.Tools.QueueNewFrame((function() {
                t._checkGamepadsStatus()
            }))
        }, t.prototype._updateGamepadObjects = function() {
            for (var e = navigator.getGamepads ? navigator.getGamepads() : navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : [], t = 0; t < e.length; t++)
                if (e[t])
                    if (this._babylonGamepads[e[t].index]) this._babylonGamepads[t].browserGamepad = e[t], this._babylonGamepads[t].isConnected || (this._babylonGamepads[t]._isConnected = !0, this.onGamepadConnectedObservable.notifyObservers(this._babylonGamepads[t]));
                    else {
                        var i = this._addNewGamepad(e[t]);
                        this.onGamepadConnectedObservable.notifyObservers(i)
                    }
        }, t
    })();
    e.GamepadManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t) {
            this.x = e, this.y = t
        }
        return e
    })();
    e.StickValues = t;
    var i = (function() {
        function e(t, i, r, n, o, s, a) {
            void 0 === n && (n = 0), void 0 === o && (o = 1), void 0 === s && (s = 2), void 0 === a && (a = 3), this.id = t, this.index = i, this.browserGamepad = r, this._isConnected = !0, this._invertLeftStickY = !1, this.type = e.GAMEPAD, this._leftStickAxisX = n, this._leftStickAxisY = o, this._rightStickAxisX = s, this._rightStickAxisY = a, this.browserGamepad.axes.length >= 2 && (this._leftStick = {
                x: this.browserGamepad.axes[this._leftStickAxisX],
                y: this.browserGamepad.axes[this._leftStickAxisY]
            }), this.browserGamepad.axes.length >= 4 && (this._rightStick = {
                x: this.browserGamepad.axes[this._rightStickAxisX],
                y: this.browserGamepad.axes[this._rightStickAxisY]
            })
        }
        return Object.defineProperty(e.prototype, "isConnected", {
            get: function() {
                return this._isConnected
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.onleftstickchanged = function(e) {
            this._onleftstickchanged = e
        }, e.prototype.onrightstickchanged = function(e) {
            this._onrightstickchanged = e
        }, Object.defineProperty(e.prototype, "leftStick", {
            get: function() {
                return this._leftStick
            },
            set: function(e) {
                !this._onleftstickchanged || this._leftStick.x === e.x && this._leftStick.y === e.y || this._onleftstickchanged(e), this._leftStick = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "rightStick", {
            get: function() {
                return this._rightStick
            },
            set: function(e) {
                !this._onrightstickchanged || this._rightStick.x === e.x && this._rightStick.y === e.y || this._onrightstickchanged(e), this._rightStick = e
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.update = function() {
            this._leftStick && (this.leftStick = {
                x: this.browserGamepad.axes[this._leftStickAxisX],
                y: this.browserGamepad.axes[this._leftStickAxisY]
            }, this._invertLeftStickY && (this.leftStick.y *= -1)), this._rightStick && (this.rightStick = {
                x: this.browserGamepad.axes[this._rightStickAxisX],
                y: this.browserGamepad.axes[this._rightStickAxisY]
            })
        }, e.prototype.dispose = function() {}, e.GAMEPAD = 0, e.GENERIC = 1, e.XBOX = 2, e.POSE_ENABLED = 3, e
    })();
    e.Gamepad = i;
    var r = (function(t) {
        function r(r, n, o) {
            var s = t.call(this, r, n, o) || this;
            return s.onButtonDownObservable = new e.Observable, s.onButtonUpObservable = new e.Observable, s.type = i.GENERIC, s._buttons = new Array(o.buttons.length), s
        }
        return __extends(r, t), r.prototype.onbuttondown = function(e) {
            this._onbuttondown = e
        }, r.prototype.onbuttonup = function(e) {
            this._onbuttonup = e
        }, r.prototype._setButtonValue = function(e, t, i) {
            return e !== t && (1 === e && (this._onbuttondown && this._onbuttondown(i), this.onButtonDownObservable.notifyObservers(i)), 0 === e && (this._onbuttonup && this._onbuttonup(i), this.onButtonUpObservable.notifyObservers(i))), e
        }, r.prototype.update = function() {
            t.prototype.update.call(this);
            for (var e = 0; e < this._buttons.length; e++) this._buttons[e] = this._setButtonValue(this.browserGamepad.buttons[e].value, this._buttons[e], e)
        }, r.prototype.dispose = function() {
            t.prototype.dispose.call(this), this.onButtonDownObservable.clear(), this.onButtonUpObservable.clear()
        }, r
    })(i);
    e.GenericPad = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.A = 0] = "A", e[e.B = 1] = "B", e[e.X = 2] = "X", e[e.Y = 3] = "Y", e[e.Start = 4] = "Start", e[e.Back = 5] = "Back", e[e.LB = 6] = "LB", e[e.RB = 7] = "RB", e[e.LeftStick = 8] = "LeftStick", e[e.RightStick = 9] = "RightStick"
    })(t = e.Xbox360Button || (e.Xbox360Button = {}));
    var i;
    !(function(e) {
        e[e.Up = 0] = "Up", e[e.Down = 1] = "Down", e[e.Left = 2] = "Left", e[e.Right = 3] = "Right"
    })(i = e.Xbox360Dpad || (e.Xbox360Dpad = {}));
    var r = (function(r) {
        function n(t, i, n, o) {
            void 0 === o && (o = !1);
            var s = r.call(this, t, i, n, 0, 1, 2, 3) || this;
            return s._leftTrigger = 0, s._rightTrigger = 0, s.onButtonDownObservable = new e.Observable, s.onButtonUpObservable = new e.Observable, s.onPadDownObservable = new e.Observable, s.onPadUpObservable = new e.Observable, s._buttonA = 0, s._buttonB = 0, s._buttonX = 0, s._buttonY = 0, s._buttonBack = 0, s._buttonStart = 0, s._buttonLB = 0, s._buttonRB = 0, s._buttonLeftStick = 0, s._buttonRightStick = 0, s._dPadUp = 0, s._dPadDown = 0, s._dPadLeft = 0, s._dPadRight = 0, s._isXboxOnePad = !1, s.type = e.Gamepad.XBOX, s._isXboxOnePad = o, s
        }
        return __extends(n, r), n.prototype.onlefttriggerchanged = function(e) {
            this._onlefttriggerchanged = e
        }, n.prototype.onrighttriggerchanged = function(e) {
            this._onrighttriggerchanged = e
        }, Object.defineProperty(n.prototype, "leftTrigger", {
            get: function() {
                return this._leftTrigger
            },
            set: function(e) {
                this._onlefttriggerchanged && this._leftTrigger !== e && this._onlefttriggerchanged(e), this._leftTrigger = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "rightTrigger", {
            get: function() {
                return this._rightTrigger
            },
            set: function(e) {
                this._onrighttriggerchanged && this._rightTrigger !== e && this._onrighttriggerchanged(e), this._rightTrigger = e
            },
            enumerable: !0,
            configurable: !0
        }), n.prototype.onbuttondown = function(e) {
            this._onbuttondown = e
        }, n.prototype.onbuttonup = function(e) {
            this._onbuttonup = e
        }, n.prototype.ondpaddown = function(e) {
            this._ondpaddown = e
        }, n.prototype.ondpadup = function(e) {
            this._ondpadup = e
        }, n.prototype._setButtonValue = function(e, t, i) {
            return e !== t && (1 === e && (this._onbuttondown && this._onbuttondown(i), this.onButtonDownObservable.notifyObservers(i)), 0 === e && (this._onbuttonup && this._onbuttonup(i), this.onButtonUpObservable.notifyObservers(i))), e
        }, n.prototype._setDPadValue = function(e, t, i) {
            return e !== t && (1 === e && (this._ondpaddown && this._ondpaddown(i), this.onPadDownObservable.notifyObservers(i)), 0 === e && (this._ondpadup && this._ondpadup(i), this.onPadUpObservable.notifyObservers(i))), e
        }, Object.defineProperty(n.prototype, "buttonA", {
            get: function() {
                return this._buttonA
            },
            set: function(e) {
                this._buttonA = this._setButtonValue(e, this._buttonA, t.A)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonB", {
            get: function() {
                return this._buttonB
            },
            set: function(e) {
                this._buttonB = this._setButtonValue(e, this._buttonB, t.B)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonX", {
            get: function() {
                return this._buttonX
            },
            set: function(e) {
                this._buttonX = this._setButtonValue(e, this._buttonX, t.X)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonY", {
            get: function() {
                return this._buttonY
            },
            set: function(e) {
                this._buttonY = this._setButtonValue(e, this._buttonY, t.Y)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonStart", {
            get: function() {
                return this._buttonStart
            },
            set: function(e) {
                this._buttonStart = this._setButtonValue(e, this._buttonStart, t.Start)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonBack", {
            get: function() {
                return this._buttonBack
            },
            set: function(e) {
                this._buttonBack = this._setButtonValue(e, this._buttonBack, t.Back)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonLB", {
            get: function() {
                return this._buttonLB
            },
            set: function(e) {
                this._buttonLB = this._setButtonValue(e, this._buttonLB, t.LB)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonRB", {
            get: function() {
                return this._buttonRB
            },
            set: function(e) {
                this._buttonRB = this._setButtonValue(e, this._buttonRB, t.RB)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonLeftStick", {
            get: function() {
                return this._buttonLeftStick
            },
            set: function(e) {
                this._buttonLeftStick = this._setButtonValue(e, this._buttonLeftStick, t.LeftStick)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "buttonRightStick", {
            get: function() {
                return this._buttonRightStick
            },
            set: function(e) {
                this._buttonRightStick = this._setButtonValue(e, this._buttonRightStick, t.RightStick)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "dPadUp", {
            get: function() {
                return this._dPadUp
            },
            set: function(e) {
                this._dPadUp = this._setDPadValue(e, this._dPadUp, i.Up)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "dPadDown", {
            get: function() {
                return this._dPadDown
            },
            set: function(e) {
                this._dPadDown = this._setDPadValue(e, this._dPadDown, i.Down)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "dPadLeft", {
            get: function() {
                return this._dPadLeft
            },
            set: function(e) {
                this._dPadLeft = this._setDPadValue(e, this._dPadLeft, i.Left)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(n.prototype, "dPadRight", {
            get: function() {
                return this._dPadRight
            },
            set: function(e) {
                this._dPadRight = this._setDPadValue(e, this._dPadRight, i.Right)
            },
            enumerable: !0,
            configurable: !0
        }), n.prototype.update = function() {
            r.prototype.update.call(this), this._isXboxOnePad ? (this.buttonA = this.browserGamepad.buttons[0].value, this.buttonB = this.browserGamepad.buttons[1].value, this.buttonX = this.browserGamepad.buttons[2].value, this.buttonY = this.browserGamepad.buttons[3].value, this.buttonLB = this.browserGamepad.buttons[4].value, this.buttonRB = this.browserGamepad.buttons[5].value, this.leftTrigger = this.browserGamepad.axes[2], this.rightTrigger = this.browserGamepad.axes[5], this.buttonBack = this.browserGamepad.buttons[9].value, this.buttonStart = this.browserGamepad.buttons[8].value, this.buttonLeftStick = this.browserGamepad.buttons[6].value, this.buttonRightStick = this.browserGamepad.buttons[7].value, this.dPadUp = this.browserGamepad.buttons[11].value, this.dPadDown = this.browserGamepad.buttons[12].value, this.dPadLeft = this.browserGamepad.buttons[13].value, this.dPadRight = this.browserGamepad.buttons[14].value) : (this.buttonA = this.browserGamepad.buttons[0].value, this.buttonB = this.browserGamepad.buttons[1].value, this.buttonX = this.browserGamepad.buttons[2].value, this.buttonY = this.browserGamepad.buttons[3].value, this.buttonLB = this.browserGamepad.buttons[4].value, this.buttonRB = this.browserGamepad.buttons[5].value, this.leftTrigger = this.browserGamepad.buttons[6].value, this.rightTrigger = this.browserGamepad.buttons[7].value, this.buttonBack = this.browserGamepad.buttons[8].value, this.buttonStart = this.browserGamepad.buttons[9].value, this.buttonLeftStick = this.browserGamepad.buttons[10].value, this.buttonRightStick = this.browserGamepad.buttons[11].value, this.dPadUp = this.browserGamepad.buttons[12].value, this.dPadDown = this.browserGamepad.buttons[13].value, this.dPadLeft = this.browserGamepad.buttons[14].value, this.dPadRight = this.browserGamepad.buttons[15].value)
        }, n.prototype.dispose = function() {
            r.prototype.dispose.call(this), this.onButtonDownObservable.clear(), this.onButtonUpObservable.clear(), this.onPadDownObservable.clear(), this.onPadUpObservable.clear()
        }, n
    })(e.Gamepad);
    e.Xbox360Pad = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.VIVE = 0] = "VIVE", e[e.OCULUS = 1] = "OCULUS", e[e.WINDOWS = 2] = "WINDOWS", e[e.GEAR_VR = 3] = "GEAR_VR", e[e.GENERIC = 4] = "GENERIC"
    })(t = e.PoseEnabledControllerType || (e.PoseEnabledControllerType = {}));
    var i = (function() {
        function t() {}
        return t.InitiateController = function(t) {
            return -1 !== t.id.indexOf("Oculus Touch") ? new e.OculusTouchController(t) : 0 === t.id.indexOf(e.WindowsMotionController.GAMEPAD_ID_PREFIX) ? new e.WindowsMotionController(t) : -1 !== t.id.toLowerCase().indexOf("openvr") ? new e.ViveController(t) : 0 === t.id.indexOf(e.GearVRController.GAMEPAD_ID_PREFIX) ? new e.GearVRController(t) : new e.GenericController(t)
        }, t
    })();
    e.PoseEnabledControllerHelper = i;
    var r = (function(i) {
        function r(r) {
            var n = i.call(this, r.id, r.index, r) || this;
            return n._deviceRoomPosition = e.Vector3.Zero(), n._deviceRoomRotationQuaternion = new e.Quaternion, n.devicePosition = e.Vector3.Zero(), n.deviceRotationQuaternion = new e.Quaternion, n.deviceScaleFactor = 1, n._leftHandSystemQuaternion = new e.Quaternion, n._deviceToWorld = e.Matrix.Identity(), n._workingMatrix = e.Matrix.Identity(), n.type = e.Gamepad.POSE_ENABLED, n.controllerType = t.GENERIC, n.position = e.Vector3.Zero(), n.rotationQuaternion = new e.Quaternion, n._calculatedPosition = e.Vector3.Zero(), n._calculatedRotation = new e.Quaternion, e.Quaternion.RotationYawPitchRollToRef(Math.PI, 0, 0, n._leftHandSystemQuaternion), n
        }
        return __extends(r, i), r.prototype.update = function() {
            i.prototype.update.call(this);
            var t = this.browserGamepad.pose;
            this.updateFromDevice(t), e.Vector3.TransformCoordinatesToRef(this._calculatedPosition, this._deviceToWorld, this.devicePosition), this._deviceToWorld.getRotationMatrixToRef(this._workingMatrix), e.Quaternion.FromRotationMatrixToRef(this._workingMatrix, this.deviceRotationQuaternion), this.deviceRotationQuaternion.multiplyInPlace(this._calculatedRotation), this._mesh && (this._mesh.position.copyFrom(this.devicePosition), this._mesh.rotationQuaternion && this._mesh.rotationQuaternion.copyFrom(this.deviceRotationQuaternion))
        }, r.prototype.updateFromDevice = function(e) {
            if (e) {
                this.rawPose = e, e.position && (this._deviceRoomPosition.copyFromFloats(e.position[0], e.position[1], -e.position[2]), this._mesh && this._mesh.getScene().useRightHandedSystem && (this._deviceRoomPosition.z *= -1), this._deviceRoomPosition.scaleToRef(this.deviceScaleFactor, this._calculatedPosition), this._calculatedPosition.addInPlace(this.position));
                var t = this.rawPose;
                e.orientation && t.orientation && (this._deviceRoomRotationQuaternion.copyFromFloats(t.orientation[0], t.orientation[1], -t.orientation[2], -t.orientation[3]), this._mesh && (this._mesh.getScene().useRightHandedSystem ? (this._deviceRoomRotationQuaternion.z *= -1, this._deviceRoomRotationQuaternion.w *= -1) : this._deviceRoomRotationQuaternion.multiplyToRef(this._leftHandSystemQuaternion, this._deviceRoomRotationQuaternion)), this._deviceRoomRotationQuaternion.multiplyToRef(this.rotationQuaternion, this._calculatedRotation))
            }
        }, r.prototype.attachToMesh = function(t) {
            this._mesh && (this._mesh.parent = null), this._mesh = t, this._poseControlledCamera && (this._mesh.parent = this._poseControlledCamera), this._mesh.rotationQuaternion || (this._mesh.rotationQuaternion = new e.Quaternion)
        }, r.prototype.attachToPoseControlledCamera = function(e) {
            this._poseControlledCamera = e, this._mesh && (this._mesh.parent = this._poseControlledCamera)
        }, r.prototype.dispose = function() {
            this._mesh && this._mesh.dispose(), this._mesh = null, i.prototype.dispose.call(this)
        }, Object.defineProperty(r.prototype, "mesh", {
            get: function() {
                return this._mesh
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.getForwardRay = function(t) {
            if (void 0 === t && (t = 100), !this.mesh) return new e.Ray(e.Vector3.Zero(), new e.Vector3(0, 0, 1), t);
            var i = this.mesh.getWorldMatrix(),
                r = i.getTranslation(),
                n = new e.Vector3(0, 0, -1),
                o = e.Vector3.TransformNormal(n, i),
                s = e.Vector3.Normalize(o);
            return new e.Ray(r, s, t)
        }, r
    })(e.Gamepad);
    e.PoseEnabledController = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i) {
            var r = t.call(this, i) || this;
            return r.onTriggerStateChangedObservable = new e.Observable, r.onMainButtonStateChangedObservable = new e.Observable, r.onSecondaryButtonStateChangedObservable = new e.Observable, r.onPadStateChangedObservable = new e.Observable, r.onPadValuesChangedObservable = new e.Observable, r.pad = {
                x: 0,
                y: 0
            }, r._changes = {
                pressChanged: !1,
                touchChanged: !1,
                valueChanged: !1,
                changed: !1
            }, r._buttons = new Array(i.buttons.length), r.hand = i.hand, r
        }
        return __extends(i, t), i.prototype.onButtonStateChange = function(e) {
            this._onButtonStateChange = e
        }, Object.defineProperty(i.prototype, "defaultModel", {
            get: function() {
                return this._defaultModel
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.update = function() {
            t.prototype.update.call(this);
            for (var e = 0; e < this._buttons.length; e++) this._setButtonValue(this.browserGamepad.buttons[e], this._buttons[e], e);
            this.leftStick.x === this.pad.x && this.leftStick.y === this.pad.y || (this.pad.x = this.leftStick.x, this.pad.y = this.leftStick.y, this.onPadValuesChangedObservable.notifyObservers(this.pad))
        }, i.prototype._setButtonValue = function(e, t, i) {
            if (e || (e = {
                    pressed: !1,
                    touched: !1,
                    value: 0
                }), !t) return void(this._buttons[i] = {
                pressed: e.pressed,
                touched: e.touched,
                value: e.value
            });
            this._checkChanges(e, t), this._changes.changed && (this._onButtonStateChange && this._onButtonStateChange(this.index, i, e), this.handleButtonChange(i, e, this._changes)), this._buttons[i].pressed = e.pressed, this._buttons[i].touched = e.touched, this._buttons[i].value = e.value < 1e-8 ? 0 : e.value
        }, i.prototype._checkChanges = function(e, t) {
            return this._changes.pressChanged = e.pressed !== t.pressed, this._changes.touchChanged = e.touched !== t.touched, this._changes.valueChanged = e.value !== t.value, this._changes.changed = this._changes.pressChanged || this._changes.touchChanged || this._changes.valueChanged, this._changes
        }, i.prototype.dispose = function() {
            t.prototype.dispose.call(this), this.onTriggerStateChangedObservable.clear(), this.onMainButtonStateChangedObservable.clear(), this.onSecondaryButtonStateChangedObservable.clear(), this.onPadStateChangedObservable.clear(), this.onPadValuesChangedObservable.clear()
        }, i
    })(e.PoseEnabledController);
    e.WebVRController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i) {
            var r = t.call(this, i) || this;
            return r.onSecondaryTriggerStateChangedObservable = new e.Observable, r.onThumbRestChangedObservable = new e.Observable, r.controllerType = e.PoseEnabledControllerType.OCULUS, r
        }
        return __extends(i, t), i.prototype.initControllerMesh = function(t, r) {
            var n, o = this;
            n = "left" === this.hand ? i.MODEL_LEFT_FILENAME : i.MODEL_RIGHT_FILENAME, e.SceneLoader.ImportMesh("", i.MODEL_BASE_URL, n, t, (function(e) {
                o._defaultModel = e[1], o.attachToMesh(o._defaultModel), r && r(o._defaultModel)
            }))
        }, Object.defineProperty(i.prototype, "onAButtonStateChangedObservable", {
            get: function() {
                if ("right" === this.hand) return this.onMainButtonStateChangedObservable;
                throw new Error("No A button on left hand")
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onBButtonStateChangedObservable", {
            get: function() {
                if ("right" === this.hand) return this.onSecondaryButtonStateChangedObservable;
                throw new Error("No B button on left hand")
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onXButtonStateChangedObservable", {
            get: function() {
                if ("left" === this.hand) return this.onMainButtonStateChangedObservable;
                throw new Error("No X button on right hand")
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onYButtonStateChangedObservable", {
            get: function() {
                if ("left" === this.hand) return this.onSecondaryButtonStateChangedObservable;
                throw new Error("No Y button on right hand")
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.handleButtonChange = function(e, t, i) {
            var r = t,
                n = "right" === this.hand ? -1 : 1;
            switch (e) {
                case 0:
                    return void this.onPadStateChangedObservable.notifyObservers(r);
                case 1:
                    return this._defaultModel && (this._defaultModel.getChildren()[3].rotation.x = .2 * -r.value, this._defaultModel.getChildren()[3].position.y = .005 * -r.value, this._defaultModel.getChildren()[3].position.z = .005 * -r.value), void this.onTriggerStateChangedObservable.notifyObservers(r);
                case 2:
                    return this._defaultModel && (this._defaultModel.getChildren()[4].position.x = n * r.value * .0035), void this.onSecondaryTriggerStateChangedObservable.notifyObservers(r);
                case 3:
                    return this._defaultModel && (r.pressed ? this._defaultModel.getChildren()[1].position.y = -.001 : this._defaultModel.getChildren()[1].position.y = 0), void this.onMainButtonStateChangedObservable.notifyObservers(r);
                case 4:
                    return this._defaultModel && (r.pressed ? this._defaultModel.getChildren()[2].position.y = -.001 : this._defaultModel.getChildren()[2].position.y = 0), void this.onSecondaryButtonStateChangedObservable.notifyObservers(r);
                case 5:
                    return void this.onThumbRestChangedObservable.notifyObservers(r)
            }
        }, i.MODEL_BASE_URL = "https://controllers.babylonjs.com/oculus/", i.MODEL_LEFT_FILENAME = "left.babylon", i.MODEL_RIGHT_FILENAME = "right.babylon", i
    })(e.WebVRController);
    e.OculusTouchController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i) {
            var r = t.call(this, i) || this;
            return r.controllerType = e.PoseEnabledControllerType.VIVE, r._invertLeftStickY = !0, r
        }
        return __extends(i, t), i.prototype.initControllerMesh = function(t, r) {
            var n = this;
            e.SceneLoader.ImportMesh("", i.MODEL_BASE_URL, i.MODEL_FILENAME, t, (function(e) {
                n._defaultModel = e[1], n.attachToMesh(n._defaultModel), r && r(n._defaultModel)
            }))
        }, Object.defineProperty(i.prototype, "onLeftButtonStateChangedObservable", {
            get: function() {
                return this.onMainButtonStateChangedObservable
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onRightButtonStateChangedObservable", {
            get: function() {
                return this.onMainButtonStateChangedObservable
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "onMenuButtonStateChangedObservable", {
            get: function() {
                return this.onSecondaryButtonStateChangedObservable
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.handleButtonChange = function(e, t, i) {
            var r = t;
            switch (e) {
                case 0:
                    return void this.onPadStateChangedObservable.notifyObservers(r);
                case 1:
                    return this._defaultModel && (this._defaultModel.getChildren()[6].rotation.x = .15 * -r.value), void this.onTriggerStateChangedObservable.notifyObservers(r);
                case 2:
                    return void this.onMainButtonStateChangedObservable.notifyObservers(r);
                case 3:
                    return this._defaultModel && (r.pressed ? this._defaultModel.getChildren()[2].position.y = -.001 : this._defaultModel.getChildren()[2].position.y = 0), void this.onSecondaryButtonStateChangedObservable.notifyObservers(r)
            }
        }, i.MODEL_BASE_URL = "https://controllers.babylonjs.com/vive/", i.MODEL_FILENAME = "wand.babylon", i
    })(e.WebVRController);
    e.ViveController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e) {
            return t.call(this, e) || this
        }
        return __extends(i, t), i.prototype.initControllerMesh = function(t, r) {
            var n = this;
            e.SceneLoader.ImportMesh("", i.MODEL_BASE_URL, i.MODEL_FILENAME, t, (function(e) {
                n._defaultModel = e[1], n.attachToMesh(n._defaultModel), r && r(n._defaultModel)
            }))
        }, i.prototype.handleButtonChange = function(e, t, i) {
            console.log("Button id: " + e + "state: "), console.dir(t)
        }, i.MODEL_BASE_URL = "https://controllers.babylonjs.com/generic/", i.MODEL_FILENAME = "generic.babylon", i
    })(e.WebVRController);
    e.GenericController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
            function e() {
                this.buttonMeshes = {}, this.axisMeshes = {}
            }
            return e
        })(),
        i = (function(i) {
            function r(t) {
                var r = i.call(this, t) || this;
                return r._mapping = {
                    buttons: ["thumbstick", "trigger", "grip", "menu", "trackpad"],
                    buttonMeshNames: {
                        trigger: "SELECT",
                        menu: "MENU",
                        grip: "GRASP",
                        thumbstick: "THUMBSTICK_PRESS",
                        trackpad: "TOUCHPAD_PRESS"
                    },
                    buttonObservableNames: {
                        trigger: "onTriggerStateChangedObservable",
                        menu: "onSecondaryButtonStateChangedObservable",
                        grip: "onMainButtonStateChangedObservable",
                        thumbstick: "onPadStateChangedObservable",
                        trackpad: "onTrackpadChangedObservable"
                    },
                    axisMeshNames: ["THUMBSTICK_X", "THUMBSTICK_Y", "TOUCHPAD_TOUCH_X", "TOUCHPAD_TOUCH_Y"],
                    pointingPoseMeshName: "POINTING_POSE"
                }, r.onTrackpadChangedObservable = new e.Observable, r.onTrackpadValuesChangedObservable = new e.Observable, r.trackpad = {
                    x: 0,
                    y: 0
                }, r.controllerType = e.PoseEnabledControllerType.WINDOWS, r._loadedMeshInfo = null, r
            }
            return __extends(r, i), Object.defineProperty(r.prototype, "onTriggerButtonStateChangedObservable", {
                get: function() {
                    return this.onTriggerStateChangedObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "onMenuButtonStateChangedObservable", {
                get: function() {
                    return this.onSecondaryButtonStateChangedObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "onGripButtonStateChangedObservable", {
                get: function() {
                    return this.onMainButtonStateChangedObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "onThumbstickButtonStateChangedObservable", {
                get: function() {
                    return this.onPadStateChangedObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "onTouchpadButtonStateChangedObservable", {
                get: function() {
                    return this.onTrackpadChangedObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "onTouchpadValuesChangedObservable", {
                get: function() {
                    return this.onTrackpadValuesChangedObservable
                },
                enumerable: !0,
                configurable: !0
            }), r.prototype.update = function() {
                if (i.prototype.update.call(this), this._loadedMeshInfo && this.browserGamepad.axes) {
                    this.browserGamepad.axes[2] == this.trackpad.x && this.browserGamepad.axes[3] == this.trackpad.y || (this.trackpad.x = this.browserGamepad.axes[2], this.trackpad.y = this.browserGamepad.axes[3], this.onTrackpadValuesChangedObservable.notifyObservers(this.trackpad));
                    for (var e = 0; e < this._mapping.axisMeshNames.length; e++) this.lerpAxisTransform(e, this.browserGamepad.axes[e])
                }
            }, r.prototype.handleButtonChange = function(e, t, i) {
                var r = this._mapping.buttons[e];
                if (r) {
                    var n = this[this._mapping.buttonObservableNames[r]];
                    n && n.notifyObservers(t), this.lerpButtonTransform(r, t.value)
                }
            }, r.prototype.lerpButtonTransform = function(t, i) {
                if (this._loadedMeshInfo) {
                    var r = this._loadedMeshInfo.buttonMeshes[t];
                    r.unpressed.rotationQuaternion && r.pressed.rotationQuaternion && r.value.rotationQuaternion && (e.Quaternion.SlerpToRef(r.unpressed.rotationQuaternion, r.pressed.rotationQuaternion, i, r.value.rotationQuaternion), e.Vector3.LerpToRef(r.unpressed.position, r.pressed.position, i, r.value.position))
                }
            }, r.prototype.lerpAxisTransform = function(t, i) {
                if (this._loadedMeshInfo) {
                    var r = this._loadedMeshInfo.axisMeshes[t];
                    if (r && r.min.rotationQuaternion && r.max.rotationQuaternion && r.value.rotationQuaternion) {
                        var n = .5 * i + .5;
                        e.Quaternion.SlerpToRef(r.min.rotationQuaternion, r.max.rotationQuaternion, n, r.value.rotationQuaternion), e.Vector3.LerpToRef(r.min.position, r.max.position, n, r.value.position)
                    }
                }
            }, r.prototype.initControllerMesh = function(t, i, n) {
                var o = this;
                void 0 === n && (n = !1);
                var s, a;
                if (e.SceneLoader.IsPluginForExtensionAvailable(".glb")) {
                    var l = "default";
                    if (this.id && !n) {
                        var c = this.id.match(r.GAMEPAD_ID_PATTERN);
                        l = c && c[0] || l
                    }
                    a = "left" === this.hand ? r.MODEL_LEFT_FILENAME : r.MODEL_RIGHT_FILENAME, s = r.MODEL_BASE_URL + l + "/"
                } else e.Tools.Warn("You need to reference GLTF loader to load Windows Motion Controllers model. Falling back to generic models"), s = e.GenericController.MODEL_BASE_URL, a = e.GenericController.MODEL_FILENAME;
                e.SceneLoader.ImportMesh("", s, a, t, (function(e) {
                    o._loadedMeshInfo = o.processModel(t, e), o._loadedMeshInfo && (o._defaultModel = o._loadedMeshInfo.rootNode, o.attachToMesh(o._defaultModel), i && i(o._defaultModel))
                }), null, (function(t, r) {
                    e.Tools.Log(r), e.Tools.Warn("Failed to retrieve controller model from the remote server: " + s + a), n || o.initControllerMesh(t, i, !0)
                }))
            }, r.prototype.processModel = function(t, i) {
                for (var r = null, n = new e.Mesh(this.id + " " + this.hand, t), o = null, s = 0; s < i.length; s++) {
                    var a = i[s];
                    if (!a.parent) {
                        a.isPickable = !1, o = a;
                        break
                    }
                }
                return o ? (o.setParent(n), r = this.createMeshInfo(n)) : e.Tools.Warn("Could not find root node in model file."), r
            }, r.prototype.createMeshInfo = function(i) {
                function r(e, t) {
                    return e.getChildMeshes(!1, (function(e) {
                        return e.name === t
                    }))[0]
                }

                function n(e, t) {
                    return e.getChildMeshes(!0, (function(e) {
                        return e.name == t
                    }))[0]
                }
                var o, s = new t;
                for (s.rootNode = i, s.buttonMeshes = {}, s.axisMeshes = {}, o = 0; o < this._mapping.buttons.length; o++) {
                    var a = this._mapping.buttonMeshNames[this._mapping.buttons[o]];
                    if (a) {
                        var l = r(i, a);
                        if (l) {
                            var c = {
                                index: o,
                                value: n(l, "VALUE"),
                                pressed: n(l, "PRESSED"),
                                unpressed: n(l, "UNPRESSED")
                            };
                            c.value && c.pressed && c.unpressed ? s.buttonMeshes[this._mapping.buttons[o]] = c : e.Tools.Warn("Missing button submesh under mesh with name: " + a + "(VALUE: " + !!c.value + ", PRESSED: " + !!c.pressed + ", UNPRESSED:" + !!c.unpressed + ")")
                        } else e.Tools.Warn("Missing button mesh with name: " + a)
                    } else e.Tools.Log("Skipping unknown button at index: " + o + " with mapped name: " + this._mapping.buttons[o])
                }
                for (o = 0; o < this._mapping.axisMeshNames.length; o++) {
                    var h = this._mapping.axisMeshNames[o];
                    if (h) {
                        var u = r(i, h);
                        if (u) {
                            var f = {
                                index: o,
                                value: n(u, "VALUE"),
                                min: n(u, "MIN"),
                                max: n(u, "MAX")
                            };
                            f.value && f.min && f.max ? s.axisMeshes[o] = f : e.Tools.Warn("Missing axis submesh under mesh with name: " + h + "(VALUE: " + !!f.value + ", MIN: " + !!f.min + ", MAX:" + !!f.max + ")")
                        } else e.Tools.Warn("Missing axis mesh with name: " + h)
                    } else e.Tools.Log("Skipping unknown axis at index: " + o)
                }
                return s.pointingPoseNode = r(i, this._mapping.pointingPoseMeshName), s.pointingPoseNode || e.Tools.Warn("Missing pointing pose mesh with name: " + this._mapping.pointingPoseMeshName), s
            }, r.prototype.getForwardRay = function(t) {
                if (void 0 === t && (t = 100), !this._loadedMeshInfo || !this._loadedMeshInfo.pointingPoseNode) return i.prototype.getForwardRay.call(this, t);
                var r = this._loadedMeshInfo.pointingPoseNode.getWorldMatrix(),
                    n = r.getTranslation(),
                    o = new e.Vector3(0, 0, -1),
                    s = e.Vector3.TransformNormal(o, r),
                    a = e.Vector3.Normalize(s);
                return new e.Ray(n, a, t)
            }, r.prototype.dispose = function() {
                i.prototype.dispose.call(this), this.onTrackpadChangedObservable.clear()
            }, r.MODEL_BASE_URL = "https://controllers.babylonjs.com/microsoft/", r.MODEL_LEFT_FILENAME = "left.glb", r.MODEL_RIGHT_FILENAME = "right.glb", r.GAMEPAD_ID_PREFIX = "Spatial Controller (Spatial Interaction Source) ", r.GAMEPAD_ID_PATTERN = /([0-9a-zA-Z]+-[0-9a-zA-Z]+)$/, r
        })(e.WebVRController);
    e.WindowsMotionController = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i) {
            var r = t.call(this, i) || this;
            return r._buttonIndexToObservableNameMap = ["onTrackpadChangedObservable", "onTriggerStateChangedObservable"], r.controllerType = e.PoseEnabledControllerType.GEAR_VR, r
        }
        return __extends(i, t), i.prototype.initControllerMesh = function(t, r) {
            var n = this;
            e.SceneLoader.ImportMesh("", i.MODEL_BASE_URL, i.MODEL_FILENAME, t, (function(e) {
                n._defaultModel = e[1], n.attachToMesh(n._defaultModel), r && r(n._defaultModel)
            }))
        }, i.prototype.handleButtonChange = function(e, t, i) {
            if (e < this._buttonIndexToObservableNameMap.length) {
                var r = this._buttonIndexToObservableNameMap[e],
                    n = this[r];
                n && n.notifyObservers(t)
            }
        }, i.MODEL_BASE_URL = "https://controllers.babylonjs.com/generic/", i.MODEL_FILENAME = "generic.babylon", i.GAMEPAD_ID_PREFIX = "Gear VR", i
    })(e.WebVRController);
    e.GearVRController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(e, i, r, n) {
            void 0 === n && (n = null);
            var o = t.call(this, e, i, r) || this;
            return o.radius = 12, o.rotationOffset = 0, o.heightOffset = 4, o.cameraAcceleration = .05, o.maxCameraSpeed = 20, o.lockedTarget = n, o
        }
        return __extends(i, t), i.prototype.getRadians = function(e) {
            return e * Math.PI / 180
        }, i.prototype.follow = function(t) {
            if (t) {
                var i;
                if (t.rotationQuaternion) {
                    var r = new e.Matrix;
                    t.rotationQuaternion.toRotationMatrix(r), i = Math.atan2(r.m[8], r.m[10])
                } else i = t.rotation.y;
                var n = this.getRadians(this.rotationOffset) + i,
                    o = t.getAbsolutePosition(),
                    s = o.x + Math.sin(n) * this.radius,
                    a = o.z + Math.cos(n) * this.radius,
                    l = s - this.position.x,
                    c = o.y + this.heightOffset - this.position.y,
                    h = a - this.position.z,
                    u = l * this.cameraAcceleration * 2,
                    f = c * this.cameraAcceleration,
                    d = h * this.cameraAcceleration * 2;
                (u > this.maxCameraSpeed || u < -this.maxCameraSpeed) && (u = u < 1 ? -this.maxCameraSpeed : this.maxCameraSpeed), (f > this.maxCameraSpeed || f < -this.maxCameraSpeed) && (f = f < 1 ? -this.maxCameraSpeed : this.maxCameraSpeed), (d > this.maxCameraSpeed || d < -this.maxCameraSpeed) && (d = d < 1 ? -this.maxCameraSpeed : this.maxCameraSpeed), this.position = new e.Vector3(this.position.x + u, this.position.y + f, this.position.z + d), this.setTarget(o)
            }
        }, i.prototype._checkInputs = function() {
            t.prototype._checkInputs.call(this), this.lockedTarget && this.follow(this.lockedTarget)
        }, i.prototype.getClassName = function() {
            return "FollowCamera"
        }, __decorate([e.serialize()], i.prototype, "radius", void 0), __decorate([e.serialize()], i.prototype, "rotationOffset", void 0), __decorate([e.serialize()], i.prototype, "heightOffset", void 0), __decorate([e.serialize()], i.prototype, "cameraAcceleration", void 0), __decorate([e.serialize()], i.prototype, "maxCameraSpeed", void 0), __decorate([e.serializeAsMeshReference("lockedTargetId")], i.prototype, "lockedTarget", void 0), i
    })(e.TargetCamera);
    e.FollowCamera = t;
    var i = (function(t) {
        function i(i, r, n, o, s, a) {
            var l = t.call(this, i, e.Vector3.Zero(), a) || this;
            return l.alpha = r, l.beta = n, l.radius = o, l.target = s, l._cartesianCoordinates = e.Vector3.Zero(), l.follow(), l
        }
        return __extends(i, t), i.prototype.follow = function() {
            if (this.target) {
                this._cartesianCoordinates.x = this.radius * Math.cos(this.alpha) * Math.cos(this.beta), this._cartesianCoordinates.y = this.radius * Math.sin(this.beta), this._cartesianCoordinates.z = this.radius * Math.sin(this.alpha) * Math.cos(this.beta);
                var e = this.target.getAbsolutePosition();
                this.position = e.add(this._cartesianCoordinates), this.setTarget(e)
            }
        }, i.prototype._checkInputs = function() {
            t.prototype._checkInputs.call(this), this.follow()
        }, i.prototype.getClassName = function() {
            return "ArcFollowCamera"
        }, i
    })(e.TargetCamera);
    e.ArcFollowCamera = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, i, r) || this;
            return n.inputs.addGamepad(), n
        }
        return __extends(t, e), Object.defineProperty(t.prototype, "gamepadAngularSensibility", {
            get: function() {
                var e = this.inputs.attached.gamepad;
                return e ? e.gamepadAngularSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.gamepad;
                t && (t.gamepadAngularSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "gamepadMoveSensibility", {
            get: function() {
                var e = this.inputs.attached.gamepad;
                return e ? e.gamepadMoveSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.gamepad;
                t && (t.gamepadMoveSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getClassName = function() {
            return "UniversalCamera"
        }, t
    })(e.TouchCamera);
    e.UniversalCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r) {
            return e.call(this, t, i, r) || this
        }
        return __extends(t, e), Object.defineProperty(t.prototype, "gamepadAngularSensibility", {
            get: function() {
                var e = this.inputs.attached.gamepad;
                return e ? e.gamepadAngularSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.gamepad;
                t && (t.gamepadAngularSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "gamepadMoveSensibility", {
            get: function() {
                var e = this.inputs.attached.gamepad;
                return e ? e.gamepadMoveSensibility : 0
            },
            set: function(e) {
                var t = this.inputs.attached.gamepad;
                t && (t.gamepadMoveSensibility = e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getClassName = function() {
            return "GamepadCamera"
        }, t
    })(e.UniversalCamera);
    e.GamepadCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._renderPipelines = {}
        }
        return e.prototype.addPipeline = function(e) {
            this._renderPipelines[e._name] = e
        }, e.prototype.attachCamerasToRenderPipeline = function(e, t, i) {
            void 0 === i && (i = !1);
            var r = this._renderPipelines[e];
            r && r._attachCameras(t, i)
        }, e.prototype.detachCamerasFromRenderPipeline = function(e, t) {
            var i = this._renderPipelines[e];
            i && i._detachCameras(t)
        }, e.prototype.enableEffectInPipeline = function(e, t, i) {
            var r = this._renderPipelines[e];
            r && r._enableEffect(t, i)
        }, e.prototype.disableEffectInPipeline = function(e, t, i) {
            var r = this._renderPipelines[e];
            r && r._disableEffect(t, i)
        }, e.prototype.update = function() {
            for (var e in this._renderPipelines)
                if (this._renderPipelines.hasOwnProperty(e)) {
                    var t = this._renderPipelines[e];
                    t.isSupported ? t._update() : (t.dispose(), delete this._renderPipelines[e])
                }
        }, e.prototype._rebuild = function() {
            for (var e in this._renderPipelines)
                if (this._renderPipelines.hasOwnProperty(e)) {
                    var t = this._renderPipelines[e];
                    t._rebuild()
                }
        }, e.prototype.dispose = function() {
            for (var e in this._renderPipelines)
                if (this._renderPipelines.hasOwnProperty(e)) {
                    var t = this._renderPipelines[e];
                    t.dispose()
                }
        }, e
    })();
    e.PostProcessRenderPipelineManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i, r) {
            this._name = t, this._singleInstance = r || !0, this._getPostProcesses = i, this._cameras = {}, this._indicesForCamera = {}, this._postProcesses = {}
        }
        return Object.defineProperty(t.prototype, "isSupported", {
            get: function() {
                for (var e in this._postProcesses)
                    for (var t in this._postProcesses[e])
                        if (!this._postProcesses[e][t].isSupported) return !1;
                return !0
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._update = function() {}, t.prototype._attachCameras = function(t) {
            var i, r = this,
                n = e.Tools.MakeArray(t || this._cameras);
            if (n)
                for (var o = 0; o < n.length; o++) {
                    var s = n[o],
                        a = s.name;
                    if (i = this._singleInstance ? 0 : a, !this._postProcesses[i]) {
                        var l = this._getPostProcesses();
                        l && (this._postProcesses[i] = Array.isArray(l) ? l : [l])
                    }
                    this._indicesForCamera[a] || (this._indicesForCamera[a] = []), this._postProcesses[i].forEach((function(e) {
                        var t = s.attachPostProcess(e);
                        r._indicesForCamera[a].push(t)
                    })), this._cameras[a] || (this._cameras[a] = s)
                }
        }, t.prototype._detachCameras = function(t) {
            var i = e.Tools.MakeArray(t || this._cameras);
            if (i)
                for (var r = 0; r < i.length; r++) {
                    var n = i[r],
                        o = n.name;
                    this._postProcesses[this._singleInstance ? 0 : o].forEach((function(e) {
                        n.detachPostProcess(e)
                    })), this._cameras[o] && (this._cameras[o] = null)
                }
        }, t.prototype._enable = function(t) {
            var i = this,
                r = e.Tools.MakeArray(t || this._cameras);
            if (r)
                for (var n = 0; n < r.length; n++)
                    for (var o = r[n], s = o.name, a = 0; a < this._indicesForCamera[s].length; a++) void 0 === o._postProcesses[this._indicesForCamera[s][a]] && this._postProcesses[this._singleInstance ? 0 : s].forEach((function(e) {
                        r[n].attachPostProcess(e, i._indicesForCamera[s][a])
                    }))
        }, t.prototype._disable = function(t) {
            var i = e.Tools.MakeArray(t || this._cameras);
            if (i)
                for (var r = 0; r < i.length; r++) {
                    var n = i[r],
                        o = n.name;
                    this._postProcesses[this._singleInstance ? 0 : o].forEach((function(e) {
                        n.detachPostProcess(e)
                    }))
                }
        }, t.prototype.getPostProcesses = function(e) {
            return this._singleInstance ? this._postProcesses[0] : e ? this._postProcesses[e.name] : null
        }, t
    })();
    e.PostProcessRenderEffect = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t) {
            this.engine = e, this._name = t, this._renderEffects = {}, this._renderEffectsForIsolatedPass = new Array, this._cameras = []
        }
        return t.prototype.getClassName = function() {
            return "PostProcessRenderPipeline"
        }, Object.defineProperty(t.prototype, "isSupported", {
            get: function() {
                for (var e in this._renderEffects)
                    if (this._renderEffects.hasOwnProperty(e) && !this._renderEffects[e].isSupported) return !1;
                return !0
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.addEffect = function(e) {
            this._renderEffects[e._name] = e
        }, t.prototype._rebuild = function() {}, t.prototype._enableEffect = function(t, i) {
            var r = this._renderEffects[t];
            r && r._enable(e.Tools.MakeArray(i || this._cameras))
        }, t.prototype._disableEffect = function(t, i) {
            var r = this._renderEffects[t];
            r && r._disable(e.Tools.MakeArray(i || this._cameras))
        }, t.prototype._attachCameras = function(t, i) {
            var r = e.Tools.MakeArray(t || this._cameras);
            if (r) {
                var n, o = [];
                for (n = 0; n < r.length; n++) {
                    var s = r[n],
                        a = s.name; - 1 === this._cameras.indexOf(s) ? this._cameras[a] = s : i && o.push(n)
                }
                for (n = 0; n < o.length; n++) t.splice(o[n], 1);
                for (var l in this._renderEffects) this._renderEffects.hasOwnProperty(l) && this._renderEffects[l]._attachCameras(r)
            }
        }, t.prototype._detachCameras = function(t) {
            var i = e.Tools.MakeArray(t || this._cameras);
            if (i) {
                for (var r in this._renderEffects) this._renderEffects.hasOwnProperty(r) && this._renderEffects[r]._detachCameras(i);
                for (var n = 0; n < i.length; n++) this._cameras.splice(this._cameras.indexOf(i[n]), 1)
            }
        }, t.prototype._update = function() {
            for (var e in this._renderEffects) this._renderEffects.hasOwnProperty(e) && this._renderEffects[e]._update();
            for (var t = 0; t < this._cameras.length; t++) {
                var i = this._cameras[t].name;
                this._renderEffectsForIsolatedPass[i] && this._renderEffectsForIsolatedPass[i]._update()
            }
        }, t.prototype._reset = function() {
            this._renderEffects = {}, this._renderEffectsForIsolatedPass = new Array
        }, t.prototype._enableMSAAOnFirstPostProcess = function() {
            var e = Object.keys(this._renderEffects);
            if (this.engine.webGLVersion >= 2 && e.length > 0) {
                var t = this._renderEffects[e[0]].getPostProcesses();
                if (t) return t[0].samples = 4, !0
            }
            return !1
        }, t.prototype.dispose = function() {}, __decorate([e.serialize()], t.prototype, "_name", void 0), t
    })();
    e.PostProcessRenderPipeline = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            void 0 === i && (i = e.Engine.TEXTURETYPE_FLOAT), void 0 === r && (r = null);
            var n = this;
            this._scene = t, this._camera = r;
            var o = t.getEngine();
            this._depthMap = new e.RenderTargetTexture("depthMap", {
                width: o.getRenderWidth(),
                height: o.getRenderHeight()
            }, this._scene, !1, !0, i), this._depthMap.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._depthMap.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._depthMap.refreshRate = 1, this._depthMap.renderParticles = !1, this._depthMap.renderList = null, this._depthMap.activeCamera = this._camera, this._depthMap.ignoreCameraViewport = !0, this._depthMap.useCameraPostProcesses = !1, this._depthMap.onClearObservable.add((function(t) {
                t.clear(new e.Color4(1, 1, 1, 1), !0, !0, !0)
            }));
            var s = function(t) {
                var i = t.getRenderingMesh(),
                    r = n._scene,
                    o = r.getEngine(),
                    s = t.getMaterial();
                if (s) {
                    o.setState(s.backFaceCulling, 0, !1, r.useRightHandedSystem);
                    var a = i._getInstancesRenderList(t._id);
                    if (!a.mustReturn) {
                        var l = o.getCaps().instancedArrays && null !== a.visibleInstances[t._id],
                            c = n._camera || r.activeCamera;
                        if (n.isReady(t, l) && c) {
                            if (o.enableEffect(n._effect), i._bind(t, n._effect, e.Material.TriangleFillMode), n._effect.setMatrix("viewProjection", r.getTransformMatrix()), n._effect.setFloat2("depthValues", c.minZ, c.minZ + c.maxZ), s && s.needAlphaTesting()) {
                                var h = s.getAlphaTestTexture();
                                h && (n._effect.setTexture("diffuseSampler", h), n._effect.setMatrix("diffuseMatrix", h.getTextureMatrix()))
                            }
                            i.useBones && i.computeBonesUsingShaders && i.skeleton && n._effect.setMatrices("mBones", i.skeleton.getTransformMatrices(i)), i._processRendering(t, n._effect, e.Material.TriangleFillMode, a, l, (function(e, t) {
                                return n._effect.setMatrix("world", t)
                            }))
                        }
                    }
                }
            };
            this._depthMap.customRenderFunction = function(e, t, i, r) {
                var n;
                if (r.length) {
                    for (o.setColorWrite(!1), n = 0; n < r.length; n++) s(r.data[n]);
                    o.setColorWrite(!0)
                }
                for (n = 0; n < e.length; n++) s(e.data[n]);
                for (n = 0; n < t.length; n++) s(t.data[n])
            }
        }
        return t.prototype.isReady = function(t, i) {
            var r = t.getMaterial();
            if (r.disableDepthWrite) return !1;
            var n = [],
                o = [e.VertexBuffer.PositionKind],
                s = t.getMesh();
            r && r.needAlphaTesting() && (n.push("#define ALPHATEST"), s.isVerticesDataPresent(e.VertexBuffer.UVKind) && (o.push(e.VertexBuffer.UVKind), n.push("#define UV1")), s.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && (o.push(e.VertexBuffer.UV2Kind), n.push("#define UV2"))), s.useBones && s.computeBonesUsingShaders ? (o.push(e.VertexBuffer.MatricesIndicesKind), o.push(e.VertexBuffer.MatricesWeightsKind), s.numBoneInfluencers > 4 && (o.push(e.VertexBuffer.MatricesIndicesExtraKind), o.push(e.VertexBuffer.MatricesWeightsExtraKind)), n.push("#define NUM_BONE_INFLUENCERS " + s.numBoneInfluencers), n.push("#define BonesPerMesh " + (s.skeleton ? s.skeleton.bones.length + 1 : 0))) : n.push("#define NUM_BONE_INFLUENCERS 0"), i && (n.push("#define INSTANCES"), o.push("world0"), o.push("world1"), o.push("world2"), o.push("world3"));
            var a = n.join("\n");
            return this._cachedDefines !== a && (this._cachedDefines = a, this._effect = this._scene.getEngine().createEffect("depth", o, ["world", "mBones", "viewProjection", "diffuseMatrix", "depthValues"], ["diffuseSampler"], a)), this._effect.isReady()
        }, t.prototype.getDepthMap = function() {
            return this._depthMap
        }, t.prototype.dispose = function() {
            this._depthMap.dispose()
        }, t
    })();
    e.DepthRenderer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, r.getEngine(), i) || this;
            s.SSAOOriginalSceneColorEffect = "SSAOOriginalSceneColorEffect", s.SSAORenderEffect = "SSAORenderEffect", s.SSAOBlurHRenderEffect = "SSAOBlurHRenderEffect", s.SSAOBlurVRenderEffect = "SSAOBlurVRenderEffect", s.SSAOCombineRenderEffect = "SSAOCombineRenderEffect", s.totalStrength = 1, s.radius = 1e-4, s.area = .0075, s.fallOff = 1e-6, s.base = .5, s._firstUpdate = !0, s._scene = r, s._createRandomTexture(), s._depthTexture = r.enableDepthRenderer().getDepthMap();
            var a = n.ssaoRatio || n,
                l = n.combineRatio || n;
            return s._originalColorPostProcess = new e.PassPostProcess("SSAOOriginalSceneColor", l, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1), s._createSSAOPostProcess(a), s._createBlurPostProcess(a), s._createSSAOCombinePostProcess(l), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOOriginalSceneColorEffect, function() {
                return s._originalColorPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAORenderEffect, function() {
                return s._ssaoPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOBlurHRenderEffect, function() {
                return s._blurHPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOBlurVRenderEffect, function() {
                return s._blurVPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOCombineRenderEffect, function() {
                return s._ssaoCombinePostProcess
            }, !0)), r.postProcessRenderPipelineManager.addPipeline(s), o && r.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(i, o), s
        }
        return __extends(i, t), i.prototype.dispose = function(e) {
            void 0 === e && (e = !1);
            for (var i = 0; i < this._scene.cameras.length; i++) {
                var r = this._scene.cameras[i];
                this._originalColorPostProcess.dispose(r), this._ssaoPostProcess.dispose(r), this._blurHPostProcess.dispose(r), this._blurVPostProcess.dispose(r), this._ssaoCombinePostProcess.dispose(r)
            }
            this._randomTexture.dispose(), e && this._scene.disableDepthRenderer(), this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._scene.cameras), t.prototype.dispose.call(this)
        }, i.prototype._createBlurPostProcess = function(t) {
            var i = this;
            this._blurHPostProcess = new e.BlurPostProcess("BlurH", new e.Vector2(1, 0), 16, t, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_UNSIGNED_INT), this._blurVPostProcess = new e.BlurPostProcess("BlurV", new e.Vector2(0, 1), 16, t, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_UNSIGNED_INT), this._blurHPostProcess.onActivateObservable.add((function() {
                var e = i._blurHPostProcess.width / i._scene.getEngine().getRenderWidth();
                i._blurHPostProcess.kernel = 16 * e
            })), this._blurVPostProcess.onActivateObservable.add((function() {
                var e = i._blurVPostProcess.height / i._scene.getEngine().getRenderHeight();
                i._blurVPostProcess.kernel = 16 * e
            }))
        }, i.prototype._rebuild = function() {
            this._firstUpdate = !0, t.prototype._rebuild.call(this)
        }, i.prototype._createSSAOPostProcess = function(t) {
            var i = this,
                r = [.5381, .1856, -.4319, .1379, .2486, .443, .3371, .5679, -.0057, -.6999, -.0451, -.0019, .0689, -.1598, -.8547, .056, .0069, -.1843, -.0146, .1402, .0762, .01, -.1924, -.0344, -.3577, -.5301, -.4358, -.3169, .1063, .0158, .0103, -.5869, .0046, -.0897, -.494, .3287, .7119, -.0154, -.0918, -.0533, .0596, -.5411, .0352, -.0631, .546, -.4776, .2847, -.0271];
            this._ssaoPostProcess = new e.PostProcess("ssao", "ssao", ["sampleSphere", "samplesFactor", "randTextureTiles", "totalStrength", "radius", "area", "fallOff", "base", "range", "viewport"], ["randomSampler"], t, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, "#define SAMPLES 16\n#define SSAO"), this._ssaoPostProcess.onApply = function(e) {
                i._firstUpdate && (e.setArray3("sampleSphere", r), e.setFloat("samplesFactor", 1 / 16), e.setFloat("randTextureTiles", 4)), e.setFloat("totalStrength", i.totalStrength), e.setFloat("radius", i.radius), e.setFloat("area", i.area), e.setFloat("fallOff", i.fallOff), e.setFloat("base", i.base), e.setTexture("textureSampler", i._depthTexture), e.setTexture("randomSampler", i._randomTexture)
            }
        }, i.prototype._createSSAOCombinePostProcess = function(t) {
            var i = this;
            this._ssaoCombinePostProcess = new e.PostProcess("ssaoCombine", "ssaoCombine", [], ["originalColor"], t, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1), this._ssaoCombinePostProcess.onApply = function(e) {
                e.setTextureFromPostProcess("originalColor", i._originalColorPostProcess)
            }
        }, i.prototype._createRandomTexture = function() {
            this._randomTexture = new e.DynamicTexture("SSAORandomTexture", 512, this._scene, !1, e.Texture.TRILINEAR_SAMPLINGMODE), this._randomTexture.wrapU = e.Texture.WRAP_ADDRESSMODE, this._randomTexture.wrapV = e.Texture.WRAP_ADDRESSMODE;
            for (var t = this._randomTexture.getContext(), i = function(e, t) {
                    return Math.random() * (t - e) + e
                }, r = e.Vector3.Zero(), n = 0; n < 512; n++)
                for (var o = 0; o < 512; o++) r.x = Math.floor(255 * i(-1, 1)), r.y = Math.floor(255 * i(-1, 1)), r.z = Math.floor(255 * i(-1, 1)), t.fillStyle = "rgb(" + r.x + ", " + r.y + ", " + r.z + ")", t.fillRect(n, o, 1, 1);
            this._randomTexture.update(!1)
        }, __decorate([e.serialize()], i.prototype, "totalStrength", void 0), __decorate([e.serialize()], i.prototype, "radius", void 0), __decorate([e.serialize()], i.prototype, "area", void 0), __decorate([e.serialize()], i.prototype, "fallOff", void 0), __decorate([e.serialize()], i.prototype, "base", void 0), i
    })(e.PostProcessRenderPipeline);
    e.SSAORenderingPipeline = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, r.getEngine(), i) || this;
            if (s.SSAOOriginalSceneColorEffect = "SSAOOriginalSceneColorEffect", s.SSAORenderEffect = "SSAORenderEffect", s.SSAOBlurHRenderEffect = "SSAOBlurHRenderEffect", s.SSAOBlurVRenderEffect = "SSAOBlurVRenderEffect", s.SSAOCombineRenderEffect = "SSAOCombineRenderEffect", s.totalStrength = 1, s.maxZ = 100, s.minZAspect = .2, s._samples = 8, s._expensiveBlur = !0, s.radius = 2, s.base = .1, s._firstUpdate = !0, s._scene = r, !s.isSupported) return e.Tools.Error("SSAO 2 needs WebGL 2 support."), s;
            var a = n.ssaoRatio || n,
                l = n.blurRatio || n,
                c = r.enableGeometryBufferRenderer();
            return s._createRandomTexture(), s._depthTexture = c.getGBuffer().textures[0], s._normalTexture = c.getGBuffer().textures[1], s._originalColorPostProcess = new e.PassPostProcess("SSAOOriginalSceneColor", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1), s._createSSAOPostProcess(1), s._createBlurPostProcess(a, l), s._createSSAOCombinePostProcess(l), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOOriginalSceneColorEffect, function() {
                return s._originalColorPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAORenderEffect, function() {
                return s._ssaoPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOBlurHRenderEffect, function() {
                return s._blurHPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOBlurVRenderEffect, function() {
                return s._blurVPostProcess
            }, !0)), s.addEffect(new e.PostProcessRenderEffect(r.getEngine(), s.SSAOCombineRenderEffect, function() {
                return s._ssaoCombinePostProcess
            }, !0)), r.postProcessRenderPipelineManager.addPipeline(s), o && r.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(i, o), s
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "samples", {
                get: function() {
                    return this._samples
                },
                set: function(e) {
                    this._ssaoPostProcess.updateEffect("#define SAMPLES " + e + "\n#define SSAO"), this._samples = e, this._sampleSphere = this._generateHemisphere(), this._firstUpdate = !0
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "expensiveBlur", {
                get: function() {
                    return this._expensiveBlur
                },
                set: function(e) {
                    this._blurHPostProcess.updateEffect("#define BILATERAL_BLUR\n#define BILATERAL_BLUR_H\n#define SAMPLES 16\n#define EXPENSIVE " + (e ? "1" : "0") + "\n", null, ["textureSampler", "depthSampler"]), this._blurVPostProcess.updateEffect("#define BILATERAL_BLUR\n#define SAMPLES 16\n#define EXPENSIVE " + (e ? "1" : "0") + "\n", null, ["textureSampler", "depthSampler"]), this._expensiveBlur = e, this._firstUpdate = !0
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i, "IsSupported", {
                get: function() {
                    var t = e.Engine.LastCreatedEngine;
                    return !!t && t.getCaps().drawBuffersExtension
                },
                enumerable: !0,
                configurable: !0
            }), i.prototype.dispose = function(e) {
                void 0 === e && (e = !1);
                for (var i = 0; i < this._scene.cameras.length; i++) {
                    var r = this._scene.cameras[i];
                    this._originalColorPostProcess.dispose(r), this._ssaoPostProcess.dispose(r), this._blurHPostProcess.dispose(r), this._blurVPostProcess.dispose(r), this._ssaoCombinePostProcess.dispose(r)
                }
                this._randomTexture.dispose(), e && this._scene.disableGeometryBufferRenderer(), this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._scene.cameras), t.prototype.dispose.call(this)
            }, i.prototype._createBlurPostProcess = function(t, i) {
                var r = this;
                this._samplerOffsets = [];
                for (var n = this.expensiveBlur, o = -8; o < 8; o++) this._samplerOffsets.push(2 * o + .5);
                this._blurHPostProcess = new e.PostProcess("BlurH", "ssao2", ["outSize", "samplerOffsets", "near", "far", "radius"], ["depthSampler"], t, null, e.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, "#define BILATERAL_BLUR\n#define BILATERAL_BLUR_H\n#define SAMPLES 16\n#define EXPENSIVE " + (n ? "1" : "0") + "\n"), this._blurHPostProcess.onApply = function(e) {
                    r._scene.activeCamera && (e.setFloat("outSize", r._ssaoCombinePostProcess.width > 0 ? r._ssaoCombinePostProcess.width : r._originalColorPostProcess.width), e.setFloat("near", r._scene.activeCamera.minZ), e.setFloat("far", r._scene.activeCamera.maxZ), e.setFloat("radius", r.radius), e.setTexture("depthSampler", r._depthTexture), r._firstUpdate && e.setArray("samplerOffsets", r._samplerOffsets))
                }, this._blurVPostProcess = new e.PostProcess("BlurV", "ssao2", ["outSize", "samplerOffsets", "near", "far", "radius"], ["depthSampler"], i, null, e.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, "#define BILATERAL_BLUR\n#define BILATERAL_BLUR_V\n#define SAMPLES 16\n#define EXPENSIVE " + (n ? "1" : "0") + "\n"), this._blurVPostProcess.onApply = function(e) {
                    r._scene.activeCamera && (e.setFloat("outSize", r._ssaoCombinePostProcess.height > 0 ? r._ssaoCombinePostProcess.height : r._originalColorPostProcess.height), e.setFloat("near", r._scene.activeCamera.minZ), e.setFloat("far", r._scene.activeCamera.maxZ), e.setFloat("radius", r.radius), e.setTexture("depthSampler", r._depthTexture), r._firstUpdate && (e.setArray("samplerOffsets", r._samplerOffsets), r._firstUpdate = !1))
                }
            }, i.prototype._rebuild = function() {
                this._firstUpdate = !0, t.prototype._rebuild.call(this)
            }, i.prototype._generateHemisphere = function() {
                for (var t, i, r = this.samples, n = [], o = function(e, t) {
                        return Math.random() * (t - e) + e
                    }, s = 0; s < r;) t = new e.Vector3(o(-1, 1), o(-1, 1), o(.3, 1)), t.normalize(), i = s / r, i = e.Scalar.Lerp(.1, 1, i * i), t.scaleInPlace(i), n.push(t.x, t.y, t.z), s++;
                return n
            }, i.prototype._createSSAOPostProcess = function(t) {
                var i = this,
                    r = this.samples;
                this._sampleSphere = this._generateHemisphere(), this._ssaoPostProcess = new e.PostProcess("ssao2", "ssao2", ["sampleSphere", "samplesFactor", "randTextureTiles", "totalStrength", "radius", "base", "range", "projection", "near", "far", "texelSize", "xViewport", "yViewport", "maxZ", "minZAspect"], ["randomSampler", "normalSampler"], t, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, "#define SAMPLES " + r + "\n#define SSAO"), this._ssaoPostProcess.onApply = function(e) {
                    i._firstUpdate && (e.setArray3("sampleSphere", i._sampleSphere), e.setFloat("randTextureTiles", 4)), i._scene.activeCamera && (e.setFloat("samplesFactor", 1 / i.samples), e.setFloat("totalStrength", i.totalStrength), e.setFloat2("texelSize", 1 / i._ssaoPostProcess.width, 1 / i._ssaoPostProcess.height), e.setFloat("radius", i.radius), e.setFloat("maxZ", i.maxZ), e.setFloat("minZAspect", i.minZAspect), e.setFloat("base", i.base), e.setFloat("near", i._scene.activeCamera.minZ), e.setFloat("far", i._scene.activeCamera.maxZ), e.setFloat("xViewport", Math.tan(i._scene.activeCamera.fov / 2) * i._scene.getEngine().getAspectRatio(i._scene.activeCamera, !0)), e.setFloat("yViewport", Math.tan(i._scene.activeCamera.fov / 2)), e.setMatrix("projection", i._scene.getProjectionMatrix()), e.setTexture("textureSampler", i._depthTexture), e.setTexture("normalSampler", i._normalTexture), e.setTexture("randomSampler", i._randomTexture))
                }
            }, i.prototype._createSSAOCombinePostProcess = function(t) {
                var i = this;
                this._ssaoCombinePostProcess = new e.PostProcess("ssaoCombine", "ssaoCombine", [], ["originalColor"], t, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1), this._ssaoCombinePostProcess.onApply = function(e) {
                    e.setTextureFromPostProcess("originalColor", i._originalColorPostProcess)
                }
            }, i.prototype._createRandomTexture = function() {
                this._randomTexture = new e.DynamicTexture("SSAORandomTexture", 512, this._scene, !1, e.Texture.TRILINEAR_SAMPLINGMODE), this._randomTexture.wrapU = e.Texture.WRAP_ADDRESSMODE, this._randomTexture.wrapV = e.Texture.WRAP_ADDRESSMODE;
                for (var t = this._randomTexture.getContext(), i = function(e, t) {
                        return Math.random() * (t - e) + e
                    }, r = e.Vector3.Zero(), n = 0; n < 512; n++)
                    for (var o = 0; o < 512; o++) r.x = i(0, 1), r.y = i(0, 1), r.z = 0, r.normalize(), r.scaleInPlace(255), r.x = Math.floor(r.x), r.y = Math.floor(r.y), t.fillStyle = "rgb(" + r.x + ", " + r.y + ", " + r.z + ")", t.fillRect(n, o, 1, 1);
                this._randomTexture.update(!1)
            }, __decorate([e.serialize()], i.prototype, "totalStrength", void 0), __decorate([e.serialize()], i.prototype, "maxZ", void 0), __decorate([e.serialize()], i.prototype, "minZAspect", void 0), __decorate([e.serialize("samples")], i.prototype, "_samples", void 0),
            __decorate([e.serialize("expensiveBlur")], i.prototype, "_expensiveBlur", void 0), __decorate([e.serialize()], i.prototype, "radius", void 0), __decorate([e.serialize()], i.prototype, "base", void 0), i
    })(e.PostProcessRenderPipeline);
    e.SSAO2RenderingPipeline = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s) {
            void 0 === o && (o = 1);
            var a = t.call(this, n.getEngine(), i) || this;
            return a.LensChromaticAberrationEffect = "LensChromaticAberrationEffect", a.HighlightsEnhancingEffect = "HighlightsEnhancingEffect", a.LensDepthOfFieldEffect = "LensDepthOfFieldEffect", a._scene = n, a._depthTexture = n.enableDepthRenderer().getDepthMap(), r.grain_texture ? a._grainTexture = r.grain_texture : a._createGrainTexture(), a._edgeBlur = r.edge_blur ? r.edge_blur : 0, a._grainAmount = r.grain_amount ? r.grain_amount : 0, a._chromaticAberration = r.chromatic_aberration ? r.chromatic_aberration : 0, a._distortion = r.distortion ? r.distortion : 0, a._highlightsGain = void 0 !== r.dof_gain ? r.dof_gain : -1, a._highlightsThreshold = r.dof_threshold ? r.dof_threshold : 1, a._dofDistance = void 0 !== r.dof_focus_distance ? r.dof_focus_distance : -1, a._dofAperture = r.dof_aperture ? r.dof_aperture : 1, a._dofDarken = r.dof_darken ? r.dof_darken : 0, a._dofPentagon = void 0 === r.dof_pentagon || r.dof_pentagon, a._blurNoise = void 0 === r.blur_noise || r.blur_noise, a._createChromaticAberrationPostProcess(o), a._createHighlightsPostProcess(o), a._createDepthOfFieldPostProcess(o / 4), a.addEffect(new e.PostProcessRenderEffect(n.getEngine(), a.LensChromaticAberrationEffect, function() {
                return a._chromaticAberrationPostProcess
            }, !0)), a.addEffect(new e.PostProcessRenderEffect(n.getEngine(), a.HighlightsEnhancingEffect, function() {
                return a._highlightsPostProcess
            }, !0)), a.addEffect(new e.PostProcessRenderEffect(n.getEngine(), a.LensDepthOfFieldEffect, function() {
                return a._depthOfFieldPostProcess
            }, !0)), -1 === a._highlightsGain && a._disableEffect(a.HighlightsEnhancingEffect, null), n.postProcessRenderPipelineManager.addPipeline(a), s && n.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(i, s), a
        }
        return __extends(i, t), i.prototype.setEdgeBlur = function(e) {
            this._edgeBlur = e
        }, i.prototype.disableEdgeBlur = function() {
            this._edgeBlur = 0
        }, i.prototype.setGrainAmount = function(e) {
            this._grainAmount = e
        }, i.prototype.disableGrain = function() {
            this._grainAmount = 0
        }, i.prototype.setChromaticAberration = function(e) {
            this._chromaticAberration = e
        }, i.prototype.disableChromaticAberration = function() {
            this._chromaticAberration = 0
        }, i.prototype.setEdgeDistortion = function(e) {
            this._distortion = e
        }, i.prototype.disableEdgeDistortion = function() {
            this._distortion = 0
        }, i.prototype.setFocusDistance = function(e) {
            this._dofDistance = e
        }, i.prototype.disableDepthOfField = function() {
            this._dofDistance = -1
        }, i.prototype.setAperture = function(e) {
            this._dofAperture = e
        }, i.prototype.setDarkenOutOfFocus = function(e) {
            this._dofDarken = e
        }, i.prototype.enablePentagonBokeh = function() {
            this._highlightsPostProcess.updateEffect("#define PENTAGON\n")
        }, i.prototype.disablePentagonBokeh = function() {
            this._highlightsPostProcess.updateEffect()
        }, i.prototype.enableNoiseBlur = function() {
            this._blurNoise = !0
        }, i.prototype.disableNoiseBlur = function() {
            this._blurNoise = !1
        }, i.prototype.setHighlightsGain = function(e) {
            this._highlightsGain = e
        }, i.prototype.setHighlightsThreshold = function(e) {
            -1 === this._highlightsGain && (this._highlightsGain = 1), this._highlightsThreshold = e
        }, i.prototype.disableHighlights = function() {
            this._highlightsGain = -1
        }, i.prototype.dispose = function(e) {
            void 0 === e && (e = !1), this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._scene.cameras), this._chromaticAberrationPostProcess = null, this._highlightsPostProcess = null, this._depthOfFieldPostProcess = null, this._grainTexture.dispose(), e && this._scene.disableDepthRenderer()
        }, i.prototype._createChromaticAberrationPostProcess = function(t) {
            var i = this;
            this._chromaticAberrationPostProcess = new e.PostProcess("LensChromaticAberration", "chromaticAberration", ["chromatic_aberration", "screen_width", "screen_height"], [], t, null, e.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1), this._chromaticAberrationPostProcess.onApply = function(e) {
                e.setFloat("chromatic_aberration", i._chromaticAberration), e.setFloat("screen_width", i._scene.getEngine().getRenderWidth()), e.setFloat("screen_height", i._scene.getEngine().getRenderHeight())
            }
        }, i.prototype._createHighlightsPostProcess = function(t) {
            var i = this;
            this._highlightsPostProcess = new e.PostProcess("LensHighlights", "lensHighlights", ["gain", "threshold", "screen_width", "screen_height"], [], t, null, e.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, this._dofPentagon ? "#define PENTAGON\n" : ""), this._highlightsPostProcess.onApply = function(e) {
                e.setFloat("gain", i._highlightsGain), e.setFloat("threshold", i._highlightsThreshold), e.setTextureFromPostProcess("textureSampler", i._chromaticAberrationPostProcess), e.setFloat("screen_width", i._scene.getEngine().getRenderWidth()), e.setFloat("screen_height", i._scene.getEngine().getRenderHeight())
            }
        }, i.prototype._createDepthOfFieldPostProcess = function(t) {
            var i = this;
            this._depthOfFieldPostProcess = new e.PostProcess("LensDepthOfField", "depthOfField", ["grain_amount", "blur_noise", "screen_width", "screen_height", "distortion", "dof_enabled", "screen_distance", "aperture", "darken", "edge_blur", "highlights", "near", "far"], ["depthSampler", "grainSampler", "highlightsSampler"], t, null, e.Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1), this._depthOfFieldPostProcess.onApply = function(e) {
                e.setTexture("depthSampler", i._depthTexture), e.setTexture("grainSampler", i._grainTexture), e.setTextureFromPostProcess("textureSampler", i._highlightsPostProcess), e.setTextureFromPostProcess("highlightsSampler", i._depthOfFieldPostProcess), e.setFloat("grain_amount", i._grainAmount), e.setBool("blur_noise", i._blurNoise), e.setFloat("screen_width", i._scene.getEngine().getRenderWidth()), e.setFloat("screen_height", i._scene.getEngine().getRenderHeight()), e.setFloat("distortion", i._distortion), e.setBool("dof_enabled", -1 !== i._dofDistance), e.setFloat("screen_distance", 1 / (.1 - 1 / i._dofDistance)), e.setFloat("aperture", i._dofAperture), e.setFloat("darken", i._dofDarken), e.setFloat("edge_blur", i._edgeBlur), e.setBool("highlights", -1 !== i._highlightsGain), i._scene.activeCamera && (e.setFloat("near", i._scene.activeCamera.minZ), e.setFloat("far", i._scene.activeCamera.maxZ))
            }
        }, i.prototype._createGrainTexture = function() {
            this._grainTexture = new e.DynamicTexture("LensNoiseTexture", 512, this._scene, !1, e.Texture.BILINEAR_SAMPLINGMODE), this._grainTexture.wrapU = e.Texture.WRAP_ADDRESSMODE, this._grainTexture.wrapV = e.Texture.WRAP_ADDRESSMODE;
            for (var t, i = this._grainTexture.getContext(), r = 0; r < 512; r++)
                for (var n = 0; n < 512; n++) t = Math.floor(255 * (function(e, t) {
                    return Math.random() * (t - e) + e
                })(.42, .58)), i.fillStyle = "rgb(" + t + ", " + t + ", " + t + ")", i.fillRect(r, n, 1, 1);
            this._grainTexture.update(!1)
        }, i
    })(e.PostProcessRenderPipeline);
    e.LensRenderingPipeline = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s) {
            void 0 === o && (o = null);
            var a = t.call(this, r.getEngine(), i) || this;
            return a.downSampleX4PostProcess = null, a.brightPassPostProcess = null, a.blurHPostProcesses = [], a.blurVPostProcesses = [], a.textureAdderPostProcess = null, a.volumetricLightPostProcess = null, a.volumetricLightSmoothXPostProcess = null, a.volumetricLightSmoothYPostProcess = null, a.volumetricLightMergePostProces = null, a.volumetricLightFinalPostProcess = null, a.luminancePostProcess = null, a.luminanceDownSamplePostProcesses = [], a.hdrPostProcess = null, a.textureAdderFinalPostProcess = null, a.lensFlareFinalPostProcess = null, a.hdrFinalPostProcess = null, a.lensFlarePostProcess = null, a.lensFlareComposePostProcess = null, a.motionBlurPostProcess = null, a.depthOfFieldPostProcess = null, a.brightThreshold = 1, a.blurWidth = 512, a.horizontalBlur = !1, a.exposure = 1, a.lensTexture = null, a.volumetricLightCoefficient = .2, a.volumetricLightPower = 4, a.volumetricLightBlurScale = 64, a.sourceLight = null, a.hdrMinimumLuminance = 1, a.hdrDecreaseRate = .5, a.hdrIncreaseRate = .5, a.lensColorTexture = null, a.lensFlareStrength = 20, a.lensFlareGhostDispersal = 1.4, a.lensFlareHaloWidth = .7, a.lensFlareDistortionStrength = 16, a.lensStarTexture = null, a.lensFlareDirtTexture = null, a.depthOfFieldDistance = 10, a.depthOfFieldBlurWidth = 64, a.motionStrength = 1, a.animations = [], a._currentDepthOfFieldSource = null, a._hdrCurrentLuminance = 1, a._bloomEnabled = !0, a._depthOfFieldEnabled = !1, a._vlsEnabled = !1, a._lensFlareEnabled = !1, a._hdrEnabled = !1, a._motionBlurEnabled = !1, a._motionBlurSamples = 64, a._volumetricLightStepsCount = 50, a._cameras = s || [], a._scene = r, a._basePostProcess = o, a._ratio = n, a._floatTextureType = r.getEngine().getCaps().textureFloatRender ? e.Engine.TEXTURETYPE_FLOAT : e.Engine.TEXTURETYPE_HALF_FLOAT, r.postProcessRenderPipelineManager.addPipeline(a), a._buildPipeline(), a
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "BloomEnabled", {
            get: function() {
                return this._bloomEnabled
            },
            set: function(e) {
                this._bloomEnabled !== e && (this._bloomEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "DepthOfFieldEnabled", {
            get: function() {
                return this._depthOfFieldEnabled
            },
            set: function(e) {
                this._depthOfFieldEnabled !== e && (this._depthOfFieldEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "LensFlareEnabled", {
            get: function() {
                return this._lensFlareEnabled
            },
            set: function(e) {
                this._lensFlareEnabled !== e && (this._lensFlareEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "HDREnabled", {
            get: function() {
                return this._hdrEnabled
            },
            set: function(e) {
                this._hdrEnabled !== e && (this._hdrEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "VLSEnabled", {
            get: function() {
                return this._vlsEnabled
            },
            set: function(t) {
                if (this._vlsEnabled !== t) {
                    if (t) {
                        if (!this._scene.enableGeometryBufferRenderer()) return void e.Tools.Warn("Geometry renderer is not supported, cannot create volumetric lights in Standard Rendering Pipeline")
                    }
                    this._vlsEnabled = t, this._buildPipeline()
                }
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "MotionBlurEnabled", {
            get: function() {
                return this._motionBlurEnabled
            },
            set: function(e) {
                this._motionBlurEnabled !== e && (this._motionBlurEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "volumetricLightStepsCount", {
            get: function() {
                return this._volumetricLightStepsCount
            },
            set: function(e) {
                this.volumetricLightPostProcess && this.volumetricLightPostProcess.updateEffect("#define VLS\n#define NB_STEPS " + e.toFixed(1)), this._volumetricLightStepsCount = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "motionBlurSamples", {
            get: function() {
                return this._motionBlurSamples
            },
            set: function(e) {
                this.motionBlurPostProcess && this.motionBlurPostProcess.updateEffect("#define MOTION_BLUR\n#define MAX_MOTION_SAMPLES " + e.toFixed(1)), this._motionBlurSamples = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._buildPipeline = function() {
            var t = this,
                i = this._ratio,
                r = this._scene;
            this._disposePostProcesses(), this._reset(), this._basePostProcess ? this.originalPostProcess = this._basePostProcess : (this.originalPostProcess = new e.PostProcess("HDRPass", "standard", [], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, "#define PASS_POST_PROCESS", this._floatTextureType), this.originalPostProcess.onApply = function(e) {
                t._currentDepthOfFieldSource = t.originalPostProcess
            }), this.addEffect(new e.PostProcessRenderEffect(r.getEngine(), "HDRPassPostProcess", function() {
                return t.originalPostProcess
            }, !0)), this._currentDepthOfFieldSource = this.originalPostProcess, this._vlsEnabled && (this._createVolumetricLightPostProcess(r, i), this.volumetricLightFinalPostProcess = new e.PostProcess("HDRVLSFinal", "standard", [], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, "#define PASS_POST_PROCESS", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.addEffect(new e.PostProcessRenderEffect(r.getEngine(), "HDRVLSFinal", function() {
                return t.volumetricLightFinalPostProcess
            }, !0))), this._bloomEnabled && (this._createDownSampleX4PostProcess(r, i / 2), this._createBrightPassPostProcess(r, i / 2), this._createBlurPostProcesses(r, i / 4, 1), this._createTextureAdderPostProcess(r, i), this.textureAdderFinalPostProcess = new e.PostProcess("HDRDepthOfFieldSource", "standard", [], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, "#define PASS_POST_PROCESS", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.addEffect(new e.PostProcessRenderEffect(r.getEngine(), "HDRBaseDepthOfFieldSource", function() {
                return t.textureAdderFinalPostProcess
            }, !0))), this._lensFlareEnabled && (this._createLensFlarePostProcess(r, i), this.lensFlareFinalPostProcess = new e.PostProcess("HDRPostLensFlareDepthOfFieldSource", "standard", [], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, "#define PASS_POST_PROCESS", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.addEffect(new e.PostProcessRenderEffect(r.getEngine(), "HDRPostLensFlareDepthOfFieldSource", function() {
                return t.lensFlareFinalPostProcess
            }, !0))), this._hdrEnabled && (this._createLuminancePostProcesses(r, this._floatTextureType), this._createHdrPostProcess(r, i), this.hdrFinalPostProcess = new e.PostProcess("HDRPostHDReDepthOfFieldSource", "standard", [], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, "#define PASS_POST_PROCESS", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.addEffect(new e.PostProcessRenderEffect(r.getEngine(), "HDRPostHDReDepthOfFieldSource", function() {
                return t.hdrFinalPostProcess
            }, !0))), this._depthOfFieldEnabled && (this._createBlurPostProcesses(r, i / 2, 3, "depthOfFieldBlurWidth"), this._createDepthOfFieldPostProcess(r, i)), this._motionBlurEnabled && this._createMotionBlurPostProcess(r, i), null !== this._cameras && this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras)
        }, i.prototype._createDownSampleX4PostProcess = function(t, i) {
            var r = this,
                n = new Array(32);
            this.downSampleX4PostProcess = new e.PostProcess("HDRDownSampleX4", "standard", ["dsOffsets"], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define DOWN_SAMPLE_X4", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.downSampleX4PostProcess.onApply = function(e) {
                for (var t = 0, i = r.downSampleX4PostProcess.width, o = r.downSampleX4PostProcess.height, s = -2; s < 2; s++)
                    for (var a = -2; a < 2; a++) n[t] = (s + .5) * (1 / i), n[t + 1] = (a + .5) * (1 / o), t += 2;
                e.setArray2("dsOffsets", n)
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRDownSampleX4", function() {
                return r.downSampleX4PostProcess
            }, !0))
        }, i.prototype._createBrightPassPostProcess = function(t, i) {
            var r = this,
                n = new Array(8);
            this.brightPassPostProcess = new e.PostProcess("HDRBrightPass", "standard", ["dsOffsets", "brightThreshold"], [], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define BRIGHT_PASS", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.brightPassPostProcess.onApply = function(e) {
                var t = 1 / r.brightPassPostProcess.width,
                    i = 1 / r.brightPassPostProcess.height;
                n[0] = -.5 * t, n[1] = .5 * i, n[2] = .5 * t, n[3] = .5 * i, n[4] = -.5 * t, n[5] = -.5 * i, n[6] = .5 * t, n[7] = -.5 * i, e.setArray2("dsOffsets", n), e.setFloat("brightThreshold", r.brightThreshold)
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRBrightPass", function() {
                return r.brightPassPostProcess
            }, !0))
        }, i.prototype._createBlurPostProcesses = function(t, i, r, n) {
            var o = this;
            void 0 === n && (n = "blurWidth");
            var s = t.getEngine(),
                a = new e.BlurPostProcess("HDRBlurH_" + r, new e.Vector2(1, 0), this[n], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, e.Engine.TEXTURETYPE_UNSIGNED_INT),
                l = new e.BlurPostProcess("HDRBlurV_" + r, new e.Vector2(0, 1), this[n], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, e.Engine.TEXTURETYPE_UNSIGNED_INT);
            a.onActivateObservable.add((function() {
                var e = a.width / s.getRenderWidth();
                a.kernel = o[n] * e
            })), l.onActivateObservable.add((function() {
                var e = l.height / s.getRenderHeight();
                l.kernel = o.horizontalBlur ? 64 * e : o[n] * e
            })), this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRBlurH" + r, function() {
                return a
            }, !0)), this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRBlurV" + r, function() {
                return l
            }, !0)), this.blurHPostProcesses.push(a), this.blurVPostProcesses.push(l)
        }, i.prototype._createTextureAdderPostProcess = function(t, i) {
            var r = this;
            this.textureAdderPostProcess = new e.PostProcess("HDRTextureAdder", "standard", ["exposure"], ["otherSampler", "lensSampler"], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define TEXTURE_ADDER", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.textureAdderPostProcess.onApply = function(e) {
                e.setTextureFromPostProcess("otherSampler", r._vlsEnabled ? r._currentDepthOfFieldSource : r.originalPostProcess), e.setTexture("lensSampler", r.lensTexture), e.setFloat("exposure", r.exposure), r._currentDepthOfFieldSource = r.textureAdderFinalPostProcess
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRTextureAdder", function() {
                return r.textureAdderPostProcess
            }, !0))
        }, i.prototype._createVolumetricLightPostProcess = function(t, i) {
            var r = this,
                n = t.enableGeometryBufferRenderer();
            n.enablePosition = !0;
            var o = n.getGBuffer();
            this.volumetricLightPostProcess = new e.PostProcess("HDRVLS", "standard", ["shadowViewProjection", "cameraPosition", "sunDirection", "sunColor", "scatteringCoefficient", "scatteringPower", "depthValues"], ["shadowMapSampler", "positionSampler"], i / 8, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define VLS\n#define NB_STEPS " + this._volumetricLightStepsCount.toFixed(1));
            var s = e.Vector2.Zero();
            this.volumetricLightPostProcess.onApply = function(e) {
                if (r.sourceLight && r.sourceLight.getShadowGenerator() && r._scene.activeCamera) {
                    var t = r.sourceLight.getShadowGenerator();
                    e.setTexture("shadowMapSampler", t.getShadowMap()), e.setTexture("positionSampler", o.textures[2]), e.setColor3("sunColor", r.sourceLight.diffuse), e.setVector3("sunDirection", r.sourceLight.getShadowDirection()), e.setVector3("cameraPosition", r._scene.activeCamera.globalPosition), e.setMatrix("shadowViewProjection", t.getTransformMatrix()), e.setFloat("scatteringCoefficient", r.volumetricLightCoefficient), e.setFloat("scatteringPower", r.volumetricLightPower), s.x = t.getLight().getDepthMinZ(r._scene.activeCamera), s.y = t.getLight().getDepthMaxZ(r._scene.activeCamera), e.setVector2("depthValues", s)
                }
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRVLS", function() {
                return r.volumetricLightPostProcess
            }, !0)), this._createBlurPostProcesses(t, i / 4, 0, "volumetricLightBlurScale"), this.volumetricLightMergePostProces = new e.PostProcess("HDRVLSMerge", "standard", [], ["originalSampler"], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define VLSMERGE"), this.volumetricLightMergePostProces.onApply = function(e) {
                e.setTextureFromPostProcess("originalSampler", r.originalPostProcess), r._currentDepthOfFieldSource = r.volumetricLightFinalPostProcess
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRVLSMerge", function() {
                return r.volumetricLightMergePostProces
            }, !0))
        }, i.prototype._createLuminancePostProcesses = function(t, r) {
            var n = this,
                o = Math.pow(3, i.LuminanceSteps);
            this.luminancePostProcess = new e.PostProcess("HDRLuminance", "standard", ["lumOffsets"], [], {
                width: o,
                height: o
            }, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define LUMINANCE", r);
            var s = [];
            this.luminancePostProcess.onApply = function(e) {
                var t = 1 / n.luminancePostProcess.width,
                    i = 1 / n.luminancePostProcess.height;
                s[0] = -.5 * t, s[1] = .5 * i, s[2] = .5 * t, s[3] = .5 * i, s[4] = -.5 * t, s[5] = -.5 * i, s[6] = .5 * t, s[7] = -.5 * i, e.setArray2("lumOffsets", s)
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRLuminance", function() {
                return n.luminancePostProcess
            }, !0));
            for (var a = i.LuminanceSteps - 1; a >= 0; a--) {
                var o = Math.pow(3, a),
                    l = "#define LUMINANCE_DOWN_SAMPLE\n";
                0 === a && (l += "#define FINAL_DOWN_SAMPLER");
                var c = new e.PostProcess("HDRLuminanceDownSample" + a, "standard", ["dsOffsets", "halfDestPixelSize"], [], {
                    width: o,
                    height: o
                }, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, l, r);
                this.luminanceDownSamplePostProcesses.push(c)
            }
            var h = this.luminancePostProcess;
            this.luminanceDownSamplePostProcesses.forEach((function(i, r) {
                var o = new Array(18);
                i.onApply = function(e) {
                    if (h) {
                        for (var t = 0, s = -1; s < 2; s++)
                            for (var a = -1; a < 2; a++) o[t] = s / h.width, o[t + 1] = a / h.height, t += 2;
                        e.setArray2("dsOffsets", o), e.setFloat("halfDestPixelSize", .5 / h.width), h = r === n.luminanceDownSamplePostProcesses.length - 1 ? n.luminancePostProcess : i
                    }
                }, r === n.luminanceDownSamplePostProcesses.length - 1 && (i.onAfterRender = function(i) {
                    var r = t.getEngine().readPixels(0, 0, 1, 1),
                        o = new e.Vector4(1 / 16581375, 1 / 65025, 1 / 255, 1);
                    n._hdrCurrentLuminance = (r[0] * o.x + r[1] * o.y + r[2] * o.z + r[3] * o.w) / 100
                }), n.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRLuminanceDownSample" + r, function() {
                    return i
                }, !0))
            }))
        }, i.prototype._createHdrPostProcess = function(t, i) {
            var r = this;
            this.hdrPostProcess = new e.PostProcess("HDR", "standard", ["averageLuminance"], ["textureAdderSampler"], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define HDR", e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var n = 1,
                o = 0,
                s = 0;
            this.hdrPostProcess.onApply = function(i) {
                if (i.setTextureFromPostProcess("textureAdderSampler", r._currentDepthOfFieldSource), o += t.getEngine().getDeltaTime(), n < 0) n = r._hdrCurrentLuminance;
                else {
                    var a = (s - o) / 1e3;
                    r._hdrCurrentLuminance < n + r.hdrDecreaseRate * a ? n += r.hdrDecreaseRate * a : r._hdrCurrentLuminance > n - r.hdrIncreaseRate * a ? n -= r.hdrIncreaseRate * a : n = r._hdrCurrentLuminance
                }
                n = e.Scalar.Clamp(n, r.hdrMinimumLuminance, 1e20), i.setFloat("averageLuminance", n), s = o, r._currentDepthOfFieldSource = r.hdrFinalPostProcess
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDR", function() {
                return r.hdrPostProcess
            }, !0))
        }, i.prototype._createLensFlarePostProcess = function(t, i) {
            var r = this;
            this.lensFlarePostProcess = new e.PostProcess("HDRLensFlare", "standard", ["strength", "ghostDispersal", "haloWidth", "resolution", "distortionStrength"], ["lensColorSampler"], i / 2, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define LENS_FLARE", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRLensFlare", function() {
                return r.lensFlarePostProcess
            }, !0)), this._createBlurPostProcesses(t, i / 4, 2), this.lensFlareComposePostProcess = new e.PostProcess("HDRLensFlareCompose", "standard", ["lensStarMatrix"], ["otherSampler", "lensDirtSampler", "lensStarSampler"], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define LENS_FLARE_COMPOSE", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRLensFlareCompose", function() {
                return r.lensFlareComposePostProcess
            }, !0));
            var n = new e.Vector2(0, 0);
            this.lensFlarePostProcess.onApply = function(e) {
                e.setTextureFromPostProcess("textureSampler", r._bloomEnabled ? r.blurHPostProcesses[0] : r.originalPostProcess), e.setTexture("lensColorSampler", r.lensColorTexture), e.setFloat("strength", r.lensFlareStrength), e.setFloat("ghostDispersal", r.lensFlareGhostDispersal), e.setFloat("haloWidth", r.lensFlareHaloWidth), n.x = r.lensFlarePostProcess.width, n.y = r.lensFlarePostProcess.height, e.setVector2("resolution", n), e.setFloat("distortionStrength", r.lensFlareDistortionStrength)
            };
            var o = e.Matrix.FromValues(2, 0, -1, 0, 0, 2, -1, 0, 0, 0, 1, 0, 0, 0, 0, 1),
                s = e.Matrix.FromValues(.5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1, 0, 0, 0, 0, 1);
            this.lensFlareComposePostProcess.onApply = function(t) {
                if (r._scene.activeCamera) {
                    t.setTextureFromPostProcess("otherSampler", r._currentDepthOfFieldSource), t.setTexture("lensDirtSampler", r.lensFlareDirtTexture), t.setTexture("lensStarSampler", r.lensStarTexture);
                    var i = r._scene.activeCamera.getViewMatrix().getRow(0),
                        n = r._scene.activeCamera.getViewMatrix().getRow(2),
                        a = e.Vector3.Dot(i.toVector3(), new e.Vector3(1, 0, 0)) + e.Vector3.Dot(n.toVector3(), new e.Vector3(0, 0, 1));
                    a *= 4;
                    var l = e.Matrix.FromValues(.5 * Math.cos(a), -Math.sin(a), 0, 0, Math.sin(a), .5 * Math.cos(a), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
                        c = s.multiply(l).multiply(o);
                    t.setMatrix("lensStarMatrix", c), r._currentDepthOfFieldSource = r.lensFlareFinalPostProcess
                }
            }
        }, i.prototype._createDepthOfFieldPostProcess = function(t, i) {
            var r = this;
            this.depthOfFieldPostProcess = new e.PostProcess("HDRDepthOfField", "standard", ["distance"], ["otherSampler", "depthSampler"], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define DEPTH_OF_FIELD", e.Engine.TEXTURETYPE_UNSIGNED_INT), this.depthOfFieldPostProcess.onApply = function(e) {
                e.setTextureFromPostProcess("otherSampler", r._currentDepthOfFieldSource), e.setTexture("depthSampler", r._getDepthTexture()), e.setFloat("distance", r.depthOfFieldDistance)
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRDepthOfField", function() {
                return r.depthOfFieldPostProcess
            }, !0))
        }, i.prototype._createMotionBlurPostProcess = function(t, i) {
            var r = this;
            this.motionBlurPostProcess = new e.PostProcess("HDRMotionBlur", "standard", ["inverseViewProjection", "prevViewProjection", "screenSize", "motionScale", "motionStrength"], ["depthSampler"], i, null, e.Texture.BILINEAR_SAMPLINGMODE, t.getEngine(), !1, "#define MOTION_BLUR\n#define MAX_MOTION_SAMPLES " + this.motionBlurSamples.toFixed(1), e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var n = 0,
                o = e.Matrix.Identity(),
                s = e.Matrix.Identity(),
                a = e.Matrix.Identity(),
                l = e.Vector2.Zero();
            this.motionBlurPostProcess.onApply = function(e) {
                a = t.getProjectionMatrix().multiply(t.getViewMatrix()), a.invertToRef(s), e.setMatrix("inverseViewProjection", s), e.setMatrix("prevViewProjection", o), o = a, l.x = r.motionBlurPostProcess.width, l.y = r.motionBlurPostProcess.height, e.setVector2("screenSize", l), n = t.getEngine().getFps() / 60, e.setFloat("motionScale", n), e.setFloat("motionStrength", r.motionStrength), e.setTexture("depthSampler", r._getDepthTexture())
            }, this.addEffect(new e.PostProcessRenderEffect(t.getEngine(), "HDRMotionBlur", function() {
                return r.motionBlurPostProcess
            }, !0))
        }, i.prototype._getDepthTexture = function() {
            if (this._scene.getEngine().getCaps().drawBuffersExtension) {
                return this._scene.enableGeometryBufferRenderer().getGBuffer().textures[0]
            }
            return this._scene.enableDepthRenderer().getDepthMap()
        }, i.prototype._disposePostProcesses = function() {
            for (var e = 0; e < this._cameras.length; e++) {
                var t = this._cameras[e];
                this.originalPostProcess && this.originalPostProcess.dispose(t), this.downSampleX4PostProcess && this.downSampleX4PostProcess.dispose(t), this.brightPassPostProcess && this.brightPassPostProcess.dispose(t), this.textureAdderPostProcess && this.textureAdderPostProcess.dispose(t), this.textureAdderFinalPostProcess && this.textureAdderFinalPostProcess.dispose(t), this.volumetricLightPostProcess && this.volumetricLightPostProcess.dispose(t), this.volumetricLightSmoothXPostProcess && this.volumetricLightSmoothXPostProcess.dispose(t), this.volumetricLightSmoothYPostProcess && this.volumetricLightSmoothYPostProcess.dispose(t), this.volumetricLightMergePostProces && this.volumetricLightMergePostProces.dispose(t), this.volumetricLightFinalPostProcess && this.volumetricLightFinalPostProcess.dispose(t), this.lensFlarePostProcess && this.lensFlarePostProcess.dispose(t), this.lensFlareComposePostProcess && this.lensFlareComposePostProcess.dispose(t);
                for (var i = 0; i < this.luminanceDownSamplePostProcesses.length; i++) this.luminanceDownSamplePostProcesses[i].dispose(t);
                this.luminancePostProcess && this.luminancePostProcess.dispose(t), this.hdrPostProcess && this.hdrPostProcess.dispose(t), this.hdrFinalPostProcess && this.hdrFinalPostProcess.dispose(t), this.depthOfFieldPostProcess && this.depthOfFieldPostProcess.dispose(t), this.motionBlurPostProcess && this.motionBlurPostProcess.dispose(t);
                for (var i = 0; i < this.blurHPostProcesses.length; i++) this.blurHPostProcesses[i].dispose(t);
                for (var i = 0; i < this.blurVPostProcesses.length; i++) this.blurVPostProcesses[i].dispose(t)
            }
            this.originalPostProcess = null, this.downSampleX4PostProcess = null, this.brightPassPostProcess = null, this.textureAdderPostProcess = null, this.textureAdderFinalPostProcess = null, this.volumetricLightPostProcess = null, this.volumetricLightSmoothXPostProcess = null, this.volumetricLightSmoothYPostProcess = null, this.volumetricLightMergePostProces = null, this.volumetricLightFinalPostProcess = null, this.lensFlarePostProcess = null, this.lensFlareComposePostProcess = null, this.luminancePostProcess = null, this.hdrPostProcess = null, this.hdrFinalPostProcess = null, this.depthOfFieldPostProcess = null, this.motionBlurPostProcess = null, this.luminanceDownSamplePostProcesses = [], this.blurHPostProcesses = [], this.blurVPostProcesses = []
        }, i.prototype.dispose = function() {
            this._disposePostProcesses(), this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras), t.prototype.dispose.call(this)
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.customType = "StandardRenderingPipeline", t
        }, i.Parse = function(t, r, n) {
            return e.SerializationHelper.Parse((function() {
                return new i(t._name, r, t._ratio)
            }), t, r, n)
        }, i.LuminanceSteps = 6, __decorate([e.serialize()], i.prototype, "brightThreshold", void 0), __decorate([e.serialize()], i.prototype, "blurWidth", void 0), __decorate([e.serialize()], i.prototype, "horizontalBlur", void 0), __decorate([e.serialize()], i.prototype, "exposure", void 0), __decorate([e.serializeAsTexture("lensTexture")], i.prototype, "lensTexture", void 0), __decorate([e.serialize()], i.prototype, "volumetricLightCoefficient", void 0), __decorate([e.serialize()], i.prototype, "volumetricLightPower", void 0), __decorate([e.serialize()], i.prototype, "volumetricLightBlurScale", void 0), __decorate([e.serialize()], i.prototype, "hdrMinimumLuminance", void 0), __decorate([e.serialize()], i.prototype, "hdrDecreaseRate", void 0), __decorate([e.serialize()], i.prototype, "hdrIncreaseRate", void 0), __decorate([e.serializeAsTexture("lensColorTexture")], i.prototype, "lensColorTexture", void 0), __decorate([e.serialize()], i.prototype, "lensFlareStrength", void 0), __decorate([e.serialize()], i.prototype, "lensFlareGhostDispersal", void 0), __decorate([e.serialize()], i.prototype, "lensFlareHaloWidth", void 0), __decorate([e.serialize()], i.prototype, "lensFlareDistortionStrength", void 0), __decorate([e.serializeAsTexture("lensStarTexture")], i.prototype, "lensStarTexture", void 0), __decorate([e.serializeAsTexture("lensFlareDirtTexture")], i.prototype, "lensFlareDirtTexture", void 0), __decorate([e.serialize()], i.prototype, "depthOfFieldDistance", void 0), __decorate([e.serialize()], i.prototype, "depthOfFieldBlurWidth", void 0), __decorate([e.serialize()], i.prototype, "motionStrength", void 0), __decorate([e.serialize()], i.prototype, "_ratio", void 0), __decorate([e.serialize()], i.prototype, "BloomEnabled", null), __decorate([e.serialize()], i.prototype, "DepthOfFieldEnabled", null), __decorate([e.serialize()], i.prototype, "LensFlareEnabled", null), __decorate([e.serialize()], i.prototype, "HDREnabled", null), __decorate([e.serialize()], i.prototype, "VLSEnabled", null), __decorate([e.serialize()], i.prototype, "MotionBlurEnabled", null), __decorate([e.serialize()], i.prototype, "volumetricLightStepsCount", null), __decorate([e.serialize()], i.prototype, "motionBlurSamples", null), i
    })(e.PostProcessRenderPipeline);
    e.StandardRenderingPipeline = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === n && (n = null), void 0 === l && (l = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var c = t.call(this, i, "fxaa", ["texelSize"], null, r, n, o || e.Texture.BILINEAR_SAMPLINGMODE, s, a, null, l, "fxaa") || this;
            return c.onApplyObservable.add((function(e) {
                var t = c.texelSize;
                e.setFloat2("texelSize", t.x, t.y)
            })), c
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.FxaaPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c) {
            void 0 === c && (c = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var h = t.call(this, i, "circleOfConfusion", ["cameraMinMaxZ", "focusDistance", "cocPrecalculation"], ["depthSampler"], n, o, s, a, l, null, c) || this;
            return h.lensSize = 50, h.fStop = 1.4, h.focusDistance = 2e3, h.focalLength = 50, h.onApplyObservable.add((function(e) {
                e.setTexture("depthSampler", r);
                var t = h.lensSize / h.fStop,
                    i = t * h.focalLength / (h.focusDistance - h.focalLength);
                e.setFloat("focusDistance", h.focusDistance), e.setFloat("cocPrecalculation", i), e.setFloat2("cameraMinMaxZ", r.activeCamera.minZ, r.activeCamera.maxZ)
            })), h
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.CircleOfConfusionPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u) {
            void 0 === u && (u = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var f = t.call(this, i, "depthOfFieldMerge", [], ["circleOfConfusionSampler", "originalSampler", "blurStep1", "blurStep2"], s, a, l, c, h, "#define BLUR_LEVEL " + o.length + "\n", u) || this;
            return f.onApplyObservable.add((function(e) {
                e.setTextureFromPostProcess("circleOfConfusionSampler", n), e.setTextureFromPostProcess("originalSampler", r), o.forEach((function(t, i) {
                    e.setTextureFromPostProcess("blurStep" + (i + 1), t)
                }))
            })), f
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.DepthOfFieldMergePostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.Low = 0] = "Low", e[e.Medium = 1] = "Medium", e[e.High = 2] = "High"
    })(t = e.DepthOfFieldEffectBlurLevel || (e.DepthOfFieldEffectBlurLevel = {}));
    var i = (function(i) {
        function r(r, n, o, s) {
            void 0 === o && (o = t.Low), void 0 === s && (s = 0);
            var a = i.call(this, r.getEngine(), "depth of field", (function() {
                a._circleOfConfusion = new e.CircleOfConfusionPostProcess("circleOfConfusion", n, 1, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, s), a._depthOfFieldPass = new e.PassPostProcess("depthOfFieldPass", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, s), a._depthOfFieldPass.autoClear = !1, a._depthOfFieldBlurY = [], a._depthOfFieldBlurX = [];
                var i = 1,
                    l = 15;
                switch (o) {
                    case t.High:
                        i = 3, l = 51;
                        break;
                    case t.Medium:
                        i = 2, l = 31;
                        break;
                    default:
                        l = 15, i = 1
                }
                for (var c = l / Math.pow(2, i - 1), h = 0; h < i; h++) {
                    var u = new e.DepthOfFieldBlurPostProcess("verticle blur", r, new e.Vector2(0, 1), c, 1 / Math.pow(2, h), null, a._depthOfFieldPass, 0 == h ? a._circleOfConfusion : null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, s);
                    u.autoClear = !1;
                    var f = new e.DepthOfFieldBlurPostProcess("horizontal blur", r, new e.Vector2(1, 0), c, 1 / Math.pow(2, h), null, a._depthOfFieldPass, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, s);
                    f.autoClear = !1, a._depthOfFieldBlurY.push(u), a._depthOfFieldBlurX.push(f)
                }
                a._depthOfFieldMerge = new e.DepthOfFieldMergePostProcess("depthOfFieldMerge", a._circleOfConfusion, a._depthOfFieldPass, a._depthOfFieldBlurY.slice(1), 1, null, e.Texture.BILINEAR_SAMPLINGMODE, r.getEngine(), !1, s), a._depthOfFieldMerge.autoClear = !1;
                for (var d = [a._circleOfConfusion, a._depthOfFieldPass], h = 0; h < a._depthOfFieldBlurX.length; h++) d.push(a._depthOfFieldBlurY[h]), d.push(a._depthOfFieldBlurX[h]);
                return d.push(a._depthOfFieldMerge), d
            }), !0) || this;
            return a
        }
        return __extends(r, i), Object.defineProperty(r.prototype, "focalLength", {
            get: function() {
                return this._circleOfConfusion.focalLength
            },
            set: function(e) {
                this._circleOfConfusion.focalLength = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "fStop", {
            get: function() {
                return this._circleOfConfusion.fStop
            },
            set: function(e) {
                this._circleOfConfusion.fStop = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "focusDistance", {
            get: function() {
                return this._circleOfConfusion.focusDistance
            },
            set: function(e) {
                this._circleOfConfusion.focusDistance = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(r.prototype, "lensSize", {
            get: function() {
                return this._circleOfConfusion.lensSize
            },
            set: function(e) {
                this._circleOfConfusion.lensSize = e
            },
            enumerable: !0,
            configurable: !0
        }), r.prototype.disposeEffects = function(e) {
            this._depthOfFieldPass.dispose(e), this._circleOfConfusion.dispose(e), this._depthOfFieldBlurX.forEach((function(t) {
                t.dispose(e)
            })), this._depthOfFieldBlurY.forEach((function(t) {
                t.dispose(e)
            })), this._depthOfFieldMerge.dispose(e)
        }, r
    })(e.PostProcessRenderEffect);
    e.DepthOfFieldEffect = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s) {
            void 0 === s && (s = !0);
            var a = t.call(this, n.getEngine(), i) || this;
            a.PassPostProcessId = "PassPostProcessEffect", a.HighLightsPostProcessId = "HighLightsPostProcessEffect", a.BlurXPostProcessId = "BlurXPostProcessEffect", a.BlurYPostProcessId = "BlurYPostProcessEffect", a.CopyBackPostProcessId = "CopyBackPostProcessEffect", a.ImageProcessingPostProcessId = "ImageProcessingPostProcessEffect", a.FxaaPostProcessId = "FxaaPostProcessEffect", a.FinalMergePostProcessId = "FinalMergePostProcessEffect", a.animations = [], a._bloomEnabled = !1, a._depthOfFieldEnabled = !1, a._depthOfFieldBlurLevel = e.DepthOfFieldEffectBlurLevel.Low, a._fxaaEnabled = !1, a._imageProcessingEnabled = !0, a._bloomScale = .6, a._buildAllowed = !0, a.bloomKernel = 64, a._bloomWeight = .15, a._cameras = o || [], a._buildAllowed = s, a._scene = n;
            var l = a._scene.getEngine().getCaps();
            return a._hdr = r && (l.textureHalfFloatRender || l.textureFloatRender), a._hdr ? l.textureHalfFloatRender ? a._defaultPipelineTextureType = e.Engine.TEXTURETYPE_HALF_FLOAT : l.textureFloatRender && (a._defaultPipelineTextureType = e.Engine.TEXTURETYPE_FLOAT) : a._defaultPipelineTextureType = e.Engine.TEXTURETYPE_UNSIGNED_INT, n.postProcessRenderPipelineManager.addPipeline(a), a._buildPipeline(), a
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "bloomWeight", {
            get: function() {
                return this._bloomWeight
            },
            set: function(t) {
                this._bloomWeight !== t && (this._bloomWeight = t, this._hdr && this.copyBack && (this.copyBack.alphaConstants = new e.Color4(t, t, t, t)))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "bloomScale", {
            get: function() {
                return this._bloomScale
            },
            set: function(e) {
                this._bloomScale !== e && (this._bloomScale = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "bloomEnabled", {
            get: function() {
                return this._bloomEnabled
            },
            set: function(e) {
                this._bloomEnabled !== e && (this._bloomEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "depthOfFieldEnabled", {
            get: function() {
                return this._depthOfFieldEnabled
            },
            set: function(e) {
                this._depthOfFieldEnabled !== e && (this._depthOfFieldEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "depthOfFieldBlurLevel", {
            get: function() {
                return this._depthOfFieldBlurLevel
            },
            set: function(e) {
                this._depthOfFieldBlurLevel !== e && (this._depthOfFieldBlurLevel = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "fxaaEnabled", {
            get: function() {
                return this._fxaaEnabled
            },
            set: function(e) {
                this._fxaaEnabled !== e && (this._fxaaEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "imageProcessingEnabled", {
            get: function() {
                return this._imageProcessingEnabled
            },
            set: function(e) {
                this._imageProcessingEnabled !== e && (this._imageProcessingEnabled = e, this._buildPipeline())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.prepare = function() {
            var e = this._buildAllowed;
            this._buildAllowed = !0, this._buildPipeline(), this._buildAllowed = e
        }, i.prototype._buildPipeline = function() {
            var t = this;
            if (this._buildAllowed) {
                var i = this._scene.getEngine();
                if (this._disposePostProcesses(), this._reset(), this.depthOfFieldEnabled) {
                    var r = this._scene.enableDepthRenderer(this._cameras[0]).getDepthMap();
                    this.depthOfField = new e.DepthOfFieldEffect(this._scene, r, this._depthOfFieldBlurLevel, this._defaultPipelineTextureType), this.addEffect(this.depthOfField)
                }
                if (this.bloomEnabled) {
                    if (this.pass = new e.PassPostProcess("sceneRenderTarget", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.PassPostProcessId, function() {
                            return t.pass
                        }, !0)), this._hdr || (this.highlights = new e.HighlightsPostProcess("highlights", this.bloomScale, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.HighLightsPostProcessId, function() {
                            return t.highlights
                        }, !0)), this.highlights.autoClear = !1, this.highlights.alwaysForcePOT = !0), this.blurX = new e.BlurPostProcess("horizontal blur", new e.Vector2(1, 0), 10, this.bloomScale, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.BlurXPostProcessId, function() {
                            return t.blurX
                        }, !0)), this.blurX.alwaysForcePOT = !0, this.blurX.autoClear = !1, this.blurX.onActivateObservable.add((function() {
                            var e = t.blurX.width / i.getRenderWidth(!0);
                            t.blurX.kernel = t.bloomKernel * e
                        })), this.blurY = new e.BlurPostProcess("vertical blur", new e.Vector2(0, 1), 10, this.bloomScale, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.BlurYPostProcessId, function() {
                            return t.blurY
                        }, !0)), this.blurY.alwaysForcePOT = !0, this.blurY.autoClear = !1, this.blurY.onActivateObservable.add((function() {
                            var e = t.blurY.height / i.getRenderHeight(!0);
                            t.blurY.kernel = t.bloomKernel * e
                        })), this.copyBack = new e.PassPostProcess("bloomBlendBlit", this.bloomScale, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.CopyBackPostProcessId, function() {
                            return t.copyBack
                        }, !0)), this.copyBack.alwaysForcePOT = !0, this._hdr) {
                        this.copyBack.alphaMode = e.Engine.ALPHA_INTERPOLATE;
                        var n = this.bloomWeight;
                        this.copyBack.alphaConstants = new e.Color4(n, n, n, n)
                    } else this.copyBack.alphaMode = e.Engine.ALPHA_SCREENMODE;
                    this.copyBack.autoClear = !1
                }
                this._imageProcessingEnabled && (this.imageProcessing = new e.ImageProcessingPostProcess("imageProcessing", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this._hdr ? this.addEffect(new e.PostProcessRenderEffect(i, this.ImageProcessingPostProcessId, function() {
                    return t.imageProcessing
                }, !0)) : this._scene.imageProcessingConfiguration.applyByPostProcess = !1), this.fxaaEnabled ? (this.fxaa = new e.FxaaPostProcess("fxaa", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.FxaaPostProcessId, function() {
                    return t.fxaa
                }, !0)), this.fxaa.autoClear = !(this.bloomEnabled || this._hdr && this.imageProcessing)) : this._hdr && this.imageProcessing ? this.finalMerge = this.imageProcessing : (this.finalMerge = new e.PassPostProcess("finalMerge", 1, null, e.Texture.BILINEAR_SAMPLINGMODE, i, !1, this._defaultPipelineTextureType), this.addEffect(new e.PostProcessRenderEffect(i, this.FinalMergePostProcessId, function() {
                    return t.finalMerge
                }, !0)), this.finalMerge.autoClear = !(this.bloomEnabled || this._hdr && this.imageProcessing)), this.bloomEnabled && (this._hdr ? (this.copyBack.shareOutputWith(this.blurX), this.imageProcessing ? (this.imageProcessing.shareOutputWith(this.pass), this.imageProcessing.autoClear = !1) : this.fxaa ? this.fxaa.shareOutputWith(this.pass) : this.finalMerge.shareOutputWith(this.pass)) : this.fxaa ? this.fxaa.shareOutputWith(this.pass) : this.finalMerge.shareOutputWith(this.pass)), null !== this._cameras && this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras), this._enableMSAAOnFirstPostProcess()
            }
        }, i.prototype._disposePostProcesses = function() {
            for (var e = 0; e < this._cameras.length; e++) {
                var t = this._cameras[e];
                this.pass && this.pass.dispose(t), this.highlights && this.highlights.dispose(t), this.blurX && this.blurX.dispose(t), this.blurY && this.blurY.dispose(t), this.copyBack && this.copyBack.dispose(t), this.imageProcessing && this.imageProcessing.dispose(t), this.fxaa && this.fxaa.dispose(t), this.finalMerge && this.finalMerge.dispose(t), this.depthOfField && this.depthOfField.disposeEffects(t)
            }
            this.pass = null, this.highlights = null, this.blurX = null, this.blurY = null, this.copyBack = null, this.imageProcessing = null, this.fxaa = null, this.finalMerge = null, this.depthOfField = null
        }, i.prototype.dispose = function() {
            this._disposePostProcesses(), this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras), t.prototype.dispose.call(this)
        }, i.prototype.serialize = function() {
            var t = e.SerializationHelper.Serialize(this);
            return t.customType = "DefaultRenderingPipeline", t
        }, i.Parse = function(t, r, n) {
            return e.SerializationHelper.Parse((function() {
                return new i(t._name, t._name._hdr, r)
            }), t, r, n)
        }, __decorate([e.serialize()], i.prototype, "bloomKernel", void 0), __decorate([e.serialize()], i.prototype, "_bloomWeight", void 0), __decorate([e.serialize()], i.prototype, "_hdr", void 0), __decorate([e.serialize()], i.prototype, "bloomWeight", null), __decorate([e.serialize()], i.prototype, "bloomScale", null), __decorate([e.serialize()], i.prototype, "bloomEnabled", null), __decorate([e.serialize()], i.prototype, "depthOfFieldEnabled", null), __decorate([e.serialize()], i.prototype, "depthOfFieldBlurLevel", null), __decorate([e.serialize()], i.prototype, "fxaaEnabled", null), __decorate([e.serialize()], i.prototype, "imageProcessingEnabled", null), i
    })(e.PostProcessRenderPipeline);
    e.DefaultRenderingPipeline = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t) {
            void 0 === t && (t = 1), this._enablePosition = !1, this._scene = e, this._ratio = t, this._createRenderTargets()
        }
        return Object.defineProperty(t.prototype, "renderList", {
            set: function(e) {
                this._multiRenderTarget.renderList = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "isSupported", {
            get: function() {
                return this._multiRenderTarget.isSupported
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "enablePosition", {
            get: function() {
                return this._enablePosition
            },
            set: function(e) {
                this._enablePosition = e, this.dispose(), this._createRenderTargets()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "scene", {
            get: function() {
                return this._scene
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "ratio", {
            get: function() {
                return this._ratio
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.isReady = function(t, i) {
            var r = t.getMaterial();
            if (r && r.disableDepthWrite) return !1;
            var n = [],
                o = [e.VertexBuffer.PositionKind, e.VertexBuffer.NormalKind],
                s = t.getMesh();
            r && r.needAlphaTesting() && (n.push("#define ALPHATEST"), s.isVerticesDataPresent(e.VertexBuffer.UVKind) && (o.push(e.VertexBuffer.UVKind), n.push("#define UV1")), s.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && (o.push(e.VertexBuffer.UV2Kind), n.push("#define UV2"))), this._enablePosition && n.push("#define POSITION"), s.useBones && s.computeBonesUsingShaders ? (o.push(e.VertexBuffer.MatricesIndicesKind), o.push(e.VertexBuffer.MatricesWeightsKind), s.numBoneInfluencers > 4 && (o.push(e.VertexBuffer.MatricesIndicesExtraKind), o.push(e.VertexBuffer.MatricesWeightsExtraKind)), n.push("#define NUM_BONE_INFLUENCERS " + s.numBoneInfluencers), n.push("#define BonesPerMesh " + (s.skeleton ? s.skeleton.bones.length + 1 : 0))) : n.push("#define NUM_BONE_INFLUENCERS 0"), i && (n.push("#define INSTANCES"), o.push("world0"), o.push("world1"), o.push("world2"), o.push("world3"));
            var a = n.join("\n");
            return this._cachedDefines !== a && (this._cachedDefines = a, this._effect = this._scene.getEngine().createEffect("geometry", o, ["world", "mBones", "viewProjection", "diffuseMatrix", "view"], ["diffuseSampler"], a, void 0, void 0, void 0, {
                buffersCount: this._enablePosition ? 3 : 2
            })), this._effect.isReady()
        }, t.prototype.getGBuffer = function() {
            return this._multiRenderTarget
        }, Object.defineProperty(t.prototype, "samples", {
            get: function() {
                return this._multiRenderTarget.samples
            },
            set: function(e) {
                this._multiRenderTarget.samples = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.dispose = function() {
            this.getGBuffer().dispose()
        }, t.prototype._createRenderTargets = function() {
            var t = this,
                i = this._scene.getEngine(),
                r = this._enablePosition ? 3 : 2;
            if (this._multiRenderTarget = new e.MultiRenderTarget("gBuffer", {
                    width: i.getRenderWidth() * this._ratio,
                    height: i.getRenderHeight() * this._ratio
                }, r, this._scene, {
                    generateMipMaps: !1,
                    generateDepthTexture: !0,
                    defaultType: e.Engine.TEXTURETYPE_FLOAT
                }), this.isSupported) {
                this._multiRenderTarget.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._multiRenderTarget.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._multiRenderTarget.refreshRate = 1, this._multiRenderTarget.renderParticles = !1, this._multiRenderTarget.renderList = null, this._multiRenderTarget.onClearObservable.add((function(t) {
                    t.clear(new e.Color4(0, 0, 0, 1), !0, !0, !0)
                }));
                var n = function(i) {
                    var r = i.getRenderingMesh(),
                        n = t._scene,
                        o = n.getEngine(),
                        s = i.getMaterial();
                    if (s) {
                        o.setState(s.backFaceCulling, 0, !1, n.useRightHandedSystem);
                        var a = r._getInstancesRenderList(i._id);
                        if (!a.mustReturn) {
                            var l = o.getCaps().instancedArrays && null !== a.visibleInstances[i._id];
                            if (t.isReady(i, l)) {
                                if (o.enableEffect(t._effect), r._bind(i, t._effect, e.Material.TriangleFillMode), t._effect.setMatrix("viewProjection", n.getTransformMatrix()), t._effect.setMatrix("view", n.getViewMatrix()), s && s.needAlphaTesting()) {
                                    var c = s.getAlphaTestTexture();
                                    c && (t._effect.setTexture("diffuseSampler", c), t._effect.setMatrix("diffuseMatrix", c.getTextureMatrix()))
                                }
                                r.useBones && r.computeBonesUsingShaders && r.skeleton && t._effect.setMatrices("mBones", r.skeleton.getTransformMatrices(r)), r._processRendering(i, t._effect, e.Material.TriangleFillMode, a, l, (function(e, i) {
                                    return t._effect.setMatrix("world", i)
                                }))
                            }
                        }
                    }
                };
                this._multiRenderTarget.customRenderFunction = function(e, t, r, o) {
                    var s;
                    if (o.length) {
                        for (i.setColorWrite(!1), s = 0; s < o.length; s++) n(o.data[s]);
                        i.setColorWrite(!0)
                    }
                    for (s = 0; s < e.length; s++) n(e.data[s]);
                    for (s = 0; s < t.length; s++) n(t.data[s])
                }
            }
        }, t
    })();
    e.GeometryBufferRenderer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u) {
            var f = t.call(this, i, "refraction", ["baseColor", "depth", "colorLevel"], ["refractionSampler"], a, l, c, h, u) || this;
            return f.color = n, f.depth = o, f.colorLevel = s, f._ownRefractionTexture = !0, f.onActivateObservable.add((function(t) {
                f._refTexture = f._refTexture || new e.Texture(r, t.getScene())
            })), f.onApplyObservable.add((function(e) {
                e.setColor3("baseColor", f.color), e.setFloat("depth", f.depth), e.setFloat("colorLevel", f.colorLevel), e.setTexture("refractionSampler", f._refTexture)
            })), f
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "refractionTexture", {
            get: function() {
                return this._refTexture
            },
            set: function(e) {
                this._refTexture && this._ownRefractionTexture && this._refTexture.dispose(), this._refTexture = e, this._ownRefractionTexture = !1
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.dispose = function(e) {
            this._refTexture && this._ownRefractionTexture && (this._refTexture.dispose(), this._refTexture = null), t.prototype.dispose.call(this, e)
        }, i
    })(e.PostProcess);
    e.RefractionPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r, n, o, s) {
            var a = e.call(this, t, "blackAndWhite", ["degree"], null, i, r, n, o, s) || this;
            return a.degree = 1, a.onApplyObservable.add((function(e) {
                e.setFloat("degree", a.degree)
            })), a
        }
        return __extends(t, e), t
    })(e.PostProcess);
    e.BlackAndWhitePostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r, n, o, s, a) {
            var l = e.call(this, t, "convolution", ["kernel", "screenSize"], null, r, n, o, s, a) || this;
            return l.kernel = i, l.onApply = function(e) {
                e.setFloat2("screenSize", l.width, l.height), e.setArray("kernel", l.kernel)
            }, l
        }
        return __extends(t, e), t.EdgeDetect0Kernel = [1, 0, -1, 0, 0, 0, -1, 0, 1], t.EdgeDetect1Kernel = [0, 1, 0, 1, -4, 1, 0, 1, 0], t.EdgeDetect2Kernel = [-1, -1, -1, -1, 8, -1, -1, -1, -1], t.SharpenKernel = [0, -1, 0, -1, 5, -1, 0, -1, 0], t.EmbossKernel = [-2, -1, 0, -1, 1, 1, 0, 1, 2], t.GaussianKernel = [0, 1, 0, 1, 1, 1, 0, 1, 0], t
    })(e.PostProcess);
    e.ConvolutionPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r, n, o, s, a) {
            var l = e.call(this, t, "filter", ["kernelMatrix"], null, r, n, o, s, a) || this;
            return l.kernelMatrix = i, l.onApply = function(e) {
                e.setMatrix("kernelMatrix", l.kernelMatrix)
            }, l
        }
        return __extends(t, e), t
    })(e.PostProcess);
    e.FilterPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(r, n, o, s, a, l, c, h, u) {
            void 0 === a && (a = 100), void 0 === l && (l = e.Texture.BILINEAR_SAMPLINGMODE);
            var f = t.call(this, r, "volumetricLightScattering", ["decay", "exposure", "weight", "meshPositionOnScreen", "density"], ["lightScatteringSampler"], n.postProcessRatio || n, o, l, c, h, "#define NUM_SAMPLES " + a) || this;
            return f._screenCoordinates = e.Vector2.Zero(), f.customMeshPosition = e.Vector3.Zero(), f.useCustomMeshPosition = !1, f.invert = !0, f.excludedMeshes = new Array, f.exposure = .3, f.decay = .96815, f.weight = .58767, f.density = .926, u = null === o ? u : o.getScene(), c = u.getEngine(), f._viewPort = new e.Viewport(0, 0, 1, 1).toGlobal(c.getRenderWidth(), c.getRenderHeight()), f.mesh = null !== s ? s : i.CreateDefaultMesh("VolumetricLightScatteringMesh", u), f._createPass(u, n.passRatio || n), f.onActivate = function(e) {
                f.isSupported || f.dispose(e), f.onActivate = null
            }, f.onApplyObservable.add((function(e) {
                f._updateMeshScreenCoordinates(u), e.setTexture("lightScatteringSampler", f._volumetricLightScatteringRTT), e.setFloat("exposure", f.exposure), e.setFloat("decay", f.decay), e.setFloat("weight", f.weight), e.setFloat("density", f.density), e.setVector2("meshPositionOnScreen", f._screenCoordinates)
            })), f
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "useDiffuseColor", {
            get: function() {
                return e.Tools.Warn("VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead"), !1
            },
            set: function(t) {
                e.Tools.Warn("VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead")
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getClassName = function() {
            return "VolumetricLightScatteringPostProcess"
        }, i.prototype._isReady = function(t, i) {
            var r = t.getMesh();
            if (r === this.mesh && r.material) return r.material.isReady(r);
            var n = [],
                o = [e.VertexBuffer.PositionKind],
                s = t.getMaterial();
            s && (s.needAlphaTesting() && n.push("#define ALPHATEST"), r.isVerticesDataPresent(e.VertexBuffer.UVKind) && (o.push(e.VertexBuffer.UVKind), n.push("#define UV1")), r.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && (o.push(e.VertexBuffer.UV2Kind), n.push("#define UV2"))), r.useBones && r.computeBonesUsingShaders ? (o.push(e.VertexBuffer.MatricesIndicesKind), o.push(e.VertexBuffer.MatricesWeightsKind), n.push("#define NUM_BONE_INFLUENCERS " + r.numBoneInfluencers), n.push("#define BonesPerMesh " + (r.skeleton ? r.skeleton.bones.length + 1 : 0))) : n.push("#define NUM_BONE_INFLUENCERS 0"), i && (n.push("#define INSTANCES"), o.push("world0"), o.push("world1"), o.push("world2"), o.push("world3"));
            var a = n.join("\n");
            return this._cachedDefines !== a && (this._cachedDefines = a, this._volumetricLightScatteringPass = r.getScene().getEngine().createEffect({
                vertexElement: "depth",
                fragmentElement: "volumetricLightScatteringPass"
            }, o, ["world", "mBones", "viewProjection", "diffuseMatrix"], ["diffuseSampler"], a)), this._volumetricLightScatteringPass.isReady()
        }, i.prototype.setCustomMeshPosition = function(e) {
            this.customMeshPosition = e
        }, i.prototype.getCustomMeshPosition = function() {
            return this.customMeshPosition
        }, i.prototype.dispose = function(e) {
            var i = e.getScene().customRenderTargets.indexOf(this._volumetricLightScatteringRTT); - 1 !== i && e.getScene().customRenderTargets.splice(i, 1), this._volumetricLightScatteringRTT.dispose(), t.prototype.dispose.call(this, e)
        }, i.prototype.getPass = function() {
            return this._volumetricLightScatteringRTT
        }, i.prototype._meshExcluded = function(e) {
            return this.excludedMeshes.length > 0 && -1 !== this.excludedMeshes.indexOf(e)
        }, i.prototype._createPass = function(t, i) {
            var r = this,
                n = t.getEngine();
            this._volumetricLightScatteringRTT = new e.RenderTargetTexture("volumetricLightScatteringMap", {
                width: n.getRenderWidth() * i,
                height: n.getRenderHeight() * i
            }, t, !1, !0, e.Engine.TEXTURETYPE_UNSIGNED_INT), this._volumetricLightScatteringRTT.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._volumetricLightScatteringRTT.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._volumetricLightScatteringRTT.renderList = null, this._volumetricLightScatteringRTT.renderParticles = !1, this._volumetricLightScatteringRTT.ignoreCameraViewport = !0;
            var o = this.getCamera();
            o ? o.customRenderTargets.push(this._volumetricLightScatteringRTT) : t.customRenderTargets.push(this._volumetricLightScatteringRTT);
            var s, a = function(t) {
                    var i = t.getRenderingMesh();
                    if (!r._meshExcluded(i)) {
                        var n = t.getMaterial();
                        if (n) {
                            var o = i.getScene(),
                                s = o.getEngine();
                            s.setState(n.backFaceCulling);
                            var a = i._getInstancesRenderList(t._id);
                            if (!a.mustReturn) {
                                var l = s.getCaps().instancedArrays && null !== a.visibleInstances[t._id];
                                if (r._isReady(t, l)) {
                                    var c = r._volumetricLightScatteringPass;
                                    if (i === r.mesh && (c = t.effect ? t.effect : n.getEffect()), s.enableEffect(c), i._bind(t, c, e.Material.TriangleFillMode), i === r.mesh) n.bind(i.getWorldMatrix(), i);
                                    else {
                                        if (r._volumetricLightScatteringPass.setMatrix("viewProjection", o.getTransformMatrix()), n && n.needAlphaTesting()) {
                                            var h = n.getAlphaTestTexture();
                                            r._volumetricLightScatteringPass.setTexture("diffuseSampler", h), h && r._volumetricLightScatteringPass.setMatrix("diffuseMatrix", h.getTextureMatrix())
                                        }
                                        i.useBones && i.computeBonesUsingShaders && i.skeleton && r._volumetricLightScatteringPass.setMatrices("mBones", i.skeleton.getTransformMatrices(i))
                                    }
                                    i._processRendering(t, r._volumetricLightScatteringPass, e.Material.TriangleFillMode, a, l, (function(e, t) {
                                        return c.setMatrix("world", t)
                                    }))
                                }
                            }
                        }
                    }
                },
                l = new e.Color4(0, 0, 0, 1);
            this._volumetricLightScatteringRTT.onBeforeRenderObservable.add((function() {
                s = t.clearColor, t.clearColor = l
            })), this._volumetricLightScatteringRTT.onAfterRenderObservable.add((function() {
                t.clearColor = s
            })), this._volumetricLightScatteringRTT.customRenderFunction = function(i, r, n, o) {
                var s, l = t.getEngine();
                if (o.length) {
                    for (l.setColorWrite(!1), s = 0; s < o.length; s++) a(o.data[s]);
                    l.setColorWrite(!0)
                }
                for (s = 0; s < i.length; s++) a(i.data[s]);
                for (s = 0; s < r.length; s++) a(r.data[s]);
                if (n.length) {
                    for (s = 0; s < n.length; s++) {
                        var c = n.data[s],
                            h = c.getBoundingInfo();
                        h && t.activeCamera && (c._alphaIndex = c.getMesh().alphaIndex, c._distanceToCamera = h.boundingSphere.centerWorld.subtract(t.activeCamera.position).length())
                    }
                    var u = n.data.slice(0, n.length);
                    for (u.sort((function(e, t) {
                            return e._alphaIndex > t._alphaIndex ? 1 : e._alphaIndex < t._alphaIndex ? -1 : e._distanceToCamera < t._distanceToCamera ? 1 : e._distanceToCamera > t._distanceToCamera ? -1 : 0
                        })), l.setAlphaMode(e.Engine.ALPHA_COMBINE), s = 0; s < u.length; s++) a(u[s]);
                    l.setAlphaMode(e.Engine.ALPHA_DISABLE)
                }
            }
        }, i.prototype._updateMeshScreenCoordinates = function(t) {
            var i, r = t.getTransformMatrix();
            i = this.useCustomMeshPosition ? this.customMeshPosition : this.attachedNode ? this.attachedNode.position : this.mesh.parent ? this.mesh.getAbsolutePosition() : this.mesh.position;
            var n = e.Vector3.Project(i, e.Matrix.Identity(), r, this._viewPort);
            this._screenCoordinates.x = n.x / this._viewPort.width, this._screenCoordinates.y = n.y / this._viewPort.height, this.invert && (this._screenCoordinates.y = 1 - this._screenCoordinates.y)
        }, i.CreateDefaultMesh = function(t, i) {
            var r = e.Mesh.CreatePlane(t, 1, i);
            r.billboardMode = e.AbstractMesh.BILLBOARDMODE_ALL;
            var n = new e.StandardMaterial(t + "Material", i);
            return n.emissiveColor = new e.Color3(1, 1, 1), r.material = n, r
        }, __decorate([e.serializeAsVector3()], i.prototype, "customMeshPosition", void 0), __decorate([e.serialize()], i.prototype, "useCustomMeshPosition", void 0), __decorate([e.serialize()], i.prototype, "invert", void 0), __decorate([e.serializeAsMeshReference()], i.prototype, "mesh", void 0), __decorate([e.serialize()], i.prototype, "excludedMeshes", void 0), __decorate([e.serialize()], i.prototype, "exposure", void 0), __decorate([e.serialize()], i.prototype, "decay", void 0), __decorate([e.serialize()], i.prototype, "weight", void 0), __decorate([e.serialize()], i.prototype, "density", void 0), i
    })(e.PostProcess);
    e.VolumetricLightScatteringPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            var c = t.call(this, i, "colorCorrection", null, ["colorTable"], n, o, s, a, l) || this;
            return c._colorTableTexture = new e.Texture(r, o.getScene(), !0, !1, e.Texture.TRILINEAR_SAMPLINGMODE), c._colorTableTexture.anisotropicFilteringLevel = 1, c._colorTableTexture.wrapU = e.Texture.CLAMP_ADDRESSMODE, c._colorTableTexture.wrapV = e.Texture.CLAMP_ADDRESSMODE, c.onApply = function(e) {
                e.setTexture("colorTable", c._colorTableTexture)
            }, c
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.ColorCorrectionPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.Hable = 0] = "Hable", e[e.Reinhard = 1] = "Reinhard", e[e.HejiDawson = 2] = "HejiDawson", e[e.Photographic = 3] = "Photographic"
    })(t = e.TonemappingOperator || (e.TonemappingOperator = {}));
    var i = (function(i) {
        function r(r, n, o, s, a, l, c) {
            void 0 === a && (a = e.Texture.BILINEAR_SAMPLINGMODE), void 0 === c && (c = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var h = i.call(this, r, "tonemap", ["_ExposureAdjustment"], null, 1, s, a, l, !0, null, c) || this;
            h._operator = n, h.exposureAdjustment = o;
            var u = "#define ";
            return h._operator === t.Hable ? u += "HABLE_TONEMAPPING" : h._operator === t.Reinhard ? u += "REINHARD_TONEMAPPING" : h._operator === t.HejiDawson ? u += "OPTIMIZED_HEJIDAWSON_TONEMAPPING" : h._operator === t.Photographic && (u += "PHOTOGRAPHIC_TONEMAPPING"), h.updateEffect(u), h.onApply = function(e) {
                e.setFloat("_ExposureAdjustment", h.exposureAdjustment)
            }, h
        }
        return __extends(r, i), r
    })(e.PostProcess);
    e.TonemapPostProcess = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r, n, o, s) {
            return e.call(this, t, "displayPass", ["passSampler"], ["passSampler"], i, r, n, o, s) || this
        }
        return __extends(t, e), t
    })(e.PostProcess);
    e.DisplayPassPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            return void 0 === l && (l = e.Engine.TEXTURETYPE_UNSIGNED_INT), t.call(this, i, "highlights", null, null, r, n, o, s, a, null, l) || this
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.HighlightsPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c) {
            void 0 === n && (n = null), void 0 === l && (l = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var h = t.call(this, i, "imageProcessing", [], [], r, n, o, s, a, null, l, "postprocess", null, !0) || this;
            return h._fromLinearSpace = !0, h._defines = {
                IMAGEPROCESSING: !1,
                VIGNETTE: !1,
                VIGNETTEBLENDMODEMULTIPLY: !1,
                VIGNETTEBLENDMODEOPAQUE: !1,
                TONEMAPPING: !1,
                CONTRAST: !1,
                COLORCURVES: !1,
                COLORGRADING: !1,
                COLORGRADING3D: !1,
                FROMLINEARSPACE: !1,
                SAMPLER3DGREENDEPTH: !1,
                SAMPLER3DBGRMAP: !1,
                IMAGEPROCESSINGPOSTPROCESS: !1,
                EXPOSURE: !1
            }, c ? (c.applyByPostProcess = !0, h._attachImageProcessingConfiguration(c, !0), h.fromLinearSpace = !1) : (h._attachImageProcessingConfiguration(null, !0), h.imageProcessingConfiguration.applyByPostProcess = !0), h.onApply = function(e) {
                h.imageProcessingConfiguration.bind(e, h.aspectRatio)
            }, h
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "imageProcessingConfiguration", {
                get: function() {
                    return this._imageProcessingConfiguration
                },
                set: function(e) {
                    this._attachImageProcessingConfiguration(e)
                },
                enumerable: !0,
                configurable: !0
            }), i.prototype._attachImageProcessingConfiguration = function(t, i) {
                var r = this;
                if (void 0 === i && (i = !1), t !== this._imageProcessingConfiguration) {
                    if (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), t) this._imageProcessingConfiguration = t;
                    else {
                        var n = null,
                            o = this.getEngine(),
                            s = this.getCamera();
                        if (s) n = s.getScene();
                        else if (o && o.scenes) {
                            var a = o.scenes;
                            n = a[a.length - 1]
                        } else n = e.Engine.LastCreatedScene;
                        this._imageProcessingConfiguration = n.imageProcessingConfiguration
                    }
                    this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add((function(e) {
                        r._updateParameters()
                    })), i || this._updateParameters()
                }
            }, Object.defineProperty(i.prototype, "colorCurves", {
                get: function() {
                    return this.imageProcessingConfiguration.colorCurves
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorCurves = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "colorCurvesEnabled", {
                get: function() {
                    return this.imageProcessingConfiguration.colorCurvesEnabled
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorCurvesEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "colorGradingTexture", {
                get: function() {
                    return this.imageProcessingConfiguration.colorGradingTexture
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorGradingTexture = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "colorGradingEnabled", {
                get: function() {
                    return this.imageProcessingConfiguration.colorGradingEnabled
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorGradingEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "exposure", {
                get: function() {
                    return this.imageProcessingConfiguration.exposure
                },
                set: function(e) {
                    this.imageProcessingConfiguration.exposure = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "toneMappingEnabled", {
                get: function() {
                    return this._imageProcessingConfiguration.toneMappingEnabled
                },
                set: function(e) {
                    this._imageProcessingConfiguration.toneMappingEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "contrast", {
                get: function() {
                    return this.imageProcessingConfiguration.contrast
                },
                set: function(e) {
                    this.imageProcessingConfiguration.contrast = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteStretch", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteStretch
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteStretch = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteCentreX", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteCentreX
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteCentreX = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteCentreY", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteCentreY
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteCentreY = e
                },
                enumerable: !0,
                configurable: !0
            }),
            Object.defineProperty(i.prototype, "vignetteWeight", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteWeight
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteWeight = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteColor", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteColor
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteColor = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteCameraFov", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteCameraFov
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteCameraFov = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteBlendMode", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteBlendMode
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteBlendMode = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "vignetteEnabled", {
                get: function() {
                    return this.imageProcessingConfiguration.vignetteEnabled
                },
                set: function(e) {
                    this.imageProcessingConfiguration.vignetteEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(i.prototype, "fromLinearSpace", {
                get: function() {
                    return this._fromLinearSpace
                },
                set: function(e) {
                    this._fromLinearSpace !== e && (this._fromLinearSpace = e, this._updateParameters())
                },
                enumerable: !0,
                configurable: !0
            }), i.prototype.getClassName = function() {
                return "ImageProcessingPostProcess"
            }, i.prototype._updateParameters = function() {
                this._defines.FROMLINEARSPACE = this._fromLinearSpace, this.imageProcessingConfiguration.prepareDefines(this._defines, !0);
                var t = "";
                for (var i in this._defines) this._defines[i] && (t += "#define " + i + ";\r\n");
                var r = ["textureSampler"];
                e.ImageProcessingConfiguration.PrepareSamplers(r, this._defines);
                var n = ["scale"];
                e.ImageProcessingConfiguration.PrepareUniforms(n, this._defines), this.updateEffect(t, n, r)
            }, i.prototype.dispose = function(e) {
                t.prototype.dispose.call(this, e), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), this.imageProcessingConfiguration.applyByPostProcess = !1
            }, __decorate([e.serialize()], i.prototype, "_fromLinearSpace", void 0), i
    })(e.PostProcess);
    e.ImageProcessingPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u) {
            void 0 === a && (a = e.Texture.BILINEAR_SAMPLINGMODE), void 0 === h && (h = e.Engine.TEXTURETYPE_UNSIGNED_INT), void 0 === u && (u = "");
            var f = t.call(this, i, "kernelBlur", ["delta", "direction", "cameraMinMaxZ"], ["circleOfConfusionSampler"], o, s, a, l, c, null, h, "kernelBlur", {
                varyingCount: 0,
                depCount: 0
            }, !0) || this;
            return f.direction = r, f._packedFloat = !1, f._staticDefines = "", f._staticDefines = u, f.onApplyObservable.add((function(e) {
                e.setFloat2("delta", 1 / f.width * f.direction.x, 1 / f.height * f.direction.y)
            })), f.kernel = n, f
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "kernel", {
            get: function() {
                return this._idealKernel
            },
            set: function(e) {
                this._idealKernel !== e && (e = Math.max(e, 1), this._idealKernel = e, this._kernel = this._nearestBestKernel(e), this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "packedFloat", {
            get: function() {
                return this._packedFloat
            },
            set: function(e) {
                this._packedFloat !== e && (this._packedFloat = e, this._updateParameters())
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype._updateParameters = function() {
            for (var e = this._kernel, t = (e - 1) / 2, i = [], r = [], n = 0, o = 0; o < e; o++) {
                var s = o / (e - 1),
                    a = this._gaussianWeight(2 * s - 1);
                i[o] = o - t, r[o] = a, n += a
            }
            for (var o = 0; o < r.length; o++) r[o] /= n;
            for (var l = [], c = [], h = [], o = 0; o <= t; o += 2) {
                var u = Math.min(o + 1, Math.floor(t));
                if (o === u) h.push({
                    o: i[o],
                    w: r[o]
                });
                else {
                    var f = u === t,
                        d = r[o] + r[u] * (f ? .5 : 1),
                        p = i[o] + 1 / (1 + r[o] / r[u]);
                    0 === p ? (h.push({
                        o: i[o],
                        w: r[o]
                    }), h.push({
                        o: i[o + 1],
                        w: r[o + 1]
                    })) : (h.push({
                        o: p,
                        w: d
                    }), h.push({
                        o: -p,
                        w: d
                    }))
                }
            }
            for (var o = 0; o < h.length; o++) c[o] = h[o].o, l[o] = h[o].w;
            i = c, r = l;
            var _ = this.getEngine().getCaps().maxVaryingVectors,
                m = Math.max(_, 0) - 1,
                g = Math.min(i.length, m),
                v = "";
            v += this._staticDefines;
            for (var o = 0; o < g; o++) v += "#define KERNEL_OFFSET" + o + " " + this._glslFloat(i[o]) + "\r\n", v += "#define KERNEL_WEIGHT" + o + " " + this._glslFloat(r[o]) + "\r\n";
            for (var y = 0, o = m; o < i.length; o++) v += "#define KERNEL_DEP_OFFSET" + y + " " + this._glslFloat(i[o]) + "\r\n", v += "#define KERNEL_DEP_WEIGHT" + y + " " + this._glslFloat(r[o]) + "\r\n", y++;
            this.packedFloat && (v += "#define PACKEDFLOAT 1"), this.updateEffect(v, null, null, {
                varyingCount: g,
                depCount: y
            })
        }, i.prototype._nearestBestKernel = function(e) {
            for (var t = Math.round(e), i = 0, r = [t, t - 1, t + 1, t - 2, t + 2]; i < r.length; i++) {
                var n = r[i];
                if (n % 2 != 0 && Math.floor(n / 2) % 2 == 0 && n > 0) return Math.max(n, 3)
            }
            return Math.max(t, 3)
        }, i.prototype._gaussianWeight = function(e) {
            var t = Math.sqrt(2 * Math.PI) * (1 / 3),
                i = -e * e / (1 / 3 * 2 * (1 / 3));
            return 1 / t * Math.exp(i)
        }, i.prototype._glslFloat = function(e, t) {
            return void 0 === t && (t = 8), e.toFixed(t).replace(/0+$/, "")
        }, i
    })(e.PostProcess);
    e.BlurPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h, u, f, d) {
            void 0 === c && (c = null), void 0 === h && (h = e.Texture.BILINEAR_SAMPLINGMODE), void 0 === d && (d = e.Engine.TEXTURETYPE_UNSIGNED_INT);
            var p = t.call(this, i, n, o, s, a, h = e.Texture.BILINEAR_SAMPLINGMODE, u, f, d = e.Engine.TEXTURETYPE_UNSIGNED_INT, "#define DOF 1\r\n") || this;
            return p.direction = n, p.onApplyObservable.add((function(e) {
                null != c && e.setTextureFromPostProcess("textureSampler", c), e.setTextureFromPostProcess("circleOfConfusionSampler", l), r.activeCamera && e.setFloat2("cameraMinMaxZ", r.activeCamera.minZ, r.activeCamera.maxZ)
            })), p
        }
        return __extends(i, t), i
    })(e.BlurPostProcess);
    e.DepthOfFieldBlurPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l) {
            void 0 === n && (n = null), void 0 === o && (o = null), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null);
            var c = t.call(this, i, r.getScene()) || this;
            return c.name = i, c.children = new Array, c.animations = new Array, c._index = null, c._worldTransform = new e.Matrix, c._absoluteTransform = new e.Matrix, c._invertedAbsoluteTransform = new e.Matrix, c._scaleMatrix = e.Matrix.Identity(), c._scaleVector = e.Vector3.One(), c._negateScaleChildren = e.Vector3.One(), c._scalingDeterminant = 1, c._skeleton = r, c._localMatrix = o || e.Matrix.Identity(), c._restPose = s || c._localMatrix.clone(), c._baseMatrix = a || c._localMatrix.clone(), c._index = l, r.bones.push(c), c.setParent(n, !1), c._updateDifferenceMatrix(), c
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "_matrix", {
            get: function() {
                return this._localMatrix
            },
            set: function(e) {
                this._localMatrix ? this._localMatrix.copyFrom(e) : this._localMatrix = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getSkeleton = function() {
            return this._skeleton
        }, i.prototype.getParent = function() {
            return this._parent
        }, i.prototype.setParent = function(e, t) {
            if (void 0 === t && (t = !0), this._parent !== e) {
                if (this._parent) {
                    var i = this._parent.children.indexOf(this); - 1 !== i && this._parent.children.splice(i, 1)
                }
                this._parent = e, this._parent && this._parent.children.push(this), t && this._updateDifferenceMatrix()
            }
        }, i.prototype.getLocalMatrix = function() {
            return this._localMatrix
        }, i.prototype.getBaseMatrix = function() {
            return this._baseMatrix
        }, i.prototype.getRestPose = function() {
            return this._restPose
        }, i.prototype.returnToRest = function() {
            this.updateMatrix(this._restPose.clone())
        }, i.prototype.getWorldMatrix = function() {
            return this._worldTransform
        }, i.prototype.getInvertedAbsoluteTransform = function() {
            return this._invertedAbsoluteTransform
        }, i.prototype.getAbsoluteTransform = function() {
            return this._absoluteTransform
        }, Object.defineProperty(i.prototype, "position", {
            get: function() {
                return this.getPosition()
            },
            set: function(e) {
                this.setPosition(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "rotation", {
            get: function() {
                return this.getRotation()
            },
            set: function(e) {
                this.setRotation(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "rotationQuaternion", {
            get: function() {
                return this.getRotationQuaternion()
            },
            set: function(e) {
                this.setRotationQuaternion(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "scaling", {
            get: function() {
                return this.getScale()
            },
            set: function(e) {
                this.setScale(e.x, e.y, e.z)
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.updateMatrix = function(e, t) {
            void 0 === t && (t = !0), this._baseMatrix = e.clone(), this._localMatrix = e.clone(), this._skeleton._markAsDirty(), t && this._updateDifferenceMatrix()
        }, i.prototype._updateDifferenceMatrix = function(e) {
            e || (e = this._baseMatrix), this._parent ? e.multiplyToRef(this._parent._absoluteTransform, this._absoluteTransform) : this._absoluteTransform.copyFrom(e), this._absoluteTransform.invertToRef(this._invertedAbsoluteTransform);
            for (var t = 0; t < this.children.length; t++) this.children[t]._updateDifferenceMatrix();
            this._scalingDeterminant = this._absoluteTransform.determinant() < 0 ? -1 : 1
        }, i.prototype.markAsDirty = function() {
            this._currentRenderId++, this._skeleton._markAsDirty()
        }, i.prototype.copyAnimationRange = function(t, i, r, n, o) {
            void 0 === n && (n = !1), void 0 === o && (o = null), 0 === this.animations.length && (this.animations.push(new e.Animation(this.name, "_matrix", t.animations[0].framePerSecond, e.Animation.ANIMATIONTYPE_MATRIX, 0)), this.animations[0].setKeys([]));
            var s = t.animations[0].getRange(i);
            if (!s) return !1;
            for (var a, l, c, h = s.from, u = s.to, f = t.animations[0].getKeys(), d = t.length, p = t.getParent(), _ = this.getParent(), m = n && p && d && this.length && d !== this.length, g = m && _ && p ? _.length / p.length : 1, v = n && !_ && o && (1 !== o.x || 1 !== o.y || 1 !== o.z), y = this.animations[0].getKeys(), b = 0, x = f.length; b < x; b++) a = f[b], a.frame >= h && a.frame <= u && (n ? (c = a.value.clone(), m ? (l = c.getTranslation(), c.setTranslation(l.scaleInPlace(g))) : v && o ? (l = c.getTranslation(), c.setTranslation(l.multiplyInPlace(o))) : c = a.value) : c = a.value, y.push({
                frame: a.frame + r,
                value: c
            }));
            return this.animations[0].createRange(i, h + r, u + r), !0
        }, i.prototype.translate = function(t, r, n) {
            void 0 === r && (r = e.Space.LOCAL);
            var o = this.getLocalMatrix();
            if (r == e.Space.LOCAL) o.m[12] += t.x, o.m[13] += t.y, o.m[14] += t.z;
            else {
                var s = null;
                n && (s = n.getWorldMatrix()), this._skeleton.computeAbsoluteTransforms();
                var a = i._tmpMats[0],
                    l = i._tmpVecs[0];
                this._parent && (n && s ? (a.copyFrom(this._parent.getAbsoluteTransform()), a.multiplyToRef(s, a)) : a.copyFrom(this._parent.getAbsoluteTransform())), a.m[12] = 0, a.m[13] = 0, a.m[14] = 0, a.invert(), e.Vector3.TransformCoordinatesToRef(t, a, l), o.m[12] += l.x, o.m[13] += l.y, o.m[14] += l.z
            }
            this.markAsDirty()
        }, i.prototype.setPosition = function(t, r, n) {
            void 0 === r && (r = e.Space.LOCAL);
            var o = this.getLocalMatrix();
            if (r == e.Space.LOCAL) o.m[12] = t.x, o.m[13] = t.y, o.m[14] = t.z;
            else {
                var s = null;
                n && (s = n.getWorldMatrix()), this._skeleton.computeAbsoluteTransforms();
                var a = i._tmpMats[0],
                    l = i._tmpVecs[0];
                this._parent && (n && s ? (a.copyFrom(this._parent.getAbsoluteTransform()), a.multiplyToRef(s, a)) : a.copyFrom(this._parent.getAbsoluteTransform())), a.invert(), e.Vector3.TransformCoordinatesToRef(t, a, l), o.m[12] = l.x, o.m[13] = l.y, o.m[14] = l.z
            }
            this.markAsDirty()
        }, i.prototype.setAbsolutePosition = function(t, i) {
            this.setPosition(t, e.Space.WORLD, i)
        }, i.prototype.setScale = function(e, t, i, r) {
            void 0 === r && (r = !1), this.animations[0] && !this.animations[0].hasRunningRuntimeAnimations && (r || (this._negateScaleChildren.x = 1 / e, this._negateScaleChildren.y = 1 / t, this._negateScaleChildren.z = 1 / i), this._syncScaleVector()), this.scale(e / this._scaleVector.x, t / this._scaleVector.y, i / this._scaleVector.z, r)
        }, i.prototype.scale = function(t, r, n, o) {
            void 0 === o && (o = !1);
            var s = this.getLocalMatrix(),
                a = i._tmpMats[0];
            a.copyFrom(s);
            var l = i._tmpMats[1];
            l.copyFrom(a), l.invert();
            var c = i._tmpMats[2];
            e.Matrix.FromValuesToRef(t, 0, 0, 0, 0, r, 0, 0, 0, 0, n, 0, 0, 0, 0, 1, c), this._scaleMatrix.multiplyToRef(c, this._scaleMatrix), this._scaleVector.x *= t, this._scaleVector.y *= r, this._scaleVector.z *= n, s.multiplyToRef(l, s), s.multiplyToRef(c, s), s.multiplyToRef(a, s);
            var h = this.getParent();
            h ? s.multiplyToRef(h.getAbsoluteTransform(), this.getAbsoluteTransform()) : this.getAbsoluteTransform().copyFrom(s);
            var u = this.children.length;
            c.invert();
            for (var f = 0; f < u; f++) {
                var d = this.children[f],
                    p = d.getLocalMatrix();
                p.multiplyToRef(c, p);
                var _ = d.getLocalMatrix();
                _.m[12] *= t, _.m[13] *= r, _.m[14] *= n
            }
            if (this.computeAbsoluteTransforms(), o)
                for (var f = 0; f < u; f++) this.children[f].scale(t, r, n, o);
            this.markAsDirty()
        }, i.prototype.setYawPitchRoll = function(t, r, n, o, s) {
            void 0 === o && (o = e.Space.LOCAL);
            var a = i._tmpMats[0];
            e.Matrix.RotationYawPitchRollToRef(t, r, n, a);
            var l = i._tmpMats[1];
            this._getNegativeRotationToRef(l, o, s), l.multiplyToRef(a, a), this._rotateWithMatrix(a, o, s)
        }, i.prototype.rotate = function(t, r, n, o) {
            void 0 === n && (n = e.Space.LOCAL);
            var s = i._tmpMats[0];
            s.m[12] = 0, s.m[13] = 0, s.m[14] = 0, e.Matrix.RotationAxisToRef(t, r, s), this._rotateWithMatrix(s, n, o)
        }, i.prototype.setAxisAngle = function(t, r, n, o) {
            void 0 === n && (n = e.Space.LOCAL);
            var s = i._tmpMats[0];
            e.Matrix.RotationAxisToRef(t, r, s);
            var a = i._tmpMats[1];
            this._getNegativeRotationToRef(a, n, o), a.multiplyToRef(s, s), this._rotateWithMatrix(s, n, o)
        }, i.prototype.setRotation = function(t, i, r) {
            void 0 === i && (i = e.Space.LOCAL), this.setYawPitchRoll(t.y, t.x, t.z, i, r)
        }, i.prototype.setRotationQuaternion = function(t, r, n) {
            void 0 === r && (r = e.Space.LOCAL);
            var o = i._tmpMats[0];
            this._getNegativeRotationToRef(o, r, n);
            var s = i._tmpMats[1];
            e.Matrix.FromQuaternionToRef(t, s), o.multiplyToRef(s, s), this._rotateWithMatrix(s, r, n)
        }, i.prototype.setRotationMatrix = function(t, r, n) {
            void 0 === r && (r = e.Space.LOCAL);
            var o = i._tmpMats[0];
            this._getNegativeRotationToRef(o, r, n);
            var s = i._tmpMats[1];
            s.copyFrom(t), o.multiplyToRef(t, s), this._rotateWithMatrix(s, r, n)
        }, i.prototype._rotateWithMatrix = function(t, r, n) {
            void 0 === r && (r = e.Space.LOCAL);
            var o = this.getLocalMatrix(),
                s = o.m[12],
                a = o.m[13],
                l = o.m[14],
                c = this.getParent(),
                h = i._tmpMats[3],
                u = i._tmpMats[4];
            c ? (r == e.Space.WORLD ? n ? (h.copyFrom(n.getWorldMatrix()), c.getAbsoluteTransform().multiplyToRef(h, h)) : h.copyFrom(c.getAbsoluteTransform()) : h = c._scaleMatrix, u.copyFrom(h), u.invert(), o.multiplyToRef(h, o), o.multiplyToRef(t, o), o.multiplyToRef(u, o)) : r == e.Space.WORLD && n ? (h.copyFrom(n.getWorldMatrix()), u.copyFrom(h), u.invert(), o.multiplyToRef(h, o), o.multiplyToRef(t, o), o.multiplyToRef(u, o)) : o.multiplyToRef(t, o), o.m[12] = s, o.m[13] = a, o.m[14] = l, this.computeAbsoluteTransforms(), this.markAsDirty()
        }, i.prototype._getNegativeRotationToRef = function(t, r, n) {
            if (void 0 === r && (r = e.Space.LOCAL), r == e.Space.WORLD) {
                var o = i._tmpMats[2];
                if (o.copyFrom(this._scaleMatrix), t.copyFrom(this.getAbsoluteTransform()), n) {
                    t.multiplyToRef(n.getWorldMatrix(), t);
                    var s = i._tmpMats[3];
                    e.Matrix.ScalingToRef(n.scaling.x, n.scaling.y, n.scaling.z, s), o.multiplyToRef(s, o)
                }
                t.invert(), o.m[0] *= this._scalingDeterminant, t.multiplyToRef(o, t)
            } else {
                t.copyFrom(this.getLocalMatrix()), t.invert();
                var o = i._tmpMats[2];
                if (o.copyFrom(this._scaleMatrix), this._parent) {
                    var a = i._tmpMats[3];
                    a.copyFrom(this._parent._scaleMatrix), a.invert(), a.multiplyToRef(t, t)
                } else o.m[0] *= this._scalingDeterminant;
                t.multiplyToRef(o, t)
            }
        }, i.prototype.getScale = function() {
            return this._scaleVector.clone()
        }, i.prototype.getScaleToRef = function(e) {
            e.copyFrom(this._scaleVector)
        }, i.prototype.getPosition = function(t, i) {
            void 0 === t && (t = e.Space.LOCAL), void 0 === i && (i = null);
            var r = e.Vector3.Zero();
            return this.getPositionToRef(t, i, r), r
        }, i.prototype.getPositionToRef = function(t, r, n) {
            if (void 0 === t && (t = e.Space.LOCAL), t == e.Space.LOCAL) {
                var o = this.getLocalMatrix();
                n.x = o.m[12], n.y = o.m[13], n.z = o.m[14]
            } else {
                var s = null;
                r && (s = r.getWorldMatrix()), this._skeleton.computeAbsoluteTransforms();
                var a = i._tmpMats[0];
                r && s ? (a.copyFrom(this.getAbsoluteTransform()), a.multiplyToRef(s, a)) : a = this.getAbsoluteTransform(), n.x = a.m[12], n.y = a.m[13], n.z = a.m[14]
            }
        }, i.prototype.getAbsolutePosition = function(t) {
            void 0 === t && (t = null);
            var i = e.Vector3.Zero();
            return this.getPositionToRef(e.Space.WORLD, t, i), i
        }, i.prototype.getAbsolutePositionToRef = function(t, i) {
            this.getPositionToRef(e.Space.WORLD, t, i)
        }, i.prototype.computeAbsoluteTransforms = function() {
            if (this._parent) this._localMatrix.multiplyToRef(this._parent._absoluteTransform, this._absoluteTransform);
            else {
                this._absoluteTransform.copyFrom(this._localMatrix);
                var e = this._skeleton.getPoseMatrix();
                e && this._absoluteTransform.multiplyToRef(e, this._absoluteTransform)
            }
            for (var t = this.children, i = t.length, r = 0; r < i; r++) t[r].computeAbsoluteTransforms()
        }, i.prototype._syncScaleVector = function() {
            var t = this.getLocalMatrix(),
                i = t.m[0] * t.m[0] + t.m[1] * t.m[1] + t.m[2] * t.m[2],
                r = t.m[4] * t.m[4] + t.m[5] * t.m[5] + t.m[6] * t.m[6],
                n = t.m[8] * t.m[8] + t.m[9] * t.m[9] + t.m[10] * t.m[10],
                o = t.m[0] * t.m[1] * t.m[2] * t.m[3] < 0 ? -1 : 1,
                s = t.m[4] * t.m[5] * t.m[6] * t.m[7] < 0 ? -1 : 1,
                a = t.m[8] * t.m[9] * t.m[10] * t.m[11] < 0 ? -1 : 1;
            this._scaleVector.x = o * Math.sqrt(i), this._scaleVector.y = s * Math.sqrt(r), this._scaleVector.z = a * Math.sqrt(n), this._parent && (this._scaleVector.x /= this._parent._negateScaleChildren.x, this._scaleVector.y /= this._parent._negateScaleChildren.y, this._scaleVector.z /= this._parent._negateScaleChildren.z), e.Matrix.FromValuesToRef(this._scaleVector.x, 0, 0, 0, 0, this._scaleVector.y, 0, 0, 0, 0, this._scaleVector.z, 0, 0, 0, 0, 1, this._scaleMatrix)
        }, i.prototype.getDirection = function(t, i) {
            void 0 === i && (i = null);
            var r = e.Vector3.Zero();
            return this.getDirectionToRef(t, i, r), r
        }, i.prototype.getDirectionToRef = function(t, r, n) {
            void 0 === r && (r = null);
            var o = null;
            r && (o = r.getWorldMatrix()), this._skeleton.computeAbsoluteTransforms();
            var s = i._tmpMats[0];
            s.copyFrom(this.getAbsoluteTransform()), r && o && s.multiplyToRef(o, s), e.Vector3.TransformNormalToRef(t, s, n), n.normalize()
        }, i.prototype.getRotation = function(t, i) {
            void 0 === t && (t = e.Space.LOCAL), void 0 === i && (i = null);
            var r = e.Vector3.Zero();
            return this.getRotationToRef(t, i, r), r
        }, i.prototype.getRotationToRef = function(t, r, n) {
            void 0 === t && (t = e.Space.LOCAL), void 0 === r && (r = null);
            var o = i._tmpQuat;
            this.getRotationQuaternionToRef(t, r, o), o.toEulerAnglesToRef(n)
        }, i.prototype.getRotationQuaternion = function(t, i) {
            void 0 === t && (t = e.Space.LOCAL), void 0 === i && (i = null);
            var r = e.Quaternion.Identity();
            return this.getRotationQuaternionToRef(t, i, r), r
        }, i.prototype.getRotationQuaternionToRef = function(t, r, n) {
            if (void 0 === t && (t = e.Space.LOCAL), void 0 === r && (r = null), t == e.Space.LOCAL) this.getLocalMatrix().decompose(i._tmpVecs[0], n, i._tmpVecs[1]);
            else {
                var o = i._tmpMats[0],
                    s = this.getAbsoluteTransform();
                r ? s.multiplyToRef(r.getWorldMatrix(), o) : o.copyFrom(s), o.m[0] *= this._scalingDeterminant, o.m[1] *= this._scalingDeterminant, o.m[2] *= this._scalingDeterminant, o.decompose(i._tmpVecs[0], n, i._tmpVecs[1])
            }
        }, i.prototype.getRotationMatrix = function(t, i) {
            void 0 === t && (t = e.Space.LOCAL);
            var r = e.Matrix.Identity();
            return this.getRotationMatrixToRef(t, i, r), r
        }, i.prototype.getRotationMatrixToRef = function(t, r, n) {
            if (void 0 === t && (t = e.Space.LOCAL), t == e.Space.LOCAL) this.getLocalMatrix().getRotationMatrixToRef(n);
            else {
                var o = i._tmpMats[0],
                    s = this.getAbsoluteTransform();
                r ? s.multiplyToRef(r.getWorldMatrix(), o) : o.copyFrom(s), o.m[0] *= this._scalingDeterminant, o.m[1] *= this._scalingDeterminant, o.m[2] *= this._scalingDeterminant, o.getRotationMatrixToRef(n)
            }
        }, i.prototype.getAbsolutePositionFromLocal = function(t, i) {
            void 0 === i && (i = null);
            var r = e.Vector3.Zero();
            return this.getAbsolutePositionFromLocalToRef(t, i, r), r
        }, i.prototype.getAbsolutePositionFromLocalToRef = function(t, r, n) {
            void 0 === r && (r = null);
            var o = null;
            r && (o = r.getWorldMatrix()), this._skeleton.computeAbsoluteTransforms();
            var s = i._tmpMats[0];
            r && o ? (s.copyFrom(this.getAbsoluteTransform()), s.multiplyToRef(o, s)) : s = this.getAbsoluteTransform(), e.Vector3.TransformCoordinatesToRef(t, s, n)
        }, i.prototype.getLocalPositionFromAbsolute = function(t, i) {
            void 0 === i && (i = null);
            var r = e.Vector3.Zero();
            return this.getLocalPositionFromAbsoluteToRef(t, i, r), r
        }, i.prototype.getLocalPositionFromAbsoluteToRef = function(t, r, n) {
            void 0 === r && (r = null);
            var o = null;
            r && (o = r.getWorldMatrix()), this._skeleton.computeAbsoluteTransforms();
            var s = i._tmpMats[0];
            s.copyFrom(this.getAbsoluteTransform()), r && o && s.multiplyToRef(o, s), s.invert(), e.Vector3.TransformCoordinatesToRef(t, s, n)
        }, i._tmpVecs = [e.Vector3.Zero(), e.Vector3.Zero()], i._tmpQuat = e.Quaternion.Identity(), i._tmpMats = [e.Matrix.Identity(), e.Matrix.Identity(), e.Matrix.Identity(), e.Matrix.Identity(), e.Matrix.Identity()], i
    })(e.Node);
    e.Bone = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            if (this.targetPosition = e.Vector3.Zero(), this.poleTargetPosition = e.Vector3.Zero(), this.poleTargetLocalOffset = e.Vector3.Zero(), this.poleAngle = 0, this.slerpAmount = 1, this._bone1Quat = e.Quaternion.Identity(), this._bone1Mat = e.Matrix.Identity(), this._bone2Ang = Math.PI, this._maxAngle = Math.PI, this._rightHandedSystem = !1, this._bendAxis = e.Vector3.Right(), this._slerping = !1, this._adjustRoll = 0, this._bone2 = i, this._bone1 = i.getParent(), this._bone1) {
                this.mesh = t;
                var n = i.getPosition();
                if (i.getAbsoluteTransform().determinant() > 0 && (this._rightHandedSystem = !0, this._bendAxis.x = 0, this._bendAxis.y = 0, this._bendAxis.z = -1, n.x > n.y && n.x > n.z && (this._adjustRoll = .5 * Math.PI, this._bendAxis.z = 1)), this._bone1.length) {
                    var o = this._bone1.getScale(),
                        s = this._bone2.getScale();
                    this._bone1Length = this._bone1.length * o.y * this.mesh.scaling.y, this._bone2Length = this._bone2.length * s.y * this.mesh.scaling.y
                } else if (this._bone1.children[0]) {
                    t.computeWorldMatrix(!0);
                    var a = this._bone2.children[0].getAbsolutePosition(t),
                        l = this._bone2.getAbsolutePosition(t),
                        c = this._bone1.getAbsolutePosition(t);
                    this._bone1Length = e.Vector3.Distance(a, l), this._bone2Length = e.Vector3.Distance(l, c)
                }
                this._bone1.getRotationMatrixToRef(e.Space.WORLD, t, this._bone1Mat), this.maxAngle = Math.PI, r && (r.targetMesh && (this.targetMesh = r.targetMesh, this.targetMesh.computeWorldMatrix(!0)), r.poleTargetMesh ? (this.poleTargetMesh = r.poleTargetMesh, this.poleTargetMesh.computeWorldMatrix(!0)) : r.poleTargetBone ? this.poleTargetBone = r.poleTargetBone : this._bone1.getParent() && (this.poleTargetBone = this._bone1.getParent()), r.poleTargetLocalOffset && this.poleTargetLocalOffset.copyFrom(r.poleTargetLocalOffset), r.poleAngle && (this.poleAngle = r.poleAngle), r.bendAxis && this._bendAxis.copyFrom(r.bendAxis), r.maxAngle && (this.maxAngle = r.maxAngle), r.slerpAmount && (this.slerpAmount = r.slerpAmount))
            }
        }
        return Object.defineProperty(t.prototype, "maxAngle", {
            get: function() {
                return this._maxAngle
            },
            set: function(e) {
                this._setMaxAngle(e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._setMaxAngle = function(e) {
            e < 0 && (e = 0), (e > Math.PI || void 0 == e) && (e = Math.PI), this._maxAngle = e;
            var t = this._bone1Length,
                i = this._bone2Length;
            this._maxReach = Math.sqrt(t * t + i * i - 2 * t * i * Math.cos(e))
        }, t.prototype.update = function() {
            var i = this._bone1;
            if (i) {
                var r = this.targetPosition,
                    n = this.poleTargetPosition,
                    o = t._tmpMats[0],
                    s = t._tmpMats[1];
                this.targetMesh && r.copyFrom(this.targetMesh.getAbsolutePosition()), this.poleTargetBone ? this.poleTargetBone.getAbsolutePositionFromLocalToRef(this.poleTargetLocalOffset, this.mesh, n) : this.poleTargetMesh && e.Vector3.TransformCoordinatesToRef(this.poleTargetLocalOffset, this.poleTargetMesh.getWorldMatrix(), n);
                var a = t._tmpVecs[0],
                    l = t._tmpVecs[1],
                    c = t._tmpVecs[2],
                    h = t._tmpVecs[3],
                    u = t._tmpVecs[4],
                    f = t._tmpQuat;
                i.getAbsolutePositionToRef(this.mesh, a), n.subtractToRef(a, u), 0 == u.x && 0 == u.y && 0 == u.z ? u.y = 1 : u.normalize(), r.subtractToRef(a, h), h.normalize(), e.Vector3.CrossToRef(h, u, l), l.normalize(), e.Vector3.CrossToRef(h, l, c), c.normalize(), e.Matrix.FromXYZAxesToRef(c, h, l, o);
                var d = this._bone1Length,
                    p = this._bone2Length,
                    _ = e.Vector3.Distance(a, r);
                this._maxReach > 0 && (_ = Math.min(this._maxReach, _));
                var m = (p * p + _ * _ - d * d) / (2 * p * _),
                    g = (_ * _ + d * d - p * p) / (2 * _ * d);
                m > 1 && (m = 1), g > 1 && (g = 1), m < -1 && (m = -1), g < -1 && (g = -1);
                var v = Math.acos(m),
                    y = Math.acos(g),
                    b = -v - y;
                if (this._rightHandedSystem) e.Matrix.RotationYawPitchRollToRef(0, 0, this._adjustRoll, s), s.multiplyToRef(o, o), e.Matrix.RotationAxisToRef(this._bendAxis, y, s), s.multiplyToRef(o, o);
                else {
                    var x = t._tmpVecs[5];
                    x.copyFrom(this._bendAxis), x.x *= -1, e.Matrix.RotationAxisToRef(x, -y, s), s.multiplyToRef(o, o)
                }
                this.poleAngle && (e.Matrix.RotationAxisToRef(h, this.poleAngle, s), o.multiplyToRef(s, o)), this._bone1 && (this.slerpAmount < 1 ? (this._slerping || e.Quaternion.FromRotationMatrixToRef(this._bone1Mat, this._bone1Quat), e.Quaternion.FromRotationMatrixToRef(o, f), e.Quaternion.SlerpToRef(this._bone1Quat, f, this.slerpAmount, this._bone1Quat), b = this._bone2Ang * (1 - this.slerpAmount) + b * this.slerpAmount, this._bone1.setRotationQuaternion(this._bone1Quat, e.Space.WORLD, this.mesh), this._slerping = !0) : (this._bone1.setRotationMatrix(o, e.Space.WORLD, this.mesh), this._bone1Mat.copyFrom(o), this._slerping = !1)), this._bone2.setAxisAngle(this._bendAxis, b, e.Space.LOCAL), this._bone2Ang = b
            }
        }, t._tmpVecs = [e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero()], t._tmpQuat = e.Quaternion.Identity(), t._tmpMats = [e.Matrix.Identity(), e.Matrix.Identity()], t
    })();
    e.BoneIKController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n) {
            if (this.upAxis = e.Vector3.Up(), this.upAxisSpace = e.Space.LOCAL, this.adjustYaw = 0, this.adjustPitch = 0, this.adjustRoll = 0, this.slerpAmount = 1, this._boneQuat = e.Quaternion.Identity(), this._slerping = !1, this._firstFrameSkipped = !1, this._fowardAxis = e.Vector3.Forward(), this.mesh = t, this.bone = i, this.target = r, n && (n.adjustYaw && (this.adjustYaw = n.adjustYaw), n.adjustPitch && (this.adjustPitch = n.adjustPitch), n.adjustRoll && (this.adjustRoll = n.adjustRoll), null != n.maxYaw ? this.maxYaw = n.maxYaw : this.maxYaw = Math.PI, null != n.minYaw ? this.minYaw = n.minYaw : this.minYaw = -Math.PI, null != n.maxPitch ? this.maxPitch = n.maxPitch : this.maxPitch = Math.PI, null != n.minPitch ? this.minPitch = n.minPitch : this.minPitch = -Math.PI, null != n.slerpAmount && (this.slerpAmount = n.slerpAmount), null != n.upAxis && (this.upAxis = n.upAxis), null != n.upAxisSpace && (this.upAxisSpace = n.upAxisSpace), null != n.yawAxis || null != n.pitchAxis)) {
                var o = e.Axis.Y,
                    s = e.Axis.X;
                null != n.yawAxis && (o = n.yawAxis.clone(), o.normalize()), null != n.pitchAxis && (s = n.pitchAxis.clone(), s.normalize());
                var a = e.Vector3.Cross(s, o);
                this._transformYawPitch = e.Matrix.Identity(), e.Matrix.FromXYZAxesToRef(s, o, a, this._transformYawPitch), this._transformYawPitchInv = this._transformYawPitch.clone(), this._transformYawPitch.invert()
            }
            i.getParent() || this.upAxisSpace != e.Space.BONE || (this.upAxisSpace = e.Space.LOCAL)
        }
        return Object.defineProperty(t.prototype, "minYaw", {
            get: function() {
                return this._minYaw
            },
            set: function(e) {
                this._minYaw = e, this._minYawSin = Math.sin(e), this._minYawCos = Math.cos(e), null != this._maxYaw && (this._midYawConstraint = .5 * this._getAngleDiff(this._minYaw, this._maxYaw) + this._minYaw, this._yawRange = this._maxYaw - this._minYaw)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "maxYaw", {
            get: function() {
                return this._maxYaw
            },
            set: function(e) {
                this._maxYaw = e, this._maxYawSin = Math.sin(e), this._maxYawCos = Math.cos(e), null != this._minYaw && (this._midYawConstraint = .5 * this._getAngleDiff(this._minYaw, this._maxYaw) + this._minYaw, this._yawRange = this._maxYaw - this._minYaw)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "minPitch", {
            get: function() {
                return this._minPitch
            },
            set: function(e) {
                this._minPitch = e, this._minPitchTan = Math.tan(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "maxPitch", {
            get: function() {
                return this._maxPitch
            },
            set: function(e) {
                this._maxPitch = e, this._maxPitchTan = Math.tan(e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.update = function() {
            if (this.slerpAmount < 1 && !this._firstFrameSkipped) return void(this._firstFrameSkipped = !0);
            var i = this.bone,
                r = t._tmpVecs[0];
            i.getAbsolutePositionToRef(this.mesh, r);
            var n = this.target,
                o = t._tmpMats[0],
                s = t._tmpMats[1],
                a = this.mesh,
                l = i.getParent(),
                c = t._tmpVecs[1];
            c.copyFrom(this.upAxis), this.upAxisSpace == e.Space.BONE && l ? (this._transformYawPitch && e.Vector3.TransformCoordinatesToRef(c, this._transformYawPitchInv, c), l.getDirectionToRef(c, this.mesh, c)) : this.upAxisSpace == e.Space.LOCAL && (a.getDirectionToRef(c, c), 1 == a.scaling.x && 1 == a.scaling.y && 1 == a.scaling.z || c.normalize());
            var h = !1,
                u = !1;
            if (this._maxYaw == Math.PI && this._minYaw == -Math.PI || (h = !0), this._maxPitch == Math.PI && this._minPitch == -Math.PI || (u = !0), h || u) {
                var f = t._tmpMats[2],
                    d = t._tmpMats[3];
                if (this.upAxisSpace == e.Space.BONE && 1 == c.y && l) l.getRotationMatrixToRef(e.Space.WORLD, this.mesh, f);
                else if (this.upAxisSpace != e.Space.LOCAL || 1 != c.y || l) {
                    var p = t._tmpVecs[2];
                    p.copyFrom(this._fowardAxis), this._transformYawPitch && e.Vector3.TransformCoordinatesToRef(p, this._transformYawPitchInv, p), l ? l.getDirectionToRef(p, this.mesh, p) : a.getDirectionToRef(p, p);
                    var _ = e.Vector3.Cross(c, p);
                    _.normalize();
                    var p = e.Vector3.Cross(_, c);
                    e.Matrix.FromXYZAxesToRef(_, c, p, f)
                } else f.copyFrom(a.getWorldMatrix());
                f.invertToRef(d);
                var m = null;
                if (u) {
                    var g = t._tmpVecs[3];
                    n.subtractToRef(r, g), e.Vector3.TransformCoordinatesToRef(g, d, g), m = Math.sqrt(g.x * g.x + g.z * g.z);
                    var v = Math.atan2(g.y, m),
                        y = v;
                    v > this._maxPitch ? (g.y = this._maxPitchTan * m, y = this._maxPitch) : v < this._minPitch && (g.y = this._minPitchTan * m, y = this._minPitch), v != y && (e.Vector3.TransformCoordinatesToRef(g, f, g), g.addInPlace(r), n = g)
                }
                if (h) {
                    var g = t._tmpVecs[4];
                    n.subtractToRef(r, g), e.Vector3.TransformCoordinatesToRef(g, d, g);
                    var b = Math.atan2(g.x, g.z),
                        x = b;
                    if ((b > this._maxYaw || b < this._minYaw) && (null == m && (m = Math.sqrt(g.x * g.x + g.z * g.z)), this._yawRange > Math.PI ? this._isAngleBetween(b, this._maxYaw, this._midYawConstraint) ? (g.z = this._maxYawCos * m, g.x = this._maxYawSin * m, x = this._maxYaw) : this._isAngleBetween(b, this._midYawConstraint, this._minYaw) && (g.z = this._minYawCos * m, g.x = this._minYawSin * m, x = this._minYaw) : b > this._maxYaw ? (g.z = this._maxYawCos * m, g.x = this._maxYawSin * m, x = this._maxYaw) : b < this._minYaw && (g.z = this._minYawCos * m, g.x = this._minYawSin * m, x = this._minYaw)), this._slerping && this._yawRange > Math.PI) {
                        var T = t._tmpVecs[8];
                        T.copyFrom(e.Axis.Z), this._transformYawPitch && e.Vector3.TransformCoordinatesToRef(T, this._transformYawPitchInv, T);
                        var E = t._tmpMats[4];
                        this._boneQuat.toRotationMatrix(E), this.mesh.getWorldMatrix().multiplyToRef(E, E), e.Vector3.TransformCoordinatesToRef(T, E, T), e.Vector3.TransformCoordinatesToRef(T, d, T);
                        var A = Math.atan2(T.x, T.z);
                        if (this._getAngleBetween(A, b) > this._getAngleBetween(A, this._midYawConstraint)) {
                            null == m && (m = Math.sqrt(g.x * g.x + g.z * g.z));
                            var P = this._getAngleBetween(A, this._maxYaw);
                            this._getAngleBetween(A, this._minYaw) < P ? (x = A + .75 * Math.PI, g.z = Math.cos(x) * m, g.x = Math.sin(x) * m) : (x = A - .75 * Math.PI, g.z = Math.cos(x) * m, g.x = Math.sin(x) * m)
                        }
                    }
                    b != x && (e.Vector3.TransformCoordinatesToRef(g, f, g), g.addInPlace(r), n = g)
                }
            }
            var M = t._tmpVecs[5],
                S = t._tmpVecs[6],
                C = t._tmpVecs[7],
                R = t._tmpQuat;
            n.subtractToRef(r, M), M.normalize(), e.Vector3.CrossToRef(c, M, S), S.normalize(), e.Vector3.CrossToRef(M, S, C), C.normalize(), e.Matrix.FromXYZAxesToRef(S, C, M, o), 0 === S.x && 0 === S.y && 0 === S.z || 0 === C.x && 0 === C.y && 0 === C.z || 0 === M.x && 0 === M.y && 0 === M.z || ((this.adjustYaw || this.adjustPitch || this.adjustRoll) && (e.Matrix.RotationYawPitchRollToRef(this.adjustYaw, this.adjustPitch, this.adjustRoll, s), s.multiplyToRef(o, o)), this.slerpAmount < 1 ? (this._slerping || this.bone.getRotationQuaternionToRef(e.Space.WORLD, this.mesh, this._boneQuat), this._transformYawPitch && this._transformYawPitch.multiplyToRef(o, o), e.Quaternion.FromRotationMatrixToRef(o, R), e.Quaternion.SlerpToRef(this._boneQuat, R, this.slerpAmount, this._boneQuat), this.bone.setRotationQuaternion(this._boneQuat, e.Space.WORLD, this.mesh), this._slerping = !0) : (this._transformYawPitch && this._transformYawPitch.multiplyToRef(o, o), this.bone.setRotationMatrix(o, e.Space.WORLD, this.mesh), this._slerping = !1))
        }, t.prototype._getAngleDiff = function(e, t) {
            var i = t - e;
            return i %= 2 * Math.PI, i > Math.PI ? i -= 2 * Math.PI : i < -Math.PI && (i += 2 * Math.PI), i
        }, t.prototype._getAngleBetween = function(e, t) {
            e %= 2 * Math.PI, e = e < 0 ? e + 2 * Math.PI : e, t %= 2 * Math.PI, t = t < 0 ? t + 2 * Math.PI : t;
            var i = 0;
            return i = e < t ? t - e : e - t, i > Math.PI && (i = 2 * Math.PI - i), i
        }, t.prototype._isAngleBetween = function(e, t, i) {
            if (e %= 2 * Math.PI, e = e < 0 ? e + 2 * Math.PI : e, t %= 2 * Math.PI, t = t < 0 ? t + 2 * Math.PI : t, i %= 2 * Math.PI, i = i < 0 ? i + 2 * Math.PI : i, t < i) {
                if (e > t && e < i) return !0
            } else if (e > i && e < t) return !0;
            return !1
        }, t._tmpVecs = [e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero()], t._tmpQuat = e.Quaternion.Identity(), t._tmpMats = [e.Matrix.Identity(), e.Matrix.Identity(), e.Matrix.Identity(), e.Matrix.Identity(), e.Matrix.Identity()], t
    })();
    e.BoneLookController = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            this.name = t, this.id = i, this.bones = new Array, this.needInitialSkinMatrix = !1, this._isDirty = !0, this._meshesWithPoseMatrix = new Array, this._identity = e.Matrix.Identity(), this._ranges = {}, this._lastAbsoluteTransformsUpdateId = -1, this.doNotSerialize = !1, this.onBeforeComputeObservable = new e.Observable, this.bones = [], this._scene = r || e.Engine.LastCreatedScene, r.skeletons.push(this), this._isDirty = !0
        }
        return t.prototype.getTransformMatrices = function(e) {
            return this.needInitialSkinMatrix && e._bonesTransformMatrices ? e._bonesTransformMatrices : (this._transformMatrices || this.prepare(), this._transformMatrices)
        }, t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.toString = function(e) {
            var t = "Name: " + this.name + ", nBones: " + this.bones.length;
            if (t += ", nAnimationRanges: " + (this._ranges ? Object.keys(this._ranges).length : "none"), e) {
                t += ", Ranges: {";
                var i = !0;
                for (var r in this._ranges) i && (t += ", ", i = !1), t += r;
                t += "}"
            }
            return t
        }, t.prototype.getBoneIndexByName = function(e) {
            for (var t = 0, i = this.bones.length; t < i; t++)
                if (this.bones[t].name === e) return t;
            return -1
        }, t.prototype.createAnimationRange = function(t, i, r) {
            if (!this._ranges[t]) {
                this._ranges[t] = new e.AnimationRange(t, i, r);
                for (var n = 0, o = this.bones.length; n < o; n++) this.bones[n].animations[0] && this.bones[n].animations[0].createRange(t, i, r)
            }
        }, t.prototype.deleteAnimationRange = function(e, t) {
            void 0 === t && (t = !0);
            for (var i = 0, r = this.bones.length; i < r; i++) this.bones[i].animations[0] && this.bones[i].animations[0].deleteRange(e, t);
            this._ranges[e] = null
        }, t.prototype.getAnimationRange = function(e) {
            return this._ranges[e]
        }, t.prototype.getAnimationRanges = function() {
            var e, t = [],
                i = 0;
            for (e in this._ranges) t[i] = this._ranges[e], i++;
            return t
        }, t.prototype.copyAnimationRange = function(t, i, r) {
            if (void 0 === r && (r = !1), this._ranges[i] || !t.getAnimationRange(i)) return !1;
            var n, o, s = !0,
                a = this._getHighestAnimationFrame() + 1,
                l = {},
                c = t.bones;
            for (o = 0, n = c.length; o < n; o++) l[c[o].name] = c[o];
            this.bones.length !== c.length && (e.Tools.Warn("copyAnimationRange: this rig has " + this.bones.length + " bones, while source as " + c.length), s = !1);
            var h = r && this.dimensionsAtRest && t.dimensionsAtRest ? this.dimensionsAtRest.divide(t.dimensionsAtRest) : null;
            for (o = 0, n = this.bones.length; o < n; o++) {
                var u = this.bones[o].name,
                    f = l[u];
                f ? s = s && this.bones[o].copyAnimationRange(f, i, a, r, h) : (e.Tools.Warn("copyAnimationRange: not same rig, missing source bone " + u), s = !1)
            }
            var d = t.getAnimationRange(i);
            return d && (this._ranges[i] = new e.AnimationRange(i, d.from + a, d.to + a)), s
        }, t.prototype.returnToRest = function() {
            for (var e = 0; e < this.bones.length; e++) this.bones[e].returnToRest()
        }, t.prototype._getHighestAnimationFrame = function() {
            for (var e = 0, t = 0, i = this.bones.length; t < i; t++)
                if (this.bones[t].animations[0]) {
                    var r = this.bones[t].animations[0].getHighestFrame();
                    e < r && (e = r)
                }
            return e
        }, t.prototype.beginAnimation = function(e, t, i, r) {
            var n = this.getAnimationRange(e);
            return n ? this._scene.beginAnimation(this, n.from, n.to, t, i, r) : null
        }, t.prototype._markAsDirty = function() {
            this._isDirty = !0
        }, t.prototype._registerMeshWithPoseMatrix = function(e) {
            this._meshesWithPoseMatrix.push(e)
        }, t.prototype._unregisterMeshWithPoseMatrix = function(e) {
            var t = this._meshesWithPoseMatrix.indexOf(e);
            t > -1 && this._meshesWithPoseMatrix.splice(t, 1)
        }, t.prototype._computeTransformMatrices = function(e, t) {
            this.onBeforeComputeObservable.notifyObservers(this);
            for (var i = 0; i < this.bones.length; i++) {
                var r = this.bones[i],
                    n = r.getParent();
                if (n ? r.getLocalMatrix().multiplyToRef(n.getWorldMatrix(), r.getWorldMatrix()) : t ? r.getLocalMatrix().multiplyToRef(t, r.getWorldMatrix()) : r.getWorldMatrix().copyFrom(r.getLocalMatrix()), -1 !== r._index) {
                    var o = null === r._index ? i : r._index;
                    r.getInvertedAbsoluteTransform().multiplyToArray(r.getWorldMatrix(), e, 16 * o)
                }
            }
            this._identity.copyToArray(e, 16 * this.bones.length)
        }, t.prototype.prepare = function() {
            if (this._isDirty) {
                if (this.needInitialSkinMatrix)
                    for (var t = 0; t < this._meshesWithPoseMatrix.length; t++) {
                        var i = this._meshesWithPoseMatrix[t],
                            r = i.getPoseMatrix();
                        if (i._bonesTransformMatrices && i._bonesTransformMatrices.length === 16 * (this.bones.length + 1) || (i._bonesTransformMatrices = new Float32Array(16 * (this.bones.length + 1))), this._synchronizedWithMesh !== i) {
                            this._synchronizedWithMesh = i;
                            for (var n = 0; n < this.bones.length; n++) {
                                var o = this.bones[n];
                                if (!o.getParent()) {
                                    var s = o.getBaseMatrix();
                                    s.multiplyToRef(r, e.Tmp.Matrix[1]), o._updateDifferenceMatrix(e.Tmp.Matrix[1])
                                }
                            }
                        }
                        this._computeTransformMatrices(i._bonesTransformMatrices, r)
                    } else this._transformMatrices && this._transformMatrices.length === 16 * (this.bones.length + 1) || (this._transformMatrices = new Float32Array(16 * (this.bones.length + 1))), this._computeTransformMatrices(this._transformMatrices, null);
                this._isDirty = !1, this._scene._activeBones.addCount(this.bones.length, !1)
            }
        }, t.prototype.getAnimatables = function() {
            if (!this._animatables || this._animatables.length !== this.bones.length) {
                this._animatables = [];
                for (var e = 0; e < this.bones.length; e++) this._animatables.push(this.bones[e])
            }
            return this._animatables
        }, t.prototype.clone = function(i, r) {
            var n = new t(i, r || i, this._scene);
            n.needInitialSkinMatrix = this.needInitialSkinMatrix;
            for (var o = 0; o < this.bones.length; o++) {
                var s = this.bones[o],
                    a = null,
                    l = s.getParent();
                if (l) {
                    var c = this.bones.indexOf(l);
                    a = n.bones[c]
                }
                var h = new e.Bone(s.name, n, a, s.getBaseMatrix().clone(), s.getRestPose().clone());
                e.Tools.DeepCopy(s.animations, h.animations)
            }
            if (this._ranges) {
                n._ranges = {};
                for (var u in this._ranges) {
                    var f = this._ranges[u];
                    f && (n._ranges[u] = f.clone())
                }
            }
            return this._isDirty = !0, n
        }, t.prototype.enableBlending = function(e) {
            void 0 === e && (e = .01), this.bones.forEach((function(t) {
                t.animations.forEach((function(t) {
                    t.enableBlending = !0, t.blendingSpeed = e
                }))
            }))
        }, t.prototype.dispose = function() {
            this._meshesWithPoseMatrix = [], this.getScene().stopAnimation(this), this.getScene().removeSkeleton(this)
        }, t.prototype.serialize = function() {
            var e = {};
            e.name = this.name, e.id = this.id, e.dimensionsAtRest = this.dimensionsAtRest, e.bones = [], e.needInitialSkinMatrix = this.needInitialSkinMatrix;
            for (var t = 0; t < this.bones.length; t++) {
                var i = this.bones[t],
                    r = i.getParent(),
                    n = {
                        parentBoneIndex: r ? this.bones.indexOf(r) : -1,
                        name: i.name,
                        matrix: i.getBaseMatrix().toArray(),
                        rest: i.getRestPose().toArray()
                    };
                e.bones.push(n), i.length && (n.length = i.length), i.animations && i.animations.length > 0 && (n.animation = i.animations[0].serialize()), e.ranges = [];
                for (var o in this._ranges) {
                    var s = this._ranges[o];
                    if (s) {
                        var a = {};
                        a.name = o, a.from = s.from, a.to = s.to, e.ranges.push(a)
                    }
                }
            }
            return e
        }, t.Parse = function(i, r) {
            var n = new t(i.name, i.id, r);
            i.dimensionsAtRest && (n.dimensionsAtRest = e.Vector3.FromArray(i.dimensionsAtRest)), n.needInitialSkinMatrix = i.needInitialSkinMatrix;
            var o;
            for (o = 0; o < i.bones.length; o++) {
                var s = i.bones[o],
                    a = null;
                s.parentBoneIndex > -1 && (a = n.bones[s.parentBoneIndex]);
                var l = s.rest ? e.Matrix.FromArray(s.rest) : null,
                    c = new e.Bone(s.name, n, a, e.Matrix.FromArray(s.matrix), l);
                s.length && (c.length = s.length), s.animation && c.animations.push(e.Animation.Parse(s.animation))
            }
            if (i.ranges)
                for (o = 0; o < i.ranges.length; o++) {
                    var h = i.ranges[o];
                    n.createAnimationRange(h.name, h.from, h.to)
                }
            return n
        }, t.prototype.computeAbsoluteTransforms = function(e) {
            void 0 === e && (e = !1);
            var t = this._scene.getRenderId();
            (this._lastAbsoluteTransformsUpdateId != t || e) && (this.bones[0].computeAbsoluteTransforms(), this._lastAbsoluteTransformsUpdateId = t)
        }, t.prototype.getPoseMatrix = function() {
            var e = null;
            return this._meshesWithPoseMatrix.length > 0 && (e = this._meshesWithPoseMatrix[0].getPoseMatrix()), e
        }, t.prototype.sortBones = function() {
            for (var e = new Array, t = new Array(this.bones.length), i = 0; i < this.bones.length; i++) this._sortBones(i, e, t);
            this.bones = e
        }, t.prototype._sortBones = function(e, t, i) {
            if (!i[e]) {
                i[e] = !0;
                var r = this.bones[e];
                void 0 === r._index && (r._index = e);
                var n = r.getParent();
                n && this._sortBones(this.bones.indexOf(n), t, i), t.push(r)
            }
        }, t
    })();
    e.Skeleton = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.x = e.Vector3.Zero(), this.y = e.Vector3.Zero(), this.z = e.Vector3.Zero(), this.xx = e.Vector3.Zero(), this.yy = e.Vector3.Zero(), this.zz = e.Vector3.Zero(), this.xy = e.Vector3.Zero(), this.yz = e.Vector3.Zero(), this.zx = e.Vector3.Zero()
        }
        return t.prototype.addAmbient = function(t) {
            var i = new e.Vector3(t.r, t.g, t.b);
            this.xx = this.xx.add(i), this.yy = this.yy.add(i), this.zz = this.zz.add(i)
        }, t.getSphericalPolynomialFromHarmonics = function(e) {
            var i = new t;
            return i.x = e.L11.scale(1.02333), i.y = e.L1_1.scale(1.02333), i.z = e.L10.scale(1.02333), i.xx = e.L00.scale(.886277).subtract(e.L20.scale(.247708)).add(e.L22.scale(.429043)), i.yy = e.L00.scale(.886277).subtract(e.L20.scale(.247708)).subtract(e.L22.scale(.429043)), i.zz = e.L00.scale(.886277).add(e.L20.scale(.495417)), i.yz = e.L2_1.scale(.858086), i.zx = e.L21.scale(.858086), i.xy = e.L2_2.scale(.858086), i.scale(1 / Math.PI), i
        }, t.prototype.scale = function(e) {
            this.x = this.x.scale(e), this.y = this.y.scale(e), this.z = this.z.scale(e), this.xx = this.xx.scale(e), this.yy = this.yy.scale(e), this.zz = this.zz.scale(e), this.yz = this.yz.scale(e), this.zx = this.zx.scale(e), this.xy = this.xy.scale(e)
        }, t
    })();
    e.SphericalPolynomial = t;
    var i = (function() {
        function t() {
            this.L00 = e.Vector3.Zero(), this.L1_1 = e.Vector3.Zero(), this.L10 = e.Vector3.Zero(), this.L11 = e.Vector3.Zero(), this.L2_2 = e.Vector3.Zero(), this.L2_1 = e.Vector3.Zero(), this.L20 = e.Vector3.Zero(), this.L21 = e.Vector3.Zero(), this.L22 = e.Vector3.Zero()
        }
        return t.prototype.addLight = function(t, i, r) {
            var n = new e.Vector3(i.r, i.g, i.b),
                o = n.scale(r);
            this.L00 = this.L00.add(o.scale(.282095)), this.L1_1 = this.L1_1.add(o.scale(.488603 * t.y)), this.L10 = this.L10.add(o.scale(.488603 * t.z)), this.L11 = this.L11.add(o.scale(.488603 * t.x)), this.L2_2 = this.L2_2.add(o.scale(1.092548 * t.x * t.y)), this.L2_1 = this.L2_1.add(o.scale(1.092548 * t.y * t.z)), this.L21 = this.L21.add(o.scale(1.092548 * t.x * t.z)), this.L20 = this.L20.add(o.scale(.315392 * (3 * t.z * t.z - 1))), this.L22 = this.L22.add(o.scale(.546274 * (t.x * t.x - t.y * t.y)))
        }, t.prototype.scale = function(e) {
            this.L00 = this.L00.scale(e), this.L1_1 = this.L1_1.scale(e), this.L10 = this.L10.scale(e), this.L11 = this.L11.scale(e), this.L2_2 = this.L2_2.scale(e), this.L2_1 = this.L2_1.scale(e), this.L20 = this.L20.scale(e), this.L21 = this.L21.scale(e), this.L22 = this.L22.scale(e)
        }, t.prototype.convertIncidentRadianceToIrradiance = function() {
            this.L00 = this.L00.scale(3.141593), this.L1_1 = this.L1_1.scale(2.094395), this.L10 = this.L10.scale(2.094395), this.L11 = this.L11.scale(2.094395), this.L2_2 = this.L2_2.scale(.785398), this.L2_1 = this.L2_1.scale(.785398), this.L20 = this.L20.scale(.785398), this.L21 = this.L21.scale(.785398), this.L22 = this.L22.scale(.785398)
        }, t.prototype.convertIrradianceToLambertianRadiance = function() {
            this.scale(1 / Math.PI)
        }, t.getsphericalHarmonicsFromPolynomial = function(e) {
            var i = new t;
            return i.L00 = e.xx.scale(.376127).add(e.yy.scale(.376127)).add(e.zz.scale(.376126)), i.L1_1 = e.y.scale(.977204), i.L10 = e.z.scale(.977204), i.L11 = e.x.scale(.977204), i.L2_2 = e.xy.scale(1.16538), i.L2_1 = e.yz.scale(1.16538), i.L20 = e.zz.scale(1.34567).subtract(e.xx.scale(.672834)).subtract(e.yy.scale(.672834)), i.L21 = e.zx.scale(1.16538), i.L22 = e.xx.scale(1.16538).subtract(e.yy.scale(1.16538)), i.scale(Math.PI), i
        }, t
    })();
    e.SphericalHarmonics = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
            function e(e, t, i, r) {
                this.name = e, this.worldAxisForNormal = t, this.worldAxisForFileX = i, this.worldAxisForFileY = r
            }
            return e
        })(),
        i = (function() {
            function i() {}
            return i.ConvertCubeMapTextureToSphericalPolynomial = function(t) {
                if (!t.isCube) return null;
                var i, r, n = t.getSize().width,
                    o = t.readPixels(0),
                    s = t.readPixels(1);
                t.isRenderTarget ? (i = t.readPixels(3), r = t.readPixels(2)) : (i = t.readPixels(2), r = t.readPixels(3));
                var a = t.readPixels(4),
                    l = t.readPixels(5),
                    c = t.gammaSpace,
                    h = e.Engine.TEXTUREFORMAT_RGBA,
                    u = e.Engine.TEXTURETYPE_UNSIGNED_INT;
                t.textureType && t.textureType !== e.Engine.TEXTURETYPE_UNSIGNED_INT && (u = e.Engine.TEXTURETYPE_FLOAT);
                var f = {
                    size: n,
                    right: o,
                    left: s,
                    up: i,
                    down: r,
                    front: a,
                    back: l,
                    format: h,
                    type: u,
                    gammaSpace: c
                };
                return this.ConvertCubeMapToSphericalPolynomial(f)
            }, i.ConvertCubeMapToSphericalPolynomial = function(t) {
                for (var i = new e.SphericalHarmonics, r = 0, n = 2 / t.size, o = n, s = .5 * n - 1, a = 0; a < 6; a++)
                    for (var l = this.FileFaces[a], c = t[l.name], h = s, u = t.format === e.Engine.TEXTUREFORMAT_RGBA ? 4 : 3, f = 0; f < t.size; f++) {
                        for (var d = s, p = 0; p < t.size; p++) {
                            var _ = l.worldAxisForFileX.scale(d).add(l.worldAxisForFileY.scale(h)).add(l.worldAxisForNormal);
                            _.normalize();
                            var m = Math.pow(1 + d * d + h * h, -1.5),
                                g = c[f * t.size * u + p * u + 0],
                                v = c[f * t.size * u + p * u + 1],
                                y = c[f * t.size * u + p * u + 2];
                            t.type === e.Engine.TEXTURETYPE_UNSIGNED_INT && (g /= 255, v /= 255, y /= 255), t.gammaSpace && (g = Math.pow(e.Scalar.Clamp(g), e.ToLinearSpace), v = Math.pow(e.Scalar.Clamp(v), e.ToLinearSpace), y = Math.pow(e.Scalar.Clamp(y), e.ToLinearSpace));
                            var b = new e.Color3(g, v, y);
                            i.addLight(_, b, m), r += m, d += n
                        }
                        h += o
                    }
                var x = 4 * Math.PI,
                    T = 6 * x / 6,
                    E = T / r;
                return i.scale(E), i.convertIncidentRadianceToIrradiance(), i.convertIrradianceToLambertianRadiance(), e.SphericalPolynomial.getSphericalPolynomialFromHarmonics(i)
            }, i.FileFaces = [new t("right", new e.Vector3(1, 0, 0), new e.Vector3(0, 0, -1), new e.Vector3(0, -1, 0)), new t("left", new e.Vector3(-1, 0, 0), new e.Vector3(0, 0, 1), new e.Vector3(0, -1, 0)), new t("up", new e.Vector3(0, 1, 0), new e.Vector3(1, 0, 0), new e.Vector3(0, 0, 1)), new t("down", new e.Vector3(0, -1, 0), new e.Vector3(1, 0, 0), new e.Vector3(0, 0, -1)), new t("front", new e.Vector3(0, 0, 1), new e.Vector3(1, 0, 0), new e.Vector3(0, -1, 0)), new t("back", new e.Vector3(0, 0, -1), new e.Vector3(-1, 0, 0), new e.Vector3(0, -1, 0))], i
        })();
    e.CubeMapToSphericalPolynomialTools = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.ConvertPanoramaToCubemap = function(t, i, r, n) {
            if (!t) throw "ConvertPanoramaToCubemap: input cannot be null";
            if (t.length != i * r * 3) throw "ConvertPanoramaToCubemap: input size is wrong";
            return {
                front: this.CreateCubemapTexture(n, this.FACE_FRONT, t, i, r),
                back: this.CreateCubemapTexture(n, this.FACE_BACK, t, i, r),
                left: this.CreateCubemapTexture(n, this.FACE_LEFT, t, i, r),
                right: this.CreateCubemapTexture(n, this.FACE_RIGHT, t, i, r),
                up: this.CreateCubemapTexture(n, this.FACE_UP, t, i, r),
                down: this.CreateCubemapTexture(n, this.FACE_DOWN, t, i, r),
                size: n,
                type: e.Engine.TEXTURETYPE_FLOAT,
                format: e.Engine.TEXTUREFORMAT_RGB,
                gammaSpace: !1
            }
        }, t.CreateCubemapTexture = function(e, t, i, r, n) {
            for (var o = new ArrayBuffer(e * e * 4 * 3), s = new Float32Array(o), a = t[1].subtract(t[0]).scale(1 / e), l = t[3].subtract(t[2]).scale(1 / e), c = 1 / e, h = 0, u = 0; u < e; u++) {
                for (var f = t[0], d = t[2], p = 0; p < e; p++) {
                    var _ = d.subtract(f).scale(h).add(f);
                    _.normalize();
                    var m = this.CalcProjectionSpherical(_, i, r, n);
                    s[u * e * 3 + 3 * p + 0] = m.r, s[u * e * 3 + 3 * p + 1] = m.g, s[u * e * 3 + 3 * p + 2] = m.b, f = f.add(a), d = d.add(l)
                }
                h += c
            }
            return s
        }, t.CalcProjectionSpherical = function(e, t, i, r) {
            for (var n = Math.atan2(e.z, e.x), o = Math.acos(e.y); n < -Math.PI;) n += 2 * Math.PI;
            for (; n > Math.PI;) n -= 2 * Math.PI;
            var s = n / Math.PI,
                a = o / Math.PI;
            s = .5 * s + .5;
            var l = Math.round(s * i);
            l < 0 ? l = 0 : l >= i && (l = i - 1);
            var c = Math.round(a * r);
            c < 0 ? c = 0 : c >= r && (c = r - 1);
            var h = r - c - 1;
            return {
                r: t[h * i * 3 + 3 * l + 0],
                g: t[h * i * 3 + 3 * l + 1],
                b: t[h * i * 3 + 3 * l + 2]
            }
        }, t.FACE_FRONT = [new e.Vector3(-1, -1, -1), new e.Vector3(1, -1, -1), new e.Vector3(-1, 1, -1), new e.Vector3(1, 1, -1)], t.FACE_BACK = [new e.Vector3(1, -1, 1), new e.Vector3(-1, -1, 1), new e.Vector3(1, 1, 1), new e.Vector3(-1, 1, 1)], t.FACE_RIGHT = [new e.Vector3(1, -1, -1), new e.Vector3(1, -1, 1), new e.Vector3(1, 1, -1), new e.Vector3(1, 1, 1)], t.FACE_LEFT = [new e.Vector3(-1, -1, 1), new e.Vector3(-1, -1, -1), new e.Vector3(-1, 1, 1), new e.Vector3(-1, 1, -1)], t.FACE_DOWN = [new e.Vector3(-1, 1, -1), new e.Vector3(1, 1, -1), new e.Vector3(-1, 1, 1), new e.Vector3(1, 1, 1)], t.FACE_UP = [new e.Vector3(-1, -1, 1), new e.Vector3(1, -1, 1), new e.Vector3(-1, -1, -1), new e.Vector3(1, -1, -1)], t
    })();
    e.PanoramaToCubeMapTools = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.Ldexp = function(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)
        }, t.Rgbe2float = function(e, t, i, r, n, o) {
            n > 0 ? (n = this.Ldexp(1, n - 136), e[o + 0] = t * n, e[o + 1] = i * n, e[o + 2] = r * n) : (e[o + 0] = 0, e[o + 1] = 0, e[o + 2] = 0)
        }, t.readStringLine = function(e, t) {
            for (var i = "", r = "", n = t; n < e.length - t && "\n" != (r = String.fromCharCode(e[n])); n++) i += r;
            return i
        }, t.RGBE_ReadHeader = function(e) {
            var t = 0,
                i = 0,
                r = this.readStringLine(e, 0);
            if ("#" != r[0] || "?" != r[1]) throw "Bad HDR Format.";
            var n = !1,
                o = !1,
                s = 0;
            do {
                s += r.length + 1, r = this.readStringLine(e, s), "FORMAT=32-bit_rle_rgbe" == r ? o = !0 : 0 == r.length && (n = !0)
            } while (!n);
            if (!o) throw "HDR Bad header format, unsupported FORMAT";
            s += r.length + 1, r = this.readStringLine(e, s);
            var a = /^\-Y (.*) \+X (.*)$/g,
                l = a.exec(r);
            if (!l || l.length < 3) throw "HDR Bad header format, no size";
            if (i = parseInt(l[2]), t = parseInt(l[1]), i < 8 || i > 32767) throw "HDR Bad header format, unsupported size";
            return s += r.length + 1, {
                height: t,
                width: i,
                dataPosition: s
            }
        }, t.GetCubeMapTextureData = function(t, i) {
            var r = new Uint8Array(t),
                n = this.RGBE_ReadHeader(r),
                o = this.RGBE_ReadPixels_RLE(r, n);
            return e.PanoramaToCubeMapTools.ConvertPanoramaToCubemap(o, n.width, n.height, i)
        }, t.RGBE_ReadPixels = function(e, t) {
            return this.RGBE_ReadPixels_RLE(e, t)
        }, t.RGBE_ReadPixels_RLE = function(e, t) {
            for (var i, r, n, o, s, a = t.height, l = t.width, c = t.dataPosition, h = 0, u = 0, f = 0, d = new ArrayBuffer(4 * l), p = new Uint8Array(d), _ = new ArrayBuffer(t.width * t.height * 4 * 3), m = new Float32Array(_); a > 0;) {
                if (i = e[c++], r = e[c++], n = e[c++], o = e[c++], 2 != i || 2 != r || 128 & n) throw "HDR Bad header format, not RLE";
                if ((n << 8 | o) != l) throw "HDR Bad header format, wrong scan line width";
                for (h = 0, f = 0; f < 4; f++)
                    for (u = (f + 1) * l; h < u;)
                        if (i = e[c++], r = e[c++], i > 128) {
                            if (0 == (s = i - 128) || s > u - h) throw "HDR Bad Format, bad scanline data (run)";
                            for (; s-- > 0;) p[h++] = r
                        } else {
                            if (0 == (s = i) || s > u - h) throw "HDR Bad Format, bad scanline data (non-run)";
                            if (p[h++] = r, --s > 0)
                                for (var g = 0; g < s; g++) p[h++] = e[c++]
                        }
                for (f = 0; f < l; f++) i = p[f], r = p[f + l], n = p[f + 2 * l], o = p[f + 3 * l], this.Rgbe2float(m, i, r, n, o, (t.height - a) * l * 3 + 3 * f);
                a--
            }
            return m
        }, t
    })();
    e.HDRTools = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a, l, c, h) {
            void 0 === o && (o = !1), void 0 === s && (s = !0), void 0 === a && (a = !1), void 0 === l && (l = !1), void 0 === c && (c = null), void 0 === h && (h = null);
            var u = t.call(this, r) || this;
            if (u._useInGammaSpace = !1, u._generateHarmonics = !0, u._isBABYLONPreprocessed = !1, u._onLoad = null, u._onError = null, u.coordinatesMode = e.Texture.CUBIC_MODE, u.isPMREM = !1, u._isBlocking = !0, u.boundingBoxPosition = e.Vector3.Zero(), !i) return u;
            u.name = i, u.url = i, u.hasAlpha = !1, u.isCube = !0, u._textureMatrix = e.Matrix.Identity(), u._onLoad = c, u._onError = h, u.gammaSpace = !1;
            var f = r.getEngine().getCaps();
            return n ? (u._isBABYLONPreprocessed = !1, u._noMipmap = o, u._size = n, u._useInGammaSpace = a, u._usePMREMGenerator = l && f.textureLOD && f.textureFloat && !u._useInGammaSpace) : (u._isBABYLONPreprocessed = !0, u._noMipmap = !1, u._useInGammaSpace = !1, u._usePMREMGenerator = f.textureLOD && f.textureFloat && !u._useInGammaSpace), u.isPMREM = u._usePMREMGenerator, u._texture = u._getFromCache(i, u._noMipmap), u._texture || (r.useDelayedTextureLoading ? u.delayLoadState = e.Engine.DELAYLOADSTATE_NOTLOADED : u.loadTexture()), u
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "isBlocking", {
            get: function() {
                return this._isBlocking
            },
            set: function(e) {
                this._isBlocking = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "boundingBoxSize", {
            get: function() {
                return this._boundingBoxSize
            },
            set: function(t) {
                if (!this._boundingBoxSize || !this._boundingBoxSize.equals(t)) {
                    this._boundingBoxSize = t;
                    var i = this.getScene();
                    i && i.markAllMaterialsAsDirty(e.Material.TextureDirtyFlag)
                }
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.loadBabylonTexture = function() {
            var t = this,
                i = 0,
                r = null,
                n = this.getScene(),
                o = !this._useInGammaSpace && n && n.getEngine().getCaps().textureFloat ? function(e) {
                    var n = new Array;
                    if (!r) return n;
                    for (var o = 30, s = 0; s < i; s++) {
                        n.push([]);
                        for (var a = 3 * Math.pow(t._size >> s, 2), l = 0; l < 6; l++) {
                            var c = r.subarray(o, o + a);
                            n[s].push(c), o += a
                        }
                    }
                    return n
                } : null,
                s = function(n) {
                    var s = t.getScene();
                    if (!s) return null;
                    var a = new Int32Array(n);
                    r = new Float32Array(n);
                    var l = a[0];
                    if (t._size = a[1], !t._texture) return null;
                    t._texture.updateSize(t._size, t._size);
                    var c = new e.SphericalPolynomial;
                    c.x.copyFromFloats(r[2], r[3], r[4]), c.y.copyFromFloats(r[5], r[6], r[7]), c.z.copyFromFloats(r[8], r[9], r[10]), c.xx.copyFromFloats(r[11], r[12], r[13]), c.yy.copyFromFloats(r[14], r[15], r[16]), c.zz.copyFromFloats(r[17], r[18], r[19]), c.xy.copyFromFloats(r[20], r[21], r[22]), c.yz.copyFromFloats(r[23], r[24], r[25]), c.zx.copyFromFloats(r[26], r[27], r[28]), t.sphericalPolynomial = c, i = a[29];
                    for (var h = 30, u = [], f = 3 * Math.pow(t._size, 2), d = 0; d < 6; d++) u.push(r.subarray(h, h + f)), h += f;
                    for (var p = [], _ = null, m = 0; m < 6; m++) {
                        var g = null;
                        if (1 === l) {
                            g = u[[0, 2, 4, 1, 3, 5][m]]
                        }
                        if (!o && g) {
                            if (!s.getEngine().getCaps().textureFloat) {
                                var v = new ArrayBuffer(f);
                                _ = new Uint8Array(v)
                            }
                            for (var y = 0; y < t._size * t._size; y++)
                                if (t._useInGammaSpace && (g[3 * y + 0] = Math.pow(g[3 * y + 0], e.ToGammaSpace), g[3 * y + 1] = Math.pow(g[3 * y + 1], e.ToGammaSpace), g[3 * y + 2] = Math.pow(g[3 * y + 2], e.ToGammaSpace)), _) {
                                    var b = Math.max(255 * g[3 * y + 0], 0),
                                        x = Math.max(255 * g[3 * y + 1], 0),
                                        T = Math.max(255 * g[3 * y + 2], 0),
                                        E = Math.max(Math.max(b, x), T);
                                    if (E > 255) {
                                        var A = 255 / E;
                                        b *= A, x *= A, T *= A
                                    }
                                    _[3 * y + 0] = b, _[3 * y + 1] = x, _[3 * y + 2] = T
                                }
                        }
                        _ ? p.push(_) : p.push(g)
                    }
                    return p
                };
            n && (this._texture = n.getEngine().createRawCubeTextureFromUrl(this.url, n, this._size, e.Engine.TEXTUREFORMAT_RGB, n.getEngine().getCaps().textureFloat ? e.Engine.TEXTURETYPE_FLOAT : e.Engine.TEXTURETYPE_UNSIGNED_INT, this._noMipmap, s, o, this._onLoad, this._onError))
        }, i.prototype.loadHDRTexture = function() {
            var t = this,
                r = function(r) {
                    var n = t.getScene();
                    if (!n) return null;
                    var o = e.HDRTools.GetCubeMapTextureData(r, t._size);
                    if (t._generateHarmonics) {
                        var s = e.CubeMapToSphericalPolynomialTools.ConvertCubeMapToSphericalPolynomial(o);
                        t.sphericalPolynomial = s
                    }
                    for (var a = [], l = null, c = 0; c < 6; c++) {
                        if (!n.getEngine().getCaps().textureFloat) {
                            var h = new ArrayBuffer(t._size * t._size * 3);
                            l = new Uint8Array(h)
                        }
                        var u = o[i._facesMapping[c]];
                        if (t._useInGammaSpace || l)
                            for (var f = 0; f < t._size * t._size; f++)
                                if (t._useInGammaSpace && (u[3 * f + 0] = Math.pow(u[3 * f + 0], e.ToGammaSpace), u[3 * f + 1] = Math.pow(u[3 * f + 1], e.ToGammaSpace), u[3 * f + 2] = Math.pow(u[3 * f + 2], e.ToGammaSpace)), l) {
                                    var d = Math.max(255 * u[3 * f + 0], 0),
                                        p = Math.max(255 * u[3 * f + 1], 0),
                                        _ = Math.max(255 * u[3 * f + 2], 0),
                                        m = Math.max(Math.max(d, p), _);
                                    if (m > 255) {
                                        var g = 255 / m;
                                        d *= g, p *= g, _ *= g
                                    }
                                    l[3 * f + 0] = d, l[3 * f + 1] = p, l[3 * f + 2] = _
                                }
                        l ? a.push(l) : a.push(u)
                    }
                    return a
                },
                n = this.getScene();
            n && (this._texture = n.getEngine().createRawCubeTextureFromUrl(this.url, n, this._size, e.Engine.TEXTUREFORMAT_RGB, n.getEngine().getCaps().textureFloat ? e.Engine.TEXTURETYPE_FLOAT : e.Engine.TEXTURETYPE_UNSIGNED_INT, this._noMipmap, r, null, this._onLoad, this._onError))
        }, i.prototype.loadTexture = function() {
            this._isBABYLONPreprocessed ? this.loadBabylonTexture() : this.loadHDRTexture()
        }, i.prototype.clone = function() {
            var e = this.getScene();
            if (!e) return this;
            var t = this._isBABYLONPreprocessed ? null : this._size,
                r = new i(this.url, e, t, this._noMipmap, this._generateHarmonics, this._useInGammaSpace, this._usePMREMGenerator);
            return r.level = this.level, r.wrapU = this.wrapU, r.wrapV = this.wrapV, r.coordinatesIndex = this.coordinatesIndex, r.coordinatesMode = this.coordinatesMode, r
        }, i.prototype.delayLoad = function() {
            this.delayLoadState === e.Engine.DELAYLOADSTATE_NOTLOADED && (this.delayLoadState = e.Engine.DELAYLOADSTATE_LOADED, this._texture = this._getFromCache(this.url, this._noMipmap), this._texture || this.loadTexture())
        }, i.prototype.getReflectionTextureMatrix = function() {
            return this._textureMatrix
        }, i.prototype.setReflectionTextureMatrix = function(e) {
            this._textureMatrix = e
        }, i.Parse = function(t, r, n) {
            var o = null;
            if (t.name && !t.isRenderTarget) {
                var s = t.isBABYLONPreprocessed ? null : t.size;
                o = new i(n + t.name, r, s, t.noMipmap, t.generateHarmonics, t.useInGammaSpace, t.usePMREMGenerator), o.name = t.name, o.hasAlpha = t.hasAlpha, o.level = t.level, o.coordinatesMode = t.coordinatesMode, o.isBlocking = t.isBlocking
            }
            return o && (t.boundingBoxPosition && (o.boundingBoxPosition = e.Vector3.FromArray(t.boundingBoxPosition)), t.boundingBoxSize && (o.boundingBoxSize = e.Vector3.FromArray(t.boundingBoxSize))), o
        }, i.prototype.serialize = function() {
            if (!this.name) return null;
            var e = {};
            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._useInGammaSpace, e.generateHarmonics = this._generateHarmonics, e.usePMREMGenerator = this._usePMREMGenerator, e.isBABYLONPreprocessed = this._isBABYLONPreprocessed, e.customType = "BABYLON.HDRCubeTexture", e.noMipmap = this._noMipmap, e.isBlocking = this._isBlocking, e
        }, i.generateBabylonHDROnDisk = function(e, t, r) {
            void 0 === r && (r = null);
            var n = function(e) {
                var t = new Blob([e], {
                        type: "application/octet-stream"
                    }),
                    i = window.URL.createObjectURL(t),
                    r = document.createElement("a");
                document.body.appendChild(r), r.style.display = "none", r.href = i, r.download = "envmap.babylon.hdr", r.click()
            };
            i.generateBabylonHDR(e, t, n, r)
        }, i.generateBabylonHDR = function(t, i, r, n) {
            void 0 === n && (n = null), t && e.Tools.IsExponentOfTwo(i) && e.Tools.Error("Generation of Babylon HDR is coming back in 3.2.")
        }, i._facesMapping = ["right", "left", "up", "down", "front", "back"], i
    })(e.BaseTexture);
    e.HDRCubeTexture = t
})(BABYLON || (BABYLON = {}));
var Earcut;
!(function(e) {
    function t(e, t, r) {
        r = r || 2;
        var o = t && t.length,
            s = o ? t[0] * r : e.length,
            a = i(e, 0, s, r, !0),
            l = new Array;
        if (!a) return l;
        var h, u, f, d, p = 0,
            _ = 0,
            m = 0;
        if (o && (a = c(e, t, a, r)), e.length > 80 * r) {
            p = h = e[0], _ = u = e[1];
            for (var g = r; g < s; g += r) f = e[g], d = e[g + 1], f < p && (p = f), d < _ && (_ = d), f > h && (h = f), d > u && (u = d);
            m = Math.max(h - p, u - _)
        }
        return n(a, l, r, p, _, m, 0), l
    }

    function i(e, t, i, r, n) {
        var o, s = null;
        if (n === R(e, t, i, r) > 0)
            for (o = t; o < i; o += r) s = M(o, e[o], e[o + 1], s);
        else
            for (o = i - r; o >= t; o -= r) s = M(o, e[o], e[o + 1], s);
        return s && b(s, s.next) && (S(s), s = s.next), s
    }

    function r(e, t) {
        if (!e) return e;
        t || (t = e);
        var i, r = e;
        do {
            if (i = !1, r.steiner || !b(r, r.next) && 0 !== y(r.prev, r, r.next)) r = r.next;
            else {
                if (S(r), (r = t = r.prev) === r.next) return;
                i = !0
            }
        } while (i || r !== t);
        return t
    }

    function n(e, t, i, c, h, u, f) {
        if (e) {
            !f && u && d(e, c, h, u);
            for (var p, _, m = e; e.prev !== e.next;)
                if (p = e.prev, _ = e.next, u ? s(e, c, h, u) : o(e)) t.push(p.i / i), t.push(e.i / i), t.push(_.i / i), S(e), e = _.next, m = _.next;
                else if ((e = _) === m) {
                f ? 1 === f ? (e = a(e, t, i), n(e, t, i, c, h, u, 2)) : 2 === f && l(e, t, i, c, h, u) : n(r(e, void 0), t, i, c, h, u, 1);
                break
            }
        }
    }

    function o(e) {
        var t = e.prev,
            i = e,
            r = e.next;
        if (y(t, i, r) >= 0) return !1;
        for (var n = e.next.next; n !== e.prev;) {
            if (g(t.x, t.y, i.x, i.y, r.x, r.y, n.x, n.y) && y(n.prev, n, n.next) >= 0) return !1;
            n = n.next
        }
        return !0
    }

    function s(e, t, i, r) {
        var n = e.prev,
            o = e,
            s = e.next;
        if (y(n, o, s) >= 0) return !1;
        for (var a = n.x < o.x ? n.x < s.x ? n.x : s.x : o.x < s.x ? o.x : s.x, l = n.y < o.y ? n.y < s.y ? n.y : s.y : o.y < s.y ? o.y : s.y, c = n.x > o.x ? n.x > s.x ? n.x : s.x : o.x > s.x ? o.x : s.x, h = n.y > o.y ? n.y > s.y ? n.y : s.y : o.y > s.y ? o.y : s.y, u = _(a, l, t, i, r), f = _(c, h, t, i, r), d = e.nextZ; d && d.z <= f;) {
            if (d !== e.prev && d !== e.next && g(n.x, n.y, o.x, o.y, s.x, s.y, d.x, d.y) && y(d.prev, d, d.next) >= 0) return !1;
            d = d.nextZ
        }
        for (d = e.prevZ; d && d.z >= u;) {
            if (d !== e.prev && d !== e.next && g(n.x, n.y, o.x, o.y, s.x, s.y, d.x, d.y) && y(d.prev, d, d.next) >= 0) return !1;
            d = d.prevZ
        }
        return !0
    }

    function a(e, t, i) {
        var r = e;
        do {
            var n = r.prev,
                o = r.next.next;
            !b(n, o) && x(n, r, r.next, o) && E(n, o) && E(o, n) && (t.push(n.i / i), t.push(r.i / i), t.push(o.i / i), S(r), S(r.next), r = e = o), r = r.next
        } while (r !== e);
        return r
    }

    function l(e, t, i, o, s, a) {
        var l = e;
        do {
            for (var c = l.next.next; c !== l.prev;) {
                if (l.i !== c.i && v(l, c)) {
                    var h = P(l, c);
                    return l = r(l, l.next), h = r(h, h.next), n(l, t, i, o, s, a, void 0), void n(h, t, i, o, s, a, void 0)
                }
                c = c.next
            }
            l = l.next
        } while (l !== e)
    }

    function c(e, t, n, o) {
        var s, a, l, c, f, d = [];
        for (s = 0, a = t.length; s < a; s++) l = t[s] * o, c = s < a - 1 ? t[s + 1] * o : e.length, f = i(e, l, c, o, !1), f === f.next && (f.steiner = !0), d.push(m(f));
        for (d.sort(h), s = 0; s < d.length; s++) u(d[s], n), n = r(n, n.next);
        return n
    }

    function h(e, t) {
        return e.x - t.x
    }

    function u(e, t) {
        if (t = f(e, t)) {
            var i = P(t, e);
            r(i, i.next)
        }
    }

    function f(e, t) {
        var i, r = t,
            n = e.x,
            o = e.y,
            s = -1 / 0;
        do {
            if (o <= r.y && o >= r.next.y) {
                var a = r.x + (o - r.y) * (r.next.x - r.x) / (r.next.y - r.y);
                if (a <= n && a > s) {
                    if (s = a, a === n) {
                        if (o === r.y) return r;
                        if (o === r.next.y) return r.next
                    }
                    i = r.x < r.next.x ? r : r.next
                }
            }
            r = r.next
        } while (r !== t);
        if (!i) return null;
        if (n === s) return i.prev;
        var l, c = i,
            h = i.x,
            u = i.y,
            f = 1 / 0;
        for (r = i.next; r !== c;) n >= r.x && r.x >= h && g(o < u ? n : s, o, h, u, o < u ? s : n, o, r.x, r.y) && ((l = Math.abs(o - r.y) / (n - r.x)) < f || l === f && r.x > i.x) && E(r, e) && (i = r, f = l), r = r.next;
        return i
    }

    function d(e, t, i, r) {
        var n = e;
        do {
            null === n.z && (n.z = _(n.x, n.y, t, i, r)), n.prevZ = n.prev, n.nextZ = n.next, n = n.next
        } while (n !== e);
        n.prevZ.nextZ = null, n.prevZ = null, p(n)
    }

    function p(e) {
        var t, i, r, n, o, s, a, l, c = 1;
        do {
            for (i = e, e = null, o = null, s = 0; i;) {
                for (s++, r = i, a = 0, t = 0; t < c && (a++, r = r.nextZ); t++);
                for (l = c; a > 0 || l > 0 && r;) 0 === a ? (n = r, r = r.nextZ, l--) : 0 !== l && r ? i.z <= r.z ? (n = i, i = i.nextZ, a--) : (n = r, r = r.nextZ, l--) : (n = i, i = i.nextZ, a--), o ? o.nextZ = n : e = n, n.prevZ = o, o = n;
                i = r
            }
            o.nextZ = null, c *= 2
        } while (s > 1);
        return e
    }

    function _(e, t, i, r, n) {
        return e = 32767 * (e - i) / n, t = 32767 * (t - r) / n, e = 16711935 & (e | e << 8), e = 252645135 & (e | e << 4), e = 858993459 & (e | e << 2), e = 1431655765 & (e | e << 1), t = 16711935 & (t | t << 8), t = 252645135 & (t | t << 4), t = 858993459 & (t | t << 2), t = 1431655765 & (t | t << 1), e | t << 1
    }

    function m(e) {
        var t = e,
            i = e;
        do {
            t.x < i.x && (i = t), t = t.next
        } while (t !== e);
        return i
    }

    function g(e, t, i, r, n, o, s, a) {
        return (n - s) * (t - a) - (e - s) * (o - a) >= 0 && (e - s) * (r - a) - (i - s) * (t - a) >= 0 && (i - s) * (o - a) - (n - s) * (r - a) >= 0
    }

    function v(e, t) {
        return e.next.i !== t.i && e.prev.i !== t.i && !T(e, t) && E(e, t) && E(t, e) && A(e, t)
    }

    function y(e, t, i) {
        return (t.y - e.y) * (i.x - t.x) - (t.x - e.x) * (i.y - t.y)
    }

    function b(e, t) {
        return e.x === t.x && e.y === t.y
    }

    function x(e, t, i, r) {
        return !!(b(e, t) && b(i, r) || b(e, r) && b(i, t)) || y(e, t, i) > 0 != y(e, t, r) > 0 && y(i, r, e) > 0 != y(i, r, t) > 0
    }

    function T(e, t) {
        var i = e;
        do {
            if (i.i !== e.i && i.next.i !== e.i && i.i !== t.i && i.next.i !== t.i && x(i, i.next, e, t)) return !0;
            i = i.next
        } while (i !== e);
        return !1
    }

    function E(e, t) {
        return y(e.prev, e, e.next) < 0 ? y(e, t, e.next) >= 0 && y(e, e.prev, t) >= 0 : y(e, t, e.prev) < 0 || y(e, e.next, t) < 0
    }

    function A(e, t) {
        var i = e,
            r = !1,
            n = (e.x + t.x) / 2,
            o = (e.y + t.y) / 2;
        do {
            i.y > o != i.next.y > o && n < (i.next.x - i.x) * (o - i.y) / (i.next.y - i.y) + i.x && (r = !r), i = i.next
        } while (i !== e);
        return r
    }

    function P(e, t) {
        var i = new I(e.i, e.x, e.y),
            r = new I(t.i, t.x, t.y),
            n = e.next,
            o = t.prev;
        return e.next = t, t.prev = e, i.next = n, n.prev = i, r.next = i, i.prev = r, o.next = r, r.prev = o, r
    }

    function M(e, t, i, r) {
        var n = new I(e, t, i);
        return r ? (n.next = r.next, n.prev = r, r.next.prev = n, r.next = n) : (n.prev = n, n.next = n), n
    }

    function S(e) {
        e.next.prev = e.prev, e.prev.next = e.next, e.prevZ && (e.prevZ.nextZ = e.nextZ), e.nextZ && (e.nextZ.prevZ = e.prevZ)
    }

    function C(e, t, i, r) {
        var n = t && t.length,
            o = n ? t[0] * i : e.length,
            s = Math.abs(R(e, 0, o, i));
        if (n)
            for (var a = 0, l = t.length; a < l; a++) {
                var c = t[a] * i,
                    h = a < l - 1 ? t[a + 1] * i : e.length;
                s -= Math.abs(R(e, c, h, i))
            }
        var u = 0;
        for (a = 0; a < r.length; a += 3) {
            var f = r[a] * i,
                d = r[a + 1] * i,
                p = r[a + 2] * i;
            u += Math.abs((e[f] - e[p]) * (e[d + 1] - e[f + 1]) - (e[f] - e[d]) * (e[p + 1] - e[f + 1]))
        }
        return 0 === s && 0 === u ? 0 : Math.abs((u - s) / s)
    }

    function R(e, t, i, r) {
        for (var n = 0, o = t, s = i - r; o < i; o += r) n += (e[s] - e[o]) * (e[o + 1] + e[s + 1]), s = o;
        return n
    }

    function O(e) {
        for (var t = e[0][0].length, i = {
                vertices: new Array,
                holes: new Array,
                dimensions: t
            }, r = 0, n = 0; n < e.length; n++) {
            for (var o = 0; o < e[n].length; o++)
                for (var s = 0; s < t; s++) i.vertices.push(e[n][o][s]);
            n > 0 && (r += e[n - 1].length, i.holes.push(r))
        }
        return i
    }
    e.earcut = t;
    var I = (function() {
        function e(e, t, i) {
            this.i = e, this.x = t, this.y = i, this.prev = null, this.next = null, this.z = null, this.prevZ = null, this.nextZ = null, this.steiner = !1
        }
        return e
    })();
    e.deviation = C, e.flatten = O
})(Earcut || (Earcut = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
            function t(t, i) {
                var r = e.call(this, t.x, t.y) || this;
                return r.index = i, r
            }
            return __extends(t, e), t
        })(e.Vector2),
        i = (function() {
            function i() {
                this.elements = new Array
            }
            return i.prototype.add = function(e) {
                var i = this,
                    r = new Array;
                return e.forEach((function(e) {
                    if (0 === r.length || !e.equalsWithEpsilon(r[0])) {
                        var n = new t(e, i.elements.length);
                        r.push(n), i.elements.push(n)
                    }
                })), r
            }, i.prototype.computeBounds = function() {
                var t = new e.Vector2(this.elements[0].x, this.elements[0].y),
                    i = new e.Vector2(this.elements[0].x, this.elements[0].y);
                return this.elements.forEach((function(e) {
                    e.x < t.x ? t.x = e.x : e.x > i.x && (i.x = e.x), e.y < t.y ? t.y = e.y : e.y > i.y && (i.y = e.y)
                })), {
                    min: t,
                    max: i,
                    width: i.x - t.x,
                    height: i.y - t.y
                }
            }, i
        })(),
        r = (function() {
            function t() {}
            return t.Rectangle = function(t, i, r, n) {
                return [new e.Vector2(t, i), new e.Vector2(r, i), new e.Vector2(r, n), new e.Vector2(t, n)]
            }, t.Circle = function(t, i, r, n) {
                void 0 === i && (i = 0), void 0 === r && (r = 0), void 0 === n && (n = 32);
                for (var o = new Array, s = 0, a = 2 * Math.PI / n, l = 0; l < n; l++) o.push(new e.Vector2(i + Math.cos(s) * t, r + Math.sin(s) * t)), s -= a;
                return o
            }, t.Parse = function(t) {
                var i, r = t.split(/[^-+eE\.\d]+/).map(parseFloat).filter((function(e) {
                        return !isNaN(e)
                    })),
                    n = [];
                for (i = 0; i < (2147483646 & r.length); i += 2) n.push(new e.Vector2(r[i], r[i + 1]));
                return n
            }, t.StartingAt = function(t, i) {
                return e.Path2.StartingAt(t, i)
            }, t
        })();
    e.Polygon = r;
    var n = (function() {
        function t(t, r, n) {
            this._points = new i, this._outlinepoints = new i, this._holes = new Array, this._epoints = new Array, this._eholes = new Array, this._name = t, this._scene = n;
            var o;
            o = r instanceof e.Path2 ? r.getPoints() : r, this._addToepoint(o), this._points.add(o), this._outlinepoints.add(o)
        }
        return t.prototype._addToepoint = function(e) {
            for (var t = 0, i = e; t < i.length; t++) {
                var r = i[t];
                this._epoints.push(r.x, r.y)
            }
        }, t.prototype.addHole = function(e) {
            this._points.add(e);
            var t = new i;
            return t.add(e), this._holes.push(t), this._eholes.push(this._epoints.length / 2), this._addToepoint(e), this
        }, t.prototype.build = function(t, i) {
            var r = this;
            void 0 === t && (t = !1), void 0 === i && (i = 0);
            var n = new e.Mesh(this._name, this._scene),
                o = new Array,
                s = new Array,
                a = new Array,
                l = this._points.computeBounds();
            this._points.elements.forEach((function(e) {
                o.push(0, 1, 0), s.push(e.x, 0, e.y),
                    a.push((e.x - l.min.x) / l.width, (e.y - l.min.y) / l.height)
            }));
            for (var c = new Array, h = Earcut.earcut(this._epoints, this._eholes, 2), u = 0; u < h.length; u++) c.push(h[u]);
            if (i > 0) {
                var f = s.length / 3;
                this._points.elements.forEach((function(e) {
                    o.push(0, -1, 0), s.push(e.x, -i, e.y), a.push(1 - (e.x - l.min.x) / l.width, 1 - (e.y - l.min.y) / l.height)
                }));
                for (var d = c.length, u = 0; u < d; u += 3) {
                    var p = c[u + 0],
                        _ = c[u + 1],
                        m = c[u + 2];
                    c.push(m + f), c.push(_ + f), c.push(p + f)
                }
                this.addSide(s, o, a, c, l, this._outlinepoints, i, !1), this._holes.forEach((function(e) {
                    r.addSide(s, o, a, c, l, e, i, !0)
                }))
            }
            return n.setVerticesData(e.VertexBuffer.PositionKind, s, t), n.setVerticesData(e.VertexBuffer.NormalKind, o, t), n.setVerticesData(e.VertexBuffer.UVKind, a, t), n.setIndices(c), n
        }, t.prototype.addSide = function(t, i, r, n, o, s, a, l) {
            for (var c = t.length / 3, h = 0, u = 0; u < s.elements.length; u++) {
                var f, d = s.elements[u];
                f = u + 1 > s.elements.length - 1 ? s.elements[0] : s.elements[u + 1], t.push(d.x, 0, d.y), t.push(d.x, -a, d.y), t.push(f.x, 0, f.y), t.push(f.x, -a, f.y);
                var p = new e.Vector3(d.x, 0, d.y),
                    _ = new e.Vector3(f.x, 0, f.y),
                    m = _.subtract(p),
                    g = new e.Vector3(0, 1, 0),
                    v = e.Vector3.Cross(m, g);
                v = v.normalize(), r.push(h / o.width, 0), r.push(h / o.width, 1), h += m.length(), r.push(h / o.width, 0), r.push(h / o.width, 1), l ? (i.push(v.x, v.y, v.z), i.push(v.x, v.y, v.z), i.push(v.x, v.y, v.z), i.push(v.x, v.y, v.z), n.push(c), n.push(c + 2), n.push(c + 1), n.push(c + 1), n.push(c + 2), n.push(c + 3)) : (i.push(-v.x, -v.y, -v.z), i.push(-v.x, -v.y, -v.z), i.push(-v.x, -v.y, -v.z), i.push(-v.x, -v.y, -v.z), n.push(c), n.push(c + 1), n.push(c + 2), n.push(c + 1), n.push(c + 3), n.push(c + 2)), c += 4
            }
        }, t
    })();
    e.PolygonMeshBuilder = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = 0,
        i = (function() {
            function t(e, t, i) {
                this.pos = e, this.normal = t, this.uv = i
            }
            return t.prototype.clone = function() {
                return new t(this.pos.clone(), this.normal.clone(), this.uv.clone())
            }, t.prototype.flip = function() {
                this.normal = this.normal.scale(-1)
            }, t.prototype.interpolate = function(i, r) {
                return new t(e.Vector3.Lerp(this.pos, i.pos, r), e.Vector3.Lerp(this.normal, i.normal, r), e.Vector2.Lerp(this.uv, i.uv, r))
            }, t
        })(),
        r = (function() {
            function t(e, t) {
                this.normal = e, this.w = t
            }
            return t.FromPoints = function(i, r, n) {
                var o = n.subtract(i),
                    s = r.subtract(i);
                if (0 === o.lengthSquared() || 0 === s.lengthSquared()) return null;
                var a = e.Vector3.Normalize(e.Vector3.Cross(o, s));
                return new t(a, e.Vector3.Dot(a, i))
            }, t.prototype.clone = function() {
                return new t(this.normal.clone(), this.w)
            }, t.prototype.flip = function() {
                this.normal.scaleInPlace(-1), this.w = -this.w
            }, t.prototype.splitPolygon = function(i, r, o, s, a) {
                var l, c, h = 0,
                    u = [];
                for (l = 0; l < i.vertices.length; l++) {
                    c = e.Vector3.Dot(this.normal, i.vertices[l].pos) - this.w;
                    var f = c < -t.EPSILON ? 2 : c > t.EPSILON ? 1 : 0;
                    h |= f, u.push(f)
                }
                switch (h) {
                    case 0:
                        (e.Vector3.Dot(this.normal, i.plane.normal) > 0 ? r : o).push(i);
                        break;
                    case 1:
                        s.push(i);
                        break;
                    case 2:
                        a.push(i);
                        break;
                    case 3:
                        var d = [],
                            p = [];
                        for (l = 0; l < i.vertices.length; l++) {
                            var _ = (l + 1) % i.vertices.length,
                                m = u[l],
                                g = u[_],
                                v = i.vertices[l],
                                y = i.vertices[_];
                            if (2 !== m && d.push(v), 1 !== m && p.push(2 !== m ? v.clone() : v), 3 == (m | g)) {
                                c = (this.w - e.Vector3.Dot(this.normal, v.pos)) / e.Vector3.Dot(this.normal, y.pos.subtract(v.pos));
                                var b = v.interpolate(y, c);
                                d.push(b), p.push(b.clone())
                            }
                        }
                        var x;
                        d.length >= 3 && (x = new n(d, i.shared), x.plane && s.push(x)), p.length >= 3 && (x = new n(p, i.shared), x.plane && a.push(x))
                }
            }, t.EPSILON = 1e-5, t
        })(),
        n = (function() {
            function e(e, t) {
                this.vertices = e, this.shared = t, this.plane = r.FromPoints(e[0].pos, e[1].pos, e[2].pos)
            }
            return e.prototype.clone = function() {
                return new e(this.vertices.map((function(e) {
                    return e.clone()
                })), this.shared)
            }, e.prototype.flip = function() {
                this.vertices.reverse().map((function(e) {
                    e.flip()
                })), this.plane.flip()
            }, e
        })(),
        o = (function() {
            function e(e) {
                this.plane = null, this.front = null, this.back = null, this.polygons = new Array, e && this.build(e)
            }
            return e.prototype.clone = function() {
                var t = new e;
                return t.plane = this.plane && this.plane.clone(), t.front = this.front && this.front.clone(), t.back = this.back && this.back.clone(), t.polygons = this.polygons.map((function(e) {
                    return e.clone()
                })), t
            }, e.prototype.invert = function() {
                for (var e = 0; e < this.polygons.length; e++) this.polygons[e].flip();
                this.plane && this.plane.flip(), this.front && this.front.invert(), this.back && this.back.invert();
                var t = this.front;
                this.front = this.back, this.back = t
            }, e.prototype.clipPolygons = function(e) {
                if (!this.plane) return e.slice();
                for (var t = new Array, i = new Array, r = 0; r < e.length; r++) this.plane.splitPolygon(e[r], t, i, t, i);
                return this.front && (t = this.front.clipPolygons(t)), i = this.back ? this.back.clipPolygons(i) : [], t.concat(i)
            }, e.prototype.clipTo = function(e) {
                this.polygons = e.clipPolygons(this.polygons), this.front && this.front.clipTo(e), this.back && this.back.clipTo(e)
            }, e.prototype.allPolygons = function() {
                var e = this.polygons.slice();
                return this.front && (e = e.concat(this.front.allPolygons())), this.back && (e = e.concat(this.back.allPolygons())), e
            }, e.prototype.build = function(t) {
                if (t.length) {
                    this.plane || (this.plane = t[0].plane.clone());
                    for (var i = new Array, r = new Array, n = 0; n < t.length; n++) this.plane.splitPolygon(t[n], this.polygons, this.polygons, i, r);
                    i.length && (this.front || (this.front = new e), this.front.build(i)), r.length && (this.back || (this.back = new e), this.back.build(r))
                }
            }, e
        })(),
        s = (function() {
            function r() {
                this.polygons = new Array
            }
            return r.FromMesh = function(o) {
                var s, a, l, c, h, u, f, d, p, _, m = new Array,
                    g = null;
                if (!(o instanceof e.Mesh)) throw "BABYLON.CSG: Wrong Mesh type, must be BABYLON.Mesh";
                o.computeWorldMatrix(!0), f = o.getWorldMatrix(), d = o.position.clone(), p = o.rotation.clone(), o.rotationQuaternion && (g = o.rotationQuaternion.clone()), _ = o.scaling.clone();
                for (var v = o.getIndices(), y = o.getVerticesData(e.VertexBuffer.PositionKind), b = o.getVerticesData(e.VertexBuffer.NormalKind), x = o.getVerticesData(e.VertexBuffer.UVKind), T = o.subMeshes, E = 0, A = T.length; E < A; E++)
                    for (var P = T[E].indexStart, M = T[E].indexCount + T[E].indexStart; P < M; P += 3) {
                        u = [];
                        for (var S = 0; S < 3; S++) {
                            var C = new e.Vector3(b[3 * v[P + S]], b[3 * v[P + S] + 1], b[3 * v[P + S] + 2]);
                            l = new e.Vector2(x[2 * v[P + S]], x[2 * v[P + S] + 1]);
                            var R = new e.Vector3(y[3 * v[P + S]], y[3 * v[P + S] + 1], y[3 * v[P + S] + 2]);
                            c = e.Vector3.TransformCoordinates(R, f), a = e.Vector3.TransformNormal(C, f), s = new i(c, a, l), u.push(s)
                        }
                        h = new n(u, {
                            subMeshId: E,
                            meshId: t,
                            materialIndex: T[E].materialIndex
                        }), h.plane && m.push(h)
                    }
                var O = r.FromPolygons(m);
                return O.matrix = f, O.position = d, O.rotation = p, O.scaling = _, O.rotationQuaternion = g, t++, O
            }, r.FromPolygons = function(e) {
                var t = new r;
                return t.polygons = e, t
            }, r.prototype.clone = function() {
                var e = new r;
                return e.polygons = this.polygons.map((function(e) {
                    return e.clone()
                })), e.copyTransformAttributes(this), e
            }, r.prototype.union = function(e) {
                var t = new o(this.clone().polygons),
                    i = new o(e.clone().polygons);
                return t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), r.FromPolygons(t.allPolygons()).copyTransformAttributes(this)
            }, r.prototype.unionInPlace = function(e) {
                var t = new o(this.polygons),
                    i = new o(e.polygons);
                t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), this.polygons = t.allPolygons()
            }, r.prototype.subtract = function(e) {
                var t = new o(this.clone().polygons),
                    i = new o(e.clone().polygons);
                return t.invert(), t.clipTo(i), i.clipTo(t), i.invert(), i.clipTo(t), i.invert(), t.build(i.allPolygons()), t.invert(), r.FromPolygons(t.allPolygons()).copyTransformAttributes(this)
            }, r.prototype.subtractInPlace = function(e) {
                var t = new o(this.polygons),
                    i = new o(e.polygons);
                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()
            }, r.prototype.intersect = function(e) {
                var t = new o(this.clone().polygons),
                    i = new o(e.clone().polygons);
                return t.invert(), i.clipTo(t), i.invert(), t.clipTo(i), i.clipTo(t), t.build(i.allPolygons()), t.invert(), r.FromPolygons(t.allPolygons()).copyTransformAttributes(this)
            }, r.prototype.intersectInPlace = function(e) {
                var t = new o(this.polygons),
                    i = new o(e.polygons);
                t.invert(), i.clipTo(t), i.invert(), t.clipTo(i), i.clipTo(t), t.build(i.allPolygons()), t.invert(), this.polygons = t.allPolygons()
            }, r.prototype.inverse = function() {
                var e = this.clone();
                return e.inverseInPlace(), e
            }, r.prototype.inverseInPlace = function() {
                this.polygons.map((function(e) {
                    e.flip()
                }))
            }, r.prototype.copyTransformAttributes = function(e) {
                return this.matrix = e.matrix, this.position = e.position, this.rotation = e.rotation, this.scaling = e.scaling, this.rotationQuaternion = e.rotationQuaternion, this
            }, r.prototype.buildMeshGeometry = function(t, i, r) {
                var n = this.matrix.clone();
                n.invert();
                var o, s, a, l = new e.Mesh(t, i),
                    c = [],
                    h = [],
                    u = [],
                    f = [],
                    d = e.Vector3.Zero(),
                    p = e.Vector3.Zero(),
                    _ = e.Vector2.Zero(),
                    m = this.polygons,
                    g = [0, 0, 0],
                    v = {},
                    y = 0,
                    b = {};
                r && m.sort((function(e, t) {
                    return e.shared.meshId === t.shared.meshId ? e.shared.subMeshId - t.shared.subMeshId : e.shared.meshId - t.shared.meshId
                }));
                for (var x = 0, T = m.length; x < T; x++) {
                    o = m[x], b[o.shared.meshId] || (b[o.shared.meshId] = {}), b[o.shared.meshId][o.shared.subMeshId] || (b[o.shared.meshId][o.shared.subMeshId] = {
                        indexStart: 1 / 0,
                        indexEnd: -1 / 0,
                        materialIndex: o.shared.materialIndex
                    }), a = b[o.shared.meshId][o.shared.subMeshId];
                    for (var E = 2, A = o.vertices.length; E < A; E++) {
                        g[0] = 0, g[1] = E - 1, g[2] = E;
                        for (var P = 0; P < 3; P++) {
                            d.copyFrom(o.vertices[g[P]].pos), p.copyFrom(o.vertices[g[P]].normal), _.copyFrom(o.vertices[g[P]].uv);
                            var M = e.Vector3.TransformCoordinates(d, n),
                                S = e.Vector3.TransformNormal(p, n);
                            s = v[M.x + "," + M.y + "," + M.z], void 0 !== s && u[3 * s] === S.x && u[3 * s + 1] === S.y && u[3 * s + 2] === S.z && f[2 * s] === _.x && f[2 * s + 1] === _.y || (c.push(M.x, M.y, M.z), f.push(_.x, _.y), u.push(p.x, p.y, p.z), s = v[M.x + "," + M.y + "," + M.z] = c.length / 3 - 1), h.push(s), a.indexStart = Math.min(y, a.indexStart), a.indexEnd = Math.max(y, a.indexEnd), y++
                        }
                    }
                }
                if (l.setVerticesData(e.VertexBuffer.PositionKind, c), l.setVerticesData(e.VertexBuffer.NormalKind, u), l.setVerticesData(e.VertexBuffer.UVKind, f), l.setIndices(h, null), r) {
                    var C, R = 0;
                    l.subMeshes = new Array;
                    for (var O in b) {
                        C = -1;
                        for (var I in b[O]) a = b[O][I], e.SubMesh.CreateFromIndices(a.materialIndex + R, a.indexStart, a.indexEnd - a.indexStart + 1, l), C = Math.max(a.materialIndex, C);
                        R += ++C
                    }
                }
                return l
            }, r.prototype.toMesh = function(e, t, i, r) {
                var n = this.buildMeshGeometry(e, i, r);
                return n.material = t, n.position.copyFrom(this.position), n.rotation.copyFrom(this.rotation), this.rotationQuaternion && (n.rotationQuaternion = this.rotationQuaternion.clone()), n.scaling.copyFrom(this.scaling), n.computeWorldMatrix(!0), n
            }, r
        })();
    e.CSG = s
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o) {
            this.size = t, this.position = i, this.alphaMode = e.Engine.ALPHA_ONEONE, this.color = r || new e.Color3(1, 1, 1), this.texture = n ? new e.Texture(n, o.getScene(), !0) : null, this._system = o, o.lensFlares.push(this)
        }
        return t.AddFlare = function(e, i, r, n, o) {
            return new t(e, i, r, n, o)
        }, t.prototype.dispose = function() {
            this.texture && this.texture.dispose();
            var e = this._system.lensFlares.indexOf(this);
            this._system.lensFlares.splice(e, 1)
        }, t
    })();
    e.LensFlare = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            this.name = t, this.lensFlares = new Array, this.borderLimit = 300, this.viewportBorder = 0, this.layerMask = 268435455, this._vertexBuffers = {}, this._isEnabled = !0, this._scene = r || e.Engine.LastCreatedScene, this._emitter = i, this.id = t, r.lensFlareSystems.push(this), this.meshesSelectionPredicate = function(e) {
                return r.activeCamera && e.material && e.isVisible && e.isEnabled() && e.isBlocker && 0 != (e.layerMask & r.activeCamera.layerMask)
            };
            var n = r.getEngine(),
                o = [];
            o.push(1, 1), o.push(-1, 1), o.push(-1, -1), o.push(1, -1), this._vertexBuffers[e.VertexBuffer.PositionKind] = new e.VertexBuffer(n, o, e.VertexBuffer.PositionKind, !1, !1, 2);
            var s = [];
            s.push(0), s.push(1), s.push(2), s.push(0), s.push(2), s.push(3), this._indexBuffer = n.createIndexBuffer(s), this._effect = n.createEffect("lensFlare", [e.VertexBuffer.PositionKind], ["color", "viewportMatrix"], ["textureSampler"], "")
        }
        return Object.defineProperty(t.prototype, "isEnabled", {
            get: function() {
                return this._isEnabled
            },
            set: function(e) {
                this._isEnabled = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getScene = function() {
            return this._scene
        }, t.prototype.getEmitter = function() {
            return this._emitter
        }, t.prototype.setEmitter = function(e) {
            this._emitter = e
        }, t.prototype.getEmitterPosition = function() {
            return this._emitter.getAbsolutePosition ? this._emitter.getAbsolutePosition() : this._emitter.position
        }, t.prototype.computeEffectivePosition = function(t) {
            var i = this.getEmitterPosition();
            return i = e.Vector3.Project(i, e.Matrix.Identity(), this._scene.getTransformMatrix(), t), this._positionX = i.x, this._positionY = i.y, i = e.Vector3.TransformCoordinates(this.getEmitterPosition(), this._scene.getViewMatrix()), this.viewportBorder > 0 && (t.x -= this.viewportBorder, t.y -= this.viewportBorder, t.width += 2 * this.viewportBorder, t.height += 2 * this.viewportBorder, i.x += this.viewportBorder, i.y += this.viewportBorder, this._positionX += this.viewportBorder, this._positionY += this.viewportBorder), i.z > 0 && (this._positionX > t.x && this._positionX < t.x + t.width && this._positionY > t.y && (this._positionY, t.y, t.height), !0)
        }, t.prototype._isVisible = function() {
            if (!this._isEnabled || !this._scene.activeCamera) return !1;
            var t = this.getEmitterPosition(),
                i = t.subtract(this._scene.activeCamera.globalPosition),
                r = i.length();
            i.normalize();
            var n = new e.Ray(this._scene.activeCamera.globalPosition, i),
                o = this._scene.pickWithRay(n, this.meshesSelectionPredicate, !0);
            return !o || !o.hit || o.distance > r
        }, t.prototype.render = function() {
            if (!this._effect.isReady() || !this._scene.activeCamera) return !1;
            var t = this._scene.getEngine(),
                i = this._scene.activeCamera.viewport,
                r = i.toGlobal(t.getRenderWidth(!0), t.getRenderHeight(!0));
            if (!this.computeEffectivePosition(r)) return !1;
            if (!this._isVisible()) return !1;
            var n, o;
            n = this._positionX < this.borderLimit + r.x ? this.borderLimit + r.x - this._positionX : this._positionX > r.x + r.width - this.borderLimit ? this._positionX - r.x - r.width + this.borderLimit : 0, o = this._positionY < this.borderLimit + r.y ? this.borderLimit + r.y - this._positionY : this._positionY > r.y + r.height - this.borderLimit ? this._positionY - r.y - r.height + this.borderLimit : 0;
            var s = n > o ? n : o;
            (s -= this.viewportBorder) > this.borderLimit && (s = this.borderLimit);
            var a = 1 - s / this.borderLimit;
            if (a < 0) return !1;
            a > 1 && (a = 1), this.viewportBorder > 0 && (r.x += this.viewportBorder, r.y += this.viewportBorder, r.width -= 2 * this.viewportBorder, r.height -= 2 * this.viewportBorder, this._positionX -= this.viewportBorder, this._positionY -= this.viewportBorder);
            var l = r.x + r.width / 2,
                c = r.y + r.height / 2,
                h = l - this._positionX,
                u = c - this._positionY;
            t.enableEffect(this._effect), t.setState(!1), t.setDepthBuffer(!1), t.bindBuffers(this._vertexBuffers, this._indexBuffer, this._effect);
            for (var f = 0; f < this.lensFlares.length; f++) {
                var d = this.lensFlares[f];
                t.setAlphaMode(d.alphaMode);
                var p = l - h * d.position,
                    _ = c - u * d.position,
                    m = d.size,
                    g = d.size * t.getAspectRatio(this._scene.activeCamera, !0),
                    v = p / (r.width + 2 * r.x) * 2 - 1,
                    y = 1 - _ / (r.height + 2 * r.y) * 2,
                    b = e.Matrix.FromValues(m / 2, 0, 0, 0, 0, g / 2, 0, 0, 0, 0, 1, 0, v, y, 0, 1);
                this._effect.setMatrix("viewportMatrix", b), this._effect.setTexture("textureSampler", d.texture), this._effect.setFloat4("color", d.color.r * a, d.color.g * a, d.color.b * a, 1), t.drawElementsType(e.Material.TriangleFillMode, 0, 6)
            }
            return t.setDepthBuffer(!0), t.setAlphaMode(e.Engine.ALPHA_DISABLE), !0
        }, t.prototype.dispose = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            for (t && (t.dispose(), this._vertexBuffers[e.VertexBuffer.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null); this.lensFlares.length;) this.lensFlares[0].dispose();
            var i = this._scene.lensFlareSystems.indexOf(this);
            this._scene.lensFlareSystems.splice(i, 1)
        }, t.Parse = function(i, r, n) {
            var o = r.getLastEntryByID(i.emitterId),
                s = i.name || "lensFlareSystem#" + i.emitterId,
                a = new t(s, o, r);
            a.id = i.id || s, a.borderLimit = i.borderLimit;
            for (var l = 0; l < i.flares.length; l++) {
                var c = i.flares[l];
                e.LensFlare.AddFlare(c.size, c.position, e.Color3.FromArray(c.color), c.textureName ? n + c.textureName : "", a)
            }
            return a
        }, t.prototype.serialize = function() {
            var t = {};
            t.id = this.id, t.name = this.name, t.emitterId = this.getEmitter().id, t.borderLimit = this.borderLimit, t.flares = [];
            for (var i = 0; i < this.lensFlares.length; i++) {
                var r = this.lensFlares[i];
                t.flares.push({
                    size: r.size,
                    position: r.position,
                    color: r.color.asArray(),
                    textureName: e.Tools.GetFilename(r.texture ? r.texture.name : "")
                })
            }
            return t
        }, t
    })();
    e.LensFlareSystem = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t) {
            this.type = e, this.jointData = t, t.nativeParams = t.nativeParams || {}
        }
        return Object.defineProperty(e.prototype, "physicsJoint", {
            get: function() {
                return this._physicsJoint
            },
            set: function(e) {
                this._physicsJoint, this._physicsJoint = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "physicsPlugin", {
            set: function(e) {
                this._physicsPlugin = e
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype.executeNativeFunction = function(e) {
            e(this._physicsPlugin.world, this._physicsJoint)
        }, e.DistanceJoint = 0, e.HingeJoint = 1, e.BallAndSocketJoint = 2, e.WheelJoint = 3, e.SliderJoint = 4, e.PrismaticJoint = 5, e.UniversalJoint = 6, e.Hinge2Joint = e.WheelJoint, e.PointToPointJoint = 8, e.SpringJoint = 9, e.LockJoint = 10, e
    })();
    e.PhysicsJoint = t;
    var i = (function(e) {
        function i(i) {
            return e.call(this, t.DistanceJoint, i) || this
        }
        return __extends(i, e), i.prototype.updateDistance = function(e, t) {
            this._physicsPlugin.updateDistanceJoint(this, e, t)
        }, i
    })(t);
    e.DistanceJoint = i;
    var r = (function(e) {
        function t(t, i) {
            return e.call(this, t, i) || this
        }
        return __extends(t, e), t.prototype.setMotor = function(e, t) {
            this._physicsPlugin.setMotor(this, e || 0, t)
        }, t.prototype.setLimit = function(e, t) {
            this._physicsPlugin.setLimit(this, e, t)
        }, t
    })(t);
    e.MotorEnabledJoint = r;
    var n = (function(e) {
        function i(i) {
            return e.call(this, t.HingeJoint, i) || this
        }
        return __extends(i, e), i.prototype.setMotor = function(e, t) {
            this._physicsPlugin.setMotor(this, e || 0, t)
        }, i.prototype.setLimit = function(e, t) {
            this._physicsPlugin.setLimit(this, e, t)
        }, i
    })(r);
    e.HingeJoint = n;
    var o = (function(e) {
        function i(i) {
            return e.call(this, t.Hinge2Joint, i) || this
        }
        return __extends(i, e), i.prototype.setMotor = function(e, t, i) {
            void 0 === i && (i = 0), this._physicsPlugin.setMotor(this, e || 0, t, i)
        }, i.prototype.setLimit = function(e, t, i) {
            void 0 === i && (i = 0), this._physicsPlugin.setLimit(this, e, t, i)
        }, i
    })(r);
    e.Hinge2Joint = o
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n) {
            void 0 === r && (r = {
                mass: 0
            });
            var o = this;
            if (this.object = t, this.type = i, this._options = r, this._scene = n, this._bodyUpdateRequired = !1, this._onBeforePhysicsStepCallbacks = new Array, this._onAfterPhysicsStepCallbacks = new Array, this._onPhysicsCollideCallbacks = [], this._deltaPosition = e.Vector3.Zero(), this._isDisposed = !1, this._tmpQuat = new e.Quaternion, this._tmpQuat2 = new e.Quaternion, this.beforeStep = function() {
                    o._physicsEngine && (o.object.translate(o._deltaPosition, -1), o._deltaRotationConjugated && o.object.rotationQuaternion && o.object.rotationQuaternion.multiplyToRef(o._deltaRotationConjugated, o.object.rotationQuaternion), o.object.computeWorldMatrix(!1), o.object.parent && o.object.rotationQuaternion ? (o.getParentsRotation(), o._tmpQuat.multiplyToRef(o.object.rotationQuaternion, o._tmpQuat)) : o._tmpQuat.copyFrom(o.object.rotationQuaternion || new e.Quaternion), o._options.disableBidirectionalTransformation || o.object.rotationQuaternion && o._physicsEngine.getPhysicsPlugin().setPhysicsBodyTransformation(o, o.object.getAbsolutePivotPoint(), o._tmpQuat), o._onBeforePhysicsStepCallbacks.forEach((function(e) {
                        e(o)
                    })))
                }, this.afterStep = function() {
                    o._physicsEngine && (o._onAfterPhysicsStepCallbacks.forEach((function(e) {
                        e(o)
                    })), o._physicsEngine.getPhysicsPlugin().setTransformationFromPhysicsBody(o), o.object.parent && o.object.rotationQuaternion && (o.getParentsRotation(), o._tmpQuat.conjugateInPlace(), o._tmpQuat.multiplyToRef(o.object.rotationQuaternion, o.object.rotationQuaternion)), o.object.setAbsolutePosition(o.object.position), o._deltaRotation && o.object.rotationQuaternion && o.object.rotationQuaternion.multiplyToRef(o._deltaRotation, o.object.rotationQuaternion), o.object.translate(o._deltaPosition, 1))
                }, this.onCollideEvent = null, this.onCollide = function(e) {
                    if ((o._onPhysicsCollideCallbacks.length || o.onCollideEvent) && o._physicsEngine) {
                        var t = o._physicsEngine.getImpostorWithPhysicsBody(e.body);
                        t && (o.onCollideEvent && o.onCollideEvent(o, t), o._onPhysicsCollideCallbacks.filter((function(e) {
                            return -1 !== e.otherImpostors.indexOf(t)
                        })).forEach((function(e) {
                            e.callback(o, t)
                        })))
                    }
                }, !this.object) return void e.Tools.Error("No object was provided. A physics object is obligatory");
            !this._scene && t.getScene && (this._scene = t.getScene()), this._scene && (this._physicsEngine = this._scene.getPhysicsEngine(), this._physicsEngine ? (this.object.rotationQuaternion || (this.object.rotation ? this.object.rotationQuaternion = e.Quaternion.RotationYawPitchRoll(this.object.rotation.y, this.object.rotation.x, this.object.rotation.z) : this.object.rotationQuaternion = new e.Quaternion), this._options.mass = void 0 === r.mass ? 0 : r.mass, this._options.friction = void 0 === r.friction ? .2 : r.friction, this._options.restitution = void 0 === r.restitution ? .2 : r.restitution, this._joints = [], !this.object.parent || this._options.ignoreParent ? this._init() : this.object.parent.physicsImpostor && e.Tools.Warn("You must affect impostors to children before affecting impostor to parent.")) : e.Tools.Error("Physics not enabled. Please use scene.enablePhysics(...) before creating impostors."))
        }
        return Object.defineProperty(t.prototype, "isDisposed", {
            get: function() {
                return this._isDisposed
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "mass", {
            get: function() {
                return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyMass(this) : 0
            },
            set: function(e) {
                this.setMass(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "friction", {
            get: function() {
                return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyFriction(this) : 0
            },
            set: function(e) {
                this._physicsEngine && this._physicsEngine.getPhysicsPlugin().setBodyFriction(this, e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "restitution", {
            get: function() {
                return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getBodyRestitution(this) : 0
            },
            set: function(e) {
                this._physicsEngine && this._physicsEngine.getPhysicsPlugin().setBodyRestitution(this, e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._init = function() {
            this._physicsEngine && (this._physicsEngine.removeImpostor(this), this.physicsBody = null, this._parent = this._parent || this._getPhysicsParent(), this._isDisposed || this.parent && !this._options.ignoreParent || this._physicsEngine.addImpostor(this))
        }, t.prototype._getPhysicsParent = function() {
            if (this.object.parent instanceof e.AbstractMesh) {
                return this.object.parent.physicsImpostor
            }
            return null
        }, t.prototype.isBodyInitRequired = function() {
            return this._bodyUpdateRequired || !this._physicsBody && !this._parent
        }, t.prototype.setScalingUpdated = function(e) {
            this.forceUpdate()
        }, t.prototype.forceUpdate = function() {
            this._init(), this.parent && !this._options.ignoreParent && this.parent.forceUpdate()
        }, Object.defineProperty(t.prototype, "physicsBody", {
            get: function() {
                return this._parent && !this._options.ignoreParent ? this._parent.physicsBody : this._physicsBody
            },
            set: function(e) {
                this._physicsBody && this._physicsEngine && this._physicsEngine.getPhysicsPlugin().removePhysicsBody(this), this._physicsBody = e, this.resetUpdateFlags()
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "parent", {
            get: function() {
                return !this._options.ignoreParent && this._parent ? this._parent : null
            },
            set: function(e) {
                this._parent = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.resetUpdateFlags = function() {
            this._bodyUpdateRequired = !1
        }, t.prototype.getObjectExtendSize = function() {
            if (this.object.getBoundingInfo) {
                var e = this.object.rotationQuaternion;
                this.object.rotationQuaternion = t.IDENTITY_QUATERNION, this.object.computeWorldMatrix && this.object.computeWorldMatrix(!0);
                var i = this.object.getBoundingInfo(),
                    r = i.boundingBox.extendSizeWorld.scale(2);
                return this.object.rotationQuaternion = e, this.object.computeWorldMatrix && this.object.computeWorldMatrix(!0), r
            }
            return t.DEFAULT_OBJECT_SIZE
        }, t.prototype.getObjectCenter = function() {
            if (this.object.getBoundingInfo) {
                return this.object.getBoundingInfo().boundingBox.centerWorld
            }
            return this.object.position
        }, t.prototype.getParam = function(e) {
            return this._options[e]
        }, t.prototype.setParam = function(e, t) {
            this._options[e] = t, this._bodyUpdateRequired = !0
        }, t.prototype.setMass = function(e) {
            this.getParam("mass") !== e && this.setParam("mass", e), this._physicsEngine && this._physicsEngine.getPhysicsPlugin().setBodyMass(this, e)
        }, t.prototype.getLinearVelocity = function() {
            return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getLinearVelocity(this) : e.Vector3.Zero()
        }, t.prototype.setLinearVelocity = function(e) {
            this._physicsEngine && this._physicsEngine.getPhysicsPlugin().setLinearVelocity(this, e)
        }, t.prototype.getAngularVelocity = function() {
            return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getAngularVelocity(this) : e.Vector3.Zero()
        }, t.prototype.setAngularVelocity = function(e) {
            this._physicsEngine && this._physicsEngine.getPhysicsPlugin().setAngularVelocity(this, e)
        }, t.prototype.executeNativeFunction = function(e) {
            this._physicsEngine && e(this._physicsEngine.getPhysicsPlugin().world, this.physicsBody)
        }, t.prototype.registerBeforePhysicsStep = function(e) {
            this._onBeforePhysicsStepCallbacks.push(e)
        }, t.prototype.unregisterBeforePhysicsStep = function(t) {
            var i = this._onBeforePhysicsStepCallbacks.indexOf(t);
            i > -1 ? this._onBeforePhysicsStepCallbacks.splice(i, 1) : e.Tools.Warn("Function to remove was not found")
        }, t.prototype.registerAfterPhysicsStep = function(e) {
            this._onAfterPhysicsStepCallbacks.push(e)
        }, t.prototype.unregisterAfterPhysicsStep = function(t) {
            var i = this._onAfterPhysicsStepCallbacks.indexOf(t);
            i > -1 ? this._onAfterPhysicsStepCallbacks.splice(i, 1) : e.Tools.Warn("Function to remove was not found")
        }, t.prototype.registerOnPhysicsCollide = function(e, t) {
            var i = e instanceof Array ? e : [e];
            this._onPhysicsCollideCallbacks.push({
                callback: t,
                otherImpostors: i
            })
        }, t.prototype.unregisterOnPhysicsCollide = function(t, i) {
            var r = t instanceof Array ? t : [t],
                n = this._onPhysicsCollideCallbacks.indexOf({
                    callback: i,
                    otherImpostors: r
                });
            n > -1 ? this._onPhysicsCollideCallbacks.splice(n, 1) : e.Tools.Warn("Function to remove was not found")
        }, t.prototype.getParentsRotation = function() {
            var t = this.object.parent;
            for (this._tmpQuat.copyFromFloats(0, 0, 0, 1); t;) t.rotationQuaternion ? this._tmpQuat2.copyFrom(t.rotationQuaternion) : e.Quaternion.RotationYawPitchRollToRef(t.rotation.y, t.rotation.x, t.rotation.z, this._tmpQuat2), this._tmpQuat.multiplyToRef(this._tmpQuat2, this._tmpQuat), t = t.parent;
            return this._tmpQuat
        }, t.prototype.applyForce = function(e, t) {
            return this._physicsEngine && this._physicsEngine.getPhysicsPlugin().applyForce(this, e, t), this
        }, t.prototype.applyImpulse = function(e, t) {
            return this._physicsEngine && this._physicsEngine.getPhysicsPlugin().applyImpulse(this, e, t), this
        }, t.prototype.createJoint = function(t, i, r) {
            var n = new e.PhysicsJoint(i, r);
            return this.addJoint(t, n), this
        }, t.prototype.addJoint = function(e, t) {
            return this._joints.push({
                otherImpostor: e,
                joint: t
            }), this._physicsEngine && this._physicsEngine.addJoint(this, e, t), this
        }, t.prototype.sleep = function() {
            return this._physicsEngine && this._physicsEngine.getPhysicsPlugin().sleepBody(this), this
        }, t.prototype.wakeUp = function() {
            return this._physicsEngine && this._physicsEngine.getPhysicsPlugin().wakeUpBody(this), this
        }, t.prototype.clone = function(e) {
            return e ? new t(e, this.type, this._options, this._scene) : null
        }, t.prototype.dispose = function() {
            var e = this;
            this._physicsEngine && (this._joints.forEach((function(t) {
                e._physicsEngine && e._physicsEngine.removeJoint(e, t.otherImpostor, t.joint)
            })), this._physicsEngine.removeImpostor(this), this.parent && this.parent.forceUpdate(), this._isDisposed = !0)
        }, t.prototype.setDeltaPosition = function(e) {
            this._deltaPosition.copyFrom(e)
        }, t.prototype.setDeltaRotation = function(t) {
            this._deltaRotation || (this._deltaRotation = new e.Quaternion), this._deltaRotation.copyFrom(t), this._deltaRotationConjugated = this._deltaRotation.conjugate()
        }, t.prototype.getBoxSizeToRef = function(e) {
            return this._physicsEngine && this._physicsEngine.getPhysicsPlugin().getBoxSizeToRef(this, e), this
        }, t.prototype.getRadius = function() {
            return this._physicsEngine ? this._physicsEngine.getPhysicsPlugin().getRadius(this) : 0
        }, t.prototype.syncBoneWithImpostor = function(i, r, n, o, s) {
            var a = t._tmpVecs[0],
                l = this.object;
            if (l.rotationQuaternion)
                if (s) {
                    var c = t._tmpQuat;
                    l.rotationQuaternion.multiplyToRef(s, c), i.setRotationQuaternion(c, e.Space.WORLD, r)
                } else i.setRotationQuaternion(l.rotationQuaternion, e.Space.WORLD, r);
            a.x = 0, a.y = 0, a.z = 0, n && (a.x = n.x, a.y = n.y, a.z = n.z, i.getDirectionToRef(a, r, a), void 0 !== o && null !== o || (o = n.length()), a.x *= o, a.y *= o, a.z *= o), i.getParent() ? (a.addInPlace(l.getAbsolutePosition()), i.setAbsolutePosition(a, r)) : (r.setAbsolutePosition(l.getAbsolutePosition()), r.position.x -= a.x, r.position.y -= a.y, r.position.z -= a.z)
        }, t.prototype.syncImpostorWithBone = function(i, r, n, o, s, a) {
            var l = this.object;
            if (l.rotationQuaternion)
                if (s) {
                    var c = t._tmpQuat;
                    i.getRotationQuaternionToRef(e.Space.WORLD, r, c), c.multiplyToRef(s, l.rotationQuaternion)
                } else i.getRotationQuaternionToRef(e.Space.WORLD, r, l.rotationQuaternion);
            var h = t._tmpVecs[0],
                u = t._tmpVecs[1];
            a || (a = t._tmpVecs[2], a.x = 0, a.y = 1, a.z = 0), i.getDirectionToRef(a, r, u), i.getAbsolutePositionToRef(r, h), void 0 !== o && null !== o || !n || (o = n.length()), void 0 !== o && null !== o && (h.x += u.x * o, h.y += u.y * o, h.z += u.z * o), l.setAbsolutePosition(h)
        }, t.DEFAULT_OBJECT_SIZE = new e.Vector3(1, 1, 1), t.IDENTITY_QUATERNION = e.Quaternion.Identity(), t._tmpVecs = [e.Vector3.Zero(), e.Vector3.Zero(), e.Vector3.Zero()], t._tmpQuat = e.Quaternion.Identity(), t.NoImpostor = 0, t.SphereImpostor = 1, t.BoxImpostor = 2, t.PlaneImpostor = 3, t.MeshImpostor = 4, t.CylinderImpostor = 7, t.ParticleImpostor = 8, t.HeightmapImpostor = 9, t
    })();
    e.PhysicsImpostor = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            if (void 0 === i && (i = new e.CannonJSPlugin), this._physicsPlugin = i, this._impostors = [], this._joints = [], !this._physicsPlugin.isSupported()) throw new Error("Physics Engine " + this._physicsPlugin.name + " cannot be found. Please make sure it is included.");
            t = t || new e.Vector3(0, -9.807, 0), this.setGravity(t), this.setTimeStep()
        }
        return t.prototype.setGravity = function(e) {
            this.gravity = e, this._physicsPlugin.setGravity(this.gravity)
        }, t.prototype.setTimeStep = function(e) {
            void 0 === e && (e = 1 / 60), this._physicsPlugin.setTimeStep(e)
        }, t.prototype.getTimeStep = function() {
            return this._physicsPlugin.getTimeStep()
        }, t.prototype.dispose = function() {
            this._impostors.forEach((function(e) {
                e.dispose()
            })), this._physicsPlugin.dispose()
        }, t.prototype.getPhysicsPluginName = function() {
            return this._physicsPlugin.name
        }, t.prototype.addImpostor = function(e) {
            e.uniqueId = this._impostors.push(e), e.parent || this._physicsPlugin.generatePhysicsBody(e)
        }, t.prototype.removeImpostor = function(e) {
            var t = this._impostors.indexOf(e);
            if (t > -1) {
                var i = this._impostors.splice(t, 1);
                i.length && (i[0].physicsBody = null)
            }
        }, t.prototype.addJoint = function(e, t, i) {
            var r = {
                mainImpostor: e,
                connectedImpostor: t,
                joint: i
            };
            i.physicsPlugin = this._physicsPlugin, this._joints.push(r), this._physicsPlugin.generateJoint(r)
        }, t.prototype.removeJoint = function(e, t, i) {
            var r = this._joints.filter((function(r) {
                return r.connectedImpostor === t && r.joint === i && r.mainImpostor === e
            }));
            r.length && this._physicsPlugin.removeJoint(r[0])
        }, t.prototype._step = function(e) {
            var t = this;
            this._impostors.forEach((function(e) {
                e.isBodyInitRequired() && t._physicsPlugin.generatePhysicsBody(e)
            })), e > .1 ? e = .1 : e <= 0 && (e = 1 / 60), this._physicsPlugin.executeStep(e, this._impostors)
        }, t.prototype.getPhysicsPlugin = function() {
            return this._physicsPlugin
        }, t.prototype.getImpostors = function() {
            return this._impostors
        }, t.prototype.getImpostorForPhysicsObject = function(e) {
            for (var t = 0; t < this._impostors.length; ++t)
                if (this._impostors[t].object === e) return this._impostors[t];
            return null
        }, t.prototype.getImpostorWithPhysicsBody = function(e) {
            for (var t = 0; t < this._impostors.length; ++t)
                if (this._impostors[t].physicsBody === e) return this._impostors[t];
            return null
        }, t.Epsilon = .001, t
    })();
    e.PhysicsEngine = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            this._scene = t, this._physicsEngine = this._scene.getPhysicsEngine(), this._physicsEngine || e.Tools.Warn("Physics engine not enabled. Please enable the physics before you can use the methods.")
        }
        return t.prototype.applyRadialExplosionImpulse = function(t, r, n, o) {
            if (void 0 === o && (o = s.Constant), !this._physicsEngine) return e.Tools.Warn("Physics engine not enabled. Please enable the physics before you call this method."), null;
            var a = this._physicsEngine.getImpostors();
            if (0 === a.length) return null;
            var l = new i(this._scene);
            return a.forEach((function(e) {
                var i = l.getImpostorForceAndContactPoint(e, t, r, n, o);
                i && e.applyImpulse(i.force, i.contactPoint)
            })), l.dispose(!1), l
        }, t.prototype.applyRadialExplosionForce = function(t, r, n, o) {
            if (void 0 === o && (o = s.Constant), !this._physicsEngine) return e.Tools.Warn("Physics engine not enabled. Please enable the physics before you call the PhysicsHelper."), null;
            var a = this._physicsEngine.getImpostors();
            if (0 === a.length) return null;
            var l = new i(this._scene);
            return a.forEach((function(e) {
                var i = l.getImpostorForceAndContactPoint(e, t, r, n, o);
                i && e.applyForce(i.force, i.contactPoint)
            })), l.dispose(!1), l
        }, t.prototype.gravitationalField = function(t, i, n, o) {
            if (void 0 === o && (o = s.Constant), !this._physicsEngine) return e.Tools.Warn("Physics engine not enabled. Please enable the physics before you call the PhysicsHelper."), null;
            if (0 === this._physicsEngine.getImpostors().length) return null;
            var a = new r(this, this._scene, t, i, n, o);
            return a.dispose(!1), a
        }, t.prototype.updraft = function(t, i, r, o, s) {
            if (void 0 === s && (s = a.Center), !this._physicsEngine) return e.Tools.Warn("Physics engine not enabled. Please enable the physics before you call the PhysicsHelper."), null;
            if (0 === this._physicsEngine.getImpostors().length) return null;
            var l = new n(this._scene, t, i, r, o, s);
            return l.dispose(!1), l
        }, t.prototype.vortex = function(t, i, r, n) {
            if (!this._physicsEngine) return e.Tools.Warn("Physics engine not enabled. Please enable the physics before you call the PhysicsHelper."), null;
            if (0 === this._physicsEngine.getImpostors().length) return null;
            var s = new o(this._scene, t, i, r, n);
            return s.dispose(!1), s
        }, t
    })();
    e.PhysicsHelper = t;
    var i = (function() {
        function t(e) {
            this._sphereOptions = {
                segments: 32,
                diameter: 1
            }, this._rays = [], this._dataFetched = !1, this._scene = e
        }
        return t.prototype.getData = function() {
            return this._dataFetched = !0, {
                sphere: this._sphere,
                rays: this._rays
            }
        }, t.prototype.getImpostorForceAndContactPoint = function(t, i, r, n, o) {
            if (0 === t.mass) return null;
            if (!this._intersectsWithSphere(t, i, r)) return null;
            if ("Mesh" !== t.object.getClassName()) return null;
            var a = t.object,
                l = t.getObjectCenter(),
                c = l.subtract(i),
                h = new e.Ray(i, c, r);
            this._rays.push(h);
            var u = h.intersectsMesh(a),
                f = u.pickedPoint;
            if (!f) return null;
            var d = e.Vector3.Distance(i, f);
            if (d > r) return null;
            var p = o === s.Constant ? n : n * (1 - d / r);
            return {
                force: c.multiplyByFloats(p, p, p),
                contactPoint: f
            }
        }, t.prototype.dispose = function(e) {
            var t = this;
            void 0 === e && (e = !0), e ? this._sphere.dispose() : setTimeout((function() {
                t._dataFetched || t._sphere.dispose()
            }), 0)
        }, t.prototype._prepareSphere = function() {
            this._sphere || (this._sphere = e.MeshBuilder.CreateSphere("radialExplosionEventSphere", this._sphereOptions, this._scene), this._sphere.isVisible = !1)
        }, t.prototype._intersectsWithSphere = function(t, i, r) {
            var n = t.object;
            return this._prepareSphere(), this._sphere.position = i, this._sphere.scaling = new e.Vector3(2 * r, 2 * r, 2 * r), this._sphere._updateBoundingInfo(), this._sphere.computeWorldMatrix(!0), this._sphere.intersectsMesh(n, !0)
        }, t
    })();
    e.PhysicsRadialExplosionEvent = i;
    var r = (function() {
        function e(e, t, i, r, n, o) {
            void 0 === o && (o = s.Constant), this._dataFetched = !1, this._physicsHelper = e, this._scene = t, this._origin = i, this._radius = r, this._strength = n, this._falloff = o, this._tickCallback = this._tick.bind(this)
        }
        return e.prototype.getData = function() {
            return this._dataFetched = !0, {
                sphere: this._sphere
            }
        }, e.prototype.enable = function() {
            this._tickCallback.call(this), this._scene.registerBeforeRender(this._tickCallback)
        }, e.prototype.disable = function() {
            this._scene.unregisterBeforeRender(this._tickCallback)
        }, e.prototype.dispose = function(e) {
            var t = this;
            void 0 === e && (e = !0), e ? this._sphere.dispose() : setTimeout((function() {
                t._dataFetched || t._sphere.dispose()
            }), 0)
        }, e.prototype._tick = function() {
            if (this._sphere) this._physicsHelper.applyRadialExplosionForce(this._origin, this._radius, -1 * this._strength, this._falloff);
            else {
                var e = this._physicsHelper.applyRadialExplosionForce(this._origin, this._radius, -1 * this._strength, this._falloff);
                e && (this._sphere = e.getData().sphere.clone("radialExplosionEventSphereClone"))
            }
        }, e
    })();
    e.PhysicsGravitationalFieldEvent = r;
    var n = (function() {
        function t(t, i, r, n, o, s) {
            this._scene = t, this._origin = i, this._radius = r, this._strength = n, this._height = o, this._updraftMode = s, this._originTop = e.Vector3.Zero(), this._originDirection = e.Vector3.Zero(), this._cylinderPosition = e.Vector3.Zero(), this._dataFetched = !1, this._physicsEngine = this._scene.getPhysicsEngine(), this._origin.addToRef(new e.Vector3(0, this._height / 2, 0), this._cylinderPosition), this._origin.addToRef(new e.Vector3(0, this._height, 0), this._originTop), this._updraftMode === a.Perpendicular && (this._originDirection = this._origin.subtract(this._originTop).normalize()), this._tickCallback = this._tick.bind(this)
        }
        return t.prototype.getData = function() {
            return this._dataFetched = !0, {
                cylinder: this._cylinder
            }
        }, t.prototype.enable = function() {
            this._tickCallback.call(this), this._scene.registerBeforeRender(this._tickCallback)
        }, t.prototype.disable = function() {
            this._scene.unregisterBeforeRender(this._tickCallback)
        }, t.prototype.dispose = function(e) {
            var t = this;
            void 0 === e && (e = !0), e ? this._cylinder.dispose() : setTimeout((function() {
                t._dataFetched || t._cylinder.dispose()
            }), 0)
        }, t.prototype.getImpostorForceAndContactPoint = function(e) {
            if (0 === e.mass) return null;
            if (!this._intersectsWithCylinder(e)) return null;
            var t = e.getObjectCenter();
            if (this._updraftMode === a.Perpendicular) var i = this._originDirection;
            else var i = t.subtract(this._originTop);
            var r = -1 * this._strength;
            return {
                force: i.multiplyByFloats(r, r, r),
                contactPoint: t
            }
        }, t.prototype._tick = function() {
            var e = this;
            this._physicsEngine.getImpostors().forEach((function(t) {
                var i = e.getImpostorForceAndContactPoint(t);
                i && t.applyForce(i.force, i.contactPoint)
            }))
        }, t.prototype._prepareCylinder = function() {
            this._cylinder || (this._cylinder = e.MeshBuilder.CreateCylinder("updraftEventCylinder", {
                height: this._height,
                diameter: 2 * this._radius
            }, this._scene), this._cylinder.isVisible = !1)
        }, t.prototype._intersectsWithCylinder = function(e) {
            var t = e.object;
            return this._prepareCylinder(), this._cylinder.position = this._cylinderPosition, this._cylinder.intersectsMesh(t, !0)
        }, t
    })();
    e.PhysicsUpdraftEvent = n;
    var o = (function() {
        function t(t, i, r, n, o) {
            this._scene = t, this._origin = i, this._radius = r, this._strength = n, this._height = o, this._originTop = e.Vector3.Zero(), this._centripetalForceThreshold = .7, this._updraftMultiplier = .02, this._cylinderPosition = e.Vector3.Zero(), this._dataFetched = !1, this._physicsEngine = this._scene.getPhysicsEngine(), this._origin.addToRef(new e.Vector3(0, this._height / 2, 0), this._cylinderPosition), this._origin.addToRef(new e.Vector3(0, this._height, 0), this._originTop), this._tickCallback = this._tick.bind(this)
        }
        return t.prototype.getData = function() {
            return this._dataFetched = !0, {
                cylinder: this._cylinder
            }
        }, t.prototype.enable = function() {
            this._tickCallback.call(this), this._scene.registerBeforeRender(this._tickCallback)
        }, t.prototype.disable = function() {
            this._scene.unregisterBeforeRender(this._tickCallback)
        }, t.prototype.dispose = function(e) {
            var t = this;
            void 0 === e && (e = !0), e ? this._cylinder.dispose() : setTimeout((function() {
                t._dataFetched || t._cylinder.dispose()
            }), 0)
        }, t.prototype.getImpostorForceAndContactPoint = function(t) {
            if (0 === t.mass) return null;
            if (!this._intersectsWithCylinder(t)) return null;
            if ("Mesh" !== t.object.getClassName()) return null;
            var i = t.object,
                r = t.getObjectCenter(),
                n = new e.Vector3(this._origin.x, r.y, this._origin.z),
                o = r.subtract(n),
                s = new e.Ray(n, o, this._radius),
                a = s.intersectsMesh(i),
                l = a.pickedPoint;
            if (!l) return null;
            var c = a.distance / this._radius,
                h = e.Vector3.Cross(n, r).normalize(),
                u = l.normalize();
            if (c > this._centripetalForceThreshold && (u = u.negate()), c > this._centripetalForceThreshold) var f = u.x * this._strength / 8,
                d = u.y * this._updraftMultiplier,
                p = u.z * this._strength / 8;
            else var f = (h.x + u.x) / 2,
                d = this._originTop.y * this._updraftMultiplier,
                p = (h.z + u.z) / 2;
            var _ = new e.Vector3(f, d, p);
            return _ = _.multiplyByFloats(this._strength, this._strength, this._strength), {
                force: _,
                contactPoint: r
            }
        }, t.prototype._tick = function() {
            var e = this;
            this._physicsEngine.getImpostors().forEach((function(t) {
                var i = e.getImpostorForceAndContactPoint(t);
                i && t.applyForce(i.force, i.contactPoint)
            }))
        }, t.prototype._prepareCylinder = function() {
            this._cylinder || (this._cylinder = e.MeshBuilder.CreateCylinder("vortexEventCylinder", {
                height: this._height,
                diameter: 2 * this._radius
            }, this._scene), this._cylinder.isVisible = !1)
        }, t.prototype._intersectsWithCylinder = function(e) {
            var t = e.object;
            return this._prepareCylinder(), this._cylinder.position = this._cylinderPosition, this._cylinder.intersectsMesh(t, !0)
        }, t
    })();
    e.PhysicsVortexEvent = o;
    var s;
    !(function(e) {
        e[e.Constant = 0] = "Constant", e[e.Linear = 1] = "Linear"
    })(s = e.PhysicsRadialImpulseFalloff || (e.PhysicsRadialImpulseFalloff = {}));
    var a;
    !(function(e) {
        e[e.Center = 0] = "Center", e[e.Perpendicular = 1] = "Perpendicular"
    })(a = e.PhysicsUpdraftMode || (e.PhysicsUpdraftMode = {}))
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            if (void 0 === t && (t = !0), void 0 === i && (i = 10), this._useDeltaForWorldStep = t, this.name = "CannonJSPlugin", this._physicsMaterials = new Array, this._fixedTimeStep = 1 / 60, this.BJSCANNON = "undefined" != typeof CANNON ? CANNON : "undefined" != typeof require ? require("cannon") : void 0, this._minus90X = new e.Quaternion(-.7071067811865475, 0, 0, .7071067811865475), this._plus90X = new e.Quaternion(.7071067811865475, 0, 0, .7071067811865475), this._tmpPosition = e.Vector3.Zero(), this._tmpDeltaPosition = e.Vector3.Zero(), this._tmpUnityRotation = new e.Quaternion, !this.isSupported()) return void e.Tools.Error("CannonJS is not available. Please make sure you included the js file.");
            this._extendNamespace(), this.world = new this.BJSCANNON.World, this.world.broadphase = new this.BJSCANNON.NaiveBroadphase, this.world.solver.iterations = i
        }
        return t.prototype.setGravity = function(e) {
            this.world.gravity.copy(e)
        }, t.prototype.setTimeStep = function(e) {
            this._fixedTimeStep = e
        }, t.prototype.getTimeStep = function() {
            return this._fixedTimeStep
        }, t.prototype.executeStep = function(e, t) {
            this.world.step(this._fixedTimeStep, this._useDeltaForWorldStep ? e : 0, 3)
        }, t.prototype.applyImpulse = function(e, t, i) {
            var r = new this.BJSCANNON.Vec3(i.x, i.y, i.z),
                n = new this.BJSCANNON.Vec3(t.x, t.y, t.z);
            e.physicsBody.applyImpulse(n, r)
        }, t.prototype.applyForce = function(e, t, i) {
            var r = new this.BJSCANNON.Vec3(i.x, i.y, i.z),
                n = new this.BJSCANNON.Vec3(t.x, t.y, t.z);
            e.physicsBody.applyForce(n, r)
        }, t.prototype.generatePhysicsBody = function(e) {
            if (e.parent) return void(e.physicsBody && (this.removePhysicsBody(e), e.forceUpdate()));
            if (e.isBodyInitRequired()) {
                var t = this._createShape(e),
                    i = e.physicsBody;
                i && this.removePhysicsBody(e);
                var r = this._addMaterial("mat-" + e.uniqueId, e.getParam("friction"), e.getParam("restitution")),
                    n = {
                        mass: e.getParam("mass"),
                        material: r
                    },
                    o = e.getParam("nativeOptions");
                for (var s in o) o.hasOwnProperty(s) && (n[s] = o[s]);
                e.physicsBody = new this.BJSCANNON.Body(n), e.physicsBody.addEventListener("collide", e.onCollide), this.world.addEventListener("preStep", e.beforeStep), this.world.addEventListener("postStep", e.afterStep), e.physicsBody.addShape(t), this.world.add(e.physicsBody), i && ["force", "torque", "velocity", "angularVelocity"].forEach((function(t) {
                    e.physicsBody[t].copy(i[t])
                })), this._processChildMeshes(e)
            }
            this._updatePhysicsBodyTransformation(e)
        }, t.prototype._processChildMeshes = function(t) {
            var i = this,
                r = t.object.getChildMeshes ? t.object.getChildMeshes(!0) : [],
                n = t.object.rotationQuaternion;
            if (r.length) {
                var o = function(r, s) {
                    if (n && s.rotationQuaternion) {
                        var a = s.getPhysicsImpostor();
                        if (a) {
                            if (a.parent !== t) {
                                var l = s.getAbsolutePosition().subtract(t.object.getAbsolutePosition()),
                                    c = s.rotationQuaternion.multiply(e.Quaternion.Inverse(n));
                                a.physicsBody && (i.removePhysicsBody(a), a.physicsBody = null), a.parent = t, a.resetUpdateFlags(), t.physicsBody.addShape(i._createShape(a), new i.BJSCANNON.Vec3(l.x, l.y, l.z), new i.BJSCANNON.Quaternion(c.x, c.y, c.z, c.w)), t.physicsBody.mass += a.getParam("mass")
                            }
                        }
                        n.multiplyInPlace(s.rotationQuaternion), s.getChildMeshes(!0).filter((function(e) {
                            return !!e.physicsImpostor
                        })).forEach(o.bind(i, s.getAbsolutePosition()))
                    }
                };
                r.filter((function(e) {
                    return !!e.physicsImpostor
                })).forEach(o.bind(this, t.object.getAbsolutePosition()))
            }
        }, t.prototype.removePhysicsBody = function(e) {
            e.physicsBody.removeEventListener("collide", e.onCollide), this.world.removeEventListener("preStep", e.beforeStep), this.world.removeEventListener("postStep", e.afterStep), this.world.remove(e.physicsBody)
        }, t.prototype.generateJoint = function(t) {
            var i = t.mainImpostor.physicsBody,
                r = t.connectedImpostor.physicsBody;
            if (i && r) {
                var n, o = t.joint.jointData,
                    s = {
                        pivotA: o.mainPivot ? (new this.BJSCANNON.Vec3).copy(o.mainPivot) : null,
                        pivotB: o.connectedPivot ? (new this.BJSCANNON.Vec3).copy(o.connectedPivot) : null,
                        axisA: o.mainAxis ? (new this.BJSCANNON.Vec3).copy(o.mainAxis) : null,
                        axisB: o.connectedAxis ? (new this.BJSCANNON.Vec3).copy(o.connectedAxis) : null,
                        maxForce: o.nativeParams.maxForce,
                        collideConnected: !!o.collision
                    };
                switch (t.joint.type) {
                    case e.PhysicsJoint.HingeJoint:
                    case e.PhysicsJoint.Hinge2Joint:
                        n = new this.BJSCANNON.HingeConstraint(i, r, s);
                        break;
                    case e.PhysicsJoint.DistanceJoint:
                        n = new this.BJSCANNON.DistanceConstraint(i, r, o.maxDistance || 2);
                        break;
                    case e.PhysicsJoint.SpringJoint:
                        var a = o;
                        n = new this.BJSCANNON.Spring(i, r, {
                            restLength: a.length,
                            stiffness: a.stiffness,
                            damping: a.damping,
                            localAnchorA: s.pivotA,
                            localAnchorB: s.pivotB
                        });
                        break;
                    case e.PhysicsJoint.LockJoint:
                        n = new this.BJSCANNON.LockConstraint(i, r, s);
                        break;
                    case e.PhysicsJoint.PointToPointJoint:
                    case e.PhysicsJoint.BallAndSocketJoint:
                    default:
                        n = new this.BJSCANNON.PointToPointConstraint(i, s.pivotA, r, s.pivotA, s.maxForce)
                }
                n.collideConnected = !!o.collision, t.joint.physicsJoint = n, t.joint.type !== e.PhysicsJoint.SpringJoint ? this.world.addConstraint(n) : t.mainImpostor.registerAfterPhysicsStep((function() {
                    n.applyForce()
                }))
            }
        }, t.prototype.removeJoint = function(e) {
            this.world.removeConstraint(e.joint.physicsJoint)
        }, t.prototype._addMaterial = function(e, t, i) {
            var r, n;
            for (r = 0; r < this._physicsMaterials.length; r++)
                if (n = this._physicsMaterials[r], n.friction === t && n.restitution === i) return n;
            var o = new this.BJSCANNON.Material(e);
            return o.friction = t, o.restitution = i, this._physicsMaterials.push(o), o
        }, t.prototype._checkWithEpsilon = function(t) {
            return t < e.PhysicsEngine.Epsilon ? e.PhysicsEngine.Epsilon : t
        }, t.prototype._createShape = function(t) {
            var i, r = t.object,
                n = t.getObjectExtendSize();
            switch (t.type) {
                case e.PhysicsImpostor.SphereImpostor:
                    var o = n.x,
                        s = n.y,
                        a = n.z;
                    i = new this.BJSCANNON.Sphere(Math.max(this._checkWithEpsilon(o), this._checkWithEpsilon(s), this._checkWithEpsilon(a)) / 2);
                    break;
                case e.PhysicsImpostor.CylinderImpostor:
                    i = new this.BJSCANNON.Cylinder(this._checkWithEpsilon(n.x) / 2, this._checkWithEpsilon(n.x) / 2, this._checkWithEpsilon(n.y), 16);
                    break;
                case e.PhysicsImpostor.BoxImpostor:
                    var l = n.scale(.5);
                    i = new this.BJSCANNON.Box(new this.BJSCANNON.Vec3(this._checkWithEpsilon(l.x), this._checkWithEpsilon(l.y), this._checkWithEpsilon(l.z)));
                    break;
                case e.PhysicsImpostor.PlaneImpostor:
                    e.Tools.Warn("Attention, PlaneImposter might not behave as you expect. Consider using BoxImposter instead"), i = new this.BJSCANNON.Plane;
                    break;
                case e.PhysicsImpostor.MeshImpostor:
                    var c = r.getVerticesData ? r.getVerticesData(e.VertexBuffer.PositionKind) : [],
                        h = r.getIndices ? r.getIndices() : [];
                    if (!c) return;
                    var u = r.position.clone(),
                        f = r.rotation && r.rotation.clone(),
                        d = r.rotationQuaternion && r.rotationQuaternion.clone();
                    r.position.copyFromFloats(0, 0, 0), r.rotation && r.rotation.copyFromFloats(0, 0, 0), r.rotationQuaternion && r.rotationQuaternion.copyFrom(t.getParentsRotation()), r.rotationQuaternion && r.parent && r.rotationQuaternion.conjugateInPlace();
                    var p, _ = r.computeWorldMatrix(!0),
                        m = new Array;
                    for (p = 0; p < c.length; p += 3) e.Vector3.TransformCoordinates(e.Vector3.FromArray(c, p), _).toArray(m, p);
                    e.Tools.Warn("MeshImpostor only collides against spheres."), i = new this.BJSCANNON.Trimesh(m, h), r.position.copyFrom(u), f && r.rotation && r.rotation.copyFrom(f), d && r.rotationQuaternion && r.rotationQuaternion.copyFrom(d);
                    break;
                case e.PhysicsImpostor.HeightmapImpostor:
                    var g = r.position.clone(),
                        v = r.rotation && r.rotation.clone(),
                        y = r.rotationQuaternion && r.rotationQuaternion.clone();
                    r.position.copyFromFloats(0, 0, 0), r.rotation && r.rotation.copyFromFloats(0, 0, 0), r.rotationQuaternion && r.rotationQuaternion.copyFrom(t.getParentsRotation()), r.rotationQuaternion && r.parent && r.rotationQuaternion.conjugateInPlace(), r.rotationQuaternion && r.rotationQuaternion.multiplyInPlace(this._minus90X), i = this._createHeightmap(r), r.position.copyFrom(g), v && r.rotation && r.rotation.copyFrom(v), y && r.rotationQuaternion && r.rotationQuaternion.copyFrom(y), r.computeWorldMatrix(!0);
                    break;
                case e.PhysicsImpostor.ParticleImpostor:
                    i = new this.BJSCANNON.Particle
            }
            return i
        }, t.prototype._createHeightmap = function(t, i) {
            var r, n = t.getVerticesData(e.VertexBuffer.PositionKind),
                o = t.computeWorldMatrix(!0),
                s = new Array;
            for (r = 0; r < n.length; r += 3) e.Vector3.TransformCoordinates(e.Vector3.FromArray(n, r), o).toArray(s, r);
            n = s;
            for (var a = new Array, l = i || ~~(Math.sqrt(n.length / 3) - 1), c = t.getBoundingInfo(), h = Math.min(c.boundingBox.extendSizeWorld.x, c.boundingBox.extendSizeWorld.y), u = c.boundingBox.extendSizeWorld.z, f = 2 * h / l, d = 0; d < n.length; d += 3) {
                var p = Math.round(n[d + 0] / f + l / 2),
                    _ = Math.round(-1 * (n[d + 1] / f - l / 2)),
                    m = -n[d + 2] + u;
                a[p] || (a[p] = []), a[p][_] || (a[p][_] = m), a[p][_] = Math.max(m, a[p][_])
            }
            for (var p = 0; p <= l; ++p) {
                if (!a[p]) {
                    for (var g = 1; !a[(p + g) % l];) g++;
                    a[p] = a[(p + g) % l].slice()
                }
                for (var _ = 0; _ <= l; ++_)
                    if (!a[p][_]) {
                        for (var v, g = 1; void 0 === v;) v = a[p][(_ + g++) % l];
                        a[p][_] = v
                    }
            }
            var y = new this.BJSCANNON.Heightfield(a, {
                elementSize: f
            });
            return y.minY = u, y
        }, t.prototype._updatePhysicsBodyTransformation = function(t) {
            var i = t.object;
            if (i.computeWorldMatrix && i.computeWorldMatrix(!0), i.getBoundingInfo()) {
                var r = t.getObjectCenter();
                this._tmpDeltaPosition.copyFrom(i.getAbsolutePivotPoint().subtract(r)), this._tmpDeltaPosition.divideInPlace(t.object.scaling), this._tmpPosition.copyFrom(r);
                var n = i.rotationQuaternion;
                if (n) {
                    if (t.type !== e.PhysicsImpostor.PlaneImpostor && t.type !== e.PhysicsImpostor.HeightmapImpostor && t.type !== e.PhysicsImpostor.CylinderImpostor || (n = n.multiply(this._minus90X), t.setDeltaRotation(this._plus90X)), t.type === e.PhysicsImpostor.HeightmapImpostor) {
                        var o = i,
                            s = o.getBoundingInfo(),
                            a = o.rotationQuaternion;
                        o.rotationQuaternion = this._tmpUnityRotation, o.computeWorldMatrix(!0);
                        var l = r.clone(),
                            c = o.getPivotMatrix() || e.Matrix.Translation(0, 0, 0),
                            h = e.Matrix.Translation(s.boundingBox.extendSizeWorld.x, 0, -s.boundingBox.extendSizeWorld.z);
                        o.setPreTransformMatrix(h), o.computeWorldMatrix(!0);
                        var u = s.boundingBox.centerWorld.subtract(r).subtract(o.position).negate();
                        this._tmpPosition.copyFromFloats(u.x, u.y - s.boundingBox.extendSizeWorld.y, u.z), this._tmpDeltaPosition.copyFrom(s.boundingBox.centerWorld.subtract(l)), this._tmpDeltaPosition.y += s.boundingBox.extendSizeWorld.y, o.rotationQuaternion = a, o.setPreTransformMatrix(c), o.computeWorldMatrix(!0)
                    } else t.type === e.PhysicsImpostor.MeshImpostor && this._tmpDeltaPosition.copyFromFloats(0, 0, 0);
                    t.setDeltaPosition(this._tmpDeltaPosition), t.physicsBody.position.copy(this._tmpPosition), t.physicsBody.quaternion.copy(n)
                }
            }
        }, t.prototype.setTransformationFromPhysicsBody = function(e) {
            e.object.position.copyFrom(e.physicsBody.position), e.object.rotationQuaternion && e.object.rotationQuaternion.copyFrom(e.physicsBody.quaternion)
        }, t.prototype.setPhysicsBodyTransformation = function(e, t, i) {
            e.physicsBody.position.copy(t), e.physicsBody.quaternion.copy(i)
        }, t.prototype.isSupported = function() {
            return void 0 !== this.BJSCANNON
        }, t.prototype.setLinearVelocity = function(e, t) {
            e.physicsBody.velocity.copy(t)
        }, t.prototype.setAngularVelocity = function(e, t) {
            e.physicsBody.angularVelocity.copy(t)
        }, t.prototype.getLinearVelocity = function(t) {
            var i = t.physicsBody.velocity;
            return i ? new e.Vector3(i.x, i.y, i.z) : null
        }, t.prototype.getAngularVelocity = function(t) {
            var i = t.physicsBody.angularVelocity;
            return i ? new e.Vector3(i.x, i.y, i.z) : null
        }, t.prototype.setBodyMass = function(e, t) {
            e.physicsBody.mass = t, e.physicsBody.updateMassProperties()
        }, t.prototype.getBodyMass = function(e) {
            return e.physicsBody.mass
        }, t.prototype.getBodyFriction = function(e) {
            return e.physicsBody.material.friction
        }, t.prototype.setBodyFriction = function(e, t) {
            e.physicsBody.material.friction = t
        }, t.prototype.getBodyRestitution = function(e) {
            return e.physicsBody.material.restitution
        }, t.prototype.setBodyRestitution = function(e, t) {
            e.physicsBody.material.restitution = t
        }, t.prototype.sleepBody = function(e) {
            e.physicsBody.sleep()
        }, t.prototype.wakeUpBody = function(e) {
            e.physicsBody.wakeUp()
        }, t.prototype.updateDistanceJoint = function(e, t, i) {
            e.physicsJoint.distance = t
        }, t.prototype.setMotor = function(e, t, i, r) {
            r || (e.physicsJoint.enableMotor(), e.physicsJoint.setMotorSpeed(t), i && this.setLimit(e, i))
        }, t.prototype.setLimit = function(e, t, i) {
            e.physicsJoint.motorEquation.maxForce = t, e.physicsJoint.motorEquation.minForce = void 0 === i ? -t : i
        }, t.prototype.syncMeshWithImpostor = function(e, t) {
            var i = t.physicsBody;
            e.position.x = i.position.x, e.position.y = i.position.y, e.position.z = i.position.z, e.rotationQuaternion && (e.rotationQuaternion.x = i.quaternion.x, e.rotationQuaternion.y = i.quaternion.y, e.rotationQuaternion.z = i.quaternion.z, e.rotationQuaternion.w = i.quaternion.w)
        }, t.prototype.getRadius = function(e) {
            return e.physicsBody.shapes[0].boundingSphereRadius
        }, t.prototype.getBoxSizeToRef = function(e, t) {
            var i = e.physicsBody.shapes[0];
            t.x = 2 * i.halfExtents.x, t.y = 2 * i.halfExtents.y, t.z = 2 * i.halfExtents.z
        }, t.prototype.dispose = function() {}, t.prototype._extendNamespace = function() {
            var e = new this.BJSCANNON.Vec3,
                t = this.BJSCANNON;
            this.BJSCANNON.World.prototype.step = function(i, r, n) {
                if (n = n || 10, 0 === (r = r || 0)) this.internalStep(i), this.time += i;
                else {
                    var o = Math.floor((this.time + r) / i) - Math.floor(this.time / i);
                    o = Math.min(o, n) || 1;
                    for (var s = performance.now(), a = 0; a !== o && (this.internalStep(i), !(performance.now() - s > 1e3 * i)); a++);
                    this.time += r;
                    for (var l = this.time % i, c = l / i, h = e, u = this.bodies, f = 0; f !== u.length; f++) {
                        var d = u[f];
                        d.type !== t.Body.STATIC && d.sleepState !== t.Body.SLEEPING ? (d.position.vsub(d.previousPosition, h), h.scale(c, h), d.position.vadd(h, d.interpolatedPosition)) : (d.interpolatedPosition.copy(d.position), d.interpolatedQuaternion.copy(d.quaternion))
                    }
                }
            }
        }, t
    })();
    e.CannonJSPlugin = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            this.name = "OimoJSPlugin", this._tmpImpostorsArray = [], this._tmpPositionVector = e.Vector3.Zero(), this.BJSOIMO = "undefined" != typeof OIMO ? OIMO : "undefined" != typeof require ? require("./Oimo") : void 0, this.world = new this.BJSOIMO.World(1 / 60, 2, t, !0), this.world.worldscale(1), this.world.clear(), this.world.isNoStat = !0
        }
        return t.prototype.setGravity = function(e) {
            this.world.gravity.copy(e)
        }, t.prototype.setTimeStep = function(e) {
            this.world.timeStep = e
        }, t.prototype.getTimeStep = function() {
            return this.world.timeStep
        }, t.prototype.executeStep = function(e, t) {
            var i = this;
            t.forEach((function(e) {
                e.beforeStep()
            })), this.world.step(), t.forEach((function(e) {
                e.afterStep(), i._tmpImpostorsArray[e.uniqueId] = e
            }));
            for (var r = this.world.contacts; null !== r;)
                if (!r.touching || r.body1.sleeping || r.body2.sleeping) {
                    var n = this._tmpImpostorsArray[+r.body1.name],
                        o = this._tmpImpostorsArray[+r.body2.name];
                    n && o ? (n.onCollide({
                        body: o.physicsBody
                    }), o.onCollide({
                        body: n.physicsBody
                    }), r = r.next) : r = r.next
                } else r = r.next
        }, t.prototype.applyImpulse = function(e, t, i) {
            var r = e.physicsBody.massInfo.mass;
            e.physicsBody.applyImpulse(i.scale(this.BJSOIMO.INV_SCALE), t.scale(this.BJSOIMO.INV_SCALE * r))
        }, t.prototype.applyForce = function(t, i, r) {
            e.Tools.Warn("Oimo doesn't support applying force. Using impule instead."), this.applyImpulse(t, i, r)
        }, t.prototype.generatePhysicsBody = function(t) {
            var i = this;
            if (t.parent) return void(t.physicsBody && (this.removePhysicsBody(t), t.forceUpdate()));
            if (t.isBodyInitRequired()) {
                var r = {
                        name: t.uniqueId,
                        config: [t.getParam("mass") || 1, t.getParam("friction"), t.getParam("restitution")],
                        size: [],
                        type: [],
                        pos: [],
                        rot: [],
                        move: 0 !== t.getParam("mass"),
                        world: this.world
                    },
                    n = [t];
                !(function(e) {
                    e.getChildMeshes && e.getChildMeshes().forEach((function(e) {
                        e.physicsImpostor && n.push(e.physicsImpostor)
                    }))
                })(t.object);
                var o = function(t) {
                    return Math.max(t, e.PhysicsEngine.Epsilon)
                };
                n.forEach((function(n) {
                    if (t.object.rotationQuaternion) {
                        var s = n.object.rotationQuaternion,
                            a = (new i.BJSOIMO.Euler).setFromQuaternion({
                                x: t.object.rotationQuaternion.x,
                                y: t.object.rotationQuaternion.y,
                                z: t.object.rotationQuaternion.z,
                                s: t.object.rotationQuaternion.w
                            }),
                            l = n.getObjectExtendSize();
                        if (n === t) {
                            var c = t.getObjectCenter();
                            t.object.getAbsolutePivotPoint().subtractToRef(c, i._tmpPositionVector), i._tmpPositionVector.divideInPlace(t.object.scaling), r.pos.push(c.x), r.pos.push(c.y), r.pos.push(c.z), r.rot.push(a.x / (i.BJSOIMO.degtorad || i.BJSOIMO.TO_RAD)), r.rot.push(a.y / (i.BJSOIMO.degtorad || i.BJSOIMO.TO_RAD)), r.rot.push(a.z / (i.BJSOIMO.degtorad || i.BJSOIMO.TO_RAD))
                        } else {
                            var h = n.object.getAbsolutePosition().subtract(t.object.getAbsolutePosition());
                            r.pos.push(h.x), r.pos.push(h.y), r.pos.push(h.z), r.rot.push(0), r.rot.push(0), r.rot.push(0)
                        }
                        switch (n.type) {
                            case e.PhysicsImpostor.ParticleImpostor:
                                e.Tools.Warn("No Particle support in this.BJSOIMO.js. using SphereImpostor instead");
                            case e.PhysicsImpostor.SphereImpostor:
                                var u = l.x,
                                    f = l.y,
                                    d = l.z,
                                    p = Math.max(o(u), o(f), o(d)) / 2;
                                r.type.push("sphere"), r.size.push(p), r.size.push(p), r.size.push(p);
                                break;
                            case e.PhysicsImpostor.CylinderImpostor:
                                var _ = o(l.x) / 2,
                                    m = o(l.y);
                                r.type.push("cylinder"), r.size.push(_), r.size.push(m), r.size.push(m);
                                break;
                            case e.PhysicsImpostor.PlaneImpostor:
                            case e.PhysicsImpostor.BoxImpostor:
                            default:
                                var _ = o(l.x),
                                    m = o(l.y),
                                    g = o(l.z);
                                r.type.push("box"), r.size.push(_), r.size.push(m), r.size.push(g)
                        }
                        n.object.rotationQuaternion = s
                    }
                })), t.physicsBody = new this.BJSOIMO.Body(r).body
            } else this._tmpPositionVector.copyFromFloats(0, 0, 0);
            t.setDeltaPosition(this._tmpPositionVector)
        }, t.prototype.removePhysicsBody = function(e) {
            this.world.removeRigidBody(e.physicsBody)
        }, t.prototype.generateJoint = function(t) {
            var i = t.mainImpostor.physicsBody,
                r = t.connectedImpostor.physicsBody;
            if (i && r) {
                var n, o = t.joint.jointData,
                    s = o.nativeParams || {},
                    a = {
                        body1: i,
                        body2: r,
                        axe1: s.axe1 || (o.mainAxis ? o.mainAxis.asArray() : null),
                        axe2: s.axe2 || (o.connectedAxis ? o.connectedAxis.asArray() : null),
                        pos1: s.pos1 || (o.mainPivot ? o.mainPivot.asArray() : null),
                        pos2: s.pos2 || (o.connectedPivot ? o.connectedPivot.asArray() : null),
                        min: s.min,
                        max: s.max,
                        collision: s.collision || o.collision,
                        spring: s.spring,
                        world: this.world
                    };
                switch (t.joint.type) {
                    case e.PhysicsJoint.BallAndSocketJoint:
                        n = "jointBall";
                        break;
                    case e.PhysicsJoint.SpringJoint:
                        e.Tools.Warn("this.BJSOIMO.js doesn't support Spring Constraint. Simulating using DistanceJoint instead");
                        var l = o;
                        a.min = l.length || a.min, a.max = Math.max(a.min, a.max);
                    case e.PhysicsJoint.DistanceJoint:
                        n = "jointDistance", a.max = o.maxDistance;
                        break;
                    case e.PhysicsJoint.PrismaticJoint:
                        n = "jointPrisme";
                        break;
                    case e.PhysicsJoint.SliderJoint:
                        n = "jointSlide";
                        break;
                    case e.PhysicsJoint.WheelJoint:
                        n = "jointWheel";
                        break;
                    case e.PhysicsJoint.HingeJoint:
                    default:
                        n = "jointHinge"
                }
                a.type = n, t.joint.physicsJoint = new this.BJSOIMO.Link(a).joint
            }
        }, t.prototype.removeJoint = function(t) {
            try {
                this.world.removeJoint(t.joint.physicsJoint)
            } catch (t) {
                e.Tools.Warn(t)
            }
        }, t.prototype.isSupported = function() {
            return void 0 !== this.BJSOIMO
        }, t.prototype.setTransformationFromPhysicsBody = function(e) {
            if (!e.physicsBody.sleeping) {
                if (e.physicsBody.shapes.next) {
                    var t = this._getLastShape(e.physicsBody);
                    e.object.position.x = t.position.x * this.BJSOIMO.WORLD_SCALE, e.object.position.y = t.position.y * this.BJSOIMO.WORLD_SCALE, e.object.position.z = t.position.z * this.BJSOIMO.WORLD_SCALE
                } else e.object.position.copyFrom(e.physicsBody.getPosition());
                e.object.rotationQuaternion && (e.object.rotationQuaternion.copyFrom(e.physicsBody.getQuaternion()), e.object.rotationQuaternion.normalize())
            }
        }, t.prototype.setPhysicsBodyTransformation = function(e, t, i) {
            var r = e.physicsBody;
            r.position.init(t.x * this.BJSOIMO.INV_SCALE, t.y * this.BJSOIMO.INV_SCALE, t.z * this.BJSOIMO.INV_SCALE), r.orientation.init(i.w, i.x, i.y, i.z), r.syncShapes(), r.awake()
        }, t.prototype._getLastShape = function(e) {
            for (var t = e.shapes; t.next;) t = t.next;
            return t
        }, t.prototype.setLinearVelocity = function(e, t) {
            e.physicsBody.linearVelocity.init(t.x, t.y, t.z)
        }, t.prototype.setAngularVelocity = function(e, t) {
            e.physicsBody.angularVelocity.init(t.x, t.y, t.z)
        }, t.prototype.getLinearVelocity = function(t) {
            var i = t.physicsBody.linearVelocity;
            return i ? new e.Vector3(i.x, i.y, i.z) : null
        }, t.prototype.getAngularVelocity = function(t) {
            var i = t.physicsBody.angularVelocity;
            return i ? new e.Vector3(i.x, i.y, i.z) : null
        }, t.prototype.setBodyMass = function(e, t) {
            var i = 0 === t;
            e.physicsBody.shapes.density = i ? 1 : t, e.physicsBody.setupMass(i ? 2 : 1)
        }, t.prototype.getBodyMass = function(e) {
            return e.physicsBody.shapes.density
        }, t.prototype.getBodyFriction = function(e) {
            return e.physicsBody.shapes.friction
        }, t.prototype.setBodyFriction = function(e, t) {
            e.physicsBody.shapes.friction = t
        }, t.prototype.getBodyRestitution = function(e) {
            return e.physicsBody.shapes.restitution
        }, t.prototype.setBodyRestitution = function(e, t) {
            e.physicsBody.shapes.restitution = t
        }, t.prototype.sleepBody = function(e) {
            e.physicsBody.sleep()
        }, t.prototype.wakeUpBody = function(e) {
            e.physicsBody.awake()
        }, t.prototype.updateDistanceJoint = function(e, t, i) {
            e.physicsJoint.limitMotor.upperLimit = t, void 0 !== i && (e.physicsJoint.limitMotor.lowerLimit = i)
        }, t.prototype.setMotor = function(e, t, i, r) {
            var n = r ? e.physicsJoint.rotationalLimitMotor2 : e.physicsJoint.rotationalLimitMotor1 || e.physicsJoint.rotationalLimitMotor || e.physicsJoint.limitMotor;
            n && n.setMotor(t, i)
        }, t.prototype.setLimit = function(e, t, i, r) {
            var n = r ? e.physicsJoint.rotationalLimitMotor2 : e.physicsJoint.rotationalLimitMotor1 || e.physicsJoint.rotationalLimitMotor || e.physicsJoint.limitMotor;
            n && n.setLimit(t, void 0 === i ? -t : i)
        }, t.prototype.syncMeshWithImpostor = function(e, t) {
            var i = t.physicsBody;
            e.position.x = i.position.x, e.position.y = i.position.y, e.position.z = i.position.z, e.rotationQuaternion && (e.rotationQuaternion.x = i.orientation.x, e.rotationQuaternion.y = i.orientation.y, e.rotationQuaternion.z = i.orientation.z, e.rotationQuaternion.w = i.orientation.s)
        }, t.prototype.getRadius = function(e) {
            return e.physicsBody.shapes.radius
        }, t.prototype.getBoxSizeToRef = function(e, t) {
            var i = e.physicsBody.shapes;
            t.x = 2 * i.halfWidth, t.y = 2 * i.halfHeight, t.z = 2 * i.halfDepth
        }, t.prototype.dispose = function() {
            this.world.clear()
        }, t
    })();
    e.OimoJSPlugin = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.GetTGAHeader = function(e) {
            var t = 0;
            return {
                id_length: e[t++],
                colormap_type: e[t++],
                image_type: e[t++],
                colormap_index: e[t++] | e[t++] << 8,
                colormap_length: e[t++] | e[t++] << 8,
                colormap_size: e[t++],
                origin: [e[t++] | e[t++] << 8, e[t++] | e[t++] << 8],
                width: e[t++] | e[t++] << 8,
                height: e[t++] | e[t++] << 8,
                pixel_size: e[t++],
                flags: e[t++]
            }
        }, t.UploadContent = function(i, r) {
            if (r.length < 19) return void e.Tools.Error("Unable to load TGA file - Not enough data to contain header");
            var n = 18,
                o = t.GetTGAHeader(r);
            if (o.id_length + n > r.length) return void e.Tools.Error("Unable to load TGA file - Not enough data");
            n += o.id_length;
            var s = !1,
                a = !1,
                l = !1;
            switch (o.image_type) {
                case t._TYPE_RLE_INDEXED:
                    s = !0;
                case t._TYPE_INDEXED:
                    a = !0;
                    break;
                case t._TYPE_RLE_RGB:
                    s = !0;
                case t._TYPE_RGB:
                    break;
                case t._TYPE_RLE_GREY:
                    s = !0;
                case t._TYPE_GREY:
                    l = !0
            }
            var c, h, u = o.pixel_size >> 3,
                f = o.width * o.height * u;
            if (a && (h = r.subarray(n, n += o.colormap_length * (o.colormap_size >> 3))), s) {
                c = new Uint8Array(f);
                for (var d, p, _, m = 0, g = new Uint8Array(u); n < f && m < f;)
                    if (d = r[n++], p = 1 + (127 & d), 128 & d) {
                        for (_ = 0; _ < u; ++_) g[_] = r[n++];
                        for (_ = 0; _ < p; ++_) c.set(g, m + _ * u);
                        m += u * p
                    } else {
                        for (p *= u, _ = 0; _ < p; ++_) c[m + _] = r[n++];
                        m += p
                    }
            } else c = r.subarray(n, n += a ? o.width * o.height : f);
            var v, y, b, x, T, E;
            switch ((o.flags & t._ORIGIN_MASK) >> t._ORIGIN_SHIFT) {
                default:
                    case t._ORIGIN_UL:
                    v = 0,
                b = 1,
                E = o.width,
                y = 0,
                x = 1,
                T = o.height;
                break;
                case t._ORIGIN_BL:
                        v = 0,
                    b = 1,
                    E = o.width,
                    y = o.height - 1,
                    x = -1,
                    T = -1;
                    break;
                case t._ORIGIN_UR:
                        v = o.width - 1,
                    b = -1,
                    E = -1,
                    y = 0,
                    x = 1,
                    T = o.height;
                    break;
                case t._ORIGIN_BR:
                        v = o.width - 1,
                    b = -1,
                    E = -1,
                    y = o.height - 1,
                    x = -1,
                    T = -1
            }
            var A = "_getImageData" + (l ? "Grey" : "") + o.pixel_size + "bits",
                P = t[A](o, h, c, y, x, T, v, b, E);
            i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, o.width, o.height, 0, i.RGBA, i.UNSIGNED_BYTE, P)
        }, t._getImageData8bits = function(e, t, i, r, n, o, s, a, l) {
            var c, h, u, f = i,
                d = t,
                p = e.width,
                _ = e.height,
                m = 0,
                g = new Uint8Array(p * _ * 4);
            for (u = r; u !== o; u += n)
                for (h = s; h !== l; h += a, m++) c = f[m], g[4 * (h + p * u) + 3] = 255, g[4 * (h + p * u) + 2] = d[3 * c + 0], g[4 * (h + p * u) + 1] = d[3 * c + 1], g[4 * (h + p * u) + 0] = d[3 * c + 2];
            return g
        }, t._getImageData16bits = function(e, t, i, r, n, o, s, a, l) {
            var c, h, u, f = i,
                d = e.width,
                p = e.height,
                _ = 0,
                m = new Uint8Array(d * p * 4);
            for (u = r; u !== o; u += n)
                for (h = s; h !== l; h += a, _ += 2) c = f[_ + 0] + (f[_ + 1] << 8), m[4 * (h + d * u) + 0] = (31744 & c) >> 7, m[4 * (h + d * u) + 1] = (992 & c) >> 2, m[4 * (h + d * u) + 2] = (31 & c) >> 3, m[4 * (h + d * u) + 3] = 32768 & c ? 0 : 255;
            return m
        }, t._getImageData24bits = function(e, t, i, r, n, o, s, a, l) {
            var c, h, u = i,
                f = e.width,
                d = e.height,
                p = 0,
                _ = new Uint8Array(f * d * 4);
            for (h = r; h !== o; h += n)
                for (c = s; c !== l; c += a, p += 3) _[4 * (c + f * h) + 3] = 255, _[4 * (c + f * h) + 2] = u[p + 0], _[4 * (c + f * h) + 1] = u[p + 1], _[4 * (c + f * h) + 0] = u[p + 2];
            return _
        }, t._getImageData32bits = function(e, t, i, r, n, o, s, a, l) {
            var c, h, u = i,
                f = e.width,
                d = e.height,
                p = 0,
                _ = new Uint8Array(f * d * 4);
            for (h = r; h !== o; h += n)
                for (c = s; c !== l; c += a, p += 4) _[4 * (c + f * h) + 2] = u[p + 0], _[4 * (c + f * h) + 1] = u[p + 1], _[4 * (c + f * h) + 0] = u[p + 2], _[4 * (c + f * h) + 3] = u[p + 3];
            return _
        }, t._getImageDataGrey8bits = function(e, t, i, r, n, o, s, a, l) {
            var c, h, u, f = i,
                d = e.width,
                p = e.height,
                _ = 0,
                m = new Uint8Array(d * p * 4);
            for (u = r; u !== o; u += n)
                for (h = s; h !== l; h += a, _++) c = f[_], m[4 * (h + d * u) + 0] = c, m[4 * (h + d * u) + 1] = c, m[4 * (h + d * u) + 2] = c, m[4 * (h + d * u) + 3] = 255;
            return m
        }, t._getImageDataGrey16bits = function(e, t, i, r, n, o, s, a, l) {
            var c, h, u = i,
                f = e.width,
                d = e.height,
                p = 0,
                _ = new Uint8Array(f * d * 4);
            for (h = r; h !== o; h += n)
                for (c = s; c !== l; c += a, p += 2) _[4 * (c + f * h) + 0] = u[p + 0], _[4 * (c + f * h) + 1] = u[p + 0], _[4 * (c + f * h) + 2] = u[p + 0], _[4 * (c + f * h) + 3] = u[p + 1];
            return _
        }, t._TYPE_INDEXED = 1, t._TYPE_RGB = 2, t._TYPE_GREY = 3, t._TYPE_RLE_INDEXED = 9, t._TYPE_RLE_RGB = 10, t._TYPE_RLE_GREY = 11, t._ORIGIN_MASK = 48, t._ORIGIN_SHIFT = 4, t._ORIGIN_BL = 0, t._ORIGIN_BR = 1, t._ORIGIN_UL = 2, t._ORIGIN_UR = 3, t
    })();
    e.TGATools = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    function t(e) {
        return e.charCodeAt(0) + (e.charCodeAt(1) << 8) + (e.charCodeAt(2) << 16) + (e.charCodeAt(3) << 24)
    }

    function i(e) {
        return String.fromCharCode(255 & e, e >> 8 & 255, e >> 16 & 255, e >> 24 & 255)
    }
    var r = t("DXT1"),
        n = t("DXT3"),
        o = t("DXT5"),
        s = t("DX10"),
        a = (function() {
            function t() {}
            return t.GetDDSInfo = function(t) {
                var i = new Int32Array(t, 0, 31),
                    a = new Int32Array(t, 0, 35),
                    l = 1;
                131072 & i[2] && (l = Math.max(1, i[7]));
                var c = i[21],
                    h = c === s ? a[32] : 0,
                    u = e.Engine.TEXTURETYPE_UNSIGNED_INT;
                switch (c) {
                    case 113:
                        u = e.Engine.TEXTURETYPE_HALF_FLOAT;
                        break;
                    case 116:
                        u = e.Engine.TEXTURETYPE_FLOAT;
                        break;
                    case s:
                        if (10 === h) {
                            u = e.Engine.TEXTURETYPE_HALF_FLOAT;
                            break
                        }
                }
                return {
                    width: i[4],
                    height: i[3],
                    mipmapCount: l,
                    isFourCC: 4 == (4 & i[20]),
                    isRGB: 64 == (64 & i[20]),
                    isLuminance: 131072 == (131072 & i[20]),
                    isCube: 512 == (512 & i[28]),
                    isCompressed: c === r || c === n || c === o,
                    dxgiFormat: h,
                    textureType: u
                }
            }, t._ToHalfFloat = function(e) {
                t._FloatView || (t._FloatView = new Float32Array(1), t._Int32View = new Int32Array(t._FloatView.buffer)), t._FloatView[0] = e;
                var i = t._Int32View[0],
                    r = i >> 16 & 32768,
                    n = i >> 12 & 2047,
                    o = i >> 23 & 255;
                return o < 103 ? r : o > 142 ? (r |= 31744, r |= (255 == o ? 0 : 1) && 8388607 & i) : o < 113 ? (n |= 2048, r |= (n >> 114 - o) + (n >> 113 - o & 1)) : (r |= o - 112 << 10 | n >> 1, r += 1 & n)
            }, t._FromHalfFloat = function(e) {
                var t = (32768 & e) >> 15,
                    i = (31744 & e) >> 10,
                    r = 1023 & e;
                return 0 === i ? (t ? -1 : 1) * Math.pow(2, -14) * (r / Math.pow(2, 10)) : 31 == i ? r ? NaN : 1 / 0 * (t ? -1 : 1) : (t ? -1 : 1) * Math.pow(2, i - 15) * (1 + r / Math.pow(2, 10))
            }, t._GetHalfFloatAsFloatRGBAArrayBuffer = function(e, i, r, n, o, s) {
                for (var a = new Float32Array(n), l = new Uint16Array(o, r), c = 0, h = 0; h < i; h++)
                    for (var u = 0; u < e; u++) {
                        var f = 4 * (u + h * e);
                        a[c] = t._FromHalfFloat(l[f]), a[c + 1] = t._FromHalfFloat(l[f + 1]), a[c + 2] = t._FromHalfFloat(l[f + 2]), t.StoreLODInAlphaChannel ? a[c + 3] = s : a[c + 3] = t._FromHalfFloat(l[f + 3]), c += 4
                    }
                return a
            }, t._GetHalfFloatRGBAArrayBuffer = function(e, i, r, n, o, s) {
                if (t.StoreLODInAlphaChannel) {
                    for (var a = new Uint16Array(n), l = new Uint16Array(o, r), c = 0, h = 0; h < i; h++)
                        for (var u = 0; u < e; u++) {
                            var f = 4 * (u + h * e);
                            a[c] = l[f], a[c + 1] = l[f + 1], a[c + 2] = l[f + 2], a[c + 3] = t._ToHalfFloat(s), c += 4
                        }
                    return a
                }
                return new Uint16Array(o, r, n)
            }, t._GetFloatRGBAArrayBuffer = function(e, i, r, n, o, s) {
                if (t.StoreLODInAlphaChannel) {
                    for (var a = new Float32Array(n), l = new Float32Array(o, r), c = 0, h = 0; h < i; h++)
                        for (var u = 0; u < e; u++) {
                            var f = 4 * (u + h * e);
                            a[c] = l[f], a[c + 1] = l[f + 1], a[c + 2] = l[f + 2], a[c + 3] = s, c += 4
                        }
                    return a
                }
                return new Float32Array(o, r, n)
            }, t._GetFloatAsUIntRGBAArrayBuffer = function(i, r, n, o, s, a) {
                for (var l = new Uint8Array(o), c = new Float32Array(s, n), h = 0, u = 0; u < r; u++)
                    for (var f = 0; f < i; f++) {
                        var d = 4 * (f + u * i);
                        l[h] = 255 * e.Scalar.Clamp(c[d]), l[h + 1] = 255 * e.Scalar.Clamp(c[d + 1]), l[h + 2] = 255 * e.Scalar.Clamp(c[d + 2]), t.StoreLODInAlphaChannel ? l[h + 3] = a : l[h + 3] = 255 * e.Scalar.Clamp(c[d + 3]), h += 4
                    }
                return l
            }, t._GetHalfFloatAsUIntRGBAArrayBuffer = function(i, r, n, o, s, a) {
                for (var l = new Uint8Array(o), c = new Uint16Array(s, n), h = 0, u = 0; u < r; u++)
                    for (var f = 0; f < i; f++) {
                        var d = 4 * (f + u * i);
                        l[h] = 255 * e.Scalar.Clamp(t._FromHalfFloat(c[d])), l[h + 1] = 255 * e.Scalar.Clamp(t._FromHalfFloat(c[d + 1])), l[h + 2] = 255 * e.Scalar.Clamp(t._FromHalfFloat(c[d + 2])), t.StoreLODInAlphaChannel ? l[h + 3] = a : l[h + 3] = 255 * e.Scalar.Clamp(t._FromHalfFloat(c[d + 3])), h += 4
                    }
                return l
            }, t._GetRGBAArrayBuffer = function(e, t, i, r, n, o, s, a, l) {
                for (var c = new Uint8Array(r), h = new Uint8Array(n, i), u = 0, f = 0; f < t; f++)
                    for (var d = 0; d < e; d++) {
                        var p = 4 * (d + f * e);
                        c[u] = h[p + o], c[u + 1] = h[p + s], c[u + 2] = h[p + a], c[u + 3] = h[p + l], u += 4
                    }
                return c
            }, t._ExtractLongWordOrder = function(e) {
                return 0 === e || 255 === e || -16777216 === e ? 0 : 1 + t._ExtractLongWordOrder(e >> 8)
            }, t._GetRGBArrayBuffer = function(e, t, i, r, n, o, s, a) {
                for (var l = new Uint8Array(r), c = new Uint8Array(n, i), h = 0, u = 0; u < t; u++)
                    for (var f = 0; f < e; f++) {
                        var d = 3 * (f + u * e);
                        l[h] = c[d + o], l[h + 1] = c[d + s], l[h + 2] = c[d + a], h += 3
                    }
                return l
            }, t._GetLuminanceArrayBuffer = function(e, t, i, r, n) {
                for (var o = new Uint8Array(r), s = new Uint8Array(n, i), a = 0, l = 0; l < t; l++)
                    for (var c = 0; c < e; c++) {
                        var h = c + l * e;
                        o[a] = s[h], a++
                    }
                return o
            }, t.UploadDDSLevels = function(a, l, c, h, u, f, d, p) {
                void 0 === d && (d = -1);
                var _, m, g, v, y, b, x, T = a.getCaps().s3tc,
                    E = new Int32Array(c, 0, 31),
                    A = 0,
                    P = 0,
                    M = 0,
                    S = 1;
                if (542327876 !== E[0]) return void e.Tools.Error("Invalid magic number in DDS header");
                if (!h.isFourCC && !h.isRGB && !h.isLuminance) return void e.Tools.Error("Unsupported format, must contain a FourCC, RGB or LUMINANCE code");
                if (h.isCompressed && !T) return void e.Tools.Error("Compressed textures are not supported on this platform.");
                var C = E[22];
                v = E[1] + 4;
                var R = !1;
                if (h.isFourCC) switch (_ = E[21]) {
                    case r:
                        S = 8, P = T.COMPRESSED_RGBA_S3TC_DXT1_EXT;
                        break;
                    case n:
                        S = 16, P = T.COMPRESSED_RGBA_S3TC_DXT3_EXT;
                        break;
                    case o:
                        S = 16, P = T.COMPRESSED_RGBA_S3TC_DXT5_EXT;
                        break;
                    case 113:
                    case 116:
                        R = !0;
                        break;
                    case s:
                        v += 20;
                        var O = !1;
                        switch (h.dxgiFormat) {
                            case 10:
                                R = !0, O = !0;
                                break;
                            case 88:
                                h.isRGB = !0, h.isFourCC = !1, C = 32, O = !0
                        }
                        if (O) break;
                    default:
                        return void console.error("Unsupported FourCC code:", i(_))
                }
                var I = t._ExtractLongWordOrder(E[23]),
                    D = t._ExtractLongWordOrder(E[24]),
                    B = t._ExtractLongWordOrder(E[25]),
                    L = t._ExtractLongWordOrder(E[26]);
                R && (M = a._getWebGLTextureType(h.textureType), P = a._getRGBABufferInternalSizedFormat(h.textureType)), b = 1, 131072 & E[2] && !1 !== u && (b = Math.max(1, E[7]));
                for (var w = 0; w < f; w++) {
                    var F = 1 === f ? l.TEXTURE_2D : l.TEXTURE_CUBE_MAP_POSITIVE_X + w + (p || 0);
                    for (m = E[4], g = E[3], x = 0; x < b; ++x) {
                        if (-1 === d || d === x) {
                            var N = -1 === d ? x : 0;
                            if (!h.isCompressed && h.isFourCC) {
                                A = m * g * 4;
                                var V = null;
                                a.badOS || a.badDesktopOS || !a.getCaps().textureHalfFloat && !a.getCaps().textureFloat ? (128 === C ? V = t._GetFloatAsUIntRGBAArrayBuffer(m, g, v, A, c, N) : 64 === C && (V = t._GetHalfFloatAsUIntRGBAArrayBuffer(m, g, v, A, c, N)), h.textureType = e.Engine.TEXTURETYPE_UNSIGNED_INT, M = a._getWebGLTextureType(h.textureType), P = a._getRGBABufferInternalSizedFormat(h.textureType)) : 128 === C ? V = t._GetFloatRGBAArrayBuffer(m, g, v, A, c, N) : 64 !== C || a.getCaps().textureHalfFloat ? V = t._GetHalfFloatRGBAArrayBuffer(m, g, v, A, c, N) : (V = t._GetHalfFloatAsFloatRGBAArrayBuffer(m, g, v, A, c, N), h.textureType = e.Engine.TEXTURETYPE_FLOAT, M = a._getWebGLTextureType(h.textureType), P = a._getRGBABufferInternalSizedFormat(h.textureType)), V && a._uploadDataToTexture(F, N, P, m, g, l.RGBA, M, V)
                            } else if (h.isRGB) 24 === C ? (A = m * g * 3, y = t._GetRGBArrayBuffer(m, g, v, A, c, I, D, B), a._uploadDataToTexture(F, N, l.RGB, m, g, l.RGB, l.UNSIGNED_BYTE, y)) : (A = m * g * 4, y = t._GetRGBAArrayBuffer(m, g, v, A, c, I, D, B, L), a._uploadDataToTexture(F, N, l.RGBA, m, g, l.RGBA, l.UNSIGNED_BYTE, y));
                            else if (h.isLuminance) {
                                var U = l.getParameter(l.UNPACK_ALIGNMENT),
                                    k = m,
                                    z = Math.floor((m + U - 1) / U) * U;
                                A = z * (g - 1) + k, y = t._GetLuminanceArrayBuffer(m, g, v, A, c), a._uploadDataToTexture(F, N, l.LUMINANCE, m, g, l.LUMINANCE, l.UNSIGNED_BYTE, y)
                            } else A = Math.max(4, m) / 4 * Math.max(4, g) / 4 * S, y = new Uint8Array(c, v, A), a._uploadCompressedDataToTexture(F, N, P, m, g, y)
                        }
                        v += C ? m * g * (C / 8) : A, m *= .5, g *= .5, m = Math.max(1, m), g = Math.max(1, g)
                    }
                    if (void 0 !== p) break
                }
            }, t.StoreLODInAlphaChannel = !1, t
        })();
    e.DDSTools = a
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(i, r, n, o) {
            this.arrayBuffer = i;
            var s = new Uint8Array(this.arrayBuffer, 0, 12);
            if (171 !== s[0] || 75 !== s[1] || 84 !== s[2] || 88 !== s[3] || 32 !== s[4] || 49 !== s[5] || 49 !== s[6] || 187 !== s[7] || 13 !== s[8] || 10 !== s[9] || 26 !== s[10] || 10 !== s[11]) return void e.Tools.Error("texture missing KTX identifier");
            var a = new Int32Array(this.arrayBuffer, 12, 13),
                l = 16909060 === a[0];
            return this.glType = l ? this.switchEndainness(a[1]) : a[1], this.glTypeSize = l ? this.switchEndainness(a[2]) : a[2], this.glFormat = l ? this.switchEndainness(a[3]) : a[3], this.glInternalFormat = l ? this.switchEndainness(a[4]) : a[4], this.glBaseInternalFormat = l ? this.switchEndainness(a[5]) : a[5], this.pixelWidth = l ? this.switchEndainness(a[6]) : a[6], this.pixelHeight = l ? this.switchEndainness(a[7]) : a[7], this.pixelDepth = l ? this.switchEndainness(a[8]) : a[8], this.numberOfArrayElements = l ? this.switchEndainness(a[9]) : a[9], this.numberOfFaces = l ? this.switchEndainness(a[10]) : a[10], this.numberOfMipmapLevels = l ? this.switchEndainness(a[11]) : a[11], this.bytesOfKeyValueData = l ? this.switchEndainness(a[12]) : a[12], 0 !== this.glType ? void e.Tools.Error("only compressed formats currently supported") : (this.numberOfMipmapLevels = Math.max(1, this.numberOfMipmapLevels), 0 === this.pixelHeight || 0 !== this.pixelDepth ? void e.Tools.Error("only 2D textures currently supported") : 0 !== this.numberOfArrayElements ? void e.Tools.Error("texture arrays not currently supported") : this.numberOfFaces !== r ? void e.Tools.Error("number of faces expected" + r + ", but found " + this.numberOfFaces) : void(this.loadType = t.COMPRESSED_2D))
        }
        return t.prototype.switchEndainness = function(e) {
            return (255 & e) << 24 | (65280 & e) << 8 | e >> 8 & 65280 | e >> 24 & 255
        }, t.prototype.uploadLevels = function(e, i) {
            switch (this.loadType) {
                case t.COMPRESSED_2D:
                    this._upload2DCompressedLevels(e, i);
                    break;
                case t.TEX_2D:
                case t.COMPRESSED_3D:
                case t.TEX_3D:
            }
        }, t.prototype._upload2DCompressedLevels = function(e, i) {
            for (var r = t.HEADER_LEN + this.bytesOfKeyValueData, n = this.pixelWidth, o = this.pixelHeight, s = i ? this.numberOfMipmapLevels : 1, a = 0; a < s; a++) {
                for (var l = new Int32Array(this.arrayBuffer, r, 1)[0], c = 0; c < this.numberOfFaces; c++) {
                    var h = 1 === this.numberOfFaces ? e.TEXTURE_2D : e.TEXTURE_CUBE_MAP_POSITIVE_X + c,
                        u = new Uint8Array(this.arrayBuffer, r + 4, l);
                    e.compressedTexImage2D(h, a, this.glInternalFormat, n, o, 0, u), r += l + 4, r += 3 - (l + 3) % 4
                }
                n = Math.max(1, .5 * n), o = Math.max(1, .5 * o)
            }
        }, t.HEADER_LEN = 64, t.COMPRESSED_2D = 0, t.COMPRESSED_3D = 1, t.TEX_2D = 2, t.TEX_3D = 3, t
    })();
    e.KhronosTextureContainer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.AxesViewer = (function() {
            function t(t, i) {
                void 0 === i && (i = 1), this._xline = [e.Vector3.Zero(), e.Vector3.Zero()], this._yline = [e.Vector3.Zero(), e.Vector3.Zero()], this._zline = [e.Vector3.Zero(), e.Vector3.Zero()], this.scaleLines = 1, this.scaleLines = i, this._xmesh = e.Mesh.CreateLines("xline", this._xline, t, !0), this._ymesh = e.Mesh.CreateLines("yline", this._yline, t, !0), this._zmesh = e.Mesh.CreateLines("zline", this._zline, t, !0), this._xmesh.renderingGroupId = 2, this._ymesh.renderingGroupId = 2, this._zmesh.renderingGroupId = 2, this._xmesh.material.checkReadyOnlyOnce = !0, this._xmesh.color = new e.Color3(1, 0, 0), this._ymesh.material.checkReadyOnlyOnce = !0, this._ymesh.color = new e.Color3(0, 1, 0), this._zmesh.material.checkReadyOnlyOnce = !0, this._zmesh.color = new e.Color3(0, 0, 1), this.scene = t
            }
            return t.prototype.update = function(t, i, r, n) {
                var o = this.scaleLines;
                this._xmesh && this._xmesh.position.copyFrom(t), this._ymesh && this._ymesh.position.copyFrom(t), this._zmesh && this._zmesh.position.copyFrom(t);
                var s = this._xline[1];
                s.x = i.x * o, s.y = i.y * o, s.z = i.z * o, e.Mesh.CreateLines("", this._xline, null, !1, this._xmesh), s = this._yline[1], s.x = r.x * o, s.y = r.y * o, s.z = r.z * o, e.Mesh.CreateLines("", this._yline, null, !1, this._ymesh), s = this._zline[1], s.x = n.x * o, s.y = n.y * o, s.z = n.z * o, e.Mesh.CreateLines("", this._zline, null, !1, this._zmesh)
            }, t.prototype.dispose = function() {
                this._xmesh && this._xmesh.dispose(), this._ymesh && this._ymesh.dispose(), this._zmesh && this._zmesh.dispose(), this._xmesh = null, this._ymesh = null, this._zmesh = null, this.scene = null
            }, t
        })(), t.BoneAxesViewer = (function(t) {
            function i(i, r, n, o) {
                void 0 === o && (o = 1);
                var s = t.call(this, i, o) || this;
                return s.pos = e.Vector3.Zero(), s.xaxis = e.Vector3.Zero(), s.yaxis = e.Vector3.Zero(), s.zaxis = e.Vector3.Zero(), s.mesh = n, s.bone = r, s
            }
            return __extends(i, t), i.prototype.update = function() {
                if (this.mesh && this.bone) {
                    var i = this.bone;
                    i.getAbsolutePositionToRef(this.mesh, this.pos), i.getDirectionToRef(e.Axis.X, this.mesh, this.xaxis), i.getDirectionToRef(e.Axis.Y, this.mesh, this.yaxis), i.getDirectionToRef(e.Axis.Z, this.mesh, this.zaxis), t.prototype.update.call(this, this.pos, this.xaxis, this.yaxis, this.zaxis)
                }
            }, i.prototype.dispose = function() {
                this.mesh && (this.mesh = null, this.bone = null, t.prototype.dispose.call(this))
            }, i
        })(t.AxesViewer), t.PhysicsViewer = (function() {
            function t(t) {
                this._impostors = [], this._meshes = [], this._numMeshes = 0, this._scene = t || e.Engine.LastCreatedScene;
                var i = this._scene.getPhysicsEngine();
                i && (this._physicsEnginePlugin = i.getPhysicsPlugin())
            }
            return t.prototype._updateDebugMeshes = function() {
                for (var e = this._physicsEnginePlugin, t = 0; t < this._numMeshes; t++) {
                    var i = this._impostors[t];
                    if (i)
                        if (i.isDisposed) this.hideImpostor(this._impostors[t--]);
                        else {
                            var r = this._meshes[t];
                            r && e && e.syncMeshWithImpostor(r, i)
                        }
                }
            }, t.prototype.showImpostor = function(e) {
                if (this._scene) {
                    for (var t = 0; t < this._numMeshes; t++)
                        if (this._impostors[t] == e) return;
                    var i = this._getDebugMesh(e, this._scene);
                    i && (this._impostors[this._numMeshes] = e, this._meshes[this._numMeshes] = i, 0 === this._numMeshes && (this._renderFunction = this._updateDebugMeshes.bind(this), this._scene.registerBeforeRender(this._renderFunction)), this._numMeshes++)
                }
            }, t.prototype.hideImpostor = function(e) {
                if (e && this._scene) {
                    for (var t = !1, i = 0; i < this._numMeshes; i++)
                        if (this._impostors[i] == e) {
                            var r = this._meshes[i];
                            if (!r) continue;
                            this._scene.removeMesh(r), r.dispose(), this._numMeshes--, this._numMeshes > 0 ? (this._meshes[i] = this._meshes[this._numMeshes], this._impostors[i] = this._impostors[this._numMeshes], this._meshes[this._numMeshes] = null, this._impostors[this._numMeshes] = null) : (this._meshes[0] = null, this._impostors[0] = null), t = !0;
                            break
                        }
                    t && 0 === this._numMeshes && this._scene.unregisterBeforeRender(this._renderFunction)
                }
            }, t.prototype._getDebugMaterial = function(t) {
                return this._debugMaterial || (this._debugMaterial = new e.StandardMaterial("", t), this._debugMaterial.wireframe = !0), this._debugMaterial
            }, t.prototype._getDebugBoxMesh = function(t) {
                return this._debugBoxMesh || (this._debugBoxMesh = e.MeshBuilder.CreateBox("physicsBodyBoxViewMesh", {
                    size: 1
                }, t), this._debugBoxMesh.renderingGroupId = 1, this._debugBoxMesh.rotationQuaternion = e.Quaternion.Identity(), this._debugBoxMesh.material = this._getDebugMaterial(t), t.removeMesh(this._debugBoxMesh)), this._debugBoxMesh.createInstance("physicsBodyBoxViewInstance")
            }, t.prototype._getDebugSphereMesh = function(t) {
                return this._debugSphereMesh || (this._debugSphereMesh = e.MeshBuilder.CreateSphere("physicsBodySphereViewMesh", {
                    diameter: 1
                }, t), this._debugSphereMesh.renderingGroupId = 1, this._debugSphereMesh.rotationQuaternion = e.Quaternion.Identity(), this._debugSphereMesh.material = this._getDebugMaterial(t), t.removeMesh(this._debugSphereMesh)), this._debugSphereMesh.createInstance("physicsBodyBoxViewInstance")
            }, t.prototype._getDebugMesh = function(t, i) {
                var r = null;
                if (t.type == e.PhysicsImpostor.BoxImpostor) r = this._getDebugBoxMesh(i), t.getBoxSizeToRef(r.scaling);
                else if (t.type == e.PhysicsImpostor.SphereImpostor) {
                    r = this._getDebugSphereMesh(i);
                    var n = t.getRadius();
                    r.scaling.x = 2 * n, r.scaling.y = 2 * n, r.scaling.z = 2 * n
                }
                return r
            }, t.prototype.dispose = function() {
                for (var e = 0; e < this._numMeshes; e++) this.hideImpostor(this._impostors[e]);
                this._debugBoxMesh && this._debugBoxMesh.dispose(), this._debugSphereMesh && this._debugSphereMesh.dispose(), this._debugMaterial && this._debugMaterial.dispose(), this._impostors.length = 0, this._scene = null, this._physicsEnginePlugin = null
            }, t
        })(), t.SkeletonViewer = (function() {
            function t(t, i, r, n, o) {
                void 0 === n && (n = !0), void 0 === o && (o = 1), this.skeleton = t, this.mesh = i, this.autoUpdateBonesMatrices = n, this.renderingGroupId = o, this.color = e.Color3.White(), this._debugLines = new Array, this._isEnabled = !1, this._scene = r, this.update(), this._renderFunction = this.update.bind(this)
            }
            return Object.defineProperty(t.prototype, "isEnabled", {
                get: function() {
                    return this._isEnabled
                },
                set: function(e) {
                    this._isEnabled !== e && (this._isEnabled = e, e ? this._scene.registerBeforeRender(this._renderFunction) : this._scene.unregisterBeforeRender(this._renderFunction))
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype._getBonePosition = function(t, i, r, n, o, s) {
                void 0 === n && (n = 0), void 0 === o && (o = 0), void 0 === s && (s = 0);
                var a = e.Tmp.Matrix[0],
                    l = i.getParent();
                if (a.copyFrom(i.getLocalMatrix()), 0 !== n || 0 !== o || 0 !== s) {
                    var c = e.Tmp.Matrix[1];
                    e.Matrix.IdentityToRef(c), c.m[12] = n, c.m[13] = o, c.m[14] = s, c.multiplyToRef(a, a)
                }
                l && a.multiplyToRef(l.getAbsoluteTransform(), a), a.multiplyToRef(r, a), t.x = a.m[12], t.y = a.m[13], t.z = a.m[14]
            }, t.prototype._getLinesForBonesWithLength = function(t, i) {
                for (var r = t.length, n = this.mesh.position, o = 0; o < r; o++) {
                    var s = t[o],
                        a = this._debugLines[o];
                    a || (a = [e.Vector3.Zero(), e.Vector3.Zero()], this._debugLines[o] = a), this._getBonePosition(a[0], s, i), this._getBonePosition(a[1], s, i, 0, s.length, 0), a[0].subtractInPlace(n), a[1].subtractInPlace(n)
                }
            }, t.prototype._getLinesForBonesNoLength = function(t, i) {
                for (var r = t.length, n = 0, o = this.mesh.position, s = r - 1; s >= 0; s--) {
                    var a = t[s],
                        l = a.getParent();
                    if (l) {
                        var c = this._debugLines[n];
                        c || (c = [e.Vector3.Zero(), e.Vector3.Zero()], this._debugLines[n] = c), a.getAbsolutePositionToRef(this.mesh, c[0]), l.getAbsolutePositionToRef(this.mesh, c[1]), c[0].subtractInPlace(o), c[1].subtractInPlace(o), n++
                    }
                }
            }, t.prototype.update = function() {
                this.autoUpdateBonesMatrices && this.skeleton.computeAbsoluteTransforms(), void 0 === this.skeleton.bones[0].length ? this._getLinesForBonesNoLength(this.skeleton.bones, this.mesh.getWorldMatrix()) : this._getLinesForBonesWithLength(this.skeleton.bones, this.mesh.getWorldMatrix()), this._debugMesh ? e.MeshBuilder.CreateLineSystem("", {
                    lines: this._debugLines,
                    updatable: !0,
                    instance: this._debugMesh
                }, this._scene) : (this._debugMesh = e.MeshBuilder.CreateLineSystem("", {
                    lines: this._debugLines,
                    updatable: !0,
                    instance: null
                }, this._scene), this._debugMesh.renderingGroupId = this.renderingGroupId), this._debugMesh.position.copyFrom(this.mesh.position), this._debugMesh.color = this.color
            }, t.prototype.dispose = function() {
                this._debugMesh && (this.isEnabled = !1, this._debugMesh.dispose(), this._debugMesh = null)
            }, t
        })(), t
    })();
    e.Debug = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            this.ray = e
        }
        return t.CreateAndShow = function(e, i, r) {
            var n = new t(e);
            return n.show(i, r), n
        }, t.prototype.show = function(t, i) {
            if (!this._renderFunction && this.ray) {
                var r = this.ray;
                this._renderFunction = this._render.bind(this), this._scene = t, this._renderPoints = [r.origin, r.origin.add(r.direction.scale(r.length))], this._renderLine = e.Mesh.CreateLines("ray", this._renderPoints, t, !0), this._renderFunction && this._scene.registerBeforeRender(this._renderFunction)
            }
            i && this._renderLine && this._renderLine.color.copyFrom(i)
        }, t.prototype.hide = function() {
            this._renderFunction && this._scene && (this._scene.unregisterBeforeRender(this._renderFunction), this._scene = null, this._renderFunction = null, this._renderLine && (this._renderLine.dispose(), this._renderLine = null), this._renderPoints = [])
        }, t.prototype._render = function() {
            var t = this.ray;
            if (t) {
                var i = this._renderPoints[1],
                    r = Math.min(t.length, 1e6);
                i.copyFrom(t.direction), i.scaleInPlace(r), i.addInPlace(t.origin), e.Mesh.CreateLines("ray", this._renderPoints, this._scene, !0, this._renderLine)
            }
        }, t.prototype.attachToMesh = function(t, i, r, n) {
            this._attachedToMesh = t;
            var o = this.ray;
            o && (o.direction || (o.direction = e.Vector3.Zero()), o.origin || (o.origin = e.Vector3.Zero()), n && (o.length = n), r || (r = e.Vector3.Zero()), i || (i = new e.Vector3(0, 0, -1)), this._meshSpaceDirection ? (this._meshSpaceDirection.copyFrom(i), this._meshSpaceOrigin.copyFrom(r)) : (this._meshSpaceDirection = i.clone(), this._meshSpaceOrigin = r.clone()), this._updateToMeshFunction || (this._updateToMeshFunction = this._updateToMesh.bind(this), this._attachedToMesh.getScene().registerBeforeRender(this._updateToMeshFunction)), this._updateToMesh())
        }, t.prototype.detachFromMesh = function() {
            this._attachedToMesh && (this._updateToMeshFunction && this._attachedToMesh.getScene().unregisterBeforeRender(this._updateToMeshFunction), this._attachedToMesh = null, this._updateToMeshFunction = null)
        }, t.prototype._updateToMesh = function() {
            var t = this.ray;
            if (this._attachedToMesh && t) {
                if (this._attachedToMesh._isDisposed) return void this.detachFromMesh();
                this._attachedToMesh.getDirectionToRef(this._meshSpaceDirection, t.direction), e.Vector3.TransformCoordinatesToRef(this._meshSpaceOrigin, this._attachedToMesh.getWorldMatrix(), t.origin)
            }
        }, t.prototype.dispose = function() {
            this.hide(), this.detachFromMesh(), this.ray = null
        }, t
    })();
    e.RayHelper = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            this.BJSINSPECTOR = "undefined" != typeof INSPECTOR ? INSPECTOR : void 0, this._scene = e
        }
        return t.prototype._createInspector = function(e) {
            void 0 === e && (e = {});
            var t = e.popup || !1,
                i = e.initialTab || 0,
                r = e.parentElement || null;
            this._inspector || (this.BJSINSPECTOR = this.BJSINSPECTOR || "undefined" != typeof INSPECTOR ? INSPECTOR : void 0, this._inspector = new this.BJSINSPECTOR.Inspector(this._scene, t, i, r, e.newColors))
        }, t.prototype.isVisible = function() {
            return !!this._inspector
        }, t.prototype.hide = function() {
            if (this._inspector) {
                try {
                    this._inspector.dispose()
                } catch (e) {}
                this._inspector = null
            }
        }, t.prototype.show = function(i) {
            void 0 === i && (i = {}), void 0 === this.BJSINSPECTOR ? e.Tools.LoadScript(t.InspectorURL, this._createInspector.bind(this, i)) : this._createInspector(i)
        }, t.InspectorURL = "https://preview.babylonjs.com/inspector/babylon.inspector.bundle.js", t
    })();
    e.DebugLayer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            this.frontColor = new e.Color3(1, 1, 1), this.backColor = new e.Color3(.1, .1, .1), this.showBackLines = !0, this.renderList = new e.SmartArray(32), this._vertexBuffers = {}, this._scene = t
        }
        return t.prototype._prepareRessources = function() {
            if (!this._colorShader) {
                this._colorShader = new e.ShaderMaterial("colorShader", this._scene, "color", {
                    attributes: [e.VertexBuffer.PositionKind],
                    uniforms: ["world", "viewProjection", "color"]
                });
                var t = this._scene.getEngine(),
                    i = e.VertexData.CreateBox({
                        size: 1
                    });
                this._vertexBuffers[e.VertexBuffer.PositionKind] = new e.VertexBuffer(t, i.positions, e.VertexBuffer.PositionKind, !1), this._createIndexBuffer()
            }
        }, t.prototype._createIndexBuffer = function() {
            var e = this._scene.getEngine();
            this._indexBuffer = e.createIndexBuffer([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 7, 1, 6, 2, 5, 3, 4])
        }, t.prototype._rebuild = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && t._rebuild(), this._createIndexBuffer()
        }, t.prototype.reset = function() {
            this.renderList.reset()
        }, t.prototype.render = function() {
            if (0 !== this.renderList.length && (this._prepareRessources(), this._colorShader.isReady())) {
                var t = this._scene.getEngine();
                t.setDepthWrite(!1), this._colorShader._preBind();
                for (var i = 0; i < this.renderList.length; i++) {
                    var r = this.renderList.data[i],
                        n = r.minimum,
                        o = r.maximum,
                        s = o.subtract(n),
                        a = n.add(s.scale(.5)),
                        l = e.Matrix.Scaling(s.x, s.y, s.z).multiply(e.Matrix.Translation(a.x, a.y, a.z)).multiply(r.getWorldMatrix());
                    t.bindBuffers(this._vertexBuffers, this._indexBuffer, this._colorShader.getEffect()), this.showBackLines && (t.setDepthFunctionToGreaterOrEqual(), this._scene.resetCachedMaterial(), this._colorShader.setColor4("color", this.backColor.toColor4()), this._colorShader.bind(l), t.drawElementsType(e.Material.LineListDrawMode, 0, 24)), t.setDepthFunctionToLess(), this._scene.resetCachedMaterial(), this._colorShader.setColor4("color", this.frontColor.toColor4()), this._colorShader.bind(l), t.drawElementsType(e.Material.LineListDrawMode, 0, 24)
                }
                this._colorShader.unbind(), t.setDepthFunctionToLessOrEqual(), t.setDepthWrite(!0)
            }
        }, t.prototype.renderOcclusionBoundingBox = function(t) {
            if (this._prepareRessources(), this._colorShader.isReady() && t._boundingInfo) {
                var i = this._scene.getEngine();
                i.setDepthWrite(!1), i.setColorWrite(!1), this._colorShader._preBind();
                var r = t._boundingInfo.boundingBox,
                    n = r.minimum,
                    o = r.maximum,
                    s = o.subtract(n),
                    a = n.add(s.scale(.5)),
                    l = e.Matrix.Scaling(s.x, s.y, s.z).multiply(e.Matrix.Translation(a.x, a.y, a.z)).multiply(r.getWorldMatrix());
                i.bindBuffers(this._vertexBuffers, this._indexBuffer, this._colorShader.getEffect()), i.setDepthFunctionToLess(), this._scene.resetCachedMaterial(), this._colorShader.bind(l), i.drawElementsType(e.Material.LineListDrawMode, 0, 24), this._colorShader.unbind(), i.setDepthFunctionToLessOrEqual(), i.setDepthWrite(!0), i.setColorWrite(!0)
            }
        }, t.prototype.dispose = function() {
            if (this._colorShader) {
                this.renderList.dispose(), this._colorShader.dispose();
                var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
                t && (t.dispose(), this._vertexBuffers[e.VertexBuffer.PositionKind] = null), this._scene.getEngine()._releaseBuffer(this._indexBuffer)
            }
        }, t
    })();
    e.BoundingBoxRenderer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            void 0 === i && (i = 0), this.name = t, this.animations = new Array, this._positions = null, this._normals = null, this._tangents = null, this.onInfluenceChanged = new e.Observable, this.influence = i
        }
        return Object.defineProperty(t.prototype, "influence", {
            get: function() {
                return this._influence
            },
            set: function(e) {
                if (this._influence !== e) {
                    var t = this._influence;
                    this._influence = e, this.onInfluenceChanged.hasObservers && this.onInfluenceChanged.notifyObservers(0 === t || 0 === e)
                }
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "hasPositions", {
            get: function() {
                return !!this._positions
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "hasNormals", {
            get: function() {
                return !!this._normals
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "hasTangents", {
            get: function() {
                return !!this._tangents
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.setPositions = function(e) {
            this._positions = e
        }, t.prototype.getPositions = function() {
            return this._positions
        }, t.prototype.setNormals = function(e) {
            this._normals = e
        }, t.prototype.getNormals = function() {
            return this._normals
        }, t.prototype.setTangents = function(e) {
            this._tangents = e
        }, t.prototype.getTangents = function() {
            return this._tangents
        }, t.prototype.serialize = function() {
            var t = {};
            return t.name = this.name, t.influence = this.influence, t.positions = Array.prototype.slice.call(this.getPositions()), this.hasNormals && (t.normals = Array.prototype.slice.call(this.getNormals())), this.hasTangents && (t.tangents = Array.prototype.slice.call(this.getTangents())), e.Animation.AppendSerializedAnimations(this, t), t
        }, t.Parse = function(i) {
            var r = new t(i.name, i.influence);
            if (r.setPositions(i.positions), i.normals && r.setNormals(i.normals), i.tangents && r.setTangents(i.tangents), i.animations)
                for (var n = 0; n < i.animations.length; n++) {
                    var o = i.animations[n];
                    r.animations.push(e.Animation.Parse(o))
                }
            return r
        }, t.FromMesh = function(i, r, n) {
            r || (r = i.name);
            var o = new t(r, n);
            return o.setPositions(i.getVerticesData(e.VertexBuffer.PositionKind)), i.isVerticesDataPresent(e.VertexBuffer.NormalKind) && o.setNormals(i.getVerticesData(e.VertexBuffer.NormalKind)), i.isVerticesDataPresent(e.VertexBuffer.TangentKind) && o.setTangents(i.getVerticesData(e.VertexBuffer.TangentKind)), o
        }, t
    })();
    e.MorphTarget = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            void 0 === t && (t = null), this._targets = new Array, this._targetObservable = new Array, this._activeTargets = new e.SmartArray(16), this._supportsNormals = !1, this._supportsTangents = !1, this._vertexCount = 0, this._uniqueId = 0, this._tempInfluences = new Array, t || (t = e.Engine.LastCreatedScene), this._scene = t, this._scene && (this._scene.morphTargetManagers.push(this), this._uniqueId = this._scene.getUniqueId())
        }
        return Object.defineProperty(t.prototype, "uniqueId", {
            get: function() {
                return this._uniqueId
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "vertexCount", {
            get: function() {
                return this._vertexCount
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "supportsNormals", {
            get: function() {
                return this._supportsNormals
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "supportsTangents", {
            get: function() {
                return this._supportsTangents
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "numTargets", {
            get: function() {
                return this._targets.length
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "numInfluencers", {
            get: function() {
                return this._activeTargets.length
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "influences", {
            get: function() {
                return this._influences
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getActiveTarget = function(e) {
            return this._activeTargets.data[e]
        }, t.prototype.getTarget = function(e) {
            return this._targets[e]
        }, t.prototype.addTarget = function(e) {
            var t = this;
            this._targets.push(e), this._targetObservable.push(e.onInfluenceChanged.add((function(e) {
                t._syncActiveTargets(e)
            }))), this._syncActiveTargets(!0)
        }, t.prototype.removeTarget = function(e) {
            var t = this._targets.indexOf(e);
            t >= 0 && (this._targets.splice(t, 1), e.onInfluenceChanged.remove(this._targetObservable.splice(t, 1)[0]), this._syncActiveTargets(!0))
        }, t.prototype.serialize = function() {
            var e = {};
            e.id = this.uniqueId, e.targets = [];
            for (var t = 0, i = this._targets; t < i.length; t++) {
                var r = i[t];
                e.targets.push(r.serialize())
            }
            return e
        }, t.prototype._syncActiveTargets = function(t) {
            var i = 0;
            this._activeTargets.reset(), this._supportsNormals = !0, this._supportsTangents = !0, this._vertexCount = 0;
            for (var r = 0, n = this._targets; r < n.length; r++) {
                var o = n[r];
                this._activeTargets.push(o), this._tempInfluences[i++] = o.influence;
                var s = o.getPositions();
                if (s) {
                    this._supportsNormals = this._supportsNormals && o.hasNormals, this._supportsTangents = this._supportsTangents && o.hasTangents;
                    var a = s.length / 3;
                    if (0 === this._vertexCount) this._vertexCount = a;
                    else if (this._vertexCount !== a) return void e.Tools.Error("Incompatible target. Targets must all have the same vertices count.")
                }
            }
            this._influences && this._influences.length === i || (this._influences = new Float32Array(i));
            for (var l = 0; l < i; l++) this._influences[l] = this._tempInfluences[l];
            if (t && this._scene)
                for (var c = 0, h = this._scene.meshes; c < h.length; c++) {
                    var u = h[c];
                    u.morphTargetManager === this && u._syncGeometryWithMorphTargetManager()
                }
        }, t.Parse = function(i, r) {
            var n = new t(r);
            n._uniqueId = i.id;
            for (var o = 0, s = i.targets; o < s.length; o++) {
                var a = s[o];
                n.addTarget(e.MorphTarget.Parse(a))
            }
            return n
        }, t
    })();
    e.MorphTargetManager = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r) {
            void 0 === r && (r = 2), this.maxDepth = r, this.dynamicContent = new Array, this._maxBlockCapacity = i || 64, this._selectionContent = new e.SmartArrayNoDuplicate(1024), this._creationFunc = t
        }
        return t.prototype.update = function(e, i, r) {
            t._CreateBlocks(e, i, r, this._maxBlockCapacity, 0, this.maxDepth, this, this._creationFunc)
        }, t.prototype.addMesh = function(e) {
            for (var t = 0; t < this.blocks.length; t++) {
                this.blocks[t].addEntry(e)
            }
        }, t.prototype.select = function(e, t) {
            this._selectionContent.reset();
            for (var i = 0; i < this.blocks.length; i++) {
                this.blocks[i].select(e, this._selectionContent, t)
            }
            return t ? this._selectionContent.concat(this.dynamicContent) : this._selectionContent.concatWithNoDuplicate(this.dynamicContent), this._selectionContent
        }, t.prototype.intersects = function(e, t, i) {
            this._selectionContent.reset();
            for (var r = 0; r < this.blocks.length; r++) {
                this.blocks[r].intersects(e, t, this._selectionContent, i)
            }
            return i ? this._selectionContent.concat(this.dynamicContent) : this._selectionContent.concatWithNoDuplicate(this.dynamicContent), this._selectionContent
        }, t.prototype.intersectsRay = function(e) {
            this._selectionContent.reset();
            for (var t = 0; t < this.blocks.length; t++) {
                this.blocks[t].intersectsRay(e, this._selectionContent)
            }
            return this._selectionContent.concatWithNoDuplicate(this.dynamicContent), this._selectionContent
        }, t._CreateBlocks = function(t, i, r, n, o, s, a, l) {
            a.blocks = new Array;
            for (var c = new e.Vector3((i.x - t.x) / 2, (i.y - t.y) / 2, (i.z - t.z) / 2), h = 0; h < 2; h++)
                for (var u = 0; u < 2; u++)
                    for (var f = 0; f < 2; f++) {
                        var d = t.add(c.multiplyByFloats(h, u, f)),
                            p = t.add(c.multiplyByFloats(h + 1, u + 1, f + 1)),
                            _ = new e.OctreeBlock(d, p, n, o + 1, s, l);
                        _.addEntries(r), a.blocks.push(_)
                    }
        }, t.CreationFuncForMeshes = function(e, t) {
            var i = e.getBoundingInfo();
            !e.isBlocked && i.boundingBox.intersectsMinMax(t.minPoint, t.maxPoint) && t.entries.push(e)
        }, t.CreationFuncForSubMeshes = function(e, t) {
            e.getBoundingInfo().boundingBox.intersectsMinMax(t.minPoint, t.maxPoint) && t.entries.push(e)
        }, t
    })();
    e.Octree = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, t, i, r, n, o) {
            this.entries = new Array,
                this._boundingVectors = new Array, this._capacity = i, this._depth = r, this._maxDepth = n, this._creationFunc = o, this._minPoint = e, this._maxPoint = t, this._boundingVectors.push(e.clone()), this._boundingVectors.push(t.clone()), this._boundingVectors.push(e.clone()), this._boundingVectors[2].x = t.x, this._boundingVectors.push(e.clone()), this._boundingVectors[3].y = t.y, this._boundingVectors.push(e.clone()), this._boundingVectors[4].z = t.z, this._boundingVectors.push(t.clone()), this._boundingVectors[5].z = e.z, this._boundingVectors.push(t.clone()), this._boundingVectors[6].x = e.x, this._boundingVectors.push(t.clone()), this._boundingVectors[7].y = e.y
        }
        return Object.defineProperty(t.prototype, "capacity", {
            get: function() {
                return this._capacity
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "minPoint", {
            get: function() {
                return this._minPoint
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "maxPoint", {
            get: function() {
                return this._maxPoint
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.addEntry = function(e) {
            if (this.blocks)
                for (var t = 0; t < this.blocks.length; t++) {
                    var i = this.blocks[t];
                    i.addEntry(e)
                } else this._creationFunc(e, this), this.entries.length > this.capacity && this._depth < this._maxDepth && this.createInnerBlocks()
        }, t.prototype.addEntries = function(e) {
            for (var t = 0; t < e.length; t++) {
                var i = e[t];
                this.addEntry(i)
            }
        }, t.prototype.select = function(t, i, r) {
            if (e.BoundingBox.IsInFrustum(this._boundingVectors, t)) {
                if (this.blocks) {
                    for (var n = 0; n < this.blocks.length; n++) {
                        this.blocks[n].select(t, i, r)
                    }
                    return
                }
                r ? i.concat(this.entries) : i.concatWithNoDuplicate(this.entries)
            }
        }, t.prototype.intersects = function(t, i, r, n) {
            if (e.BoundingBox.IntersectsSphere(this._minPoint, this._maxPoint, t, i)) {
                if (this.blocks) {
                    for (var o = 0; o < this.blocks.length; o++) {
                        this.blocks[o].intersects(t, i, r, n)
                    }
                    return
                }
                n ? r.concat(this.entries) : r.concatWithNoDuplicate(this.entries)
            }
        }, t.prototype.intersectsRay = function(e, t) {
            if (e.intersectsBoxMinMax(this._minPoint, this._maxPoint)) {
                if (this.blocks) {
                    for (var i = 0; i < this.blocks.length; i++) {
                        this.blocks[i].intersectsRay(e, t)
                    }
                    return
                }
                t.concatWithNoDuplicate(this.entries)
            }
        }, t.prototype.createInnerBlocks = function() {
            e.Octree._CreateBlocks(this._minPoint, this._maxPoint, this.entries, this._capacity, this._depth, this._maxDepth, this, this._creationFunc)
        }, t
    })();
    e.OctreeBlock = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, "vrDistortionCorrection", ["LensCenter", "Scale", "ScaleIn", "HmdWarpParam"], null, o.postProcessScaleFactor, r, e.Texture.BILINEAR_SAMPLINGMODE) || this;
            return s._isRightEye = n, s._distortionFactors = o.distortionK, s._postProcessScaleFactor = o.postProcessScaleFactor, s._lensCenterOffset = o.lensCenterOffset, s.adaptScaleToCurrentViewport = !0, s.onSizeChangedObservable.add((function() {
                s.aspectRatio = .5 * s.width / s.height, s._scaleIn = new e.Vector2(2, 2 / s.aspectRatio), s._scaleFactor = new e.Vector2(1 / s._postProcessScaleFactor * .5, 1 / s._postProcessScaleFactor * .5 * s.aspectRatio), s._lensCenter = new e.Vector2(s._isRightEye ? .5 - .5 * s._lensCenterOffset : .5 + .5 * s._lensCenterOffset, .5)
            })), s.onApplyObservable.add((function(e) {
                e.setFloat2("LensCenter", s._lensCenter.x, s._lensCenter.y), e.setFloat2("Scale", s._scaleFactor.x, s._scaleFactor.y), e.setFloat2("ScaleIn", s._scaleIn.x, s._scaleIn.y), e.setFloat4("HmdWarpParam", s._distortionFactors[0], s._distortionFactors[1], s._distortionFactors[2], s._distortionFactors[3])
            })), s
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.VRDistortionCorrectionPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r, n, o, s) {
            var a = e.call(this, t, "anaglyph", null, ["leftSampler"], i, r[1], n, o, s) || this;
            return a._passedProcess = r[0]._rigPostProcess, a.onApplyObservable.add((function(e) {
                e.setTextureFromPostProcess("leftSampler", a._passedProcess)
            })), a
        }
        return __extends(t, e), t
    })(e.PostProcess);
    e.AnaglyphPostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s, a) {
            var l = t.call(this, i, "stereoscopicInterlace", ["stepSize"], ["camASampler"], 1, r[1], o, s, a, n ? "#define IS_STEREOSCOPIC_HORIZ 1" : void 0) || this;
            return l._passedProcess = r[0]._rigPostProcess, l._stepSize = new e.Vector2(1 / l.width, 1 / l.height), l.onSizeChangedObservable.add((function() {
                l._stepSize = new e.Vector2(1 / l.width, 1 / l.height)
            })), l.onApplyObservable.add((function(e) {
                e.setTextureFromPostProcess("camASampler", l._passedProcess), e.setFloat2("stepSize", l._stepSize.x, l._stepSize.y)
            })), l
        }
        return __extends(i, t), i
    })(e.PostProcess);
    e.StereoscopicInterlacePostProcess = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            var t = this;
            this._screenOrientationAngle = 0, this._screenQuaternion = new e.Quaternion, this._alpha = 0, this._beta = 0, this._gamma = 0, this._orientationChanged = function() {
                t._screenOrientationAngle = void 0 !== window.orientation ? +window.orientation : window.screen.orientation && window.screen.orientation.angle ? window.screen.orientation.angle : 0, t._screenOrientationAngle = -e.Tools.ToRadians(t._screenOrientationAngle / 2), t._screenQuaternion.copyFromFloats(0, Math.sin(t._screenOrientationAngle), 0, Math.cos(t._screenOrientationAngle))
            }, this._deviceOrientation = function(e) {
                t._alpha = null !== e.alpha ? e.alpha : 0, t._beta = null !== e.beta ? e.beta : 0, t._gamma = null !== e.gamma ? e.gamma : 0
            }, this._constantTranform = new e.Quaternion(-Math.sqrt(.5), 0, 0, Math.sqrt(.5)), this._orientationChanged()
        }
        return Object.defineProperty(t.prototype, "camera", {
            get: function() {
                return this._camera
            },
            set: function(t) {
                this._camera = t, null == this._camera || this._camera.rotationQuaternion || (this._camera.rotationQuaternion = new e.Quaternion)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.attachControl = function(e, t) {
            window.addEventListener("orientationchange", this._orientationChanged), window.addEventListener("deviceorientation", this._deviceOrientation), this._orientationChanged()
        }, t.prototype.detachControl = function(e) {
            window.removeEventListener("orientationchange", this._orientationChanged), window.removeEventListener("deviceorientation", this._deviceOrientation)
        }, t.prototype.checkInputs = function() {
            this._alpha && (e.Quaternion.RotationYawPitchRollToRef(e.Tools.ToRadians(this._alpha), e.Tools.ToRadians(this._beta), -e.Tools.ToRadians(this._gamma), this.camera.rotationQuaternion), this._camera.rotationQuaternion.multiplyInPlace(this._screenQuaternion), this._camera.rotationQuaternion.multiplyInPlace(this._constantTranform), this._camera.rotationQuaternion.z *= -1, this._camera.rotationQuaternion.w *= -1)
        }, t.prototype.getClassName = function() {
            return "FreeCameraDeviceOrientationInput"
        }, t.prototype.getSimpleName = function() {
            return "deviceOrientation"
        }, t
    })();
    e.FreeCameraDeviceOrientationInput = t, e.CameraInputTypes.FreeCameraDeviceOrientationInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this.alphaCorrection = 1, this.betaCorrection = 1, this.gammaCorrection = 1, this._alpha = 0, this._gamma = 0, this._dirty = !1, this._deviceOrientationHandler = this._onOrientationEvent.bind(this)
        }
        return e.prototype.attachControl = function(e, t) {
            this.camera.attachControl(e, t), window.addEventListener("deviceorientation", this._deviceOrientationHandler)
        }, e.prototype._onOrientationEvent = function(e) {
            null !== e.alpha && (this._alpha = 0 | +e.alpha), null !== e.gamma && (this._gamma = 0 | +e.gamma), this._dirty = !0
        }, e.prototype.checkInputs = function() {
            this._dirty && (this._dirty = !1, this._gamma < 0 && (this._gamma = 180 + this._gamma), this.camera.alpha = -this._alpha / 180 * Math.PI % Math.PI * 2, this.camera.beta = this._gamma / 180 * Math.PI)
        }, e.prototype.detachControl = function(e) {
            window.removeEventListener("deviceorientation", this._deviceOrientationHandler)
        }, e.prototype.getClassName = function() {
            return "ArcRotateCameraVRDeviceOrientationInput"
        }, e.prototype.getSimpleName = function() {
            return "VRDeviceOrientation"
        }, e
    })();
    e.ArcRotateCameraVRDeviceOrientationInput = t, e.CameraInputTypes.ArcRotateCameraVRDeviceOrientationInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.compensateDistortion = !0
        }
        return Object.defineProperty(t.prototype, "aspectRatio", {
            get: function() {
                return this.hResolution / (2 * this.vResolution)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "aspectRatioFov", {
            get: function() {
                return 2 * Math.atan(this.postProcessScaleFactor * this.vScreenSize / (2 * this.eyeToScreenDistance))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "leftHMatrix", {
            get: function() {
                var t = this.hScreenSize / 4 - this.lensSeparationDistance / 2,
                    i = 4 * t / this.hScreenSize;
                return e.Matrix.Translation(i, 0, 0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "rightHMatrix", {
            get: function() {
                var t = this.hScreenSize / 4 - this.lensSeparationDistance / 2,
                    i = 4 * t / this.hScreenSize;
                return e.Matrix.Translation(-i, 0, 0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "leftPreViewMatrix", {
            get: function() {
                return e.Matrix.Translation(.5 * this.interpupillaryDistance, 0, 0)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "rightPreViewMatrix", {
            get: function() {
                return e.Matrix.Translation(-.5 * this.interpupillaryDistance, 0, 0)
            },
            enumerable: !0,
            configurable: !0
        }), t.GetDefault = function() {
            var e = new t;
            return e.hResolution = 1280, e.vResolution = 800, e.hScreenSize = .149759993, e.vScreenSize = .0935999975, e.vScreenCenter = .0467999987, e.eyeToScreenDistance = .0410000011, e.lensSeparationDistance = .063500002, e.interpupillaryDistance = .064000003, e.distortionK = [1, .219999999, .239999995, 0], e.chromaAbCorrection = [.995999992, -.00400000019, 1.01400006, 0], e.postProcessScaleFactor = 1.714605507808412, e.lensCenterOffset = .151976421, e
        }, t
    })();
    e.VRCameraMetrics = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            void 0 === o && (o = {});
            var s = t.call(this, i, r, n) || this;
            s.webVROptions = o, s._vrDevice = null, s.rawPose = null, s._specsVersion = "1.1", s._attached = !1, s._descendants = [], s._deviceRoomPosition = e.Vector3.Zero(), s._deviceRoomRotationQuaternion = e.Quaternion.Identity(), s._standingMatrix = null, s.devicePosition = e.Vector3.Zero(), s.deviceRotationQuaternion = e.Quaternion.Identity(), s.deviceScaleFactor = 1, s._deviceToWorld = e.Matrix.Identity(), s._worldToDevice = e.Matrix.Identity(), s.controllers = [], s.onControllersAttachedObservable = new e.Observable, s.onControllerMeshLoadedObservable = new e.Observable, s.rigParenting = !0, s._defaultHeight = void 0, s._workingVector = e.Vector3.Zero(), s._oneVector = e.Vector3.One(), s._workingMatrix = e.Matrix.Identity(), s._cache.position = e.Vector3.Zero(), o.defaultHeight && (s._defaultHeight = o.defaultHeight, s.position.y = s._defaultHeight), s.minZ = .1, 5 === arguments.length && (s.webVROptions = arguments[4]), void 0 == s.webVROptions.trackPosition && (s.webVROptions.trackPosition = !0), void 0 == s.webVROptions.controllerMeshes && (s.webVROptions.controllerMeshes = !0), void 0 == s.webVROptions.defaultLightingOnControllers && (s.webVROptions.defaultLightingOnControllers = !0), s.rotationQuaternion = new e.Quaternion, s.webVROptions && s.webVROptions.positionScale && (s.deviceScaleFactor = s.webVROptions.positionScale);
            var a = s.getEngine();
            return s._onVREnabled = function(e) {
                e && s.initControllers()
            }, a.onVRRequestPresentComplete.add(s._onVREnabled), a.initWebVR().add((function(t) {
                t.vrDisplay && s._vrDevice !== t.vrDisplay && (s._vrDevice = t.vrDisplay, s.setCameraRigMode(e.Camera.RIG_MODE_WEBVR, {
                    parentCamera: s,
                    vrDisplay: s._vrDevice,
                    frameData: s._frameData,
                    specs: s._specsVersion
                }), s._attached && s.getEngine().enableVR())
            })), "undefined" != typeof VRFrameData && (s._frameData = new VRFrameData), n.onBeforeCameraRenderObservable.add((function(e) {
                e.parent === s && s.rigParenting && (s._descendants = s.getDescendants(!0, (function(e) {
                    var t = s.controllers.some((function(t) {
                            return t._mesh === e
                        })),
                        i = -1 !== s._rigCameras.indexOf(e);
                    return !t && !i
                })), s._descendants.forEach((function(t) {
                    t.parent = e
                })))
            })), n.onAfterCameraRenderObservable.add((function(e) {
                e.parent === s && s.rigParenting && s._descendants.forEach((function(e) {
                    e.parent = s
                }))
            })), s
        }
        return __extends(i, t), i.prototype.deviceDistanceToRoomGround = function() {
            return this._standingMatrix ? (this._standingMatrix.getTranslationToRef(this._workingVector), this._deviceRoomPosition.y + this._workingVector.y) : this._defaultHeight || 0
        }, i.prototype.useStandingMatrix = function(t) {
            var i = this;
            void 0 === t && (t = function(e) {}), this.getEngine().initWebVRAsync().then((function(r) {
                r.vrDisplay && r.vrDisplay.stageParameters && r.vrDisplay.stageParameters.sittingToStandingTransform ? (i._standingMatrix = new e.Matrix, e.Matrix.FromFloat32ArrayToRefScaled(r.vrDisplay.stageParameters.sittingToStandingTransform, 0, 1, i._standingMatrix), i.getScene().useRightHandedSystem || [2, 6, 8, 9, 14].forEach((function(e) {
                    i._standingMatrix && (i._standingMatrix.m[e] *= -1)
                })), t(!0)) : t(!1)
            }))
        }, i.prototype.useStandingMatrixAsync = function() {
            var e = this;
            return new Promise(function(t, i) {
                e.useStandingMatrix((function(e) {
                    t(e)
                }))
            })
        }, i.prototype.dispose = function() {
            this.getEngine().onVRRequestPresentComplete.removeCallback(this._onVREnabled), t.prototype.dispose.call(this)
        }, i.prototype.getControllerByName = function(e) {
            for (var t = 0, i = this.controllers; t < i.length; t++) {
                var r = i[t];
                if (r.hand === e) return r
            }
            return null
        }, Object.defineProperty(i.prototype, "leftController", {
            get: function() {
                return this._leftController || (this._leftController = this.getControllerByName("left")), this._leftController
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "rightController", {
            get: function() {
                return this._rightController || (this._rightController = this.getControllerByName("right")), this._rightController
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getForwardRay = function(e) {
            return void 0 === e && (e = 100), this.leftCamera ? t.prototype.getForwardRay.call(this, e, this.leftCamera.getWorldMatrix(), this.leftCamera.globalPosition) : t.prototype.getForwardRay.call(this, e)
        }, i.prototype._checkInputs = function() {
            this._vrDevice && this._vrDevice.isPresenting && (this._vrDevice.getFrameData(this._frameData), this.updateFromDevice(this._frameData.pose)), t.prototype._checkInputs.call(this)
        }, i.prototype.updateFromDevice = function(e) {
            e && e.orientation && (this.rawPose = e, this._deviceRoomRotationQuaternion.copyFromFloats(e.orientation[0], e.orientation[1], -e.orientation[2], -e.orientation[3]), this.getScene().useRightHandedSystem && (this._deviceRoomRotationQuaternion.z *= -1, this._deviceRoomRotationQuaternion.w *= -1), this.webVROptions.trackPosition && this.rawPose.position && (this._deviceRoomPosition.copyFromFloats(this.rawPose.position[0], this.rawPose.position[1], -this.rawPose.position[2]), this.getScene().useRightHandedSystem && (this._deviceRoomPosition.z *= -1)))
        }, i.prototype.attachControl = function(i, r) {
            t.prototype.attachControl.call(this, i, r), this._attached = !0, r = !e.Camera.ForceAttachControlToAlwaysPreventDefault && r, this._vrDevice && this.getEngine().enableVR()
        }, i.prototype.detachControl = function(e) {
            this.getScene().gamepadManager.onGamepadConnectedObservable.remove(this._onGamepadConnectedObserver), this.getScene().gamepadManager.onGamepadDisconnectedObservable.remove(this._onGamepadDisconnectedObserver), t.prototype.detachControl.call(this, e), this._attached = !1, this.getEngine().disableVR()
        }, i.prototype.getClassName = function() {
            return "WebVRFreeCamera"
        }, i.prototype.resetToCurrentRotation = function() {
            this._vrDevice.resetPose()
        }, i.prototype._updateRigCameras = function() {
            var e = this._rigCameras[0],
                t = this._rigCameras[1];
            e.rotationQuaternion.copyFrom(this._deviceRoomRotationQuaternion), t.rotationQuaternion.copyFrom(this._deviceRoomRotationQuaternion), e.position.copyFrom(this._deviceRoomPosition), t.position.copyFrom(this._deviceRoomPosition)
        }, i.prototype._updateCache = function(i) {
            var r = this;
            this.rotationQuaternion.equals(this._cache.rotationQuaternion) && this.position.equals(this._cache.position) || (this.updateCacheCalled || (this.updateCacheCalled = !0, this.update()), this.rotationQuaternion.toRotationMatrix(this._workingMatrix), e.Vector3.TransformCoordinatesToRef(this._deviceRoomPosition, this._workingMatrix, this._workingVector), this.devicePosition.subtractToRef(this._workingVector, this._workingVector), e.Matrix.ComposeToRef(this._oneVector, this.rotationQuaternion, this._workingVector, this._deviceToWorld), this._deviceToWorld.getTranslationToRef(this._workingVector), this._workingVector.addInPlace(this.position), this._workingVector.subtractInPlace(this._cache.position), this._deviceToWorld.setTranslation(this._workingVector), this._deviceToWorld.invertToRef(this._worldToDevice), this.controllers.forEach((function(e) {
                e._deviceToWorld.copyFrom(r._deviceToWorld), e.update()
            }))), i || t.prototype._updateCache.call(this), this.updateCacheCalled = !1
        }, i.prototype.update = function() {
            e.Vector3.TransformCoordinatesToRef(this._deviceRoomPosition, this._deviceToWorld, this.devicePosition), e.Matrix.FromQuaternionToRef(this._deviceRoomRotationQuaternion, this._workingMatrix), this._workingMatrix.multiplyToRef(this._deviceToWorld, this._workingMatrix), e.Quaternion.FromRotationMatrixToRef(this._workingMatrix, this.deviceRotationQuaternion), t.prototype.update.call(this)
        }, i.prototype._getViewMatrix = function() {
            return e.Matrix.Identity()
        }, i.prototype._getWebVRViewMatrix = function() {
            var t = this,
                i = this._cameraRigParams.parentCamera;
            i._updateCache();
            var r = this._cameraRigParams.left ? this._cameraRigParams.frameData.leftViewMatrix : this._cameraRigParams.frameData.rightViewMatrix;
            return e.Matrix.FromArrayToRef(r, 0, this._webvrViewMatrix), this.getScene().useRightHandedSystem || [2, 6, 8, 9, 14].forEach((function(e) {
                t._webvrViewMatrix.m[e] *= -1
            })), this._webvrViewMatrix.getRotationMatrixToRef(this._cameraRotationMatrix), e.Vector3.TransformCoordinatesToRef(this._referencePoint, this._cameraRotationMatrix, this._transformedReferencePoint), this.position.addToRef(this._transformedReferencePoint, this._currentTarget), 1 !== i.deviceScaleFactor && (this._webvrViewMatrix.invert(), i.deviceScaleFactor && (this._webvrViewMatrix.m[12] *= i.deviceScaleFactor, this._webvrViewMatrix.m[13] *= i.deviceScaleFactor, this._webvrViewMatrix.m[14] *= i.deviceScaleFactor), this._webvrViewMatrix.invert()), i._worldToDevice.multiplyToRef(this._webvrViewMatrix, this._webvrViewMatrix), this._webvrViewMatrix
        }, i.prototype._getWebVRProjectionMatrix = function() {
            var t = this,
                i = this.parent;
            i._vrDevice.depthNear = i.minZ, i._vrDevice.depthFar = i.maxZ;
            var r = this._cameraRigParams.left ? this._cameraRigParams.frameData.leftProjectionMatrix : this._cameraRigParams.frameData.rightProjectionMatrix;
            return e.Matrix.FromArrayToRef(r, 0, this._projectionMatrix), this.getScene().useRightHandedSystem || [8, 9, 10, 11].forEach((function(e) {
                t._projectionMatrix.m[e] *= -1
            })), this._projectionMatrix
        }, i.prototype.initControllers = function() {
            var t = this;
            this.controllers = [];
            var i = this.getScene().gamepadManager;
            this._onGamepadDisconnectedObserver = i.onGamepadDisconnectedObservable.add((function(i) {
                if (i.type === e.Gamepad.POSE_ENABLED) {
                    var r = i;
                    r.defaultModel && r.defaultModel.setEnabled(!1), "right" === r.hand && (t._rightController = null), "left" === r.hand && (t._leftController = null);
                    var n = t.controllers.indexOf(r); - 1 !== n && t.controllers.splice(n, 1)
                }
            })), this._onGamepadConnectedObserver = i.onGamepadConnectedObservable.add((function(i) {
                if (i.type === e.Gamepad.POSE_ENABLED) {
                    var r = i;
                    if (r._deviceToWorld.copyFrom(t._deviceToWorld), t.webVROptions.controllerMeshes && (r.defaultModel ? r.defaultModel.setEnabled(!0) : r.initControllerMesh(t.getScene(), (function(i) {
                            if (t.onControllerMeshLoadedObservable.notifyObservers(r), t.webVROptions.defaultLightingOnControllers) {
                                t._lightOnControllers || (t._lightOnControllers = new e.HemisphericLight("vrControllersLight", new e.Vector3(0, 1, 0), t.getScene()));
                                var n = function(e, t) {
                                    var i = e.getChildren();
                                    0 !== i.length && i.forEach((function(e) {
                                        t.includedOnlyMeshes.push(e), n(e, t)
                                    }))
                                };
                                t._lightOnControllers.includedOnlyMeshes.push(i), n(i, t._lightOnControllers)
                            }
                        }))), r.attachToPoseControlledCamera(t), -1 === t.controllers.indexOf(r)) {
                        t.controllers.push(r);
                        for (var n = !1, o = 0; o < t.controllers.length; o++) t.controllers[o].controllerType === e.PoseEnabledControllerType.VIVE && (n ? t.controllers[o].hand = "right" : (n = !0, t.controllers[o].hand = "left"));
                        t.controllers.length >= 2 && t.onControllersAttachedObservable.notifyObservers(t.controllers)
                    }
                }
            }))
        }, i
    })(e.FreeCamera);
    e.WebVRFreeCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n) {
            var o = t.call(this, i, r, n) || this;
            return o._quaternionCache = new e.Quaternion, o.inputs.addDeviceOrientation(), o
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "DeviceOrientationCamera"
        }, i.prototype._checkInputs = function() {
            t.prototype._checkInputs.call(this), this._quaternionCache.copyFrom(this.rotationQuaternion), this._initialQuaternion && this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion)
        }, i.prototype.resetToCurrentRotation = function(t) {
            var i = this;
            void 0 === t && (t = e.Axis.Y), this.rotationQuaternion && (this._initialQuaternion || (this._initialQuaternion = new e.Quaternion), this._initialQuaternion.copyFrom(this._quaternionCache || this.rotationQuaternion), ["x", "y", "z"].forEach((function(e) {
                t[e] ? i._initialQuaternion[e] *= -1 : i._initialQuaternion[e] = 0
            })), this._initialQuaternion.normalize(), this._initialQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion))
        }, i
    })(e.FreeCamera);
    e.DeviceOrientationCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o, s) {
            void 0 === o && (o = !0), void 0 === s && (s = e.VRCameraMetrics.GetDefault());
            var a = t.call(this, i, r, n) || this;
            return s.compensateDistortion = o, a.setCameraRigMode(e.Camera.RIG_MODE_VR, {
                vrCameraMetrics: s
            }), a
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "VRDeviceOrientationFreeCamera"
        }, i
    })(e.DeviceOrientationCamera);
    e.VRDeviceOrientationFreeCamera = t;
    var i = (function(t) {
        function i(i, r, n, o, s) {
            void 0 === o && (o = !0), void 0 === s && (s = e.VRCameraMetrics.GetDefault());
            var a = t.call(this, i, r, n, o, s) || this;
            return a.inputs.addGamepad(), a
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "VRDeviceOrientationGamepadCamera"
        }, i
    })(t);
    e.VRDeviceOrientationGamepadCamera = i;
    var r = (function(t) {
        function i(i, r, n, o, s, a, l, c) {
            void 0 === l && (l = !0), void 0 === c && (c = e.VRCameraMetrics.GetDefault());
            var h = t.call(this, i, r, n, o, s, a) || this;
            return c.compensateDistortion = l, h.setCameraRigMode(e.Camera.RIG_MODE_VR, {
                vrCameraMetrics: c
            }), h.inputs.addVRDeviceOrientation(), h
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "VRDeviceOrientationArcRotateCamera"
        }, i
    })(e.ArcRotateCamera);
    e.VRDeviceOrientationArcRotateCamera = r
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, r, o) || this;
            return s.interaxialDistance = n, s.setCameraRigMode(e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH, {
                interaxialDistance: n
            }), s
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "AnaglyphFreeCamera"
        }, i
    })(e.FreeCamera);
    e.AnaglyphFreeCamera = t;
    var i = (function(t) {
        function i(i, r, n, o, s, a, l) {
            var c = t.call(this, i, r, n, o, s, l) || this;
            return c.interaxialDistance = a, c.setCameraRigMode(e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH, {
                interaxialDistance: a
            }), c
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "AnaglyphArcRotateCamera"
        }, i
    })(e.ArcRotateCamera);
    e.AnaglyphArcRotateCamera = i;
    var r = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, r, o) || this;
            return s.interaxialDistance = n, s.setCameraRigMode(e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH, {
                interaxialDistance: n
            }), s
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "AnaglyphGamepadCamera"
        }, i
    })(e.GamepadCamera);
    e.AnaglyphGamepadCamera = r;
    var n = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, r, o) || this;
            return s.interaxialDistance = n, s.setCameraRigMode(e.Camera.RIG_MODE_STEREOSCOPIC_ANAGLYPH, {
                interaxialDistance: n
            }), s
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "AnaglyphUniversalCamera"
        }, i
    })(e.UniversalCamera);
    e.AnaglyphUniversalCamera = n;
    var o = (function(t) {
        function i(i, r, n, o, s) {
            var a = t.call(this, i, r, s) || this;
            return a.interaxialDistance = n, a.isStereoscopicSideBySide = o, a.setCameraRigMode(o ? e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL : e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER, {
                interaxialDistance: n
            }), a
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "StereoscopicFreeCamera"
        }, i
    })(e.FreeCamera);
    e.StereoscopicFreeCamera = o;
    var s = (function(t) {
        function i(i, r, n, o, s, a, l, c) {
            var h = t.call(this, i, r, n, o, s, c) || this;
            return h.interaxialDistance = a, h.isStereoscopicSideBySide = l, h.setCameraRigMode(l ? e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL : e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER, {
                interaxialDistance: a
            }), h
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "StereoscopicArcRotateCamera"
        }, i
    })(e.ArcRotateCamera);
    e.StereoscopicArcRotateCamera = s;
    var a = (function(t) {
        function i(i, r, n, o, s) {
            var a = t.call(this, i, r, s) || this;
            return a.interaxialDistance = n, a.isStereoscopicSideBySide = o, a.setCameraRigMode(o ? e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL : e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER, {
                interaxialDistance: n
            }), a
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "StereoscopicGamepadCamera"
        }, i
    })(e.GamepadCamera);
    e.StereoscopicGamepadCamera = a;
    var l = (function(t) {
        function i(i, r, n, o, s) {
            var a = t.call(this, i, r, s) || this;
            return a.interaxialDistance = n, a.isStereoscopicSideBySide = o, a.setCameraRigMode(o ? e.Camera.RIG_MODE_STEREOSCOPIC_SIDEBYSIDE_PARALLEL : e.Camera.RIG_MODE_STEREOSCOPIC_OVERUNDER, {
                interaxialDistance: n
            }), a
        }
        return __extends(i, t), i.prototype.getClassName = function() {
            return "StereoscopicUniversalCamera"
        }, i
    })(e.UniversalCamera);
    e.StereoscopicUniversalCamera = l
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
            function t(i, r) {
                if (void 0 === r && (r = null), this.scene = i, this._pointerDownOnMeshAsked = !1, this._isActionableMesh = !1, this._teleportationRequestInitiated = !1, this._teleportationBackRequestInitiated = !1, this._dpadPressed = !0, this._activePointer = !1, this._id = t._idCounter++, r) this._gazeTracker = r.clone("gazeTracker");
                else {
                    this._gazeTracker = e.Mesh.CreateTorus("gazeTracker", .0035, .0025, 20, i, !1), this._gazeTracker.bakeCurrentTransformIntoVertices(), this._gazeTracker.isPickable = !1, this._gazeTracker.isVisible = !1;
                    var n = new e.StandardMaterial("targetMat", i);
                    n.specularColor = e.Color3.Black(), n.emissiveColor = new e.Color3(.7, .7, .7), n.backFaceCulling = !1, this._gazeTracker.material = n
                }
            }
            return t.prototype._getForwardRay = function(t) {
                return new e.Ray(e.Vector3.Zero(), new e.Vector3(0, 0, t))
            }, t.prototype._selectionPointerDown = function() {
                this._pointerDownOnMeshAsked = !0, this._currentMeshSelected && this._currentHit && this.scene.simulatePointerDown(this._currentHit, {
                    pointerId: this._id
                })
            }, t.prototype._selectionPointerUp = function() {
                this._currentMeshSelected && this._currentHit && this.scene.simulatePointerUp(this._currentHit, {
                    pointerId: this._id
                }), this._pointerDownOnMeshAsked = !1
            }, t.prototype._activatePointer = function() {
                this._activePointer = !0
            }, t.prototype._deactivatePointer = function() {
                this._activePointer = !1
            }, t.prototype._updatePointerDistance = function(e) {}, t.prototype.dispose = function() {
                this._interactionsEnabled = !1, this._teleportationEnabled = !1
            }, t._idCounter = 0, t
        })(),
        i = (function(t) {
            function i(i, r, n) {
                var o = t.call(this, r, n) || this;
                o.webVRController = i, o._laserPointer = e.Mesh.CreateCylinder("laserPointer", 1, .004, 2e-4, 20, 1, r, !1);
                var s = new e.StandardMaterial("laserPointerMat", r);
                return s.emissiveColor = new e.Color3(.7, .7, .7), s.alpha = .6, o._laserPointer.material = s, o._laserPointer.rotation.x = Math.PI / 2, o._laserPointer.position.z = -.5, o._laserPointer.isVisible = !1, o._laserPointer.parent = i.mesh, o
            }
            return __extends(i, t), i.prototype._getForwardRay = function(e) {
                return this.webVRController.getForwardRay(e)
            }, i.prototype._activatePointer = function() {
                t.prototype._activatePointer.call(this), this._laserPointer.isVisible = !0
            }, i.prototype._deactivatePointer = function() {
                t.prototype._deactivatePointer.call(this), this._laserPointer.isVisible = !1
            }, i.prototype._setLaserPointerColor = function(e) {
                this._laserPointer.material.emissiveColor = e
            }, i.prototype._setLaserPointerParent = function(e) {
                this._laserPointer.parent = e
            }, i.prototype._updatePointerDistance = function(e) {
                this._laserPointer.scaling.y = e, this._laserPointer.position.z = -e / 2
            }, i.prototype.dispose = function() {
                t.prototype.dispose.call(this), this._laserPointer.dispose()
            }, i
        })(t),
        r = (function(t) {
            function i(e, i) {
                var r = t.call(this, i) || this;
                return r.getCamera = e, r
            }
            return __extends(i, t), i.prototype._getForwardRay = function(t) {
                var i = this.getCamera();
                return i ? i.getForwardRay(t) : new e.Ray(e.Vector3.Zero(), e.Vector3.Forward())
            }, i
        })(t),
        n = (function() {
            function t(t, n) {
                void 0 === n && (n = {});
                var o = this;
                if (this.webVROptions = n, this._webVRsupported = !1, this._webVRready = !1, this._webVRrequesting = !1, this._webVRpresenting = !1, this._fullscreenVRpresenting = !1, this.onEnteringVRObservable = new e.Observable, this.onExitingVRObservable = new e.Observable, this.onControllerMeshLoadedObservable = new e.Observable, this._useCustomVRButton = !1, this._teleportationRequested = !1, this._teleportActive = !1, this._floorMeshesCollection = [], this._rotationAllowed = !0, this._teleportBackwardsVector = new e.Vector3(0, -1, -1), this._rotationRightAsked = !1, this._rotationLeftAsked = !1, this._isDefaultTeleportationTarget = !0, this._teleportationFillColor = "#444444", this._teleportationBorderColor = "#FFFFFF", this._rotationAngle = 0, this._haloCenter = new e.Vector3(0, 0, 0), this._padSensibilityUp = .65, this._padSensibilityDown = .35, this.leftController = null, this.rightController = null, this.onNewMeshSelected = new e.Observable, this.onNewMeshPicked = new e.Observable, this.onBeforeCameraTeleport = new e.Observable, this.onAfterCameraTeleport = new e.Observable, this.onSelectedMeshUnselected = new e.Observable, this.teleportationEnabled = !0, this._teleportationInitialized = !1, this._interactionsEnabled = !1, this._interactionsRequested = !1, this._displayGaze = !0, this._displayLaserPointer = !0, this._onResize = function() {
                        o.moveButtonToBottomRight(), o._fullscreenVRpresenting && o._webVRready && o.exitVR()
                    }, this._onFullscreenChange = function() {
                        void 0 !== document.fullscreen ? o._fullscreenVRpresenting = document.fullscreen : void 0 !== document.mozFullScreen ? o._fullscreenVRpresenting = document.mozFullScreen : void 0 !== document.webkitIsFullScreen ? o._fullscreenVRpresenting = document.webkitIsFullScreen : void 0 !== document.msIsFullScreen && (o._fullscreenVRpresenting = document.msIsFullScreen), !o._fullscreenVRpresenting && o._canvas && (o.exitVR(), o._useCustomVRButton || (o._btnVR.style.top = o._canvas.offsetTop + o._canvas.offsetHeight - 70 + "px", o._btnVR.style.left = o._canvas.offsetLeft + o._canvas.offsetWidth - 100 + "px"))
                    }, this.beforeRender = function() {
                        o.leftController && o.leftController._activePointer && o._castRayAndSelectObject(o.leftController), o.rightController && o.rightController._activePointer && o._castRayAndSelectObject(o.rightController), o.leftController && o.leftController._activePointer || o.rightController && o.rightController._activePointer ? o._cameraGazer._gazeTracker.isVisible = !1 : o._castRayAndSelectObject(o._cameraGazer)
                    }, this._onNewGamepadConnected = function(t) {
                        if (t.type !== e.Gamepad.POSE_ENABLED) t.leftStick && t.onleftstickchanged((function(e) {
                            o._teleportationInitialized && o.teleportationEnabled && (!o.leftController && !o.rightController || o.leftController && !o.leftController._activePointer && o.rightController && !o.rightController._activePointer) && (o._checkTeleportWithRay(e, o._cameraGazer), o._checkTeleportBackwards(e, o._cameraGazer))
                        })), t.rightStick && t.onrightstickchanged((function(e) {
                            o._teleportationInitialized && o._checkRotate(e, o._cameraGazer)
                        })), t.type === e.Gamepad.XBOX && (t.onbuttondown((function(t) {
                            o._interactionsEnabled && t === e.Xbox360Button.A && o._cameraGazer._selectionPointerDown()
                        })), t.onbuttonup((function(t) {
                            o._interactionsEnabled && t === e.Xbox360Button.A && o._cameraGazer._selectionPointerUp()
                        })));
                        else {
                            var r = t,
                                n = new i(r, o._scene, o._cameraGazer._gazeTracker);
                            "right" === r.hand || o.leftController && o.leftController.webVRController != r ? o.rightController = n : o.leftController = n, o._tryEnableInteractionOnController(n)
                        }
                    }, this._tryEnableInteractionOnController = function(e) {
                        o._interactionsRequested && !e._interactionsEnabled && o._enableInteractionOnController(e), o._teleportationRequested && !e._teleportationEnabled && o._enableTeleportationOnController(e)
                    }, this._onNewGamepadDisconnected = function(t) {
                        t instanceof e.WebVRController && ("left" === t.hand && null != o.leftController && (o.leftController.dispose(), o.leftController = null), "right" === t.hand && null != o.rightController && (o.rightController.dispose(), o.rightController = null))
                    }, this._workingVector = e.Vector3.Zero(), this._workingQuaternion = e.Quaternion.Identity(), this._workingMatrix = e.Matrix.Identity(), this._scene = t, this._canvas = t.getEngine().getRenderingCanvas(), void 0 === n.createFallbackVRDeviceOrientationFreeCamera && (n.createFallbackVRDeviceOrientationFreeCamera = !0),
                    void 0 === n.createDeviceOrientationCamera && (n.createDeviceOrientationCamera = !0), void 0 === n.defaultHeight && (n.defaultHeight = 1.7), n.useCustomVRButton && (this._useCustomVRButton = !0, n.customVRButton && (this._btnVR = n.customVRButton)), n.rayLength && (this._rayLength = n.rayLength), this._defaultHeight = n.defaultHeight, this._scene.activeCamera ? this._position = this._scene.activeCamera.position.clone() : this._position = new e.Vector3(0, this._defaultHeight, 0), n.createDeviceOrientationCamera || !this._scene.activeCamera) {
                    if (this._deviceOrientationCamera = new e.DeviceOrientationCamera("deviceOrientationVRHelper", this._position.clone(), t), this._scene.activeCamera && (this._deviceOrientationCamera.minZ = this._scene.activeCamera.minZ, this._deviceOrientationCamera.maxZ = this._scene.activeCamera.maxZ, this._scene.activeCamera instanceof e.TargetCamera && this._scene.activeCamera.rotation)) {
                        var s = this._scene.activeCamera;
                        s.rotationQuaternion ? this._deviceOrientationCamera.rotationQuaternion.copyFrom(s.rotationQuaternion) : this._deviceOrientationCamera.rotationQuaternion.copyFrom(e.Quaternion.RotationYawPitchRoll(s.rotation.y, s.rotation.x, s.rotation.z)), this._deviceOrientationCamera.rotation = s.rotation.clone()
                    }
                    this._scene.activeCamera = this._deviceOrientationCamera, this._canvas && this._scene.activeCamera.attachControl(this._canvas)
                } else this._existingCamera = this._scene.activeCamera;
                if (n.createFallbackVRDeviceOrientationFreeCamera && (this._vrDeviceOrientationCamera = new e.VRDeviceOrientationFreeCamera("VRDeviceOrientationVRHelper", this._position, this._scene)), this._webVRCamera = new e.WebVRFreeCamera("WebVRHelper", this._position, this._scene, n), this._webVRCamera.useStandingMatrix(), !this._useCustomVRButton) {
                    this._btnVR = document.createElement("BUTTON"), this._btnVR.className = "babylonVRicon", this._btnVR.id = "babylonVRiconbtn", this._btnVR.title = "Click to switch to VR";
                    var a = ".babylonVRicon { position: absolute; right: 20px; height: 50px; width: 80px; background-color: rgba(51,51,51,0.7); background-image: url(data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%222048%22%20height%3D%221152%22%20viewBox%3D%220%200%202048%201152%22%20version%3D%221.1%22%3E%3Cpath%20transform%3D%22rotate%28180%201024%2C576.0000000000001%29%22%20d%3D%22m1109%2C896q17%2C0%2030%2C-12t13%2C-30t-12.5%2C-30.5t-30.5%2C-12.5l-170%2C0q-18%2C0%20-30.5%2C12.5t-12.5%2C30.5t13%2C30t30%2C12l170%2C0zm-85%2C256q59%2C0%20132.5%2C-1.5t154.5%2C-5.5t164.5%2C-11.5t163%2C-20t150%2C-30t124.5%2C-41.5q23%2C-11%2042%2C-24t38%2C-30q27%2C-25%2041%2C-61.5t14%2C-72.5l0%2C-257q0%2C-123%20-47%2C-232t-128%2C-190t-190%2C-128t-232%2C-47l-81%2C0q-37%2C0%20-68.5%2C14t-60.5%2C34.5t-55.5%2C45t-53%2C45t-53%2C34.5t-55.5%2C14t-55.5%2C-14t-53%2C-34.5t-53%2C-45t-55.5%2C-45t-60.5%2C-34.5t-68.5%2C-14l-81%2C0q-123%2C0%20-232%2C47t-190%2C128t-128%2C190t-47%2C232l0%2C257q0%2C68%2038%2C115t97%2C73q54%2C24%20124.5%2C41.5t150%2C30t163%2C20t164.5%2C11.5t154.5%2C5.5t132.5%2C1.5zm939%2C-298q0%2C39%20-24.5%2C67t-58.5%2C42q-54%2C23%20-122%2C39.5t-143.5%2C28t-155.5%2C19t-157%2C11t-148.5%2C5t-129.5%2C1.5q-59%2C0%20-130%2C-1.5t-148%2C-5t-157%2C-11t-155.5%2C-19t-143.5%2C-28t-122%2C-39.5q-34%2C-14%20-58.5%2C-42t-24.5%2C-67l0%2C-257q0%2C-106%2040.5%2C-199t110%2C-162.5t162.5%2C-109.5t199%2C-40l81%2C0q27%2C0%2052%2C14t50%2C34.5t51%2C44.5t55.5%2C44.5t63.5%2C34.5t74%2C14t74%2C-14t63.5%2C-34.5t55.5%2C-44.5t51%2C-44.5t50%2C-34.5t52%2C-14l14%2C0q37%2C0%2070%2C0.5t64.5%2C4.5t63.5%2C12t68%2C23q71%2C30%20128.5%2C78.5t98.5%2C110t63.5%2C133.5t22.5%2C149l0%2C257z%22%20fill%3D%22white%22%20/%3E%3C/svg%3E%0A); background-size: 80%; background-repeat:no-repeat; background-position: center; border: none; outline: none; transition: transform 0.125s ease-out } .babylonVRicon:hover { transform: scale(1.05) } .babylonVRicon:active {background-color: rgba(51,51,51,1) } .babylonVRicon:focus {background-color: rgba(51,51,51,1) }";
                    a += ".babylonVRicon.vrdisplaypresenting { display: none; }";
                    var l = document.createElement("style");
                    l.appendChild(document.createTextNode(a)), document.getElementsByTagName("head")[0].appendChild(l), this.moveButtonToBottomRight()
                }
                this._btnVR && this._btnVR.addEventListener("click", (function() {
                    o.isInVRMode ? o.exitVR() : o.enterVR()
                })), window.addEventListener("resize", this._onResize), document.addEventListener("fullscreenchange", this._onFullscreenChange, !1), document.addEventListener("mozfullscreenchange", this._onFullscreenChange, !1), document.addEventListener("webkitfullscreenchange", this._onFullscreenChange, !1), document.addEventListener("msfullscreenchange", this._onFullscreenChange, !1), n.createFallbackVRDeviceOrientationFreeCamera ? this.displayVRButton() : this._scene.getEngine().onVRDisplayChangedObservable.add((function(e) {
                    e.vrDisplay && o.displayVRButton()
                })), this._onKeyDown = function(e) {
                    27 === e.keyCode && o.isInVRMode && o.exitVR()
                }, document.addEventListener("keydown", this._onKeyDown), this._scene.onPrePointerObservable.add((function(e, t) {
                    o.isInVRMode && (o.exitVR(), o._fullscreenVRpresenting && o._scene.getEngine().switchFullscreen(!0))
                }), e.PointerEventTypes.POINTERDOUBLETAP, !1), this._onVRDisplayChanged = function(e) {
                    return o.onVRDisplayChanged(e)
                }, this._onVrDisplayPresentChange = function() {
                    return o.onVrDisplayPresentChange()
                }, this._onVRRequestPresentStart = function() {
                    o._webVRrequesting = !0, o.updateButtonVisibility()
                }, this._onVRRequestPresentComplete = function(e) {
                    o._webVRrequesting = !1, o.updateButtonVisibility()
                }, t.getEngine().onVRDisplayChangedObservable.add(this._onVRDisplayChanged), t.getEngine().onVRRequestPresentStart.add(this._onVRRequestPresentStart), t.getEngine().onVRRequestPresentComplete.add(this._onVRRequestPresentComplete), window.addEventListener("vrdisplaypresentchange", this._onVrDisplayPresentChange), t.onDisposeObservable.add((function() {
                    o.dispose()
                })), this._webVRCamera.onControllerMeshLoadedObservable.add((function(e) {
                    return o._onDefaultMeshLoaded(e)
                })), this._scene.gamepadManager.onGamepadConnectedObservable.add(this._onNewGamepadConnected), this._scene.gamepadManager.onGamepadDisconnectedObservable.add(this._onNewGamepadDisconnected), this.updateButtonVisibility(), this._circleEase = new e.CircleEase, this._circleEase.setEasingMode(e.EasingFunction.EASINGMODE_EASEINOUT), this._cameraGazer = new r(function() {
                    return o.currentVRCamera
                }, t)
            }
            return Object.defineProperty(t.prototype, "onEnteringVR", {
                get: function() {
                    return this.onEnteringVRObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "onExitingVR", {
                get: function() {
                    return this.onExitingVRObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "onControllerMeshLoaded", {
                get: function() {
                    return this.onControllerMeshLoadedObservable
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "teleportationTarget", {
                get: function() {
                    return this._teleportationTarget
                },
                set: function(e) {
                    e && (e.name = "teleportationTarget", this._isDefaultTeleportationTarget = !1, this._teleportationTarget = e)
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "gazeTrackerMesh", {
                get: function() {
                    return this._cameraGazer._gazeTracker
                },
                set: function(e) {
                    e && (this._cameraGazer._gazeTracker = e, this._cameraGazer._gazeTracker.bakeCurrentTransformIntoVertices(), this._cameraGazer._gazeTracker.isPickable = !1, this._cameraGazer._gazeTracker.isVisible = !1, this._cameraGazer._gazeTracker.name = "gazeTracker", this.leftController && (this.leftController._gazeTracker = this._cameraGazer._gazeTracker.clone("gazeTracker")), this.rightController && (this.rightController._gazeTracker = this._cameraGazer._gazeTracker.clone("gazeTracker")))
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "displayGaze", {
                get: function() {
                    return this._displayGaze
                },
                set: function(e) {
                    this._displayGaze = e, e || (this._cameraGazer._gazeTracker.isVisible = !1, this.leftController && (this.leftController._gazeTracker.isVisible = !1), this.rightController && (this.rightController._gazeTracker.isVisible = !1))
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "displayLaserPointer", {
                get: function() {
                    return this._displayLaserPointer
                },
                set: function(e) {
                    this._displayLaserPointer = e, e ? this.rightController ? this.rightController._activatePointer() : this.leftController && this.leftController._activatePointer() : (this.rightController && (this.rightController._deactivatePointer(), this.rightController._gazeTracker.isVisible = !1), this.leftController && (this.leftController._deactivatePointer(), this.leftController._gazeTracker.isVisible = !1))
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "deviceOrientationCamera", {
                get: function() {
                    return this._deviceOrientationCamera
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "currentVRCamera", {
                get: function() {
                    return this._webVRready ? this._webVRCamera : this._scene.activeCamera
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "webVRCamera", {
                get: function() {
                    return this._webVRCamera
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "vrDeviceOrientationCamera", {
                get: function() {
                    return this._vrDeviceOrientationCamera
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "_teleportationRequestInitiated", {
                get: function() {
                    return this._cameraGazer._teleportationRequestInitiated || null !== this.leftController && this.leftController._teleportationRequestInitiated || null !== this.rightController && this.rightController._teleportationRequestInitiated
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype._onDefaultMeshLoaded = function(t) {
                this.leftController && this.leftController.webVRController == t && this._tryEnableInteractionOnController(this.leftController), this.rightController && this.rightController.webVRController == t && this._tryEnableInteractionOnController(this.rightController);
                try {
                    this.onControllerMeshLoadedObservable.notifyObservers(t)
                } catch (t) {
                    e.Tools.Warn("Error in your custom logic onControllerMeshLoaded: " + t)
                }
            }, Object.defineProperty(t.prototype, "isInVRMode", {
                get: function() {
                    return this._webVRpresenting || this._fullscreenVRpresenting
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.onVrDisplayPresentChange = function() {
                var t = this._scene.getEngine().getVRDevice();
                if (t) {
                    var i = this._webVRpresenting;
                    this._webVRpresenting = t.isPresenting, i && !this._webVRpresenting && this.exitVR()
                } else e.Tools.Warn("Detected VRDisplayPresentChange on an unknown VRDisplay. Did you can enterVR on the vrExperienceHelper?");
                this.updateButtonVisibility()
            }, t.prototype.onVRDisplayChanged = function(e) {
                this._webVRsupported = e.vrSupported, this._webVRready = !!e.vrDisplay, this._webVRpresenting = e.vrDisplay && e.vrDisplay.isPresenting, this.updateButtonVisibility()
            }, t.prototype.moveButtonToBottomRight = function() {
                this._canvas && !this._useCustomVRButton && (this._btnVR.style.top = this._canvas.offsetTop + this._canvas.offsetHeight - 70 + "px", this._btnVR.style.left = this._canvas.offsetLeft + this._canvas.offsetWidth - 100 + "px")
            }, t.prototype.displayVRButton = function() {
                this._useCustomVRButton || this._btnVRDisplayed || (document.body.appendChild(this._btnVR), this._btnVRDisplayed = !0)
            }, t.prototype.updateButtonVisibility = function() {
                this._btnVR && !this._useCustomVRButton && (this._btnVR.className = "babylonVRicon", this.isInVRMode ? this._btnVR.className += " vrdisplaypresenting" : (this._webVRready && (this._btnVR.className += " vrdisplayready"), this._webVRsupported && (this._btnVR.className += " vrdisplaysupported"), this._webVRrequesting && (this._btnVR.className += " vrdisplayrequesting")))
            }, t.prototype.enterVR = function() {
                if (this.onEnteringVRObservable) try {
                    this.onEnteringVRObservable.notifyObservers(this)
                } catch (t) {
                    e.Tools.Warn("Error in your custom logic onEnteringVR: " + t)
                }
                this._scene.activeCamera && (this._position = this._scene.activeCamera.position.clone(), this._existingCamera = this._scene.activeCamera), this._webVRrequesting || (this._webVRready ? this._webVRpresenting || (this._webVRCamera.position = this._position, this._scene.activeCamera = this._webVRCamera) : this._vrDeviceOrientationCamera && (this._vrDeviceOrientationCamera.position = this._position, this._scene.activeCamera = this._vrDeviceOrientationCamera, this._scene.getEngine().switchFullscreen(!0), this.updateButtonVisibility()), this._scene.activeCamera && this._canvas && this._scene.activeCamera.attachControl(this._canvas), this._interactionsEnabled && this._scene.registerBeforeRender(this.beforeRender))
            }, t.prototype.exitVR = function() {
                if (this.onExitingVRObservable) try {
                    this.onExitingVRObservable.notifyObservers(this)
                } catch (t) {
                    e.Tools.Warn("Error in your custom logic onExitingVR: " + t)
                }
                this._webVRpresenting && this._scene.getEngine().disableVR(), this._scene.activeCamera && (this._position = this._scene.activeCamera.position.clone()), this._deviceOrientationCamera ? (this._deviceOrientationCamera.position = this._position, this._scene.activeCamera = this._deviceOrientationCamera, this._canvas && this._scene.activeCamera.attachControl(this._canvas)) : this._existingCamera && (this._existingCamera.position = this._position, this._scene.activeCamera = this._existingCamera), this.updateButtonVisibility(), this._interactionsEnabled && this._scene.unregisterBeforeRender(this.beforeRender)
            }, Object.defineProperty(t.prototype, "position", {
                get: function() {
                    return this._position
                },
                set: function(e) {
                    this._position = e, this._scene.activeCamera && (this._scene.activeCamera.position = e)
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.enableInteractions = function() {
                var e = this;
                this._interactionsEnabled || (this._interactionsRequested = !0, this.leftController && this._enableInteractionOnController(this.leftController), this.rightController && this._enableInteractionOnController(this.rightController), this.raySelectionPredicate = function(e) {
                    return e.isVisible
                }, this.meshSelectionPredicate = function(e) {
                    return !0
                }, this._raySelectionPredicate = function(t) {
                    return !!(e._isTeleportationFloor(t) || -1 === t.name.indexOf("gazeTracker") && -1 === t.name.indexOf("teleportationTarget") && -1 === t.name.indexOf("torusTeleportation") && -1 === t.name.indexOf("laserPointer")) && e.raySelectionPredicate(t)
                }, this._interactionsEnabled = !0)
            }, t.prototype._isTeleportationFloor = function(e) {
                for (var t = 0; t < this._floorMeshesCollection.length; t++)
                    if (this._floorMeshesCollection[t].id === e.id) return !0;
                return !(!this._floorMeshName || e.name !== this._floorMeshName)
            }, t.prototype.addFloorMesh = function(e) {
                this._floorMeshesCollection && (this._floorMeshesCollection.indexOf(e) > -1 || this._floorMeshesCollection.push(e))
            }, t.prototype.removeFloorMesh = function(e) {
                if (this._floorMeshesCollection) {
                    var t = this._floorMeshesCollection.indexOf(e); - 1 !== t && this._floorMeshesCollection.splice(t, 1)
                }
            }, t.prototype.enableTeleportation = function(t) {
                if (void 0 === t && (t = {}), !this._teleportationInitialized) {
                    this._teleportationRequested = !0, this.enableInteractions(), t.floorMeshName && (this._floorMeshName = t.floorMeshName), t.floorMeshes && (this._floorMeshesCollection = t.floorMeshes), null != this.leftController && this._enableTeleportationOnController(this.leftController), null != this.rightController && this._enableTeleportationOnController(this.rightController);
                    var i = new e.ImageProcessingConfiguration;
                    i.vignetteColor = new e.Color4(0, 0, 0, 0), i.vignetteEnabled = !0, this._postProcessMove = new e.ImageProcessingPostProcess("postProcessMove", 1, this._webVRCamera, void 0, void 0, void 0, void 0, i), this._webVRCamera.detachPostProcess(this._postProcessMove), this._teleportationInitialized = !0, this._isDefaultTeleportationTarget && this._createTeleportationCircles()
                }
            }, t.prototype._enableInteractionOnController = function(e) {
                var t = this,
                    i = e.webVRController.mesh;
                if (i) {
                    var r = function(e) {
                        e.name += " laserPointer", e.getChildMeshes().forEach((function(e) {
                            r(e)
                        }))
                    };
                    r(i);
                    for (var n = i.getChildMeshes(), o = 0; o < n.length; o++)
                        if (n[o].name && n[o].name.indexOf("POINTING_POSE") >= 0) {
                            i = n[o];
                            break
                        }
                    e._setLaserPointerParent(i), e._interactionsEnabled = !0, e._activatePointer(), e.webVRController.onMainButtonStateChangedObservable.add((function(i) {
                        t._displayLaserPointer && 1 === i.value && (e._activePointer ? e._deactivatePointer() : e._activatePointer(), t.displayGaze && (e._gazeTracker.isVisible = e._activePointer))
                    })), e.webVRController.onTriggerStateChangedObservable.add((function(i) {
                        e._pointerDownOnMeshAsked ? i.value < t._padSensibilityDown && e._selectionPointerUp() : i.value > t._padSensibilityUp && e._selectionPointerDown()
                    }))
                }
            }, t.prototype._checkTeleportWithRay = function(e, t) {
                this._teleportationRequestInitiated && !t._teleportationRequestInitiated || (t._teleportationRequestInitiated ? Math.sqrt(e.y * e.y + e.x * e.x) < this._padSensibilityDown && (this._teleportActive && this._teleportCamera(this._haloCenter), t._teleportationRequestInitiated = !1) : e.y < -this._padSensibilityUp && t._dpadPressed && (t._activatePointer(), t._teleportationRequestInitiated = !0))
            }, t.prototype._checkRotate = function(e, t) {
                t._teleportationRequestInitiated || (this._rotationLeftAsked ? e.x > -this._padSensibilityDown && (this._rotationLeftAsked = !1) : e.x < -this._padSensibilityUp && t._dpadPressed && (this._rotationLeftAsked = !0, this._rotationAllowed && this._rotateCamera(!1)), this._rotationRightAsked ? e.x < this._padSensibilityDown && (this._rotationRightAsked = !1) : e.x > this._padSensibilityUp && t._dpadPressed && (this._rotationRightAsked = !0, this._rotationAllowed && this._rotateCamera(!0)))
            }, t.prototype._checkTeleportBackwards = function(t, i) {
                if (!i._teleportationRequestInitiated)
                    if (t.y > this._padSensibilityUp && i._dpadPressed) {
                        if (!i._teleportationBackRequestInitiated) {
                            if (!this.currentVRCamera) return;
                            var r = e.Quaternion.FromRotationMatrix(this.currentVRCamera.getWorldMatrix().getRotationMatrix()),
                                n = this.currentVRCamera.position;
                            this.currentVRCamera.devicePosition && this.currentVRCamera.deviceRotationQuaternion && (r = this.currentVRCamera.deviceRotationQuaternion, n = this.currentVRCamera.devicePosition), r.toEulerAnglesToRef(this._workingVector), this._workingVector.z = 0, this._workingVector.x = 0, e.Quaternion.RotationYawPitchRollToRef(this._workingVector.y, this._workingVector.x, this._workingVector.z, this._workingQuaternion), this._workingQuaternion.toRotationMatrix(this._workingMatrix), e.Vector3.TransformCoordinatesToRef(this._teleportBackwardsVector, this._workingMatrix, this._workingVector);
                            var o = new e.Ray(n, this._workingVector),
                                s = this._scene.pickWithRay(o, this._raySelectionPredicate);
                            s && s.pickedPoint && s.pickedMesh && this._isTeleportationFloor(s.pickedMesh) && s.distance < 5 && this._teleportCamera(s.pickedPoint), i._teleportationBackRequestInitiated = !0
                        }
                    } else i._teleportationBackRequestInitiated = !1
            }, t.prototype._enableTeleportationOnController = function(t) {
                var i = this;
                t.webVRController.mesh && (t._interactionsEnabled || this._enableInteractionOnController(t), t._interactionsEnabled = !0, t._teleportationEnabled = !0, t.webVRController.controllerType === e.PoseEnabledControllerType.VIVE && (t._dpadPressed = !1, t.webVRController.onPadStateChangedObservable.add((function(e) {
                    t._dpadPressed = e.pressed, t._dpadPressed || (i._rotationLeftAsked = !1, i._rotationRightAsked = !1, t._teleportationBackRequestInitiated = !1)
                }))), t.webVRController.onPadValuesChangedObservable.add((function(e) {
                    i.teleportationEnabled && (i._checkTeleportBackwards(e, t), i._checkTeleportWithRay(e, t)), i._checkRotate(e, t)
                })))
            }, t.prototype._createTeleportationCircles = function() {
                this._teleportationTarget = e.Mesh.CreateGround("teleportationTarget", 2, 2, 2, this._scene), this._teleportationTarget.isPickable = !1;
                var t = new e.DynamicTexture("DynamicTexture", 512, this._scene, !0);
                t.hasAlpha = !0;
                var i = t.getContext();
                i.beginPath(), i.arc(256, 256, 200, 0, 2 * Math.PI, !1), i.fillStyle = this._teleportationFillColor, i.fill(), i.lineWidth = 10, i.strokeStyle = this._teleportationBorderColor, i.stroke(), i.closePath(), t.update();
                var r = new e.StandardMaterial("TextPlaneMaterial", this._scene);
                r.diffuseTexture = t, this._teleportationTarget.material = r;
                var n = e.Mesh.CreateTorus("torusTeleportation", .75, .1, 25, this._scene, !1);
                n.isPickable = !1, n.parent = this._teleportationTarget;
                var o = new e.Animation("animationInnerCircle", "position.y", 30, e.Animation.ANIMATIONTYPE_FLOAT, e.Animation.ANIMATIONLOOPMODE_CYCLE),
                    s = [];
                s.push({
                    frame: 0,
                    value: 0
                }), s.push({
                    frame: 30,
                    value: .4
                }), s.push({
                    frame: 60,
                    value: 0
                }), o.setKeys(s);
                var a = new e.SineEase;
                a.setEasingMode(e.EasingFunction.EASINGMODE_EASEINOUT), o.setEasingFunction(a), n.animations = [], n.animations.push(o), this._scene.beginAnimation(n, 0, 60, !0), this._hideTeleportationTarget()
            }, t.prototype._displayTeleportationTarget = function() {
                this._teleportActive = !0, this._teleportationInitialized && (this._teleportationTarget.isVisible = !0, this._isDefaultTeleportationTarget && (this._teleportationTarget.getChildren()[0].isVisible = !0))
            }, t.prototype._hideTeleportationTarget = function() {
                this._teleportActive = !1, this._teleportationInitialized && (this._teleportationTarget.isVisible = !1, this._isDefaultTeleportationTarget && (this._teleportationTarget.getChildren()[0].isVisible = !1))
            }, t.prototype._rotateCamera = function(t) {
                var i = this;
                if (this.currentVRCamera instanceof e.FreeCamera) {
                    t ? this._rotationAngle++ : this._rotationAngle--, this.currentVRCamera.animations = [];
                    var r = e.Quaternion.FromRotationMatrix(e.Matrix.RotationY(Math.PI / 4 * this._rotationAngle)),
                        n = new e.Animation("animationRotation", "rotationQuaternion", 90, e.Animation.ANIMATIONTYPE_QUATERNION, e.Animation.ANIMATIONLOOPMODE_CONSTANT),
                        o = [];
                    o.push({
                        frame: 0,
                        value: this.currentVRCamera.rotationQuaternion
                    }), o.push({
                        frame: 6,
                        value: r
                    }), n.setKeys(o), n.setEasingFunction(this._circleEase), this.currentVRCamera.animations.push(n), this._postProcessMove.animations = [];
                    var s = new e.Animation("animationPP", "vignetteWeight", 90, e.Animation.ANIMATIONTYPE_FLOAT, e.Animation.ANIMATIONLOOPMODE_CONSTANT),
                        a = [];
                    a.push({
                        frame: 0,
                        value: 0
                    }), a.push({
                        frame: 3,
                        value: 4
                    }), a.push({
                        frame: 6,
                        value: 0
                    }), s.setKeys(a), s.setEasingFunction(this._circleEase), this._postProcessMove.animations.push(s);
                    var l = new e.Animation("animationPP2", "vignetteStretch", 90, e.Animation.ANIMATIONTYPE_FLOAT, e.Animation.ANIMATIONLOOPMODE_CONSTANT),
                        c = [];
                    c.push({
                        frame: 0,
                        value: 0
                    }), c.push({
                        frame: 3,
                        value: 10
                    }), c.push({
                        frame: 6,
                        value: 0
                    }), l.setKeys(c), l.setEasingFunction(this._circleEase), this._postProcessMove.animations.push(l), this._postProcessMove.imageProcessingConfiguration.vignetteWeight = 0, this._postProcessMove.imageProcessingConfiguration.vignetteStretch = 0, this._postProcessMove.samples = 4, this._webVRCamera.attachPostProcess(this._postProcessMove), this._scene.beginAnimation(this._postProcessMove, 0, 6, !1, 1, (function() {
                        i._webVRCamera.detachPostProcess(i._postProcessMove)
                    })), this._scene.beginAnimation(this.currentVRCamera, 0, 6, !1, 1)
                }
            }, t.prototype._moveTeleportationSelectorTo = function(t, i) {
                if (t.pickedPoint) {
                    i._teleportationRequestInitiated && (this._displayTeleportationTarget(), this._haloCenter.copyFrom(t.pickedPoint), this._teleportationTarget.position.copyFrom(t.pickedPoint));
                    var r = t.getNormal(!0, !1);
                    if (r) {
                        var n = e.Vector3.Cross(e.Axis.Y, r),
                            o = e.Vector3.Cross(r, n);
                        e.Vector3.RotationFromAxisToRef(o, r, n, this._teleportationTarget.rotation)
                    }
                    this._teleportationTarget.position.y += .1
                }
            }, t.prototype._teleportCamera = function(t) {
                var i = this;
                if (this.currentVRCamera instanceof e.FreeCamera) {
                    this.webVRCamera.leftCamera ? (this._workingVector.copyFrom(this.webVRCamera.leftCamera.globalPosition), this._workingVector.subtractInPlace(this.webVRCamera.position), t.subtractToRef(this._workingVector, this._workingVector)) : this._workingVector.copyFrom(t), this.isInVRMode ? this._workingVector.y += this.webVRCamera.deviceDistanceToRoomGround() : this._workingVector.y += this._defaultHeight, this.onBeforeCameraTeleport.notifyObservers(this._workingVector), this.currentVRCamera.animations = [];
                    var r = new e.Animation("animationCameraTeleportation", "position", 90, e.Animation.ANIMATIONTYPE_VECTOR3, e.Animation.ANIMATIONLOOPMODE_CONSTANT),
                        n = [{
                            frame: 0,
                            value: this.currentVRCamera.position
                        }, {
                            frame: 11,
                            value: this._workingVector
                        }];
                    r.setKeys(n), r.setEasingFunction(this._circleEase), this.currentVRCamera.animations.push(r), this._postProcessMove.animations = [];
                    var o = new e.Animation("animationPP", "vignetteWeight", 90, e.Animation.ANIMATIONTYPE_FLOAT, e.Animation.ANIMATIONLOOPMODE_CONSTANT),
                        s = [];
                    s.push({
                        frame: 0,
                        value: 0
                    }), s.push({
                        frame: 5,
                        value: 8
                    }), s.push({
                        frame: 11,
                        value: 0
                    }), o.setKeys(s), this._postProcessMove.animations.push(o);
                    var a = new e.Animation("animationPP2", "vignetteStretch", 90, e.Animation.ANIMATIONTYPE_FLOAT, e.Animation.ANIMATIONLOOPMODE_CONSTANT),
                        l = [];
                    l.push({
                        frame: 0,
                        value: 0
                    }), l.push({
                        frame: 5,
                        value: 10
                    }), l.push({
                        frame: 11,
                        value: 0
                    }), a.setKeys(l), this._postProcessMove.animations.push(a), this._postProcessMove.imageProcessingConfiguration.vignetteWeight = 0, this._postProcessMove.imageProcessingConfiguration.vignetteStretch = 0, this._webVRCamera.attachPostProcess(this._postProcessMove), this._scene.beginAnimation(this._postProcessMove, 0, 11, !1, 1, (function() {
                        i._webVRCamera.detachPostProcess(i._postProcessMove)
                    })), this._scene.beginAnimation(this.currentVRCamera, 0, 11, !1, 1, (function() {
                        i.onAfterCameraTeleport.notifyObservers(i._workingVector)
                    })), this._hideTeleportationTarget()
                }
            }, t.prototype._castRayAndSelectObject = function(t) {
                if (this.currentVRCamera instanceof e.FreeCamera) {
                    var i = this._scene.pickWithRay(t._getForwardRay(this._rayLength), this._raySelectionPredicate);
                    if (i && i.pickedPoint) {
                        if (this._displayGaze) {
                            var r = 1;
                            t._gazeTracker.isVisible = !0, t._isActionableMesh && (r = 3), t._gazeTracker.scaling.x = i.distance * r, t._gazeTracker.scaling.y = i.distance * r, t._gazeTracker.scaling.z = i.distance * r;
                            var n = i.getNormal();
                            if (n) {
                                var o = e.Vector3.Cross(e.Axis.Y, n),
                                    s = e.Vector3.Cross(n, o);
                                e.Vector3.RotationFromAxisToRef(s, n, o, t._gazeTracker.rotation)
                            }
                            t._gazeTracker.position.copyFrom(i.pickedPoint), t._gazeTracker.position.x < 0 ? t._gazeTracker.position.x += .002 : t._gazeTracker.position.x -= .002, t._gazeTracker.position.y < 0 ? t._gazeTracker.position.y += .002 : t._gazeTracker.position.y -= .002, t._gazeTracker.position.z < 0 ? t._gazeTracker.position.z += .002 : t._gazeTracker.position.z -= .002
                        }
                        t._updatePointerDistance(i.distance)
                    } else t._gazeTracker.isVisible = !1;
                    if (i && i.pickedMesh) {
                        if (t._currentHit = i, t._pointerDownOnMeshAsked && this._scene.simulatePointerMove(t._currentHit, {
                                pointerId: t._id
                            }), this._teleportationInitialized && this._isTeleportationFloor(i.pickedMesh) && i.pickedPoint) return t._currentMeshSelected && !this._isTeleportationFloor(t._currentMeshSelected) && this._notifySelectedMeshUnselected(t._currentMeshSelected), t._currentMeshSelected = null, void(t._teleportationRequestInitiated && this._moveTeleportationSelectorTo(i, t));
                        if (i.pickedMesh !== t._currentMeshSelected)
                            if (this.meshSelectionPredicate(i.pickedMesh)) {
                                this.onNewMeshPicked.notifyObservers(i), t._currentMeshSelected = i.pickedMesh, i.pickedMesh.isPickable && i.pickedMesh.actionManager ? (this.changeGazeColor(new e.Color3(0, 0, 1)), this.changeLaserColor(new e.Color3(.2, .2, 1)), t._isActionableMesh = !0) : (this.changeGazeColor(new e.Color3(.7, .7, .7)), this.changeLaserColor(new e.Color3(.7, .7, .7)), t._isActionableMesh = !1);
                                try {
                                    this.onNewMeshSelected.notifyObservers(i.pickedMesh)
                                } catch (t) {
                                    e.Tools.Warn("Error in your custom logic onNewMeshSelected: " + t)
                                }
                            } else this._notifySelectedMeshUnselected(t._currentMeshSelected), t._currentMeshSelected = null, this.changeGazeColor(new e.Color3(.7, .7, .7)), this.changeLaserColor(new e.Color3(.7, .7, .7))
                    } else t._currentHit = null, this._notifySelectedMeshUnselected(t._currentMeshSelected), t._currentMeshSelected = null, this.changeGazeColor(new e.Color3(.7, .7, .7)), this.changeLaserColor(new e.Color3(.7, .7, .7))
                }
            }, t.prototype._notifySelectedMeshUnselected = function(e) {
                e && this.onSelectedMeshUnselected.notifyObservers(e)
            }, t.prototype.changeLaserColor = function(e) {
                this.leftController && this.leftController._setLaserPointerColor(e), this.rightController && this.rightController._setLaserPointerColor(e)
            }, t.prototype.changeGazeColor = function(e) {
                this._cameraGazer._gazeTracker.material && (this._cameraGazer._gazeTracker.material.emissiveColor = e, this.leftController && (this.leftController._gazeTracker.material.emissiveColor = e), this.rightController && (this.rightController._gazeTracker.material.emissiveColor = e))
            }, t.prototype.dispose = function() {
                this.isInVRMode && this.exitVR(), this._postProcessMove && this._postProcessMove.dispose(), this._webVRCamera && this._webVRCamera.dispose(), this._vrDeviceOrientationCamera && this._vrDeviceOrientationCamera.dispose(), !this._useCustomVRButton && this._btnVR.parentNode && document.body.removeChild(this._btnVR), this._deviceOrientationCamera && this._scene.activeCamera != this._deviceOrientationCamera && this._deviceOrientationCamera.dispose(), this._cameraGazer && this._cameraGazer.dispose(), this.leftController && this.leftController.dispose(), this.rightController && this.rightController.dispose(), this._teleportationTarget && this._teleportationTarget.dispose(), this._floorMeshesCollection = [], document.removeEventListener("keydown", this._onKeyDown), window.removeEventListener("vrdisplaypresentchange", this._onVrDisplayPresentChange), window.removeEventListener("resize", this._onResize), document.removeEventListener("fullscreenchange", this._onFullscreenChange), document.removeEventListener("mozfullscreenchange", this._onFullscreenChange), document.removeEventListener("webkitfullscreenchange", this._onFullscreenChange), document.removeEventListener("msfullscreenchange", this._onFullscreenChange), this._scene.getEngine().onVRDisplayChangedObservable.removeCallback(this._onVRDisplayChanged), this._scene.getEngine().onVRRequestPresentStart.removeCallback(this._onVRRequestPresentStart), this._scene.getEngine().onVRRequestPresentComplete.removeCallback(this._onVRRequestPresentComplete), window.removeEventListener("vrdisplaypresentchange", this._onVrDisplayPresentChange), this._scene.gamepadManager.onGamepadConnectedObservable.removeCallback(this._onNewGamepadConnected), this._scene.gamepadManager.onGamepadDisconnectedObservable.removeCallback(this._onNewGamepadDisconnected), this._scene.unregisterBeforeRender(this.beforeRender)
            }, t.prototype.getClassName = function() {
                return "VRExperienceHelper"
            }, t
        })();
    e.VRExperienceHelper = n
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.X = 0] = "X", e[e.Y = 1] = "Y", e[e.Z = 2] = "Z"
    })(t = e.JoystickAxis || (e.JoystickAxis = {}));
    var i = (function() {
        function i(r) {
            var n = this;
            if (this._leftJoystick = !!r, i._globalJoystickIndex++, this._axisTargetedByLeftAndRight = t.X, this._axisTargetedByUpAndDown = t.Y, this.reverseLeftRight = !1, this.reverseUpDown = !1, this._touches = new e.StringDictionary, this.deltaPosition = e.Vector3.Zero(), this._joystickSensibility = 25, this._inversedSensibility = 1 / (this._joystickSensibility / 1e3), this._onResize = function(e) {
                    i.vjCanvasWidth = window.innerWidth, i.vjCanvasHeight = window.innerHeight, i.vjCanvas && (i.vjCanvas.width = i.vjCanvasWidth, i.vjCanvas.height = i.vjCanvasHeight), i.halfWidth = i.vjCanvasWidth / 2
                }, !i.vjCanvas) {
                window.addEventListener("resize", this._onResize, !1), i.vjCanvas = document.createElement("canvas"), i.vjCanvasWidth = window.innerWidth, i.vjCanvasHeight = window.innerHeight, i.vjCanvas.width = window.innerWidth, i.vjCanvas.height = window.innerHeight, i.vjCanvas.style.width = "100%", i.vjCanvas.style.height = "100%", i.vjCanvas.style.position = "absolute", i.vjCanvas.style.backgroundColor = "transparent", i.vjCanvas.style.top = "0px", i.vjCanvas.style.left = "0px", i.vjCanvas.style.zIndex = "5", i.vjCanvas.style.msTouchAction = "none", i.vjCanvas.setAttribute("touch-action", "none");
                var o = i.vjCanvas.getContext("2d");
                if (!o) throw new Error("Unable to create canvas for virtual joystick");
                i.vjCanvasContext = o, i.vjCanvasContext.strokeStyle = "#ffffff", i.vjCanvasContext.lineWidth = 2, document.body.appendChild(i.vjCanvas)
            }
            i.halfWidth = i.vjCanvas.width / 2, this.pressed = !1, this._joystickColor = "cyan", this._joystickPointerID = -1, this._joystickPointerPos = new e.Vector2(0, 0), this._joystickPreviousPointerPos = new e.Vector2(0, 0), this._joystickPointerStartPos = new e.Vector2(0, 0), this._deltaJoystickVector = new e.Vector2(0, 0), this._onPointerDownHandlerRef = function(e) {
                n._onPointerDown(e)
            }, this._onPointerMoveHandlerRef = function(e) {
                n._onPointerMove(e)
            }, this._onPointerUpHandlerRef = function(e) {
                n._onPointerUp(e)
            }, i.vjCanvas.addEventListener("pointerdown", this._onPointerDownHandlerRef, !1), i.vjCanvas.addEventListener("pointermove", this._onPointerMoveHandlerRef, !1), i.vjCanvas.addEventListener("pointerup", this._onPointerUpHandlerRef, !1), i.vjCanvas.addEventListener("pointerout", this._onPointerUpHandlerRef, !1), i.vjCanvas.addEventListener("contextmenu", (function(e) {
                e.preventDefault()
            }), !1), requestAnimationFrame((function() {
                n._drawVirtualJoystick()
            }))
        }
        return i.prototype.setJoystickSensibility = function(e) {
            this._joystickSensibility = e, this._inversedSensibility = 1 / (this._joystickSensibility / 1e3)
        }, i.prototype._onPointerDown = function(e) {
            var t;
            e.preventDefault(),
                t = !0 === this._leftJoystick ? e.clientX < i.halfWidth : e.clientX > i.halfWidth, t && this._joystickPointerID < 0 ? (this._joystickPointerID = e.pointerId, this._joystickPointerStartPos.x = e.clientX, this._joystickPointerStartPos.y = e.clientY, this._joystickPointerPos = this._joystickPointerStartPos.clone(), this._joystickPreviousPointerPos = this._joystickPointerStartPos.clone(), this._deltaJoystickVector.x = 0, this._deltaJoystickVector.y = 0, this.pressed = !0, this._touches.add(e.pointerId.toString(), e)) : i._globalJoystickIndex < 2 && this._action && (this._action(), this._touches.add(e.pointerId.toString(), {
                    x: e.clientX,
                    y: e.clientY,
                    prevX: e.clientX,
                    prevY: e.clientY
                }))
        }, i.prototype._onPointerMove = function(e) {
            if (this._joystickPointerID == e.pointerId) {
                this._joystickPointerPos.x = e.clientX, this._joystickPointerPos.y = e.clientY, this._deltaJoystickVector = this._joystickPointerPos.clone(), this._deltaJoystickVector = this._deltaJoystickVector.subtract(this._joystickPointerStartPos);
                var i = this.reverseLeftRight ? -1 : 1,
                    r = i * this._deltaJoystickVector.x / this._inversedSensibility;
                switch (this._axisTargetedByLeftAndRight) {
                    case t.X:
                        this.deltaPosition.x = Math.min(1, Math.max(-1, r));
                        break;
                    case t.Y:
                        this.deltaPosition.y = Math.min(1, Math.max(-1, r));
                        break;
                    case t.Z:
                        this.deltaPosition.z = Math.min(1, Math.max(-1, r))
                }
                var n = this.reverseUpDown ? 1 : -1,
                    o = n * this._deltaJoystickVector.y / this._inversedSensibility;
                switch (this._axisTargetedByUpAndDown) {
                    case t.X:
                        this.deltaPosition.x = Math.min(1, Math.max(-1, o));
                        break;
                    case t.Y:
                        this.deltaPosition.y = Math.min(1, Math.max(-1, o));
                        break;
                    case t.Z:
                        this.deltaPosition.z = Math.min(1, Math.max(-1, o))
                }
            } else {
                var s = this._touches.get(e.pointerId.toString());
                s && (s.x = e.clientX, s.y = e.clientY)
            }
        }, i.prototype._onPointerUp = function(e) {
            if (this._joystickPointerID == e.pointerId) i.vjCanvasContext.clearRect(this._joystickPointerStartPos.x - 64, this._joystickPointerStartPos.y - 64, 128, 128), i.vjCanvasContext.clearRect(this._joystickPreviousPointerPos.x - 42, this._joystickPreviousPointerPos.y - 42, 84, 84), this._joystickPointerID = -1, this.pressed = !1;
            else {
                var t = this._touches.get(e.pointerId.toString());
                t && i.vjCanvasContext.clearRect(t.prevX - 44, t.prevY - 44, 88, 88)
            }
            this._deltaJoystickVector.x = 0, this._deltaJoystickVector.y = 0, this._touches.remove(e.pointerId.toString())
        }, i.prototype.setJoystickColor = function(e) {
            this._joystickColor = e
        }, i.prototype.setActionOnTouch = function(e) {
            this._action = e
        }, i.prototype.setAxisForLeftRight = function(e) {
            switch (e) {
                case t.X:
                case t.Y:
                case t.Z:
                    this._axisTargetedByLeftAndRight = e;
                    break;
                default:
                    this._axisTargetedByLeftAndRight = t.X
            }
        }, i.prototype.setAxisForUpDown = function(e) {
            switch (e) {
                case t.X:
                case t.Y:
                case t.Z:
                    this._axisTargetedByUpAndDown = e;
                    break;
                default:
                    this._axisTargetedByUpAndDown = t.Y
            }
        }, i.prototype._drawVirtualJoystick = function() {
            var e = this;
            this.pressed && this._touches.forEach((function(t, r) {
                r.pointerId === e._joystickPointerID ? (i.vjCanvasContext.clearRect(e._joystickPointerStartPos.x - 64, e._joystickPointerStartPos.y - 64, 128, 128), i.vjCanvasContext.clearRect(e._joystickPreviousPointerPos.x - 42, e._joystickPreviousPointerPos.y - 42, 84, 84), i.vjCanvasContext.beginPath(), i.vjCanvasContext.lineWidth = 6, i.vjCanvasContext.strokeStyle = e._joystickColor, i.vjCanvasContext.arc(e._joystickPointerStartPos.x, e._joystickPointerStartPos.y, 40, 0, 2 * Math.PI, !0), i.vjCanvasContext.stroke(), i.vjCanvasContext.closePath(), i.vjCanvasContext.beginPath(), i.vjCanvasContext.strokeStyle = e._joystickColor, i.vjCanvasContext.lineWidth = 2, i.vjCanvasContext.arc(e._joystickPointerStartPos.x, e._joystickPointerStartPos.y, 60, 0, 2 * Math.PI, !0), i.vjCanvasContext.stroke(), i.vjCanvasContext.closePath(), i.vjCanvasContext.beginPath(), i.vjCanvasContext.strokeStyle = e._joystickColor, i.vjCanvasContext.arc(e._joystickPointerPos.x, e._joystickPointerPos.y, 40, 0, 2 * Math.PI, !0), i.vjCanvasContext.stroke(), i.vjCanvasContext.closePath(), e._joystickPreviousPointerPos = e._joystickPointerPos.clone()) : (i.vjCanvasContext.clearRect(r.prevX - 44, r.prevY - 44, 88, 88), i.vjCanvasContext.beginPath(), i.vjCanvasContext.fillStyle = "white", i.vjCanvasContext.beginPath(), i.vjCanvasContext.strokeStyle = "red", i.vjCanvasContext.lineWidth = 6, i.vjCanvasContext.arc(r.x, r.y, 40, 0, 2 * Math.PI, !0), i.vjCanvasContext.stroke(), i.vjCanvasContext.closePath(), r.prevX = r.x, r.prevY = r.y)
            })), requestAnimationFrame((function() {
                e._drawVirtualJoystick()
            }))
        }, i.prototype.releaseCanvas = function() {
            i.vjCanvas && (i.vjCanvas.removeEventListener("pointerdown", this._onPointerDownHandlerRef), i.vjCanvas.removeEventListener("pointermove", this._onPointerMoveHandlerRef), i.vjCanvas.removeEventListener("pointerup", this._onPointerUpHandlerRef), i.vjCanvas.removeEventListener("pointerout", this._onPointerUpHandlerRef), window.removeEventListener("resize", this._onResize), document.body.removeChild(i.vjCanvas), i.vjCanvas = null)
        }, i._globalJoystickIndex = 0, i
    })();
    e.VirtualJoystick = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
        function t(t, i, r) {
            var n = e.call(this, t, i, r) || this;
            return n.inputs.addVirtualJoystick(), n
        }
        return __extends(t, e), t.prototype.getClassName = function() {
            return "VirtualJoysticksCamera"
        }, t
    })(e.FreeCamera);
    e.VirtualJoysticksCamera = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.prototype.getLeftJoystick = function() {
            return this._leftjoystick
        }, t.prototype.getRightJoystick = function() {
            return this._rightjoystick
        }, t.prototype.checkInputs = function() {
            if (this._leftjoystick) {
                var t = this.camera,
                    i = 50 * t._computeLocalCameraSpeed(),
                    r = e.Matrix.RotationYawPitchRoll(t.rotation.y, t.rotation.x, 0),
                    n = e.Vector3.TransformCoordinates(new e.Vector3(this._leftjoystick.deltaPosition.x * i, this._leftjoystick.deltaPosition.y * i, this._leftjoystick.deltaPosition.z * i), r);
                t.cameraDirection = t.cameraDirection.add(n), t.cameraRotation = t.cameraRotation.addVector3(this._rightjoystick.deltaPosition), this._leftjoystick.pressed || (this._leftjoystick.deltaPosition = this._leftjoystick.deltaPosition.scale(.9)), this._rightjoystick.pressed || (this._rightjoystick.deltaPosition = this._rightjoystick.deltaPosition.scale(.9))
            }
        }, t.prototype.attachControl = function(t, i) {
            this._leftjoystick = new e.VirtualJoystick(!0), this._leftjoystick.setAxisForUpDown(e.JoystickAxis.Z), this._leftjoystick.setAxisForLeftRight(e.JoystickAxis.X), this._leftjoystick.setJoystickSensibility(.15), this._rightjoystick = new e.VirtualJoystick(!1), this._rightjoystick.setAxisForUpDown(e.JoystickAxis.X), this._rightjoystick.setAxisForLeftRight(e.JoystickAxis.Y), this._rightjoystick.reverseUpDown = !0, this._rightjoystick.setJoystickSensibility(.05), this._rightjoystick.setJoystickColor("yellow")
        }, t.prototype.detachControl = function(e) {
            this._leftjoystick.releaseCanvas(), this._rightjoystick.releaseCanvas()
        }, t.prototype.getClassName = function() {
            return "FreeCameraVirtualJoystickInput"
        }, t.prototype.getSimpleName = function() {
            return "virtualJoystick"
        }, t
    })();
    e.FreeCameraVirtualJoystickInput = t, e.CameraInputTypes.FreeCameraVirtualJoystickInput = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t, i) {
            this.quality = e, this.distance = t, this.optimizeMesh = i
        }
        return e
    })();
    e.SimplificationSettings = t;
    var i = (function() {
        function t() {
            this.running = !1, this._simplificationArray = []
        }
        return t.prototype.addTask = function(e) {
            this._simplificationArray.push(e)
        }, t.prototype.executeNext = function() {
            var e = this._simplificationArray.pop();
            e ? (this.running = !0, this.runSimplification(e)) : this.running = !1
        }, t.prototype.runSimplification = function(t) {
            var i = this;
            if (t.parallelProcessing) t.settings.forEach((function(e) {
                i.getSimplifier(t).simplify(e, (function(r) {
                    t.mesh.addLODLevel(e.distance, r), r.isVisible = !0, e.quality === t.settings[t.settings.length - 1].quality && t.successCallback && t.successCallback(), i.executeNext()
                }))
            }));
            else {
                var r = this.getSimplifier(t),
                    n = function(e, i) {
                        r.simplify(e, (function(r) {
                            t.mesh.addLODLevel(e.distance, r), r.isVisible = !0, i()
                        }))
                    };
                e.AsyncLoop.Run(t.settings.length, (function(e) {
                    n(t.settings[e.index], (function() {
                        e.executeNext()
                    }))
                }), (function() {
                    t.successCallback && t.successCallback(), i.executeNext()
                }))
            }
        }, t.prototype.getSimplifier = function(e) {
            switch (e.simplificationType) {
                case r.QUADRATIC:
                default:
                    return new l(e.mesh)
            }
        }, t
    })();
    e.SimplificationQueue = i;
    var r;
    !(function(e) {
        e[e.QUADRATIC = 0] = "QUADRATIC"
    })(r = e.SimplificationType || (e.SimplificationType = {}));
    var n = (function() {
        function e(e) {
            this.vertices = e, this.error = new Array(4), this.deleted = !1, this.isDirty = !1, this.deletePending = !1, this.borderFactor = 0
        }
        return e
    })();
    e.DecimationTriangle = n;
    var o = (function() {
        function e(e, t) {
            this.position = e, this.id = t, this.isBorder = !0, this.q = new s, this.triangleCount = 0, this.triangleStart = 0, this.originalOffsets = []
        }
        return e.prototype.updatePosition = function(e) {
            this.position.copyFrom(e)
        }, e
    })();
    e.DecimationVertex = o;
    var s = (function() {
        function e(e) {
            this.data = new Array(10);
            for (var t = 0; t < 10; ++t) e && e[t] ? this.data[t] = e[t] : this.data[t] = 0
        }
        return e.prototype.det = function(e, t, i, r, n, o, s, a, l) {
            return this.data[e] * this.data[n] * this.data[l] + this.data[i] * this.data[r] * this.data[a] + this.data[t] * this.data[o] * this.data[s] - this.data[i] * this.data[n] * this.data[s] - this.data[e] * this.data[o] * this.data[a] - this.data[t] * this.data[r] * this.data[l]
        }, e.prototype.addInPlace = function(e) {
            for (var t = 0; t < 10; ++t) this.data[t] += e.data[t]
        }, e.prototype.addArrayInPlace = function(e) {
            for (var t = 0; t < 10; ++t) this.data[t] += e[t]
        }, e.prototype.add = function(t) {
            for (var i = new e, r = 0; r < 10; ++r) i.data[r] = this.data[r] + t.data[r];
            return i
        }, e.FromData = function(t, i, r, n) {
            return new e(e.DataFromNumbers(t, i, r, n))
        }, e.DataFromNumbers = function(e, t, i, r) {
            return [e * e, e * t, e * i, e * r, t * t, t * i, t * r, i * i, i * r, r * r]
        }, e
    })();
    e.QuadraticMatrix = s;
    var a = (function() {
        function e(e, t) {
            this.vertexId = e, this.triangleId = t
        }
        return e
    })();
    e.Reference = a;
    var l = (function() {
        function t(t) {
            this._mesh = t, this.syncIterations = 5e3, this.aggressiveness = 7, this.decimationIterations = 100, this.boundingBoxEpsilon = e.Epsilon
        }
        return t.prototype.simplify = function(t, i) {
            var r = this;
            this.initDecimatedMesh(), e.AsyncLoop.Run(this._mesh.subMeshes.length, (function(e) {
                r.initWithMesh(e.index, (function() {
                    r.runDecimation(t, e.index, (function() {
                        e.executeNext()
                    }))
                }), t.optimizeMesh)
            }), (function() {
                setTimeout((function() {
                    i(r._reconstructedMesh)
                }), 0)
            }))
        }, t.prototype.runDecimation = function(t, i, r) {
            var n = this,
                o = ~~(this.triangles.length * t.quality),
                s = 0,
                a = this.triangles.length,
                l = function(t, i) {
                    setTimeout((function() {
                        t % 5 == 0 && n.updateMesh(0 === t);
                        for (var r = 0; r < n.triangles.length; ++r) n.triangles[r].isDirty = !1;
                        var l = 1e-9 * Math.pow(t + 3, n.aggressiveness),
                            c = function(t) {
                                var i = ~~((n.triangles.length / 2 + t) % n.triangles.length),
                                    r = n.triangles[i];
                                if (r && !(r.error[3] > l || r.deleted || r.isDirty))
                                    for (var o = 0; o < 3; ++o)
                                        if (r.error[o] < l) {
                                            var a = [],
                                                c = [],
                                                h = r.vertices[o],
                                                u = r.vertices[(o + 1) % 3];
                                            if (h.isBorder || u.isBorder) continue;
                                            var f = e.Vector3.Zero(),
                                                d = e.Vector3.Zero(),
                                                p = e.Vector2.Zero(),
                                                _ = new e.Color4(0, 0, 0, 1);
                                            n.calculateError(h, u, f, d, p, _);
                                            var m = new Array;
                                            if (n.isFlipped(h, u, f, a, r.borderFactor, m)) continue;
                                            if (n.isFlipped(u, h, f, c, r.borderFactor, m)) continue;
                                            if (a.indexOf(!0) < 0 || c.indexOf(!0) < 0) continue;
                                            var g = new Array;
                                            if (m.forEach((function(e) {
                                                    -1 === g.indexOf(e) && (e.deletePending = !0, g.push(e))
                                                })), g.length % 2 != 0) continue;
                                            h.q = u.q.add(h.q), h.updatePosition(f);
                                            var v = n.references.length;
                                            s = n.updateTriangles(h, h, a, s), s = n.updateTriangles(h, u, c, s);
                                            var y = n.references.length - v;
                                            if (y <= h.triangleCount) {
                                                if (y)
                                                    for (var b = 0; b < y; b++) n.references[h.triangleStart + b] = n.references[v + b]
                                            } else h.triangleStart = v;
                                            h.triangleCount = y;
                                            break
                                        }
                            };
                        e.AsyncLoop.SyncAsyncForLoop(n.triangles.length, n.syncIterations, c, i, (function() {
                            return a - s <= o
                        }))
                    }), 0)
                };
            e.AsyncLoop.Run(this.decimationIterations, (function(e) {
                a - s <= o ? e.breakLoop() : l(e.index, (function() {
                    e.executeNext()
                }))
            }), (function() {
                setTimeout((function() {
                    n.reconstructMesh(i), r()
                }), 0)
            }))
        }, t.prototype.initWithMesh = function(t, i, r) {
            var s = this;
            this.vertices = [], this.triangles = [];
            var a = this._mesh.getVerticesData(e.VertexBuffer.PositionKind),
                l = this._mesh.getIndices(),
                c = this._mesh.subMeshes[t],
                h = function(e) {
                    if (r)
                        for (var t = 0; t < s.vertices.length; ++t)
                            if (s.vertices[t].position.equals(e)) return s.vertices[t];
                    return null
                },
                u = [],
                f = function(t) {
                    if (a) {
                        var i = t + c.verticesStart,
                            r = e.Vector3.FromArray(a, 3 * i),
                            n = h(r) || new o(r, s.vertices.length);
                        n.originalOffsets.push(i), n.id === s.vertices.length && s.vertices.push(n), u.push(n.id)
                    }
                },
                d = c.verticesCount;
            e.AsyncLoop.SyncAsyncForLoop(d, this.syncIterations / 4 >> 0, f, (function() {
                var t = function(e) {
                    if (l) {
                        var t = c.indexStart / 3 + e,
                            i = 3 * t,
                            r = l[i + 0],
                            o = l[i + 1],
                            a = l[i + 2],
                            h = s.vertices[u[r - c.verticesStart]],
                            f = s.vertices[u[o - c.verticesStart]],
                            d = s.vertices[u[a - c.verticesStart]],
                            p = new n([h, f, d]);
                        p.originalOffset = i, s.triangles.push(p)
                    }
                };
                e.AsyncLoop.SyncAsyncForLoop(c.indexCount / 3, s.syncIterations, t, (function() {
                    s.init(i)
                }))
            }))
        }, t.prototype.init = function(t) {
            var i = this,
                r = function(t) {
                    var r = i.triangles[t];
                    r.normal = e.Vector3.Cross(r.vertices[1].position.subtract(r.vertices[0].position), r.vertices[2].position.subtract(r.vertices[0].position)).normalize();
                    for (var n = 0; n < 3; n++) r.vertices[n].q.addArrayInPlace(s.DataFromNumbers(r.normal.x, r.normal.y, r.normal.z, -e.Vector3.Dot(r.normal, r.vertices[0].position)))
                };
            e.AsyncLoop.SyncAsyncForLoop(this.triangles.length, this.syncIterations, r, (function() {
                var r = function(e) {
                    for (var t = i.triangles[e], r = 0; r < 3; ++r) t.error[r] = i.calculateError(t.vertices[r], t.vertices[(r + 1) % 3]);
                    t.error[3] = Math.min(t.error[0], t.error[1], t.error[2])
                };
                e.AsyncLoop.SyncAsyncForLoop(i.triangles.length, i.syncIterations, r, (function() {
                    t()
                }))
            }))
        }, t.prototype.reconstructMesh = function(t) {
            var i, r = [];
            for (i = 0; i < this.vertices.length; ++i) this.vertices[i].triangleCount = 0;
            var n, o;
            for (i = 0; i < this.triangles.length; ++i)
                if (!this.triangles[i].deleted) {
                    for (n = this.triangles[i], o = 0; o < 3; ++o) n.vertices[o].triangleCount = 1;
                    r.push(n)
                }
            var s = this._reconstructedMesh.getVerticesData(e.VertexBuffer.PositionKind) || [],
                a = this._reconstructedMesh.getVerticesData(e.VertexBuffer.NormalKind) || [],
                l = this._reconstructedMesh.getVerticesData(e.VertexBuffer.UVKind) || [],
                c = this._reconstructedMesh.getVerticesData(e.VertexBuffer.ColorKind) || [],
                h = this._mesh.getVerticesData(e.VertexBuffer.NormalKind),
                u = this._mesh.getVerticesData(e.VertexBuffer.UVKind),
                f = this._mesh.getVerticesData(e.VertexBuffer.ColorKind),
                d = 0;
            for (i = 0; i < this.vertices.length; ++i) {
                var p = this.vertices[i];
                p.id = d, p.triangleCount && p.originalOffsets.forEach((function(e) {
                    h && (s.push(p.position.x), s.push(p.position.y), s.push(p.position.z), a.push(h[3 * e]), a.push(h[3 * e + 1]), a.push(h[3 * e + 2]), u && u.length ? (l.push(u[2 * e]), l.push(u[2 * e + 1])) : f && f.length && (c.push(f[4 * e]), c.push(f[4 * e + 1]), c.push(f[4 * e + 2]), c.push(f[4 * e + 3])), ++d)
                }))
            }
            var _ = this._reconstructedMesh.getTotalIndices(),
                m = this._reconstructedMesh.getTotalVertices(),
                g = this._reconstructedMesh.subMeshes;
            this._reconstructedMesh.subMeshes = [];
            var v = this._reconstructedMesh.getIndices(),
                y = this._mesh.getIndices();
            for (i = 0; i < r.length; ++i) n = r[i], [0, 1, 2].forEach((function(e) {
                var t = y[n.originalOffset + e],
                    i = n.vertices[e].originalOffsets.indexOf(t);
                i < 0 && (i = 0), v.push(n.vertices[e].id + i + m)
            }));
            this._reconstructedMesh.setIndices(v), this._reconstructedMesh.setVerticesData(e.VertexBuffer.PositionKind, s), this._reconstructedMesh.setVerticesData(e.VertexBuffer.NormalKind, a), l.length > 0 && this._reconstructedMesh.setVerticesData(e.VertexBuffer.UVKind, l), c.length > 0 && this._reconstructedMesh.setVerticesData(e.VertexBuffer.ColorKind, c);
            var b = this._mesh.subMeshes[t];
            t > 0 && (this._reconstructedMesh.subMeshes = [], g.forEach((function(t) {
                e.SubMesh.AddToMesh(t.materialIndex, t.verticesStart, t.verticesCount, t.indexStart, t.indexCount, t.getMesh())
            })), e.SubMesh.AddToMesh(b.materialIndex, m, d, _, 3 * r.length, this._reconstructedMesh))
        }, t.prototype.initDecimatedMesh = function() {
            this._reconstructedMesh = new e.Mesh(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
        }, t.prototype.isFlipped = function(t, i, r, n, o, s) {
            for (var a = 0; a < t.triangleCount; ++a) {
                var l = this.triangles[this.references[t.triangleStart + a].triangleId];
                if (!l.deleted) {
                    var c = this.references[t.triangleStart + a].vertexId,
                        h = l.vertices[(c + 1) % 3],
                        u = l.vertices[(c + 2) % 3];
                    if (h !== i && u !== i) {
                        var f = h.position.subtract(r);
                        f = f.normalize();
                        var d = u.position.subtract(r);
                        if (d = d.normalize(), Math.abs(e.Vector3.Dot(f, d)) > .999) return !0;
                        var p = e.Vector3.Cross(f, d).normalize();
                        if (n[a] = !1, e.Vector3.Dot(p, l.normal) < .2) return !0
                    } else n[a] = !0, s.push(l)
                }
            }
            return !1
        }, t.prototype.updateTriangles = function(e, t, i, r) {
            for (var n = r, o = 0; o < t.triangleCount; ++o) {
                var s = this.references[t.triangleStart + o],
                    a = this.triangles[s.triangleId];
                a.deleted || (i[o] && a.deletePending ? (a.deleted = !0, n++) : (a.vertices[s.vertexId] = e, a.isDirty = !0, a.error[0] = this.calculateError(a.vertices[0], a.vertices[1]) + a.borderFactor / 2, a.error[1] = this.calculateError(a.vertices[1], a.vertices[2]) + a.borderFactor / 2, a.error[2] = this.calculateError(a.vertices[2], a.vertices[0]) + a.borderFactor / 2, a.error[3] = Math.min(a.error[0], a.error[1], a.error[2]), this.references.push(s)))
            }
            return n
        }, t.prototype.identifyBorder = function() {
            for (var e = 0; e < this.vertices.length; ++e) {
                var t, i = [],
                    r = [],
                    n = this.vertices[e];
                for (t = 0; t < n.triangleCount; ++t)
                    for (var o = this.triangles[this.references[n.triangleStart + t].triangleId], s = 0; s < 3; s++) {
                        for (var a = 0, l = o.vertices[s]; a < i.length && r[a] !== l.id;) ++a;
                        a === i.length ? (i.push(1), r.push(l.id)) : i[a]++
                    }
                for (t = 0; t < i.length; ++t) 1 === i[t] ? this.vertices[r[t]].isBorder = !0 : this.vertices[r[t]].isBorder = !1
            }
        }, t.prototype.updateMesh = function(e) {
            void 0 === e && (e = !1);
            var t;
            if (!e) {
                var i = [];
                for (t = 0; t < this.triangles.length; ++t) this.triangles[t].deleted || i.push(this.triangles[t]);
                this.triangles = i
            }
            for (t = 0; t < this.vertices.length; ++t) this.vertices[t].triangleCount = 0, this.vertices[t].triangleStart = 0;
            var r, n, o;
            for (t = 0; t < this.triangles.length; ++t)
                for (r = this.triangles[t], n = 0; n < 3; ++n) o = r.vertices[n], o.triangleCount++;
            var s = 0;
            for (t = 0; t < this.vertices.length; ++t) this.vertices[t].triangleStart = s, s += this.vertices[t].triangleCount, this.vertices[t].triangleCount = 0;
            var l = new Array(3 * this.triangles.length);
            for (t = 0; t < this.triangles.length; ++t)
                for (r = this.triangles[t], n = 0; n < 3; ++n) o = r.vertices[n], l[o.triangleStart + o.triangleCount] = new a(n, t), o.triangleCount++;
            this.references = l, e && this.identifyBorder()
        }, t.prototype.vertexError = function(e, t) {
            var i = t.x,
                r = t.y,
                n = t.z;
            return e.data[0] * i * i + 2 * e.data[1] * i * r + 2 * e.data[2] * i * n + 2 * e.data[3] * i + e.data[4] * r * r + 2 * e.data[5] * r * n + 2 * e.data[6] * r + e.data[7] * n * n + 2 * e.data[8] * n + e.data[9]
        }, t.prototype.calculateError = function(t, i, r, n, o, s) {
            var a = t.q.add(i.q),
                l = t.isBorder && i.isBorder,
                c = 0,
                h = a.det(0, 1, 2, 1, 4, 5, 2, 5, 7);
            if (0 === h || l) {
                var u = t.position.add(i.position).divide(new e.Vector3(2, 2, 2)),
                    f = this.vertexError(a, t.position),
                    d = this.vertexError(a, i.position),
                    p = this.vertexError(a, u);
                c = Math.min(f, d, p), c === f ? r && r.copyFrom(t.position) : c === d ? r && r.copyFrom(i.position) : r && r.copyFrom(u)
            } else r || (r = e.Vector3.Zero()), r.x = -1 / h * a.det(1, 2, 3, 4, 5, 6, 5, 7, 8), r.y = 1 / h * a.det(0, 2, 3, 1, 5, 6, 2, 7, 8), r.z = -1 / h * a.det(0, 1, 3, 1, 4, 6, 2, 5, 8), c = this.vertexError(a, r);
            return c
        }, t
    })();
    e.QuadraticErrorSimplification = l
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e, t) {
            this.distance = e, this.mesh = t
        }
        return e
    })();
    e.MeshLODLevel = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e(e) {
            void 0 === e && (e = 0), this.priority = e
        }
        return e.prototype.getDescription = function() {
            return ""
        }, e.prototype.apply = function(e, t) {
            return !0
        }, e
    })();
    e.SceneOptimization = t;
    var i = (function(e) {
        function t(t, i, r) {
            void 0 === t && (t = 0), void 0 === i && (i = 1024), void 0 === r && (r = .5);
            var n = e.call(this, t) || this;
            return n.priority = t, n.maximumSize = i, n.step = r, n
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Reducing render target texture size to " + this.maximumSize
        }, t.prototype.apply = function(e, t) {
            for (var i = !0, r = 0; r < e.textures.length; r++) {
                var n = e.textures[r];
                if (n.canRescale && !n.getContext) {
                    var o = n.getSize();
                    Math.max(o.width, o.height) > this.maximumSize && (n.scale(this.step), i = !1)
                }
            }
            return i
        }, t
    })(t);
    e.TextureOptimization = i;
    var r = (function(e) {
        function t(t, i, r) {
            void 0 === t && (t = 0), void 0 === i && (i = 2), void 0 === r && (r = .25);
            var n = e.call(this, t) || this;
            return n.priority = t, n.maximumScale = i, n.step = r, n._currentScale = -1, n._directionOffset = 1, n
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Setting hardware scaling level to " + this._currentScale
        }, t.prototype.apply = function(e, t) {
            return -1 === this._currentScale && (this._currentScale = e.getEngine().getHardwareScalingLevel(), this._currentScale > this.maximumScale && (this._directionOffset = -1)), this._currentScale += this._directionOffset * this.step, e.getEngine().setHardwareScalingLevel(this._currentScale), 1 === this._directionOffset ? this._currentScale >= this.maximumScale : this._currentScale <= this.maximumScale
        }, t
    })(t);
    e.HardwareScalingOptimization = r;
    var n = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Turning shadows on/off"
        }, t.prototype.apply = function(e, t) {
            return e.shadowsEnabled = t.isInImprovementMode, !0
        }, t
    })(t);
    e.ShadowsOptimization = n;
    var o = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Turning post-processes on/off"
        }, t.prototype.apply = function(e, t) {
            return e.postProcessesEnabled = t.isInImprovementMode, !0
        }, t
    })(t);
    e.PostProcessesOptimization = o;
    var s = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Turning lens flares on/off"
        }, t.prototype.apply = function(e, t) {
            return e.lensFlaresEnabled = t.isInImprovementMode, !0
        }, t
    })(t);
    e.LensFlaresOptimization = s;
    var a = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return this.onGetDescription ? this.onGetDescription() : "Running user defined callback"
        }, t.prototype.apply = function(e, t) {
            return !this.onApply || this.onApply(e, t)
        }, t
    })(t);
    e.CustomOptimization = a;
    var l = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Turning particles on/off"
        }, t.prototype.apply = function(e, t) {
            return e.particlesEnabled = t.isInImprovementMode, !0
        }, t
    })(t);
    e.ParticlesOptimization = l;
    var c = (function(e) {
        function t() {
            return null !== e && e.apply(this, arguments) || this
        }
        return __extends(t, e), t.prototype.getDescription = function() {
            return "Turning render targets off"
        }, t.prototype.apply = function(e, t) {
            return e.renderTargetsEnabled = t.isInImprovementMode, !0
        }, t
    })(t);
    e.RenderTargetsOptimization = c;
    var h = (function(t) {
        function i() {
            var i = null !== t && t.apply(this, arguments) || this;
            return i._canBeMerged = function(t) {
                if (!(t instanceof e.Mesh)) return !1;
                var i = t;
                return !(!i.isVisible || !i.isEnabled()) && (!(i.instances.length > 0) && (!i.skeleton && !i.hasLODLevels && !i.parent))
            }, i
        }
        return __extends(i, t), Object.defineProperty(i, "UpdateSelectionTree", {
            get: function() {
                return i._UpdateSelectionTree
            },
            set: function(e) {
                i._UpdateSelectionTree = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getDescription = function() {
            return "Merging similar meshes together"
        }, i.prototype.apply = function(t, r, n) {
            for (var o = t.meshes.slice(0), s = o.length, a = 0; a < s; a++) {
                var l = new Array,
                    c = o[a];
                if (this._canBeMerged(c)) {
                    l.push(c);
                    for (var h = a + 1; h < s; h++) {
                        var u = o[h];
                        this._canBeMerged(u) && (u.material === c.material && u.checkCollisions === c.checkCollisions && (l.push(u), s--, o.splice(h, 1), h--))
                    }
                    l.length < 2 || e.Mesh.MergeMeshes(l)
                }
            }
            return void 0 != n ? n && t.createOrUpdateSelectionOctree() : i.UpdateSelectionTree && t.createOrUpdateSelectionOctree(), !0
        }, i._UpdateSelectionTree = !1, i
    })(t);
    e.MergeMeshesOptimization = h;
    var u = (function() {
        function e(e, t) {
            void 0 === e && (e = 60), void 0 === t && (t = 2e3), this.targetFrameRate = e, this.trackerDuration = t, this.optimizations = new Array
        }
        return e.prototype.addOptimization = function(e) {
            return this.optimizations.push(e), this
        }, e.prototype.addCustomOptimization = function(e, t, i) {
            void 0 === i && (i = 0);
            var r = new a(i);
            return r.onApply = e, r.onGetDescription = t, this.optimizations.push(r), this
        }, e.LowDegradationAllowed = function(t) {
            var r = new e(t),
                a = 0;
            return r.addOptimization(new h(a)), r.addOptimization(new n(a)), r.addOptimization(new s(a)), a++, r.addOptimization(new o(a)), r.addOptimization(new l(a)), a++, r.addOptimization(new i(a, 1024)), r
        }, e.ModerateDegradationAllowed = function(t) {
            var a = new e(t),
                u = 0;
            return a.addOptimization(new h(u)), a.addOptimization(new n(u)), a.addOptimization(new s(u)), u++, a.addOptimization(new o(u)), a.addOptimization(new l(u)), u++, a.addOptimization(new i(u, 512)), u++, a.addOptimization(new c(u)), u++, a.addOptimization(new r(u, 2)), a
        }, e.HighDegradationAllowed = function(t) {
            var a = new e(t),
                u = 0;
            return a.addOptimization(new h(u)), a.addOptimization(new n(u)), a.addOptimization(new s(u)), u++, a.addOptimization(new o(u)), a.addOptimization(new l(u)), u++, a.addOptimization(new i(u, 256)), u++, a.addOptimization(new c(u)), u++, a.addOptimization(new r(u, 4)), a
        }, e
    })();
    e.SceneOptimizerOptions = u;
    var f = (function() {
        function t(t, i, r, n) {
            void 0 === r && (r = !0), void 0 === n && (n = !1);
            var o = this;
            if (this._isRunning = !1, this._currentPriorityLevel = 0, this._targetFrameRate = 60, this._trackerDuration = 2e3, this._currentFrameRate = 0, this._improvementMode = !1, this.onSuccessObservable = new e.Observable, this.onNewOptimizationAppliedObservable = new e.Observable, this.onFailureObservable = new e.Observable, this._options = i || new u, this._options.targetFrameRate && (this._targetFrameRate = this._options.targetFrameRate), this._options.trackerDuration && (this._trackerDuration = this._options.trackerDuration), r)
                for (var s = 0, a = 0, l = this._options.optimizations; a < l.length; a++) {
                    var c = l[a];
                    c.priority = s++
                }
            this._improvementMode = n, this._scene = t || e.Engine.LastCreatedScene, this._sceneDisposeObserver = this._scene.onDisposeObservable.add((function() {
                o._sceneDisposeObserver = null, o.dispose()
            }))
        }
        return Object.defineProperty(t.prototype, "isInImprovementMode", {
            get: function() {
                return this._improvementMode
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "currentPriorityLevel", {
            get: function() {
                return this._currentPriorityLevel
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "currentFrameRate", {
            get: function() {
                return this._currentFrameRate
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "targetFrameRate", {
            get: function() {
                return this._targetFrameRate
            },
            set: function(e) {
                this._targetFrameRate = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "trackerDuration", {
            get: function() {
                return this._trackerDuration
            },
            set: function(e) {
                this._trackerDuration = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "optimizations", {
            get: function() {
                return this._options.optimizations
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.stop = function() {
            this._isRunning = !1
        }, t.prototype.reset = function() {
            this._currentPriorityLevel = 0
        }, t.prototype.start = function() {
            var e = this;
            this._isRunning || (this._isRunning = !0, this._scene.executeWhenReady((function() {
                setTimeout((function() {
                    e._checkCurrentState()
                }), e._trackerDuration)
            })))
        }, t.prototype._checkCurrentState = function() {
            var e = this;
            if (this._isRunning) {
                var t = this._scene,
                    i = this._options;
                if (this._currentFrameRate = Math.round(t.getEngine().getFps()), this._improvementMode && this._currentFrameRate <= this._targetFrameRate || !this._improvementMode && this._currentFrameRate >= this._targetFrameRate) return this._isRunning = !1, void this.onSuccessObservable.notifyObservers(this);
                for (var r = !0, n = !0, o = 0; o < i.optimizations.length; o++) {
                    var s = i.optimizations[o];
                    s.priority === this._currentPriorityLevel && (n = !1, r = r && s.apply(t, this), this.onNewOptimizationAppliedObservable.notifyObservers(s))
                }
                if (n) return this._isRunning = !1, void this.onFailureObservable.notifyObservers(this);
                r && this._currentPriorityLevel++, t.executeWhenReady((function() {
                    setTimeout((function() {
                        e._checkCurrentState()
                    }), e._trackerDuration)
                }))
            }
        }, t.prototype.dispose = function() {
            this.stop(), this.onSuccessObservable.clear(), this.onFailureObservable.clear(), this.onNewOptimizationAppliedObservable.clear(), this._sceneDisposeObserver && this._scene.onDisposeObservable.remove(this._sceneDisposeObserver)
        }, t.OptimizeAsync = function(e, i, r, n) {
            var o = new t(e, i || u.ModerateDegradationAllowed(), !1);
            return r && o.onSuccessObservable.add((function() {
                r()
            })), n && o.onFailureObservable.add((function() {
                n()
            })), o.start(), o
        }, t
    })();
    e.SceneOptimizer = f
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(e) {
            this.zOffset = 1, this._scene = e
        }
        return t.prototype.render = function(t, i, r) {
            var n = this;
            void 0 === r && (r = !1);
            var o = this._scene,
                s = this._scene.getEngine(),
                a = s.getCaps().instancedArrays && null !== i.visibleInstances[t._id] && void 0 !== i.visibleInstances[t._id];
            if (this.isReady(t, a)) {
                var l = t.getRenderingMesh(),
                    c = t.getMaterial();
                if (c && o.activeCamera) {
                    if (s.enableEffect(this._effect), c.useLogarithmicDepth && this._effect.setFloat("logarithmicDepthConstant", 2 / (Math.log(o.activeCamera.maxZ + 1) / Math.LN2)), this._effect.setFloat("offset", r ? 0 : l.outlineWidth), this._effect.setColor4("color", r ? l.overlayColor : l.outlineColor, r ? l.overlayAlpha : c.alpha), this._effect.setMatrix("viewProjection", o.getTransformMatrix()), l.useBones && l.computeBonesUsingShaders && l.skeleton && this._effect.setMatrices("mBones", l.skeleton.getTransformMatrices(l)), l._bind(t, this._effect, e.Material.TriangleFillMode), c && c.needAlphaTesting()) {
                        var h = c.getAlphaTestTexture();
                        h && (this._effect.setTexture("diffuseSampler", h), this._effect.setMatrix("diffuseMatrix", h.getTextureMatrix()))
                    }
                    s.setZOffset(-this.zOffset), l._processRendering(t, this._effect, e.Material.TriangleFillMode, i, a, (function(e, t) {
                        n._effect.setMatrix("world", t)
                    })), s.setZOffset(0)
                }
            }
        }, t.prototype.isReady = function(t, i) {
            var r = [],
                n = [e.VertexBuffer.PositionKind, e.VertexBuffer.NormalKind],
                o = t.getMesh(),
                s = t.getMaterial();
            s && (s.needAlphaTesting() && (r.push("#define ALPHATEST"), o.isVerticesDataPresent(e.VertexBuffer.UVKind) && (n.push(e.VertexBuffer.UVKind), r.push("#define UV1")), o.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && (n.push(e.VertexBuffer.UV2Kind), r.push("#define UV2"))), s.useLogarithmicDepth && r.push("#define LOGARITHMICDEPTH")), o.useBones && o.computeBonesUsingShaders ? (n.push(e.VertexBuffer.MatricesIndicesKind), n.push(e.VertexBuffer.MatricesWeightsKind), o.numBoneInfluencers > 4 && (n.push(e.VertexBuffer.MatricesIndicesExtraKind), n.push(e.VertexBuffer.MatricesWeightsExtraKind)), r.push("#define NUM_BONE_INFLUENCERS " + o.numBoneInfluencers), r.push("#define BonesPerMesh " + (o.skeleton ? o.skeleton.bones.length + 1 : 0))) : r.push("#define NUM_BONE_INFLUENCERS 0"), i && (r.push("#define INSTANCES"), n.push("world0"), n.push("world1"), n.push("world2"), n.push("world3"));
            var a = r.join("\n");
            return this._cachedDefines !== a && (this._cachedDefines = a, this._effect = this._scene.getEngine().createEffect("outline", n, ["world", "mBones", "viewProjection", "diffuseMatrix", "offset", "color", "logarithmicDepthConstant"], ["diffuseSampler"], a)), this._effect.isReady()
        }, t
    })();
    e.OutlineRenderer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
            function e() {
                this.edges = new Array, this.edgesConnectedCount = 0
            }
            return e
        })(),
        i = (function() {
            function i(e, t, i) {
                void 0 === t && (t = .95), void 0 === i && (i = !1), this.edgesWidthScalerForOrthographic = 1e3, this.edgesWidthScalerForPerspective = 50, this._linesPositions = new Array, this._linesNormals = new Array, this._linesIndices = new Array, this._buffers = {}, this._checkVerticesInsteadOfIndices = !1, this._source = e, this._checkVerticesInsteadOfIndices = i, this._epsilon = t, this._prepareRessources(), this._generateEdgesLines()
            }
            return i.prototype._prepareRessources = function() {
                    this._lineShader || (this._lineShader = new e.ShaderMaterial("lineShader", this._source.getScene(), "line", {
                        attributes: ["position", "normal"],
                        uniforms: ["worldViewProjection", "color", "width", "aspectRatio"]
                    }), this._lineShader.disableDepthWrite = !0, this._lineShader.backFaceCulling = !1)
                }, i.prototype._rebuild = function() {
                    var t = this._buffers[e.VertexBuffer.PositionKind];
                    t && t._rebuild(), (t = this._buffers[e.VertexBuffer.NormalKind]) && t._rebuild();
                    var i = this._source.getScene(),
                        r = i.getEngine();
                    this._ib = r.createIndexBuffer(this._linesIndices)
                }, i.prototype.dispose = function() {
                    var t = this._buffers[e.VertexBuffer.PositionKind];
                    t && (t.dispose(), this._buffers[e.VertexBuffer.PositionKind] = null), t = this._buffers[e.VertexBuffer.NormalKind], t && (t.dispose(), this._buffers[e.VertexBuffer.NormalKind] = null), this._source.getScene().getEngine()._releaseBuffer(this._ib), this._lineShader.dispose()
                }, i.prototype._processEdgeForAdjacencies = function(e, t, i, r, n) {
                    return e === i && t === r || e === r && t === i ? 0 : e === r && t === n || e === n && t === r ? 1 : e === n && t === i || e === i && t === n ? 2 : -1
                },
                i.prototype._processEdgeForAdjacenciesWithVertices = function(e, t, i, r, n) {
                    return e.equalsWithEpsilon(i) && t.equalsWithEpsilon(r) || e.equalsWithEpsilon(r) && t.equalsWithEpsilon(i) ? 0 : e.equalsWithEpsilon(r) && t.equalsWithEpsilon(n) || e.equalsWithEpsilon(n) && t.equalsWithEpsilon(r) ? 1 : e.equalsWithEpsilon(n) && t.equalsWithEpsilon(i) || e.equalsWithEpsilon(i) && t.equalsWithEpsilon(n) ? 2 : -1
                }, i.prototype._checkEdge = function(t, i, r, n, o) {
                    var s;
                    if (void 0 === i) s = !0;
                    else {
                        s = e.Vector3.Dot(r[t], r[i]) < this._epsilon
                    }
                    if (s) {
                        var a = this._linesPositions.length / 3;
                        n.subtract(o).normalize(), this._linesPositions.push(n.x), this._linesPositions.push(n.y), this._linesPositions.push(n.z), this._linesPositions.push(n.x), this._linesPositions.push(n.y), this._linesPositions.push(n.z), this._linesPositions.push(o.x), this._linesPositions.push(o.y), this._linesPositions.push(o.z), this._linesPositions.push(o.x), this._linesPositions.push(o.y), this._linesPositions.push(o.z), this._linesNormals.push(o.x), this._linesNormals.push(o.y), this._linesNormals.push(o.z), this._linesNormals.push(-1), this._linesNormals.push(o.x), this._linesNormals.push(o.y), this._linesNormals.push(o.z), this._linesNormals.push(1), this._linesNormals.push(n.x), this._linesNormals.push(n.y), this._linesNormals.push(n.z), this._linesNormals.push(-1), this._linesNormals.push(n.x), this._linesNormals.push(n.y), this._linesNormals.push(n.z), this._linesNormals.push(1), this._linesIndices.push(a), this._linesIndices.push(a + 1), this._linesIndices.push(a + 2), this._linesIndices.push(a), this._linesIndices.push(a + 2), this._linesIndices.push(a + 3)
                    }
                }, i.prototype._generateEdgesLines = function() {
                    var i = this._source.getVerticesData(e.VertexBuffer.PositionKind),
                        r = this._source.getIndices();
                    if (r && i) {
                        var n, o, s = new Array,
                            a = new Array;
                        for (n = 0; n < r.length; n += 3) {
                            o = new t;
                            var l = r[n],
                                c = r[n + 1],
                                h = r[n + 2];
                            o.p0 = new e.Vector3(i[3 * l], i[3 * l + 1], i[3 * l + 2]), o.p1 = new e.Vector3(i[3 * c], i[3 * c + 1], i[3 * c + 2]), o.p2 = new e.Vector3(i[3 * h], i[3 * h + 1], i[3 * h + 2]);
                            var u = e.Vector3.Cross(o.p1.subtract(o.p0), o.p2.subtract(o.p1));
                            u.normalize(), a.push(u), s.push(o)
                        }
                        for (n = 0; n < s.length; n++) {
                            o = s[n];
                            for (var f = n + 1; f < s.length; f++) {
                                var d = s[f];
                                if (3 === o.edgesConnectedCount) break;
                                if (3 !== d.edgesConnectedCount)
                                    for (var p = r[3 * f], _ = r[3 * f + 1], m = r[3 * f + 2], g = 0; g < 3; g++) {
                                        var v = 0;
                                        if (void 0 === o.edges[g]) {
                                            switch (g) {
                                                case 0:
                                                    v = this._checkVerticesInsteadOfIndices ? this._processEdgeForAdjacenciesWithVertices(o.p0, o.p1, d.p0, d.p1, d.p2) : this._processEdgeForAdjacencies(r[3 * n], r[3 * n + 1], p, _, m);
                                                    break;
                                                case 1:
                                                    v = this._checkVerticesInsteadOfIndices ? this._processEdgeForAdjacenciesWithVertices(o.p1, o.p2, d.p0, d.p1, d.p2) : this._processEdgeForAdjacencies(r[3 * n + 1], r[3 * n + 2], p, _, m);
                                                    break;
                                                case 2:
                                                    v = this._checkVerticesInsteadOfIndices ? this._processEdgeForAdjacenciesWithVertices(o.p2, o.p0, d.p0, d.p1, d.p2) : this._processEdgeForAdjacencies(r[3 * n + 2], r[3 * n], p, _, m)
                                            }
                                            if (-1 !== v && (o.edges[g] = f, d.edges[v] = n, o.edgesConnectedCount++, d.edgesConnectedCount++, 3 === o.edgesConnectedCount)) break
                                        }
                                    }
                            }
                        }
                        for (n = 0; n < s.length; n++) {
                            var y = s[n];
                            this._checkEdge(n, y.edges[0], a, y.p0, y.p1), this._checkEdge(n, y.edges[1], a, y.p1, y.p2), this._checkEdge(n, y.edges[2], a, y.p2, y.p0)
                        }
                        var b = this._source.getScene().getEngine();
                        this._buffers[e.VertexBuffer.PositionKind] = new e.VertexBuffer(b, this._linesPositions, e.VertexBuffer.PositionKind, !1), this._buffers[e.VertexBuffer.NormalKind] = new e.VertexBuffer(b, this._linesNormals, e.VertexBuffer.NormalKind, !1, !1, 4), this._ib = b.createIndexBuffer(this._linesIndices), this._indicesCount = this._linesIndices.length
                    }
                }, i.prototype.render = function() {
                    var t = this._source.getScene();
                    if (this._lineShader.isReady() && t.activeCamera) {
                        var i = t.getEngine();
                        this._lineShader._preBind(), i.bindBuffers(this._buffers, this._ib, this._lineShader.getEffect()), t.resetCachedMaterial(), this._lineShader.setColor4("color", this._source.edgesColor), t.activeCamera.mode === e.Camera.ORTHOGRAPHIC_CAMERA ? this._lineShader.setFloat("width", this._source.edgesWidth / this.edgesWidthScalerForOrthographic) : this._lineShader.setFloat("width", this._source.edgesWidth / this.edgesWidthScalerForPerspective), this._lineShader.setFloat("aspectRatio", i.getAspectRatio(t.activeCamera)), this._lineShader.bind(this._source.getWorldMatrix()), i.drawElementsType(e.Material.TriangleFillMode, 0, this._indicesCount), this._lineShader.unbind(), i.setDepthWrite(!0)
                    }
                }, i
        })();
    e.EdgesRenderer = i
})(BABYLON || (BABYLON = {}));
var __assign = this && this.__assign || Object.assign || function(e) {
        for (var t, i = 1, r = arguments.length; i < r; i++) {
            t = arguments[i];
            for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n])
        }
        return e
    },
    BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i) {
            this.name = t, this._vertexBuffers = {}, this._maxSize = 0, this._mainTextureDesiredSize = {
                width: 0,
                height: 0
            }, this._shouldRender = !0, this._postProcesses = [], this._textures = [], this._emissiveTextureAndColor = {
                texture: null,
                color: new e.Color4
            }, this.neutralColor = new e.Color4, this.isEnabled = !0, this.onDisposeObservable = new e.Observable, this.onBeforeRenderMainTextureObservable = new e.Observable, this.onBeforeComposeObservable = new e.Observable, this.onAfterComposeObservable = new e.Observable, this.onSizeChangedObservable = new e.Observable, this._scene = i || e.Engine.LastCreatedScene, this._engine = i.getEngine(), this._maxSize = this._engine.getCaps().maxTextureSize, this._scene.effectLayers.push(this), this._generateIndexBuffer(), this._genrateVertexBuffer()
        }
        return Object.defineProperty(t.prototype, "camera", {
            get: function() {
                return this._effectLayerOptions.camera
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._init = function(t) {
            this._effectLayerOptions = __assign({
                mainTextureRatio: .5,
                alphaBlendingMode: e.Engine.ALPHA_COMBINE,
                camera: null
            }, t), this._setMainTextureSize(), this._createMainTexture(), this._createTextureAndPostProcesses(), this._mergeEffect = this._createMergeEffect()
        }, t.prototype._generateIndexBuffer = function() {
            var e = [];
            e.push(0), e.push(1), e.push(2), e.push(0), e.push(2), e.push(3), this._indexBuffer = this._engine.createIndexBuffer(e)
        }, t.prototype._genrateVertexBuffer = function() {
            var t = [];
            t.push(1, 1), t.push(-1, 1), t.push(-1, -1), t.push(1, -1);
            var i = new e.VertexBuffer(this._engine, t, e.VertexBuffer.PositionKind, !1, !1, 2);
            this._vertexBuffers[e.VertexBuffer.PositionKind] = i
        }, t.prototype._setMainTextureSize = function() {
            this._effectLayerOptions.mainTextureFixedSize ? (this._mainTextureDesiredSize.width = this._effectLayerOptions.mainTextureFixedSize, this._mainTextureDesiredSize.height = this._effectLayerOptions.mainTextureFixedSize) : (this._mainTextureDesiredSize.width = this._engine.getRenderWidth() * this._effectLayerOptions.mainTextureRatio, this._mainTextureDesiredSize.height = this._engine.getRenderHeight() * this._effectLayerOptions.mainTextureRatio, this._mainTextureDesiredSize.width = this._engine.needPOTTextures ? e.Tools.GetExponentOfTwo(this._mainTextureDesiredSize.width, this._maxSize) : this._mainTextureDesiredSize.width, this._mainTextureDesiredSize.height = this._engine.needPOTTextures ? e.Tools.GetExponentOfTwo(this._mainTextureDesiredSize.height, this._maxSize) : this._mainTextureDesiredSize.height), this._mainTextureDesiredSize.width = Math.floor(this._mainTextureDesiredSize.width), this._mainTextureDesiredSize.height = Math.floor(this._mainTextureDesiredSize.height)
        }, t.prototype._createMainTexture = function() {
            var t = this;
            this._mainTexture = new e.RenderTargetTexture("HighlightLayerMainRTT", {
                width: this._mainTextureDesiredSize.width,
                height: this._mainTextureDesiredSize.height
            }, this._scene, !1, !0, e.Engine.TEXTURETYPE_UNSIGNED_INT), this._mainTexture.activeCamera = this._effectLayerOptions.camera, this._mainTexture.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._mainTexture.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._mainTexture.anisotropicFilteringLevel = 1, this._mainTexture.updateSamplingMode(e.Texture.BILINEAR_SAMPLINGMODE), this._mainTexture.renderParticles = !1, this._mainTexture.renderList = null, this._mainTexture.ignoreCameraViewport = !0, this._mainTexture.customRenderFunction = function(e, i, r, n) {
                t.onBeforeRenderMainTextureObservable.notifyObservers(t);
                var o, s = t._scene.getEngine();
                if (n.length) {
                    for (s.setColorWrite(!1), o = 0; o < n.length; o++) t._renderSubMesh(n.data[o]);
                    s.setColorWrite(!0)
                }
                for (o = 0; o < e.length; o++) t._renderSubMesh(e.data[o]);
                for (o = 0; o < i.length; o++) t._renderSubMesh(i.data[o]);
                for (o = 0; o < r.length; o++) t._renderSubMesh(r.data[o])
            }, this._mainTexture.onClearObservable.add((function(e) {
                e.clear(t.neutralColor, !0, !0, !0)
            }))
        }, t.prototype._isReady = function(t, i, r) {
            var n = t.getMaterial();
            if (!n) return !1;
            if (!n.isReady(t.getMesh(), i)) return !1;
            var o = [],
                s = [e.VertexBuffer.PositionKind],
                a = t.getMesh(),
                l = !1,
                c = !1;
            if (n && n.needAlphaTesting()) {
                var h = n.getAlphaTestTexture();
                h && (o.push("#define ALPHATEST"), a.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && 1 === h.coordinatesIndex ? (o.push("#define DIFFUSEUV2"), c = !0) : a.isVerticesDataPresent(e.VertexBuffer.UVKind) && (o.push("#define DIFFUSEUV1"), l = !0))
            }
            r && (o.push("#define EMISSIVE"), a.isVerticesDataPresent(e.VertexBuffer.UV2Kind) && 1 === r.coordinatesIndex ? (o.push("#define EMISSIVEUV2"), c = !0) : a.isVerticesDataPresent(e.VertexBuffer.UVKind) && (o.push("#define EMISSIVEUV1"), l = !0)), l && (s.push(e.VertexBuffer.UVKind), o.push("#define UV1")), c && (s.push(e.VertexBuffer.UV2Kind), o.push("#define UV2")), a.useBones && a.computeBonesUsingShaders ? (s.push(e.VertexBuffer.MatricesIndicesKind), s.push(e.VertexBuffer.MatricesWeightsKind), a.numBoneInfluencers > 4 && (s.push(e.VertexBuffer.MatricesIndicesExtraKind), s.push(e.VertexBuffer.MatricesWeightsExtraKind)), o.push("#define NUM_BONE_INFLUENCERS " + a.numBoneInfluencers), o.push("#define BonesPerMesh " + (a.skeleton ? a.skeleton.bones.length + 1 : 0))) : o.push("#define NUM_BONE_INFLUENCERS 0"), i && (o.push("#define INSTANCES"), s.push("world0"), s.push("world1"), s.push("world2"), s.push("world3"));
            var u = o.join("\n");
            return this._cachedDefines !== u && (this._cachedDefines = u, this._effectLayerMapGenerationEffect = this._scene.getEngine().createEffect("glowMapGeneration", s, ["world", "mBones", "viewProjection", "diffuseMatrix", "color", "emissiveMatrix"], ["diffuseSampler", "emissiveSampler"], u)), this._effectLayerMapGenerationEffect.isReady()
        }, t.prototype.render = function() {
            var e = this._mergeEffect;
            if (e.isReady()) {
                for (var t = 0; t < this._postProcesses.length; t++)
                    if (!this._postProcesses[t].isReady()) return;
                var i = this._scene.getEngine();
                this.onBeforeComposeObservable.notifyObservers(this), i.enableEffect(e), i.setState(!1), i.bindBuffers(this._vertexBuffers, this._indexBuffer, e);
                var r = i.getAlphaMode();
                i.setAlphaMode(this._effectLayerOptions.alphaBlendingMode), this._internalRender(e), i.setAlphaMode(r), this.onAfterComposeObservable.notifyObservers(this);
                var n = this._mainTexture.getSize();
                this._setMainTextureSize(), n.width === this._mainTextureDesiredSize.width && n.height === this._mainTextureDesiredSize.height || (this.onSizeChangedObservable.notifyObservers(this), this._disposeTextureAndPostProcesses(), this._createMainTexture(), this._createTextureAndPostProcesses())
            }
        }, t.prototype.hasMesh = function(e) {
            return !0
        }, t.prototype.shouldRender = function() {
            return this.isEnabled && this._shouldRender
        }, t.prototype._shouldRenderMesh = function(e) {
            return !0
        }, t.prototype._shouldRenderEmissiveTextureForMesh = function(e) {
            return !0
        }, t.prototype._renderSubMesh = function(t) {
            var i = this;
            if (this.shouldRender()) {
                var r = t.getMaterial(),
                    n = t.getRenderingMesh(),
                    o = this._scene,
                    s = o.getEngine();
                if (r && !r.needAlphaBlendingForMesh(n)) {
                    s.setState(r.backFaceCulling);
                    var a = n._getInstancesRenderList(t._id);
                    if (!a.mustReturn && this._shouldRenderMesh(n)) {
                        var l = s.getCaps().instancedArrays && null !== a.visibleInstances[t._id] && void 0 !== a.visibleInstances[t._id];
                        if (this._setEmissiveTextureAndColor(n, t, r), this._isReady(t, l, this._emissiveTextureAndColor.texture)) {
                            if (s.enableEffect(this._effectLayerMapGenerationEffect), n._bind(t, this._effectLayerMapGenerationEffect, e.Material.TriangleFillMode), this._effectLayerMapGenerationEffect.setMatrix("viewProjection", o.getTransformMatrix()), this._effectLayerMapGenerationEffect.setFloat4("color", this._emissiveTextureAndColor.color.r, this._emissiveTextureAndColor.color.g, this._emissiveTextureAndColor.color.b, this._emissiveTextureAndColor.color.a), r && r.needAlphaTesting()) {
                                var c = r.getAlphaTestTexture();
                                if (c) {
                                    this._effectLayerMapGenerationEffect.setTexture("diffuseSampler", c);
                                    var h = c.getTextureMatrix();
                                    h && this._effectLayerMapGenerationEffect.setMatrix("diffuseMatrix", h)
                                }
                            }
                            this._emissiveTextureAndColor.texture && (this._effectLayerMapGenerationEffect.setTexture("emissiveSampler", this._emissiveTextureAndColor.texture), this._effectLayerMapGenerationEffect.setMatrix("emissiveMatrix", this._emissiveTextureAndColor.texture.getTextureMatrix())), n.useBones && n.computeBonesUsingShaders && n.skeleton && this._effectLayerMapGenerationEffect.setMatrices("mBones", n.skeleton.getTransformMatrices(n)), n._processRendering(t, this._effectLayerMapGenerationEffect, e.Material.TriangleFillMode, a, l, (function(e, t) {
                                return i._effectLayerMapGenerationEffect.setMatrix("world", t)
                            }))
                        } else this._mainTexture.resetRefreshCounter()
                    }
                }
            }
        }, t.prototype._rebuild = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && t._rebuild(), this._generateIndexBuffer()
        }, t.prototype._disposeTextureAndPostProcesses = function() {
            this._mainTexture.dispose();
            for (var e = 0; e < this._postProcesses.length; e++) this._postProcesses[e] && this._postProcesses[e].dispose();
            this._postProcesses = [];
            for (var e = 0; e < this._textures.length; e++) this._textures[e] && this._textures[e].dispose();
            this._textures = []
        }, t.prototype.dispose = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && (t.dispose(), this._vertexBuffers[e.VertexBuffer.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null), this._disposeTextureAndPostProcesses();
            var i = this._scene.effectLayers.indexOf(this, 0);
            i > -1 && this._scene.effectLayers.splice(i, 1), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.onBeforeRenderMainTextureObservable.clear(), this.onBeforeComposeObservable.clear(), this.onAfterComposeObservable.clear(), this.onSizeChangedObservable.clear()
        }, t
    })();
    e.EffectLayer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
            function i(i, r, n, o, s, a, l, c) {
                void 0 === a && (a = e.Texture.BILINEAR_SAMPLINGMODE);
                var h = t.call(this, i, "glowBlurPostProcess", ["screenSize", "direction", "blurWidth"], null, o, s, a, l, c) || this;
                return h.direction = r, h.kernel = n, h.onApplyObservable.add((function(e) {
                    e.setFloat2("screenSize", h.width, h.height), e.setVector2("direction", h.direction), e.setFloat("blurWidth", h.kernel)
                })), h
            }
            return __extends(i, t), i
        })(e.PostProcess),
        i = (function(i) {
            function r(t, n, o) {
                var s = i.call(this, t, n) || this;
                return s.name = t, s.innerGlow = !0, s.outerGlow = !0, s.onBeforeBlurObservable = new e.Observable, s.onAfterBlurObservable = new e.Observable, s._instanceGlowingMeshStencilReference = r.GlowingMeshStencilReference++, s._meshes = {}, s._excludedMeshes = {}, s.neutralColor = r.NeutralColor, s._engine.isStencilEnable || e.Tools.Warn("Rendering the Highlight Layer requires the stencil to be active on the canvas. var engine = new BABYLON.Engine(canvas, antialias, { stencil: true }"), s._options = __assign({
                    mainTextureRatio: .5,
                    blurTextureSizeRatio: .5,
                    blurHorizontalSize: 1,
                    blurVerticalSize: 1,
                    alphaBlendingMode: e.Engine.ALPHA_COMBINE,
                    camera: null
                }, o), s._init({
                    alphaBlendingMode: s._options.alphaBlendingMode,
                    camera: s._options.camera,
                    mainTextureFixedSize: s._options.mainTextureFixedSize,
                    mainTextureRatio: s._options.mainTextureRatio
                }), s._shouldRender = !1, s
            }
            return __extends(r, i), Object.defineProperty(r.prototype, "blurHorizontalSize", {
                get: function() {
                    return this._horizontalBlurPostprocess.kernel
                },
                set: function(e) {
                    this._horizontalBlurPostprocess.kernel = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "blurVerticalSize", {
                get: function() {
                    return this._verticalBlurPostprocess.kernel
                },
                set: function(e) {
                    this._verticalBlurPostprocess.kernel = e
                },
                enumerable: !0,
                configurable: !0
            }), r.prototype.getEffectName = function() {
                return r.EffectName
            }, r.prototype._createMergeEffect = function() {
                return this._engine.createEffect("glowMapMerge", [e.VertexBuffer.PositionKind], ["offset"], ["textureSampler"], this._options.isStroke ? "#define STROKE \n" : void 0)
            }, r.prototype._createTextureAndPostProcesses = function() {
                var i = this,
                    r = this._mainTextureDesiredSize.width * this._options.blurTextureSizeRatio,
                    n = this._mainTextureDesiredSize.height * this._options.blurTextureSizeRatio;
                r = this._engine.needPOTTextures ? e.Tools.GetExponentOfTwo(r, this._maxSize) : r, n = this._engine.needPOTTextures ? e.Tools.GetExponentOfTwo(n, this._maxSize) : n, this._blurTexture = new e.RenderTargetTexture("HighlightLayerBlurRTT", {
                    width: r,
                    height: n
                }, this._scene, !1, !0, e.Engine.TEXTURETYPE_HALF_FLOAT), this._blurTexture.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._blurTexture.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._blurTexture.anisotropicFilteringLevel = 16, this._blurTexture.updateSamplingMode(e.Texture.TRILINEAR_SAMPLINGMODE), this._blurTexture.renderParticles = !1, this._blurTexture.ignoreCameraViewport = !0, this._textures = [this._blurTexture], this._options.alphaBlendingMode === e.Engine.ALPHA_COMBINE ? (this._downSamplePostprocess = new e.PassPostProcess("HighlightLayerPPP", this._options.blurTextureSizeRatio, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine()), this._downSamplePostprocess.onApplyObservable.add((function(e) {
                    e.setTexture("textureSampler", i._mainTexture)
                })), this._horizontalBlurPostprocess = new t("HighlightLayerHBP", new e.Vector2(1, 0), this._options.blurHorizontalSize, 1, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine()), this._horizontalBlurPostprocess.onApplyObservable.add((function(e) {
                    e.setFloat2("screenSize", r, n)
                })), this._verticalBlurPostprocess = new t("HighlightLayerVBP", new e.Vector2(0, 1), this._options.blurVerticalSize, 1, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine()), this._verticalBlurPostprocess.onApplyObservable.add((function(e) {
                    e.setFloat2("screenSize", r, n)
                })), this._postProcesses = [this._downSamplePostprocess, this._horizontalBlurPostprocess, this._verticalBlurPostprocess]) : (this._horizontalBlurPostprocess = new e.BlurPostProcess("HighlightLayerHBP", new e.Vector2(1, 0), this._options.blurHorizontalSize / 2, {
                    width: r,
                    height: n
                }, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_HALF_FLOAT), this._horizontalBlurPostprocess.width = r, this._horizontalBlurPostprocess.height = n, this._horizontalBlurPostprocess.onApplyObservable.add((function(e) {
                    e.setTexture("textureSampler", i._mainTexture)
                })), this._verticalBlurPostprocess = new e.BlurPostProcess("HighlightLayerVBP", new e.Vector2(0, 1), this._options.blurVerticalSize / 2, {
                    width: r,
                    height: n
                }, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_HALF_FLOAT), this._postProcesses = [this._horizontalBlurPostprocess, this._verticalBlurPostprocess]), this._mainTexture.onAfterUnbindObservable.add((function() {
                    i.onBeforeBlurObservable.notifyObservers(i);
                    var e = i._blurTexture.getInternalTexture();
                    e && i._scene.postProcessManager.directRender(i._postProcesses, e, !0), i.onAfterBlurObservable.notifyObservers(i)
                })), this._postProcesses.map((function(e) {
                    e.autoClear = !1
                }))
            }, r.prototype.needStencil = function() {
                return !0
            }, r.prototype.isReady = function(e, t) {
                var r = e.getMaterial(),
                    n = e.getRenderingMesh();
                if (!r || !n || !this._meshes) return !1;
                var o = null,
                    s = this._meshes[n.uniqueId];
                return s && s.glowEmissiveOnly && r && (o = r.emissiveTexture), i.prototype._isReady.call(this, e, t, o)
            }, r.prototype._internalRender = function(t) {
                t.setTexture("textureSampler", this._blurTexture);
                var i = this._engine,
                    r = i.getStencilBuffer(),
                    n = i.getStencilFunction(),
                    o = i.getStencilMask(),
                    s = i.getStencilOperationPass(),
                    a = i.getStencilOperationFail(),
                    l = i.getStencilOperationDepthFail(),
                    c = i.getStencilFunctionReference();
                i.setStencilOperationPass(e.Engine.REPLACE), i.setStencilOperationFail(e.Engine.KEEP), i.setStencilOperationDepthFail(e.Engine.KEEP), i.setStencilMask(0), i.setStencilBuffer(!0), i.setStencilFunctionReference(this._instanceGlowingMeshStencilReference), this.outerGlow && (t.setFloat("offset", 0), i.setStencilFunction(e.Engine.NOTEQUAL), i.drawElementsType(e.Material.TriangleFillMode, 0, 6)), this.innerGlow && (t.setFloat("offset", 1), i.setStencilFunction(e.Engine.EQUAL), i.drawElementsType(e.Material.TriangleFillMode, 0, 6)), i.setStencilFunction(n), i.setStencilMask(o), i.setStencilBuffer(r), i.setStencilOperationPass(s), i.setStencilOperationFail(a), i.setStencilOperationDepthFail(l), i.setStencilFunctionReference(c)
            }, r.prototype.shouldRender = function() {
                return !!i.prototype.shouldRender.call(this) && !!this._meshes
            }, r.prototype._shouldRenderMesh = function(e) {
                return !this._excludedMeshes || !this._excludedMeshes[e.uniqueId]
            }, r.prototype._setEmissiveTextureAndColor = function(e, t, i) {
                var r = this._meshes[e.uniqueId];
                r ? this._emissiveTextureAndColor.color.set(r.color.r, r.color.g, r.color.b, 1) : this._emissiveTextureAndColor.color.set(this.neutralColor.r, this.neutralColor.g, this.neutralColor.b, this.neutralColor.a), r && r.glowEmissiveOnly && i ? (this._emissiveTextureAndColor.texture = i.emissiveTexture, this._emissiveTextureAndColor.color.set(1, 1, 1, 1)) : this._emissiveTextureAndColor.texture = null
            }, r.prototype.addExcludedMesh = function(e) {
                if (this._excludedMeshes) {
                    this._excludedMeshes[e.uniqueId] || (this._excludedMeshes[e.uniqueId] = {
                        mesh: e,
                        beforeRender: e.onBeforeRenderObservable.add((function(e) {
                            e.getEngine().setStencilBuffer(!1)
                        })),
                        afterRender: e.onAfterRenderObservable.add((function(e) {
                            e.getEngine().setStencilBuffer(!0)
                        }))
                    })
                }
            }, r.prototype.removeExcludedMesh = function(e) {
                if (this._excludedMeshes) {
                    var t = this._excludedMeshes[e.uniqueId];
                    t && (t.beforeRender && e.onBeforeRenderObservable.remove(t.beforeRender), t.afterRender && e.onAfterRenderObservable.remove(t.afterRender)), this._excludedMeshes[e.uniqueId] = null
                }
            }, r.prototype.hasMesh = function(e) {
                return !!this._meshes && (void 0 !== this._meshes[e.uniqueId] && null !== this._meshes[e.uniqueId])
            }, r.prototype.addMesh = function(e, t, i) {
                var r = this;
                if (void 0 === i && (i = !1), this._meshes) {
                    var n = this._meshes[e.uniqueId];
                    n ? n.color = t : this._meshes[e.uniqueId] = {
                        mesh: e,
                        color: t,
                        observerHighlight: e.onBeforeRenderObservable.add((function(e) {
                            r._excludedMeshes && r._excludedMeshes[e.uniqueId] ? r._defaultStencilReference(e) : e.getScene().getEngine().setStencilFunctionReference(r._instanceGlowingMeshStencilReference)
                        })),
                        observerDefault: e.onAfterRenderObservable.add(this._defaultStencilReference),
                        glowEmissiveOnly: i
                    }, this._shouldRender = !0
                }
            }, r.prototype.removeMesh = function(e) {
                if (this._meshes) {
                    var t = this._meshes[e.uniqueId];
                    t && (t.observerHighlight && e.onBeforeRenderObservable.remove(t.observerHighlight), t.observerDefault && e.onAfterRenderObservable.remove(t.observerDefault), delete this._meshes[e.uniqueId]), this._shouldRender = !1;
                    for (var i in this._meshes)
                        if (this._meshes[i]) {
                            this._shouldRender = !0;
                            break
                        }
                }
            }, r.prototype._defaultStencilReference = function(e) {
                e.getScene().getEngine().setStencilFunctionReference(r.NormalMeshStencilReference)
            }, r.prototype._disposeMesh = function(e) {
                this.removeMesh(e), this.removeExcludedMesh(e)
            }, r.prototype.dispose = function() {
                if (this._meshes) {
                    for (var e in this._meshes) {
                        var t = this._meshes[e];
                        t && t.mesh && (t.observerHighlight && t.mesh.onBeforeRenderObservable.remove(t.observerHighlight), t.observerDefault && t.mesh.onAfterRenderObservable.remove(t.observerDefault))
                    }
                    this._meshes = null
                }
                if (this._excludedMeshes) {
                    for (var e in this._excludedMeshes) {
                        var t = this._excludedMeshes[e];
                        t && (t.beforeRender && t.mesh.onBeforeRenderObservable.remove(t.beforeRender), t.afterRender && t.mesh.onAfterRenderObservable.remove(t.afterRender))
                    }
                    this._excludedMeshes = null
                }
                i.prototype.dispose.call(this)
            }, r.EffectName = "HighlightLayer", r.NeutralColor = new e.Color4(0, 0, 0, 0), r.GlowingMeshStencilReference = 2, r.NormalMeshStencilReference = 1, r
        })(e.EffectLayer);
    e.HighlightLayer = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(r, n, o) {
            var s = t.call(this, r, n) || this;
            return s.name = r, s._intensity = 1, s._includedOnlyMeshes = [], s._excludedMeshes = [], s.neutralColor = new e.Color4(0, 0, 0, 1), s._options = __assign({
                mainTextureRatio: i.DefaultTextureRatio,
                blurKernelSize: 32,
                mainTextureFixedSize: void 0,
                camera: null,
                mainTextureSamples: 1
            }, o), s._init({
                alphaBlendingMode: e.Engine.ALPHA_ADD,
                camera: s._options.camera,
                mainTextureFixedSize: s._options.mainTextureFixedSize,
                mainTextureRatio: s._options.mainTextureRatio
            }), s
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "blurKernelSize", {
            get: function() {
                return this._horizontalBlurPostprocess1.kernel
            },
            set: function(e) {
                this._horizontalBlurPostprocess1.kernel = e, this._verticalBlurPostprocess1.kernel = e, this._horizontalBlurPostprocess2.kernel = e, this._verticalBlurPostprocess2.kernel = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(i.prototype, "intensity", {
            get: function() {
                return this._intensity
            },
            set: function(e) {
                this._intensity = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.getEffectName = function() {
            return i.EffectName
        }, i.prototype._createMergeEffect = function() {
            return this._engine.createEffect("glowMapMerge", [e.VertexBuffer.PositionKind], ["offset"], ["textureSampler", "textureSampler2"], "#define EMISSIVE \n")
        }, i.prototype._createTextureAndPostProcesses = function() {
            var t = this,
                i = this._mainTextureDesiredSize.width,
                r = this._mainTextureDesiredSize.height;
            i = this._engine.needPOTTextures ? e.Tools.GetExponentOfTwo(i, this._maxSize) : i, r = this._engine.needPOTTextures ? e.Tools.GetExponentOfTwo(r, this._maxSize) : r, this._blurTexture1 = new e.RenderTargetTexture("GlowLayerBlurRTT", {
                width: i,
                height: r
            }, this._scene, !1, !0, e.Engine.TEXTURETYPE_HALF_FLOAT), this._blurTexture1.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._blurTexture1.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._blurTexture1.updateSamplingMode(e.Texture.BILINEAR_SAMPLINGMODE), this._blurTexture1.renderParticles = !1, this._blurTexture1.ignoreCameraViewport = !0;
            var n = Math.floor(i / 2),
                o = Math.floor(r / 2);
            this._blurTexture2 = new e.RenderTargetTexture("GlowLayerBlurRTT2", {
                width: n,
                height: o
            }, this._scene, !1, !0, e.Engine.TEXTURETYPE_HALF_FLOAT), this._blurTexture2.wrapU = e.Texture.CLAMP_ADDRESSMODE, this._blurTexture2.wrapV = e.Texture.CLAMP_ADDRESSMODE, this._blurTexture2.updateSamplingMode(e.Texture.BILINEAR_SAMPLINGMODE), this._blurTexture2.renderParticles = !1, this._blurTexture2.ignoreCameraViewport = !0, this._textures = [this._blurTexture1, this._blurTexture2], this._horizontalBlurPostprocess1 = new e.BlurPostProcess("GlowLayerHBP1", new e.Vector2(1, 0), this._options.blurKernelSize / 2, {
                width: i,
                height: r
            }, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_HALF_FLOAT), this._horizontalBlurPostprocess1.width = i, this._horizontalBlurPostprocess1.height = r, this._horizontalBlurPostprocess1.onApplyObservable.add((function(e) {
                e.setTexture("textureSampler", t._mainTexture)
            })), this._verticalBlurPostprocess1 = new e.BlurPostProcess("GlowLayerVBP1", new e.Vector2(0, 1), this._options.blurKernelSize / 2, {
                width: i,
                height: r
            }, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_HALF_FLOAT), this._horizontalBlurPostprocess2 = new e.BlurPostProcess("GlowLayerHBP2", new e.Vector2(1, 0), this._options.blurKernelSize / 2, {
                width: n,
                height: o
            }, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_HALF_FLOAT), this._horizontalBlurPostprocess2.width = n, this._horizontalBlurPostprocess2.height = o, this._horizontalBlurPostprocess2.onApplyObservable.add((function(e) {
                e.setTexture("textureSampler", t._blurTexture1)
            })), this._verticalBlurPostprocess2 = new e.BlurPostProcess("GlowLayerVBP2", new e.Vector2(0, 1), this._options.blurKernelSize / 2, {
                width: n,
                height: o
            }, null, e.Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), !1, e.Engine.TEXTURETYPE_HALF_FLOAT), this._postProcesses = [this._horizontalBlurPostprocess1, this._verticalBlurPostprocess1, this._horizontalBlurPostprocess2, this._verticalBlurPostprocess2], this._postProcesses1 = [this._horizontalBlurPostprocess1, this._verticalBlurPostprocess1], this._postProcesses2 = [this._horizontalBlurPostprocess2, this._verticalBlurPostprocess2], this._mainTexture.samples = this._options.mainTextureSamples, this._mainTexture.onAfterUnbindObservable.add((function() {
                var e = t._blurTexture1.getInternalTexture();
                e && (t._scene.postProcessManager.directRender(t._postProcesses1, e, !0), (e = t._blurTexture2.getInternalTexture()) && t._scene.postProcessManager.directRender(t._postProcesses2, e, !0))
            })), this._postProcesses.map((function(e) {
                e.autoClear = !1
            }))
        }, i.prototype.isReady = function(e, i) {
            var r = e.getMaterial(),
                n = e.getRenderingMesh();
            if (!r || !n) return !1;
            var o = r.emissiveTexture;
            return t.prototype._isReady.call(this, e, i, o)
        }, i.prototype.needStencil = function() {
            return !1
        }, i.prototype._internalRender = function(t) {
            t.setTexture("textureSampler", this._blurTexture1), t.setTexture("textureSampler2", this._blurTexture2), t.setFloat("offset", this._intensity);
            var i = this._engine,
                r = i.getStencilBuffer();
            i.setStencilBuffer(!1), i.drawElementsType(e.Material.TriangleFillMode, 0, 6), i.setStencilBuffer(r)
        }, i.prototype._setEmissiveTextureAndColor = function(e, t, i) {
            var r = 1;
            this.customEmissiveTextureSelector ? this._emissiveTextureAndColor.texture = this.customEmissiveTextureSelector(e, t, i) : i ? (this._emissiveTextureAndColor.texture = i.emissiveTexture, this._emissiveTextureAndColor.texture && (r = this._emissiveTextureAndColor.texture.level)) : this._emissiveTextureAndColor.texture = null, this.customEmissiveColorSelector ? this.customEmissiveColorSelector(e, t, i, this._emissiveTextureAndColor.color) : i.emissiveColor ? this._emissiveTextureAndColor.color.set(i.emissiveColor.r * r, i.emissiveColor.g * r, i.emissiveColor.b * r, 1) : this._emissiveTextureAndColor.color.set(this.neutralColor.r, this.neutralColor.g, this.neutralColor.b, this.neutralColor.a)
        }, i.prototype._shouldRenderMesh = function(e) {
            return this.hasMesh(e)
        }, i.prototype.addExcludedMesh = function(e) {
            -1 === this._excludedMeshes.indexOf(e.uniqueId) && this._excludedMeshes.push(e.uniqueId)
        }, i.prototype.removeExcludedMesh = function(e) {
            var t = this._excludedMeshes.indexOf(e.uniqueId); - 1 !== t && this._excludedMeshes.splice(t, 1)
        }, i.prototype.addIncludedOnlyMesh = function(e) {
            -1 === this._includedOnlyMeshes.indexOf(e.uniqueId) && this._includedOnlyMeshes.push(e.uniqueId)
        }, i.prototype.removeIncludedOnlyMesh = function(e) {
            var t = this._includedOnlyMeshes.indexOf(e.uniqueId); - 1 !== t && this._includedOnlyMeshes.splice(t, 1)
        }, i.prototype.hasMesh = function(e) {
            return this._includedOnlyMeshes.length ? -1 !== this._includedOnlyMeshes.indexOf(e.uniqueId) : !this._excludedMeshes.length || -1 === this._excludedMeshes.indexOf(e.uniqueId)
        }, i.prototype._disposeMesh = function(e) {
            this.removeIncludedOnlyMesh(e), this.removeExcludedMesh(e)
        }, i.EffectName = "GlowLayer", i.DefaultBlurKernelSize = 32, i.DefaultTextureRatio = .5, i
    })(e.EffectLayer);
    e.GlowLayer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t;
    !(function(e) {
        e[e.INIT = 0] = "INIT", e[e.RUNNING = 1] = "RUNNING", e[e.DONE = 2] = "DONE", e[e.ERROR = 3] = "ERROR"
    })(t = e.AssetTaskState || (e.AssetTaskState = {}));
    var i = (function() {
        function e(e) {
            this.name = e, this._isCompleted = !1, this._taskState = t.INIT
        }
        return Object.defineProperty(e.prototype, "isCompleted", {
            get: function() {
                return this._isCompleted
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "taskState", {
            get: function() {
                return this._taskState
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(e.prototype, "errorObject", {
            get: function() {
                return this._errorObject
            },
            enumerable: !0,
            configurable: !0
        }), e.prototype._setErrorObject = function(e, t) {
            this._errorObject || (this._errorObject = {
                message: e,
                exception: t
            })
        }, e.prototype.run = function(e, i, r) {
            var n = this;
            this._taskState = t.RUNNING, this.runTask(e, (function() {
                n.onDoneCallback(i, r)
            }), (function(e, t) {
                n.onErrorCallback(r, e, t)
            }))
        }, e.prototype.runTask = function(e, t, i) {
            throw new Error("runTask is not implemented")
        }, e.prototype.onErrorCallback = function(e, i, r) {
            this._taskState = t.ERROR, this._errorObject = {
                message: i,
                exception: r
            }, this.onError && this.onError(this, i, r), e()
        }, e.prototype.onDoneCallback = function(e, i) {
            try {
                this._taskState = t.DONE, this._isCompleted = !0, this.onSuccess && this.onSuccess(this), e()
            } catch (e) {
                this.onErrorCallback(i, "Task is done, error executing success callback(s)", e)
            }
        }, e
    })();
    e.AbstractAssetTask = i;
    var r = (function() {
        function e(e, t, i) {
            this.remainingCount = e, this.totalCount = t, this.task = i
        }
        return e
    })();
    e.AssetsProgressEvent = r;
    var n = (function(t) {
        function i(e, i, r, n) {
            var o = t.call(this, e) || this;
            return o.name = e, o.meshesNames = i, o.rootUrl = r, o.sceneFilename = n, o
        }
        return __extends(i, t), i.prototype.runTask = function(t, i, r) {
            var n = this;
            e.SceneLoader.ImportMesh(this.meshesNames, this.rootUrl, this.sceneFilename, t, (function(e, t, r) {
                n.loadedMeshes = e, n.loadedParticleSystems = t, n.loadedSkeletons = r, i()
            }), null, (function(e, t, i) {
                r(t, i)
            }))
        }, i
    })(i);
    e.MeshAssetTask = n;
    var o = (function(e) {
        function t(t, i) {
            var r = e.call(this, t) || this;
            return r.name = t, r.url = i, r
        }
        return __extends(t, e), t.prototype.runTask = function(e, t, i) {
            var r = this;
            e._loadFile(this.url, (function(e) {
                r.text = e, t()
            }), void 0, !1, !1, (function(e, t) {
                e && i(e.status + " " + e.statusText, t)
            }))
        }, t
    })(i);
    e.TextFileAssetTask = o;
    var s = (function(e) {
        function t(t, i) {
            var r = e.call(this, t) || this;
            return r.name = t, r.url = i, r
        }
        return __extends(t, e), t.prototype.runTask = function(e, t, i) {
            var r = this;
            e._loadFile(this.url, (function(e) {
                r.data = e, t()
            }), void 0, !0, !0, (function(e, t) {
                e && i(e.status + " " + e.statusText, t)
            }))
        }, t
    })(i);
    e.BinaryFileAssetTask = s;
    var a = (function(t) {
        function i(e, i) {
            var r = t.call(this, e) || this;
            return r.name = e, r.url = i, r
        }
        return __extends(i, t), i.prototype.runTask = function(t, i, r) {
            var n = this,
                o = new Image;
            e.Tools.SetCorsBehavior(this.url, o), o.onload = function() {
                n.image = o, i()
            }, o.onerror = function(e) {
                r("Error loading image", e)
            }, o.src = this.url
        }, i
    })(i);
    e.ImageAssetTask = a;
    var l = (function(t) {
        function i(i, r, n, o, s) {
            void 0 === s && (s = e.Texture.TRILINEAR_SAMPLINGMODE);
            var a = t.call(this, i) || this;
            return a.name = i, a.url = r, a.noMipmap = n, a.invertY = o, a.samplingMode = s, a
        }
        return __extends(i, t), i.prototype.runTask = function(t, i, r) {
            var n = function() {
                    i()
                },
                o = function(e, t) {
                    r(e, t)
                };
            this.texture = new e.Texture(this.url, t, this.noMipmap, this.invertY, this.samplingMode, n, o)
        }, i
    })(i);
    e.TextureAssetTask = l;
    var c = (function(t) {
        function i(e, i, r, n, o) {
            var s = t.call(this, e) || this;
            return s.name = e, s.url = i, s.extensions = r, s.noMipmap = n, s.files = o, s
        }
        return __extends(i, t), i.prototype.runTask = function(t, i, r) {
            var n = function() {
                    i()
                },
                o = function(e, t) {
                    r(e, t)
                };
            this.texture = new e.CubeTexture(this.url, t, this.extensions, this.noMipmap, this.files, n, o)
        }, i
    })(i);
    e.CubeTextureAssetTask = c;
    var h = (function(t) {
        function i(e, i, r, n, o, s, a) {
            void 0 === n && (n = !1), void 0 === o && (o = !0), void 0 === s && (s = !1), void 0 === a && (a = !1);
            var l = t.call(this, e) || this;
            return l.name = e, l.url = i, l.size = r, l.noMipmap = n, l.generateHarmonics = o, l.useInGammaSpace = s, l.usePMREMGenerator = a, l
        }
        return __extends(i, t), i.prototype.run = function(t, i, r) {
            var n = function() {
                    i()
                },
                o = function(e, t) {
                    r(e, t)
                };
            this.texture = new e.HDRCubeTexture(this.url, t, this.size, this.noMipmap, this.generateHarmonics, this.useInGammaSpace, this.usePMREMGenerator, n, o)
        }, i
    })(i);
    e.HDRCubeTextureAssetTask = h;
    var u = (function() {
        function i(t) {
            this._isLoading = !1, this._tasks = new Array, this._waitingTasksCount = 0, this._totalTasksCount = 0, this.onTaskSuccessObservable = new e.Observable, this.onTaskErrorObservable = new e.Observable, this.onTasksDoneObservable = new e.Observable, this.onProgressObservable = new e.Observable, this.useDefaultLoadingScreen = !0, this._scene = t
        }
        return i.prototype.addMeshTask = function(e, t, i, r) {
            var o = new n(e, t, i, r);
            return this._tasks.push(o), o
        }, i.prototype.addTextFileTask = function(e, t) {
            var i = new o(e, t);
            return this._tasks.push(i), i
        }, i.prototype.addBinaryFileTask = function(e, t) {
            var i = new s(e, t);
            return this._tasks.push(i), i
        }, i.prototype.addImageTask = function(e, t) {
            var i = new a(e, t);
            return this._tasks.push(i), i
        }, i.prototype.addTextureTask = function(t, i, r, n, o) {
            void 0 === o && (o = e.Texture.TRILINEAR_SAMPLINGMODE);
            var s = new l(t, i, r, n, o);
            return this._tasks.push(s), s
        }, i.prototype.addCubeTextureTask = function(e, t, i, r, n) {
            var o = new c(e, t, i, r, n);
            return this._tasks.push(o), o
        }, i.prototype.addHDRCubeTextureTask = function(e, t, i, r, n, o, s) {
            void 0 === r && (r = !1), void 0 === n && (n = !0), void 0 === o && (o = !1), void 0 === s && (s = !1);
            var a = new h(e, t, i, r, n, o, s);
            return this._tasks.push(a), a
        }, i.prototype._decreaseWaitingTasksCount = function(i) {
            var n = this;
            this._waitingTasksCount--;
            try {
                i.taskState === t.DONE && e.Tools.SetImmediate((function() {
                    var e = n._tasks.indexOf(i);
                    e > -1 && n._tasks.splice(e, 1)
                })), this.onProgress && this.onProgress(this._waitingTasksCount, this._totalTasksCount, i), this.onProgressObservable.notifyObservers(new r(this._waitingTasksCount, this._totalTasksCount, i))
            } catch (t) {
                e.Tools.Error("Error running progress callbacks."), console.log(t)
            }
            if (0 === this._waitingTasksCount) {
                try {
                    this.onFinish && this.onFinish(this._tasks), this.onTasksDoneObservable.notifyObservers(this._tasks)
                } catch (t) {
                    e.Tools.Error("Error running tasks-done callbacks."), console.log(t)
                }
                this._isLoading = !1, this._scene.getEngine().hideLoadingUI()
            }
        }, i.prototype._runTask = function(e) {
            var t = this,
                i = function() {
                    try {
                        t.onTaskSuccess && t.onTaskSuccess(e), t.onTaskSuccessObservable.notifyObservers(e), t._decreaseWaitingTasksCount(e)
                    } catch (e) {
                        r("Error executing task success callbacks", e)
                    }
                },
                r = function(i, r) {
                    e._setErrorObject(i, r), t.onTaskError && t.onTaskError(e), t.onTaskErrorObservable.notifyObservers(e), t._decreaseWaitingTasksCount(e)
                };
            e.run(this._scene, i, r)
        }, i.prototype.reset = function() {
            return this._isLoading = !1, this._tasks = new Array, this
        }, i.prototype.load = function() {
            if (this._isLoading) return this;
            if (this._isLoading = !0, this._waitingTasksCount = this._tasks.length, this._totalTasksCount = this._tasks.length, 0 === this._waitingTasksCount) return this._isLoading = !1, this.onFinish && this.onFinish(this._tasks), this.onTasksDoneObservable.notifyObservers(this._tasks), this;
            this.useDefaultLoadingScreen && this._scene.getEngine().displayLoadingUI();
            for (var e = 0; e < this._tasks.length; e++) {
                var t = this._tasks[e];
                this._runTask(t)
            }
            return this
        }, i
    })();
    e.AssetsManager = u
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = [],
        i = function(i, r) {
            if (!t[i.id] && !i.doNotSerialize) {
                if (i instanceof e.BoxGeometry) r.boxes.push(i.serialize());
                else if (i instanceof e.SphereGeometry) r.spheres.push(i.serialize());
                else if (i instanceof e.CylinderGeometry) r.cylinders.push(i.serialize());
                else if (i instanceof e.TorusGeometry) r.toruses.push(i.serialize());
                else if (i instanceof e.GroundGeometry) r.grounds.push(i.serialize());
                else if (i instanceof e.Plane) r.planes.push(i.serialize());
                else if (i instanceof e.TorusKnotGeometry) r.torusKnots.push(i.serialize());
                else {
                    if (i instanceof e._PrimitiveGeometry) throw new Error("Unknown primitive type");
                    r.vertexData.push(i.serializeVerticeData())
                }
                t[i.id] = !0
            }
        },
        r = function(e, t) {
            var r = {},
                n = e._geometry;
            return n && (e.getScene().getGeometryByID(n.id) || i(n, t.geometries)), e.serialize && e.serialize(r), r
        },
        n = function(t, n) {
            if (t.delayLoadState === e.Engine.DELAYLOADSTATE_LOADED || t.delayLoadState === e.Engine.DELAYLOADSTATE_NONE) {
                t.material && (t.material instanceof e.StandardMaterial ? (n.materials = n.materials || [], n.materials.some((function(e) {
                    return e.id === t.material.id
                })) || n.materials.push(t.material.serialize())) : t.material instanceof e.MultiMaterial && (n.multiMaterials = n.multiMaterials || [], n.multiMaterials.some((function(e) {
                    return e.id === t.material.id
                })) || n.multiMaterials.push(t.material.serialize())));
                var o = t._geometry;
                o && (n.geometries || (n.geometries = {}, n.geometries.boxes = [], n.geometries.spheres = [], n.geometries.cylinders = [], n.geometries.toruses = [], n.geometries.grounds = [], n.geometries.planes = [], n.geometries.torusKnots = [], n.geometries.vertexData = []), i(o, n.geometries)), t.skeleton && (n.skeletons = n.skeletons || [], n.skeletons.push(t.skeleton.serialize())), n.meshes = n.meshes || [], n.meshes.push(r(t, n))
            }
        },
        o = (function() {
            function o() {}
            return o.ClearCache = function() {
                t = []
            }, o.Serialize = function(n) {
                var s = {};
                if (o.ClearCache(), s.useDelayedTextureLoading = n.useDelayedTextureLoading, s.autoClear = n.autoClear, s.clearColor = n.clearColor.asArray(), s.ambientColor = n.ambientColor.asArray(), s.gravity = n.gravity.asArray(), s.collisionsEnabled = n.collisionsEnabled, s.workerCollisions = n.workerCollisions, n.fogMode && 0 !== n.fogMode && (s.fogMode = n.fogMode, s.fogColor = n.fogColor.asArray(), s.fogStart = n.fogStart, s.fogEnd = n.fogEnd, s.fogDensity = n.fogDensity), n.isPhysicsEnabled()) {
                    var a = n.getPhysicsEngine();
                    a && (s.physicsEnabled = !0, s.physicsGravity = a.gravity.asArray(), s.physicsEngine = a.getPhysicsPluginName())
                }
                n.metadata && (s.metadata = n.metadata), s.morphTargetManagers = [];
                for (var l = 0, c = n.meshes; l < c.length; l++) {
                    var h = c[l],
                        u = h.morphTargetManager;
                    u && s.morphTargetManagers.push(u.serialize())
                }
                s.lights = [];
                var f, d;
                for (f = 0; f < n.lights.length; f++) d = n.lights[f], d.doNotSerialize || s.lights.push(d.serialize());
                for (s.cameras = [], f = 0; f < n.cameras.length; f++) {
                    var p = n.cameras[f];
                    p.doNotSerialize || s.cameras.push(p.serialize())
                }
                n.activeCamera && (s.activeCameraID = n.activeCamera.id), e.Animation.AppendSerializedAnimations(n, s), s.materials = [], s.multiMaterials = [];
                var _;
                for (f = 0; f < n.materials.length; f++) _ = n.materials[f], _.doNotSerialize || s.materials.push(_.serialize());
                for (s.multiMaterials = [], f = 0; f < n.multiMaterials.length; f++) {
                    var m = n.multiMaterials[f];
                    s.multiMaterials.push(m.serialize())
                }
                for (n.environmentTexture && (s.environmentTexture = n.environmentTexture.name), s.skeletons = [], f = 0; f < n.skeletons.length; f++) {
                    var g = n.skeletons[f];
                    g.doNotSerialize || s.skeletons.push(g.serialize())
                }
                for (s.transformNodes = [], f = 0; f < n.transformNodes.length; f++) s.transformNodes.push(n.transformNodes[f].serialize());
                s.geometries = {}, s.geometries.boxes = [], s.geometries.spheres = [], s.geometries.cylinders = [], s.geometries.toruses = [], s.geometries.grounds = [], s.geometries.planes = [], s.geometries.torusKnots = [], s.geometries.vertexData = [], t = [];
                var v = n.getGeometries();
                for (f = 0; f < v.length; f++) {
                    var y = v[f];
                    y.isReady() && i(y, s.geometries)
                }
                for (s.meshes = [], f = 0; f < n.meshes.length; f++) {
                    var h = n.meshes[f];
                    if (h instanceof e.Mesh) {
                        var b = h;
                        b.doNotSerialize || b.delayLoadState !== e.Engine.DELAYLOADSTATE_LOADED && b.delayLoadState !== e.Engine.DELAYLOADSTATE_NONE || s.meshes.push(r(b, s))
                    }
                }
                for (s.particleSystems = [], f = 0; f < n.particleSystems.length; f++) s.particleSystems.push(n.particleSystems[f].serialize());
                for (s.lensFlareSystems = [], f = 0; f < n.lensFlareSystems.length; f++) s.lensFlareSystems.push(n.lensFlareSystems[f].serialize());
                for (s.shadowGenerators = [], f = 0; f < n.lights.length; f++) {
                    d = n.lights[f];
                    var x = d.getShadowGenerator();
                    x && s.shadowGenerators.push(x.serialize())
                }
                for (n.actionManager && (s.actions = n.actionManager.serialize("scene")), s.sounds = [], f = 0; f < n.soundTracks.length; f++)
                    for (var T = n.soundTracks[f], E = 0; E < T.soundCollection.length; E++) s.sounds.push(T.soundCollection[E].serialize());
                return s
            }, o.SerializeMesh = function(t, i, r) {
                void 0 === i && (i = !1), void 0 === r && (r = !1);
                var s = {};
                if (o.ClearCache(), t = t instanceof Array ? t : [t], i || r)
                    for (var a = 0; a < t.length; ++a) r && t[a].getDescendants().forEach((function(i) {
                        i instanceof e.Mesh && t.indexOf(i) < 0 && t.push(i)
                    })), i && t[a].parent && t.indexOf(t[a].parent) < 0 && t.push(t[a].parent);
                return t.forEach((function(e) {
                    n(e, s)
                })), s
            }, o
        })();
    e.SceneSerializer = o
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n) {
            void 0 === n && (n = !0);
            var o = this;
            this.name = t, this._viewMatrix = e.Matrix.Identity(), this._target = e.Vector3.Zero(), this._add = e.Vector3.Zero(), this._invertYAxis = !1, this.position = e.Vector3.Zero(), this._scene = r, this._scene.reflectionProbes.push(this), this._renderTargetTexture = new e.RenderTargetTexture(t, i, r, n, !0, e.Engine.TEXTURETYPE_UNSIGNED_INT, !0), this._renderTargetTexture.onBeforeRenderObservable.add((function(t) {
                switch (t) {
                    case 0:
                        o._add.copyFromFloats(1, 0, 0);
                        break;
                    case 1:
                        o._add.copyFromFloats(-1, 0, 0);
                        break;
                    case 2:
                        o._add.copyFromFloats(0, o._invertYAxis ? 1 : -1, 0);
                        break;
                    case 3:
                        o._add.copyFromFloats(0, o._invertYAxis ? -1 : 1, 0);
                        break;
                    case 4:
                        o._add.copyFromFloats(0, 0, 1);
                        break;
                    case 5:
                        o._add.copyFromFloats(0, 0, -1)
                }
                o._attachedMesh && o.position.copyFrom(o._attachedMesh.getAbsolutePosition()), o.position.addToRef(o._add, o._target), e.Matrix.LookAtLHToRef(o.position, o._target, e.Vector3.Up(), o._viewMatrix), r.setTransformMatrix(o._viewMatrix, o._projectionMatrix), r._forcedViewPosition = o.position
            })), this._renderTargetTexture.onAfterUnbindObservable.add((function() {
                r._forcedViewPosition = null, r.updateTransformMatrix(!0)
            })), r.activeCamera && (this._projectionMatrix = e.Matrix.PerspectiveFovLH(Math.PI / 2, 1, r.activeCamera.minZ, r.activeCamera.maxZ))
        }
        return Object.defineProperty(t.prototype, "samples", {
            get: function() {
                return this._renderTargetTexture.samples
            },
            set: function(e) {
                this._renderTargetTexture.samples = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "refreshRate", {
            get: function() {
                return this._renderTargetTexture.refreshRate
            },
            set: function(e) {
                this._renderTargetTexture.refreshRate = e
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.getScene = function() {
            return this._scene
        }, Object.defineProperty(t.prototype, "cubeTexture", {
            get: function() {
                return this._renderTargetTexture
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "renderList", {
            get: function() {
                return this._renderTargetTexture.renderList
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.attachToMesh = function(e) {
            this._attachedMesh = e
        }, t.prototype.setRenderingAutoClearDepthStencil = function(e, t) {
            this._renderTargetTexture.setRenderingAutoClearDepthStencil(e, t)
        }, t.prototype.dispose = function() {
            var e = this._scene.reflectionProbes.indexOf(this); - 1 !== e && this._scene.reflectionProbes.splice(e, 1), this._renderTargetTexture && (this._renderTargetTexture.dispose(), this._renderTargetTexture = null)
        }, t
    })();
    e.ReflectionProbe = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t, i, r, n, o) {
            this.name = t, this.scale = new e.Vector2(1, 1), this.offset = new e.Vector2(0, 0), this.alphaBlendingMode = e.Engine.ALPHA_COMBINE, this.layerMask = 268435455, this._vertexBuffers = {}, this.onDisposeObservable = new e.Observable, this.onBeforeRenderObservable = new e.Observable, this.onAfterRenderObservable = new e.Observable, this.texture = i ? new e.Texture(i, r, !0) : null, this.isBackground = void 0 === n || n, this.color = void 0 === o ? new e.Color4(1, 1, 1, 1) : o, this._scene = r || e.Engine.LastCreatedScene, this._scene.layers.push(this);
            var s = this._scene.getEngine(),
                a = [];
            a.push(1, 1), a.push(-1, 1), a.push(-1, -1), a.push(1, -1);
            var l = new e.VertexBuffer(s, a, e.VertexBuffer.PositionKind, !1, !1, 2);
            this._vertexBuffers[e.VertexBuffer.PositionKind] = l, this._createIndexBuffer(), this._effect = s.createEffect("layer", [e.VertexBuffer.PositionKind], ["textureMatrix", "color", "scale", "offset"], ["textureSampler"], ""), this._alphaTestEffect = s.createEffect("layer", [e.VertexBuffer.PositionKind], ["textureMatrix", "color", "scale", "offset"], ["textureSampler"], "#define ALPHATEST")
        }
        return Object.defineProperty(t.prototype, "onDispose", {
            set: function(e) {
                this._onDisposeObserver && this.onDisposeObservable.remove(this._onDisposeObserver), this._onDisposeObserver = this.onDisposeObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onBeforeRender", {
            set: function(e) {
                this._onBeforeRenderObserver && this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "onAfterRender", {
            set: function(e) {
                this._onAfterRenderObserver && this.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = this.onAfterRenderObservable.add(e)
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype._createIndexBuffer = function() {
            var e = this._scene.getEngine(),
                t = [];
            t.push(0), t.push(1), t.push(2), t.push(0), t.push(2), t.push(3), this._indexBuffer = e.createIndexBuffer(t)
        }, t.prototype._rebuild = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && t._rebuild(), this._createIndexBuffer()
        }, t.prototype.render = function() {
            var t = this.alphaTest ? this._alphaTestEffect : this._effect;
            if (t.isReady() && this.texture && this.texture.isReady()) {
                var i = this._scene.getEngine();
                this.onBeforeRenderObservable.notifyObservers(this), i.enableEffect(t), i.setState(!1), t.setTexture("textureSampler", this.texture), t.setMatrix("textureMatrix", this.texture.getTextureMatrix()), t.setFloat4("color", this.color.r, this.color.g, this.color.b, this.color.a), t.setVector2("offset", this.offset), t.setVector2("scale", this.scale), i.bindBuffers(this._vertexBuffers, this._indexBuffer, t), this.alphaTest ? i.drawElementsType(e.Material.TriangleFillMode, 0, 6) : (i.setAlphaMode(this.alphaBlendingMode), i.drawElementsType(e.Material.TriangleFillMode, 0, 6), i.setAlphaMode(e.Engine.ALPHA_DISABLE)), this.onAfterRenderObservable.notifyObservers(this)
            }
        }, t.prototype.dispose = function() {
            var t = this._vertexBuffers[e.VertexBuffer.PositionKind];
            t && (t.dispose(), this._vertexBuffers[e.VertexBuffer.PositionKind] = null), this._indexBuffer && (this._scene.getEngine()._releaseBuffer(this._indexBuffer), this._indexBuffer = null), this.texture && (this.texture.dispose(), this.texture = null);
            var i = this._scene.layers.indexOf(this);
            this._scene.layers.splice(i, 1), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear(), this.onAfterRenderObservable.clear(), this.onBeforeRenderObservable.clear()
        }, t
    })();
    e.Layer = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {}
        return t.CreateResizedCopy = function(t, i, r, n) {
                void 0 === n && (n = !0);
                var o = t.getScene(),
                    s = o.getEngine(),
                    a = new e.RenderTargetTexture("resized" + t.name, {
                        width: i,
                        height: r
                    }, o, !t.noMipmap, !0, t._texture.type, !1, t._samplingMode, !1);
                a.wrapU = t.wrapU, a.wrapV = t.wrapV, a.uOffset = t.uOffset, a.vOffset = t.vOffset, a.uScale = t.uScale, a.vScale = t.vScale, a.uAng = t.uAng, a.vAng = t.vAng, a.wAng = t.wAng, a.coordinatesIndex = t.coordinatesIndex, a.level = t.level, a.anisotropicFilteringLevel = t.anisotropicFilteringLevel, a._texture.isReady = !1, t.wrapU = e.Texture.CLAMP_ADDRESSMODE, t.wrapV = e.Texture.CLAMP_ADDRESSMODE;
                var l = new e.PassPostProcess("pass", 1, null, n ? e.Texture.BILINEAR_SAMPLINGMODE : e.Texture.NEAREST_SAMPLINGMODE, s, !1, e.Engine.TEXTURETYPE_UNSIGNED_INT);
                return l.getEffect().executeWhenCompiled((function() {
                    l.onApply = function(e) {
                        e.setTexture("textureSampler", t)
                    };
                    var e = a.getInternalTexture();
                    e && (o.postProcessManager.directRender([l], e), s.unBindFramebuffer(e), a.disposeFramebufferObjects(), l.dispose(), e.isReady = !0)
                })), a
            }, t.GetEnvironmentBRDFTexture = function(t) {
                if (!t._environmentBRDFTexture) {
                    var i = e.Texture.CreateFromBase64String(this._environmentBRDFBase64Texture, "EnvironmentBRDFTexture", t, !0, !1, e.Texture.BILINEAR_SAMPLINGMODE);
                    i.wrapU = e.Texture.CLAMP_ADDRESSMODE, i.wrapV = e.Texture.CLAMP_ADDRESSMODE, t._environmentBRDFTexture = i
                }
                return t._environmentBRDFTexture
            },
            t._environmentBRDFBase64Texture = "data:image/png;base64, ", t
    })();
    e.TextureTools = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._mode = t.FitFrustumSidesMode, this._radiusScale = 1, this._positionScale = .5, this._defaultElevation = .3, this._elevationReturnTime = 1500, this._elevationReturnWaitTime = 1e3, this._zoomStopsAnimation = !1, this._framingTime = 1500, this._isPointerDown = !1, this._lastInteractionTime = -1 / 0, this._animatables = new Array, this._betaIsAnimating = !1
        }
        return Object.defineProperty(t.prototype, "name", {
                get: function() {
                    return "Framing"
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "mode", {
                get: function() {
                    return this._mode
                },
                set: function(e) {
                    this._mode = e
                },
                enumerable: !0,
                configurable: !0
            }),
            Object.defineProperty(t.prototype, "radiusScale", {
                get: function() {
                    return this._radiusScale
                },
                set: function(e) {
                    this._radiusScale = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "positionScale", {
                get: function() {
                    return this._positionScale
                },
                set: function(e) {
                    this._positionScale = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "defaultElevation", {
                get: function() {
                    return this._defaultElevation
                },
                set: function(e) {
                    this._defaultElevation = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "elevationReturnTime", {
                get: function() {
                    return this._elevationReturnTime
                },
                set: function(e) {
                    this._elevationReturnTime = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "elevationReturnWaitTime", {
                get: function() {
                    return this._elevationReturnWaitTime
                },
                set: function(e) {
                    this._elevationReturnWaitTime = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "zoomStopsAnimation", {
                get: function() {
                    return this._zoomStopsAnimation
                },
                set: function(e) {
                    this._zoomStopsAnimation = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(t.prototype, "framingTime", {
                get: function() {
                    return this._framingTime
                },
                set: function(e) {
                    this._framingTime = e
                },
                enumerable: !0,
                configurable: !0
            }), t.prototype.init = function() {}, t.prototype.attach = function(i) {
                var r = this;
                this._attachedCamera = i;
                var n = this._attachedCamera.getScene();
                t.EasingFunction.setEasingMode(t.EasingMode), this._onPrePointerObservableObserver = n.onPrePointerObservable.add((function(t) {
                    if (t.type === e.PointerEventTypes.POINTERDOWN) return void(r._isPointerDown = !0);
                    t.type === e.PointerEventTypes.POINTERUP && (r._isPointerDown = !1)
                })), this._onMeshTargetChangedObserver = i.onMeshTargetChangedObservable.add((function(e) {
                    e && r.zoomOnMesh(e)
                })), this._onAfterCheckInputsObserver = i.onAfterCheckInputsObservable.add((function() {
                    r._applyUserInteraction(), r._maintainCameraAboveGround()
                }))
            }, t.prototype.detach = function() {
                if (this._attachedCamera) {
                    var e = this._attachedCamera.getScene();
                    this._onPrePointerObservableObserver && e.onPrePointerObservable.remove(this._onPrePointerObservableObserver), this._onAfterCheckInputsObserver && this._attachedCamera.onAfterCheckInputsObservable.remove(this._onAfterCheckInputsObserver), this._onMeshTargetChangedObserver && this._attachedCamera.onMeshTargetChangedObservable.remove(this._onMeshTargetChangedObserver), this._attachedCamera = null
                }
            }, t.prototype.zoomOnMesh = function(e, t, i) {
                void 0 === t && (t = !1), void 0 === i && (i = null), e.computeWorldMatrix(!0);
                var r = e.getBoundingInfo().boundingBox;
                this.zoomOnBoundingInfo(r.minimumWorld, r.maximumWorld, t, i)
            }, t.prototype.zoomOnMeshHierarchy = function(e, t, i) {
                void 0 === t && (t = !1), void 0 === i && (i = null), e.computeWorldMatrix(!0);
                var r = e.getHierarchyBoundingVectors(!0);
                this.zoomOnBoundingInfo(r.min, r.max, t, i)
            }, t.prototype.zoomOnMeshesHierarchy = function(t, i, r) {
                void 0 === i && (i = !1), void 0 === r && (r = null);
                for (var n = new e.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE), o = new e.Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE), s = 0; s < t.length; s++) {
                    var a = t[s].getHierarchyBoundingVectors(!0);
                    e.Tools.CheckExtends(a.min, n, o), e.Tools.CheckExtends(a.max, n, o)
                }
                this.zoomOnBoundingInfo(n, o, i, r)
            }, t.prototype.zoomOnBoundingInfo = function(i, r, n, o) {
                var s = this;
                void 0 === n && (n = !1), void 0 === o && (o = null);
                var a;
                if (this._attachedCamera) {
                    var l = i.y,
                        c = r.y,
                        h = l + (c - l) * this._positionScale,
                        u = r.subtract(i).scale(.5);
                    if (n) a = new e.Vector3(0, h, 0);
                    else {
                        var f = i.add(u);
                        a = new e.Vector3(f.x, h, f.z)
                    }
                    this._vectorTransition || (this._vectorTransition = e.Animation.CreateAnimation("target", e.Animation.ANIMATIONTYPE_VECTOR3, 60, t.EasingFunction)), this._betaIsAnimating = !0;
                    var d = e.Animation.TransitionTo("target", a, this._attachedCamera, this._attachedCamera.getScene(), 60, this._vectorTransition, this._framingTime);
                    d && this._animatables.push(d);
                    var p = 0;
                    if (this._mode === t.FitFrustumSidesMode) {
                        var _ = this._calculateLowerRadiusFromModelBoundingSphere(i, r);
                        this._attachedCamera.lowerRadiusLimit = u.length() + this._attachedCamera.minZ, p = _
                    } else this._mode === t.IgnoreBoundsSizeMode && (p = this._calculateLowerRadiusFromModelBoundingSphere(i, r), null === this._attachedCamera.lowerRadiusLimit && (this._attachedCamera.lowerRadiusLimit = this._attachedCamera.minZ));
                    var m = r.subtract(i).length();
                    this._attachedCamera.panningSensibility = 5e3 / m, this._attachedCamera.wheelPrecision = 100 / p, this._radiusTransition || (this._radiusTransition = e.Animation.CreateAnimation("radius", e.Animation.ANIMATIONTYPE_FLOAT, 60, t.EasingFunction)), d = e.Animation.TransitionTo("radius", p, this._attachedCamera, this._attachedCamera.getScene(), 60, this._radiusTransition, this._framingTime, (function() {
                        o && o(), s._attachedCamera && s._attachedCamera.storeState()
                    })), d && this._animatables.push(d)
                }
            }, t.prototype._calculateLowerRadiusFromModelBoundingSphere = function(e, i) {
                var r = i.subtract(e),
                    n = r.length(),
                    o = this._getFrustumSlope(),
                    s = .5 * n,
                    a = s * this._radiusScale,
                    l = a * Math.sqrt(1 + 1 / (o.x * o.x)),
                    c = a * Math.sqrt(1 + 1 / (o.y * o.y)),
                    h = Math.max(l, c),
                    u = this._attachedCamera;
                return u ? (u.lowerRadiusLimit && this._mode === t.IgnoreBoundsSizeMode && (h = h < u.lowerRadiusLimit ? u.lowerRadiusLimit : h), u.upperRadiusLimit && (h = h > u.upperRadiusLimit ? u.upperRadiusLimit : h), h) : 0
            }, t.prototype._maintainCameraAboveGround = function() {
                var i = this;
                if (!(this._elevationReturnTime < 0)) {
                    var r = e.Tools.Now - this._lastInteractionTime,
                        n = .5 * Math.PI - this._defaultElevation,
                        o = .5 * Math.PI;
                    if (this._attachedCamera && !this._betaIsAnimating && this._attachedCamera.beta > o && r >= this._elevationReturnWaitTime) {
                        this._betaIsAnimating = !0, this.stopAllAnimations(), this._betaTransition || (this._betaTransition = e.Animation.CreateAnimation("beta", e.Animation.ANIMATIONTYPE_FLOAT, 60, t.EasingFunction));
                        var s = e.Animation.TransitionTo("beta", n, this._attachedCamera, this._attachedCamera.getScene(), 60, this._betaTransition, this._elevationReturnTime, (function() {
                            i._clearAnimationLocks(), i.stopAllAnimations()
                        }));
                        s && this._animatables.push(s)
                    }
                }
            }, t.prototype._getFrustumSlope = function() {
                var t = this._attachedCamera;
                if (!t) return e.Vector2.Zero();
                var i = t.getScene().getEngine(),
                    r = i.getAspectRatio(t),
                    n = Math.tan(t.fov / 2),
                    o = n * r;
                return new e.Vector2(o, n)
            }, t.prototype._clearAnimationLocks = function() {
                this._betaIsAnimating = !1
            }, t.prototype._applyUserInteraction = function() {
                this.isUserIsMoving && (this._lastInteractionTime = e.Tools.Now, this.stopAllAnimations(), this._clearAnimationLocks())
            }, t.prototype.stopAllAnimations = function() {
                for (this._attachedCamera && (this._attachedCamera.animations = []); this._animatables.length;) this._animatables[0] && (this._animatables[0].onAnimationEnd = null, this._animatables[0].stop()), this._animatables.shift()
            }, Object.defineProperty(t.prototype, "isUserIsMoving", {
                get: function() {
                    return !!this._attachedCamera && (0 !== this._attachedCamera.inertialAlphaOffset || 0 !== this._attachedCamera.inertialBetaOffset || 0 !== this._attachedCamera.inertialRadiusOffset || 0 !== this._attachedCamera.inertialPanningX || 0 !== this._attachedCamera.inertialPanningY || this._isPointerDown)
                },
                enumerable: !0,
                configurable: !0
            }), t.EasingFunction = new e.ExponentialEase, t.EasingMode = e.EasingFunction.EASINGMODE_EASEINOUT, t.IgnoreBoundsSizeMode = 0, t.FitFrustumSidesMode = 1, t
    })();
    e.FramingBehavior = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this.transitionDuration = 450, this.lowerRadiusTransitionRange = 2, this.upperRadiusTransitionRange = -2, this._autoTransitionRange = !1, this._radiusIsAnimating = !1, this._radiusBounceTransition = null, this._animatables = new Array
        }
        return Object.defineProperty(t.prototype, "name", {
            get: function() {
                return "Bouncing"
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "autoTransitionRange", {
            get: function() {
                return this._autoTransitionRange
            },
            set: function(e) {
                var t = this;
                if (this._autoTransitionRange !== e) {
                    this._autoTransitionRange = e;
                    var i = this._attachedCamera;
                    i && (e ? this._onMeshTargetChangedObserver = i.onMeshTargetChangedObservable.add((function(e) {
                        if (e) {
                            e.computeWorldMatrix(!0);
                            var i = e.getBoundingInfo().diagonalLength;
                            t.lowerRadiusTransitionRange = .05 * i, t.upperRadiusTransitionRange = .05 * i
                        }
                    })) : this._onMeshTargetChangedObserver && i.onMeshTargetChangedObservable.remove(this._onMeshTargetChangedObserver))
                }
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.init = function() {}, t.prototype.attach = function(e) {
            var t = this;
            this._attachedCamera = e, this._onAfterCheckInputsObserver = e.onAfterCheckInputsObservable.add((function() {
                t._attachedCamera && (t._isRadiusAtLimit(t._attachedCamera.lowerRadiusLimit) && t._applyBoundRadiusAnimation(t.lowerRadiusTransitionRange), t._isRadiusAtLimit(t._attachedCamera.upperRadiusLimit) && t._applyBoundRadiusAnimation(t.upperRadiusTransitionRange))
            }))
        }, t.prototype.detach = function() {
            this._attachedCamera && (this._onAfterCheckInputsObserver && this._attachedCamera.onAfterCheckInputsObservable.remove(this._onAfterCheckInputsObserver), this._onMeshTargetChangedObserver && this._attachedCamera.onMeshTargetChangedObservable.remove(this._onMeshTargetChangedObserver), this._attachedCamera = null)
        }, t.prototype._isRadiusAtLimit = function(e) {
            return !!this._attachedCamera && (this._attachedCamera.radius === e && !this._radiusIsAnimating)
        }, t.prototype._applyBoundRadiusAnimation = function(i) {
            var r = this;
            if (this._attachedCamera) {
                this._radiusBounceTransition || (t.EasingFunction.setEasingMode(t.EasingMode), this._radiusBounceTransition = e.Animation.CreateAnimation("radius", e.Animation.ANIMATIONTYPE_FLOAT, 60, t.EasingFunction)), this._cachedWheelPrecision = this._attachedCamera.wheelPrecision, this._attachedCamera.wheelPrecision = 1 / 0, this._attachedCamera.inertialRadiusOffset = 0, this.stopAllAnimations(), this._radiusIsAnimating = !0;
                var n = e.Animation.TransitionTo("radius", this._attachedCamera.radius + i, this._attachedCamera, this._attachedCamera.getScene(), 60, this._radiusBounceTransition, this.transitionDuration, (function() {
                    return r._clearAnimationLocks()
                }));
                n && this._animatables.push(n)
            }
        }, t.prototype._clearAnimationLocks = function() {
            this._radiusIsAnimating = !1, this._attachedCamera && (this._attachedCamera.wheelPrecision = this._cachedWheelPrecision)
        }, t.prototype.stopAllAnimations = function() {
            for (this._attachedCamera && (this._attachedCamera.animations = []); this._animatables.length;) this._animatables[0].onAnimationEnd = null, this._animatables[0].stop(), this._animatables.shift()
        }, t.EasingFunction = new e.BackEase(.3), t.EasingMode = e.EasingFunction.EASINGMODE_EASEOUT, t
    })();
    e.BouncingBehavior = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t() {
            this._zoomStopsAnimation = !1, this._idleRotationSpeed = .05, this._idleRotationWaitTime = 2e3, this._idleRotationSpinupTime = 2e3, this._isPointerDown = !1, this._lastFrameTime = null, this._lastInteractionTime = -1 / 0, this._cameraRotationSpeed = 0, this._lastFrameRadius = 0
        }
        return Object.defineProperty(t.prototype, "name", {
            get: function() {
                return "AutoRotation"
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "zoomStopsAnimation", {
            get: function() {
                return this._zoomStopsAnimation
            },
            set: function(e) {
                this._zoomStopsAnimation = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "idleRotationSpeed", {
            get: function() {
                return this._idleRotationSpeed
            },
            set: function(e) {
                this._idleRotationSpeed = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "idleRotationWaitTime", {
            get: function() {
                return this._idleRotationWaitTime
            },
            set: function(e) {
                this._idleRotationWaitTime = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "idleRotationSpinupTime", {
            get: function() {
                return this._idleRotationSpinupTime
            },
            set: function(e) {
                this._idleRotationSpinupTime = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "rotationInProgress", {
            get: function() {
                return Math.abs(this._cameraRotationSpeed) > 0
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.init = function() {}, t.prototype.attach = function(t) {
            var i = this;
            this._attachedCamera = t;
            var r = this._attachedCamera.getScene();
            this._onPrePointerObservableObserver = r.onPrePointerObservable.add((function(t) {
                if (t.type === e.PointerEventTypes.POINTERDOWN) return void(i._isPointerDown = !0);
                t.type === e.PointerEventTypes.POINTERUP && (i._isPointerDown = !1)
            })), this._onAfterCheckInputsObserver = t.onAfterCheckInputsObservable.add((function() {
                var t = e.Tools.Now,
                    r = 0;
                null != i._lastFrameTime && (r = t - i._lastFrameTime), i._lastFrameTime = t, i._applyUserInteraction();
                var n = t - i._lastInteractionTime - i._idleRotationWaitTime,
                    o = Math.max(Math.min(n / i._idleRotationSpinupTime, 1), 0);
                i._cameraRotationSpeed = i._idleRotationSpeed * o, i._attachedCamera && (i._attachedCamera.alpha -= i._cameraRotationSpeed * (r / 1e3))
            }))
        }, t.prototype.detach = function() {
            if (this._attachedCamera) {
                var e = this._attachedCamera.getScene();
                this._onPrePointerObservableObserver && e.onPrePointerObservable.remove(this._onPrePointerObservableObserver), this._attachedCamera.onAfterCheckInputsObservable.remove(this._onAfterCheckInputsObserver), this._attachedCamera = null
            }
        }, t.prototype._userIsZooming = function() {
            return !!this._attachedCamera && 0 !== this._attachedCamera.inertialRadiusOffset
        }, t.prototype._shouldAnimationStopForInteraction = function() {
            if (!this._attachedCamera) return !1;
            var e = !1;
            return this._lastFrameRadius === this._attachedCamera.radius && 0 !== this._attachedCamera.inertialRadiusOffset && (e = !0), this._lastFrameRadius = this._attachedCamera.radius, this._zoomStopsAnimation ? e : this._userIsZooming()
        }, t.prototype._applyUserInteraction = function() {
            this._userIsMoving() && !this._shouldAnimationStopForInteraction() && (this._lastInteractionTime = e.Tools.Now)
        }, t.prototype._userIsMoving = function() {
            return !!this._attachedCamera && (0 !== this._attachedCamera.inertialAlphaOffset || 0 !== this._attachedCamera.inertialBetaOffset || 0 !== this._attachedCamera.inertialRadiusOffset || 0 !== this._attachedCamera.inertialPanningX || 0 !== this._attachedCamera.inertialPanningY || this._isPointerDown)
        }, t
    })();
    e.AutoRotationBehavior = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this.renderWidth = 512, this.renderHeight = 256, this.textureSize = 512, this.deterministicLockstep = !1, this.lockstepMaxSteps = 4
        }
        return e
    })();
    e.NullEngineOptions = t;
    var i = (function(i) {
        function r(r) {
            void 0 === r && (r = new t);
            var n = i.call(this, null) || this;
            return void 0 === r.deterministicLockstep && (r.deterministicLockstep = !1), void 0 === r.lockstepMaxSteps && (r.lockstepMaxSteps = 4), n._options = r, n._caps = new e.EngineCapabilities, n._caps.maxTexturesImageUnits = 16, n._caps.maxVertexTextureImageUnits = 16, n._caps.maxTextureSize = 512, n._caps.maxCubemapTextureSize = 512, n._caps.maxRenderTextureSize = 512, n._caps.maxVertexAttribs = 16, n._caps.maxVaryingVectors = 16, n._caps.maxFragmentUniformVectors = 16, n._caps.maxVertexUniformVectors = 16, n._caps.standardDerivatives = !1, n._caps.astc = null, n._caps.s3tc = null, n._caps.pvrtc = null, n._caps.etc1 = null, n._caps.etc2 = null, n._caps.textureAnisotropicFilterExtension = null, n._caps.maxAnisotropy = 0, n._caps.uintIndices = !1, n._caps.fragmentDepthSupported = !1, n._caps.highPrecisionShaderSupported = !0, n._caps.colorBufferFloat = !1, n._caps.textureFloat = !1, n._caps.textureFloatLinearFiltering = !1, n._caps.textureFloatRender = !1, n._caps.textureHalfFloat = !1, n._caps.textureHalfFloatLinearFiltering = !1, n._caps.textureHalfFloatRender = !1, n._caps.textureLOD = !1, n._caps.drawBuffersExtension = !1, n._caps.depthTextureExtension = !1, n._caps.vertexArrayObject = !1, n._caps.instancedArrays = !1, e.Tools.Log("Babylon.js null engine (v" + e.Engine.Version + ") launched"), "undefined" == typeof URL && (URL = {
                createObjectURL: function() {},
                revokeObjectURL: function() {}
            }), "undefined" == typeof Blob && (Blob = function() {}), n
        }
        return __extends(r, i), r.prototype.isDeterministicLockStep = function() {
            return this._options.deterministicLockstep
        }, r.prototype.getLockstepMaxSteps = function() {
            return this._options.lockstepMaxSteps
        }, r.prototype.getHardwareScalingLevel = function() {
            return 1
        }, r.prototype.createVertexBuffer = function(e) {
            return {
                capacity: 0,
                references: 1,
                is32Bits: !1
            }
        }, r.prototype.createIndexBuffer = function(e) {
            return {
                capacity: 0,
                references: 1,
                is32Bits: !1
            }
        }, r.prototype.clear = function(e, t, i, r) {
            void 0 === r && (r = !1)
        }, r.prototype.getRenderWidth = function(e) {
            return void 0 === e && (e = !1), !e && this._currentRenderTarget ? this._currentRenderTarget.width : this._options.renderWidth
        }, r.prototype.getRenderHeight = function(e) {
            return void 0 === e && (e = !1), !e && this._currentRenderTarget ? this._currentRenderTarget.height : this._options.renderHeight
        }, r.prototype.setViewport = function(e, t, i) {
            this._cachedViewport = e
        }, r.prototype.createShaderProgram = function(e, t, i, r) {
            return {
                transformFeedback: null,
                __SPECTOR_rebuildProgram: null
            }
        }, r.prototype.getUniforms = function(e, t) {
            return []
        }, r.prototype.getAttributes = function(e, t) {
            return []
        }, r.prototype.bindSamplers = function(e) {
            this._currentEffect = null
        }, r.prototype.enableEffect = function(e) {
            this._currentEffect = e, e.onBind && e.onBind(e), e.onBindObservable.notifyObservers(e)
        }, r.prototype.setState = function(e, t, i, r) {
            void 0 === t && (t = 0), void 0 === r && (r = !1)
        }, r.prototype.setIntArray = function(e, t) {}, r.prototype.setIntArray2 = function(e, t) {}, r.prototype.setIntArray3 = function(e, t) {}, r.prototype.setIntArray4 = function(e, t) {}, r.prototype.setFloatArray = function(e, t) {}, r.prototype.setFloatArray2 = function(e, t) {}, r.prototype.setFloatArray3 = function(e, t) {}, r.prototype.setFloatArray4 = function(e, t) {}, r.prototype.setArray = function(e, t) {}, r.prototype.setArray2 = function(e, t) {}, r.prototype.setArray3 = function(e, t) {}, r.prototype.setArray4 = function(e, t) {}, r.prototype.setMatrices = function(e, t) {}, r.prototype.setMatrix = function(e, t) {}, r.prototype.setMatrix3x3 = function(e, t) {}, r.prototype.setMatrix2x2 = function(e, t) {}, r.prototype.setFloat = function(e, t) {}, r.prototype.setFloat2 = function(e, t, i) {}, r.prototype.setFloat3 = function(e, t, i, r) {}, r.prototype.setBool = function(e, t) {}, r.prototype.setFloat4 = function(e, t, i, r, n) {}, r.prototype.setColor3 = function(e, t) {}, r.prototype.setColor4 = function(e, t, i) {}, r.prototype.setAlphaMode = function(t, i) {
            void 0 === i && (i = !1), this._alphaMode !== t && (this._alphaState.alphaBlend = t !== e.Engine.ALPHA_DISABLE, i || this.setDepthWrite(t === e.Engine.ALPHA_DISABLE), this._alphaMode = t)
        }, r.prototype.bindBuffers = function(e, t, i) {}, r.prototype.wipeCaches = function(e) {
            this.preventCacheWipeBetweenFrames || (this.resetTextureCache(), this._currentEffect = null, e && (this._currentProgram = null, this._stencilState.reset(), this._depthCullingState.reset(), this._alphaState.reset()), this._cachedVertexBuffers = null, this._cachedIndexBuffer = null, this._cachedEffectForVertexBuffers = null)
        }, r.prototype.draw = function(e, t, i, r) {}, r.prototype.drawElementsType = function(e, t, i, r) {}, r.prototype.drawArraysType = function(e, t, i, r) {}, r.prototype._createTexture = function() {
            return {}
        }, r.prototype.createTexture = function(t, i, r, n, o, s, a, l, c, h) {
            void 0 === o && (o = e.Texture.TRILINEAR_SAMPLINGMODE), void 0 === s && (s = null), void 0 === a && (a = null), void 0 === l && (l = null);
            var u = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_URL),
                f = String(t);
            return u.url = f, u.generateMipMaps = !i, u.samplingMode = o, u.invertY = r, u.baseWidth = this._options.textureSize, u.baseHeight = this._options.textureSize, u.width = this._options.textureSize, u.height = this._options.textureSize, h && (u.format = h), u.isReady = !0, s && s(), u
        }, r.prototype.createRenderTargetTexture = function(t, i) {
            var r = new e.RenderTargetCreationOptions;
            void 0 !== i && "object" == typeof i ? (r.generateMipMaps = i.generateMipMaps, r.generateDepthBuffer = void 0 === i.generateDepthBuffer || i.generateDepthBuffer, r.generateStencilBuffer = r.generateDepthBuffer && i.generateStencilBuffer, r.type = void 0 === i.type ? e.Engine.TEXTURETYPE_UNSIGNED_INT : i.type, r.samplingMode = void 0 === i.samplingMode ? e.Texture.TRILINEAR_SAMPLINGMODE : i.samplingMode) : (r.generateMipMaps = i, r.generateDepthBuffer = !0, r.generateStencilBuffer = !1, r.type = e.Engine.TEXTURETYPE_UNSIGNED_INT, r.samplingMode = e.Texture.TRILINEAR_SAMPLINGMODE);
            var n = new e.InternalTexture(this, e.InternalTexture.DATASOURCE_RENDERTARGET),
                o = t.width || t,
                s = t.height || t;
            return n._depthStencilBuffer = {}, n._framebuffer = {}, n.baseWidth = o, n.baseHeight = s, n.width = o, n.height = s, n.isReady = !0, n.samples = 1, n.generateMipMaps = !!r.generateMipMaps, n.samplingMode = r.samplingMode, n.type = r.type, n._generateDepthBuffer = r.generateDepthBuffer, n._generateStencilBuffer = !!r.generateStencilBuffer, n
        }, r.prototype.updateTextureSamplingMode = function(e, t) {
            t.samplingMode = e
        }, r.prototype.bindFramebuffer = function(e, t, i, r, n) {
            this._currentRenderTarget && this.unBindFramebuffer(this._currentRenderTarget), this._currentRenderTarget = e, this._currentFramebuffer = e._MSAAFramebuffer ? e._MSAAFramebuffer : e._framebuffer, this._cachedViewport && !n && this.setViewport(this._cachedViewport, i, r)
        }, r.prototype.unBindFramebuffer = function(e, t, i) {
            void 0 === t && (t = !1), this._currentRenderTarget = null, i && (e._MSAAFramebuffer && (this._currentFramebuffer = e._framebuffer), i()), this._currentFramebuffer = null
        }, r.prototype.createDynamicVertexBuffer = function(e) {
            return {
                capacity: 1,
                references: 1,
                is32Bits: !1
            }
        }, r.prototype.updateDynamicIndexBuffer = function(e, t, i) {
            void 0 === i && (i = 0)
        }, r.prototype.updateDynamicVertexBuffer = function(e, t, i, r) {}, r.prototype._bindTextureDirectly = function(e, t) {
            this._boundTexturesCache[this._activeChannel] !== t && (this._boundTexturesCache[this._activeChannel] = t)
        }, r.prototype._bindTexture = function(e, t) {
            e < 0 || this._bindTextureDirectly(0, t)
        }, r.prototype._releaseBuffer = function(e) {
            return 0 === --e.references
        }, r
    })(e.Engine);
    e.NullEngine = i
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            this.engine = t, this._captureGPUFrameTime = !1, this._gpuFrameTime = new e.PerfCounter, this._captureShaderCompilationTime = !1, this._shaderCompilationTime = new e.PerfCounter, this._onBeginFrameObserver = null, this._onEndFrameObserver = null, this._onBeforeShaderCompilationObserver = null, this._onAfterShaderCompilationObserver = null
        }
        return Object.defineProperty(t.prototype, "gpuFrameTimeCounter", {
            get: function() {
                return this._gpuFrameTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureGPUFrameTime", {
            get: function() {
                return this._captureGPUFrameTime
            },
            set: function(e) {
                var t = this;
                e !== this._captureGPUFrameTime && (this._captureGPUFrameTime = e, e ? (this._onBeginFrameObserver = this.engine.onBeginFrameObservable.add((function() {
                    t._gpuFrameTimeToken || (t._gpuFrameTimeToken = t.engine.startTimeQuery())
                })), this._onEndFrameObserver = this.engine.onEndFrameObservable.add((function() {
                    if (t._gpuFrameTimeToken) {
                        var e = t.engine.endTimeQuery(t._gpuFrameTimeToken);
                        e > -1 && (t._gpuFrameTimeToken = null, t._gpuFrameTime.fetchNewFrame(), t._gpuFrameTime.addCount(e, !0))
                    }
                }))) : (this.engine.onBeginFrameObservable.remove(this._onBeginFrameObserver), this._onBeginFrameObserver = null, this.engine.onEndFrameObservable.remove(this._onEndFrameObserver), this._onEndFrameObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "shaderCompilationTimeCounter", {
            get: function() {
                return this._shaderCompilationTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureShaderCompilationTime", {
            get: function() {
                return this._captureShaderCompilationTime
            },
            set: function(e) {
                var t = this;
                e !== this._captureShaderCompilationTime && (this._captureShaderCompilationTime = e, e ? (this._onBeforeShaderCompilationObserver = this.engine.onBeforeShaderCompilationObservable.add((function() {
                    t._shaderCompilationTime.fetchNewFrame(), t._shaderCompilationTime.beginMonitoring()
                })), this._onAfterShaderCompilationObserver = this.engine.onAfterShaderCompilationObservable.add((function() {
                    t._shaderCompilationTime.endMonitoring()
                }))) : (this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver), this._onBeforeShaderCompilationObserver = null, this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver), this._onAfterShaderCompilationObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.dispose = function() {
            this.engine.onBeginFrameObservable.remove(this._onBeginFrameObserver), this._onBeginFrameObserver = null, this.engine.onEndFrameObservable.remove(this._onEndFrameObserver), this._onEndFrameObserver = null, this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver), this._onBeforeShaderCompilationObserver = null, this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver), this._onAfterShaderCompilationObserver = null, this.engine = null
        }, t
    })();
    e.EngineInstrumentation = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function t(t) {
            var i = this;
            this.scene = t, this._captureActiveMeshesEvaluationTime = !1, this._activeMeshesEvaluationTime = new e.PerfCounter, this._captureRenderTargetsRenderTime = !1, this._renderTargetsRenderTime = new e.PerfCounter, this._captureFrameTime = !1, this._frameTime = new e.PerfCounter, this._captureRenderTime = !1, this._renderTime = new e.PerfCounter, this._captureInterFrameTime = !1, this._interFrameTime = new e.PerfCounter, this._captureParticlesRenderTime = !1, this._particlesRenderTime = new e.PerfCounter, this._captureSpritesRenderTime = !1, this._spritesRenderTime = new e.PerfCounter, this._capturePhysicsTime = !1, this._physicsTime = new e.PerfCounter, this._captureAnimationsTime = !1, this._animationsTime = new e.PerfCounter, this._onBeforeActiveMeshesEvaluationObserver = null, this._onAfterActiveMeshesEvaluationObserver = null, this._onBeforeRenderTargetsRenderObserver = null, this._onAfterRenderTargetsRenderObserver = null, this._onAfterRenderObserver = null, this._onBeforeDrawPhaseObserver = null, this._onAfterDrawPhaseObserver = null, this._onBeforeAnimationsObserver = null, this._onBeforeParticlesRenderingObserver = null, this._onAfterParticlesRenderingObserver = null, this._onBeforeSpritesRenderingObserver = null, this._onAfterSpritesRenderingObserver = null, this._onBeforePhysicsObserver = null, this._onAfterPhysicsObserver = null, this._onAfterAnimationsObserver = null, this._onBeforeAnimationsObserver = t.onBeforeAnimationsObservable.add((function() {
                i._captureActiveMeshesEvaluationTime && i._activeMeshesEvaluationTime.fetchNewFrame(), i._captureRenderTargetsRenderTime && i._renderTargetsRenderTime.fetchNewFrame(), i._captureFrameTime && (e.Tools.StartPerformanceCounter("Scene rendering"), i._frameTime.beginMonitoring()), i._captureInterFrameTime && i._interFrameTime.endMonitoring(), i._captureParticlesRenderTime && i._particlesRenderTime.fetchNewFrame(), i._captureSpritesRenderTime && i._spritesRenderTime.fetchNewFrame(), i._captureAnimationsTime && i._animationsTime.beginMonitoring(), i.scene.getEngine()._drawCalls.fetchNewFrame(), i.scene.getEngine()._textureCollisions.fetchNewFrame()
            })), this._onAfterRenderObserver = t.onAfterRenderObservable.add((function() {
                i._captureFrameTime && (e.Tools.EndPerformanceCounter("Scene rendering"), i._frameTime.endMonitoring()), i._captureRenderTime && i._renderTime.endMonitoring(!1), i._captureInterFrameTime && i._interFrameTime.beginMonitoring()
            }))
        }
        return Object.defineProperty(t.prototype, "activeMeshesEvaluationTimeCounter", {
            get: function() {
                return this._activeMeshesEvaluationTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureActiveMeshesEvaluationTime", {
            get: function() {
                return this._captureActiveMeshesEvaluationTime
            },
            set: function(t) {
                var i = this;
                t !== this._captureActiveMeshesEvaluationTime && (this._captureActiveMeshesEvaluationTime = t, t ? (this._onBeforeActiveMeshesEvaluationObserver = this.scene.onBeforeActiveMeshesEvaluationObservable.add((function() {
                    e.Tools.StartPerformanceCounter("Active meshes evaluation"), i._activeMeshesEvaluationTime.beginMonitoring()
                })), this._onAfterActiveMeshesEvaluationObserver = this.scene.onAfterActiveMeshesEvaluationObservable.add((function() {
                    e.Tools.EndPerformanceCounter("Active meshes evaluation"), i._activeMeshesEvaluationTime.endMonitoring()
                }))) : (this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver), this._onBeforeActiveMeshesEvaluationObserver = null, this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver), this._onAfterActiveMeshesEvaluationObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "renderTargetsRenderTimeCounter", {
            get: function() {
                return this._renderTargetsRenderTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureRenderTargetsRenderTime", {
            get: function() {
                return this._captureRenderTargetsRenderTime
            },
            set: function(t) {
                var i = this;
                t !== this._captureRenderTargetsRenderTime && (this._captureRenderTargetsRenderTime = t, t ? (this._onBeforeRenderTargetsRenderObserver = this.scene.OnBeforeRenderTargetsRenderObservable.add((function() {
                    e.Tools.StartPerformanceCounter("Render targets rendering"), i._renderTargetsRenderTime.beginMonitoring()
                })), this._onAfterRenderTargetsRenderObserver = this.scene.OnAfterRenderTargetsRenderObservable.add((function() {
                    e.Tools.EndPerformanceCounter("Render targets rendering"), i._renderTargetsRenderTime.endMonitoring(!1)
                }))) : (this.scene.OnBeforeRenderTargetsRenderObservable.remove(this._onBeforeRenderTargetsRenderObserver), this._onBeforeRenderTargetsRenderObserver = null, this.scene.OnAfterRenderTargetsRenderObservable.remove(this._onAfterRenderTargetsRenderObserver), this._onAfterRenderTargetsRenderObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "particlesRenderTimeCounter", {
            get: function() {
                return this._particlesRenderTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureParticlesRenderTime", {
            get: function() {
                return this._captureParticlesRenderTime
            },
            set: function(t) {
                var i = this;
                t !== this._captureParticlesRenderTime && (this._captureParticlesRenderTime = t, t ? (this._onBeforeParticlesRenderingObserver = this.scene.onBeforeParticlesRenderingObservable.add((function() {
                    e.Tools.StartPerformanceCounter("Particles"), i._particlesRenderTime.beginMonitoring()
                })), this._onAfterParticlesRenderingObserver = this.scene.onAfterParticlesRenderingObservable.add((function() {
                    e.Tools.EndPerformanceCounter("Particles"), i._particlesRenderTime.endMonitoring(!1)
                }))) : (this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver), this._onBeforeParticlesRenderingObserver = null, this.scene.onAfterParticlesRenderingObservable.remove(this._onAfterParticlesRenderingObserver), this._onAfterParticlesRenderingObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "spritesRenderTimeCounter", {
            get: function() {
                return this._spritesRenderTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureSpritesRenderTime", {
            get: function() {
                return this._captureSpritesRenderTime
            },
            set: function(t) {
                var i = this;
                t !== this._captureSpritesRenderTime && (this._captureSpritesRenderTime = t, t ? (this._onBeforeSpritesRenderingObserver = this.scene.onBeforeSpritesRenderingObservable.add((function() {
                    e.Tools.StartPerformanceCounter("Sprites"), i._spritesRenderTime.beginMonitoring()
                })), this._onAfterSpritesRenderingObserver = this.scene.onAfterSpritesRenderingObservable.add((function() {
                    e.Tools.EndPerformanceCounter("Sprites"), i._spritesRenderTime.endMonitoring(!1)
                }))) : (this.scene.onBeforeSpritesRenderingObservable.remove(this._onBeforeSpritesRenderingObserver), this._onBeforeSpritesRenderingObserver = null, this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver), this._onAfterSpritesRenderingObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "physicsTimeCounter", {
            get: function() {
                return this._physicsTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "capturePhysicsTime", {
            get: function() {
                return this._capturePhysicsTime
            },
            set: function(t) {
                var i = this;
                t !== this._capturePhysicsTime && (this._capturePhysicsTime = t, t ? (this._onBeforePhysicsObserver = this.scene.onBeforePhysicsObservable.add((function() {
                    e.Tools.StartPerformanceCounter("Physics"), i._physicsTime.beginMonitoring()
                })), this._onAfterPhysicsObserver = this.scene.onAfterPhysicsObservable.add((function() {
                    e.Tools.EndPerformanceCounter("Physics"), i._physicsTime.endMonitoring()
                }))) : (this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver), this._onBeforePhysicsObserver = null, this.scene.onAfterPhysicsObservable.remove(this._onAfterPhysicsObserver), this._onAfterPhysicsObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "animationsTimeCounter", {
            get: function() {
                return this._animationsTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureAnimationsTime", {
            get: function() {
                return this._captureAnimationsTime
            },
            set: function(e) {
                var t = this;
                e !== this._captureAnimationsTime && (this._captureAnimationsTime = e, e ? this._onAfterAnimationsObserver = this.scene.onAfterAnimationsObservable.add((function() {
                    t._animationsTime.endMonitoring()
                })) : (this.scene.onAfterAnimationsObservable.remove(this._onAfterAnimationsObserver), this._onAfterAnimationsObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "frameTimeCounter", {
            get: function() {
                return this._frameTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureFrameTime", {
            get: function() {
                return this._captureFrameTime
            },
            set: function(e) {
                this._captureFrameTime = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "interFrameTimeCounter", {
            get: function() {
                return this._interFrameTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureInterFrameTime", {
            get: function() {
                return this._captureInterFrameTime
            },
            set: function(e) {
                this._captureInterFrameTime = e
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "renderTimeCounter", {
            get: function() {
                return this._renderTime
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "captureRenderTime", {
            get: function() {
                return this._captureRenderTime
            },
            set: function(t) {
                var i = this;
                t !== this._captureRenderTime && (this._captureRenderTime = t, t ? (this._onBeforeDrawPhaseObserver = this.scene.onBeforeDrawPhaseObservable.add((function() {
                    i._renderTime.beginMonitoring(), e.Tools.StartPerformanceCounter("Main render")
                })), this._onAfterDrawPhaseObserver = this.scene.onAfterDrawPhaseObservable.add((function() {
                    i._renderTime.endMonitoring(!1), e.Tools.EndPerformanceCounter("Main render")
                }))) : (this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver), this._onBeforeDrawPhaseObserver = null, this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver), this._onAfterDrawPhaseObserver = null))
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "drawCallsCounter", {
            get: function() {
                return this.scene.getEngine()._drawCalls
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "textureCollisionsCounter", {
            get: function() {
                return this.scene.getEngine()._textureCollisions
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.dispose = function() {
            this.scene.onAfterRenderObservable.remove(this._onAfterRenderObserver), this._onAfterRenderObserver = null, this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver), this._onBeforeActiveMeshesEvaluationObserver = null, this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver), this._onAfterActiveMeshesEvaluationObserver = null, this.scene.OnBeforeRenderTargetsRenderObservable.remove(this._onBeforeRenderTargetsRenderObserver), this._onBeforeRenderTargetsRenderObserver = null, this.scene.OnAfterRenderTargetsRenderObservable.remove(this._onAfterRenderTargetsRenderObserver), this._onAfterRenderTargetsRenderObserver = null, this.scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver), this._onBeforeAnimationsObserver = null, this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver), this._onBeforeParticlesRenderingObserver = null, this.scene.onAfterParticlesRenderingObservable.remove(this._onAfterParticlesRenderingObserver), this._onAfterParticlesRenderingObserver = null, this.scene.onBeforeSpritesRenderingObservable.remove(this._onBeforeSpritesRenderingObserver), this._onBeforeSpritesRenderingObserver = null, this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver), this._onAfterSpritesRenderingObserver = null, this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver), this._onBeforeDrawPhaseObserver = null, this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver), this._onAfterDrawPhaseObserver = null, this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver), this._onBeforePhysicsObserver = null, this.scene.onAfterPhysicsObservable.remove(this._onAfterPhysicsObserver), this._onAfterPhysicsObserver = null, this.scene.onAfterAnimationsObservable.remove(this._onAfterAnimationsObserver), this._onAfterAnimationsObserver = null, this.scene = null
        }, t
    })();
    e.SceneInstrumentation = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function() {
        function e() {
            this._timeElapsedQueryEnded = !1
        }
        return e
    })();
    e._TimeToken = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(e) {
            function t() {
                var t = e.call(this) || this;
                return t.DIFFUSE = !1, t.DIFFUSEDIRECTUV = 0, t.GAMMADIFFUSE = !1, t.DIFFUSEHASALPHA = !1, t.OPACITYFRESNEL = !1, t.REFLECTIONBLUR = !1, t.REFLECTIONFRESNEL = !1, t.REFLECTIONFALLOFF = !1, t.TEXTURELODSUPPORT = !1, t.PREMULTIPLYALPHA = !1, t.USERGBCOLOR = !1, t.NOISE = !1, t.REFLECTIONBGR = !1, t.IMAGEPROCESSING = !1, t.VIGNETTE = !1, t.VIGNETTEBLENDMODEMULTIPLY = !1, t.VIGNETTEBLENDMODEOPAQUE = !1, t.TONEMAPPING = !1, t.CONTRAST = !1, t.COLORCURVES = !1, t.COLORGRADING = !1, t.COLORGRADING3D = !1, t.SAMPLER3DGREENDEPTH = !1, t.SAMPLER3DBGRMAP = !1, t.IMAGEPROCESSINGPOSTPROCESS = !1, t.EXPOSURE = !1, t.REFLECTION = !1, t.REFLECTIONMAP_3D = !1, t.REFLECTIONMAP_SPHERICAL = !1, t.REFLECTIONMAP_PLANAR = !1, t.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.REFLECTIONMAP_OPPOSITEZ = !1, t.LODINREFLECTIONALPHA = !1, t.GAMMAREFLECTION = !1, t.EQUIRECTANGULAR_RELFECTION_FOV = !1, t.MAINUV1 = !1, t.MAINUV2 = !1, t.UV1 = !1, t.UV2 = !1, t.CLIPPLANE = !1, t.POINTSIZE = !1, t.FOG = !1, t.NORMAL = !1, t.NUM_BONE_INFLUENCERS = 0, t.BonesPerMesh = 0, t.INSTANCES = !1, t.SHADOWFLOAT = !1, t.rebuild(), t
            }
            return __extends(t, e), t
        })(e.MaterialDefines),
        i = (function(i) {
            function r(t, r) {
                var n = i.call(this, t, r) || this;
                return n.primaryColor = e.Color3.White(), n.primaryLevel = 1, n.secondaryColor = e.Color3.Gray(), n.secondaryLevel = 1, n.tertiaryColor = e.Color3.Black(), n.tertiaryLevel = 1, n.reflectionTexture = null, n.reflectionBlur = 0, n.diffuseTexture = null, n._shadowLights = null, n.shadowLights = null, n.shadowBlurScale = 1, n.shadowLevel = 0, n.sceneCenter = e.Vector3.Zero(), n.opacityFresnel = !0, n.reflectionFresnel = !1, n.reflectionFalloffDistance = 0, n.reflectionAmount = 1, n.reflectionReflectance0 = .05, n.reflectionReflectance90 = .5, n.useRGBColor = !0, n.enableNoise = !1, n._fovMultiplier = 1, n.useEquirectangularFOV = !1, n._maxSimultaneousLights = 4, n.maxSimultaneousLights = 4, n._imageProcessingObserver = null, n.switchToBGR = !1, n._renderTargets = new e.SmartArray(16), n._reflectionControls = e.Vector4.Zero(), n._attachImageProcessingConfiguration(null), n.getRenderTargetTextures = function() {
                    return n._renderTargets.reset(), n._diffuseTexture && n._diffuseTexture.isRenderTarget && n._renderTargets.push(n._diffuseTexture), n._reflectionTexture && n._reflectionTexture.isRenderTarget && n._renderTargets.push(n._reflectionTexture), n._renderTargets
                }, n
            }
            return __extends(r, i), Object.defineProperty(r.prototype, "reflectionStandardFresnelWeight", {
                set: function(e) {
                    var t = e;
                    t < .5 ? (t *= 2, this.reflectionReflectance0 = r.StandardReflectance0 * t, this.reflectionReflectance90 = r.StandardReflectance90 * t) : (t = 2 * t - 1, this.reflectionReflectance0 = r.StandardReflectance0 + (1 - r.StandardReflectance0) * t, this.reflectionReflectance90 = r.StandardReflectance90 + (1 - r.StandardReflectance90) * t)
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "fovMultiplier", {
                get: function() {
                    return this._fovMultiplier
                },
                set: function(e) {
                    isNaN(e) && (e = 1), this._fovMultiplier = Math.max(0, Math.min(2, e))
                },
                enumerable: !0,
                configurable: !0
            }), r.prototype._attachImageProcessingConfiguration = function(e) {
                var t = this;
                e !== this._imageProcessingConfiguration && (this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), this._imageProcessingConfiguration = e || this.getScene().imageProcessingConfiguration, this._imageProcessingObserver = this._imageProcessingConfiguration.onUpdateParameters.add((function(e) {
                    t._markAllSubMeshesAsImageProcessingDirty()
                })))
            }, Object.defineProperty(r.prototype, "imageProcessingConfiguration", {
                get: function() {
                    return this._imageProcessingConfiguration
                },
                set: function(e) {
                    this._attachImageProcessingConfiguration(e), this._markAllSubMeshesAsTexturesDirty()
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraColorCurvesEnabled", {
                get: function() {
                    return this.imageProcessingConfiguration.colorCurvesEnabled
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorCurvesEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraColorGradingEnabled", {
                get: function() {
                    return this.imageProcessingConfiguration.colorGradingEnabled
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorGradingEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraToneMappingEnabled", {
                get: function() {
                    return this._imageProcessingConfiguration.toneMappingEnabled
                },
                set: function(e) {
                    this._imageProcessingConfiguration.toneMappingEnabled = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraExposure", {
                get: function() {
                    return this._imageProcessingConfiguration.exposure
                },
                set: function(e) {
                    this._imageProcessingConfiguration.exposure = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraContrast", {
                get: function() {
                    return this._imageProcessingConfiguration.contrast
                },
                set: function(e) {
                    this._imageProcessingConfiguration.contrast = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraColorGradingTexture", {
                get: function() {
                    return this._imageProcessingConfiguration.colorGradingTexture
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorGradingTexture = e
                },
                enumerable: !0,
                configurable: !0
            }), Object.defineProperty(r.prototype, "cameraColorCurves", {
                get: function() {
                    return this.imageProcessingConfiguration.colorCurves
                },
                set: function(e) {
                    this.imageProcessingConfiguration.colorCurves = e
                },
                enumerable: !0,
                configurable: !0
            }), r.prototype.needAlphaTesting = function() {
                return !0
            }, r.prototype.needAlphaBlending = function() {
                return this.alpha < 0 || null != this._diffuseTexture && this._diffuseTexture.hasAlpha
            }, r.prototype.isReadyForSubMesh = function(i, r, n) {
                var o = this;
                if (void 0 === n && (n = !1), r.effect && this.isFrozen && this._wasPreviouslyReady) return !0;
                r._materialDefines || (r._materialDefines = new t);
                var s = this.getScene(),
                    a = r._materialDefines;
                if (!this.checkReadyOnEveryCall && r.effect && a._renderId === s.getRenderId()) return !0;
                var l = s.getEngine();
                if (e.MaterialHelper.PrepareDefinesForLights(s, i, a, !1, this._maxSimultaneousLights), a._needNormals = !0, a._areTexturesDirty) {
                    if (a._needUVs = !1, s.texturesEnabled) {
                        if (s.getEngine().getCaps().textureLOD && (a.TEXTURELODSUPPORT = !0), this._diffuseTexture && e.StandardMaterial.DiffuseTextureEnabled) {
                            if (!this._diffuseTexture.isReadyOrNotBlocking()) return !1;
                            e.MaterialHelper.PrepareDefinesForMergedUV(this._diffuseTexture, a, "DIFFUSE"), a.DIFFUSEHASALPHA = this._diffuseTexture.hasAlpha, a.GAMMADIFFUSE = this._diffuseTexture.gammaSpace, a.OPACITYFRESNEL = this._opacityFresnel
                        } else a.DIFFUSE = !1, a.DIFFUSEHASALPHA = !1, a.GAMMADIFFUSE = !1, a.OPACITYFRESNEL = !1;
                        var c = this._reflectionTexture;
                        if (c && e.StandardMaterial.ReflectionTextureEnabled) {
                            if (!c.isReadyOrNotBlocking()) return !1;
                            switch (a.REFLECTION = !0, a.GAMMAREFLECTION = c.gammaSpace, a.REFLECTIONBLUR = this._reflectionBlur > 0, a.REFLECTIONMAP_OPPOSITEZ = this.getScene().useRightHandedSystem ? !c.invertZ : c.invertZ, a.LODINREFLECTIONALPHA = c.lodLevelInAlpha, a.EQUIRECTANGULAR_RELFECTION_FOV = this.useEquirectangularFOV, a.REFLECTIONBGR = this.switchToBGR, c.coordinatesMode === e.Texture.INVCUBIC_MODE && (a.INVERTCUBICMAP = !0), a.REFLECTIONMAP_3D = c.isCube, c.coordinatesMode) {
                                case e.Texture.CUBIC_MODE:
                                case e.Texture.INVCUBIC_MODE:
                                    a.REFLECTIONMAP_CUBIC = !0;
                                    break;
                                case e.Texture.EXPLICIT_MODE:
                                    a.REFLECTIONMAP_EXPLICIT = !0;
                                    break;
                                case e.Texture.PLANAR_MODE:
                                    a.REFLECTIONMAP_PLANAR = !0;
                                    break;
                                case e.Texture.PROJECTION_MODE:
                                    a.REFLECTIONMAP_PROJECTION = !0;
                                    break;
                                case e.Texture.SKYBOX_MODE:
                                    a.REFLECTIONMAP_SKYBOX = !0;
                                    break;
                                case e.Texture.SPHERICAL_MODE:
                                    a.REFLECTIONMAP_SPHERICAL = !0;
                                    break;
                                case e.Texture.EQUIRECTANGULAR_MODE:
                                    a.REFLECTIONMAP_EQUIRECTANGULAR = !0;
                                    break;
                                case e.Texture.FIXED_EQUIRECTANGULAR_MODE:
                                    a.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !0;
                                    break;
                                case e.Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE:
                                    a.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !0
                            }
                            this.reflectionFresnel ? (a.REFLECTIONFRESNEL = !0, a.REFLECTIONFALLOFF = this.reflectionFalloffDistance > 0, this._reflectionControls.x = this.reflectionAmount, this._reflectionControls.y = this.reflectionReflectance0, this._reflectionControls.z = this.reflectionReflectance90, this._reflectionControls.w = 1 / this.reflectionFalloffDistance) : (a.REFLECTIONFRESNEL = !1, a.REFLECTIONFALLOFF = !1)
                        } else a.REFLECTION = !1, a.REFLECTIONFALLOFF = !1, a.REFLECTIONBLUR = !1, a.REFLECTIONMAP_3D = !1, a.REFLECTIONMAP_SPHERICAL = !1, a.REFLECTIONMAP_PLANAR = !1, a.REFLECTIONMAP_CUBIC = !1, a.REFLECTIONMAP_PROJECTION = !1, a.REFLECTIONMAP_SKYBOX = !1, a.REFLECTIONMAP_EXPLICIT = !1, a.REFLECTIONMAP_EQUIRECTANGULAR = !1, a.REFLECTIONMAP_EQUIRECTANGULAR_FIXED = !1, a.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = !1, a.INVERTCUBICMAP = !1, a.REFLECTIONMAP_OPPOSITEZ = !1, a.LODINREFLECTIONALPHA = !1, a.GAMMAREFLECTION = !1
                    }
                    a.PREMULTIPLYALPHA = this.alphaMode === e.Engine.ALPHA_PREMULTIPLIED || this.alphaMode === e.Engine.ALPHA_PREMULTIPLIED_PORTERDUFF, a.USERGBCOLOR = this._useRGBColor, a.NOISE = this._enableNoise
                }
                if (a._areImageProcessingDirty) {
                    if (!this._imageProcessingConfiguration.isReady()) return !1;
                    this._imageProcessingConfiguration.prepareDefines(a)
                }
                if (e.MaterialHelper.PrepareDefinesForMisc(i, s, !1, this.pointsCloud, this.fogEnabled, this._shouldTurnAlphaTestOn(i), a), e.MaterialHelper.PrepareDefinesForFrameBoundValues(s, l, a, n), e.MaterialHelper.PrepareDefinesForAttributes(i, a, !1, !0, !1) && i && (s.getEngine().getCaps().standardDerivatives || i.isVerticesDataPresent(e.VertexBuffer.NormalKind) || (i.createNormals(!0), e.Tools.Warn("BackgroundMaterial: Normals have been created for the mesh: " + i.name))), a.isDirty) {
                    a.markAsProcessed(), s.resetCachedMaterial();
                    var h = new e.EffectFallbacks;
                    a.FOG && h.addFallback(0, "FOG"), a.POINTSIZE && h.addFallback(1, "POINTSIZE"), e.MaterialHelper.HandleFallbacksForShadows(a, h, this._maxSimultaneousLights), a.NUM_BONE_INFLUENCERS > 0 && h.addCPUSkinningFallback(0, i);
                    var u = [e.VertexBuffer.PositionKind];
                    a.NORMAL && u.push(e.VertexBuffer.NormalKind), a.UV1 && u.push(e.VertexBuffer.UVKind), a.UV2 && u.push(e.VertexBuffer.UV2Kind), e.MaterialHelper.PrepareAttributesForBones(u, i, a, h), e.MaterialHelper.PrepareAttributesForInstances(u, a);
                    var f = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vFogInfos", "vFogColor", "pointSize", "vClipPlane", "mBones", "vPrimaryColor", "vSecondaryColor", "vTertiaryColor", "vReflectionInfos", "reflectionMatrix", "vReflectionMicrosurfaceInfos", "fFovMultiplier", "shadowLevel", "alpha", "vBackgroundCenter", "vReflectionControl", "vDiffuseInfos", "diffuseMatrix"],
                        d = ["diffuseSampler", "reflectionSampler", "reflectionSamplerLow", "reflectionSamplerHigh"],
                        p = ["Material", "Scene"];
                    e.ImageProcessingConfiguration.PrepareUniforms(f, a), e.ImageProcessingConfiguration.PrepareSamplers(d, a), e.MaterialHelper.PrepareUniformsAndSamplersList({
                        uniformsNames: f,
                        uniformBuffersNames: p,
                        samplers: d,
                        defines: a,
                        maxSimultaneousLights: this._maxSimultaneousLights
                    });
                    var _ = function(e) {
                            o.onCompiled && o.onCompiled(e), o.bindSceneUniformBuffer(e, s.getSceneUniformBuffer())
                        },
                        m = a.toString();
                    r.setEffect(s.getEngine().createEffect("background", {
                        attributes: u,
                        uniformsNames: f,
                        uniformBuffersNames: p,
                        samplers: d,
                        defines: m,
                        fallbacks: h,
                        onCompiled: _,
                        onError: this.onError,
                        indexParameters: {
                            maxSimultaneousLights: this._maxSimultaneousLights
                        }
                    }, l), a), this.buildUniformLayout()
                }
                return !(!r.effect || !r.effect.isReady()) && (a._renderId = s.getRenderId(), this._wasPreviouslyReady = !0, !0)
            }, r.prototype.buildUniformLayout = function() {
                this._uniformBuffer.addUniform("vPrimaryColor", 4), this._uniformBuffer.addUniform("vSecondaryColor", 4), this._uniformBuffer.addUniform("vTertiaryColor", 4), this._uniformBuffer.addUniform("vDiffuseInfos", 2), this._uniformBuffer.addUniform("vReflectionInfos", 2), this._uniformBuffer.addUniform("diffuseMatrix", 16), this._uniformBuffer.addUniform("reflectionMatrix", 16), this._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3), this._uniformBuffer.addUniform("fFovMultiplier", 1), this._uniformBuffer.addUniform("pointSize", 1), this._uniformBuffer.addUniform("shadowLevel", 1), this._uniformBuffer.addUniform("alpha", 1), this._uniformBuffer.addUniform("vBackgroundCenter", 3), this._uniformBuffer.addUniform("vReflectionControl", 4), this._uniformBuffer.create()
            }, r.prototype.unbind = function() {
                this._diffuseTexture && this._diffuseTexture.isRenderTarget && this._uniformBuffer.setTexture("diffuseSampler", null), this._reflectionTexture && this._reflectionTexture.isRenderTarget && this._uniformBuffer.setTexture("reflectionSampler", null), i.prototype.unbind.call(this)
            }, r.prototype.bindOnlyWorldMatrix = function(e) {
                this._activeEffect.setMatrix("world", e)
            }, r.prototype.bindForSubMesh = function(t, i, r) {
                var n = this.getScene(),
                    o = r._materialDefines;
                if (o) {
                    var s = r.effect;
                    if (s) {
                        this._activeEffect = s, this.bindOnlyWorldMatrix(t), e.MaterialHelper.BindBonesParameters(i, this._activeEffect);
                        var a = this._mustRebind(n, s, i.visibility);
                        if (a) {
                            this._uniformBuffer.bindToEffect(s, "Material"), this.bindViewProjection(s);
                            var l = this._reflectionTexture;
                            this._uniformBuffer.useUbo && this.isFrozen && this._uniformBuffer.isSync || (n.texturesEnabled && (this._diffuseTexture && e.StandardMaterial.DiffuseTextureEnabled && (this._uniformBuffer.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level), e.MaterialHelper.BindTextureMatrix(this._diffuseTexture, this._uniformBuffer, "diffuse")), l && e.StandardMaterial.ReflectionTextureEnabled && (this._uniformBuffer.updateMatrix("reflectionMatrix", l.getReflectionTextureMatrix()), this._uniformBuffer.updateFloat2("vReflectionInfos", l.level, this._reflectionBlur), this._uniformBuffer.updateFloat3("vReflectionMicrosurfaceInfos", l.getSize().width, l.lodGenerationScale, l.lodGenerationOffset))), this.shadowLevel > 0 && this._uniformBuffer.updateFloat("shadowLevel", this.shadowLevel), this._uniformBuffer.updateFloat("alpha", this.alpha), this.pointsCloud && this._uniformBuffer.updateFloat("pointSize", this.pointSize), this._uniformBuffer.updateColor4("vPrimaryColor", this._primaryColor, this._primaryLevel), this._uniformBuffer.updateColor4("vSecondaryColor", this._secondaryColor, this._secondaryLevel), this._uniformBuffer.updateColor4("vTertiaryColor", this._tertiaryColor, this._tertiaryLevel)), this._uniformBuffer.updateFloat("fFovMultiplier", this._fovMultiplier), n.texturesEnabled && (this._diffuseTexture && e.StandardMaterial.DiffuseTextureEnabled && this._uniformBuffer.setTexture("diffuseSampler", this._diffuseTexture), l && e.StandardMaterial.ReflectionTextureEnabled && (o.REFLECTIONBLUR && o.TEXTURELODSUPPORT ? this._uniformBuffer.setTexture("reflectionSampler", l) : o.REFLECTIONBLUR ? (this._uniformBuffer.setTexture("reflectionSampler", l._lodTextureMid || l), this._uniformBuffer.setTexture("reflectionSamplerLow", l._lodTextureLow || l), this._uniformBuffer.setTexture("reflectionSamplerHigh", l._lodTextureHigh || l)) : this._uniformBuffer.setTexture("reflectionSampler", l), o.REFLECTIONFRESNEL && (this._uniformBuffer.updateFloat3("vBackgroundCenter", this.sceneCenter.x, this.sceneCenter.y, this.sceneCenter.z), this._uniformBuffer.updateFloat4("vReflectionControl", this._reflectionControls.x, this._reflectionControls.y, this._reflectionControls.z, this._reflectionControls.w)))), e.MaterialHelper.BindClipPlane(this._activeEffect, n), e.MaterialHelper.BindEyePosition(s, n)
                        }!a && this.isFrozen || (n.lightsEnabled && e.MaterialHelper.BindLights(n, i, this._activeEffect, o, this._maxSimultaneousLights, !1), this.bindView(s), e.MaterialHelper.BindFogParameters(n, i, this._activeEffect), this._imageProcessingConfiguration.bind(this._activeEffect)), this._uniformBuffer.update(), this._afterBind(i)
                    }
                }
            }, r.prototype.dispose = function(e, t) {
                void 0 === e && (e = !1), void 0 === t && (t = !1), t && (this.diffuseTexture && this.diffuseTexture.dispose(), this.reflectionTexture && this.reflectionTexture.dispose()), this._renderTargets.dispose(), this._imageProcessingConfiguration && this._imageProcessingObserver && this._imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingObserver), i.prototype.dispose.call(this, e)
            }, r.prototype.clone = function(t) {
                var i = this;
                return e.SerializationHelper.Clone((function() {
                    return new r(t, i.getScene())
                }), this)
            }, r.prototype.serialize = function() {
                var t = e.SerializationHelper.Serialize(this);
                return t.customType = "BABYLON.BackgroundMaterial", t
            }, r.prototype.getClassName = function() {
                return "BackgroundMaterial"
            }, r.Parse = function(t, i, n) {
                return e.SerializationHelper.Parse((function() {
                    return new r(t.name, i)
                }), t, i, n)
            }, r.StandardReflectance0 = .05, r.StandardReflectance90 = .5, __decorate([e.serializeAsColor3()], r.prototype, "_primaryColor", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "primaryColor", void 0), __decorate([e.serialize()], r.prototype, "_primaryLevel", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "primaryLevel", void 0), __decorate([e.serializeAsColor3()], r.prototype, "_secondaryColor", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "secondaryColor", void 0), __decorate([e.serialize()], r.prototype, "_secondaryLevel", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "secondaryLevel", void 0), __decorate([e.serializeAsColor3()], r.prototype, "_tertiaryColor", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "tertiaryColor", void 0), __decorate([e.serialize()], r.prototype, "_tertiaryLevel", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsLightsDirty")], r.prototype, "tertiaryLevel", void 0), __decorate([e.serializeAsTexture()], r.prototype, "_reflectionTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionTexture", void 0), __decorate([e.serialize()], r.prototype, "_reflectionBlur", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionBlur", void 0), __decorate([e.serializeAsTexture()], r.prototype, "_diffuseTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "diffuseTexture", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "shadowLights", void 0), __decorate([e.serialize()], r.prototype, "_shadowBlurScale", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "shadowBlurScale", void 0), __decorate([e.serialize()], r.prototype, "_shadowLevel", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "shadowLevel", void 0), __decorate([e.serializeAsVector3()], r.prototype, "_sceneCenter", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "sceneCenter", void 0), __decorate([e.serialize()], r.prototype, "_opacityFresnel", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "opacityFresnel", void 0), __decorate([e.serialize()], r.prototype, "_reflectionFresnel", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionFresnel", void 0), __decorate([e.serialize()], r.prototype, "_reflectionFalloffDistance", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionFalloffDistance", void 0), __decorate([e.serialize()], r.prototype, "_reflectionAmount", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionAmount", void 0), __decorate([e.serialize()], r.prototype, "_reflectionReflectance0", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionReflectance0", void 0), __decorate([e.serialize()], r.prototype, "_reflectionReflectance90", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "reflectionReflectance90", void 0), __decorate([e.serialize()], r.prototype, "_useRGBColor", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "useRGBColor", void 0), __decorate([e.serialize()], r.prototype, "_enableNoise", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "enableNoise", void 0), __decorate([e.serialize()], r.prototype, "_maxSimultaneousLights", void 0), __decorate([e.expandToProperty("_markAllSubMeshesAsTexturesDirty")], r.prototype, "maxSimultaneousLights", void 0), __decorate([e.serializeAsImageProcessingConfiguration()], r.prototype, "_imageProcessingConfiguration", void 0), r
        })(e.PushMaterial);
    e.BackgroundMaterial = i
})(BABYLON || (BABYLON = {}));
var __assign = this && this.__assign || Object.assign || function(e) {
        for (var t, i = 1, r = arguments.length; i < r; i++) {
            t = arguments[i];
            for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n])
        }
        return e
    },
    BABYLON;
!(function(e) {
    var t = (function() {
        function t(e, i) {
            this._options = __assign({}, t._getDefaultOptions(), e), this._scene = i, this._setupBackground(), this._setupImageProcessing()
        }
        return t._getDefaultOptions = function() {
            return {
                createGround: !0,
                groundSize: 15,
                groundTexture: this._groundTextureCDNUrl,
                groundColor: new e.Color3(.2, .2, .3).toLinearSpace().scale(3),
                groundOpacity: .9,
                enableGroundShadow: !0,
                groundShadowLevel: .5,
                enableGroundMirror: !1,
                groundMirrorSizeRatio: .3,
                groundMirrorBlurKernel: 64,
                groundMirrorAmount: 1,
                groundMirrorFresnelWeight: 1,
                groundMirrorFallOffDistance: 0,
                groundMirrorTextureType: e.Engine.TEXTURETYPE_UNSIGNED_INT,
                groundYBias: 1e-5,
                createSkybox: !0,
                skyboxSize: 20,
                skyboxTexture: this._skyboxTextureCDNUrl,
                skyboxColor: new e.Color3(.2, .2, .3).toLinearSpace().scale(3),
                backgroundYRotation: 0,
                sizeAuto: !0,
                rootPosition: e.Vector3.Zero(),
                setupImageProcessing: !0,
                environmentTexture: this._environmentTextureCDNUrl,
                cameraExposure: .8,
                cameraContrast: 1.2,
                toneMappingEnabled: !0
            }
        }, Object.defineProperty(t.prototype, "rootMesh", {
            get: function() {
                return this._rootMesh
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "skybox", {
            get: function() {
                return this._skybox
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "skyboxTexture", {
            get: function() {
                return this._skyboxTexture
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "skyboxMaterial", {
            get: function() {
                return this._skyboxMaterial
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "ground", {
            get: function() {
                return this._ground
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "groundTexture", {
            get: function() {
                return this._groundTexture
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "groundMirror", {
            get: function() {
                return this._groundMirror
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "groundMirrorRenderList", {
            get: function() {
                return this._groundMirror ? this._groundMirror.renderList : null
            },
            enumerable: !0,
            configurable: !0
        }), Object.defineProperty(t.prototype, "groundMaterial", {
            get: function() {
                return this._groundMaterial
            },
            enumerable: !0,
            configurable: !0
        }), t.prototype.updateOptions = function(e) {
            var t = __assign({}, this._options, e);
            this._ground && !t.createGround && (this._ground.dispose(), this._ground = null), this._groundMaterial && !t.createGround && (this._groundMaterial.dispose(), this._groundMaterial = null), this._groundTexture && this._options.groundTexture != t.groundTexture && (this._groundTexture.dispose(), this._groundTexture = null), this._skybox && !t.createSkybox && (this._skybox.dispose(), this._skybox = null), this._skyboxMaterial && !t.createSkybox && (this._skyboxMaterial.dispose(), this._skyboxMaterial = null), this._skyboxTexture && this._options.skyboxTexture != t.skyboxTexture && (this._skyboxTexture.dispose(), this._skyboxTexture = null), this._groundMirror && !t.enableGroundMirror && (this._groundMirror.dispose(), this._groundMirror = null), this._scene.environmentTexture && this._options.environmentTexture != t.environmentTexture && this._scene.environmentTexture.dispose(), this._options = t, this._setupBackground(), this._setupImageProcessing()
        }, t.prototype.setMainColor = function(t) {
            this.groundMaterial && (this.groundMaterial.primaryColor = t), this.skyboxMaterial && (this.skyboxMaterial.primaryColor = t), this.groundMirror && (this.groundMirror.clearColor = new e.Color4(t.r, t.g, t.b, 1))
        }, t.prototype._setupImageProcessing = function() {
            this._options.setupImageProcessing && (this._scene.imageProcessingConfiguration.contrast = this._options.cameraContrast, this._scene.imageProcessingConfiguration.exposure = this._options.cameraExposure, this._scene.imageProcessingConfiguration.toneMappingEnabled = this._options.toneMappingEnabled, this._setupEnvironmentTexture())
        }, t.prototype._setupEnvironmentTexture = function() {
            if (!this._scene.environmentTexture) {
                if (this._options.environmentTexture instanceof e.BaseTexture) return void(this._scene.environmentTexture = this._options.environmentTexture);
                var t = e.CubeTexture.CreateFromPrefilteredData(this._options.environmentTexture, this._scene);
                this._scene.environmentTexture = t
            }
        }, t.prototype._setupBackground = function() {
            this._rootMesh || (this._rootMesh = new e.Mesh("BackgroundHelper", this._scene)), this._rootMesh.rotation.y = this._options.backgroundYRotation;
            var t = this._getSceneSize();
            this._options.createGround && (this._setupGround(t), this._setupGroundMaterial(), this._setupGroundDiffuseTexture(), this._options.enableGroundMirror && this._setupGroundMirrorTexture(t), this._setupMirrorInGroundMaterial()), this._options.createSkybox && (this._setupSkybox(t), this._setupSkyboxMaterial(), this._setupSkyboxReflectionTexture()), this._rootMesh.position.x = t.rootPosition.x, this._rootMesh.position.z = t.rootPosition.z, this._rootMesh.position.y = t.rootPosition.y
        }, t.prototype._getSceneSize = function() {
            var t = this,
                i = this._options.groundSize,
                r = this._options.skyboxSize,
                n = this._options.rootPosition;
            if (!this._scene.meshes || 1 === this._scene.meshes.length) return {
                groundSize: i,
                skyboxSize: r,
                rootPosition: n
            };
            var o = this._scene.getWorldExtends((function(e) {
                    return e !== t._ground && e !== t._rootMesh && e !== t._skybox
                })),
                s = o.max.subtract(o.min);
            if (this._options.sizeAuto) {
                this._scene.activeCamera instanceof e.ArcRotateCamera && this._scene.activeCamera.upperRadiusLimit && (i = 2 * this._scene.activeCamera.upperRadiusLimit, r = i);
                var a = s.length();
                a > i && (i = 2 * a, r = i), i *= 1.1, r *= 1.5, n = o.min.add(s.scale(.5)), n.y = o.min.y - this._options.groundYBias
            }
            return {
                groundSize: i,
                skyboxSize: r,
                rootPosition: n
            }
        }, t.prototype._setupGround = function(t) {
            var i = this;
            this._ground || (this._ground = e.Mesh.CreatePlane("BackgroundPlane", t.groundSize, this._scene), this._ground.rotation.x = Math.PI / 2, this._ground.parent = this._rootMesh, this._ground.onDisposeObservable.add((function() {
                i._ground = null
            }))), this._ground.receiveShadows = this._options.enableGroundShadow
        }, t.prototype._setupGroundMaterial = function() {
            this._groundMaterial || (this._groundMaterial = new e.BackgroundMaterial("BackgroundPlaneMaterial", this._scene)), this._groundMaterial.alpha = this._options.groundOpacity, this._groundMaterial.alphaMode = e.Engine.ALPHA_PREMULTIPLIED_PORTERDUFF, this._groundMaterial.shadowLevel = this._options.groundShadowLevel, this._groundMaterial.primaryLevel = 1, this._groundMaterial.primaryColor = this._options.groundColor, this._groundMaterial.secondaryLevel = 0, this._groundMaterial.tertiaryLevel = 0, this._groundMaterial.useRGBColor = !1, this._groundMaterial.enableNoise = !0, this._ground && (this._ground.material = this._groundMaterial)
        }, t.prototype._setupGroundDiffuseTexture = function() {
            if (this._groundMaterial && !this._groundTexture) {
                if (this._options.groundTexture instanceof e.BaseTexture) return void(this._groundMaterial.diffuseTexture = this._options.groundTexture);
                var t = new e.Texture(this._options.groundTexture, this._scene);
                t.gammaSpace = !1, t.hasAlpha = !0, this._groundMaterial.diffuseTexture = t
            }
        }, t.prototype._setupGroundMirrorTexture = function(t) {
            var i = e.Texture.CLAMP_ADDRESSMODE;
            if (!this._groundMirror && (this._groundMirror = new e.MirrorTexture("BackgroundPlaneMirrorTexture", {
                    ratio: this._options.groundMirrorSizeRatio
                }, this._scene, !1, this._options.groundMirrorTextureType, e.Texture.BILINEAR_SAMPLINGMODE, !0), this._groundMirror.mirrorPlane = new e.Plane(0, -1, 0, t.rootPosition.y), this._groundMirror.anisotropicFilteringLevel = 1, this._groundMirror.wrapU = i, this._groundMirror.wrapV = i, this._groundMirror.gammaSpace = !1, this._groundMirror.renderList))
                for (var r = 0; r < this._scene.meshes.length; r++) {
                    var n = this._scene.meshes[r];
                    n !== this._ground && n !== this._skybox && n !== this._rootMesh && this._groundMirror.renderList.push(n)
                }
            this._groundMirror.clearColor = new e.Color4(this._options.groundColor.r, this._options.groundColor.g, this._options.groundColor.b, 1), this._groundMirror.adaptiveBlurKernel = this._options.groundMirrorBlurKernel
        }, t.prototype._setupMirrorInGroundMaterial = function() {
            this._groundMaterial && (this._groundMaterial.reflectionTexture = this._groundMirror, this._groundMaterial.reflectionFresnel = !0, this._groundMaterial.reflectionAmount = this._options.groundMirrorAmount, this._groundMaterial.reflectionStandardFresnelWeight = this._options.groundMirrorFresnelWeight, this._groundMaterial.reflectionFalloffDistance = this._options.groundMirrorFallOffDistance)
        }, t.prototype._setupSkybox = function(t) {
            var i = this;
            this._skybox || (this._skybox = e.Mesh.CreateBox("BackgroundSkybox", t.skyboxSize, this._scene, void 0, e.Mesh.BACKSIDE), this._skybox.onDisposeObservable.add((function() {
                i._skybox = null
            }))), this._skybox.parent = this._rootMesh
        }, t.prototype._setupSkyboxMaterial = function() {
            this._skybox && (this._skyboxMaterial || (this._skyboxMaterial = new e.BackgroundMaterial("BackgroundSkyboxMaterial", this._scene)), this._skyboxMaterial.useRGBColor = !1, this._skyboxMaterial.primaryLevel = 1, this._skyboxMaterial.primaryColor = this._options.skyboxColor, this._skyboxMaterial.secondaryLevel = 0, this._skyboxMaterial.tertiaryLevel = 0, this._skyboxMaterial.enableNoise = !0, this._skybox.material = this._skyboxMaterial)
        }, t.prototype._setupSkyboxReflectionTexture = function() {
            if (this._skyboxMaterial && !this._skyboxTexture) {
                if (this._options.skyboxTexture instanceof e.BaseTexture) return void(this._skyboxMaterial.reflectionTexture = this._skyboxTexture);
                this._skyboxTexture = new e.CubeTexture(this._options.skyboxTexture, this._scene), this._skyboxTexture.coordinatesMode = e.Texture.SKYBOX_MODE, this._skyboxTexture.gammaSpace = !1, this._skyboxMaterial.reflectionTexture = this._skyboxTexture
            }
        }, t.prototype.dispose = function() {
            this._groundMaterial && this._groundMaterial.dispose(!0, !0), this._skyboxMaterial && this._skyboxMaterial.dispose(!0, !0), this._rootMesh.dispose(!1)
        }, t._groundTextureCDNUrl = "https://assets.babylonjs.com/environments/backgroundGround.png", t._skyboxTextureCDNUrl = "https://assets.babylonjs.com/environments/backgroundSkybox.dds", t._environmentTextureCDNUrl = "https://assets.babylonjs.com/environments/environmentSpecular.dds", t
    })();
    e.EnvironmentHelper = t
})(BABYLON || (BABYLON = {}));
var BABYLON;
!(function(e) {
    var t = (function(t) {
        function i(i, r, n, o) {
            var s = t.call(this, i, o) || this;
            i = i || "videoDome", n.resolution = 0 | Math.abs(n.resolution) || 12, n.clickToPlay = Boolean(n.clickToPlay), n.autoPlay = void 0 === n.autoPlay || Boolean(n.autoPlay), n.loop = void 0 === n.loop || Boolean(n.loop), n.size = Math.abs(n.size) || (o.activeCamera ? .48 * o.activeCamera.maxZ : 1e3);
            var a = {
                    loop: n.loop,
                    autoPlay: n.autoPlay,
                    autoUpdateTexture: !0
                },
                l = s._material = new e.BackgroundMaterial(i + "_material", o),
                c = s._videoTexture = new e.VideoTexture(i + "_texture", r, o, !1, !1, e.Texture.TRILINEAR_SAMPLINGMODE, a);
            return s._mesh = e.MeshBuilder.CreateIcoSphere(i + "_mesh", {
                flat: !1,
                radius: n.size,
                subdivisions: n.resolution,
                sideOrientation: e.Mesh.BACKSIDE
            }, o), c.coordinatesMode = e.Texture.FIXED_EQUIRECTANGULAR_MIRRORED_MODE, c.wrapV = e.Texture.CLAMP_ADDRESSMODE, l.reflectionTexture = s._videoTexture, l.useEquirectangularFOV = !0, l.fovMultiplier = 1, s._mesh.material = l, s._mesh.parent = s, n.clickToPlay && (o.onPointerUp = function() {
                s._videoTexture.video.play()
            }), s
        }
        return __extends(i, t), Object.defineProperty(i.prototype, "fovMultiplier", {
            get: function() {
                return this._material.fovMultiplier
            },
            set: function(e) {
                this._material.fovMultiplier = e
            },
            enumerable: !0,
            configurable: !0
        }), i.prototype.dispose = function() {
            t.prototype.dispose.call(this), this._videoTexture.dispose(), this._mesh.dispose(), this._material.dispose()
        }, i
    })(e.Node);
    e.VideoDome = t
})(BABYLON || (BABYLON = {})), BABYLON.Effect.ShadersStore = {
    defaultVertexShader: "#include<__decl__defaultVertex>\n\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#ifdef UV2\nattribute vec2 uv2;\n#endif\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include<helperFunctions>\n#include<bonesDeclaration>\n\n#include<instancesDeclaration>\n#ifdef MAINUV1\nvarying vec2 vMainUV1;\n#endif\n#ifdef MAINUV2\nvarying vec2 vMainUV2;\n#endif\n#if defined(DIFFUSE) && DIFFUSEDIRECTUV == 0\nvarying vec2 vDiffuseUV;\n#endif\n#if defined(AMBIENT) && AMBIENTDIRECTUV == 0\nvarying vec2 vAmbientUV;\n#endif\n#if defined(OPACITY) && OPACITYDIRECTUV == 0\nvarying vec2 vOpacityUV;\n#endif\n#if defined(EMISSIVE) && EMISSIVEDIRECTUV == 0\nvarying vec2 vEmissiveUV;\n#endif\n#if defined(LIGHTMAP) && LIGHTMAPDIRECTUV == 0\nvarying vec2 vLightmapUV;\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM) && SPECULARDIRECTUV == 0\nvarying vec2 vSpecularUV;\n#endif\n#if defined(BUMP) && BUMPDIRECTUV == 0\nvarying vec2 vBumpUV;\n#endif\n\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#ifdef VERTEXCOLOR\nvarying vec4 vColor;\n#endif\n#include<bumpVertexDeclaration>\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[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<logDepthDeclaration>\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#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif \n#define CUSTOM_VERTEX_UPDATE_POSITION\n#define CUSTOM_VERTEX_UPDATE_NORMAL\n#include<instancesVertex>\n#include<bonesVertex>\ngl_Position=viewProjection*finalWorld*vec4(positionUpdated,1.0);\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\nvPositionW=vec3(worldPos);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n\n#ifndef UV1\nvec2 uv=vec2(0.,0.);\n#endif\n#ifndef UV2\nvec2 uv2=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uv;\n#endif\n#ifdef MAINUV2\nvMainUV2=uv2;\n#endif\n#if defined(DIFFUSE) && DIFFUSEDIRECTUV == 0\nif (vDiffuseInfos.x == 0.)\n{\nvDiffuseUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvDiffuseUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(AMBIENT) && AMBIENTDIRECTUV == 0\nif (vAmbientInfos.x == 0.)\n{\nvAmbientUV=vec2(ambientMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvAmbientUV=vec2(ambientMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(OPACITY) && OPACITYDIRECTUV == 0\nif (vOpacityInfos.x == 0.)\n{\nvOpacityUV=vec2(opacityMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvOpacityUV=vec2(opacityMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(EMISSIVE) && EMISSIVEDIRECTUV == 0\nif (vEmissiveInfos.x == 0.)\n{\nvEmissiveUV=vec2(emissiveMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvEmissiveUV=vec2(emissiveMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(LIGHTMAP) && LIGHTMAPDIRECTUV == 0\nif (vLightmapInfos.x == 0.)\n{\nvLightmapUV=vec2(lightmapMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvLightmapUV=vec2(lightmapMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM) && SPECULARDIRECTUV == 0\nif (vSpecularInfos.x == 0.)\n{\nvSpecularUV=vec2(specularMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvSpecularUV=vec2(specularMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(BUMP) && BUMPDIRECTUV == 0\nif (vBumpInfos.x == 0.)\n{\nvBumpUV=vec2(bumpMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvBumpUV=vec2(bumpMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#include<bumpVertex>\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<shadowsVertex>[0..maxSimultaneousLights]\n#ifdef VERTEXCOLOR\n\nvColor=color;\n#endif\n#include<pointCloudVertex>\n#include<logDepthVertex>\n#define CUSTOM_VERTEX_MAIN_END\n}\n",
    defaultPixelShader: "#include<__decl__defaultFragment>\n#if defined(BUMP) || !defined(NORMAL)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#define CUSTOM_FRAGMENT_BEGIN\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n\n#define RECIPROCAL_PI2 0.15915494\nuniform vec3 vEyePosition;\nuniform vec3 vAmbientColor;\n\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#ifdef VERTEXCOLOR\nvarying vec4 vColor;\n#endif\n#ifdef MAINUV1\nvarying vec2 vMainUV1;\n#endif\n#ifdef MAINUV2\nvarying vec2 vMainUV2;\n#endif\n\n#include<helperFunctions>\n\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include<lightsFragmentFunctions>\n#include<shadowsFragmentFunctions>\n\n#ifdef DIFFUSE\n#if DIFFUSEDIRECTUV == 1\n#define vDiffuseUV vMainUV1\n#elif DIFFUSEDIRECTUV == 2\n#define vDiffuseUV vMainUV2\n#else\nvarying vec2 vDiffuseUV;\n#endif\nuniform sampler2D diffuseSampler;\n#endif\n#ifdef AMBIENT\n#if AMBIENTDIRECTUV == 1\n#define vAmbientUV vMainUV1\n#elif AMBIENTDIRECTUV == 2\n#define vAmbientUV vMainUV2\n#else\nvarying vec2 vAmbientUV;\n#endif\nuniform sampler2D ambientSampler;\n#endif\n#ifdef OPACITY \n#if OPACITYDIRECTUV == 1\n#define vOpacityUV vMainUV1\n#elif OPACITYDIRECTUV == 2\n#define vOpacityUV vMainUV2\n#else\nvarying vec2 vOpacityUV;\n#endif\nuniform sampler2D opacitySampler;\n#endif\n#ifdef EMISSIVE\n#if EMISSIVEDIRECTUV == 1\n#define vEmissiveUV vMainUV1\n#elif EMISSIVEDIRECTUV == 2\n#define vEmissiveUV vMainUV2\n#else\nvarying vec2 vEmissiveUV;\n#endif\nuniform sampler2D emissiveSampler;\n#endif\n#ifdef LIGHTMAP\n#if LIGHTMAPDIRECTUV == 1\n#define vLightmapUV vMainUV1\n#elif LIGHTMAPDIRECTUV == 2\n#define vLightmapUV vMainUV2\n#else\nvarying vec2 vLightmapUV;\n#endif\nuniform sampler2D lightmapSampler;\n#endif\n#ifdef REFRACTION\n#ifdef REFRACTIONMAP_3D\nuniform samplerCube refractionCubeSampler;\n#else\nuniform sampler2D refraction2DSampler;\n#endif\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\n#if SPECULARDIRECTUV == 1\n#define vSpecularUV vMainUV1\n#elif SPECULARDIRECTUV == 2\n#define vSpecularUV vMainUV2\n#else\nvarying vec2 vSpecularUV;\n#endif\nuniform sampler2D specularSampler;\n#endif\n\n#include<fresnelFunction>\n\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<reflectionFunction>\n#endif\n#include<imageProcessingDeclaration>\n#include<imageProcessingFunctions>\n#include<bumpFragmentFunctions>\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvec3 viewDirectionW=normalize(vEyePosition-vPositionW);\n\nvec4 baseColor=vec4(1.,1.,1.,1.);\nvec3 diffuseColor=vDiffuseColor.rgb;\n\nfloat alpha=vDiffuseColor.a;\n\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=normalize(-cross(dFdx(vPositionW),dFdy(vPositionW)));\n#endif\n#include<bumpFragment>\n#ifdef TWOSIDEDLIGHTING\nnormalW=gl_FrontFacing ? normalW : -normalW;\n#endif\n#ifdef DIFFUSE\nbaseColor=texture2D(diffuseSampler,vDiffuseUV+uvOffset);\n#ifdef ALPHATEST\nif (baseColor.a<0.4)\ndiscard;\n#endif\n#ifdef ALPHAFROMDIFFUSE\nalpha*=baseColor.a;\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_ALPHA\nbaseColor.rgb*=vDiffuseInfos.y;\n#endif\n#include<depthPrePass>\n#ifdef VERTEXCOLOR\nbaseColor.rgb*=vColor.rgb;\n#endif\n#define CUSTOM_FRAGMENT_UPDATE_DIFFUSE\n\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\n#ifdef SPECULARTERM\nfloat glossiness=vSpecularColor.a;\nvec3 specularColor=vSpecularColor.rgb;\n#ifdef SPECULAR\nvec4 specularMapColor=texture2D(specularSampler,vSpecularUV+uvOffset);\nspecularColor=specularMapColor.rgb;\n#ifdef GLOSSINESS\nglossiness=glossiness*specularMapColor.a;\n#endif\n#endif\n#else\nfloat glossiness=0.;\n#endif\n\nvec3 diffuseBase=vec3(0.,0.,0.);\nlightingInfo info;\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\nfloat shadow=1.;\n#ifdef LIGHTMAP\nvec3 lightmapColor=texture2D(lightmapSampler,vLightmapUV+uvOffset).rgb*vLightmapInfos.y;\n#endif\n#include<lightFragment>[0..maxSimultaneousLights]\n\nvec3 refractionColor=vec3(0.,0.,0.);\n#ifdef REFRACTION\nvec3 refractionVector=normalize(refract(-viewDirectionW,normalW,vRefractionInfos.y));\n#ifdef REFRACTIONMAP_3D\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;\nif (dot(refractionVector,viewDirectionW)<1.0)\n{\nrefractionColor=textureCube(refractionCubeSampler,refractionVector).rgb*vRefractionInfos.x;\n}\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));\nvec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;\nrefractionCoords.y=1.0-refractionCoords.y;\nrefractionColor=texture2D(refraction2DSampler,refractionCoords).rgb*vRefractionInfos.x;\n#endif\n#endif\n\nvec3 reflectionColor=vec3(0.,0.,0.);\n#ifdef REFLECTION\nvec3 vReflectionUVW=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\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).rgb*vReflectionInfos.x;\n#else\nreflectionColor=textureCube(reflectionCubeSampler,vReflectionUVW).rgb*vReflectionInfos.x;\n#endif\n#else\nvec2 coords=vReflectionUVW.xy;\n#ifdef REFLECTIONMAP_PROJECTION\ncoords/=vReflectionUVW.z;\n#endif\ncoords.y=1.0-coords.y;\nreflectionColor=texture2D(reflection2DSampler,coords).rgb*vReflectionInfos.x;\n#endif\n#ifdef REFLECTIONFRESNEL\nfloat reflectionFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,reflectionRightColor.a,reflectionLeftColor.a);\n#ifdef REFLECTIONFRESNELFROMSPECULAR\n#ifdef SPECULARTERM\nreflectionColor*=specularColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#else\nreflectionColor*=reflectionLeftColor.rgb*(1.0-reflectionFresnelTerm)+reflectionFresnelTerm*reflectionRightColor.rgb;\n#endif\n#else\nreflectionColor*=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);\nrefractionColor*=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);\nalpha*=(opacityMap.x+opacityMap.y+opacityMap.z)* vOpacityInfos.y;\n#else\nalpha*=opacityMap.a*vOpacityInfos.y;\n#endif\n#endif\n#ifdef VERTEXALPHA\nalpha*=vColor.a;\n#endif\n#ifdef OPACITYFRESNEL\nfloat opacityFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,opacityParts.z,opacityParts.w);\nalpha+=opacityParts.x*(1.0-opacityFresnelTerm)+opacityFresnelTerm*opacityParts.y;\n#endif\n\nvec3 emissiveColor=vEmissiveColor;\n#ifdef EMISSIVE\nemissiveColor+=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb*vEmissiveInfos.y;\n#endif\n#ifdef EMISSIVEFRESNEL\nfloat emissiveFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,emissiveRightColor.a,emissiveLeftColor.a);\nemissiveColor*=emissiveLeftColor.rgb*(1.0-emissiveFresnelTerm)+emissiveFresnelTerm*emissiveRightColor.rgb;\n#endif\n\n#ifdef DIFFUSEFRESNEL\nfloat diffuseFresnelTerm=computeFresnelTerm(viewDirectionW,normalW,diffuseRightColor.a,diffuseLeftColor.a);\ndiffuseBase*=diffuseLeftColor.rgb*(1.0-diffuseFresnelTerm)+diffuseFresnelTerm*diffuseRightColor.rgb;\n#endif\n\n#ifdef EMISSIVEASILLUMINATION\nvec3 finalDiffuse=clamp(diffuseBase*diffuseColor+vAmbientColor,0.0,1.0)*baseColor.rgb;\n#else\n#ifdef LINKEMISSIVEWITHDIFFUSE\nvec3 finalDiffuse=clamp((diffuseBase+emissiveColor)*diffuseColor+vAmbientColor,0.0,1.0)*baseColor.rgb;\n#else\nvec3 finalDiffuse=clamp(diffuseBase*diffuseColor+emissiveColor+vAmbientColor,0.0,1.0)*baseColor.rgb;\n#endif\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase*specularColor;\n#ifdef SPECULAROVERALPHA\nalpha=clamp(alpha+dot(finalSpecular,vec3(0.3,0.59,0.11)),0.,1.);\n#endif\n#else\nvec3 finalSpecular=vec3(0.0);\n#endif\n#ifdef REFLECTIONOVERALPHA\nalpha=clamp(alpha+dot(reflectionColor,vec3(0.3,0.59,0.11)),0.,1.);\n#endif\n\n#ifdef EMISSIVEASILLUMINATION\nvec4 color=vec4(clamp(finalDiffuse*baseAmbientColor+finalSpecular+reflectionColor+emissiveColor+refractionColor,0.0,1.0),alpha);\n#else\nvec4 color=vec4(finalDiffuse*baseAmbientColor+finalSpecular+reflectionColor+refractionColor,alpha);\n#endif\n\n#ifdef LIGHTMAP\n#ifndef LIGHTMAPEXCLUDED\n#ifdef USELIGHTMAPASSHADOWMAP\ncolor.rgb*=lightmapColor;\n#else\ncolor.rgb+=lightmapColor;\n#endif\n#endif\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_FOG\n#include<logDepthFragment>\n#include<fogFragment>\n\n\n#ifdef IMAGEPROCESSINGPOSTPROCESS\ncolor.rgb=toLinearSpace(color.rgb);\n#else\n#ifdef IMAGEPROCESSING\ncolor.rgb=toLinearSpace(color.rgb);\ncolor=applyImageProcessing(color);\n#endif\n#endif\n#ifdef PREMULTIPLYALPHA\n\ncolor.rgb*=color.a;\n#endif\n#define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\ngl_FragColor=color;\n}\n",
    pbrVertexShader: "precision highp float;\n#include<__decl__pbrVertex>\n\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#ifdef UV2\nattribute vec2 uv2;\n#endif\n#ifdef MAINUV1\nvarying vec2 vMainUV1;\n#endif\n#ifdef MAINUV2\nvarying vec2 vMainUV2; \n#endif \n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include<helperFunctions>\n#include<bonesDeclaration>\n\n#include<instancesDeclaration>\n#if defined(ALBEDO) && ALBEDODIRECTUV == 0\nvarying vec2 vAlbedoUV;\n#endif\n#if defined(AMBIENT) && AMBIENTDIRECTUV == 0\nvarying vec2 vAmbientUV;\n#endif\n#if defined(OPACITY) && OPACITYDIRECTUV == 0\nvarying vec2 vOpacityUV;\n#endif\n#if defined(EMISSIVE) && EMISSIVEDIRECTUV == 0\nvarying vec2 vEmissiveUV;\n#endif\n#if defined(LIGHTMAP) && LIGHTMAPDIRECTUV == 0\nvarying vec2 vLightmapUV;\n#endif\n#if defined(REFLECTIVITY) && REFLECTIVITYDIRECTUV == 0\nvarying vec2 vReflectivityUV;\n#endif\n#if defined(MICROSURFACEMAP) && MICROSURFACEMAPDIRECTUV == 0\nvarying vec2 vMicroSurfaceSamplerUV;\n#endif\n#if defined(BUMP) && BUMPDIRECTUV == 0\nvarying vec2 vBumpUV;\n#endif\n\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#include<harmonicsFunctions>\n#endif\n#endif\n#ifdef VERTEXCOLOR\nvarying vec4 vColor;\n#endif\n#include<bumpVertexDeclaration>\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[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<logDepthDeclaration>\nvoid main(void) {\nvec3 positionUpdated=position;\n#ifdef NORMAL\nvec3 normalUpdated=normal;\n#endif\n#ifdef TANGENT\nvec4 tangentUpdated=tangent;\n#endif\n#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=positionUpdated;\n#endif \n#include<instancesVertex>\n#include<bonesVertex>\ngl_Position=viewProjection*finalWorld*vec4(positionUpdated,1.0);\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);\nvPositionW=vec3(worldPos);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normalUpdated);\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=environmentIrradianceJones(reflectionVector);\n#endif\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(positionUpdated,0.0)));\n#endif\n\n#ifndef UV1\nvec2 uv=vec2(0.,0.);\n#endif\n#ifndef UV2\nvec2 uv2=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uv;\n#endif \n#ifdef MAINUV2\nvMainUV2=uv2;\n#endif \n#if defined(ALBEDO) && ALBEDODIRECTUV == 0 \nif (vAlbedoInfos.x == 0.)\n{\nvAlbedoUV=vec2(albedoMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvAlbedoUV=vec2(albedoMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(AMBIENT) && AMBIENTDIRECTUV == 0 \nif (vAmbientInfos.x == 0.)\n{\nvAmbientUV=vec2(ambientMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvAmbientUV=vec2(ambientMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(OPACITY) && OPACITYDIRECTUV == 0 \nif (vOpacityInfos.x == 0.)\n{\nvOpacityUV=vec2(opacityMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvOpacityUV=vec2(opacityMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(EMISSIVE) && EMISSIVEDIRECTUV == 0 \nif (vEmissiveInfos.x == 0.)\n{\nvEmissiveUV=vec2(emissiveMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvEmissiveUV=vec2(emissiveMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(LIGHTMAP) && LIGHTMAPDIRECTUV == 0 \nif (vLightmapInfos.x == 0.)\n{\nvLightmapUV=vec2(lightmapMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvLightmapUV=vec2(lightmapMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(REFLECTIVITY) && REFLECTIVITYDIRECTUV == 0 \nif (vReflectivityInfos.x == 0.)\n{\nvReflectivityUV=vec2(reflectivityMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvReflectivityUV=vec2(reflectivityMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(MICROSURFACEMAP) && MICROSURFACEMAPDIRECTUV == 0 \nif (vMicroSurfaceSamplerInfos.x == 0.)\n{\nvMicroSurfaceSamplerUV=vec2(microSurfaceSamplerMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvMicroSurfaceSamplerUV=vec2(microSurfaceSamplerMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n#if defined(BUMP) && BUMPDIRECTUV == 0 \nif (vBumpInfos.x == 0.)\n{\nvBumpUV=vec2(bumpMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvBumpUV=vec2(bumpMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n\n#include<bumpVertex>\n\n#include<clipPlaneVertex>\n\n#include<fogVertex>\n\n#include<shadowsVertex>[0..maxSimultaneousLights]\n\n#ifdef VERTEXCOLOR\nvColor=color;\n#endif\n\n#ifdef POINTSIZE\ngl_PointSize=pointSize;\n#endif\n\n#include<logDepthVertex>\n}",
    pbrPixelShader: "#if defined(BUMP) || !defined(NORMAL) || defined(FORCENORMALFORWARD)\n#extension GL_OES_standard_derivatives : enable\n#endif\n#ifdef LODBASEDMICROSFURACE\n#extension GL_EXT_shader_texture_lod : enable\n#endif\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nprecision highp float;\n#include<__decl__pbrFragment>\nuniform vec4 vEyePosition;\nuniform vec3 vAmbientColor;\nuniform vec4 vCameraInfos;\n\nvarying vec3 vPositionW;\n#ifdef MAINUV1\nvarying vec2 vMainUV1;\n#endif \n#ifdef MAINUV2 \nvarying vec2 vMainUV2;\n#endif \n#ifdef NORMAL\nvarying vec3 vNormalW;\n#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\nvarying vec3 vEnvironmentIrradiance;\n#endif\n#endif\n#ifdef VERTEXCOLOR\nvarying vec4 vColor;\n#endif\n\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n\n#ifdef ALBEDO\n#if ALBEDODIRECTUV == 1\n#define vAlbedoUV vMainUV1\n#elif ALBEDODIRECTUV == 2\n#define vAlbedoUV vMainUV2\n#else\nvarying vec2 vAlbedoUV;\n#endif\nuniform sampler2D albedoSampler;\n#endif\n#ifdef AMBIENT\n#if AMBIENTDIRECTUV == 1\n#define vAmbientUV vMainUV1\n#elif AMBIENTDIRECTUV == 2\n#define vAmbientUV vMainUV2\n#else\nvarying vec2 vAmbientUV;\n#endif\nuniform sampler2D ambientSampler;\n#endif\n#ifdef OPACITY\n#if OPACITYDIRECTUV == 1\n#define vOpacityUV vMainUV1\n#elif OPACITYDIRECTUV == 2\n#define vOpacityUV vMainUV2\n#else\nvarying vec2 vOpacityUV;\n#endif\nuniform sampler2D opacitySampler;\n#endif\n#ifdef EMISSIVE\n#if EMISSIVEDIRECTUV == 1\n#define vEmissiveUV vMainUV1\n#elif EMISSIVEDIRECTUV == 2\n#define vEmissiveUV vMainUV2\n#else\nvarying vec2 vEmissiveUV;\n#endif\nuniform sampler2D emissiveSampler;\n#endif\n#ifdef LIGHTMAP\n#if LIGHTMAPDIRECTUV == 1\n#define vLightmapUV vMainUV1\n#elif LIGHTMAPDIRECTUV == 2\n#define vLightmapUV vMainUV2\n#else\nvarying vec2 vLightmapUV;\n#endif\nuniform sampler2D lightmapSampler;\n#endif\n#ifdef REFLECTIVITY\n#if REFLECTIVITYDIRECTUV == 1\n#define vReflectivityUV vMainUV1\n#elif REFLECTIVITYDIRECTUV == 2\n#define vReflectivityUV vMainUV2\n#else\nvarying vec2 vReflectivityUV;\n#endif\nuniform sampler2D reflectivitySampler;\n#endif\n#ifdef MICROSURFACEMAP\n#if MICROSURFACEMAPDIRECTUV == 1\n#define vMicroSurfaceSamplerUV vMainUV1\n#elif MICROSURFACEMAPDIRECTUV == 2\n#define vMicroSurfaceSamplerUV vMainUV2\n#else\nvarying vec2 vMicroSurfaceSamplerUV;\n#endif\nuniform sampler2D microSurfaceSampler;\n#endif\n\n#ifdef REFRACTION\n#ifdef 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;\nuniform 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 samplerCube refractionSamplerLow;\nuniform samplerCube refractionSamplerHigh;\n#endif\n#endif\n#endif\n\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;\nuniform samplerCube reflectionSamplerHigh;\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 samplerCube reflectionSamplerLow;\nuniform samplerCube reflectionSamplerHigh;\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#include<reflectionFunction>\n#endif\n#ifdef ENVIRONMENTBRDF\nuniform sampler2D environmentBrdfSampler;\n#endif\n\n#ifndef FROMLINEARSPACE\n#define FROMLINEARSPACE;\n#endif\n#include<imageProcessingDeclaration>\n#include<helperFunctions>\n#include<imageProcessingFunctions>\n\n#include<shadowsFragmentFunctions>\n#include<pbrFunctions>\n#include<harmonicsFunctions>\n#include<pbrLightFunctions>\n#include<bumpFragmentFunctions>\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n\n#include<fogFragmentDeclaration>\nvoid main(void) {\n#include<clipPlaneFragment>\n\n\nvec3 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\n#include<bumpFragment>\n#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\n\nvec3 surfaceAlbedo=vAlbedoColor.rgb;\n\nfloat alpha=vAlbedoColor.a;\n#ifdef ALBEDO\nvec4 albedoTexture=texture2D(albedoSampler,vAlbedoUV+uvOffset);\n#if defined(ALPHAFROMALBEDO) || defined(ALPHATEST)\nalpha*=albedoTexture.a;\n#endif\nsurfaceAlbedo*=toLinearSpace(albedoTexture.rgb);\nsurfaceAlbedo*=vAlbedoInfos.y;\n#endif\n\n#ifdef OPACITY\nvec4 opacityMap=texture2D(opacitySampler,vOpacityUV+uvOffset);\n#ifdef OPACITYRGB\nalpha=getLuminance(opacityMap.rgb);\n#else\nalpha*=opacityMap.a;\n#endif\nalpha*=vOpacityInfos.y;\n#endif\n#ifdef VERTEXALPHA\nalpha*=vColor.a;\n#endif\n#if !defined(LINKREFRACTIONTOTRANSPARENCY) && !defined(ALPHAFRESNEL)\n#ifdef ALPHATEST\nif (alpha<=ALPHATESTVALUE)\ndiscard;\n#ifndef ALPHABLEND\n\nalpha=1.0;\n#endif\n#endif\n#endif\n#include<depthPrePass>\n#ifdef VERTEXCOLOR\nsurfaceAlbedo*=vColor.rgb;\n#endif\n\nvec3 ambientOcclusionColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=texture2D(ambientSampler,vAmbientUV+uvOffset).rgb*vAmbientInfos.y;\n#ifdef AMBIENTINGRAYSCALE\nambientOcclusionColorMap=vec3(ambientOcclusionColorMap.r,ambientOcclusionColorMap.r,ambientOcclusionColorMap.r);\n#endif\nambientOcclusionColor=mix(ambientOcclusionColor,ambientOcclusionColorMap,vAmbientInfos.z);\n#endif\n\nfloat microSurface=vReflectivityColor.a;\nvec3 surfaceReflectivityColor=vReflectivityColor.rgb;\n#ifdef METALLICWORKFLOW\nvec2 metallicRoughness=surfaceReflectivityColor.rg;\n#ifdef REFLECTIVITY\nvec4 surfaceMetallicColorMap=texture2D(reflectivitySampler,vReflectivityUV+uvOffset);\n#ifdef AOSTOREINMETALMAPRED\nvec3 aoStoreInMetalMap=vec3(surfaceMetallicColorMap.r,surfaceMetallicColorMap.r,surfaceMetallicColorMap.r);\nambientOcclusionColor=mix(ambientOcclusionColor,aoStoreInMetalMap,vReflectivityInfos.z);\n#endif\n#ifdef METALLNESSSTOREINMETALMAPBLUE\nmetallicRoughness.r*=surfaceMetallicColorMap.b;\n#else\nmetallicRoughness.r*=surfaceMetallicColorMap.r;\n#endif\n#ifdef ROUGHNESSSTOREINMETALMAPALPHA\nmetallicRoughness.g*=surfaceMetallicColorMap.a;\n#else\n#ifdef ROUGHNESSSTOREINMETALMAPGREEN\nmetallicRoughness.g*=surfaceMetallicColorMap.g;\n#endif\n#endif\n#endif\n#ifdef MICROSURFACEMAP\nvec4 microSurfaceTexel=texture2D(microSurfaceSampler,vMicroSurfaceSamplerUV+uvOffset)*vMicroSurfaceSamplerInfos.y;\nmetallicRoughness.g*=microSurfaceTexel.r;\n#endif\n\nmicroSurface=1.0-metallicRoughness.g;\n\nvec3 baseColor=surfaceAlbedo;\n\n\nconst vec3 DefaultSpecularReflectanceDielectric=vec3(0.04,0.04,0.04);\n\nsurfaceAlbedo=mix(baseColor.rgb*(1.0-DefaultSpecularReflectanceDielectric.r),vec3(0.,0.,0.),metallicRoughness.r);\n\nsurfaceReflectivityColor=mix(DefaultSpecularReflectanceDielectric,baseColor,metallicRoughness.r);\n#else\n#ifdef REFLECTIVITY\nvec4 surfaceReflectivityColorMap=texture2D(reflectivitySampler,vReflectivityUV+uvOffset);\nsurfaceReflectivityColor*=toLinearSpace(surfaceReflectivityColorMap.rgb);\nsurfaceReflectivityColor*=vReflectivityInfos.y;\n#ifdef MICROSURFACEFROMREFLECTIVITYMAP\nmicroSurface*=surfaceReflectivityColorMap.a;\nmicroSurface*=vReflectivityInfos.z;\n#else\n#ifdef MICROSURFACEAUTOMATIC\nmicroSurface*=computeDefaultMicroSurface(microSurface,surfaceReflectivityColor);\n#endif\n#ifdef MICROSURFACEMAP\nvec4 microSurfaceTexel=texture2D(microSurfaceSampler,vMicroSurfaceSamplerUV+uvOffset)*vMicroSurfaceSamplerInfos.y;\nmicroSurface*=microSurfaceTexel.r;\n#endif\n#endif\n#endif\n#endif\n\nmicroSurface=clamp(microSurface,0.,1.);\n\nfloat roughness=1.-microSurface;\n\n#ifdef ALPHAFRESNEL\n#if defined(ALPHATEST) || defined(ALPHABLEND)\n\n\n\nfloat opacityPerceptual=alpha;\n#ifdef LINEARALPHAFRESNEL\nfloat opacity0=opacityPerceptual;\n#else\nfloat opacity0=opacityPerceptual*opacityPerceptual;\n#endif\nfloat opacity90=fresnelGrazingReflectance(opacity0);\nvec3 normalForward=faceforward(normalW,-viewDirectionW,normalW);\n\nalpha=fresnelSchlickEnvironmentGGX(clamp(dot(viewDirectionW,normalForward),0.0,1.0),vec3(opacity0),vec3(opacity90),sqrt(microSurface)).x;\n#ifdef ALPHATEST\nif (alpha<=ALPHATESTVALUE)\ndiscard;\n#ifndef ALPHABLEND\n\nalpha=1.0;\n#endif\n#endif\n#endif\n#endif\n\n\nfloat NdotVUnclamped=dot(normalW,viewDirectionW);\nfloat NdotV=clamp(NdotVUnclamped,0.,1.)+0.00001;\nfloat alphaG=convertRoughnessToAverageSlope(roughness);\n\n#ifdef REFRACTION\nvec3 environmentRefraction=vec3(0.,0.,0.);\nvec3 refractionVector=refract(-viewDirectionW,normalW,vRefractionInfos.y);\n#ifdef REFRACTIONMAP_OPPOSITEZ\nrefractionVector.z*=-1.0;\n#endif\n\n#ifdef REFRACTIONMAP_3D\nrefractionVector.y=refractionVector.y*vRefractionInfos.w;\nvec3 refractionCoords=refractionVector;\nrefractionCoords=vec3(refractionMatrix*vec4(refractionCoords,0));\n#else\nvec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));\nvec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;\nrefractionCoords.y=1.0-refractionCoords.y;\n#endif\n#ifdef LODINREFRACTIONALPHA\nfloat refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,alphaG,NdotVUnclamped);\n#else\nfloat refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,alphaG,1.0);\n#endif\n#ifdef LODBASEDMICROSFURACE\n\nrefractionLOD=refractionLOD*vRefractionMicrosurfaceInfos.y+vRefractionMicrosurfaceInfos.z;\n#ifdef LODINREFRACTIONALPHA\n\n\n\n\n\n\n\n\n\nfloat automaticRefractionLOD=UNPACK_LOD(sampleRefraction(refractionSampler,refractionCoords).a);\nfloat requestedRefractionLOD=max(automaticRefractionLOD,refractionLOD);\n#else\nfloat requestedRefractionLOD=refractionLOD;\n#endif\nenvironmentRefraction=sampleRefractionLod(refractionSampler,refractionCoords,requestedRefractionLOD).rgb;\n#else\nfloat lodRefractionNormalized=clamp(refractionLOD/log2(vRefractionMicrosurfaceInfos.x),0.,1.);\nfloat lodRefractionNormalizedDoubled=lodRefractionNormalized*2.0;\nvec3 environmentRefractionMid=sampleRefraction(refractionSampler,refractionCoords).rgb;\nif(lodRefractionNormalizedDoubled<1.0){\nenvironmentRefraction=mix(\nsampleRefraction(refractionSamplerHigh,refractionCoords).rgb,\nenvironmentRefractionMid,\nlodRefractionNormalizedDoubled\n);\n}else{\nenvironmentRefraction=mix(\nenvironmentRefractionMid,\nsampleRefraction(refractionSamplerLow,refractionCoords).rgb,\nlodRefractionNormalizedDoubled-1.0\n);\n}\n#endif\n#ifdef GAMMAREFRACTION\nenvironmentRefraction=toLinearSpace(environmentRefraction.rgb);\n#endif\n\nenvironmentRefraction*=vRefractionInfos.x;\n#endif\n\n#ifdef REFLECTION\nvec3 environmentRadiance=vec3(0.,0.,0.);\nvec3 environmentIrradiance=vec3(0.,0.,0.);\nvec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\n\n#ifdef REFLECTIONMAP_3D\nvec3 reflectionCoords=reflectionVector;\n#else\nvec2 reflectionCoords=reflectionVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nreflectionCoords/=reflectionVector.z;\n#endif\nreflectionCoords.y=1.0-reflectionCoords.y;\n#endif\n#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)\nfloat reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,NdotVUnclamped);\n#else\nfloat reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,1.);\n#endif\n#ifdef LODBASEDMICROSFURACE\n\nreflectionLOD=reflectionLOD*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z;\n#ifdef LODINREFLECTIONALPHA\n\n\n\n\n\n\n\n\n\nfloat automaticReflectionLOD=UNPACK_LOD(sampleReflection(reflectionSampler,reflectionCoords).a);\nfloat requestedReflectionLOD=max(automaticReflectionLOD,reflectionLOD);\n#else\nfloat requestedReflectionLOD=reflectionLOD;\n#endif\nenvironmentRadiance=sampleReflectionLod(reflectionSampler,reflectionCoords,requestedReflectionLOD).rgb;\n#else\nfloat lodReflectionNormalized=clamp(reflectionLOD/log2(vReflectionMicrosurfaceInfos.x),0.,1.);\nfloat lodReflectionNormalizedDoubled=lodReflectionNormalized*2.0;\nvec3 environmentSpecularMid=sampleReflection(reflectionSampler,reflectionCoords).rgb;\nif(lodReflectionNormalizedDoubled<1.0){\nenvironmentRadiance=mix(\nsampleReflection(reflectionSamplerHigh,reflectionCoords).rgb,\nenvironmentSpecularMid,\nlodReflectionNormalizedDoubled\n);\n}else{\nenvironmentRadiance=mix(\nenvironmentSpecularMid,\nsampleReflection(reflectionSamplerLow,reflectionCoords).rgb,\nlodReflectionNormalizedDoubled-1.0\n);\n}\n#endif\n#ifdef GAMMAREFLECTION\nenvironmentRadiance=toLinearSpace(environmentRadiance.rgb);\n#endif\n\n#ifdef USESPHERICALFROMREFLECTIONMAP\n#if defined(NORMAL) && defined(USESPHERICALINVERTEX)\nenvironmentIrradiance=vEnvironmentIrradiance;\n#else\nvec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;\n#ifdef REFLECTIONMAP_OPPOSITEZ\nirradianceVector.z*=-1.0;\n#endif\nenvironmentIrradiance=environmentIrradianceJones(irradianceVector);\n#endif\n#endif\n\nenvironmentRadiance*=vReflectionInfos.x;\nenvironmentRadiance*=vReflectionColor.rgb;\nenvironmentIrradiance*=vReflectionColor.rgb;\n#endif\n\n\n\nfloat reflectance=max(max(surfaceReflectivityColor.r,surfaceReflectivityColor.g),surfaceReflectivityColor.b);\nfloat reflectance90=fresnelGrazingReflectance(reflectance);\nvec3 specularEnvironmentR0=surfaceReflectivityColor.rgb;\nvec3 specularEnvironmentR90=vec3(1.0,1.0,1.0)*reflectance90;\n\nvec3 diffuseBase=vec3(0.,0.,0.);\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\n#ifdef LIGHTMAP\nvec3 lightmapColor=toLinearSpace(texture2D(lightmapSampler,vLightmapUV+uvOffset).rgb)*vLightmapInfos.y;\n#endif\nlightingInfo info;\nfloat shadow=1.; \nfloat NdotL=-1.;\n#include<lightFragment>[0..maxSimultaneousLights]\n\n#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)\n\nvec2 brdfSamplerUV=vec2(NdotV,roughness);\n\nvec4 environmentBrdf=texture2D(environmentBrdfSampler,brdfSamplerUV);\nvec3 specularEnvironmentReflectance=specularEnvironmentR0*environmentBrdf.x+environmentBrdf.y;\n#ifdef RADIANCEOCCLUSION\n#ifdef AMBIENTINGRAYSCALE\nfloat ambientMonochrome=ambientOcclusionColor.r;\n#else\nfloat ambientMonochrome=getLuminance(ambientOcclusionColor);\n#endif\nfloat seo=environmentRadianceOcclusion(ambientMonochrome,NdotVUnclamped);\nspecularEnvironmentReflectance*=seo;\n#endif\n#ifdef HORIZONOCCLUSION\n#ifdef BUMP\n#ifdef REFLECTIONMAP_3D\nfloat eho=environmentHorizonOcclusion(reflectionCoords,normalW);\nspecularEnvironmentReflectance*=eho;\n#endif\n#endif\n#endif\n#else\n\nvec3 specularEnvironmentReflectance=fresnelSchlickEnvironmentGGX(NdotV,specularEnvironmentR0,specularEnvironmentR90,sqrt(microSurface));\n#endif\n\n#ifdef REFRACTION\nvec3 refractance=vec3(0.0,0.0,0.0);\nvec3 transmission=vec3(1.0,1.0,1.0);\n#ifdef LINKREFRACTIONTOTRANSPARENCY\n\ntransmission*=(1.0-alpha);\n\n\nvec3 mixedAlbedo=surfaceAlbedo;\nfloat maxChannel=max(max(mixedAlbedo.r,mixedAlbedo.g),mixedAlbedo.b);\nvec3 tint=clamp(maxChannel*mixedAlbedo,0.0,1.0);\n\nsurfaceAlbedo*=alpha;\n\nenvironmentIrradiance*=alpha;\n\nenvironmentRefraction*=tint;\n\nalpha=1.0;\n#endif\n\nvec3 bounceSpecularEnvironmentReflectance=(2.0*specularEnvironmentReflectance)/(1.0+specularEnvironmentReflectance);\nspecularEnvironmentReflectance=mix(bounceSpecularEnvironmentReflectance,specularEnvironmentReflectance,alpha);\n\ntransmission*=1.0-specularEnvironmentReflectance;\n\nrefractance=transmission;\n#endif\n\n\n\n\nsurfaceAlbedo.rgb=(1.-reflectance)*surfaceAlbedo.rgb;\n\nvec3 finalDiffuse=diffuseBase;\nfinalDiffuse.rgb+=vAmbientColor;\nfinalDiffuse*=surfaceAlbedo.rgb;\nfinalDiffuse=max(finalDiffuse,0.0);\n\n#ifdef REFLECTION\nvec3 finalIrradiance=environmentIrradiance;\nfinalIrradiance*=surfaceAlbedo.rgb;\n#endif\n\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase;\nfinalSpecular=max(finalSpecular,0.0);\n\nvec3 finalSpecularScaled=finalSpecular*vLightingIntensity.x*vLightingIntensity.w;\n#endif\n\n#ifdef REFLECTION\nvec3 finalRadiance=environmentRadiance;\nfinalRadiance*=specularEnvironmentReflectance;\n\nvec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;\n#endif\n\n#ifdef REFRACTION\nvec3 finalRefraction=environmentRefraction;\nfinalRefraction*=refractance;\n#endif\n\nvec3 finalEmissive=vEmissiveColor;\n#ifdef EMISSIVE\nvec3 emissiveColorTex=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb;\nfinalEmissive*=toLinearSpace(emissiveColorTex.rgb);\nfinalEmissive*=vEmissiveInfos.y;\n#endif\n\n#ifdef ALPHABLEND\nfloat luminanceOverAlpha=0.0;\n#if defined(REFLECTION) && defined(RADIANCEOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalRadianceScaled);\n#endif\n#if defined(SPECULARTERM) && defined(SPECULAROVERALPHA)\nluminanceOverAlpha+=getLuminance(finalSpecularScaled);\n#endif\n#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA)\nalpha=clamp(alpha+luminanceOverAlpha*luminanceOverAlpha,0.,1.);\n#endif\n#endif\n\n\n\nvec4 finalColor=vec4(finalDiffuse*ambientOcclusionColor*vLightingIntensity.x +\n#ifdef REFLECTION\nfinalIrradiance*ambientOcclusionColor*vLightingIntensity.z +\n#endif\n#ifdef SPECULARTERM\n\n\nfinalSpecularScaled +\n#endif\n#ifdef REFLECTION\n\n\nfinalRadianceScaled +\n#endif\n#ifdef REFRACTION\nfinalRefraction*vLightingIntensity.z +\n#endif\nfinalEmissive*vLightingIntensity.y,\nalpha);\n\n#ifdef LIGHTMAP\n#ifndef LIGHTMAPEXCLUDED\n#ifdef USELIGHTMAPASSHADOWMAP\nfinalColor.rgb*=lightmapColor;\n#else\nfinalColor.rgb+=lightmapColor;\n#endif\n#endif\n#endif\n\nfinalColor=max(finalColor,0.0);\n#include<logDepthFragment>\n#include<fogFragment>(color,finalColor)\n#ifdef IMAGEPROCESSINGPOSTPROCESS\n\n\nfinalColor.rgb=clamp(finalColor.rgb,0.,30.0);\n#else\n\nfinalColor=applyImageProcessing(finalColor);\n#endif\n#ifdef PREMULTIPLYALPHA\n\nfinalColor.rgb*=finalColor.a;\n#endif\ngl_FragColor=finalColor;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n}",
    spritesVertexShader: "\nattribute vec4 position;\nattribute vec4 options;\nattribute vec4 cellInfo;\nattribute vec4 color;\n\nuniform vec2 textureInfos;\nuniform mat4 view;\nuniform mat4 projection;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n#include<fogVertexDeclaration>\nvoid main(void) { \nvec3 viewPos=(view*vec4(position.xyz,1.0)).xyz; \nvec2 cornerPos;\nfloat angle=position.w;\nvec2 size=vec2(options.x,options.y);\nvec2 offset=options.zw;\nvec2 uvScale=textureInfos.xy;\ncornerPos=vec2(offset.x-0.5,offset.y-0.5)*size;\n\nvec3 rotatedCorner;\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);\nrotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);\nrotatedCorner.z=0.;\n\nviewPos+=rotatedCorner;\ngl_Position=projection*vec4(viewPos,1.0); \n\nvColor=color;\n\nvec2 uvOffset=vec2(abs(offset.x-cellInfo.x),1.0-abs(offset.y-cellInfo.y));\nvUV=(uvOffset+cellInfo.zw)*uvScale;\n\n#ifdef FOG\nvFogDistance=viewPos;\n#endif\n}",
    spritesPixelShader: "uniform bool alphaTest;\nvarying vec4 vColor;\n\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n\n#include<fogFragmentDeclaration>\nvoid main(void) {\nvec4 color=texture2D(diffuseSampler,vUV);\nif (alphaTest) \n{\nif (color.a<0.95)\ndiscard;\n}\ncolor*=vColor;\n#include<fogFragment>\ngl_FragColor=color;\n}",
    particlesVertexShader: "\nattribute vec3 position;\nattribute vec4 color;\nattribute vec4 options;\nattribute float cellIndex;\n\nuniform mat4 view;\nuniform mat4 projection;\nuniform vec3 particlesInfos; \n\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef CLIPPLANE\nuniform vec4 vClipPlane;\nuniform mat4 invView;\nvarying float fClipDistance;\n#endif\nvoid main(void) { \nvec3 viewPos=(view*vec4(position,1.0)).xyz; \nvec3 cornerPos;\nfloat size=options.y;\nfloat angle=options.x;\nvec2 offset=options.zw;\ncornerPos=vec3(offset.x-0.5,offset.y-0.5,0.)*size;\n\nvec3 rotatedCorner;\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);\nrotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);\nrotatedCorner.z=0.;\n\nviewPos+=rotatedCorner;\ngl_Position=projection*vec4(viewPos,1.0); \nvColor=color;\n#ifdef ANIMATESHEET\nfloat rowOffset=floor(cellIndex/particlesInfos.z);\nfloat columnOffset=cellIndex-rowOffset*particlesInfos.z;\nvec2 uvScale=particlesInfos.xy;\nvec2 uvOffset=vec2(offset.x ,1.0-offset.y);\nvUV=(uvOffset+vec2(columnOffset,rowOffset))*uvScale;\n#else\nvUV=offset;\n#endif\n\n#ifdef CLIPPLANE\nvec4 worldPos=invView*vec4(viewPos,1.0);\nfClipDistance=dot(worldPos,vClipPlane);\n#endif\n}",
    particlesPixelShader: "\nvarying vec2 vUV;\nvarying vec4 vColor;\nuniform vec4 textureMask;\nuniform sampler2D diffuseSampler;\n#ifdef CLIPPLANE\nvarying float fClipDistance;\n#endif\nvoid main(void) {\n#ifdef CLIPPLANE\nif (fClipDistance>0.0)\ndiscard;\n#endif\nvec4 baseColor=texture2D(diffuseSampler,vUV);\ngl_FragColor=(baseColor*textureMask+(vec4(1.,1.,1.,1.)-textureMask))*vColor;\n}",
    gpuRenderParticlesVertexShader: "#version 300 es\nuniform vec4 colorDead;\nuniform mat4 view;\nuniform mat4 projection;\n\nin vec3 position;\nin float age;\nin float life;\nin float size;\nin vec4 color;\nin vec2 offset;\nin vec2 uv;\nout vec2 vUV;\nout vec4 vColor;\n#ifdef CLIPPLANE\nuniform vec4 vClipPlane;\nuniform mat4 invView;\nout float fClipDistance;\n#endif\nvoid main() {\nvUV=uv;\nfloat ratio=age/life;\nvColor=color*vec4(1.0-ratio)+colorDead*vec4(ratio);\n\nvec4 viewPosition=view*vec4(position,1.0);\ngl_Position=projection*(viewPosition+vec4(offset*size,0,1.0));\n\n#ifdef CLIPPLANE\nvec4 worldPos=invView*viewPosition;\nfClipDistance=dot(worldPos,vClipPlane);\n#endif \n}",
    gpuRenderParticlesPixelShader: "#version 300 es\nuniform sampler2D textureSampler;\nin vec2 vUV;\nin vec4 vColor;\nout vec4 outFragColor;\n#ifdef CLIPPLANE\nin float fClipDistance;\n#endif\nvoid main() {\n#ifdef CLIPPLANE\nif (fClipDistance>0.0)\ndiscard;\n#endif \noutFragColor=texture(textureSampler,vUV)*vColor;\n}\n",
    gpuUpdateParticlesVertexShader: "#version 300 es\n#define PI 3.14159\nuniform float currentCount;\nuniform float timeDelta;\nuniform vec3 generalRandoms;\nuniform mat4 emitterWM;\nuniform vec2 lifeTime;\nuniform vec2 emitPower;\nuniform vec2 sizeRange;\nuniform vec4 color1;\nuniform vec4 color2;\nuniform vec3 gravity;\nuniform sampler2D randomSampler;\n#ifdef BOXEMITTER\nuniform vec3 direction1;\nuniform vec3 direction2;\nuniform vec3 minEmitBox;\nuniform vec3 maxEmitBox;\n#endif\n#ifdef SPHEREEMITTER\nuniform float radius;\n#ifdef DIRECTEDSPHEREEMITTER\nuniform vec3 direction1;\nuniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\n#ifdef CONEEMITTER\nuniform float radius;\nuniform float angle;\nuniform float height;\nuniform float directionRandomizer;\n#endif\n\nin vec3 position;\nin float age;\nin float life;\nin float seed;\nin float size;\nin vec4 color;\nin vec3 direction;\n\nout vec3 outPosition;\nout float outAge;\nout float outLife;\nout float outSeed;\nout float outSize;\nout vec4 outColor;\nout vec3 outDirection;\nvec3 getRandomVec3(float offset) {\nreturn texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0)).rgb;\n}\nvec4 getRandomVec4(float offset) {\nreturn texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0));\n}\nvoid main() {\nif (age>=life) {\nvec3 position;\nvec3 direction;\n\nvec4 randoms=getRandomVec4(generalRandoms.x);\n\noutAge=0.0;\noutLife=lifeTime.x+(lifeTime.y-lifeTime.x)*randoms.r;\n\noutSeed=seed;\n\noutSize=sizeRange.x+(sizeRange.y-sizeRange.x)*randoms.g;\n\noutColor=color1+(color2-color1)*randoms.b;\n\n#ifdef BOXEMITTER\nvec3 randoms2=getRandomVec3(generalRandoms.y);\nvec3 randoms3=getRandomVec3(generalRandoms.z);\nposition=minEmitBox+(maxEmitBox-minEmitBox)*randoms2;\ndirection=direction1+(direction2-direction1)*randoms3;\n#elif defined(SPHEREEMITTER)\nvec3 randoms2=getRandomVec3(generalRandoms.y);\nvec3 randoms3=getRandomVec3(generalRandoms.z);\n\nfloat phi=2.0*PI*randoms2.x;\nfloat theta=PI*randoms2.y;\nfloat randX=cos(phi)*sin(theta);\nfloat randY=cos(theta);\nfloat randZ=sin(phi)*sin(theta);\nposition=(radius*randoms2.z)*vec3(randX,randY,randZ);\n#ifdef DIRECTEDSPHEREEMITTER\ndirection=direction1+(direction2-direction1)*randoms3;\n#else\n\ndirection=position+directionRandomizer*randoms3;\n#endif\n#elif defined(CONEEMITTER)\nvec3 randoms2=getRandomVec3(generalRandoms.y);\nfloat s=2.0*PI*randoms2.x;\nfloat h=randoms2.y;\n\nh=1.-h*h;\nfloat lRadius=radius*randoms2.z;\nlRadius=lRadius*h/height;\nfloat randX=lRadius*sin(s);\nfloat randZ=lRadius*cos(s);\nfloat randY=h*height;\nposition=vec3(randX,randY,randZ); \n\nif (angle == 0.) {\ndirection=vec3(0.,1.0,0.);\n} else {\nvec3 randoms3=getRandomVec3(generalRandoms.z);\ndirection=position+directionRandomizer*randoms3;\n}\n#else \n\nposition=vec3(0.,0.,0.);\n\ndirection=2.0*(getRandomVec3(seed)-vec3(0.5,0.5,0.5));\n#endif\nfloat power=emitPower.x+(emitPower.y-emitPower.x)*randoms.a;\noutPosition=(emitterWM*vec4(position,1.)).xyz;\noutDirection=(emitterWM*vec4(direction*power,0.)).xyz;\n} else { \noutPosition=position+(direction+gravity)*timeDelta;\noutAge=age+timeDelta;\noutLife=life;\noutSeed=seed;\noutColor=color;\noutSize=size;\noutDirection=direction;\n}\n}",
    gpuUpdateParticlesPixelShader: "#version 300 es\nvoid main() {\ndiscard;\n}\n",
    colorVertexShader: "\nattribute vec3 position;\n#ifdef VERTEXCOLOR\nattribute vec4 color;\n#endif\n#include<bonesDeclaration>\n\nuniform mat4 viewProjection;\nuniform mat4 world;\n\n#ifdef VERTEXCOLOR\nvarying vec4 vColor;\n#endif\nvoid main(void) {\nmat4 finalWorld=world;\n#include<bonesVertex>\ngl_Position=viewProjection*finalWorld*vec4(position,1.0);\n#ifdef VERTEXCOLOR\n\nvColor=color;\n#endif\n}",
    colorPixelShader: "#ifdef VERTEXCOLOR\nvarying vec4 vColor;\n#else\nuniform vec4 color;\n#endif\nvoid main(void) {\n#ifdef VERTEXCOLOR\ngl_FragColor=vColor;\n#else\ngl_FragColor=color;\n#endif\n}",
    postprocessVertexShader: "\nattribute vec2 position;\nuniform vec2 scale;\n\nvarying vec2 vUV;\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) { \nvUV=(position*madd+madd)*scale;\ngl_Position=vec4(position,0.0,1.0);\n}",
    passPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nvoid main(void) \n{\ngl_FragColor=texture2D(textureSampler,vUV);\n}",
    shadowMapVertexShader: "\nattribute vec3 position;\n#include<bonesDeclaration>\n\n#include<instancesDeclaration>\nuniform mat4 viewProjection;\nuniform vec2 biasAndScale;\nuniform vec2 depthValues;\nvarying float vDepthMetric;\n#ifdef ALPHATEST\nvarying vec2 vUV;\nuniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\nvoid main(void)\n{\n#include<instancesVertex>\n#include<bonesVertex>\nvec4 worldPos=finalWorld*vec4(position,1.0);\ngl_Position=viewProjection*worldPos;\nvDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y))+biasAndScale.x;\n#ifdef ALPHATEST\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n}",
    shadowMapPixelShader: "#ifndef FLOAT\nvec4 pack(float depth)\n{\nconst vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);\nconst vec4 bit_mask=vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);\nvec4 res=fract(depth*bit_shift);\nres-=res.xxyz*bit_mask;\nreturn res;\n}\n#endif\nvarying float vDepthMetric;\n#ifdef ALPHATEST\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n#endif\nuniform vec2 biasAndScale;\nuniform vec2 depthValues;\nvoid main(void)\n{\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUV).a<0.4)\ndiscard;\n#endif\nfloat depth=vDepthMetric;\n#ifdef ESM\ndepth=clamp(exp(-min(87.,biasAndScale.y*depth)),0.,1.);\n#endif\n#ifdef FLOAT\ngl_FragColor=vec4(depth,1.0,1.0,1.0);\n#else\ngl_FragColor=pack(depth);\n#endif\n}",
    depthBoxBlurPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n\nuniform vec2 screenSize;\nvoid main(void)\n{\nvec4 colorDepth=vec4(0.0);\nfor (int x=-OFFSET; x<=OFFSET; x++)\nfor (int y=-OFFSET; y<=OFFSET; y++)\ncolorDepth+=texture2D(textureSampler,vUV+vec2(x,y)/screenSize);\ngl_FragColor=(colorDepth/float((OFFSET*2+1)*(OFFSET*2+1)));\n}",
    proceduralVertexShader: "\nattribute vec2 position;\n\nvarying vec2 vPosition;\nvarying vec2 vUV;\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) { \nvPosition=position;\nvUV=position*madd+madd;\ngl_Position=vec4(position,0.0,1.0);\n}",
    depthVertexShader: "\nattribute vec3 position;\n#include<bonesDeclaration>\n\n#include<instancesDeclaration>\nuniform mat4 viewProjection;\nuniform vec2 depthValues;\n#if defined(ALPHATEST) || defined(NEED_UV)\nvarying vec2 vUV;\nuniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\nvarying float vDepthMetric;\nvoid main(void)\n{\n#include<instancesVertex>\n#include<bonesVertex>\ngl_Position=viewProjection*finalWorld*vec4(position,1.0);\nvDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y));\n#if defined(ALPHATEST) || defined(BASIC_RENDER)\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n}",
    depthPixelShader: "#ifdef ALPHATEST\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n#endif\nvarying float vDepthMetric;\nvoid main(void)\n{\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUV).a<0.4)\ndiscard;\n#endif\ngl_FragColor=vec4(vDepthMetric,vDepthMetric*vDepthMetric,0.0,1.0);\n}",
    ssaoPixelShader: "\nuniform sampler2D textureSampler;\nvarying vec2 vUV;\n#ifdef SSAO\nuniform sampler2D randomSampler;\nuniform float randTextureTiles;\nuniform float samplesFactor;\nuniform vec3 sampleSphere[SAMPLES];\nuniform float totalStrength;\nuniform float radius;\nuniform float area;\nuniform float fallOff;\nuniform float base;\nvec3 normalFromDepth(float depth,vec2 coords)\n{\nvec2 offset1=vec2(0.0,radius);\nvec2 offset2=vec2(radius,0.0);\nfloat depth1=texture2D(textureSampler,coords+offset1).r;\nfloat depth2=texture2D(textureSampler,coords+offset2).r;\nvec3 p1=vec3(offset1,depth1-depth);\nvec3 p2=vec3(offset2,depth2-depth);\nvec3 normal=cross(p1,p2);\nnormal.z=-normal.z;\nreturn normalize(normal);\n}\nvoid main()\n{\nvec3 random=normalize(texture2D(randomSampler,vUV*randTextureTiles).rgb);\nfloat depth=texture2D(textureSampler,vUV).r;\nvec3 position=vec3(vUV,depth);\nvec3 normal=normalFromDepth(depth,vUV);\nfloat radiusDepth=radius/depth;\nfloat occlusion=0.0;\nvec3 ray;\nvec3 hemiRay;\nfloat occlusionDepth;\nfloat difference;\nfor (int i=0; i<SAMPLES; i++)\n{\nray=radiusDepth*reflect(sampleSphere[i],random);\nhemiRay=position+sign(dot(ray,normal))*ray;\nocclusionDepth=texture2D(textureSampler,clamp(hemiRay.xy,vec2(0.001,0.001),vec2(0.999,0.999))).r;\ndifference=depth-occlusionDepth;\nocclusion+=step(fallOff,difference)*(1.0-smoothstep(fallOff,area,difference));\n}\nfloat ao=1.0-totalStrength*occlusion*samplesFactor;\nfloat result=clamp(ao+base,0.0,1.0);\ngl_FragColor.r=result;\ngl_FragColor.g=result;\ngl_FragColor.b=result;\ngl_FragColor.a=1.0;\n}\n#endif\n",
    ssao2PixelShader: "\nprecision highp float;\nuniform sampler2D textureSampler;\nuniform float near;\nuniform float far;\nuniform float radius;\nvarying vec2 vUV;\nfloat perspectiveDepthToViewZ( const in float invClipZ,const in float near,const in float far ) {\nreturn ( near*far )/( ( far-near )*invClipZ-far );\n}\nfloat viewZToPerspectiveDepth( const in float viewZ,const in float near,const in float far ) {\nreturn ( near*far/viewZ+far)/( far-near );\n}\nfloat viewZToOrthographicDepth( const in float viewZ,const in float near,const in float far ) {\nreturn ( viewZ+near )/( near-far );\n}\n#ifdef SSAO\nuniform sampler2D randomSampler;\nuniform sampler2D normalSampler;\nuniform float randTextureTiles;\nuniform float samplesFactor;\nuniform vec3 sampleSphere[SAMPLES];\nuniform float totalStrength;\nuniform float base;\nuniform float xViewport;\nuniform float yViewport;\nuniform float maxZ;\nuniform float minZAspect;\nuniform vec2 texelSize;\nuniform mat4 projection;\nvoid main()\n{\nvec3 random=texture2D(randomSampler,vUV*randTextureTiles).rgb;\nfloat depth=texture2D(textureSampler,vUV).r;\nfloat depthSign=depth/abs(depth);\ndepth=depth*depthSign;\nvec3 normal=texture2D(normalSampler,vUV).rgb; \nfloat occlusion=0.0;\nfloat correctedRadius=min(radius,minZAspect*depth/near);\nvec3 vViewRay=vec3((vUV.x*2.0-1.0)*xViewport,(vUV.y*2.0-1.0)*yViewport,depthSign);\nvec3 origin=vViewRay*depth;\nvec3 rvec=random*2.0-1.0;\nrvec.z=0.0;\nvec3 tangent=normalize(rvec-normal*dot(rvec,normal));\nvec3 bitangent=cross(normal,tangent);\nmat3 tbn=mat3(tangent,bitangent,normal);\nfloat difference;\nif (depth>maxZ) {\ngl_FragColor=vec4(1.0,1.0,1.0,1.0);\nreturn;\n}\nfor (int i=0; i<SAMPLES; ++i) {\n\nvec3 samplePosition=tbn*sampleSphere[i];\nsamplePosition=samplePosition*correctedRadius+origin;\n\nvec4 offset=vec4(samplePosition,1.0);\noffset=projection*offset;\noffset.xyz/=offset.w;\noffset.xy=offset.xy*0.5+0.5;\nif (offset.x<0.0 || offset.y<0.0 || offset.x>1.0 || offset.y>1.0) {\ncontinue;\n}\n\nfloat sampleDepth=abs(texture2D(textureSampler,offset.xy).r);\n\nfloat rangeCheck=abs(depth-sampleDepth)<correctedRadius ? 1.0 : 0.0;\ndifference=depthSign*samplePosition.z-sampleDepth;\n\nocclusion+=(difference>=1e-5 ? 1.0 : 0.0)*rangeCheck;\n}\n\nfloat ao=1.0-totalStrength*occlusion*samplesFactor;\nfloat result=clamp(ao+base,0.0,1.0);\ngl_FragColor=vec4(vec3(result),1.0);\n}\n#endif\n#ifdef BILATERAL_BLUR\nuniform sampler2D depthSampler;\nuniform float outSize;\nuniform float samplerOffsets[SAMPLES];\nvec4 blur9(sampler2D image,vec2 uv,float resolution,vec2 direction) {\nvec4 color=vec4(0.0);\nvec2 off1=vec2(1.3846153846)*direction;\nvec2 off2=vec2(3.2307692308)*direction;\ncolor+=texture2D(image,uv)*0.2270270270;\ncolor+=texture2D(image,uv+(off1/resolution))*0.3162162162;\ncolor+=texture2D(image,uv-(off1/resolution))*0.3162162162;\ncolor+=texture2D(image,uv+(off2/resolution))*0.0702702703;\ncolor+=texture2D(image,uv-(off2/resolution))*0.0702702703;\nreturn color;\n}\nvec4 blur13(sampler2D image,vec2 uv,float resolution,vec2 direction) {\nvec4 color=vec4(0.0);\nvec2 off1=vec2(1.411764705882353)*direction;\nvec2 off2=vec2(3.2941176470588234)*direction;\nvec2 off3=vec2(5.176470588235294)*direction;\ncolor+=texture2D(image,uv)*0.1964825501511404;\ncolor+=texture2D(image,uv+(off1/resolution))*0.2969069646728344;\ncolor+=texture2D(image,uv-(off1/resolution))*0.2969069646728344;\ncolor+=texture2D(image,uv+(off2/resolution))*0.09447039785044732;\ncolor+=texture2D(image,uv-(off2/resolution))*0.09447039785044732;\ncolor+=texture2D(image,uv+(off3/resolution))*0.010381362401148057;\ncolor+=texture2D(image,uv-(off3/resolution))*0.010381362401148057;\nreturn color;\n}\nvec4 blur13Bilateral(sampler2D image,vec2 uv,float resolution,vec2 direction) {\nvec4 color=vec4(0.0);\nvec2 off1=vec2(1.411764705882353)*direction;\nvec2 off2=vec2(3.2941176470588234)*direction;\nvec2 off3=vec2(5.176470588235294)*direction;\nfloat compareDepth=abs(texture2D(depthSampler,uv).r);\nfloat sampleDepth;\nfloat weight;\nfloat weightSum=30.0;\ncolor+=texture2D(image,uv)*30.0;\nsampleDepth=abs(texture2D(depthSampler,uv+(off1/resolution)).r);\nweight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30.0);\nweightSum+=weight;\ncolor+=texture2D(image,uv+(off1/resolution))*weight;\nsampleDepth=abs(texture2D(depthSampler,uv-(off1/resolution)).r);\nweight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30.0);\nweightSum+=weight;\ncolor+=texture2D(image,uv-(off1/resolution))*weight;\nsampleDepth=abs(texture2D(depthSampler,uv+(off2/resolution)).r);\nweight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30.0);\nweightSum+=weight;\ncolor+=texture2D(image,uv+(off2/resolution))*weight;\nsampleDepth=abs(texture2D(depthSampler,uv-(off2/resolution)).r);\nweight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30.0);\nweightSum+=weight;\ncolor+=texture2D(image,uv-(off2/resolution))*weight;\nsampleDepth=abs(texture2D(depthSampler,uv+(off3/resolution)).r);\nweight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30.0);\nweightSum+=weight;\ncolor+=texture2D(image,uv+(off3/resolution))*weight;\nsampleDepth=abs(texture2D(depthSampler,uv-(off3/resolution)).r);\nweight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30.0);\nweightSum+=weight;\ncolor+=texture2D(image,uv-(off3/resolution))*weight;\nreturn color/weightSum;\n}\nvoid main()\n{\n#if EXPENSIVE\nfloat compareDepth=abs(texture2D(depthSampler,vUV).r);\nfloat texelsize=1.0/outSize;\nfloat result=0.0;\nfloat weightSum=0.0;\nfor (int i=0; i<SAMPLES; ++i)\n{\n#ifdef BILATERAL_BLUR_H\nvec2 direction=vec2(1.0,0.0);\nvec2 sampleOffset=vec2(texelsize*samplerOffsets[i],0.0);\n#else\nvec2 direction=vec2(0.0,1.0);\nvec2 sampleOffset=vec2(0.0,texelsize*samplerOffsets[i]);\n#endif\nvec2 samplePos=vUV+sampleOffset;\nfloat sampleDepth=abs(texture2D(depthSampler,samplePos).r);\nfloat weight=clamp(1.0/( 0.003+abs(compareDepth-sampleDepth)),0.0,30000.0);\nresult+=texture2D(textureSampler,samplePos).r*weight;\nweightSum+=weight;\n}\nresult/=weightSum;\ngl_FragColor.rgb=vec3(result);\ngl_FragColor.a=1.0;\n#else\nvec4 color;\n#ifdef BILATERAL_BLUR_H\nvec2 direction=vec2(1.0,0.0);\ncolor=blur13Bilateral(textureSampler,vUV,outSize,direction);\n#else\nvec2 direction=vec2(0.0,1.0);\ncolor=blur13Bilateral(textureSampler,vUV,outSize,direction);\n#endif\ngl_FragColor.rgb=vec3(color.r);\ngl_FragColor.a=1.0;\n#endif\n}\n#endif\n",
    ssaoCombinePixelShader: "uniform sampler2D textureSampler;\nuniform sampler2D originalColor;\nvarying vec2 vUV;\nvoid main(void) {\nvec4 ssaoColor=texture2D(textureSampler,vUV);\nvec4 sceneColor=texture2D(originalColor,vUV);\ngl_FragColor=sceneColor*ssaoColor;\n}\n",
    chromaticAberrationPixelShader: "\nuniform sampler2D textureSampler; \n\nuniform float chromatic_aberration;\nuniform float screen_width;\nuniform float screen_height;\n\nvarying vec2 vUV;\nvoid main(void)\n{\nvec2 centered_screen_pos=vec2(vUV.x-0.5,vUV.y-0.5);\nfloat radius2=centered_screen_pos.x*centered_screen_pos.x\n+centered_screen_pos.y*centered_screen_pos.y;\nfloat radius=sqrt(radius2);\nvec4 original=texture2D(textureSampler,vUV);\nif (chromatic_aberration>0.0) {\n\nvec3 ref_indices=vec3(-0.3,0.0,0.3);\nfloat ref_shiftX=chromatic_aberration*radius*17.0/screen_width;\nfloat ref_shiftY=chromatic_aberration*radius*17.0/screen_height;\n\nvec2 ref_coords_r=vec2(vUV.x+ref_indices.r*ref_shiftX,vUV.y+ref_indices.r*ref_shiftY*0.5);\nvec2 ref_coords_g=vec2(vUV.x+ref_indices.g*ref_shiftX,vUV.y+ref_indices.g*ref_shiftY*0.5);\nvec2 ref_coords_b=vec2(vUV.x+ref_indices.b*ref_shiftX,vUV.y+ref_indices.b*ref_shiftY*0.5);\noriginal.r=texture2D(textureSampler,ref_coords_r).r;\noriginal.g=texture2D(textureSampler,ref_coords_g).g;\noriginal.b=texture2D(textureSampler,ref_coords_b).b;\n}\ngl_FragColor=original;\n}",
    lensHighlightsPixelShader: "\nuniform sampler2D textureSampler; \n\nuniform float gain;\nuniform float threshold;\nuniform float screen_width;\nuniform float screen_height;\n\nvarying vec2 vUV;\n\nvec4 highlightColor(vec4 color) {\nvec4 highlight=color;\nfloat luminance=dot(highlight.rgb,vec3(0.2125,0.7154,0.0721));\nfloat lum_threshold;\nif (threshold>1.0) { lum_threshold=0.94+0.01*threshold; }\nelse { lum_threshold=0.5+0.44*threshold; }\nluminance=clamp((luminance-lum_threshold)*(1.0/(1.0-lum_threshold)),0.0,1.0);\nhighlight*=luminance*gain;\nhighlight.a=1.0;\nreturn highlight;\n}\nvoid main(void)\n{\nvec4 original=texture2D(textureSampler,vUV);\n\nif (gain == -1.0) {\ngl_FragColor=vec4(0.0,0.0,0.0,1.0);\nreturn;\n}\nfloat w=2.0/screen_width;\nfloat h=2.0/screen_height;\nfloat weight=1.0;\n\nvec4 blurred=vec4(0.0,0.0,0.0,0.0);\n#ifdef PENTAGON\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.84*w,0.43*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.48*w,-1.29*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.61*w,1.51*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.55*w,-0.74*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.71*w,-0.52*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.94*w,1.59*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.40*w,-1.87*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.62*w,1.16*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.09*w,0.25*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.46*w,-1.71*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.08*w,2.42*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.85*w,-1.89*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.89*w,0.16*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.29*w,1.88*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.40*w,-2.81*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.54*w,2.26*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.60*w,-0.61*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.31*w,-1.30*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.83*w,2.53*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.12*w,-2.48*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.60*w,1.11*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.82*w,0.99*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.50*w,-2.81*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.85*w,3.33*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.94*w,-1.92*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(3.27*w,-0.53*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.95*w,2.48*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.23*w,-3.04*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.17*w,2.05*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.97*w,-0.04*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.25*w,-2.00*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.31*w,3.08*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.94*w,-2.59*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(3.37*w,0.64*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-3.13*w,1.93*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.03*w,-3.65*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.60*w,3.17*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-3.14*w,-1.19*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(3.00*w,-1.19*h)));\n#else\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.85*w,0.36*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.52*w,-1.14*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.46*w,1.42*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.46*w,-0.83*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.79*w,-0.42*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.11*w,1.62*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.29*w,-2.07*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.69*w,1.39*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.28*w,0.12*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.65*w,-1.69*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.08*w,2.44*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.63*w,-1.90*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.55*w,0.31*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.13*w,1.52*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.56*w,-2.61*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.38*w,2.34*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.64*w,-0.81*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.53*w,-1.21*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.06*w,2.63*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.00*w,-2.69*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.59*w,1.32*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.82*w,0.78*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.57*w,-2.50*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(0.54*w,2.93*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.39*w,-1.81*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(3.01*w,-0.28*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.04*w,2.25*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.02*w,-3.05*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.09*w,2.25*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-3.07*w,-0.25*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.44*w,-1.90*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-0.52*w,3.05*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-1.68*w,-2.61*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(3.01*w,0.79*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.76*w,1.46*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.05*w,-2.94*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(1.21*w,2.88*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(-2.84*w,-1.30*h)));\nblurred+=highlightColor(texture2D(textureSampler,vUV+vec2(2.98*w,-0.96*h)));\n#endif\nblurred/=39.0;\ngl_FragColor=blurred;\n\n}",
    depthOfFieldPixelShader: "\n\n\n\n\nuniform sampler2D textureSampler;\nuniform sampler2D highlightsSampler;\nuniform sampler2D depthSampler;\nuniform sampler2D grainSampler;\n\nuniform float grain_amount;\nuniform bool blur_noise;\nuniform float screen_width;\nuniform float screen_height;\nuniform float distortion;\nuniform bool dof_enabled;\n\nuniform float screen_distance; \nuniform float aperture;\nuniform float darken;\nuniform float edge_blur;\nuniform bool highlights;\n\nuniform float near;\nuniform float far;\n\nvarying vec2 vUV;\n\n#define PI 3.14159265\n#define TWOPI 6.28318530\n#define inverse_focal_length 0.1 \n\nvec2 centered_screen_pos;\nvec2 distorted_coords;\nfloat radius2;\nfloat radius;\n\nvec2 rand(vec2 co)\n{\nfloat noise1=(fract(sin(dot(co,vec2(12.9898,78.233)))*43758.5453));\nfloat noise2=(fract(sin(dot(co,vec2(12.9898,78.233)*2.0))*43758.5453));\nreturn clamp(vec2(noise1,noise2),0.0,1.0);\n}\n\nvec2 getDistortedCoords(vec2 coords) {\nif (distortion == 0.0) { return coords; }\nvec2 direction=1.0*normalize(centered_screen_pos);\nvec2 dist_coords=vec2(0.5,0.5);\ndist_coords.x=0.5+direction.x*radius2*1.0;\ndist_coords.y=0.5+direction.y*radius2*1.0;\nfloat dist_amount=clamp(distortion*0.23,0.0,1.0);\ndist_coords=mix(coords,dist_coords,dist_amount);\nreturn dist_coords;\n}\n\nfloat sampleScreen(inout vec4 color,const in vec2 offset,const in float weight) {\n\nvec2 coords=distorted_coords;\nfloat angle=rand(coords*100.0).x*TWOPI;\ncoords+=vec2(offset.x*cos(angle)-offset.y*sin(angle),offset.x*sin(angle)+offset.y*cos(angle));\ncolor+=texture2D(textureSampler,coords)*weight;\nreturn weight;\n}\n\nfloat getBlurLevel(float size) {\nreturn min(3.0,ceil(size/1.0));\n}\n\nvec4 getBlurColor(float size) {\nvec4 col=texture2D(textureSampler,distorted_coords);\nif (size == 0.0) { return col; }\n\n\nfloat blur_level=getBlurLevel(size);\nfloat w=(size/screen_width);\nfloat h=(size/screen_height);\nfloat total_weight=1.0;\nvec2 sample_coords;\ntotal_weight+=sampleScreen(col,vec2(-0.50*w,0.24*h),0.93);\ntotal_weight+=sampleScreen(col,vec2(0.30*w,-0.75*h),0.90);\ntotal_weight+=sampleScreen(col,vec2(0.36*w,0.96*h),0.87);\ntotal_weight+=sampleScreen(col,vec2(-1.08*w,-0.55*h),0.85);\ntotal_weight+=sampleScreen(col,vec2(1.33*w,-0.37*h),0.83);\ntotal_weight+=sampleScreen(col,vec2(-0.82*w,1.31*h),0.80);\ntotal_weight+=sampleScreen(col,vec2(-0.31*w,-1.67*h),0.78);\ntotal_weight+=sampleScreen(col,vec2(1.47*w,1.11*h),0.76);\ntotal_weight+=sampleScreen(col,vec2(-1.97*w,0.19*h),0.74);\ntotal_weight+=sampleScreen(col,vec2(1.42*w,-1.57*h),0.72);\nif (blur_level>1.0) {\ntotal_weight+=sampleScreen(col,vec2(0.01*w,2.25*h),0.70);\ntotal_weight+=sampleScreen(col,vec2(-1.62*w,-1.74*h),0.67);\ntotal_weight+=sampleScreen(col,vec2(2.49*w,0.20*h),0.65);\ntotal_weight+=sampleScreen(col,vec2(-2.07*w,1.61*h),0.63);\ntotal_weight+=sampleScreen(col,vec2(0.46*w,-2.70*h),0.61);\ntotal_weight+=sampleScreen(col,vec2(1.55*w,2.40*h),0.59);\ntotal_weight+=sampleScreen(col,vec2(-2.88*w,-0.75*h),0.56);\ntotal_weight+=sampleScreen(col,vec2(2.73*w,-1.44*h),0.54);\ntotal_weight+=sampleScreen(col,vec2(-1.08*w,3.02*h),0.52);\ntotal_weight+=sampleScreen(col,vec2(-1.28*w,-3.05*h),0.49);\n}\nif (blur_level>2.0) {\ntotal_weight+=sampleScreen(col,vec2(3.11*w,1.43*h),0.46);\ntotal_weight+=sampleScreen(col,vec2(-3.36*w,1.08*h),0.44);\ntotal_weight+=sampleScreen(col,vec2(1.80*w,-3.16*h),0.41);\ntotal_weight+=sampleScreen(col,vec2(0.83*w,3.65*h),0.38);\ntotal_weight+=sampleScreen(col,vec2(-3.16*w,-2.19*h),0.34);\ntotal_weight+=sampleScreen(col,vec2(3.92*w,-0.53*h),0.31);\ntotal_weight+=sampleScreen(col,vec2(-2.59*w,3.12*h),0.26);\ntotal_weight+=sampleScreen(col,vec2(-0.20*w,-4.15*h),0.22);\ntotal_weight+=sampleScreen(col,vec2(3.02*w,3.00*h),0.15);\n}\ncol/=total_weight; \n\nif (darken>0.0) {\ncol.rgb*=clamp(0.3,1.0,1.05-size*0.5*darken);\n}\n\n\n\n\nreturn col;\n}\nvoid main(void)\n{\n\ncentered_screen_pos=vec2(vUV.x-0.5,vUV.y-0.5);\nradius2=centered_screen_pos.x*centered_screen_pos.x+centered_screen_pos.y*centered_screen_pos.y;\nradius=sqrt(radius2);\ndistorted_coords=getDistortedCoords(vUV); \nvec2 texels_coords=vec2(vUV.x*screen_width,vUV.y*screen_height); \nfloat depth=texture2D(depthSampler,distorted_coords).r; \nfloat distance=near+(far-near)*depth; \nvec4 color=texture2D(textureSampler,vUV); \n\n\nfloat coc=abs(aperture*(screen_distance*(inverse_focal_length-1.0/distance)-1.0));\n\nif (dof_enabled == false || coc<0.07) { coc=0.0; }\n\nfloat edge_blur_amount=0.0;\nif (edge_blur>0.0) {\nedge_blur_amount=clamp((radius*2.0-1.0+0.15*edge_blur)*1.5,0.0,1.0)*1.3;\n}\n\nfloat blur_amount=max(edge_blur_amount,coc);\n\nif (blur_amount == 0.0) {\ngl_FragColor=texture2D(textureSampler,distorted_coords);\n}\nelse {\n\ngl_FragColor=getBlurColor(blur_amount*1.7);\n\nif (highlights) {\ngl_FragColor.rgb+=clamp(coc,0.0,1.0)*texture2D(highlightsSampler,distorted_coords).rgb;\n}\nif (blur_noise) {\n\nvec2 noise=rand(distorted_coords)*0.01*blur_amount;\nvec2 blurred_coord=vec2(distorted_coords.x+noise.x,distorted_coords.y+noise.y);\ngl_FragColor=0.04*texture2D(textureSampler,blurred_coord)+0.96*gl_FragColor;\n}\n}\n\nif (grain_amount>0.0) {\nvec4 grain_color=texture2D(grainSampler,texels_coords*0.003);\ngl_FragColor.rgb+=(-0.5+grain_color.rgb)*0.30*grain_amount;\n}\n}\n",
    standardPixelShader: "uniform sampler2D textureSampler;\nvarying vec2 vUV;\n#if defined(PASS_POST_PROCESS)\nvoid main(void)\n{\nvec4 color=texture2D(textureSampler,vUV);\ngl_FragColor=color;\n}\n#endif\n#if defined(DOWN_SAMPLE_X4)\nuniform vec2 dsOffsets[16];\nvoid main(void)\n{\nvec4 average=vec4(0.0,0.0,0.0,0.0);\naverage=texture2D(textureSampler,vUV+dsOffsets[0]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[1]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[2]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[3]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[4]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[5]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[6]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[7]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[8]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[9]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[10]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[11]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[12]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[13]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[14]);\naverage+=texture2D(textureSampler,vUV+dsOffsets[15]);\naverage/=16.0;\ngl_FragColor=average;\n}\n#endif\n#if defined(BRIGHT_PASS)\nuniform vec2 dsOffsets[4];\nuniform float brightThreshold;\nvoid main(void)\n{\nvec4 average=vec4(0.0,0.0,0.0,0.0);\naverage=texture2D(textureSampler,vUV+vec2(dsOffsets[0].x,dsOffsets[0].y));\naverage+=texture2D(textureSampler,vUV+vec2(dsOffsets[1].x,dsOffsets[1].y));\naverage+=texture2D(textureSampler,vUV+vec2(dsOffsets[2].x,dsOffsets[2].y));\naverage+=texture2D(textureSampler,vUV+vec2(dsOffsets[3].x,dsOffsets[3].y));\naverage*=0.25;\nfloat luminance=length(average.rgb);\nif (luminance<brightThreshold) {\naverage=vec4(0.0,0.0,0.0,1.0);\n}\ngl_FragColor=average;\n}\n#endif\n#if defined(TEXTURE_ADDER)\nuniform sampler2D otherSampler;\nuniform sampler2D lensSampler;\nuniform float exposure;\nvoid main(void)\n{\nvec3 colour=texture2D(textureSampler,vUV).rgb;\ncolour*=exposure;\nvec3 X=max(vec3(0.0,0.0,0.0),colour-0.004);\nvec3 retColor=(X*(6.2*X+0.5))/(X*(6.2*X+1.7)+0.06);\ncolour=retColor*retColor;\ncolour+=colour*texture2D(lensSampler,vUV).rgb;\nvec4 finalColor=vec4(colour.rgb,1.0)+texture2D(otherSampler,vUV);\ngl_FragColor=finalColor;\n}\n#endif\n#if defined(VLS)\n#define PI 3.1415926535897932384626433832795\nuniform mat4 shadowViewProjection;\nuniform mat4 lightWorld;\nuniform vec3 cameraPosition;\nuniform vec3 sunDirection;\nuniform vec3 sunColor;\nuniform vec2 depthValues;\nuniform float scatteringCoefficient;\nuniform float scatteringPower;\nuniform sampler2D shadowMapSampler;\nuniform sampler2D positionSampler;\nfloat computeScattering(float lightDotView)\n{\nfloat result=1.0-scatteringCoefficient*scatteringCoefficient;\nresult/=(4.0*PI*pow(1.0+scatteringCoefficient*scatteringCoefficient-(2.0*scatteringCoefficient)*lightDotView,1.5));\nreturn result;\n}\nvoid main(void)\n{\n\nvec3 worldPos=texture2D(positionSampler,vUV).rgb;\nvec3 startPosition=cameraPosition;\nvec3 rayVector=worldPos-startPosition;\nfloat rayLength=length(rayVector);\nvec3 rayDirection=rayVector/rayLength;\nfloat stepLength=rayLength/NB_STEPS;\nvec3 stepL=rayDirection*stepLength;\nvec3 currentPosition=startPosition;\nvec3 accumFog=vec3(0.0);\nfor (int i=0; i<int(NB_STEPS); i++)\n{\nvec4 worldInShadowCameraSpace=shadowViewProjection*vec4(currentPosition,1.0);\nfloat depthMetric=(worldInShadowCameraSpace.z+depthValues.x)/(depthValues.y);\nfloat shadowPixelDepth=clamp(depthMetric,0.0,1.0);\nworldInShadowCameraSpace.xyz/=worldInShadowCameraSpace.w;\nworldInShadowCameraSpace.xyz=0.5*worldInShadowCameraSpace.xyz+vec3(0.5);\nfloat shadowMapValue=texture2D(shadowMapSampler,worldInShadowCameraSpace.xy).r;\nif (shadowMapValue>shadowPixelDepth)\naccumFog+=sunColor*computeScattering(dot(rayDirection,sunDirection));\ncurrentPosition+=stepL;\n}\naccumFog/=NB_STEPS;\nvec3 color=accumFog*scatteringPower;\ngl_FragColor=vec4(color*exp(color) ,1.0);\n}\n#endif\n#if defined(VLSMERGE)\nuniform sampler2D originalSampler;\nvoid main(void)\n{\ngl_FragColor=texture2D(originalSampler,vUV)+texture2D(textureSampler,vUV);\n}\n#endif\n#if defined(LUMINANCE)\nuniform vec2 lumOffsets[4];\nvoid main()\n{\nfloat average=0.0;\nvec4 color=vec4(0.0);\nfloat maximum=-1e20;\nvec3 weight=vec3(0.299,0.587,0.114);\nfor (int i=0; i<4; i++)\n{\ncolor=texture2D(textureSampler,vUV+ lumOffsets[i]);\n\nfloat GreyValue=dot(color.rgb,vec3(0.33,0.33,0.33));\n\n#ifdef WEIGHTED_AVERAGE\nfloat GreyValue=dot(color.rgb,weight);\n#endif\n#ifdef BRIGHTNESS\nfloat GreyValue=max(color.r,max(color.g,color.b));\n#endif\n#ifdef HSL_COMPONENT\nfloat GreyValue=0.5*(max(color.r,max(color.g,color.b))+min(color.r,min(color.g,color.b)));\n#endif\n#ifdef MAGNITUDE\nfloat GreyValue=length(color.rgb);\n#endif\nmaximum=max(maximum,GreyValue);\naverage+=(0.25*log(1e-5+GreyValue));\n}\naverage=exp(average);\ngl_FragColor=vec4(average,maximum,0.0,1.0);\n}\n#endif\n#if defined(LUMINANCE_DOWN_SAMPLE)\nuniform vec2 dsOffsets[9];\nuniform float halfDestPixelSize;\n#ifdef FINAL_DOWN_SAMPLER\nvec4 pack(float value) {\nconst vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);\nconst vec4 bit_mask=vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);\nvec4 res=fract(value*bit_shift);\nres-=res.xxyz*bit_mask;\nreturn res;\n}\n#endif\nvoid main()\n{\nvec4 color=vec4(0.0);\nfloat average=0.0;\nfor (int i=0; i<9; i++)\n{\ncolor=texture2D(textureSampler,vUV+vec2(halfDestPixelSize,halfDestPixelSize)+dsOffsets[i]);\naverage+=color.r;\n}\naverage/=9.0;\n#ifdef FINAL_DOWN_SAMPLER\ngl_FragColor=pack(average);\n#else\ngl_FragColor=vec4(average,average,0.0,1.0);\n#endif\n}\n#endif\n#if defined(HDR)\nuniform sampler2D textureAdderSampler;\nuniform float averageLuminance;\nvoid main()\n{\nvec4 color=texture2D(textureAdderSampler,vUV);\nvec4 adjustedColor=color/averageLuminance;\ncolor=adjustedColor;\ncolor.a=1.0;\ngl_FragColor=color;\n}\n#endif\n#if defined(LENS_FLARE)\n#define GHOSTS 3\nuniform sampler2D lensColorSampler;\nuniform float strength;\nuniform float ghostDispersal;\nuniform float haloWidth;\nuniform vec2 resolution;\nuniform float distortionStrength;\nfloat hash(vec2 p)\n{\nfloat h=dot(p,vec2(127.1,311.7));\nreturn -1.0+2.0*fract(sin(h)*43758.5453123);\n}\nfloat noise(in vec2 p)\n{\nvec2 i=floor(p);\nvec2 f=fract(p);\nvec2 u=f*f*(3.0-2.0*f);\nreturn mix(mix(hash(i+vec2(0.0,0.0)),\nhash(i+vec2(1.0,0.0)),u.x),\nmix(hash(i+vec2(0.0,1.0)),\nhash(i+vec2(1.0,1.0)),u.x),u.y);\n}\nfloat fbm(vec2 p)\n{\nfloat f=0.0;\nf+=0.5000*noise(p); p*=2.02;\nf+=0.2500*noise(p); p*=2.03;\nf+=0.1250*noise(p); p*=2.01;\nf+=0.0625*noise(p); p*=2.04;\nf/=0.9375;\nreturn f;\n}\nvec3 pattern(vec2 uv)\n{\nvec2 p=-1.0+2.0*uv;\nfloat p2=dot(p,p);\nfloat f=fbm(vec2(15.0*p2))/2.0;\nfloat r=0.2+0.6*sin(12.5*length(uv-vec2(0.5)));\nfloat g=0.2+0.6*sin(20.5*length(uv-vec2(0.5)));\nfloat b=0.2+0.6*sin(17.2*length(uv-vec2(0.5)));\nreturn (1.0-f)*vec3(r,g,b);\n}\nfloat luminance(vec3 color)\n{\nreturn dot(color.rgb,vec3(0.2126,0.7152,0.0722));\n}\nvec4 textureDistorted(sampler2D tex,vec2 texcoord,vec2 direction,vec3 distortion)\n{\nreturn vec4(\ntexture2D(tex,texcoord+direction*distortion.r).r,\ntexture2D(tex,texcoord+direction*distortion.g).g,\ntexture2D(tex,texcoord+direction*distortion.b).b,\n1.0\n);\n}\nvoid main(void)\n{\nvec2 uv=-vUV+vec2(1.0);\nvec2 ghostDir=(vec2(0.5)-uv)*ghostDispersal;\nvec2 texelSize=1.0/resolution;\nvec3 distortion=vec3(-texelSize.x*distortionStrength,0.0,texelSize.x*distortionStrength);\nvec4 result=vec4(0.0);\nfloat ghostIndice=1.0;\nfor (int i=0; i<GHOSTS; ++i)\n{\nvec2 offset=fract(uv+ghostDir*ghostIndice);\nfloat weight=length(vec2(0.5)-offset)/length(vec2(0.5));\nweight=pow(1.0-weight,10.0);\nresult+=textureDistorted(textureSampler,offset,normalize(ghostDir),distortion)*weight*strength;\nghostIndice+=1.0;\n}\nvec2 haloVec=normalize(ghostDir)*haloWidth;\nfloat weight=length(vec2(0.5)-fract(uv+haloVec))/length(vec2(0.5));\nweight=pow(1.0-weight,10.0);\nresult+=textureDistorted(textureSampler,fract(uv+haloVec),normalize(ghostDir),distortion)*weight*strength;\nresult*=texture2D(lensColorSampler,vec2(length(vec2(0.5)-uv)/length(vec2(0.5))));\ngl_FragColor=result;\n}\n#endif\n#if defined(LENS_FLARE_COMPOSE)\nuniform sampler2D otherSampler;\nuniform sampler2D lensDirtSampler;\nuniform sampler2D lensStarSampler;\nuniform mat4 lensStarMatrix;\nvoid main(void)\n{\nvec2 lensFlareCoords=(lensStarMatrix*vec4(vUV,1.0,1.0)).xy;\nvec4 lensMod=texture2D(lensDirtSampler,vUV);\nlensMod+=texture2D(lensStarSampler,vUV);\nvec4 result=texture2D(textureSampler,vUV)*lensMod;\ngl_FragColor=texture2D(otherSampler,vUV)+result;\n}\n#endif\n#if defined(DEPTH_OF_FIELD)\nuniform sampler2D otherSampler;\nuniform sampler2D depthSampler;\nuniform float distance;\nvoid main(void)\n{\nvec4 sharp=texture2D(otherSampler,vUV);\nvec4 blur=texture2D(textureSampler,vUV);\nfloat dist=clamp(texture2D(depthSampler,vUV).r*distance,0.0,1.0);\nfloat factor=0.0;\nif (dist<0.05)\nfactor=1.0;\nelse if (dist<0.1)\nfactor=20.0*(0.1-dist);\nelse if (dist<0.5)\nfactor=0.0;\nelse\nfactor=2.0*(dist-0.5);\nfactor=clamp(factor,0.0,0.90);\ngl_FragColor=mix(sharp,blur,factor);\n}\n#endif\n#if defined(MOTION_BLUR)\nuniform mat4 inverseViewProjection;\nuniform mat4 prevViewProjection;\nuniform vec2 screenSize;\nuniform float motionScale;\nuniform float motionStrength;\nuniform sampler2D depthSampler;\nvoid main(void)\n{\nvec2 texelSize=1.0/screenSize;\nfloat depth=texture2D(depthSampler,vUV).r;\nvec4 cpos=vec4(vUV*2.0-1.0,depth,1.0);\ncpos=cpos*inverseViewProjection;\nvec4 ppos=cpos*prevViewProjection;\nppos.xyz/=ppos.w;\nppos.xy=ppos.xy*0.5+0.5;\nvec2 velocity=(ppos.xy-vUV)*motionScale*motionStrength;\nfloat speed=length(velocity/texelSize);\nint nSamples=int(clamp(speed,1.0,MAX_MOTION_SAMPLES));\nvec4 result=texture2D(textureSampler,vUV);\nfor (int i=1; i<int(MAX_MOTION_SAMPLES); ++i) {\nif (i>=nSamples)\nbreak;\nvec2 offset1=vUV+velocity*(float(i)/float(nSamples-1)-0.5);\nresult+=texture2D(textureSampler,offset1);\n}\ngl_FragColor=result/float(nSamples);\n}\n#endif\n",
    fxaaVertexShader: "\nattribute vec2 position;\nuniform vec2 texelSize;\n\nvarying vec2 vUV;\nvarying vec2 sampleCoordS;\nvarying vec2 sampleCoordE;\nvarying vec2 sampleCoordN;\nvarying vec2 sampleCoordW;\nvarying vec2 sampleCoordNW;\nvarying vec2 sampleCoordSE;\nvarying vec2 sampleCoordNE;\nvarying vec2 sampleCoordSW;\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) { \nvUV=(position*madd+madd);\nsampleCoordS=vUV+vec2( 0.0,1.0)*texelSize;\nsampleCoordE=vUV+vec2( 1.0,0.0)*texelSize;\nsampleCoordN=vUV+vec2( 0.0,-1.0)*texelSize;\nsampleCoordW=vUV+vec2(-1.0,0.0)*texelSize;\nsampleCoordNW=vUV+vec2(-1.0,-1.0)*texelSize;\nsampleCoordSE=vUV+vec2( 1.0,1.0)*texelSize;\nsampleCoordNE=vUV+vec2( 1.0,-1.0)*texelSize;\nsampleCoordSW=vUV+vec2(-1.0,1.0)*texelSize;\ngl_Position=vec4(position,0.0,1.0);\n}",
    fxaaPixelShader: "uniform sampler2D textureSampler;\nuniform vec2 texelSize;\nvarying vec2 vUV;\nvarying vec2 sampleCoordS;\nvarying vec2 sampleCoordE;\nvarying vec2 sampleCoordN;\nvarying vec2 sampleCoordW;\nvarying vec2 sampleCoordNW;\nvarying vec2 sampleCoordSE;\nvarying vec2 sampleCoordNE;\nvarying vec2 sampleCoordSW;\nconst float fxaaQualitySubpix=1.0;\nconst float fxaaQualityEdgeThreshold=0.166;\nconst float fxaaQualityEdgeThresholdMin=0.0833;\nconst vec3 kLumaCoefficients=vec3(0.2126,0.7152,0.0722);\n#define FxaaLuma(rgba) dot(rgba.rgb,kLumaCoefficients)\nvoid main(){\nvec2 posM;\nposM.x=vUV.x;\nposM.y=vUV.y;\nvec4 rgbyM=texture2D(textureSampler,vUV,0.0);\nfloat lumaM=FxaaLuma(rgbyM);\nfloat lumaS=FxaaLuma(texture2D(textureSampler,sampleCoordS,0.0));\nfloat lumaE=FxaaLuma(texture2D(textureSampler,sampleCoordE,0.0));\nfloat lumaN=FxaaLuma(texture2D(textureSampler,sampleCoordN,0.0));\nfloat lumaW=FxaaLuma(texture2D(textureSampler,sampleCoordW,0.0));\nfloat maxSM=max(lumaS,lumaM);\nfloat minSM=min(lumaS,lumaM);\nfloat maxESM=max(lumaE,maxSM);\nfloat minESM=min(lumaE,minSM);\nfloat maxWN=max(lumaN,lumaW);\nfloat minWN=min(lumaN,lumaW);\nfloat rangeMax=max(maxWN,maxESM);\nfloat rangeMin=min(minWN,minESM);\nfloat rangeMaxScaled=rangeMax*fxaaQualityEdgeThreshold;\nfloat range=rangeMax-rangeMin;\nfloat rangeMaxClamped=max(fxaaQualityEdgeThresholdMin,rangeMaxScaled);\nif(range<rangeMaxClamped) \n{\ngl_FragColor=rgbyM;\nreturn;\n}\nfloat lumaNW=FxaaLuma(texture2D(textureSampler,sampleCoordNW,0.0));\nfloat lumaSE=FxaaLuma(texture2D(textureSampler,sampleCoordSE,0.0));\nfloat lumaNE=FxaaLuma(texture2D(textureSampler,sampleCoordNE,0.0));\nfloat lumaSW=FxaaLuma(texture2D(textureSampler,sampleCoordSW,0.0));\nfloat lumaNS=lumaN+lumaS;\nfloat lumaWE=lumaW+lumaE;\nfloat subpixRcpRange=1.0/range;\nfloat subpixNSWE=lumaNS+lumaWE;\nfloat edgeHorz1=(-2.0*lumaM)+lumaNS;\nfloat edgeVert1=(-2.0*lumaM)+lumaWE;\nfloat lumaNESE=lumaNE+lumaSE;\nfloat lumaNWNE=lumaNW+lumaNE;\nfloat edgeHorz2=(-2.0*lumaE)+lumaNESE;\nfloat edgeVert2=(-2.0*lumaN)+lumaNWNE;\nfloat lumaNWSW=lumaNW+lumaSW;\nfloat lumaSWSE=lumaSW+lumaSE;\nfloat edgeHorz4=(abs(edgeHorz1)*2.0)+abs(edgeHorz2);\nfloat edgeVert4=(abs(edgeVert1)*2.0)+abs(edgeVert2);\nfloat edgeHorz3=(-2.0*lumaW)+lumaNWSW;\nfloat edgeVert3=(-2.0*lumaS)+lumaSWSE;\nfloat edgeHorz=abs(edgeHorz3)+edgeHorz4;\nfloat edgeVert=abs(edgeVert3)+edgeVert4;\nfloat subpixNWSWNESE=lumaNWSW+lumaNESE;\nfloat lengthSign=texelSize.x;\nbool horzSpan=edgeHorz>=edgeVert;\nfloat subpixA=subpixNSWE*2.0+subpixNWSWNESE;\nif (!horzSpan)\n{\nlumaN=lumaW;\n}\nif (!horzSpan) \n{\nlumaS=lumaE;\n}\nif (horzSpan) \n{\nlengthSign=texelSize.y;\n}\nfloat subpixB=(subpixA*(1.0/12.0))-lumaM;\nfloat gradientN=lumaN-lumaM;\nfloat gradientS=lumaS-lumaM;\nfloat lumaNN=lumaN+lumaM;\nfloat lumaSS=lumaS+lumaM;\nbool pairN=abs(gradientN)>=abs(gradientS);\nfloat gradient=max(abs(gradientN),abs(gradientS));\nif (pairN)\n{\nlengthSign=-lengthSign;\n}\nfloat subpixC=clamp(abs(subpixB)*subpixRcpRange,0.0,1.0);\nvec2 posB;\nposB.x=posM.x;\nposB.y=posM.y;\nvec2 offNP;\noffNP.x=(!horzSpan) ? 0.0 : texelSize.x;\noffNP.y=(horzSpan) ? 0.0 : texelSize.y;\nif (!horzSpan) \n{\nposB.x+=lengthSign*0.5;\n}\nif (horzSpan)\n{\nposB.y+=lengthSign*0.5;\n}\nvec2 posN;\nposN.x=posB.x-offNP.x*1.5;\nposN.y=posB.y-offNP.y*1.5;\nvec2 posP;\nposP.x=posB.x+offNP.x*1.5;\nposP.y=posB.y+offNP.y*1.5;\nfloat subpixD=((-2.0)*subpixC)+3.0;\nfloat lumaEndN=FxaaLuma(texture2D(textureSampler,posN,0.0));\nfloat subpixE=subpixC*subpixC;\nfloat lumaEndP=FxaaLuma(texture2D(textureSampler,posP,0.0));\nif (!pairN) \n{\nlumaNN=lumaSS;\n}\nfloat gradientScaled=gradient*1.0/4.0;\nfloat lumaMM=lumaM-lumaNN*0.5;\nfloat subpixF=subpixD*subpixE;\nbool lumaMLTZero=lumaMM<0.0;\nlumaEndN-=lumaNN*0.5;\nlumaEndP-=lumaNN*0.5;\nbool doneN=abs(lumaEndN)>=gradientScaled;\nbool doneP=abs(lumaEndP)>=gradientScaled;\nif (!doneN) \n{\nposN.x-=offNP.x*3.0;\n}\nif (!doneN) \n{\nposN.y-=offNP.y*3.0;\n}\nbool doneNP=(!doneN) || (!doneP);\nif (!doneP) \n{\nposP.x+=offNP.x*3.0;\n}\nif (!doneP)\n{\nposP.y+=offNP.y*3.0;\n}\nif (doneNP)\n{\nif (!doneN) lumaEndN=FxaaLuma(texture2D(textureSampler,posN.xy,0.0));\nif (!doneP) lumaEndP=FxaaLuma(texture2D(textureSampler,posP.xy,0.0));\nif (!doneN) lumaEndN=lumaEndN-lumaNN*0.5;\nif (!doneP) lumaEndP=lumaEndP-lumaNN*0.5;\ndoneN=abs(lumaEndN)>=gradientScaled;\ndoneP=abs(lumaEndP)>=gradientScaled;\nif (!doneN) posN.x-=offNP.x*12.0;\nif (!doneN) posN.y-=offNP.y*12.0;\ndoneNP=(!doneN) || (!doneP);\nif (!doneP) posP.x+=offNP.x*12.0;\nif (!doneP) posP.y+=offNP.y*12.0;\n}\nfloat dstN=posM.x-posN.x;\nfloat dstP=posP.x-posM.x;\nif (!horzSpan)\n{\ndstN=posM.y-posN.y;\n}\nif (!horzSpan) \n{\ndstP=posP.y-posM.y;\n}\nbool goodSpanN=(lumaEndN<0.0) != lumaMLTZero;\nfloat spanLength=(dstP+dstN);\nbool goodSpanP=(lumaEndP<0.0) != lumaMLTZero;\nfloat spanLengthRcp=1.0/spanLength;\nbool directionN=dstN<dstP;\nfloat dst=min(dstN,dstP);\nbool goodSpan=directionN ? goodSpanN : goodSpanP;\nfloat subpixG=subpixF*subpixF;\nfloat pixelOffset=(dst*(-spanLengthRcp))+0.5;\nfloat subpixH=subpixG*fxaaQualitySubpix;\nfloat pixelOffsetGood=goodSpan ? pixelOffset : 0.0;\nfloat pixelOffsetSubpix=max(pixelOffsetGood,subpixH);\nif (!horzSpan)\n{\nposM.x+=pixelOffsetSubpix*lengthSign;\n}\nif (horzSpan)\n{\nposM.y+=pixelOffsetSubpix*lengthSign;\n}\ngl_FragColor=texture2D(textureSampler,posM,0.0);\n}",
    circleOfConfusionPixelShader: "\nuniform sampler2D depthSampler;\n\nvarying vec2 vUV;\n\nuniform vec2 cameraMinMaxZ;\n\nuniform float focusDistance;\nuniform float cocPrecalculation;\nfloat sampleDistance(const in vec2 offset) {\nfloat depth=texture2D(depthSampler,offset).r; \nreturn (cameraMinMaxZ.x+(cameraMinMaxZ.y-cameraMinMaxZ.x)*depth)*1000.0; \n}\nvoid main(void)\n{\nfloat pixelDistance=sampleDistance(vUV);\nfloat coc=abs(cocPrecalculation* ((focusDistance-pixelDistance)/pixelDistance));\ncoc=clamp(coc,0.0,1.0);\ngl_FragColor=vec4(coc,texture2D(depthSampler,vUV).r,coc,1.0);\n}\n",
    depthOfFieldMergePixelShader: "\nuniform sampler2D textureSampler;\nuniform sampler2D originalSampler;\nuniform sampler2D circleOfConfusionSampler;\n#if BLUR_LEVEL>0\nuniform sampler2D blurStep1;\n#endif\n#if BLUR_LEVEL>1\nuniform sampler2D blurStep2;\n#endif\n\nvarying vec2 vUV;\nvoid main(void)\n{\nfloat coc=texture2D(circleOfConfusionSampler,vUV).r;\nvec4 original=texture2D(originalSampler,vUV);\n#if BLUR_LEVEL == 0\nvec4 blurred1=texture2D(textureSampler,vUV);\ngl_FragColor=mix(original,blurred1,coc);\n#endif\n#if BLUR_LEVEL == 1\nvec4 blurred1=texture2D(blurStep1,vUV);\nvec4 blurred2=texture2D(textureSampler,vUV); \nif(coc<0.5){\ngl_FragColor=mix(original,blurred1,coc/0.5);\n}else{\ngl_FragColor=mix(blurred1,blurred2,(coc-0.5)/0.5);\n}\n#endif\n#if BLUR_LEVEL == 2\nvec4 blurred1=texture2D(blurStep1,vUV);\nvec4 blurred2=texture2D(blurStep2,vUV);\nvec4 blurred3=texture2D(textureSampler,vUV);\nif(coc<0.33){\ngl_FragColor=mix(original,blurred1,coc/0.33);\n}else if(coc<0.66){\ngl_FragColor=mix(blurred1,blurred2,(coc-0.33)/0.33);\n}else{\ngl_FragColor=mix(blurred2,blurred3,(coc-0.66)/0.34);\n}\n#endif\n}\n",
    geometryVertexShader: "precision highp float;\nprecision highp int;\n#include<bonesDeclaration>\n#include<instancesDeclaration>\nattribute vec3 position;\nattribute vec3 normal;\n#if defined(ALPHATEST) || defined(NEED_UV)\nvarying vec2 vUV;\nuniform mat4 diffuseMatrix;\n#ifdef UV1\nvarying vec2 uv;\n#endif\n#ifdef UV2\nvarying vec2 uv2;\n#endif\n#endif\n\nuniform mat4 viewProjection;\nuniform mat4 view;\nvarying vec3 vNormalV;\nvarying vec4 vViewPos;\n#ifdef POSITION\nvarying vec3 vPosition;\n#endif\nvoid main(void)\n{\n#include<instancesVertex>\n#include<bonesVertex>\nvec4 pos=vec4(finalWorld*vec4(position,1.0));\nvNormalV=normalize(vec3((view*finalWorld)*vec4(normal,0.0)));\nvViewPos=view*pos;\n#ifdef POSITION\nvPosition=pos.xyz/pos.w;\n#endif\ngl_Position=viewProjection*finalWorld*vec4(position,1.0);\n#if defined(ALPHATEST) || defined(BASIC_RENDER)\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n}",
    geometryPixelShader: "#extension GL_EXT_draw_buffers : require\nprecision highp float;\nprecision highp int;\nvarying vec3 vNormalV;\nvarying vec4 vViewPos;\n#ifdef POSITION\nvarying vec3 vPosition;\n#endif\n#ifdef ALPHATEST\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n#endif\n#ifdef POSITION\n#include<mrtFragmentDeclaration>[3]\n#else\n#include<mrtFragmentDeclaration>[2]\n#endif\nvoid main() {\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUV).a<0.4)\ndiscard;\n#endif\ngl_FragData[0]=vec4(vViewPos.z/vViewPos.w,0.0,0.0,1.0);\n\ngl_FragData[1]=vec4(normalize(vNormalV),1.0);\n\n#ifdef POSITION\ngl_FragData[2]=vec4(vPosition,1.0);\n#endif\n}",
    refractionPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform sampler2D refractionSampler;\n\nuniform vec3 baseColor;\nuniform float depth;\nuniform float colorLevel;\nvoid main() {\nfloat ref=1.0-texture2D(refractionSampler,vUV).r;\nvec2 uv=vUV-vec2(0.5);\nvec2 offset=uv*depth*ref;\nvec3 sourceColor=texture2D(textureSampler,vUV-offset).rgb;\ngl_FragColor=vec4(sourceColor+sourceColor*ref*colorLevel,1.0);\n}",
    blackAndWhitePixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform float degree;\nvoid main(void) \n{\nvec3 color=texture2D(textureSampler,vUV).rgb;\nfloat luminance=dot(color,vec3(0.3,0.59,0.11)); \nvec3 blackAndWhite=vec3(luminance,luminance,luminance);\ngl_FragColor=vec4(color-((color-blackAndWhite)*degree),1.0);\n}",
    convolutionPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform vec2 screenSize;\nuniform float kernel[9];\nvoid main(void)\n{\nvec2 onePixel=vec2(1.0,1.0)/screenSize;\nvec4 colorSum =\ntexture2D(textureSampler,vUV+onePixel*vec2(-1,-1))*kernel[0] +\ntexture2D(textureSampler,vUV+onePixel*vec2(0,-1))*kernel[1] +\ntexture2D(textureSampler,vUV+onePixel*vec2(1,-1))*kernel[2] +\ntexture2D(textureSampler,vUV+onePixel*vec2(-1,0))*kernel[3] +\ntexture2D(textureSampler,vUV+onePixel*vec2(0,0))*kernel[4] +\ntexture2D(textureSampler,vUV+onePixel*vec2(1,0))*kernel[5] +\ntexture2D(textureSampler,vUV+onePixel*vec2(-1,1))*kernel[6] +\ntexture2D(textureSampler,vUV+onePixel*vec2(0,1))*kernel[7] +\ntexture2D(textureSampler,vUV+onePixel*vec2(1,1))*kernel[8];\nfloat kernelWeight =\nkernel[0] +\nkernel[1] +\nkernel[2] +\nkernel[3] +\nkernel[4] +\nkernel[5] +\nkernel[6] +\nkernel[7] +\nkernel[8];\nif (kernelWeight<=0.0) {\nkernelWeight=1.0;\n}\ngl_FragColor=vec4((colorSum/kernelWeight).rgb,1);\n}",
    filterPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform mat4 kernelMatrix;\nvoid main(void)\n{\nvec3 baseColor=texture2D(textureSampler,vUV).rgb;\nvec3 updatedColor=(kernelMatrix*vec4(baseColor,1.0)).rgb;\ngl_FragColor=vec4(updatedColor,1.0);\n}",
    volumetricLightScatteringPixelShader: "uniform sampler2D textureSampler;\nuniform sampler2D lightScatteringSampler;\nuniform float decay;\nuniform float exposure;\nuniform float weight;\nuniform float density;\nuniform vec2 meshPositionOnScreen;\nvarying vec2 vUV;\nvoid main(void) {\nvec2 tc=vUV;\nvec2 deltaTexCoord=(tc-meshPositionOnScreen.xy);\ndeltaTexCoord*=1.0/float(NUM_SAMPLES)*density;\nfloat illuminationDecay=1.0;\nvec4 color=texture2D(lightScatteringSampler,tc)*0.4;\nfor(int i=0; i<NUM_SAMPLES; i++) {\ntc-=deltaTexCoord;\nvec4 dataSample=texture2D(lightScatteringSampler,tc)*0.4;\ndataSample*=illuminationDecay*weight;\ncolor+=dataSample;\nilluminationDecay*=decay;\n}\nvec4 realColor=texture2D(textureSampler,vUV);\ngl_FragColor=((vec4((vec3(color.r,color.g,color.b)*exposure),1))+(realColor*(1.5-0.4)));\n}\n",
    volumetricLightScatteringPassPixelShader: "#if defined(ALPHATEST) || defined(NEED_UV)\nvarying vec2 vUV;\n#endif\n#if defined(ALPHATEST)\nuniform sampler2D diffuseSampler;\n#endif\nvoid main(void)\n{\n#if defined(ALPHATEST)\nvec4 diffuseColor=texture2D(diffuseSampler,vUV);\nif (diffuseColor.a<0.4)\ndiscard;\n#endif\ngl_FragColor=vec4(0.0,0.0,0.0,1.0);\n}\n",
    colorCorrectionPixelShader: "\nuniform sampler2D textureSampler; \nuniform sampler2D colorTable; \n\nvarying vec2 vUV;\n\nconst float SLICE_COUNT=16.0; \n\nvec4 sampleAs3DTexture(sampler2D textureSampler,vec3 uv,float width) {\nfloat sliceSize=1.0/width; \nfloat slicePixelSize=sliceSize/width; \nfloat sliceInnerSize=slicePixelSize*(width-1.0); \nfloat zSlice0=min(floor(uv.z*width),width-1.0);\nfloat zSlice1=min(zSlice0+1.0,width-1.0);\nfloat xOffset=slicePixelSize*0.5+uv.x*sliceInnerSize;\nfloat s0=xOffset+(zSlice0*sliceSize);\nfloat s1=xOffset+(zSlice1*sliceSize);\nvec4 slice0Color=texture2D(textureSampler,vec2(s0,uv.y));\nvec4 slice1Color=texture2D(textureSampler,vec2(s1,uv.y));\nfloat zOffset=mod(uv.z*width,1.0);\nvec4 result=mix(slice0Color,slice1Color,zOffset);\nreturn result;\n}\nvoid main(void)\n{\nvec4 screen_color=texture2D(textureSampler,vUV);\ngl_FragColor=sampleAs3DTexture(colorTable,screen_color.rgb,SLICE_COUNT);\n}",
    tonemapPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n\nuniform float _ExposureAdjustment;\n#if defined(HABLE_TONEMAPPING)\nconst float A=0.15;\nconst float B=0.50;\nconst float C=0.10;\nconst float D=0.20;\nconst float E=0.02;\nconst float F=0.30;\nconst float W=11.2;\n#endif\nfloat Luminance(vec3 c)\n{\nreturn dot(c,vec3(0.22,0.707,0.071));\n}\nvoid main(void) \n{\nvec3 colour=texture2D(textureSampler,vUV).rgb;\n#if defined(REINHARD_TONEMAPPING)\nfloat lum=Luminance(colour.rgb); \nfloat lumTm=lum*_ExposureAdjustment;\nfloat scale=lumTm/(1.0+lumTm); \ncolour*=scale/lum;\n#elif defined(HABLE_TONEMAPPING)\ncolour*=_ExposureAdjustment;\nconst float ExposureBias=2.0;\nvec3 x=ExposureBias*colour;\nvec3 curr=((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;\nx=vec3(W,W,W);\nvec3 whiteScale=1.0/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F);\ncolour=curr*whiteScale;\n#elif defined(OPTIMIZED_HEJIDAWSON_TONEMAPPING)\ncolour*=_ExposureAdjustment;\nvec3 X=max(vec3(0.0,0.0,0.0),colour-0.004);\nvec3 retColor=(X*(6.2*X+0.5))/(X*(6.2*X+1.7)+0.06);\ncolour=retColor*retColor;\n#elif defined(PHOTOGRAPHIC_TONEMAPPING)\ncolour=vec3(1.0,1.0,1.0)-exp2(-_ExposureAdjustment*colour);\n#endif\ngl_FragColor=vec4(colour.rgb,1.0);\n}",
    displayPassPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform sampler2D passSampler;\nvoid main(void)\n{\ngl_FragColor=texture2D(passSampler,vUV);\n}",
    highlightsPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nconst vec3 RGBLuminanceCoefficients=vec3(0.2126,0.7152,0.0722);\nvoid main(void) \n{\nvec4 tex=texture2D(textureSampler,vUV);\nvec3 c=tex.rgb;\nfloat luma=dot(c.rgb,RGBLuminanceCoefficients);\n\n\ngl_FragColor=vec4(pow(c,vec3(25.0-luma*15.0)),tex.a); \n}",
    imageProcessingPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n#include<imageProcessingDeclaration>\n#include<helperFunctions>\n#include<imageProcessingFunctions>\nvoid main(void)\n{\nvec4 result=texture2D(textureSampler,vUV);\n#ifdef IMAGEPROCESSING\n#ifndef FROMLINEARSPACE\n\nresult.rgb=toLinearSpace(result.rgb);\n#endif\nresult=applyImageProcessing(result);\n#else\n\n#ifdef FROMLINEARSPACE\nresult=applyImageProcessing(result);\n#endif\n#endif\ngl_FragColor=result;\n}",
    kernelBlurVertexShader: "\nattribute vec2 position;\n\nuniform vec2 delta;\n\nvarying vec2 sampleCenter;\n#include<kernelBlurVaryingDeclaration>[0..varyingCount]\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) { \nsampleCenter=(position*madd+madd);\n#include<kernelBlurVertex>[0..varyingCount]\ngl_Position=vec4(position,0.0,1.0);\n}",
    kernelBlurPixelShader: "\nuniform sampler2D textureSampler;\nuniform vec2 delta;\n\nvarying vec2 sampleCenter;\n#ifdef DOF\nuniform sampler2D circleOfConfusionSampler;\nuniform vec2 cameraMinMaxZ;\nfloat sampleDistance(const in vec2 offset) {\nfloat depth=texture2D(circleOfConfusionSampler,offset).g; \nreturn cameraMinMaxZ.x+(cameraMinMaxZ.y-cameraMinMaxZ.x)*depth; \n}\n#endif\n#include<kernelBlurVaryingDeclaration>[0..varyingCount]\n#ifdef PACKEDFLOAT\nvec4 pack(float depth)\n{\nconst vec4 bit_shift=vec4(255.0*255.0*255.0,255.0*255.0,255.0,1.0);\nconst vec4 bit_mask=vec4(0.0,1.0/255.0,1.0/255.0,1.0/255.0);\nvec4 res=fract(depth*bit_shift);\nres-=res.xxyz*bit_mask;\nreturn res;\n}\nfloat unpack(vec4 color)\n{\nconst vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);\nreturn dot(color,bit_shift);\n}\n#endif\nvoid main(void)\n{\n#ifdef DOF\nfloat sumOfWeights=0.0; \nfloat sampleDepth=0.0;\nfloat factor=0.0;\nfloat centerSampleDepth=sampleDistance(sampleCenter);\n#endif\nfloat computedWeight=0.0;\n#ifdef PACKEDFLOAT \nfloat blend=0.;\n#else\nvec4 blend=vec4(0.);\n#endif\n#include<kernelBlurFragment>[0..varyingCount]\n#include<kernelBlurFragment2>[0..depCount]\n#ifdef PACKEDFLOAT\ngl_FragColor=pack(blend);\n#else\ngl_FragColor=blend;\n#endif\n#ifdef DOF\n\nif(sumOfWeights == 0.0){\ngl_FragColor=vec4(0.0,0.0,0.0,1.0);\n}\ngl_FragColor/=sumOfWeights;\n#endif\n}",
    lensFlareVertexShader: "\nattribute vec2 position;\n\nuniform mat4 viewportMatrix;\n\nvarying vec2 vUV;\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) { \nvUV=position*madd+madd;\ngl_Position=viewportMatrix*vec4(position,0.0,1.0);\n}",
    lensFlarePixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n\nuniform vec4 color;\nvoid main(void) {\nvec4 baseColor=texture2D(textureSampler,vUV);\ngl_FragColor=baseColor*color;\n}",
    anaglyphPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform sampler2D leftSampler;\nvoid main(void)\n{\nvec4 leftFrag=texture2D(leftSampler,vUV);\nleftFrag=vec4(1.0,leftFrag.g,leftFrag.b,1.0);\nvec4 rightFrag=texture2D(textureSampler,vUV);\nrightFrag=vec4(rightFrag.r,1.0,1.0,1.0);\ngl_FragColor=vec4(rightFrag.rgb*leftFrag.rgb,1.0);\n}",
    stereoscopicInterlacePixelShader: "const vec3 TWO=vec3(2.0,2.0,2.0);\nvarying vec2 vUV;\nuniform sampler2D camASampler;\nuniform sampler2D textureSampler;\nuniform vec2 stepSize;\nvoid main(void)\n{\nbool useCamB;\nvec2 texCoord1;\nvec2 texCoord2;\nvec3 frag1;\nvec3 frag2;\n#ifdef IS_STEREOSCOPIC_HORIZ\nuseCamB=vUV.x>0.5;\ntexCoord1=vec2(useCamB ? (vUV.x-0.5)*2.0 : vUV.x*2.0,vUV.y);\ntexCoord2=vec2(texCoord1.x+stepSize.x,vUV.y);\n#else\nuseCamB=vUV.y>0.5;\ntexCoord1=vec2(vUV.x,useCamB ? (vUV.y-0.5)*2.0 : vUV.y*2.0);\ntexCoord2=vec2(vUV.x,texCoord1.y+stepSize.y);\n#endif\n\nif (useCamB){\nfrag1=texture2D(textureSampler,texCoord1).rgb;\nfrag2=texture2D(textureSampler,texCoord2).rgb;\n}else{\nfrag1=texture2D(camASampler ,texCoord1).rgb;\nfrag2=texture2D(camASampler ,texCoord2).rgb;\n}\ngl_FragColor=vec4((frag1+frag2)/TWO,1.0);\n}",
    vrDistortionCorrectionPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform vec2 LensCenter;\nuniform vec2 Scale;\nuniform vec2 ScaleIn;\nuniform vec4 HmdWarpParam;\nvec2 HmdWarp(vec2 in01) {\nvec2 theta=(in01-LensCenter)*ScaleIn; \nfloat rSq=theta.x*theta.x+theta.y*theta.y;\nvec2 rvector=theta*(HmdWarpParam.x+HmdWarpParam.y*rSq+HmdWarpParam.z*rSq*rSq+HmdWarpParam.w*rSq*rSq*rSq);\nreturn LensCenter+Scale*rvector;\n}\nvoid main(void)\n{\nvec2 tc=HmdWarp(vUV);\nif (tc.x <0.0 || tc.x>1.0 || tc.y<0.0 || tc.y>1.0)\ngl_FragColor=vec4(0.0,0.0,0.0,0.0);\nelse{\ngl_FragColor=texture2D(textureSampler,tc);\n}\n}",
    glowBlurPostProcessPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n\nuniform vec2 screenSize;\nuniform vec2 direction;\nuniform float blurWidth;\n\nfloat getLuminance(vec3 color)\n{\nreturn dot(color,vec3(0.2126,0.7152,0.0722));\n}\nvoid main(void)\n{\nfloat weights[7];\nweights[0]=0.05;\nweights[1]=0.1;\nweights[2]=0.2;\nweights[3]=0.3;\nweights[4]=0.2;\nweights[5]=0.1;\nweights[6]=0.05;\nvec2 texelSize=vec2(1.0/screenSize.x,1.0/screenSize.y);\nvec2 texelStep=texelSize*direction*blurWidth;\nvec2 start=vUV-3.0*texelStep;\nvec4 baseColor=vec4(0.,0.,0.,0.);\nvec2 texelOffset=vec2(0.,0.);\nfor (int i=0; i<7; i++)\n{\n\nvec4 texel=texture2D(textureSampler,start+texelOffset);\nbaseColor.a+=texel.a*weights[i];\n\nfloat luminance=getLuminance(baseColor.rgb);\nfloat luminanceTexel=getLuminance(texel.rgb);\nfloat choice=step(luminanceTexel,luminance);\nbaseColor.rgb=choice*baseColor.rgb+(1.0-choice)*texel.rgb;\ntexelOffset+=texelStep;\n}\ngl_FragColor=baseColor;\n}",
    glowMapGenerationPixelShader: "#ifdef ALPHATEST\nvarying vec2 vUVDiffuse;\nuniform sampler2D diffuseSampler;\n#endif\n#ifdef EMISSIVE\nvarying vec2 vUVEmissive;\nuniform sampler2D emissiveSampler;\n#endif\nuniform vec4 color;\nvoid main(void)\n{\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUVDiffuse).a<0.4)\ndiscard;\n#endif\n#ifdef EMISSIVE\ngl_FragColor=texture2D(emissiveSampler,vUVEmissive)*color;\n#else\ngl_FragColor=color;\n#endif\n}",
    glowMapGenerationVertexShader: "\nattribute vec3 position;\n#include<bonesDeclaration>\n\n#include<instancesDeclaration>\nuniform mat4 viewProjection;\nvarying vec4 vPosition;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#ifdef ALPHATEST\nvarying vec2 vUVDiffuse;\nuniform mat4 diffuseMatrix;\n#endif\n#ifdef EMISSIVE\nvarying vec2 vUVEmissive;\nuniform mat4 emissiveMatrix;\n#endif\nvoid main(void)\n{\n#include<instancesVertex>\n#include<bonesVertex>\n#ifdef CUBEMAP\nvPosition=finalWorld*vec4(position,1.0);\ngl_Position=viewProjection*finalWorld*vec4(position,1.0);\n#else\nvPosition=viewProjection*finalWorld*vec4(position,1.0);\ngl_Position=vPosition;\n#endif\n#ifdef ALPHATEST\n#ifdef DIFFUSEUV1\nvUVDiffuse=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n#endif\n#ifdef DIFFUSEUV2\nvUVDiffuse=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n#ifdef EMISSIVE\n#ifdef EMISSIVEUV1\nvUVEmissive=vec2(emissiveMatrix*vec4(uv,1.0,0.0));\n#endif\n#ifdef EMISSIVEUV2\nvUVEmissive=vec2(emissiveMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n}",
    glowMapMergePixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n#ifdef EMISSIVE\nuniform sampler2D textureSampler2;\n#endif\n\nuniform float offset;\nvoid main(void) {\nvec4 baseColor=texture2D(textureSampler,vUV);\n#ifdef EMISSIVE\nbaseColor+=texture2D(textureSampler2,vUV);\nbaseColor*=offset;\n#else\nbaseColor.a=abs(offset-baseColor.a);\n#ifdef STROKE\nfloat alpha=smoothstep(.0,.1,baseColor.a);\nbaseColor.a=alpha;\nbaseColor.rgb=baseColor.rgb*alpha;\n#endif\n#endif\ngl_FragColor=baseColor;\n}",
    glowMapMergeVertexShader: "\nattribute vec2 position;\n\nvarying vec2 vUV;\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) {\nvUV=position*madd+madd;\ngl_Position=vec4(position,0.0,1.0);\n}",
    lineVertexShader: "\nattribute vec3 position;\nattribute vec4 normal;\n\nuniform mat4 worldViewProjection;\nuniform float width;\nuniform float aspectRatio;\nvoid main(void) {\nvec4 viewPosition=worldViewProjection*vec4(position,1.0);\nvec4 viewPositionNext=worldViewProjection*vec4(normal.xyz,1.0);\nvec2 currentScreen=viewPosition.xy/viewPosition.w;\nvec2 nextScreen=viewPositionNext.xy/viewPositionNext.w;\ncurrentScreen.x*=aspectRatio;\nnextScreen.x*=aspectRatio;\nvec2 dir=normalize(nextScreen-currentScreen);\nvec2 normalDir=vec2(-dir.y,dir.x);\nnormalDir*=width/2.0;\nnormalDir.x/=aspectRatio;\nvec4 offset=vec4(normalDir*normal.w,0.0,0.0);\ngl_Position=viewPosition+offset;\n}",
    linePixelShader: "uniform vec4 color;\nvoid main(void) {\ngl_FragColor=color;\n}",
    outlineVertexShader: "\nattribute vec3 position;\nattribute vec3 normal;\n#include<bonesDeclaration>\n\nuniform float offset;\n#include<instancesDeclaration>\nuniform mat4 viewProjection;\n#ifdef ALPHATEST\nvarying vec2 vUV;\nuniform mat4 diffuseMatrix;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#endif\n#include<logDepthDeclaration>\nvoid main(void)\n{\nvec3 offsetPosition=position+normal*offset;\n#include<instancesVertex>\n#include<bonesVertex>\ngl_Position=viewProjection*finalWorld*vec4(offsetPosition,1.0);\n#ifdef ALPHATEST\n#ifdef UV1\nvUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n#endif\n#ifdef UV2\nvUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n#endif\n#endif\n#include<logDepthVertex>\n}\n",
    outlinePixelShader: "#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\nuniform vec4 color;\n#ifdef ALPHATEST\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n#endif\n#include<logDepthDeclaration>\nvoid main(void) {\n#ifdef ALPHATEST\nif (texture2D(diffuseSampler,vUV).a<0.4)\ndiscard;\n#endif\n#include<logDepthFragment>\ngl_FragColor=color;\n}",
    layerVertexShader: "\nattribute vec2 position;\n\nuniform vec2 scale;\nuniform vec2 offset;\nuniform mat4 textureMatrix;\n\nvarying vec2 vUV;\nconst vec2 madd=vec2(0.5,0.5);\nvoid main(void) { \nvec2 shiftedPosition=position*scale+offset;\nvUV=vec2(textureMatrix*vec4(shiftedPosition*madd+madd,1.0,0.0));\ngl_Position=vec4(shiftedPosition,0.0,1.0);\n}",
    layerPixelShader: "\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\n\nuniform vec4 color;\nvoid main(void) {\nvec4 baseColor=texture2D(textureSampler,vUV);\n#ifdef ALPHATEST\nif (baseColor.a<0.4)\ndiscard;\n#endif\ngl_FragColor=baseColor*color;\n}",
    backgroundVertexShader: "precision highp float;\n#include<__decl__backgroundVertex>\n#include<helperFunctions>\n\nattribute vec3 position;\n#ifdef NORMAL\nattribute vec3 normal;\n#endif\n#include<bonesDeclaration>\n\n#include<instancesDeclaration>\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n\nvarying vec3 vPositionW;\n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#ifdef MAINUV1\nvarying vec2 vMainUV1;\n#endif\n#ifdef MAINUV2\nvarying vec2 vMainUV2; \n#endif\n#if defined(DIFFUSE) && DIFFUSEDIRECTUV == 0\nvarying vec2 vDiffuseUV;\n#endif\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#ifdef REFLECTIONMAP_SKYBOX\nvarying vec3 vPositionUVW;\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvarying vec3 vDirectionW;\n#endif\nvoid main(void) {\n#ifdef REFLECTIONMAP_SKYBOX\nvPositionUVW=position;\n#endif \n#include<instancesVertex>\n#include<bonesVertex>\ngl_Position=viewProjection*finalWorld*vec4(position,1.0);\nvec4 worldPos=finalWorld*vec4(position,1.0);\nvPositionW=vec3(worldPos);\n#ifdef NORMAL\nmat3 normalWorld=mat3(finalWorld);\n#ifdef NONUNIFORMSCALING\nnormalWorld=transposeMat3(inverseMat3(normalWorld));\n#endif\nvNormalW=normalize(normalWorld*normal);\n#endif\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvDirectionW=normalize(vec3(finalWorld*vec4(position,0.0)));\n#ifdef EQUIRECTANGULAR_RELFECTION_FOV\nmat3 screenToWorld=inverseMat3(mat3(finalWorld*viewProjection));\nvec3 segment=mix(vDirectionW,screenToWorld*vec3(0.0,0.0,1.0),abs(fFovMultiplier-1.0));\nif (fFovMultiplier<=1.0) {\nvDirectionW=normalize(segment);\n} else {\nvDirectionW=normalize(vDirectionW+(vDirectionW-segment));\n}\n#endif\n#endif\n#ifndef UV1\nvec2 uv=vec2(0.,0.);\n#endif\n#ifndef UV2\nvec2 uv2=vec2(0.,0.);\n#endif\n#ifdef MAINUV1\nvMainUV1=uv;\n#endif \n#ifdef MAINUV2\nvMainUV2=uv2;\n#endif\n#if defined(DIFFUSE) && DIFFUSEDIRECTUV == 0 \nif (vDiffuseInfos.x == 0.)\n{\nvDiffuseUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));\n}\nelse\n{\nvDiffuseUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));\n}\n#endif\n\n#include<clipPlaneVertex>\n\n#include<fogVertex>\n\n#include<shadowsVertex>[0..maxSimultaneousLights]\n\n#ifdef VERTEXCOLOR\nvColor=color;\n#endif\n\n#ifdef POINTSIZE\ngl_PointSize=pointSize;\n#endif\n}\n",
    backgroundPixelShader: "#ifdef TEXTURELODSUPPORT\n#extension GL_EXT_shader_texture_lod : enable\n#endif\nprecision highp float;\n#include<__decl__backgroundFragment>\n#define RECIPROCAL_PI2 0.15915494\n\nuniform vec3 vEyePosition;\n\nvarying vec3 vPositionW;\n#ifdef MAINUV1\nvarying vec2 vMainUV1;\n#endif \n#ifdef MAINUV2 \nvarying vec2 vMainUV2; \n#endif \n#ifdef NORMAL\nvarying vec3 vNormalW;\n#endif\n#ifdef DIFFUSE\n#if DIFFUSEDIRECTUV == 1\n#define vDiffuseUV vMainUV1\n#elif DIFFUSEDIRECTUV == 2\n#define vDiffuseUV vMainUV2\n#else\nvarying vec2 vDiffuseUV;\n#endif\nuniform sampler2D diffuseSampler;\n#endif\n\n#ifdef REFLECTION\n#ifdef REFLECTIONMAP_3D\n#define sampleReflection(s,c) textureCube(s,c)\nuniform samplerCube reflectionSampler;\n#ifdef TEXTURELODSUPPORT\n#define sampleReflectionLod(s,c,l) textureCubeLodEXT(s,c,l)\n#else\nuniform samplerCube reflectionSamplerLow;\nuniform samplerCube reflectionSamplerHigh;\n#endif\n#else\n#define sampleReflection(s,c) texture2D(s,c)\nuniform sampler2D reflectionSampler;\n#ifdef TEXTURELODSUPPORT\n#define sampleReflectionLod(s,c,l) texture2DLodEXT(s,c,l)\n#else\nuniform samplerCube reflectionSamplerLow;\nuniform samplerCube reflectionSamplerHigh;\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#include<reflectionFunction>\n#endif\n\n#ifndef FROMLINEARSPACE\n#define FROMLINEARSPACE;\n#endif\n\n#ifndef SHADOWONLY\n#define SHADOWONLY;\n#endif\n#include<imageProcessingDeclaration>\n\n#include<__decl__lightFragment>[0..maxSimultaneousLights]\n#include<helperFunctions>\n#include<lightsFragmentFunctions>\n#include<shadowsFragmentFunctions>\n#include<imageProcessingFunctions>\n#include<clipPlaneFragmentDeclaration>\n\n#include<fogFragmentDeclaration>\n#ifdef REFLECTIONFRESNEL\n#define FRESNEL_MAXIMUM_ON_ROUGH 0.25\nvec3 fresnelSchlickEnvironmentGGX(float VdotN,vec3 reflectance0,vec3 reflectance90,float smoothness)\n{\n\nfloat weight=mix(FRESNEL_MAXIMUM_ON_ROUGH,1.0,smoothness);\nreturn reflectance0+weight*(reflectance90-reflectance0)*pow(clamp(1.0-VdotN,0.,1.),5.0);\n}\n#endif\nvoid main(void) {\n#include<clipPlaneFragment>\nvec3 viewDirectionW=normalize(vEyePosition-vPositionW);\n\n#ifdef NORMAL\nvec3 normalW=normalize(vNormalW);\n#else\nvec3 normalW=vec3(0.0,1.0,0.0);\n#endif\n\nfloat shadow=1.;\nfloat globalShadow=0.;\nfloat shadowLightCount=0.;\n#include<lightFragment>[0..maxSimultaneousLights]\n#ifdef SHADOWINUSE\nglobalShadow/=shadowLightCount;\n#else\nglobalShadow=1.0;\n#endif\n\nvec3 reflectionColor=vec3(1.,1.,1.);\n#ifdef REFLECTION\nvec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),normalW);\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflectionVector.z*=-1.0;\n#endif\n\n#ifdef REFLECTIONMAP_3D\nvec3 reflectionCoords=reflectionVector;\n#else\nvec2 reflectionCoords=reflectionVector.xy;\n#ifdef REFLECTIONMAP_PROJECTION\nreflectionCoords/=reflectionVector.z;\n#endif\nreflectionCoords.y=1.0-reflectionCoords.y;\n#endif\n#ifdef REFLECTIONBLUR\nfloat reflectionLOD=vReflectionInfos.y;\n#ifdef TEXTURELODSUPPORT\n\nreflectionLOD=reflectionLOD*log2(vReflectionMicrosurfaceInfos.x)*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z;\nreflectionColor=sampleReflectionLod(reflectionSampler,reflectionCoords,reflectionLOD).rgb;\n#else\nfloat lodReflectionNormalized=clamp(reflectionLOD,0.,1.);\nfloat lodReflectionNormalizedDoubled=lodReflectionNormalized*2.0;\nvec3 reflectionSpecularMid=sampleReflection(reflectionSampler,reflectionCoords).rgb;\nif(lodReflectionNormalizedDoubled<1.0){\nreflectionColor=mix(\nsampleReflection(reflectionSamplerHigh,reflectionCoords).rgb,\nreflectionSpecularMid,\nlodReflectionNormalizedDoubled\n);\n} else {\nreflectionColor=mix(\nreflectionSpecularMid,\nsampleReflection(reflectionSamplerLow,reflectionCoords).rgb,\nlodReflectionNormalizedDoubled-1.0\n);\n}\n#endif\n#else\nvec4 reflectionSample=sampleReflection(reflectionSampler,reflectionCoords);\nreflectionColor=reflectionSample.rgb;\n#endif\n#ifdef GAMMAREFLECTION\nreflectionColor=toLinearSpace(reflectionColor.rgb);\n#endif\n#ifdef REFLECTIONBGR\nreflectionColor=reflectionColor.bgr;\n#endif\n\nreflectionColor*=vReflectionInfos.x;\n#endif\n\nvec3 diffuseColor=vec3(1.,1.,1.);\nfloat finalAlpha=alpha;\n#ifdef DIFFUSE\nvec4 diffuseMap=texture2D(diffuseSampler,vDiffuseUV);\n#ifdef GAMMADIFFUSE\ndiffuseMap.rgb=toLinearSpace(diffuseMap.rgb);\n#endif\n\ndiffuseMap.rgb*=vDiffuseInfos.y;\n#ifdef DIFFUSEHASALPHA\nfinalAlpha*=diffuseMap.a;\n#endif\ndiffuseColor=diffuseMap.rgb;\n#endif\n\n#ifdef REFLECTIONFRESNEL\nvec3 colorBase=diffuseColor;\n#else\nvec3 colorBase=reflectionColor*diffuseColor;\n#endif\ncolorBase=max(colorBase,0.0);\n\n#ifdef USERGBCOLOR\nvec3 finalColor=colorBase;\n#else\nvec3 finalColor=colorBase.r*vPrimaryColor.rgb*vPrimaryColor.a;\nfinalColor+=colorBase.g*vSecondaryColor.rgb*vSecondaryColor.a;\nfinalColor+=colorBase.b*vTertiaryColor.rgb*vTertiaryColor.a;\n#endif\n\n#ifdef REFLECTIONFRESNEL\nvec3 reflectionAmount=vReflectionControl.xxx;\nvec3 reflectionReflectance0=vReflectionControl.yyy;\nvec3 reflectionReflectance90=vReflectionControl.zzz;\nfloat VdotN=dot(normalize(vEyePosition),normalW);\nvec3 planarReflectionFresnel=fresnelSchlickEnvironmentGGX(clamp(VdotN,0.0,1.0),reflectionReflectance0,reflectionReflectance90,1.0);\nreflectionAmount*=planarReflectionFresnel;\n#ifdef REFLECTIONFALLOFF\nfloat reflectionDistanceFalloff=1.0-clamp(length(vPositionW.xyz-vBackgroundCenter)*vReflectionControl.w,0.0,1.0);\nreflectionDistanceFalloff*=reflectionDistanceFalloff;\nreflectionAmount*=reflectionDistanceFalloff;\n#endif\nfinalColor=mix(finalColor,reflectionColor,clamp(reflectionAmount,0.,1.));\n#endif\n#ifdef OPACITYFRESNEL\nfloat viewAngleToFloor=dot(normalW,normalize(vEyePosition-vBackgroundCenter));\n\nconst float startAngle=0.1;\nfloat fadeFactor=clamp(viewAngleToFloor/startAngle,0.0,1.0);\nfinalAlpha*=fadeFactor*fadeFactor;\n#endif\n\n#ifdef SHADOWINUSE\nfinalColor=mix(finalColor*shadowLevel,finalColor,globalShadow);\n#endif\n\nvec4 color=vec4(finalColor,finalAlpha);\n#include<fogFragment>\n#ifdef IMAGEPROCESSINGPOSTPROCESS\n\n\ncolor.rgb=clamp(color.rgb,0.,30.0);\n#else\n\ncolor=applyImageProcessing(color);\n#endif\n#ifdef PREMULTIPLYALPHA\n\ncolor.rgb*=color.a;\n#endif\n#ifdef NOISE\ncolor.rgb=dither(vPositionW.xy,color.rgb);\n#endif\ngl_FragColor=color;\n}\n"
}, BABYLON.Effect.IncludesShadersStore = {
    depthPrePass: "#ifdef DEPTHPREPASS\ngl_FragColor=vec4(0.,0.,0.,1.0);\nreturn;\n#endif",
    bonesDeclaration: "#if NUM_BONE_INFLUENCERS>0\nuniform mat4 mBones[BonesPerMesh];\nattribute vec4 matricesIndices;\nattribute vec4 matricesWeights;\n#if NUM_BONE_INFLUENCERS>4\nattribute vec4 matricesIndicesExtra;\nattribute vec4 matricesWeightsExtra;\n#endif\n#endif",
    instancesDeclaration: "#ifdef INSTANCES\nattribute vec4 world0;\nattribute vec4 world1;\nattribute vec4 world2;\nattribute vec4 world3;\n#else\nuniform mat4 world;\n#endif",
    pointCloudVertexDeclaration: "#ifdef POINTSIZE\nuniform float pointSize;\n#endif",
    bumpVertexDeclaration: "#if defined(BUMP) || defined(PARALLAX)\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#endif\n",
    clipPlaneVertexDeclaration: "#ifdef CLIPPLANE\nuniform vec4 vClipPlane;\nvarying float fClipDistance;\n#endif",
    fogVertexDeclaration: "#ifdef FOG\nvarying vec3 vFogDistance;\n#endif",
    morphTargetsVertexGlobalDeclaration: "#ifdef MORPHTARGETS\nuniform float morphTargetInfluences[NUM_MORPH_INFLUENCERS];\n#endif",
    morphTargetsVertexDeclaration: "#ifdef MORPHTARGETS\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#endif",
    logDepthDeclaration: "#ifdef LOGARITHMICDEPTH\nuniform float logarithmicDepthConstant;\nvarying float vFragmentDepth;\n#endif",
    morphTargetsVertex: "#ifdef MORPHTARGETS\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#endif",
    instancesVertex: "#ifdef INSTANCES\nmat4 finalWorld=mat4(world0,world1,world2,world3);\n#else\nmat4 finalWorld=world;\n#endif",
    bonesVertex: "#if NUM_BONE_INFLUENCERS>0\nmat4 influence;\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 \nfinalWorld=finalWorld*influence;\n#endif",
    bumpVertex: "#if defined(BUMP) || defined(PARALLAX)\n#if defined(TANGENT) && defined(NORMAL)\nvec3 tbnNormal=normalize(normalUpdated);\nvec3 tbnTangent=normalize(tangentUpdated.xyz);\nvec3 tbnBitangent=cross(tbnNormal,tbnTangent)*tangentUpdated.w;\nvTBN=mat3(finalWorld)*mat3(tbnTangent,tbnBitangent,tbnNormal);\n#endif\n#endif",
    clipPlaneVertex: "#ifdef CLIPPLANE\nfClipDistance=dot(worldPos,vClipPlane);\n#endif",
    fogVertex: "#ifdef FOG\nvFogDistance=(view*worldPos).xyz;\n#endif",
    shadowsVertex: "#ifdef SHADOWS\n#if defined(SHADOW{X}) && !defined(SHADOWCUBE{X})\nvPositionFromLight{X}=lightMatrix{X}*worldPos;\nvDepthMetric{X}=((vPositionFromLight{X}.z+light{X}.depthValues.x)/(light{X}.depthValues.y));\n#endif\n#endif",
    pointCloudVertex: "#ifdef POINTSIZE\ngl_PointSize=pointSize;\n#endif",
    logDepthVertex: "#ifdef LOGARITHMICDEPTH\nvFragmentDepth=1.0+gl_Position.w;\ngl_Position.z=log2(max(0.000001,vFragmentDepth))*logarithmicDepthConstant;\n#endif",
    helperFunctions: "const float PI=3.1415926535897932384626433832795;\nconst float LinearEncodePowerApprox=2.2;\nconst float GammaEncodePowerApprox=1.0/LinearEncodePowerApprox;\nconst vec3 LuminanceEncodeApprox=vec3(0.2126,0.7152,0.0722);\nmat3 transposeMat3(mat3 inMatrix) {\nvec3 i0=inMatrix[0];\nvec3 i1=inMatrix[1];\nvec3 i2=inMatrix[2];\nmat3 outMatrix=mat3(\nvec3(i0.x,i1.x,i2.x),\nvec3(i0.y,i1.y,i2.y),\nvec3(i0.z,i1.z,i2.z)\n);\nreturn outMatrix;\n}\n\nmat3 inverseMat3(mat3 inMatrix) {\nfloat a00=inMatrix[0][0],a01=inMatrix[0][1],a02=inMatrix[0][2];\nfloat a10=inMatrix[1][0],a11=inMatrix[1][1],a12=inMatrix[1][2];\nfloat a20=inMatrix[2][0],a21=inMatrix[2][1],a22=inMatrix[2][2];\nfloat b01=a22*a11-a12*a21;\nfloat b11=-a22*a10+a12*a20;\nfloat b21=a21*a10-a11*a20;\nfloat det=a00*b01+a01*b11+a02*b21;\nreturn 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}\nfloat computeFallOff(float value,vec2 clipSpace,float frustumEdgeFalloff)\n{\nfloat mask=smoothstep(1.0-frustumEdgeFalloff,1.0,clamp(dot(clipSpace,clipSpace),0.,1.));\nreturn mix(value,1.0,mask);\n}\nvec3 applyEaseInOut(vec3 x){\nreturn x*x*(3.0-2.0*x);\n}\nvec3 toLinearSpace(vec3 color)\n{\nreturn pow(color,vec3(LinearEncodePowerApprox));\n}\nvec3 toGammaSpace(vec3 color)\n{\nreturn pow(color,vec3(GammaEncodePowerApprox));\n}\nfloat square(float value)\n{\nreturn value*value;\n}\nfloat getLuminance(vec3 color)\n{\nreturn clamp(dot(color,LuminanceEncodeApprox),0.,1.);\n}\n\nfloat getRand(vec2 seed) {\nreturn fract(sin(dot(seed.xy ,vec2(12.9898,78.233)))*43758.5453);\n}\nvec3 dither(vec2 seed,vec3 color) {\nfloat rand=getRand(seed);\ncolor+=mix(-0.5/255.0,0.5/255.0,rand);\ncolor=max(color,0.0);\nreturn color;\n}",
    lightFragmentDeclaration: "#ifdef LIGHT{X}\nuniform vec4 vLightData{X};\nuniform vec4 vLightDiffuse{X};\n#ifdef SPECULARTERM\nuniform vec3 vLightSpecular{X};\n#else\nvec3 vLightSpecular{X}=vec3(0.);\n#endif\n#ifdef SHADOW{X}\n#if defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X};\n#else\nvarying vec4 vPositionFromLight{X};\nvarying float vDepthMetric{X};\nuniform sampler2D shadowSampler{X};\nuniform mat4 lightMatrix{X};\n#endif\nuniform vec4 shadowsInfo{X};\nuniform vec2 depthValues{X};\n#endif\n#ifdef SPOTLIGHT{X}\nuniform vec4 vLightDirection{X};\n#endif\n#ifdef HEMILIGHT{X}\nuniform vec3 vLightGround{X};\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};\nuniform sampler2D projectionLightSampler{X};\n#endif\n#endif",
    lightsFragmentFunctions: "\nstruct lightingInfo\n{\nvec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n#ifdef NDOTL\nfloat ndl;\n#endif\n};\nlightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {\nlightingInfo result;\nvec3 lightVectorW;\nfloat attenuation=1.0;\nif (lightData.w == 0.)\n{\nvec3 direction=lightData.xyz-vPositionW;\nattenuation=max(0.,1.0-length(direction)/range);\nlightVectorW=normalize(direction);\n}\nelse\n{\nlightVectorW=normalize(-lightData.xyz);\n}\n\nfloat ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\n\nvec3 angleW=normalize(viewDirectionW+lightVectorW);\nfloat specComp=max(0.,dot(vNormal,angleW));\nspecComp=pow(specComp,max(1.,glossiness));\nresult.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;\n}\nlightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float range,float glossiness) {\nlightingInfo result;\nvec3 direction=lightData.xyz-vPositionW;\nvec3 lightVectorW=normalize(direction);\nfloat attenuation=max(0.,1.0-length(direction)/range);\n\nfloat cosAngle=max(0.,dot(lightDirection.xyz,-lightVectorW));\nif (cosAngle>=lightDirection.w)\n{\ncosAngle=max(0.,pow(cosAngle,lightData.w));\nattenuation*=cosAngle;\n\nfloat ndl=max(0.,dot(vNormal,lightVectorW));\n#ifdef NDOTL\nresult.ndl=ndl;\n#endif\nresult.diffuse=ndl*diffuseColor*attenuation;\n#ifdef SPECULARTERM\n\nvec3 angleW=normalize(viewDirectionW+lightVectorW);\nfloat specComp=max(0.,dot(vNormal,angleW));\nspecComp=pow(specComp,max(1.,glossiness));\nresult.specular=specComp*specularColor*attenuation;\n#endif\nreturn result;\n}\nresult.diffuse=vec3(0.);\n#ifdef SPECULARTERM\nresult.specular=vec3(0.);\n#endif\n#ifdef NDOTL\nresult.ndl=0.;\n#endif\nreturn result;\n}\nlightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float glossiness) {\nlightingInfo result;\n\nfloat 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\n\nvec3 angleW=normalize(viewDirectionW+lightData.xyz);\nfloat specComp=max(0.,dot(vNormal,angleW));\nspecComp=pow(specComp,max(1.,glossiness));\nresult.specular=specComp*specularColor;\n#endif\nreturn result;\n}\nvec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler,mat4 textureProjectionMatrix){\nvec4 strq=textureProjectionMatrix*vec4(vPositionW,1.0);\nstrq/=strq.w;\nvec3 textureColor=texture2D(projectionLightSampler,strq.xy).rgb;\n#ifdef PBR\ntextureColor=toLinearSpace(textureColor);\n#endif\nreturn textureColor;\n}",
    lightUboDeclaration: "#ifdef LIGHT{X}\nuniform Light{X}\n{\nvec4 vLightData;\nvec4 vLightDiffuse;\nvec3 vLightSpecular;\n#ifdef SPOTLIGHT{X}\nvec4 vLightDirection;\n#endif\n#ifdef HEMILIGHT{X}\nvec3 vLightGround;\n#endif\nvec4 shadowsInfo;\nvec2 depthValues;\n} light{X};\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nuniform mat4 textureProjectionMatrix{X};\nuniform sampler2D projectionLightSampler{X};\n#endif\n#ifdef SHADOW{X}\n#if defined(SHADOWCUBE{X})\nuniform samplerCube shadowSampler{X};\n#else\nvarying vec4 vPositionFromLight{X};\nvarying float vDepthMetric{X};\nuniform sampler2D shadowSampler{X};\nuniform mat4 lightMatrix{X};\n#endif\n#endif\n#endif",
    defaultVertexDeclaration: "\nuniform mat4 viewProjection;\nuniform mat4 view;\n#ifdef DIFFUSE\nuniform mat4 diffuseMatrix;\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;\nuniform vec2 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;\nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\nuniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\nuniform mat4 lightmapMatrix;\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;\nuniform mat4 specularMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;\nuniform mat4 bumpMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n",
    defaultFragmentDeclaration: "uniform vec4 vDiffuseColor;\n#ifdef SPECULARTERM\nuniform vec4 vSpecularColor;\n#endif\nuniform vec3 vEmissiveColor;\n\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;\nuniform vec2 vTangentSpaceParams;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION)\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;\nuniform vec4 refractionRightColor;\n#endif\n#endif\n#if defined(SPECULAR) && defined(SPECULARTERM)\nuniform vec2 vSpecularInfos;\n#endif\n#ifdef DIFFUSEFRESNEL\nuniform vec4 diffuseLeftColor;\nuniform vec4 diffuseRightColor;\n#endif\n#ifdef OPACITYFRESNEL\nuniform vec4 opacityParts;\n#endif\n#ifdef EMISSIVEFRESNEL\nuniform vec4 emissiveLeftColor;\nuniform vec4 emissiveRightColor;\n#endif\n\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\n#ifdef REFLECTIONMAP_SKYBOX\n#else\n#if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION)\nuniform mat4 reflectionMatrix;\n#endif\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;\nuniform vec3 vReflectionSize; \n#endif\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 reflectionLeftColor;\nuniform vec4 reflectionRightColor;\n#endif\n#endif",
    defaultUboDeclaration: "layout(std140,column_major) uniform;\nuniform Material\n{\nvec4 diffuseLeftColor;\nvec4 diffuseRightColor;\nvec4 opacityParts;\nvec4 reflectionLeftColor;\nvec4 reflectionRightColor;\nvec4 refractionLeftColor;\nvec4 refractionRightColor;\nvec4 emissiveLeftColor; \nvec4 emissiveRightColor;\nvec2 vDiffuseInfos;\nvec2 vAmbientInfos;\nvec2 vOpacityInfos;\nvec2 vReflectionInfos;\nvec3 vReflectionPosition;\nvec3 vReflectionSize;\nvec2 vEmissiveInfos;\nvec2 vLightmapInfos;\nvec2 vSpecularInfos;\nvec3 vBumpInfos;\nmat4 diffuseMatrix;\nmat4 ambientMatrix;\nmat4 opacityMatrix;\nmat4 reflectionMatrix;\nmat4 emissiveMatrix;\nmat4 lightmapMatrix;\nmat4 specularMatrix;\nmat4 bumpMatrix; \nvec4 vTangentSpaceParams;\nmat4 refractionMatrix;\nvec4 vRefractionInfos;\nvec4 vSpecularColor;\nvec3 vEmissiveColor;\nvec4 vDiffuseColor;\nfloat pointSize; \n};\nuniform Scene {\nmat4 viewProjection;\nmat4 view;\n};",
    shadowsFragmentFunctions: "#ifdef SHADOWS\n#ifndef SHADOWFLOAT\nfloat unpack(vec4 color)\n{\nconst vec4 bit_shift=vec4(1.0/(255.0*255.0*255.0),1.0/(255.0*255.0),1.0/255.0,1.0);\nreturn dot(color,bit_shift);\n}\n#endif\nfloat computeShadowCube(vec3 lightPosition,samplerCube shadowSampler,float darkness,vec2 depthValues)\n{\nvec3 directionToLight=vPositionW-lightPosition;\nfloat depth=length(directionToLight);\ndepth=(depth+depthValues.x)/(depthValues.y);\ndepth=clamp(depth,0.,1.0);\ndirectionToLight=normalize(directionToLight);\ndirectionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadow=textureCube(shadowSampler,directionToLight).x;\n#endif\nif (depth>shadow)\n{\nreturn darkness;\n}\nreturn 1.0;\n}\nfloat computeShadowWithPCFCube(vec3 lightPosition,samplerCube shadowSampler,float mapSize,float darkness,vec2 depthValues)\n{\nvec3 directionToLight=vPositionW-lightPosition;\nfloat depth=length(directionToLight);\ndepth=(depth+depthValues.x)/(depthValues.y);\ndepth=clamp(depth,0.,1.0);\ndirectionToLight=normalize(directionToLight);\ndirectionToLight.y=-directionToLight.y;\nfloat visibility=1.;\nvec3 poissonDisk[4];\npoissonDisk[0]=vec3(-1.0,1.0,-1.0);\npoissonDisk[1]=vec3(1.0,-1.0,-1.0);\npoissonDisk[2]=vec3(-1.0,-1.0,-1.0);\npoissonDisk[3]=vec3(1.0,-1.0,1.0);\n\n#ifndef SHADOWFLOAT\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize))<depth) visibility-=0.25;\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[1]*mapSize))<depth) visibility-=0.25;\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[2]*mapSize))<depth) visibility-=0.25;\nif (unpack(textureCube(shadowSampler,directionToLight+poissonDisk[3]*mapSize))<depth) visibility-=0.25;\n#else\nif (textureCube(shadowSampler,directionToLight+poissonDisk[0]*mapSize).x<depth) visibility-=0.25;\nif (textureCube(shadowSampler,directionToLight+poissonDisk[1]*mapSize).x<depth) visibility-=0.25;\nif (textureCube(shadowSampler,directionToLight+poissonDisk[2]*mapSize).x<depth) visibility-=0.25;\nif (textureCube(shadowSampler,directionToLight+poissonDisk[3]*mapSize).x<depth) visibility-=0.25;\n#endif\nreturn min(1.0,visibility+darkness);\n}\nfloat computeShadowWithESMCube(vec3 lightPosition,samplerCube shadowSampler,float darkness,float depthScale,vec2 depthValues)\n{\nvec3 directionToLight=vPositionW-lightPosition;\nfloat depth=length(directionToLight);\ndepth=(depth+depthValues.x)/(depthValues.y);\nfloat shadowPixelDepth=clamp(depth,0.,1.0);\ndirectionToLight=normalize(directionToLight);\ndirectionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadowMapSample=textureCube(shadowSampler,directionToLight).x;\n#endif\nfloat esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness); \nreturn esm;\n}\nfloat computeShadowWithCloseESMCube(vec3 lightPosition,samplerCube shadowSampler,float darkness,float depthScale,vec2 depthValues)\n{\nvec3 directionToLight=vPositionW-lightPosition;\nfloat depth=length(directionToLight);\ndepth=(depth+depthValues.x)/(depthValues.y);\nfloat shadowPixelDepth=clamp(depth,0.,1.0);\ndirectionToLight=normalize(directionToLight);\ndirectionToLight.y=-directionToLight.y;\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(textureCube(shadowSampler,directionToLight));\n#else\nfloat shadowMapSample=textureCube(shadowSampler,directionToLight).x;\n#endif\nfloat esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);\nreturn esm;\n}\nfloat computeShadow(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float frustumEdgeFalloff)\n{\nvec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;\nvec2 uv=0.5*clipSpace.xy+vec2(0.5);\nif (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{\nreturn 1.0;\n}\nfloat shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadow=unpack(texture2D(shadowSampler,uv));\n#else\nfloat shadow=texture2D(shadowSampler,uv).x;\n#endif\nif (shadowPixelDepth>shadow)\n{\nreturn computeFallOff(darkness,clipSpace.xy,frustumEdgeFalloff);\n}\nreturn 1.;\n}\nfloat computeShadowWithPCF(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float mapSize,float darkness,float frustumEdgeFalloff)\n{\nvec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;\nvec2 uv=0.5*clipSpace.xy+vec2(0.5);\nif (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{\nreturn 1.0;\n}\nfloat shadowPixelDepth=clamp(depthMetric,0.,1.0);\nfloat visibility=1.;\nvec2 poissonDisk[4];\npoissonDisk[0]=vec2(-0.94201624,-0.39906216);\npoissonDisk[1]=vec2(0.94558609,-0.76890725);\npoissonDisk[2]=vec2(-0.094184101,-0.92938870);\npoissonDisk[3]=vec2(0.34495938,0.29387760);\n\n#ifndef SHADOWFLOAT\nif (unpack(texture2D(shadowSampler,uv+poissonDisk[0]*mapSize))<shadowPixelDepth) visibility-=0.25;\nif (unpack(texture2D(shadowSampler,uv+poissonDisk[1]*mapSize))<shadowPixelDepth) visibility-=0.25;\nif (unpack(texture2D(shadowSampler,uv+poissonDisk[2]*mapSize))<shadowPixelDepth) visibility-=0.25;\nif (unpack(texture2D(shadowSampler,uv+poissonDisk[3]*mapSize))<shadowPixelDepth) visibility-=0.25;\n#else\nif (texture2D(shadowSampler,uv+poissonDisk[0]*mapSize).x<shadowPixelDepth) visibility-=0.25;\nif (texture2D(shadowSampler,uv+poissonDisk[1]*mapSize).x<shadowPixelDepth) visibility-=0.25;\nif (texture2D(shadowSampler,uv+poissonDisk[2]*mapSize).x<shadowPixelDepth) visibility-=0.25;\nif (texture2D(shadowSampler,uv+poissonDisk[3]*mapSize).x<shadowPixelDepth) visibility-=0.25;\n#endif\nreturn computeFallOff(min(1.0,visibility+darkness),clipSpace.xy,frustumEdgeFalloff);\n}\nfloat computeShadowWithESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff)\n{\nvec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;\nvec2 uv=0.5*clipSpace.xy+vec2(0.5);\nif (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{\nreturn 1.0;\n}\nfloat shadowPixelDepth=clamp(depthMetric,0.,1.0);\n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(texture2D(shadowSampler,uv));\n#else\nfloat shadowMapSample=texture2D(shadowSampler,uv).x;\n#endif\nfloat esm=1.0-clamp(exp(min(87.,depthScale*shadowPixelDepth))*shadowMapSample,0.,1.-darkness);\nreturn computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);\n}\nfloat computeShadowWithCloseESM(vec4 vPositionFromLight,float depthMetric,sampler2D shadowSampler,float darkness,float depthScale,float frustumEdgeFalloff)\n{\nvec3 clipSpace=vPositionFromLight.xyz/vPositionFromLight.w;\nvec2 uv=0.5*clipSpace.xy+vec2(0.5);\nif (uv.x<0. || uv.x>1.0 || uv.y<0. || uv.y>1.0)\n{\nreturn 1.0;\n}\nfloat shadowPixelDepth=clamp(depthMetric,0.,1.0); \n#ifndef SHADOWFLOAT\nfloat shadowMapSample=unpack(texture2D(shadowSampler,uv));\n#else\nfloat shadowMapSample=texture2D(shadowSampler,uv).x;\n#endif\nfloat esm=clamp(exp(min(87.,-depthScale*(shadowPixelDepth-shadowMapSample))),darkness,1.);\nreturn computeFallOff(esm,clipSpace.xy,frustumEdgeFalloff);\n}\n#endif\n",
    fresnelFunction: "#ifdef FRESNEL\nfloat computeFresnelTerm(vec3 viewDirection,vec3 worldNormal,float bias,float power)\n{\nfloat fresnelTerm=pow(bias+abs(dot(viewDirection,worldNormal)),power);\nreturn clamp(fresnelTerm,0.,1.);\n}\n#endif",
    reflectionFunction: "#ifdef USE_LOCAL_REFLECTIONMAP_CUBIC\nvec3 parallaxCorrectNormal( vec3 vertexPos,vec3 origVec,vec3 cubeSize,vec3 cubePos ) {\n\nvec3 invOrigVec=vec3(1.0,1.0,1.0)/origVec;\nvec3 halfSize=cubeSize*0.5;\nvec3 intersecAtMaxPlane=(cubePos+halfSize-vertexPos)*invOrigVec;\nvec3 intersecAtMinPlane=(cubePos-halfSize-vertexPos)*invOrigVec;\n\nvec3 largestIntersec=max(intersecAtMaxPlane,intersecAtMinPlane);\n\nfloat distance=min(min(largestIntersec.x,largestIntersec.y),largestIntersec.z);\n\nvec3 intersectPositionWS=vertexPos+origVec*distance;\n\nreturn intersectPositionWS-cubePos;\n}\n#endif\nvec3 computeReflectionCoords(vec4 worldPos,vec3 worldNormal)\n{\n#if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)\nvec3 direction=vDirectionW;\nfloat t=clamp(direction.y*-0.5+0.5,0.,1.0);\nfloat s=atan(direction.z,direction.x)*RECIPROCAL_PI2+0.5;\n#ifdef REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED\nreturn vec3(1.0-s,t,0);\n#else\nreturn vec3(s,t,0);\n#endif\n#endif\n#ifdef REFLECTIONMAP_EQUIRECTANGULAR\nvec3 cameraToVertex=normalize(worldPos.xyz-vEyePosition.xyz);\nvec3 r=reflect(cameraToVertex,worldNormal);\nfloat t=clamp(r.y*-0.5+0.5,0.,1.0);\nfloat s=atan(r.z,r.x)*RECIPROCAL_PI2+0.5;\nreturn vec3(s,t,0);\n#endif\n#ifdef REFLECTIONMAP_SPHERICAL\nvec3 viewDir=normalize(vec3(view*worldPos));\nvec3 viewNormal=normalize(vec3(view*vec4(worldNormal,0.0)));\nvec3 r=reflect(viewDir,viewNormal);\nr.z=r.z-1.0;\nfloat m=2.0*length(r);\nreturn vec3(r.x/m+0.5,1.0-r.y/m-0.5,0);\n#endif\n#ifdef REFLECTIONMAP_PLANAR\nvec3 viewDir=worldPos.xyz-vEyePosition.xyz;\nvec3 coords=normalize(reflect(viewDir,worldNormal));\nreturn vec3(reflectionMatrix*vec4(coords,1));\n#endif\n#ifdef REFLECTIONMAP_CUBIC\nvec3 viewDir=normalize(worldPos.xyz-vEyePosition.xyz);\n\nvec3 coords=reflect(viewDir,worldNormal);\n#ifdef USE_LOCAL_REFLECTIONMAP_CUBIC\ncoords=parallaxCorrectNormal(worldPos.xyz,coords,vReflectionSize,vReflectionPosition);\n#endif\ncoords=vec3(reflectionMatrix*vec4(coords,0));\n#ifdef INVERTCUBICMAP\ncoords.y*=-1.0;\n#endif\nreturn coords;\n#endif\n#ifdef REFLECTIONMAP_PROJECTION\nreturn vec3(reflectionMatrix*(view*worldPos));\n#endif\n#ifdef REFLECTIONMAP_SKYBOX\nreturn vPositionUVW;\n#endif\n#ifdef REFLECTIONMAP_EXPLICIT\nreturn vec3(0,0,0);\n#endif\n}",
    imageProcessingDeclaration: "#ifdef EXPOSURE\nuniform float exposureLinear;\n#endif\n#ifdef CONTRAST\nuniform float contrast;\n#endif\n#ifdef VIGNETTE\nuniform vec2 vInverseScreenSize;\nuniform vec4 vignetteSettings1;\nuniform vec4 vignetteSettings2;\n#endif\n#ifdef COLORCURVES\nuniform vec4 vCameraColorCurveNegative;\nuniform vec4 vCameraColorCurveNeutral;\nuniform vec4 vCameraColorCurvePositive;\n#endif\n#ifdef COLORGRADING\n#ifdef COLORGRADING3D\nuniform highp sampler3D txColorTransform;\n#else\nuniform sampler2D txColorTransform;\n#endif\nuniform vec4 colorTransformSettings;\n#endif",
    imageProcessingFunctions: "#if defined(COLORGRADING) && !defined(COLORGRADING3D)\n\nvec3 sampleTexture3D(sampler2D colorTransform,vec3 color,vec2 sampler3dSetting)\n{\nfloat sliceSize=2.0*sampler3dSetting.x; \n#ifdef SAMPLER3DGREENDEPTH\nfloat sliceContinuous=(color.g-sampler3dSetting.x)*sampler3dSetting.y;\n#else\nfloat sliceContinuous=(color.b-sampler3dSetting.x)*sampler3dSetting.y;\n#endif\nfloat sliceInteger=floor(sliceContinuous);\n\n\nfloat sliceFraction=sliceContinuous-sliceInteger;\n#ifdef SAMPLER3DGREENDEPTH\nvec2 sliceUV=color.rb;\n#else\nvec2 sliceUV=color.rg;\n#endif\nsliceUV.x*=sliceSize;\nsliceUV.x+=sliceInteger*sliceSize;\nsliceUV=clamp(sliceUV,0.,1.);\nvec4 slice0Color=texture2D(colorTransform,sliceUV);\nsliceUV.x+=sliceSize;\nsliceUV=clamp(sliceUV,0.,1.);\nvec4 slice1Color=texture2D(colorTransform,sliceUV);\nvec3 result=mix(slice0Color.rgb,slice1Color.rgb,sliceFraction);\n#ifdef SAMPLER3DBGRMAP\ncolor.rgb=result.rgb;\n#else\ncolor.rgb=result.bgr;\n#endif\nreturn color;\n}\n#endif\nvec4 applyImageProcessing(vec4 result) {\n#ifdef EXPOSURE\nresult.rgb*=exposureLinear;\n#endif\n#ifdef VIGNETTE\n\nvec2 viewportXY=gl_FragCoord.xy*vInverseScreenSize;\nviewportXY=viewportXY*2.0-1.0;\nvec3 vignetteXY1=vec3(viewportXY*vignetteSettings1.xy+vignetteSettings1.zw,1.0);\nfloat vignetteTerm=dot(vignetteXY1,vignetteXY1);\nfloat vignette=pow(vignetteTerm,vignetteSettings2.w);\n\nvec3 vignetteColor=vignetteSettings2.rgb;\n#ifdef VIGNETTEBLENDMODEMULTIPLY\nvec3 vignetteColorMultiplier=mix(vignetteColor,vec3(1,1,1),vignette);\nresult.rgb*=vignetteColorMultiplier;\n#endif\n#ifdef VIGNETTEBLENDMODEOPAQUE\nresult.rgb=mix(vignetteColor,result.rgb,vignette);\n#endif\n#endif\n#ifdef TONEMAPPING\nconst float tonemappingCalibration=1.590579;\nresult.rgb=1.0-exp2(-tonemappingCalibration*result.rgb);\n#endif\n\nresult.rgb=toGammaSpace(result.rgb);\nresult.rgb=clamp(result.rgb,0.0,1.0);\n#ifdef CONTRAST\n\nvec3 resultHighContrast=applyEaseInOut(result.rgb);\nif (contrast<1.0) {\n\nresult.rgb=mix(vec3(0.5,0.5,0.5),result.rgb,contrast);\n} else {\n\nresult.rgb=mix(result.rgb,resultHighContrast,contrast-1.0);\n}\n#endif\n\n#ifdef COLORGRADING\nvec3 colorTransformInput=result.rgb*colorTransformSettings.xxx+colorTransformSettings.yyy;\n#ifdef COLORGRADING3D\nvec3 colorTransformOutput=texture(txColorTransform,colorTransformInput).rgb;\n#else\nvec3 colorTransformOutput=sampleTexture3D(txColorTransform,colorTransformInput,colorTransformSettings.yz).rgb;\n#endif\nresult.rgb=mix(result.rgb,colorTransformOutput,colorTransformSettings.www);\n#endif\n#ifdef COLORCURVES\n\nfloat luma=getLuminance(result.rgb);\nvec2 curveMix=clamp(vec2(luma*3.0-1.5,luma*-3.0+1.5),vec2(0.0),vec2(1.0));\nvec4 colorCurve=vCameraColorCurveNeutral+curveMix.x*vCameraColorCurvePositive-curveMix.y*vCameraColorCurveNegative;\nresult.rgb*=colorCurve.rgb;\nresult.rgb=mix(vec3(luma),result.rgb,colorCurve.a);\n#endif\nreturn result;\n}",
    bumpFragmentFunctions: "#ifdef BUMP\n#if BUMPDIRECTUV == 1\n#define vBumpUV vMainUV1\n#elif BUMPDIRECTUV == 2\n#define vBumpUV vMainUV2\n#else\nvarying vec2 vBumpUV;\n#endif\nuniform sampler2D bumpSampler;\n#if defined(TANGENT) && defined(NORMAL) \nvarying mat3 vTBN;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\nuniform mat4 normalMatrix;\n#endif\n\nmat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv)\n{\n\nuv=gl_FrontFacing ? uv : -uv;\n\nvec3 dp1=dFdx(p);\nvec3 dp2=dFdy(p);\nvec2 duv1=dFdx(uv);\nvec2 duv2=dFdy(uv);\n\nvec3 dp2perp=cross(dp2,normal);\nvec3 dp1perp=cross(normal,dp1);\nvec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;\nvec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;\n\ntangent*=vTangentSpaceParams.x;\nbitangent*=vTangentSpaceParams.y;\n\nfloat invmax=inversesqrt(max(dot(tangent,tangent),dot(bitangent,bitangent)));\nreturn mat3(tangent*invmax,bitangent*invmax,normal);\n}\nvec3 perturbNormal(mat3 cotangentFrame,vec2 uv)\n{\nvec3 map=texture2D(bumpSampler,uv).xyz;\nmap=map*2.0-1.0;\n#ifdef NORMALXYSCALE\nmap=normalize(map*vec3(vBumpInfos.y,vBumpInfos.y,1.0));\n#endif\nreturn normalize(cotangentFrame*map);\n}\n#ifdef PARALLAX\nconst float minSamples=4.;\nconst float maxSamples=15.;\nconst int iMaxSamples=15;\n\nvec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {\nfloat parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;\nparallaxLimit*=parallaxScale;\nvec2 vOffsetDir=normalize(vViewDirCoT.xy);\nvec2 vMaxOffset=vOffsetDir*parallaxLimit;\nfloat numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));\nfloat stepSize=1.0/numSamples;\n\nfloat currRayHeight=1.0;\nvec2 vCurrOffset=vec2(0,0);\nvec2 vLastOffset=vec2(0,0);\nfloat lastSampledHeight=1.0;\nfloat currSampledHeight=1.0;\nfor (int i=0; i<iMaxSamples; i++)\n{\ncurrSampledHeight=texture2D(bumpSampler,vBumpUV+vCurrOffset).w;\n\nif (currSampledHeight>currRayHeight)\n{\nfloat delta1=currSampledHeight-currRayHeight;\nfloat delta2=(currRayHeight+stepSize)-lastSampledHeight;\nfloat ratio=delta1/(delta1+delta2);\nvCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;\n\nbreak;\n}\nelse\n{\ncurrRayHeight-=stepSize;\nvLastOffset=vCurrOffset;\nvCurrOffset+=stepSize*vMaxOffset;\nlastSampledHeight=currSampledHeight;\n}\n}\nreturn vCurrOffset;\n}\nvec2 parallaxOffset(vec3 viewDir,float heightScale)\n{\n\nfloat height=texture2D(bumpSampler,vBumpUV).w;\nvec2 texCoordOffset=heightScale*viewDir.xy*height;\nreturn -texCoordOffset;\n}\n#endif\n#endif",
    clipPlaneFragmentDeclaration: "#ifdef CLIPPLANE\nvarying float fClipDistance;\n#endif",
    fogFragmentDeclaration: "#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;\nuniform vec3 vFogColor;\nvarying vec3 vFogDistance;\nfloat CalcFogFactor()\n{\nfloat fogCoeff=1.0;\nfloat fogStart=vFogInfos.y;\nfloat fogEnd=vFogInfos.z;\nfloat fogDensity=vFogInfos.w;\nfloat fogDistance=length(vFogDistance);\nif (FOGMODE_LINEAR == vFogInfos.x)\n{\nfogCoeff=(fogEnd-fogDistance)/(fogEnd-fogStart);\n}\nelse if (FOGMODE_EXP == vFogInfos.x)\n{\nfogCoeff=1.0/pow(E,fogDistance*fogDensity);\n}\nelse if (FOGMODE_EXP2 == vFogInfos.x)\n{\nfogCoeff=1.0/pow(E,fogDistance*fogDistance*fogDensity*fogDensity);\n}\nreturn clamp(fogCoeff,0.0,1.0);\n}\n#endif",
    clipPlaneFragment: "#ifdef CLIPPLANE\nif (fClipDistance>0.0)\n{\ndiscard;\n}\n#endif",
    bumpFragment: "vec2 uvOffset=vec2(0.0,0.0);\n#if defined(BUMP) || defined(PARALLAX)\n#ifdef NORMALXYSCALE\nfloat normalScale=1.0;\n#else \nfloat normalScale=vBumpInfos.y;\n#endif\n#if defined(TANGENT) && defined(NORMAL)\nmat3 TBN=vTBN;\n#else\nmat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,vBumpUV);\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 BUMP\n#ifdef OBJECTSPACE_NORMALMAP\nnormalW=normalize(texture2D(bumpSampler,vBumpUV).xyz*2.0-1.0);\nnormalW=normalize(mat3(normalMatrix)*normalW); \n#else\nnormalW=perturbNormal(TBN,vBumpUV+uvOffset);\n#endif\n#endif",
    lightFragment: "#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || (defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X}))\n\n#else\n#ifdef PBR\n#ifdef SPOTLIGHT{X}\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular,light{X}.vLightDiffuse.a,roughness,NdotV,specularEnvironmentR0,specularEnvironmentR90,NdotL);\n#endif\n#ifdef HEMILIGHT{X}\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular,light{X}.vLightGround,roughness,NdotV,specularEnvironmentR0,specularEnvironmentR90,NdotL);\n#endif\n#if defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular,light{X}.vLightDiffuse.a,roughness,NdotV,specularEnvironmentR0,specularEnvironmentR90,NdotL);\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,light{X}.vLightDiffuse.a,glossiness);\n#endif\n#ifdef HEMILIGHT{X}\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular,light{X}.vLightGround,glossiness);\n#endif\n#if defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDiffuse.rgb,light{X}.vLightSpecular,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 SHADOWCLOSEESM{X}\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(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#else\n#ifdef SHADOWESM{X}\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(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#else \n#ifdef SHADOWPCF{X}\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPCFCube(light{X}.vLightData.xyz,shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPCF(vPositionFromLight{X},vDepthMetric{X},shadowSampler{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(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#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;\nshadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\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*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor;\n#endif\n#endif\n#else\ndiffuseBase+=info.diffuse*shadow;\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#endif\n#endif\n#endif",
    logDepthFragment: "#ifdef LOGARITHMICDEPTH\ngl_FragDepthEXT=log2(vFragmentDepth)*logarithmicDepthConstant*0.5;\n#endif",
    fogFragment: "#ifdef FOG\nfloat fog=CalcFogFactor();\ncolor.rgb=fog*color.rgb+(1.0-fog)*vFogColor;\n#endif",
    pbrVertexDeclaration: "uniform mat4 view;\nuniform mat4 viewProjection;\n#ifdef ALBEDO\nuniform mat4 albedoMatrix;\nuniform vec2 vAlbedoInfos;\n#endif\n#ifdef AMBIENT\nuniform mat4 ambientMatrix;\nuniform vec3 vAmbientInfos;\n#endif\n#ifdef OPACITY\nuniform mat4 opacityMatrix;\nuniform vec2 vOpacityInfos;\n#endif\n#ifdef EMISSIVE\nuniform vec2 vEmissiveInfos;\nuniform mat4 emissiveMatrix;\n#endif\n#ifdef LIGHTMAP\nuniform vec2 vLightmapInfos;\nuniform mat4 lightmapMatrix;\n#endif\n#ifdef REFLECTIVITY \nuniform vec3 vReflectivityInfos;\nuniform mat4 reflectivityMatrix;\n#endif\n#ifdef MICROSURFACEMAP\nuniform vec2 vMicroSurfaceSamplerInfos;\nuniform mat4 microSurfaceSamplerMatrix;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;\nuniform mat4 bumpMatrix;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif\n\n#ifdef REFRACTION\nuniform vec4 vRefractionInfos;\nuniform mat4 refractionMatrix;\nuniform vec3 vRefractionMicrosurfaceInfos;\n#endif\n\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\nuniform mat4 reflectionMatrix;\nuniform vec3 vReflectionMicrosurfaceInfos;\n#endif\n",
    pbrFragmentDeclaration: "uniform vec3 vReflectionColor;\nuniform vec4 vAlbedoColor;\n\nuniform vec4 vLightingIntensity;\nuniform vec4 vReflectivityColor;\nuniform vec3 vEmissiveColor;\n\n#ifdef ALBEDO\nuniform vec2 vAlbedoInfos;\n#endif\n#ifdef AMBIENT\nuniform vec3 vAmbientInfos;\n#endif\n#ifdef BUMP\nuniform vec3 vBumpInfos;\nuniform 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\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION)\nuniform mat4 view;\n#endif\n\n#ifdef REFRACTION\nuniform vec4 vRefractionInfos;\nuniform mat4 refractionMatrix;\nuniform vec3 vRefractionMicrosurfaceInfos;\n#endif\n\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\nuniform mat4 reflectionMatrix;\nuniform vec3 vReflectionMicrosurfaceInfos;\n#if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC)\nuniform vec3 vReflectionPosition;\nuniform vec3 vReflectionSize; \n#endif\n#endif",
    pbrUboDeclaration: "layout(std140,column_major) uniform;\nuniform Material\n{\nuniform vec2 vAlbedoInfos;\nuniform vec3 vAmbientInfos;\nuniform vec2 vOpacityInfos;\nuniform vec2 vEmissiveInfos;\nuniform vec2 vLightmapInfos;\nuniform vec3 vReflectivityInfos;\nuniform vec2 vMicroSurfaceSamplerInfos;\nuniform vec4 vRefractionInfos;\nuniform vec2 vReflectionInfos;\nuniform vec3 vReflectionPosition;\nuniform vec3 vReflectionSize; \nuniform vec3 vBumpInfos;\nuniform mat4 albedoMatrix;\nuniform mat4 ambientMatrix;\nuniform mat4 opacityMatrix;\nuniform mat4 emissiveMatrix;\nuniform mat4 lightmapMatrix;\nuniform mat4 reflectivityMatrix;\nuniform mat4 microSurfaceSamplerMatrix;\nuniform mat4 bumpMatrix;\nuniform vec2 vTangentSpaceParams;\nuniform mat4 refractionMatrix;\nuniform mat4 reflectionMatrix;\nuniform vec3 vReflectionColor;\nuniform vec4 vAlbedoColor;\nuniform vec4 vLightingIntensity;\nuniform vec3 vRefractionMicrosurfaceInfos;\nuniform vec3 vReflectionMicrosurfaceInfos;\nuniform vec4 vReflectivityColor;\nuniform vec3 vEmissiveColor;\nuniform float pointSize;\n};\nuniform Scene {\nmat4 viewProjection;\nmat4 view;\n};",
    pbrFunctions: "\n#define RECIPROCAL_PI2 0.15915494\n#define FRESNEL_MAXIMUM_ON_ROUGH 0.25\n\nconst float kRougnhessToAlphaScale=0.1;\nconst float kRougnhessToAlphaOffset=0.29248125;\nfloat convertRoughnessToAverageSlope(float roughness)\n{\n\nconst float kMinimumVariance=0.0005;\nfloat alphaG=square(roughness)+kMinimumVariance;\nreturn alphaG;\n}\n\nfloat smithVisibilityG1_TrowbridgeReitzGGX(float dot,float alphaG)\n{\nfloat tanSquared=(1.0-dot*dot)/(dot*dot);\nreturn 2.0/(1.0+sqrt(1.0+alphaG*alphaG*tanSquared));\n}\nfloat smithVisibilityG_TrowbridgeReitzGGX_Walter(float NdotL,float NdotV,float alphaG)\n{\nreturn smithVisibilityG1_TrowbridgeReitzGGX(NdotL,alphaG)*smithVisibilityG1_TrowbridgeReitzGGX(NdotV,alphaG);\n}\n\n\nfloat normalDistributionFunction_TrowbridgeReitzGGX(float NdotH,float alphaG)\n{\n\n\n\nfloat a2=square(alphaG);\nfloat d=NdotH*NdotH*(a2-1.0)+1.0;\nreturn a2/(PI*d*d);\n}\nvec3 fresnelSchlickGGX(float VdotH,vec3 reflectance0,vec3 reflectance90)\n{\nreturn reflectance0+(reflectance90-reflectance0)*pow(clamp(1.0-VdotH,0.,1.),5.0);\n}\nvec3 fresnelSchlickEnvironmentGGX(float VdotN,vec3 reflectance0,vec3 reflectance90,float smoothness)\n{\n\nfloat weight=mix(FRESNEL_MAXIMUM_ON_ROUGH,1.0,smoothness);\nreturn reflectance0+weight*(reflectance90-reflectance0)*pow(clamp(1.0-VdotN,0.,1.),5.0);\n}\n\nvec3 computeSpecularTerm(float NdotH,float NdotL,float NdotV,float VdotH,float roughness,vec3 reflectance0,vec3 reflectance90)\n{\nfloat alphaG=convertRoughnessToAverageSlope(roughness);\nfloat distribution=normalDistributionFunction_TrowbridgeReitzGGX(NdotH,alphaG);\nfloat visibility=smithVisibilityG_TrowbridgeReitzGGX_Walter(NdotL,NdotV,alphaG);\nvisibility/=(4.0*NdotL*NdotV); \nfloat specTerm=max(0.,visibility*distribution)*NdotL;\nvec3 fresnel=fresnelSchlickGGX(VdotH,reflectance0,reflectance90);\nreturn fresnel*specTerm;\n}\nfloat computeDiffuseTerm(float NdotL,float NdotV,float VdotH,float roughness)\n{\n\n\nfloat diffuseFresnelNV=pow(clamp(1.0-NdotL,0.000001,1.),5.0);\nfloat diffuseFresnelNL=pow(clamp(1.0-NdotV,0.000001,1.),5.0);\nfloat diffuseFresnel90=0.5+2.0*VdotH*VdotH*roughness;\nfloat fresnel =\n(1.0+(diffuseFresnel90-1.0)*diffuseFresnelNL) *\n(1.0+(diffuseFresnel90-1.0)*diffuseFresnelNV);\nreturn fresnel*NdotL/PI;\n}\nfloat adjustRoughnessFromLightProperties(float roughness,float lightRadius,float lightDistance)\n{\n#ifdef USEPHYSICALLIGHTFALLOFF\n\nfloat lightRoughness=lightRadius/lightDistance;\n\nfloat totalRoughness=clamp(lightRoughness+roughness,0.,1.);\nreturn totalRoughness;\n#else\nreturn roughness;\n#endif\n}\nfloat computeDefaultMicroSurface(float microSurface,vec3 reflectivityColor)\n{\nconst float kReflectivityNoAlphaWorkflow_SmoothnessMax=0.95;\nfloat reflectivityLuminance=getLuminance(reflectivityColor);\nfloat reflectivityLuma=sqrt(reflectivityLuminance);\nmicroSurface=reflectivityLuma*kReflectivityNoAlphaWorkflow_SmoothnessMax;\nreturn microSurface;\n}\n\n\nfloat fresnelGrazingReflectance(float reflectance0) {\nfloat reflectance90=clamp(reflectance0*25.0,0.0,1.0);\nreturn reflectance90;\n}\n\n\n#define UNPACK_LOD(x) (1.0-x)*255.0\nfloat getLodFromAlphaG(float cubeMapDimensionPixels,float alphaG,float NdotV) {\nfloat microsurfaceAverageSlope=alphaG;\n\n\n\n\n\n\nmicrosurfaceAverageSlope*=sqrt(abs(NdotV));\nfloat microsurfaceAverageSlopeTexels=microsurfaceAverageSlope*cubeMapDimensionPixels;\nfloat lod=log2(microsurfaceAverageSlopeTexels);\nreturn lod;\n}\nfloat environmentRadianceOcclusion(float ambientOcclusion,float NdotVUnclamped) {\n\n\nfloat temp=NdotVUnclamped+ambientOcclusion;\nreturn clamp(square(temp)-1.0+ambientOcclusion,0.0,1.0);\n}\nfloat environmentHorizonOcclusion(vec3 reflection,vec3 normal) {\n\n#ifdef REFLECTIONMAP_OPPOSITEZ\nreflection.z*=-1.0;\n#endif\nfloat temp=clamp( 1.0+1.1*dot(reflection,normal),0.0,1.0);\nreturn square(temp);\n}",
    harmonicsFunctions: "#ifdef USESPHERICALFROMREFLECTIONMAP\nuniform vec3 vSphericalX;\nuniform vec3 vSphericalY;\nuniform vec3 vSphericalZ;\nuniform vec3 vSphericalXX_ZZ;\nuniform vec3 vSphericalYY_ZZ;\nuniform vec3 vSphericalZZ;\nuniform vec3 vSphericalXY;\nuniform vec3 vSphericalYZ;\nuniform vec3 vSphericalZX;\nvec3 quaternionVectorRotation_ScaledSqrtTwo(vec4 Q,vec3 V){\nvec3 T=cross(Q.xyz,V);\nT+=Q.www*V;\nreturn cross(Q.xyz,T)+V;\n}\nvec3 environmentIrradianceJones(vec3 normal)\n{\n\n\n\n\n\n\n\n\n\nfloat Nx=normal.x;\nfloat Ny=normal.y;\nfloat Nz=normal.z;\nvec3 C1=vSphericalZZ.rgb;\nvec3 Cx=vSphericalX.rgb;\nvec3 Cy=vSphericalY.rgb;\nvec3 Cz=vSphericalZ.rgb;\nvec3 Cxx_zz=vSphericalXX_ZZ.rgb;\nvec3 Cyy_zz=vSphericalYY_ZZ.rgb;\nvec3 Cxy=vSphericalXY.rgb;\nvec3 Cyz=vSphericalYZ.rgb;\nvec3 Czx=vSphericalZX.rgb;\nvec3 a1=Cyy_zz*Ny+Cy;\nvec3 a2=Cyz*Nz+a1;\nvec3 b1=Czx*Nz+Cx;\nvec3 b2=Cxy*Ny+b1;\nvec3 b3=Cxx_zz*Nx+b2;\nvec3 t1=Cz*Nz+C1;\nvec3 t2=a2*Ny+t1;\nvec3 t3=b3*Nx+t2;\nreturn t3;\n}\n#endif",
    pbrLightFunctions: "\nstruct lightingInfo\n{\nvec3 diffuse;\n#ifdef SPECULARTERM\nvec3 specular;\n#endif\n};\nfloat computeDistanceLightFalloff(vec3 lightOffset,float lightDistanceSquared,float range)\n{ \n#ifdef USEPHYSICALLIGHTFALLOFF\nfloat lightDistanceFalloff=1.0/((lightDistanceSquared+0.001));\n#else\nfloat lightDistanceFalloff=max(0.,1.0-length(lightOffset)/range);\n#endif\nreturn lightDistanceFalloff;\n}\nfloat computeDirectionalLightFalloff(vec3 lightDirection,vec3 directionToLightCenterW,float cosHalfAngle,float exponent)\n{\nfloat falloff=0.0;\n#ifdef USEPHYSICALLIGHTFALLOFF\nconst float kMinusLog2ConeAngleIntensityRatio=6.64385618977; \n\n\n\n\n\nfloat concentrationKappa=kMinusLog2ConeAngleIntensityRatio/(1.0-cosHalfAngle);\n\n\nvec4 lightDirectionSpreadSG=vec4(-lightDirection*concentrationKappa,-concentrationKappa);\nfalloff=exp2(dot(vec4(directionToLightCenterW,1.0),lightDirectionSpreadSG));\n#else\nfloat cosAngle=max(0.000000000000001,dot(-lightDirection,directionToLightCenterW));\nif (cosAngle>=cosHalfAngle)\n{\nfalloff=max(0.,pow(cosAngle,exponent));\n}\n#endif\nreturn falloff;\n}\nlightingInfo computeLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,float rangeRadius,float roughness,float NdotV,vec3 reflectance0,vec3 reflectance90,out float NdotL) {\nlightingInfo result;\nvec3 lightDirection;\nfloat attenuation=1.0;\nfloat lightDistance;\n\nif (lightData.w == 0.)\n{\nvec3 lightOffset=lightData.xyz-vPositionW;\nfloat lightDistanceSquared=dot(lightOffset,lightOffset);\nattenuation=computeDistanceLightFalloff(lightOffset,lightDistanceSquared,rangeRadius);\nlightDistance=sqrt(lightDistanceSquared);\nlightDirection=normalize(lightOffset);\n}\n\nelse\n{\nlightDistance=length(-lightData.xyz);\nlightDirection=normalize(-lightData.xyz);\n}\n\nroughness=adjustRoughnessFromLightProperties(roughness,rangeRadius,lightDistance);\n\nvec3 H=normalize(viewDirectionW+lightDirection);\nNdotL=clamp(dot(vNormal,lightDirection),0.00000000001,1.0);\nfloat VdotH=clamp(dot(viewDirectionW,H),0.0,1.0);\nfloat diffuseTerm=computeDiffuseTerm(NdotL,NdotV,VdotH,roughness);\nresult.diffuse=diffuseTerm*diffuseColor*attenuation;\n#ifdef SPECULARTERM\n\nfloat NdotH=clamp(dot(vNormal,H),0.000000000001,1.0);\nvec3 specTerm=computeSpecularTerm(NdotH,NdotL,NdotV,VdotH,roughness,reflectance0,reflectance90);\nresult.specular=specTerm*diffuseColor*attenuation;\n#endif\nreturn result;\n}\nlightingInfo computeSpotLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec4 lightDirection,vec3 diffuseColor,vec3 specularColor,float rangeRadius,float roughness,float NdotV,vec3 reflectance0,vec3 reflectance90,out float NdotL) {\nlightingInfo result;\nvec3 lightOffset=lightData.xyz-vPositionW;\nvec3 directionToLightCenterW=normalize(lightOffset);\n\nfloat lightDistanceSquared=dot(lightOffset,lightOffset);\nfloat attenuation=computeDistanceLightFalloff(lightOffset,lightDistanceSquared,rangeRadius);\n\nfloat directionalAttenuation=computeDirectionalLightFalloff(lightDirection.xyz,directionToLightCenterW,lightDirection.w,lightData.w);\nattenuation*=directionalAttenuation;\n\nfloat lightDistance=sqrt(lightDistanceSquared);\nroughness=adjustRoughnessFromLightProperties(roughness,rangeRadius,lightDistance);\n\nvec3 H=normalize(viewDirectionW+directionToLightCenterW);\nNdotL=clamp(dot(vNormal,directionToLightCenterW),0.000000000001,1.0);\nfloat VdotH=clamp(dot(viewDirectionW,H),0.0,1.0);\nfloat diffuseTerm=computeDiffuseTerm(NdotL,NdotV,VdotH,roughness);\nresult.diffuse=diffuseTerm*diffuseColor*attenuation;\n#ifdef SPECULARTERM\n\nfloat NdotH=clamp(dot(vNormal,H),0.000000000001,1.0);\nvec3 specTerm=computeSpecularTerm(NdotH,NdotL,NdotV,VdotH,roughness,reflectance0,reflectance90);\nresult.specular=specTerm*diffuseColor*attenuation;\n#endif\nreturn result;\n}\nlightingInfo computeHemisphericLighting(vec3 viewDirectionW,vec3 vNormal,vec4 lightData,vec3 diffuseColor,vec3 specularColor,vec3 groundColor,float roughness,float NdotV,vec3 reflectance0,vec3 reflectance90,out float NdotL) {\nlightingInfo result;\n\n\n\nNdotL=dot(vNormal,lightData.xyz)*0.5+0.5;\nresult.diffuse=mix(groundColor,diffuseColor,NdotL);\n#ifdef SPECULARTERM\n\nvec3 lightVectorW=normalize(lightData.xyz);\nvec3 H=normalize(viewDirectionW+lightVectorW);\nfloat NdotH=clamp(dot(vNormal,H),0.000000000001,1.0);\nNdotL=clamp(NdotL,0.000000000001,1.0);\nfloat VdotH=clamp(dot(viewDirectionW,H),0.0,1.0);\nvec3 specTerm=computeSpecularTerm(NdotH,NdotL,NdotV,VdotH,roughness,reflectance0,reflectance90);\nresult.specular=specTerm*diffuseColor;\n#endif\nreturn result;\n}",
    mrtFragmentDeclaration: "#if __VERSION__>=200\nlayout(location=0) out vec4 glFragData[{X}];\n#endif\n",
    bones300Declaration: "#if NUM_BONE_INFLUENCERS>0\nuniform mat4 mBones[BonesPerMesh];\nin vec4 matricesIndices;\nin vec4 matricesWeights;\n#if NUM_BONE_INFLUENCERS>4\nin vec4 matricesIndicesExtra;\nin vec4 matricesWeightsExtra;\n#endif\n#endif",
    instances300Declaration: "#ifdef INSTANCES\nin vec4 world0;\nin vec4 world1;\nin vec4 world2;\nin vec4 world3;\n#else\nuniform mat4 world;\n#endif",
    kernelBlurFragment: "#ifdef DOF\nsampleDepth=sampleDistance(sampleCoord{X});\nfactor=clamp(1.0-((centerSampleDepth-sampleDepth)/centerSampleDepth),0.0,1.0);\ncomputedWeight=KERNEL_WEIGHT{X}*factor;\nsumOfWeights+=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",
    kernelBlurFragment2: "#ifdef DOF\nsampleDepth=sampleDistance(sampleCoord{X});\nfactor=clamp(1.0-((centerSampleDepth-sampleDepth)/centerSampleDepth),0.0,1.0);\ncomputedWeight=KERNEL_DEP_WEIGHT{X}*factor;\nsumOfWeights+=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",
    kernelBlurVaryingDeclaration: "varying vec2 sampleCoord{X};",
    kernelBlurVertex: "sampleCoord{X}=sampleCenter+delta*KERNEL_OFFSET{X};",
    backgroundVertexDeclaration: "uniform mat4 view;\nuniform mat4 viewProjection;\nuniform float shadowLevel;\n#ifdef DIFFUSE\nuniform mat4 diffuseMatrix;\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\nuniform mat4 reflectionMatrix;\nuniform vec3 vReflectionMicrosurfaceInfos;\nuniform float fFovMultiplier;\n#endif\n#ifdef POINTSIZE\nuniform float pointSize;\n#endif",
    backgroundFragmentDeclaration: " uniform vec4 vPrimaryColor;\nuniform vec4 vSecondaryColor;\nuniform vec4 vTertiaryColor;\nuniform float shadowLevel;\nuniform float alpha;\n#ifdef DIFFUSE\nuniform vec2 vDiffuseInfos;\n#endif\n#ifdef REFLECTION\nuniform vec2 vReflectionInfos;\nuniform mat4 reflectionMatrix;\nuniform vec3 vReflectionMicrosurfaceInfos;\n#endif\n#if defined(REFLECTIONFRESNEL) || defined(OPACITYFRESNEL)\nuniform vec3 vBackgroundCenter;\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 vReflectionControl;\n#endif\n#if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION) || defined(REFRACTION)\nuniform mat4 view;\n#endif",
    backgroundUboDeclaration: "layout(std140,column_major) uniform;\nuniform Material\n{\nuniform vec4 vPrimaryColor;\nuniform vec4 vSecondaryColor;\nuniform vec4 vTertiaryColor;\nuniform vec2 vDiffuseInfos;\nuniform vec2 vReflectionInfos;\nuniform mat4 diffuseMatrix;\nuniform mat4 reflectionMatrix;\nuniform vec3 vReflectionMicrosurfaceInfos;\nuniform float fFovMultiplier;\nuniform float pointSize;\nuniform float shadowLevel;\nuniform float alpha;\n#if defined(REFLECTIONFRESNEL) || defined(OPACITYFRESNEL)\nuniform vec3 vBackgroundCenter;\n#endif\n#ifdef REFLECTIONFRESNEL\nuniform vec4 vReflectionControl;\n#endif\n};\nuniform Scene {\nmat4 viewProjection;\nmat4 view;\n};"
}, (function(e, t) {
    var i = t();
    ("undefined" != typeof global ? global : "undefined" != typeof window ? window : this).BABYLON = i, "object" == typeof exports && "object" == typeof module ? module.exports = i : "function" == typeof define && define.amd ? define("BABYLON", t) : "object" == typeof exports ? exports.BABYLON = i : e.BABYLON = i
})(this, (function() {
    return BABYLON
}));