From 916fd7b418063558fd5f0b2c81070fa5e5148b34 Mon Sep 17 00:00:00 2001 From: lxsang Date: Sat, 19 Jun 2021 23:26:05 +0200 Subject: [PATCH] Add two more packages - libthreejs: wrapper for Threejs library - ShaderPlayground: openGL shader playground --- ShaderPlayground/README.md | 7 + ShaderPlayground/build.json | 84 ++++ ShaderPlayground/build/debug/README.md | 7 + ShaderPlayground/build/debug/glslx.js | 77 +++ ShaderPlayground/build/debug/main.css | 52 ++ ShaderPlayground/build/debug/main.js | 1 + ShaderPlayground/build/debug/package.json | 16 + ShaderPlayground/build/debug/scheme.html | 13 + .../build/release/ShaderPlayground.zip | Bin 0 -> 44449 bytes ShaderPlayground/glslx.js | 77 +++ ShaderPlayground/main.css | 52 ++ ShaderPlayground/main.ts | 469 ++++++++++++++++++ ShaderPlayground/package.json | 16 + ShaderPlayground/scheme.html | 13 + libthreejs/README.md | 12 + libthreejs/build.json | 45 ++ libthreejs/build/debug/README.md | 12 + libthreejs/build/debug/main.js | 6 + libthreejs/build/debug/package.json | 15 + libthreejs/build/release/libthreejs.zip | Bin 0 -> 151666 bytes libthreejs/main.js | 6 + libthreejs/package.json | 15 + packages.json | 20 + 23 files changed, 1015 insertions(+) create mode 100644 ShaderPlayground/README.md create mode 100644 ShaderPlayground/build.json create mode 100644 ShaderPlayground/build/debug/README.md create mode 100644 ShaderPlayground/build/debug/glslx.js create mode 100644 ShaderPlayground/build/debug/main.css create mode 100644 ShaderPlayground/build/debug/main.js create mode 100644 ShaderPlayground/build/debug/package.json create mode 100644 ShaderPlayground/build/debug/scheme.html create mode 100644 ShaderPlayground/build/release/ShaderPlayground.zip create mode 100644 ShaderPlayground/glslx.js create mode 100644 ShaderPlayground/main.css create mode 100644 ShaderPlayground/main.ts create mode 100644 ShaderPlayground/package.json create mode 100644 ShaderPlayground/scheme.html create mode 100644 libthreejs/README.md create mode 100644 libthreejs/build.json create mode 100644 libthreejs/build/debug/README.md create mode 100644 libthreejs/build/debug/main.js create mode 100644 libthreejs/build/debug/package.json create mode 100644 libthreejs/build/release/libthreejs.zip create mode 100644 libthreejs/main.js create mode 100644 libthreejs/package.json diff --git a/ShaderPlayground/README.md b/ShaderPlayground/README.md new file mode 100644 index 0000000..8b9d26f --- /dev/null +++ b/ShaderPlayground/README.md @@ -0,0 +1,7 @@ +# ShaderPlayground + +Playground for working with Open GL shader language, the sharder is rendered +with the Three.js library + +## Change logs +- v0.0.1-a: Initial version \ No newline at end of file diff --git a/ShaderPlayground/build.json b/ShaderPlayground/build.json new file mode 100644 index 0000000..dfa7ad9 --- /dev/null +++ b/ShaderPlayground/build.json @@ -0,0 +1,84 @@ +{ + "name": "ShaderPlayground", + "targets":{ + "clean": { + "jobs": [ + { + "name": "vfs-rm", + "data": ["build/debug","build/release"] + }, + { + "name": "vfs-mkdir", + "data": ["build","build/debug","build/release"] + } + ] + }, + "build": { + "require": ["ts"], + "jobs":[ + { + "name": "ts-import", + "data": ["sdk://core/ts/core.d.ts", "sdk://core/ts/jquery.d.ts","sdk://core/ts/antos.d.ts"] + }, + { + "name": "ts-compile", + "data": { + "src": ["main.ts"], + "dest": "build/debug/main.js" + } + } + ] + }, + "uglify": { + "require": ["terser"], + "jobs": [ + { + "name":"terser-uglify", + "data": ["build/debug/main.js"] + } + ] + }, + "copy": { + "jobs": [ + { + "name": "vfs-cp", + "data": { + "src": [ + "scheme.html", + "package.json", + "README.md", + "main.css", + "glslx.js" + ], + "dest":"build/debug" + } + } + ] + }, + "release": { + "depend": ["clean","build","uglify", "copy"], + "require": ["zip"], + "jobs": [ + { + "name": "zip-mk", + "data": { + "src":"build/debug", + "dest":"build/release/ShaderPlayground.zip" + } + } + ] + }, + "run": { + "jobs": [ + { + "name": "sdk-run-app", + "data": "build/debug" + } + ] + }, + "build and run": { + "depend": ["clean", "build", "copy", "run"], + "jobs": [] + } + } +} \ No newline at end of file diff --git a/ShaderPlayground/build/debug/README.md b/ShaderPlayground/build/debug/README.md new file mode 100644 index 0000000..8b9d26f --- /dev/null +++ b/ShaderPlayground/build/debug/README.md @@ -0,0 +1,7 @@ +# ShaderPlayground + +Playground for working with Open GL shader language, the sharder is rendered +with the Three.js library + +## Change logs +- v0.0.1-a: Initial version \ No newline at end of file diff --git a/ShaderPlayground/build/debug/glslx.js b/ShaderPlayground/build/debug/glslx.js new file mode 100644 index 0000000..5767934 --- /dev/null +++ b/ShaderPlayground/build/debug/glslx.js @@ -0,0 +1,77 @@ +(function(){var ah=Object.create||function(a){return{__proto__:a}};function ph(a,b){a.prototype=ah(b.prototype),a.prototype.constructor=a}var qh=Math.imul||function(a,b){return (a*(b>>>16)<<16)+a*(b&65535)|0};var Xe;function rh(a){return typeof a==='string'}function sh(a){return a===null?a:a+''}function Ue(c,a,b){return c.a=a,c.b=b,c.c=a.length,c}function Ve(c){if(c.b>=c.c)return-1;var a=c.a.charCodeAt((c.b=c.b+1|0)-1|0);if(a&64512^55296)return a;if(c.b>=c.c)return-1;var b=c.a.charCodeAt((c.b=c.b+1|0)-1|0);return ((a<<10)+b|0)-56613888|0}function sc(a){return a.c=a.c+1|0,a.c}function Sc(p,a){switch(a){case 0:var b={};return Array.from(p.b.keys()).forEach(function(c){b[c]=p.b.get(c)}),JSON.stringify({shaders:p.a?p.a.map(function(d){return{name:d.a,contents:d.b}}):null,renaming:b},null,2)+'\n';case 1:if(p.a){for(var e='',C=0,B=p.a,U=B.length;C',"\nimport {\n // The variable `gl_Position` is available only in the vertex language and is intended for writing the\n // homogeneous vertex position. This value will be used by primitive assembly, clipping, culling, and other\n // fixed functionality operations that operate on primitives after vertex processing has occurred.\n //\n // All executions of a well-formed vertex shader should write a value into this variable. It can be\n // written at any time during shader execution. It may also be read back by the shader after being written.\n // Compilers may generate a diagnostic message if they detect `gl_Position` is not written, or read before\n // being written, but not all such cases are detectable. The value of `gl_Position` is undefined if a vertex\n // shader is executed and does not write `gl_Position`.\n highp vec4 gl_Position;\n\n // The variable `gl_PointSize` is available only in the vertex language and is intended for\n // a vertex shader to write the size of the point to be rasterized. It is measured in pixels.\n mediump float gl_PointSize;\n\n const int gl_MaxVertexAttribs;\n const int gl_MaxVertexUniformVectors;\n const int gl_MaxVaryingVectors;\n const int gl_MaxVertexTextureImageUnits;\n const int gl_MaxCombinedTextureImageUnits;\n const int gl_MaxTextureImageUnits;\n const int gl_MaxFragmentUniformVectors;\n const int gl_MaxDrawBuffers;\n\n // The fragment shader has access to the read-only built-in variable `gl_FrontFacing` whose value is `true` if\n // the fragment belongs to a front-facing primitive. One use of this is to emulate two-sided lighting by\n // selecting one of two colors calculated by the vertex shader.\n const bool gl_FrontFacing;\n\n // The fragment shader has access to the read-only built-in variable `gl_PointCoord`. The values in\n // `gl_PointCoord` are two-dimensional coordinates indicating where within a point primitive the current\n // fragment is located. They range from 0.0 to 1.0 across the point. If the current primitive is not a\n // point, then the values read from `gl_PointCoord` are undefined.\n const mediump vec2 gl_PointCoord;\n\n // The variable `gl_FragCoord` is available as a read-only variable from within fragment shaders and it holds\n // the window relative coordinates `x`, `y`, `z`, and `1/w` values for the fragment. This value is the result\n // of the fixed functionality that interpolates primitives after vertex processing to generate fragments. The `z`\n // component is the depth value that will be used for the fragment's depth.\n const mediump vec4 gl_FragCoord;\n\n // Writing to `gl_FragColor` specifies the fragment color that will be used by the subsequent fixed\n // functionality pipeline.\n //\n // If subsequent fixed functionality consumes fragment color and an execution of a fragment shader\n // does not write a value to `gl_FragColor` then the fragment color consumed is undefined.\n mediump vec4 gl_FragColor;\n\n // The variable `gl_FragData` is an array. Writing to `gl_FragData[n]` specifies the fragment data that will be\n // used by the subsequent fixed functionality pipeline for data `n`.\n //\n // If subsequent fixed functionality consumes fragment data and an execution of a fragment shader does not write\n // a value to it, then the fragment data consumed is undefined.\n mediump vec4 gl_FragData[gl_MaxDrawBuffers];\n\n // Depth range in window coordinates\n struct gl_DepthRangeParameters {\n float near;\n float far;\n // Equal to `far - near`\n float diff;\n };\n\n uniform gl_DepthRangeParameters gl_DepthRange;\n\n ////////////////////////////////////////////////////////////////////////////////\n // Angle and Trigonometry Functions\n\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n float radians(float degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec2 radians(vec2 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec3 radians(vec3 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec4 radians(vec4 degrees);\n\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n float degrees(float radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec2 degrees(vec2 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec3 degrees(vec3 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec4 degrees(vec4 radians);\n\n // The standard trigonometric sine function.\n float sin(float angle);\n // The standard trigonometric sine function.\n vec2 sin(vec2 angle);\n // The standard trigonometric sine function.\n vec3 sin(vec3 angle);\n // The standard trigonometric sine function.\n vec4 sin(vec4 angle);\n\n // The standard trigonometric cosine function.\n float cos(float angle);\n // The standard trigonometric cosine function.\n vec2 cos(vec2 angle);\n // The standard trigonometric cosine function.\n vec3 cos(vec3 angle);\n // The standard trigonometric cosine function.\n vec4 cos(vec4 angle);\n\n // The standard trigonometric tangent.\n float tan(float angle);\n // The standard trigonometric tangent.\n vec2 tan(vec2 angle);\n // The standard trigonometric tangent.\n vec3 tan(vec3 angle);\n // The standard trigonometric tangent.\n vec4 tan(vec4 angle);\n\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n float asin(float x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec2 asin(vec2 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec3 asin(vec3 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec4 asin(vec4 x);\n\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n float acos(float x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec2 acos(vec2 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec3 acos(vec3 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec4 acos(vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n float atan(float y, float x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec2 atan(vec2 y, vec2 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec3 atan(vec3 y, vec3 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec4 atan(vec4 y, vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n float atan(float y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec2 atan(vec2 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec3 atan(vec3 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec4 atan(vec4 y_over_x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Exponential Functions\n\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n float pow(float x, float y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec2 pow(vec2 x, vec2 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec3 pow(vec3 x, vec3 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec4 pow(vec4 x, vec4 y);\n\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n float exp(float x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec2 exp(vec2 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec3 exp(vec3 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec4 exp(vec4 x);\n\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n float log(float x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec2 log(vec2 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec3 log(vec3 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec4 log(vec4 x);\n\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n float exp2(float x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec2 exp2(vec2 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec3 exp2(vec3 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec4 exp2(vec4 x);\n\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n float log2(float x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec2 log2(vec2 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec3 log2(vec3 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec4 log2(vec4 x);\n\n // Returns `√x`. Results are undefined if `x < 0`.\n float sqrt(float x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec2 sqrt(vec2 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec3 sqrt(vec3 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec4 sqrt(vec4 x);\n\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n float inversesqrt(float x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec2 inversesqrt(vec2 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec3 inversesqrt(vec3 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec4 inversesqrt(vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Common Functions\n\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n float abs(float x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec2 abs(vec2 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec3 abs(vec3 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec4 abs(vec4 x);\n\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n float sign(float x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec2 sign(vec2 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec3 sign(vec3 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec4 sign(vec4 x);\n\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n float floor(float x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec2 floor(vec2 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec3 floor(vec3 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec4 floor(vec4 x);\n\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n float ceil(float x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec2 ceil(vec2 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec3 ceil(vec3 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec4 ceil(vec4 x);\n\n // Returns `x - floor(x)`\n float fract(float x);\n // Returns `x - floor(x)`\n vec2 fract(vec2 x);\n // Returns `x - floor(x)`\n vec3 fract(vec3 x);\n // Returns `x - floor(x)`\n vec4 fract(vec4 x);\n\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n float mod(float x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, float y);\n\n // Modulus. Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, vec2 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, vec3 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, vec4 y);\n\n // Returns `y` if `y < x`, otherwise it returns `x`\n float min(float x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, vec2 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, vec3 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, vec4 y);\n\n // Returns `y` if `x < y`, otherwise it returns `x`\n float max(float x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, vec2 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, vec3 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, vec4 y);\n\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n float clamp(float x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);\n\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n float mix(float x, float y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, vec2 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, vec3 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, vec4 a);\n\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n float step(float edge, float x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(float edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(vec2 edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(float edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(vec3 edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(float edge, vec4 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(vec4 edge, vec4 x);\n\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n float smoothstep(float edge0, float edge1, float x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(float edge0, float edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(float edge0, float edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(float edge0, float edge1, vec4 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Geometric Functions\n\n // Returns the length of vector `x`, i.e. `√x²`\n float length(float x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]²`\n float length(vec2 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]²`\n float length(vec3 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]² + x[3]²`\n float length(vec4 x);\n\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(float p0, float p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec2 p0, vec2 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec3 p0, vec3 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec4 p0, vec4 p1);\n\n // Returns the dot product of `x` and `y`, i.e. `x*y`\n float dot(float x, float y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1]`\n float dot(vec2 x, vec2 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2]`\n float dot(vec3 x, vec3 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2] + x[3]*y[3]`\n float dot(vec4 x, vec4 y);\n\n // Returns the cross product of `x` and `y`, i.e.\n //\n // ```glslx\n // vec3(\n // x[1]*y[2] - y[1]*x[2],\n // x[2]*y[0] - y[2]*x[0],\n // x[0]*y[1] - y[0]*x[1])\n // ```\n vec3 cross(vec3 x, vec3 y);\n\n // Returns a vector in the same direction as `x` but with a length of 1.\n float normalize(float x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec2 normalize(vec2 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec3 normalize(vec3 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec4 normalize(vec4 x);\n\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n float faceforward(float N, float I, float Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec2 faceforward(vec2 N, vec2 I, vec2 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec3 faceforward(vec3 N, vec3 I, vec3 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec4 faceforward(vec4 N, vec4 I, vec4 Nref);\n\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n float reflect(float I, float N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec2 reflect(vec2 I, vec2 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec3 reflect(vec3 I, vec3 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec4 reflect(vec4 I, vec4 N);\n\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return float(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n float refract(float I, float N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec2(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec2 refract(vec2 I, vec2 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec3(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec3 refract(vec3 I, vec3 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec4(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec4 refract(vec4 I, vec4 N, float eta);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Matrix Functions\n\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat2 matrixCompMult(mat2 x, mat2 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat3 matrixCompMult(mat3 x, mat3 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat4 matrixCompMult(mat4 x, mat4 y);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Vector Relational Functions\n\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(vec2 x, vec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(vec3 x, vec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(vec4 x, vec4 y);\n\n // Returns true if any component of `x` is `true`.\n bool any(bvec2 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec3 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec4 x);\n\n // Returns true only if all components of `x` are `true`.\n bool all(bvec2 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec3 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec4 x);\n\n // Returns the component-wise logical complement of `x`.\n bvec2 not(bvec2 x);\n // Returns the component-wise logical complement of `x`.\n bvec3 not(bvec3 x);\n // Returns the component-wise logical complement of `x`.\n bvec4 not(bvec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Texture Lookup Functions\n\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);\n\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);\n\n #extension GL_OES_standard_derivatives {\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdx(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdx(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdx(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdx(vec4 v);\n\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdy(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdy(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdy(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdy(vec4 v);\n\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n float fwidth(float v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec2 fwidth(vec2 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec3 fwidth(vec3 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec4 fwidth(vec4 v);\n }\n\n #extension GL_EXT_frag_depth {\n // Available only in the fragment language, `gl_FragDepthEXT` is an output variable that is used to establish the depth value for the current fragment.\n // If depth buffering is enabled and no shader writes to `gl_FragDepthEXT`, then the fixed function value for depth will be used (this value is contained\n // in the `z` component of `gl_FragCoord`) otherwise, the value written to `gl_FragDepthEXT` is used.\n //\n // If a shader statically assigns to `gl_FragDepthEXT`, then the value of the fragment's depth may be undefined for executions of the shader that take\n // that path. That is, if the set of linked fragment shaders statically contain a write to `gl_FragDepthEXT`, then it is responsible for always writing it.\n float gl_FragDepthEXT;\n }\n\n #extension GL_EXT_shader_texture_lod {\n vec4 texture2DGradEXT(sampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DLodEXT(sampler2D sampler, vec2 coord, float lod);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec3 coord, float lod);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec4 coord, float lod);\n vec4 textureCubeGradEXT(samplerCube sampler, vec3 P, vec3 dPdx, vec3 dPdy);\n vec4 textureCubeLodEXT(samplerCube sampler, vec3 coord, float lod);\n }\n}\n")); +for(var o=0,k=b.length;o',"\nimport {\n // The variable `gl_Position` is available only in the vertex language and is intended for writing the\n // homogeneous vertex position. This value will be used by primitive assembly, clipping, culling, and other\n // fixed functionality operations that operate on primitives after vertex processing has occurred.\n //\n // All executions of a well-formed vertex shader should write a value into this variable. It can be\n // written at any time during shader execution. It may also be read back by the shader after being written.\n // Compilers may generate a diagnostic message if they detect `gl_Position` is not written, or read before\n // being written, but not all such cases are detectable. The value of `gl_Position` is undefined if a vertex\n // shader is executed and does not write `gl_Position`.\n highp vec4 gl_Position;\n\n // The variable `gl_PointSize` is available only in the vertex language and is intended for\n // a vertex shader to write the size of the point to be rasterized. It is measured in pixels.\n mediump float gl_PointSize;\n\n const int gl_MaxVertexAttribs;\n const int gl_MaxVertexUniformVectors;\n const int gl_MaxVaryingVectors;\n const int gl_MaxVertexTextureImageUnits;\n const int gl_MaxCombinedTextureImageUnits;\n const int gl_MaxTextureImageUnits;\n const int gl_MaxFragmentUniformVectors;\n const int gl_MaxDrawBuffers;\n\n // The fragment shader has access to the read-only built-in variable `gl_FrontFacing` whose value is `true` if\n // the fragment belongs to a front-facing primitive. One use of this is to emulate two-sided lighting by\n // selecting one of two colors calculated by the vertex shader.\n const bool gl_FrontFacing;\n\n // The fragment shader has access to the read-only built-in variable `gl_PointCoord`. The values in\n // `gl_PointCoord` are two-dimensional coordinates indicating where within a point primitive the current\n // fragment is located. They range from 0.0 to 1.0 across the point. If the current primitive is not a\n // point, then the values read from `gl_PointCoord` are undefined.\n const mediump vec2 gl_PointCoord;\n\n // The variable `gl_FragCoord` is available as a read-only variable from within fragment shaders and it holds\n // the window relative coordinates `x`, `y`, `z`, and `1/w` values for the fragment. This value is the result\n // of the fixed functionality that interpolates primitives after vertex processing to generate fragments. The `z`\n // component is the depth value that will be used for the fragment's depth.\n const mediump vec4 gl_FragCoord;\n\n // Writing to `gl_FragColor` specifies the fragment color that will be used by the subsequent fixed\n // functionality pipeline.\n //\n // If subsequent fixed functionality consumes fragment color and an execution of a fragment shader\n // does not write a value to `gl_FragColor` then the fragment color consumed is undefined.\n mediump vec4 gl_FragColor;\n\n // The variable `gl_FragData` is an array. Writing to `gl_FragData[n]` specifies the fragment data that will be\n // used by the subsequent fixed functionality pipeline for data `n`.\n //\n // If subsequent fixed functionality consumes fragment data and an execution of a fragment shader does not write\n // a value to it, then the fragment data consumed is undefined.\n mediump vec4 gl_FragData[gl_MaxDrawBuffers];\n\n // Depth range in window coordinates\n struct gl_DepthRangeParameters {\n float near;\n float far;\n // Equal to `far - near`\n float diff;\n };\n\n uniform gl_DepthRangeParameters gl_DepthRange;\n\n ////////////////////////////////////////////////////////////////////////////////\n // Angle and Trigonometry Functions\n\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n float radians(float degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec2 radians(vec2 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec3 radians(vec3 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec4 radians(vec4 degrees);\n\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n float degrees(float radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec2 degrees(vec2 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec3 degrees(vec3 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec4 degrees(vec4 radians);\n\n // The standard trigonometric sine function.\n float sin(float angle);\n // The standard trigonometric sine function.\n vec2 sin(vec2 angle);\n // The standard trigonometric sine function.\n vec3 sin(vec3 angle);\n // The standard trigonometric sine function.\n vec4 sin(vec4 angle);\n\n // The standard trigonometric cosine function.\n float cos(float angle);\n // The standard trigonometric cosine function.\n vec2 cos(vec2 angle);\n // The standard trigonometric cosine function.\n vec3 cos(vec3 angle);\n // The standard trigonometric cosine function.\n vec4 cos(vec4 angle);\n\n // The standard trigonometric tangent.\n float tan(float angle);\n // The standard trigonometric tangent.\n vec2 tan(vec2 angle);\n // The standard trigonometric tangent.\n vec3 tan(vec3 angle);\n // The standard trigonometric tangent.\n vec4 tan(vec4 angle);\n\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n float asin(float x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec2 asin(vec2 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec3 asin(vec3 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec4 asin(vec4 x);\n\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n float acos(float x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec2 acos(vec2 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec3 acos(vec3 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec4 acos(vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n float atan(float y, float x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec2 atan(vec2 y, vec2 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec3 atan(vec3 y, vec3 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec4 atan(vec4 y, vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n float atan(float y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec2 atan(vec2 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec3 atan(vec3 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec4 atan(vec4 y_over_x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Exponential Functions\n\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n float pow(float x, float y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec2 pow(vec2 x, vec2 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec3 pow(vec3 x, vec3 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec4 pow(vec4 x, vec4 y);\n\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n float exp(float x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec2 exp(vec2 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec3 exp(vec3 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec4 exp(vec4 x);\n\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n float log(float x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec2 log(vec2 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec3 log(vec3 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec4 log(vec4 x);\n\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n float exp2(float x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec2 exp2(vec2 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec3 exp2(vec3 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec4 exp2(vec4 x);\n\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n float log2(float x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec2 log2(vec2 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec3 log2(vec3 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec4 log2(vec4 x);\n\n // Returns `√x`. Results are undefined if `x < 0`.\n float sqrt(float x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec2 sqrt(vec2 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec3 sqrt(vec3 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec4 sqrt(vec4 x);\n\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n float inversesqrt(float x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec2 inversesqrt(vec2 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec3 inversesqrt(vec3 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec4 inversesqrt(vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Common Functions\n\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n float abs(float x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec2 abs(vec2 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec3 abs(vec3 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec4 abs(vec4 x);\n\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n float sign(float x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec2 sign(vec2 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec3 sign(vec3 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec4 sign(vec4 x);\n\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n float floor(float x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec2 floor(vec2 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec3 floor(vec3 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec4 floor(vec4 x);\n\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n float ceil(float x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec2 ceil(vec2 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec3 ceil(vec3 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec4 ceil(vec4 x);\n\n // Returns `x - floor(x)`\n float fract(float x);\n // Returns `x - floor(x)`\n vec2 fract(vec2 x);\n // Returns `x - floor(x)`\n vec3 fract(vec3 x);\n // Returns `x - floor(x)`\n vec4 fract(vec4 x);\n\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n float mod(float x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, float y);\n\n // Modulus. Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, vec2 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, vec3 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, vec4 y);\n\n // Returns `y` if `y < x`, otherwise it returns `x`\n float min(float x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, vec2 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, vec3 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, vec4 y);\n\n // Returns `y` if `x < y`, otherwise it returns `x`\n float max(float x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, vec2 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, vec3 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, vec4 y);\n\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n float clamp(float x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);\n\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n float mix(float x, float y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, vec2 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, vec3 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, vec4 a);\n\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n float step(float edge, float x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(float edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(vec2 edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(float edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(vec3 edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(float edge, vec4 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(vec4 edge, vec4 x);\n\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n float smoothstep(float edge0, float edge1, float x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(float edge0, float edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(float edge0, float edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(float edge0, float edge1, vec4 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Geometric Functions\n\n // Returns the length of vector `x`, i.e. `√x²`\n float length(float x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]²`\n float length(vec2 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]²`\n float length(vec3 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]² + x[3]²`\n float length(vec4 x);\n\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(float p0, float p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec2 p0, vec2 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec3 p0, vec3 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec4 p0, vec4 p1);\n\n // Returns the dot product of `x` and `y`, i.e. `x*y`\n float dot(float x, float y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1]`\n float dot(vec2 x, vec2 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2]`\n float dot(vec3 x, vec3 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2] + x[3]*y[3]`\n float dot(vec4 x, vec4 y);\n\n // Returns the cross product of `x` and `y`, i.e.\n //\n // ```glslx\n // vec3(\n // x[1]*y[2] - y[1]*x[2],\n // x[2]*y[0] - y[2]*x[0],\n // x[0]*y[1] - y[0]*x[1])\n // ```\n vec3 cross(vec3 x, vec3 y);\n\n // Returns a vector in the same direction as `x` but with a length of 1.\n float normalize(float x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec2 normalize(vec2 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec3 normalize(vec3 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec4 normalize(vec4 x);\n\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n float faceforward(float N, float I, float Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec2 faceforward(vec2 N, vec2 I, vec2 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec3 faceforward(vec3 N, vec3 I, vec3 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec4 faceforward(vec4 N, vec4 I, vec4 Nref);\n\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n float reflect(float I, float N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec2 reflect(vec2 I, vec2 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec3 reflect(vec3 I, vec3 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec4 reflect(vec4 I, vec4 N);\n\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return float(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n float refract(float I, float N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec2(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec2 refract(vec2 I, vec2 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec3(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec3 refract(vec3 I, vec3 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec4(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec4 refract(vec4 I, vec4 N, float eta);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Matrix Functions\n\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat2 matrixCompMult(mat2 x, mat2 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat3 matrixCompMult(mat3 x, mat3 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat4 matrixCompMult(mat4 x, mat4 y);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Vector Relational Functions\n\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(vec2 x, vec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(vec3 x, vec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(vec4 x, vec4 y);\n\n // Returns true if any component of `x` is `true`.\n bool any(bvec2 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec3 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec4 x);\n\n // Returns true only if all components of `x` are `true`.\n bool all(bvec2 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec3 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec4 x);\n\n // Returns the component-wise logical complement of `x`.\n bvec2 not(bvec2 x);\n // Returns the component-wise logical complement of `x`.\n bvec3 not(bvec3 x);\n // Returns the component-wise logical complement of `x`.\n bvec4 not(bvec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Texture Lookup Functions\n\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);\n\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);\n\n #extension GL_OES_standard_derivatives {\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdx(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdx(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdx(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdx(vec4 v);\n\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdy(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdy(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdy(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdy(vec4 v);\n\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n float fwidth(float v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec2 fwidth(vec2 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec3 fwidth(vec3 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec4 fwidth(vec4 v);\n }\n\n #extension GL_EXT_frag_depth {\n // Available only in the fragment language, `gl_FragDepthEXT` is an output variable that is used to establish the depth value for the current fragment.\n // If depth buffering is enabled and no shader writes to `gl_FragDepthEXT`, then the fixed function value for depth will be used (this value is contained\n // in the `z` component of `gl_FragCoord`) otherwise, the value written to `gl_FragDepthEXT` is used.\n //\n // If a shader statically assigns to `gl_FragDepthEXT`, then the value of the fragment's depth may be undefined for executions of the shader that take\n // that path. That is, if the set of linked fragment shaders statically contain a write to `gl_FragDepthEXT`, then it is responsible for always writing it.\n float gl_FragDepthEXT;\n }\n\n #extension GL_EXT_shader_texture_lod {\n vec4 texture2DGradEXT(sampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DLodEXT(sampler2D sampler, vec2 coord, float lod);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec3 coord, float lod);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec4 coord, float lod);\n vec4 textureCubeGradEXT(samplerCube sampler, vec3 P, vec3 dPdx, vec3 dPdy);\n vec4 textureCubeLodEXT(samplerCube sampler, vec3 coord, float lod);\n }\n}\n")); +for(var Q=0,ia=b.length;Q',a,b,10);break;case 42:V(c,'>=',a,b,10);break;case 44:V(c,'<',a,b,10);break;case 45:V(c,'<=',a,b,10);break;case 46:V(c,'&&',a,b,5);break;case 47:V(c,'||',a,b,3);break;case 48:V(c,'^^',a,b,4);break;case 49:V(c,'*',a,b,13);break;case 50:V(c,'!=',a,b,10);break;case 51:V(c,'-',a,b,12); +break;case 52:V(c,'=',a,b,2);break;case 53:V(c,'+=',a,b,2);break;case 54:V(c,'/=',a,b,2);break;case 55:V(c,'*=',a,b,2);break;case 56:V(c,'-=',a,b,2);break;default:c.a+=Sg[a.b];break}}function _b(f,a,b,c){var d=b.g,e=d.b;f.a+=a,(a.charCodeAt(0)==45&&(e==31||e==34||Wf(d))||a.charCodeAt(0)==43&&(e==33||e==35))&&(f.a+=' '),I(f,d,14)}function Nd(d,a,b,c){I(d,b.g,15),d.a+=a}function V(f,a,b,c,d){var e=Bc(b.b);dZ});case 42:return tc(a,function($,ca){return $>=ca});case 44:return tc(a,function(ua,aa){return ua2&&(d=2),Yb(c,d)}function tf(a,b,c){switch(c){case 48:switch(b){case 65:return!0;case 96:return!1}break;case 47:switch(b){case 62:return!0;case 96:return!1}break;case 65:if(b==65)return!0;break;case 62:if(b==62)return!0;break;case 85:if(ud(b)||b==88)return!1;break;case 84:if(ud(b)||b==88)return!1;break;case 81:case 90:case 89:case 88:case 82:return!1;case 87:if(b==83)return!1;break}switch(b){case 85:case 84:case 82:case 49:case 46:return!1;case 65:case 62:switch(a){case 99:case 85:case 84:case 81:case 80:case 90:case 49:case 46:case 32:case 12:return!1}if(Fg(a))return!1;break;case 48:case 47:if(c==96)return!1;break}return!0}function uc(a){return a==10||a==13}function uf(a){for(var b=0,c=a.length;b0&&!uc(b.charCodeAt(g-1|0));)g=g-1|0;for(var i=b.slice(g),o=i,C=0,B=e.slice(1),U=B.length;C',a),h=Jc(e,f,1);if(e.c)return a;var m='',l=99,g=99,i=0,o=0,k=!0,r=0,s=null,w=function(p){return!vc(a.slice(h[p-1|0].a.c,h[p].a.b))},C=function(B,U){switch(B){case 90:case 87: +return!0;case 4:case 9:case 10:case 11:case 12:case 15:case 17:case 32:case 43:return!U}return!1},F=null,Q=function(){for(var ia=1,M=r;M0;s=s-1|0){for(var w=[],Va=0,wa=k,xa=wa.length;Va=s&&w.push(p)}if(w.length){k=w;break}}if(k.length>1){var C=k.slice();Ab(C,function(B){for(var U=l[B].i,F=0,eb=Math.min(U.length,h.length);F-1){c+=' {\n';for(var i=0,o=b.g,k=o.length;id&&c.charCodeAt(e-1|0)==32;)e=e-1|0;b!=''&&(b+='\n'), +b+=c.slice(d,e)}return b}function $d(a,b,c){if(!b)return a+': '+c+'\n';var d=ld(b,0);return kd(b)+': '+a+': '+c+'\n'+d.a+'\n'+d.b+'\n'}function Ff(c){for(var a=new nh,d=0,e=c.a,f=e.length;d1&&a.charCodeAt(0)==48&&a.charCodeAt(1)^120&&a.charCodeAt(1)^88?parseInt(a,8):a|0}function Yf(){var a=new Oh,b=function(c,d,e){return ae(c.a,d.a),v(t(new Jh(27),K),_a(d.a,e.c))},f=function(h,m,l,g){return ae(h.a,l.a),v(t(new Jh(27),K),_a(m.c,g.c))};return P(a,36,function(i,o){return v(t(Ba(new Jh(28),!0),Y),o.a)}),P(a,13,function(k,r){return v(t(Ba(new Jh(28),!1),Y),r.a)}),P(a,97,function(s,w){return v(t(_(new Jh(30),Xf(L(w.a))),ga),w.a)}),P(a,95,function(p,C){return v(t(ma(new Jh(29),+L(C.a)),da),C.a)}),P(a,3,ba(Y)),P(a,5,ba(Lb)),P(a,6,ba(Mb)),P(a,7,ba(Nb)),P(a,14,ba(da)),P(a,20,ba(ga)),P(a,22,ba(vb)),P(a,23,ba(wb)),P(a,24,ba(xb)),P(a,26,ba(ob)),P(a,27,ba(pb)),P(a,28,ba(qb)),P(a,39,ba(Fa)),P(a,40,ba(Ga)),P(a,41,ba(Ha)),P(a,42,ba(yd)),Ib(a,46,14,b),Ib(a,47,14,ec(34)), +Ib(a,48,14,ec(35)),Ib(a,62,14,ec(31)),Ib(a,49,14,ec(32)),Ib(a,65,14,ec(33)),ve(a,47,15,me(36)),ve(a,48,15,me(37)),R(a,53,13,W(39)),R(a,54,10,W(40)),R(a,55,10,W(41)),R(a,56,10,W(42)),R(a,57,10,W(44)),R(a,58,10,W(45)),R(a,62,12,W(51)),R(a,63,13,W(49)),R(a,64,10,W(50)),R(a,65,12,W(38)),R(a,66,13,f),R(a,67,11,f),R(a,68,11,f),R(a,60,3,W(47)),R(a,61,4,W(48)),R(a,59,5,W(46)),R(a,50,8,f),R(a,51,6,f),R(a,52,7,f),ta(a,69,2,W(52)),ta(a,70,2,W(53)),ta(a,71,2,f),ta(a,72,2,f),ta(a,73,2,f),ta(a,74,2,W(54)),ta(a,75,2,W(55)),ta(a,76,2,f),ta(a,77,2,f),ta(a,78,2,f),ta(a,79,2,W(56)),P(a,96,function(B,U){var F=L(U.a),Q=pd(B.l,F);return Q?(Q.m!=null&&ya(B.c.a,Q.m,0)==1&&u(B.a,U.a,'Cannot use "'+F+'" from disabled extension "'+Q.m+'"'),v(Q instanceof Tb?t(new Jh(26),J(Q)):Cc(new Jh(23),Q),U.a)):(Jf(B.a,U.a),v(t(new Jh(24),K),U.a))}),R(a,81,1,function(ia,M,ha,Z){return M.b^25&&(M=v(n(new Jh(25),M),M.c)),n(M,Z),v(M,A(ia,M.c))}),Da(a,82,16).c=function($,ca){var ua=y($).a;E($);var aa=y($).a;return z($,96)?Qa(v(cc(n(new Jh(21),ca),L(aa)), +A($,ca.c)),aa):Qa(v(cc(n(new Jh(21),ca),''),A($,ca.c)),xe(ua))},Da(a,85,0).b=function(ka){var va=E(ka),Ua=T(a,ka,0);return !Ua||!z(ka,89)?v(t(new Jh(24),K),A(ka,va.a)):v(Ua,A(ka,va.a))},Da(a,85,15).c=function(la,rb){var La=E(la),Va=n(new Jh(20),rb);return Zf(la,Va,89)?Qa(v(Va,A(la,rb.c)),A(la,La.a)):v(t(new Jh(24),K),A(la,La.a))},Da(a,84,16).c=function(wa,xa){var eb=E(wa);if(y(wa).b==88)return Gb(wa),E(wa),v(t(new Jh(24),K),A(wa,eb.a));var Ia=T(a,wa,0);return !Ia||!z(wa,88)?v(t(new Jh(24),K),A(wa,eb.a)):Qa(v(n(n(new Jh(43),xa),Ia),A(wa,xa.c)),A(wa,eb.a))},Da(a,86,2).c=function(Ja,fb){var sb=E(Ja),tb=T(a,Ja,1);if(!tb||!z(Ja,80))return v(t(new Jh(24),K),A(Ja,sb.a));var bb=T(a,Ja,1);return bb?v(n(n(n(new Jh(22),fb),tb),bb),A(Ja,fb.c)):v(t(new Jh(24),K),A(Ja,sb.a))},a}function Zf(a,b,c){for(var d=!0;!O(a,c);){d||z(a,81);var e=y(a),f=T(db,a,1);if(f)n(b,f);else if(n(b,v(t(new Jh(24),K),A(a,e.a))),y(a).b^81&&y(a).b^c)return!1;d=!1}return!0}function _f(a){var b=E(a);a.l=new Vh(3,a.l);var c=Za(a,2);if(!c||!z(a,43)||!z(a, +85))return null;var d=T(db,a,0);return !d||!z(a,89)?null:(Hb(a),Eb(a,b.a,n(n(new Jh(7),c),d)))}function $f(a){var b=E(a),c=a.h;if(a.h|=b.b^44?2048:1024,O(a,83)){var d=new Jh(13);return !fc(a,d,1)||!z(a,87)?null:(a.h=c,v(d,A(a,b.a)))}var e=Za(a,1);return e&&(a.h=c,e)}function bg(a){var b=E(a),c=y(a).a;if(!z(a,96))return null;var d=L(c);if(O(a,83)){a.c.a.has(d)||Na(a.c.a,d,0);var e=new Jh(13);if(!fc(a,e,1)||!z(a,87))return null;for(var f=e.g;f;f=f.k)if(f.b^17)f.e&&(f.e.m=d);else for(var h=f.g.k;h;h=h.k)h.e.m=d;return v(e,A(a,b.a))}if(!bh.has(d)&&!a.c.a.has(d)&&Gf(a.a,c,'The extension "'+d+'" is not in the known list of valid WebGL extensions'),!z(a,80))return null;var m=L(y(a).a);if(!ag.has(m))return Gb(a),null;E(a);var l=ag.get(m);return Na(a.c.a,d,l),Qa(v(_(cc(new Jh(9),d),l),A(a,b.a)),c)}function cg(a){var b=E(a);if(a.l=new Vh(3,a.l),!z(a,85))return null;var c=null;if(!O(a,90)){var d=pe(a),e=hd(a,2),f=null;if(e){if(f=Fb(a,1),!f)return null}else f=Fb(a,0);if(f){if(c=oe(a,b.a,e,f,0,d),!c)return null}else if((c=T(db, +a,0),!c)||!z(a,90))return null}var h=null;if(!O(a,90)&&((h=T(db,a,0),!h)||!z(a,90)))return null;var m=null;if(!O(a,89)&&((m=T(db,a,0),!m)||!z(a,89)))return null;var l=Za(a,2);return l&&(Hb(a),v(ke(c,h,m,l),A(a,b.a)))}function dg(a){var b=E(a);if(!z(a,85))return null;var c=y(a),d=T(db,a,0);if(d||(d=v(t(new Jh(24),K),A(a,c.a))),!z(a,89))return null;var e=Za(a,2);if(!e)return null;var f=null;return O(a,12)&&(f=Za(a,2),!f)?null:v(n(n(n(new Jh(12),d),e),f),A(a,b.a))}function eg(a){var b=E(a),c=y(a).a;return z(a,97)?v(_(new Jh(18),L(c)|0),A(a,b.a)):null}function fg(a){var b=E(a);if(a.l=new Vh(3,a.l),!z(a,85))return null;var c=y(a),d=T(db,a,0);if(d||(d=v(t(new Jh(24),K),A(a,c.a))),!z(a,89))return null;var e=Za(a,2);return e&&(Hb(a),v(n(n(new Jh(19),d),e),A(a,b.a)))}function gg(a){var b=E(a),c=null;if(!O(a,90)){var d=y(a);c=T(db,a,0),c||(c=v(t(new Jh(24),K),A(a,d.a))),z(a,90)}return v(n(new Jh(15),c),A(a,b.a))}function hg(a){var b=E(a),c=0;switch(y(a).b){case 25:c=32;break;case 29:c=64;break;case 16:c=4;break;default: +return Gb(a),null}E(a);var d=Fb(a,1);return d&&Eb(a,b.a,n(_(new Jh(14),c),d))}function ig(a,b,c){var d=y(a).a;if(!z(a,96))return null;var e=new Tb(sc(a.c),d,L(d),new Vh(4,a.l));if(e.e|=a.h|b,e.f=c,!id(a,e))return null;var f=y(a).a,h=new Jh(1),m=null;if(!z(a,83))return null;for(a.l=e.d;y(a).b^87&&y(a).b^99;){var l=Za(a,3);if(!l)return null;if(l.b^17)u(a.a,l.c,'This statement cannot be used inside a struct');else{n(h,l);for(var g=l.g.k;g;g=g.k){var i=g.e;e.g.push(i),N(i)&&u(a.a,N(i).c,'Cannot initialize struct variables')}}}if(Hb(a),!z(a,87))return null;if(v(h,A(a,f)),y(a).b^96)z(a,90);else if(m=te(0,t(new Jh(26),J(e)),E(a).a,a,c),!m)return null;return n(n(Cc(new Jh(16),e),h),m)}function ne(a,b,c){for(var d=!1,e=a.l;e;e=e.b)if(e.a==3){d=!0;break}return d||u(a.a,b,'This statement cannot be used outside a loop'),Eb(a,b,c)}function Eb(a,b,c){return z(a,90),v(c,A(a,b))}function oe(a,b,c,d,e,f){var h=y(a).a;if(!c&&y(a).b^96){var m=ue(db,a,0,d);return m&&Eb(a,b,n(new Jh(8),m))}if(!z(a,96))return null;if(O(a,85))return kg(c, +d,h,a,f);var l=te(c,d,h,a,f);return l&&v(l,A(a,b))}function pe(a){var b=y(a),c=b.c;if(!c)return null;for(var d=b.a.b,e=null,f=c.length-1|0;f>-1;f=f-1|0){for(var h=c[f],m=h.a.b.slice(h.c,d),l=0,g=0;g1)break;(e||(e=[])).push(L(h)),d=h.b}return e&&e.reverse(),e}function Za(a,b){var c=y(a);switch(c.b){case 4:return ne(a,E(a).a,new Jh(4));case 9:return ne(a,E(a).a,new Jh(5));case 10:return Eb(a,E(a).a,new Jh(6));case 11:return _f(a);case 44:case 45:return $f(a);case 91:return bg(a);case 15:return cg(a);case 17:return dg(a);case 83:return re(a);case 31:return hg(a);case 32:return gg(a);case 90:return v(new Jh(3),E(a).a);case 92:return eg(a);case 43:return fg(a)}var d=pe(a),e=hd(a,b),f=null;if(O(a,35)){var h=ig(a,e,d);return h&&v(h,A(a,c.a))}if(e){if(f=Fb(a,1),!f)return null}else f=Fb(a,0);if(f)return oe(a,c.a,e,f,1,d);var m=T(db,a,0);return m&&Eb(a,c.a,n(new Jh(8),m))}function qe(a,b){if(b.b^17&&b.b^16){ +var c=a.l.a==1||a.l.a==4,d=b.b==9||b.b==11||b.b==14||b.b==18;d&&!c?u(a.a,b.c,'This statement cannot be used inside a function'):!d&&c&&u(a.a,b.c,'This statement cannot be used outside a function')}}function jg(a,b){var c=y(a).a;if(!z(a,98))return!1;var d=null;try{d=JSON.parse(L(c))}catch(l){return u(a.a,c,'Invalid string literal'),!1}var e=a.c.b;if(!e)return u(a.a,c,'Cannot include files without access to a file system'),!1;var f=e(d,c.a.a);if(!f)return u(a.a,c,'Cannot read the file '+JSON.stringify(d)),!1;if(a.e.has(f.a))return!0;Na(a.e,f.a,!0),a.f.push(new Lh(c,Cg(f)));var h=Jc(a.a,f,0),m=new Mh(a.a,h,a.c,a.d,a.e);return m.l=a.l,!fc(m,b,1)||!z(m,99)?!1:!0}function re(a){var b=y(a),c=new Jh(3);return a.l=new Vh(2,a.l),!z(a,83)||!fc(a,c,2)||!z(a,87)?null:(Hb(a),v(c,A(a,b.a)))}function hd(a,b){for(var c=0;;){var d=y(a).b;switch(d){case 2:c|=1;break;case 8:c|=2;break;case 16:c|=4;break;case 18:c|=8;break;case 19:c|=16;break;case 25:c|=32;break;case 29:c|=64;break;case 30:c|=128;break;case 37:c|=256;break;case 38: +c|=512;break;default:return c}(!b&&(d==2||d==37||d==38)||b==3&&d^25&&d^29&&d^16||b&&(d==18||d==30||d==19))&&u(a.a,y(a).a,'Cannot use this qualifier here'),E(a)}}function Fb(a,b){var c=y(a),d=null;switch(c.b){case 3:d=Y;break;case 5:d=Lb;break;case 6:d=Mb;break;case 7:d=Nb;break;case 14:d=da;break;case 20:d=ga;break;case 22:d=vb;break;case 23:d=wb;break;case 24:d=xb;break;case 26:d=ob;break;case 27:d=pb;break;case 28:d=qb;break;case 33:d=Lg;break;case 34:d=Mg;break;case 39:d=Fa;break;case 40:d=Ga;break;case 41:d=Ha;break;case 42:d=yd;break;case 96:var e=pd(a.l,L(c.a));if(!e||!(e instanceof Tb))return b^1||Gb(a),null;d=J(e);break;default:return b^1||Gb(a),null}return E(a),v(t(new Jh(26),d),A(a,c.a))}function kg(a,b,c,d,e){var f=d.l,h=new oc(sc(d.c),c,L(c),new Vh(0,f));if(h.e|=d.h|a|(h.c=='main'?1024:0),h.f=e,h.o=b,d.l=h.d,O(d,42)){if(!z(d,89))return null}else if(!O(d,89)){for(;;){var m=hd(d,0),l=Fb(d,1);if(!l)return null;var g=y(d).a;if(!z(d,96))return null;var i=new Ge(sc(d.c),g,L(g),d.l,0);if(i.e|=m,i.p=l,h.i.push(i), +id(d,i),!se(d,i))return null;if(!O(d,81))break}if(!z(d,89))return null}var o=ya(f.c,L(c),null),k=!O(d,90);if(o){if(o instanceof oc){for(var r=o;r;r=r.r)if(Eg(r,h)){r.o.f!=h.o.f?Kf(d.a,h.o.c,h.c,h.o.f,r.o.f,r.o.c):r.k||!k?bd(d.a,h.b,r.b):(r.s=h,h.s=r,h.e|=r.e,r.e=h.e);break}h.r=o,Bg(f,h)}else return bd(d.a,c,o.b),null}else Fe(f,h);if(k){var s=d.h;if(d.h&=-3073,h.k=re(d),d.h&=s,!h.k)return null}return Hb(d),v(Cc(new Jh(11),h),A(d,b.c))}function se(a,b){var c=y(a);if(O(a,84)){if(O(a,88))return u(a.a,A(a,c.a),'All array sizes must be specified'),!0;if(b.B=T(db,a,0),!b.B||!z(a,88))return!1;var d=0;if(X(a.d,b.B),pa(a.d,b.B,ga),b.B.f!=K){var e=G(b.B);if(e){if(e.b==30){var f=e.h|0;f<1?u(a.a,b.B.c,'Cannot declare an array with a size of "'+f+'"'):d=f}}else u(a.a,b.B.c,'This value must be a compile-time constant')}for(;y(a).b==84;){if(c=E(a),y(a).b^88&&!T(db,a,0)||!z(a,88))return!1;u(a.a,A(a,c.a),'Multidimensional arrays are not a part of the language')}b.p=v(t(new Jh(26),Ig(b.p.f,d)),b.p.c)}return!0}function te(a,b,c,d,e){ +for(var f=n(_(new Jh(17),d.h|a),b);;){var h=new Ge(sc(d.c),c,L(c),d.l,d.l.a^1?d.l.a^4?2:3:1);if(h.e|=d.h|a,h.f=e,h.p=b,!se(d,h))return null;var m=y(d).a,l=null;if(O(d,69)){var g=y(d);l=T(db,d,1),l||(l=v(t(new Jh(24),K),A(d,g.a)))}else m=null;var i=Qa(v(n(Cc(new Jh(2),h),l),A(d,h.b)),m);if(h.C=i,h.e&2&&X(d.d,i),n(f,i),id(d,h),!O(d,81))return z(d,90),f;if(c=y(d).a,!z(d,96))return null}}function id(a,b){var c=ya(a.l.c,b.c,null);return c?(bd(a.a,b.b,c.b),!1):(Fe(a.l,b),!0)}function fc(a,b,c){for(;y(a).b^99&&y(a).b^87;){var d=y(a).a;if(O(a,93)){if(c^1)return u(a.a,d,'"#include" statements cannot be used here'),O(a,98),!1;if(!jg(a,b))return!1}else{var e=Za(a,c);if(!e)return!1;if(e.b^13)qe(a,e),n(b,e);else for(;e.g;){var f=q(e.g);qe(a,f),n(b,f)}}}return!0}function jd(a,b,c,d,e,f){db||(db=Yf());var h=new Map,m=new Mh(a,b,d,f,h);return m.l=e,fc(m,c,1)&&z(m,99),new Kh(m.f)}function y(a){return a.b[a.m]}function E(b){var a=y(b);return (b.m+1|0)0?c.m-1|0:0];return b.a.c0?e.b[e.m-1|0]:b).a;return a==90||we(d).a^we(c).a?u(e.a,xe(d),'Expected '+Oe[a]):u(e.a,c,'Expected '+Oe[a]+' but found '+Oe[b.b]),!1}function Gb(a){If(a.a,y(a))}function Hb(a){a.l=a.l.b}function Da(e,a,b){var c=ra(e.a,a,null);if(c)b>c.a&&(c.a=b);else{var d=new Nh(b);c=d,za(e.a,a,d)}return c}function T(f,a,b){var c=y(a),d=ra(f.a,c.b,null);if(!d||!d.b)return Gb(a),null;var e=ue(f,a,b,d.b(a));return e}function ue(f,a,b,c){for(;c;){var d=y(a).b,e=ra(f.a,d,null);if(!e||!e.c||e.a<=b)break;c=e.c(a,c)}return c}function P(d,a,b){Da(d,a,0).b=function(c){return b(c,E(c))}}function Ib(h,a,b,c){Da(h,a,0).b=function(d){var e=E(d),f=T(h,d,b);return f&&c(d,e,f)}}function ve(f,a,b,c){Da(f,a,b).c=function(d,e){return c(d,e,E(d))}}function R(m,a,b,c){Da(m,a,b).c=function(d,e){var f=E(d),h=T(m,d,b);return h&&c(d,e,f,h)}}function ta(m,a,b,c){Da(m,a,b).c=function(d,e){var f=E(d),h=T(m,d,b-1|0);return h&&c(d,e,f,h)}}function L(a){ +return a.a.b.slice(a.b,a.c)}function kd(b){var a=Jb(b.a,b.b);return b.a.a+':'+(a.a+1|0)+':'+(a.b+1|0)}function lg(b,a){return b.a==a.a&&b.b0&&k>a){var r=Math.min(g-l|0,a/2|0),s=Math.max((a-r|0)/2|0,3);if(l(a-3|0)&&(g=a-3|0);else if((k-l|0)<(a-s|0)){var w=k-a|0;d='...'+rc(m.slice(w+3|0,k)),l=l-w|0,g=g-w|0}else{var p=l-s|0;d='...'+rc(m.slice(p+3|0,(p+a|0)-3|0))+'...',l=l-p|0,g=g-p|0,g>(a-3|0)&&(g=a-3|0)}}else d=rc(m);return new Ph(d,Yb(' ',l)+((g-l|0)<2?'^':Yb('~',g-l|0)))}function mg(c,a,b){return new Qh(c.a,c.b+a|0,c.b+b|0)}function we(a){return Jb(a.a,a.b)}function xe(a){return new Qh(a.a,a.c,a.c)}function _a(a,b){return new Qh(a.a,a.b,b.c)}function ng(a){ +var b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'[a%53];for(a=a/53|0;a>0;)a=a-1|0,b+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'[a%63],a=a/63|0;return b}function og(o,a){for(var b=0,k=a.length;b=g)&&u(i.a,c.c,'Index "'+l+'" is out of bounds for type "'+D(d)+'"')}}break}a.f==K&&d!=K&&e!=K&&(a.b^43?Qf(i.a,a.d,L(a.d),d,e):u(i.a,a.d,'No index operator for type "'+D(d)+'" and type "'+D(e)+'"'))}function ug(m,a){var b=a.g;X(m,b);for(var c=b.f,d=c.a,e=[],f=!1,h=b.k;h;h=h.k)ja(m, +h),e.push(h),h.f==K&&(f=!0);if(!f){if(d){if(d instanceof oc){wg(m,d,a,e);return}if(d instanceof Tb){xg(m,c,a,e);return}}c!=K&&u(m.a,b.c,'Cannot call type "'+D(c)+'"')}}function vg(m,a){var b=a.g,c=a.m,d=a.d;if(ja(m,b),c!=''){var e=b.f,f=he(a);switch(e){case Lb:case vb:case Fa:case Mb:case wb:case Ga:case Nb:case xb:case Ha:a.f=yg(m,d,e,c,f);break;case K:break;default:if(e.a&&e.a instanceof Tb)for(var l=0,g=e.a.g,i=g.length;l=d&&Lf(w.a,h.c,a,d,f+l|0),ab(m)&&(e=!0),f=f+l|0}var g=ab(a)&&e;g&&c.length^1?u(w.a,b.d,'If a matrix argument is given to a matrix constructor, it is an error to have any other arguments'):f4)return u(l.a,a,'Invalid swizzle "'+c+'" on type "'+D(b)+'"'),K;for(var f=Ea(b),g=0,i=rd(f),o=i.length;g(jc.h|0)):ub.b==29&&jc.b==29&&S(x,a,ub.h>jc.h);break;case 42:var Ka=a.g,Wa=a.i;Ka.b^30?Wa.b^30?Ka.b==30&&Wa.b==30?S(x,a,(Ka.h|0)>=(Wa.h|0)):Ka.b==29&&Wa.b==29&&S(x,a,Ka.h>=Wa.h):(a.b=41,_(Wa,(Wa.h|0)-1|0),x.a=!0):(a.b=41,_(Ka,(Ka.h|0)+1|0),x.a=!0);break;case 43:var pc=a.g,kc=a.i,Oc=pc.f;if(kc.b==30){var Ob=kc.h|0,Pb=0;switch(Oc){case Lb:case vb:case Fa:Pb=2;break;case Mb:case wb:case Ga:Pb=3;break;case Nb:case xb:case Ha: +Pb=4;break}Ob>-1&&Ob=d.d.length)return'';var b=d.d[a],c=(a+1|0)0;){var d=b/2|0,e=c+d|0;h.d[e]<=a?(c=e+1|0,b=(b-d|0)-1|0):b=d}var f=c>0?a-h.d[c-1|0]|0:a;return new Wh(c-1|0,f)}function Kb(d,a,b){if(qd(d),a>-1&&a-1&&(c+b|0)<((a+1|0)64&&r<91||r>96&&r<123||r==95){var s=ya(Gg,g,99);s^99?e.push(new Zh(k, +s,f)):Hg.has(g)?Hf(a,k):e.push(new Zh(k,96,f))}else if(r>47&&r<58||r==46&&i>1)e.push(new Zh(k,gh.test(g)?97:95,f));else if(r^35){if(r^34){var p=ya(hh,g,99);p^99||(g.startsWith('//')?c^1?(f||(f=[])).push(k):p=0:g.startsWith('/*')&&(c^1?(f||(f=[])).push(k):p=1)),p^99&&e.push(new Zh(k,p,f))}else e.push(new Zh(k,98,f))}else{var w=94;switch(g){case'#version':w=92;break;case'#extension':w=91;break;case'#include':w=93;break}e.push(new Zh(k,w,f))}}else if(g!=''){u(a,k,'Syntax error "'+g+'"');break}e.length^h&&(f=null,h=e.length),m=o}return e.push(new Zh(new Qh(b,m,m),99,f)),e}function He(a){return a.b?He(a.b):a}function Ig(c,a){c.f||(c.f=new Map);var b=ra(c.f,a,null);return b||(za(c.f,a,b=new _h(null,c,a)),b.d=!0,b.e=c.e),b}function D(a){return a.b?a.c?D(a.b)+'['+a.c+']':D(a.b)+'[]':a.a.c}function Sa(a){switch(a){case Lb:case Fa:case vb:case ob:return 2;case Mb:case Ga:case wb:case pb:return 3;case Nb:case Ha:case xb:case qb:return 4}return a.c}function vd(a){switch(a){case Lb:case Mb:case Nb:return Y;case Fa:case Ga:case Ha: +return da;case vb:case wb:case xb:return ga;case ob:return Fa;case pb:return Ga;case qb:return Ha}return a.b}function Ea(a){switch(a){case Y:case da:case ga:return 1;case Lb:case Fa:case vb:return 2;case Mb:case Ga:case wb:return 3;case Nb:case Ha:case xb:case ob:return 4;case pb:return 9;case qb:return 16}return 0}function fa(a){switch(a){case Y:case Lb:case Mb:case Nb:return Y;case da:case Fa:case Ga:case Ha:case ob:case pb:case qb:return da;case ga:case vb:case wb:case xb:return ga}return null}function wd(a){switch(a){case Lb:case Mb:case Nb:case vb:case wb:case xb:case Fa:case Ga:case Ha:return!0}return!1}function ab(a){switch(a){case ob:case pb:case qb:return!0}return!1}function Kc(a){switch(a){case ga:case vb:case wb:case xb:return!0}return!1}function Lc(a){switch(a){case da:case Fa:case Ga:case Ha:return!0;case ob:case pb:case qb:return!0}return!1}function Jg(a){return Kc(a)||Lc(a)}function Kg(a){return !a.e&&!a.d}function Ie(a){return a.e=!0,a}function Je(b){var a=b.a.length;return b.a.push(a),a}function xd(c,a,b){ +c.a[Mc(c,a)]=Mc(c,b)}function Mc(c,a){var b=c.a[a];return b^a&&(b=Mc(c,b),c.a[a]=b),b}function qa(a,b){Ke(a),process.stdout.write(b),Ke(0)}function Og(a){qa(3,'error: '),qa(1,a+'\n')}function Pg(a){qa(2,'note: '),qa(1,a+'\n')}function Qg(a){qa(7,'warning: '),qa(1,a+'\n')}function Le(a){for(var b=process.stdout.columns,l=0,g=a.a,i=g.length;l',a)];if(a instanceof Array){for(var b=[],c=0,e=a.length;c27&&a<31}function dd(a){return a>30&&a<38}function Rf(a){return a>30&&a<36}function ed(a){return a>33&&a<38}function Ac(a){return a>37&&a<57}function Bc(a){return a>51&&a<57}function Sf(a){return a==4||a==5||a==6||a==15}function ce(a){return a==7||a==10||a==19}function $a(b){var a='';return b&1&&(a+='attribute '),b&2&&(a+='const '),b&256&&(a+='uniform '),b&512&&(a+='varying '),b&4&&(a+='highp '),b&32&&(a+='lowp '),b&64&&(a+='mediump '),b&8&&(a+='in '),b&16&&(a+='inout '),b&128&&(a+='out '),a}function Fg(a){return a>49&&a<80}function ud(a){switch(a){case 96:case 42:case 33:case 34:case 14:case 39:case 40:case 41:case 20:case 22:case 23:case 24:case 3:case 5:case 6:case 7:case 26:case 27:case 28:return!0}return!1}function Ke(a){process.stdout.isTTY&&process.stdout.write('\x1B[0;'+ih.get(a)+'m')} +function hb(b,a){return b[b.length-1|0]=a}function Rc(a){return a[a.length-1|0]}function Ze(c,a){for(var d=0,e=a.length;db|0)|0}function rc(a){for(var b=new nh,d=0,e=a.length;db|0)|0}function Yb(d,a){for(var b='',c=0;c>10)+55296|0)+String.fromCharCode((a-65536&1023)+56320|0)}function Nc(a){if(!a)return null;var b=a.a,c=Jb(b,a.b),d=Jb(b,a.c);return{source:b.a,start:{line:c.a,column:c.b}, +end:{line:d.a,column:d.b}}}function jh(a,b){b=b||{};var c=Me(a),d=new Ih,e=new th;e.c=ya(Re,b.renaming,0),b.disableRewriting&&(e.a=!1),b.prettyPrint&&(e.b=!1),b.keepSymbols&&(e.d=!1),b.fileAccess&&(e.e=Ne(b.fileAccess));var f=Gd(d,c,e);return{log:Ff(d),output:f?Sc(f,ya(Qe,b.format,0)):null}}function kh(a,b){b=b||{};var c=Me(a),d=new Ih,e=new th;b.fileAccess&&(e.e=Ne(b.fileAccess));var f=_e(d,c,e),h=function(m){for(var Xb,l=m.source+'',g=m.line|0,i=m.column|0,o=!!m.ignoreDiagnostics,k=null,r=null,s=null,zd=0,Ug=c.length;zd>=?|[()[\\]{}\\.,?:;]|[+\\-*/%=!<>&|^~]=?|[A-Za-z_][A-Za-z0-9_]*\\b|#\\w+\\b|"(?:[^"\\\\]|\\\\.)*")'),gh=new RegExp('^([1-9][0-9]*|0[0-7]*|0[xX][0-9A-Fa-f]+)$'),Gg=j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(new Map, +'attribute',2),'bool',3),'break',4),'bvec2',5),'bvec3',6),'bvec4',7),'const',8),'continue',9),'discard',10),'do',11),'else',12),'false',13),'float',14),'for',15),'highp',16),'if',17),'in',18),'inout',19),'int',20),'invariant',21),'ivec2',22),'ivec3',23),'ivec4',24),'lowp',25),'mat2',26),'mat3',27),'mat4',28),'mediump',29),'out',30),'precision',31),'return',32),'sampler2D',33),'samplerCube',34),'struct',35),'true',36),'uniform',37),'varying',38),'vec2',39),'vec3',40),'vec4',41),'void',42),'while',43),'export',44),'import',45),hh=j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(new Map,'~',46),'--',47),'++',48),'!',49),'&',50),'|',51),'^',52),'/',53),'==',54),'>',55),'>=',56),'<',57),'<=',58),'&&',59),'||',60),'^^',61),'-',62),'*',63),'!=',64),'+',65),'%',66),'<<',67),'>>',68),'=',69),'+=',70),'&=',71),'|=',72),'^=',73),'/=',74),'*=',75),'%=',76),'<<=',77),'>>=',78),'-=',79),':',80),',',81),'.',82),'{',83),'[',84),'(',85),'?',86),'}',87),']',88),')',89),';',90),Hg=j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(new Map, +'asm',0),'cast',0),'class',0),'default',0),'double',0),'dvec2',0),'dvec3',0),'dvec4',0),'enum',0),'extern',0),'external',0),'fixed',0),'flat',0),'fvec2',0),'fvec3',0),'fvec4',0),'goto',0),'half',0),'hvec2',0),'hvec3',0),'hvec4',0),'inline',0),'input',0),'interface',0),'long',0),'namespace',0),'noinline',0),'output',0),'packed',0),'public',0),'sampler1D',0),'sampler1DShadow',0),'sampler2DRect',0),'sampler2DRectShadow',0),'sampler2DShadow',0),'sampler3D',0),'sampler3DRect',0),'short',0),'sizeof',0),'static',0),'superp',0),'switch',0),'template',0),'this',0),'typedef',0),'union',0),'unsigned',0),'using',0),'volatile',0),Y=J(new Tb(-1,null,'bool',null)),Lb=J(new Tb(-2,null,'bvec2',null)),Mb=J(new Tb(-3,null,'bvec3',null)),Nb=J(new Tb(-4,null,'bvec4',null)),K=J(new Tb(-5,null,'',null)),da=J(new Tb(-6,null,'float',null)),ga=J(new Tb(-7,null,'int',null)),vb=J(new Tb(-8,null,'ivec2',null)),wb=J(new Tb(-9,null,'ivec3',null)),xb=J(new Tb(-10,null,'ivec4',null)),ob=J(new Tb(-11,null,'mat2',null)),pb=J(new Tb(-12,null, +'mat3',null)),qb=J(new Tb(-13,null,'mat4',null)),Lg=Ie(J(new Tb(-14,null,'sampler2D',null))),Mg=Ie(J(new Tb(-15,null,'samplerCube',null))),Fa=J(new Tb(-16,null,'vec2',null)),Ga=J(new Tb(-17,null,'vec3',null)),Ha=J(new Tb(-18,null,'vec4',null)),yd=J(new Tb(-19,null,'void',null)),Ng=[Y,Lb,Mb,Nb,da,ga,vb,wb,xb,ob,pb,qb,Lg,Mg,Fa,Ga,Ha],Qe=j(j(j(j(j(new Map,'json',0),'js',1),'c++',2),'skew',3),'rust',4),Re=j(j(j(new Map,'all',0),'internal-only',1),'none',2),mh=['ERROR','WARNING'],Sg=['GLOBAL','STRUCT_BLOCK','VARIABLE','BLOCK','BREAK','CONTINUE','DISCARD','DO_WHILE','EXPRESSION','EXTENSION','FOR','FUNCTION','IF','MODIFIER_BLOCK','PRECISION','RETURN','STRUCT','VARIABLES','VERSION','WHILE','CALL','DOT','HOOK','NAME','PARSE_ERROR','SEQUENCE','TYPE','UNKNOWN_CONSTANT','BOOL','FLOAT','INT','NEGATIVE','NOT','POSITIVE','PREFIX_DECREMENT','PREFIX_INCREMENT','POSTFIX_DECREMENT','POSTFIX_INCREMENT','ADD','DIVIDE','EQUAL','GREATER_THAN','GREATER_THAN_OR_EQUAL','INDEX','LESS_THAN','LESS_THAN_OR_EQUAL','LOGICAL_AND','LOGICAL_OR', +'LOGICAL_XOR','MULTIPLY','NOT_EQUAL','SUBTRACT','ASSIGN','ASSIGN_ADD','ASSIGN_DIVIDE','ASSIGN_MULTIPLY','ASSIGN_SUBTRACT'],Oe=['SINGLE_LINE_COMMENT','MULTI_LINE_COMMENT','ATTRIBUTE','BOOL','BREAK','BVEC2','BVEC3','BVEC4','CONST','CONTINUE','DISCARD','DO','ELSE','FALSE','FLOAT','FOR','HIGHP','IF','IN','INOUT','INT','INVARIANT','IVEC2','IVEC3','IVEC4','LOWP','MAT2','MAT3','MAT4','MEDIUMP','OUT','PRECISION','RETURN','SAMPLER2D','SAMPLERCUBE','STRUCT','TRUE','UNIFORM','VARYING','VEC2','VEC3','VEC4','VOID','WHILE','EXPORT','IMPORT','COMPLEMENT','DECREMENT','INCREMENT','NOT','BITWISE_AND','BITWISE_OR','BITWISE_XOR','DIVIDE','EQUAL','GREATER_THAN','GREATER_THAN_OR_EQUAL','LESS_THAN','LESS_THAN_OR_EQUAL','LOGICAL_AND','LOGICAL_OR','LOGICAL_XOR','MINUS','MULTIPLY','NOT_EQUAL','PLUS','REMAINDER','SHIFT_LEFT','SHIFT_RIGHT','ASSIGN','ASSIGN_ADD','ASSIGN_BITWISE_AND','ASSIGN_BITWISE_OR','ASSIGN_BITWISE_XOR','ASSIGN_DIVIDE','ASSIGN_MULTIPLY','ASSIGN_REMAINDER','ASSIGN_SHIFT_LEFT','ASSIGN_SHIFT_RIGHT','ASSIGN_SUBTRACT','COLON', +'COMMA','DOT','LEFT_BRACE','LEFT_BRACKET','LEFT_PARENTHESIS','QUESTION','RIGHT_BRACE','RIGHT_BRACKET','RIGHT_PARENTHESIS','SEMICOLON','EXTENSION','VERSION','INCLUDE','PRAGMA','FLOAT_LITERAL','IDENTIFIER','INT_LITERAL','STRING_LITERAL','END_OF_FILE'],ih=Oa(Oa(Oa(Oa(Oa(Oa(Oa(Oa(Oa(new Map,0,0),1,1),2,90),3,31),4,32),5,33),6,34),7,35),8,36);ai()})(); \ No newline at end of file diff --git a/ShaderPlayground/build/debug/main.css b/ShaderPlayground/build/debug/main.css new file mode 100644 index 0000000..7b4b052 --- /dev/null +++ b/ShaderPlayground/build/debug/main.css @@ -0,0 +1,52 @@ +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view ul afx-list-item:nth-child(even) li, +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view > div.list-container > ul li{ + background-color:#333333; + color:#afafaf; + border-radius: 0; + border: 0; + padding-top: 5px; + padding-bottom: 5px; + padding-right: 20px; + border-right: 1px solid #272822; +} + +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view ul afx-list-item:nth-child(even) li.selected, +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view > div.list-container > ul > afx-list-item > li.selected{ + background-color:#272822; + color:white; + border: 0; + border-radius: 0; +} + +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item img{ + width: 160px; + height: 82px; + object-fit: contain; + border: 1px solid tomato; + padding: 0; + margin: 0; +} +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item li{ + width: 162px !important; + float: left; + background-color: transparent !important; +} +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item p{ + padding:0; + margin: 0; + text-align: center; + background-color: tomato; + color: white; + width: 162px; +} +afx-app-window[data-id = "ShaderPlayground"] afx-vbox[data-id = "editor-wrapper"]{ + background-color: #333333; +} +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item i.closable{ + margin: 0px 15px 0px 0px; +} + +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item i.closable::before +{ + color: tomato; +} \ No newline at end of file diff --git a/ShaderPlayground/build/debug/main.js b/ShaderPlayground/build/debug/main.js new file mode 100644 index 0000000..2c5d9a8 --- /dev/null +++ b/ShaderPlayground/build/debug/main.js @@ -0,0 +1 @@ +var OS;!function(e){let t,i;!function(e){let t;!function(e){class t extends e.ListViewItemTag{itemlayout(){return{el:"div",children:[{el:"img",ref:"img"},{el:"p",ref:"name"}]}}ondatachange(){const e=this.data,t=this.refs.img,i=e.path.asFileHandle().getlink();t.src=i,$(this.refs.name).text(e.name)}init(){this.closable=!0}reload(e){}}e.define("afx-shader-texture-item",t)}(t=e.tag||(e.tag={}))}(t=e.GUI||(e.GUI={})),function(e){class i extends t.BasicDialog{constructor(){super("AddTextureDialog",i.scheme)}main(){super.main();const e=$("input",this.scheme);this.find("btnOk").onbtclick=t=>{let i={};for(const t of e){let e=t;if(""==e.value.trim())return this.notify(__("All fields should be filled"));i[e.name]=e.value.trim()}this.handle&&this.handle(i),this.quit()},this.find("btnFile").onbtclick=e=>{this.openDialog("FileDialog",{title:__("Select image file"),type:"file",mimes:["image/.*"]}).then(e=>{this.find("txtPath").value=e.file.path})}}}i.scheme='\n \n
\n \n
\n \n \n
\n \n \n \n \n \n
\n
\n \n
\n
\n
\n
\n
\n
';class s{constructor(e,t){this.renderer=t,this.ums=[new ace.UndoManager,new ace.UndoManager],this.current_idx=-1,this.glsl_values=["void main(){}",""],ace.require("ace/ext/language_tools"),this.editor=ace.edit(e),this.editor.setOptions({enableBasicAutocompletion:!0,enableLiveAutocompletion:!0,enableSnippets:!0,highlightActiveLine:!0}),this.editor.getSession().setUseWrapMode(!0),this.editor.session.setMode("ace/mode/glsl"),this.editor.setTheme("ace/theme/monokai"),this.cursors=[this.editor.getCursorPosition(),this.editor.getCursorPosition()],this.editor.on("input",e=>{const t=this.editor.getValue(),i=GLSLX.compile(t,{format:"json"});if(i.output)this.editor.getSession().setAnnotations([]),this.glsl_values[this.current_idx]=t,this.renderer.apply_mat(this.glsl_values[0],this.glsl_values[1]);else{const e=":([0-9]+):([0-9]+):\\s*error:\\s*(.*)\\n",t=i.log.match(new RegExp(e,"g"));t&&this.editor.getSession().setAnnotations(t.map(t=>{const i=t.match(new RegExp(e));let s={};return i&&(s={row:parseInt(i[1])-1,column:parseInt(i[2]),text:i[3],type:"error"}),s}))}})}edit(e){if(e<0)return;if(2!=e&&2!=this.current_idx)0===e?(this.glsl_values[1]=this.editor.getValue(),this.cursors[1]=this.editor.getCursorPosition()):(this.glsl_values[0]=this.editor.getValue(),this.cursors[0]=this.editor.getCursorPosition());else if(2==e)return this.glsl_values[this.current_idx]=this.editor.getValue(),this.cursors[this.current_idx]=this.editor.getCursorPosition(),void(this.current_idx=e);this.current_idx=e,this.editor.getSession().setUndoManager(new ace.UndoManager),this.editor.setValue(this.glsl_values[e]),this.editor.getSession().setUndoManager(this.ums[e]);const t=this.cursors[e];this.editor.renderer.scrollCursorIntoView({row:t.row,column:t.column},.5),this.editor.selection.moveTo(t.row,t.column),this.editor.focus()}cleanup(){this.renderer.cleanup()}resize(){this.editor.resize(),this.renderer.viewport_resize()}}class r{constructor(e){this.textures=[],this.renderer=new THREE.WebGLRenderer({canvas:e}),this.renderer.autoClearColor=!1,this.clock=new THREE.Clock,this.camera=new THREE.OrthographicCamera(-1,1,1,-1,-1,1),this.scene=new THREE.Scene;const t=new THREE.PlaneGeometry(2,2),i=new THREE.MeshBasicMaterial({color:"white"});this.needupdateTexture=!1,this.mesh=new THREE.Mesh(t,i),this.scene.add(this.mesh),this.uniforms={u_resolution:{value:{x:0,y:0}},u_time:{value:0},u_mouse:{value:{x:0,y:0}}},this.viewport_resize(),this.ani_request_id=requestAnimationFrame(()=>this.viewport_render())}viewport_render(){this.needupdateTexture&&(this.update_textures(),this.needupdateTexture=!1),this.uniforms.u_time.value=this.clock.getElapsedTime();try{this.renderer.render(this.scene,this.camera)}catch(e){console.error(e);const t=new THREE.MeshBasicMaterial({color:"white"});this.mesh.material=t}this.ani_request_id=requestAnimationFrame(()=>this.viewport_render())}viewport_resize(){const e=this.renderer.domElement,t=e.clientWidth,i=e.clientHeight;this.uniforms.u_resolution.value.x=t,this.uniforms.u_resolution.value.y=i,(e.width!==t||e.height!==i)&&this.renderer.setSize(t,i,!1)}cleanup(){console.log("Stop the animation before quitting..."),window.cancelAnimationFrame(this.ani_request_id)}update_textures(){for(const e in this.uniforms)-1===["u_resolution","u_time","u_mouse"].indexOf(e)&&delete this.uniforms[e];for(const e of this.textures)this.uniforms[e.name]={value:e.texture}}apply_mat(e,t){const i={fragmentShader:""===e.trim()?"void main(){}":e,uniforms:this.uniforms,vertexShader:void 0};""!=t.trim()&&(i.vertexShader=t);const s=new THREE.ShaderMaterial(i);this.mesh.material=s}}class n extends e.BaseApplication{constructor(e){super("ShaderPlayground",e)}main(){this.init_editor(),this.init_textures_list()}init_editor(){this.tabbar=this.find("tabbar"),this.tabbar.items=[{text:__("Fragment"),iconclass:"bi bi-palette"},{text:__("Vertex"),iconclass:"bi bi-intersect"},{text:__("Textures"),iconclass:"bi bi-image-alt"}],this.tabbar.ontabselect=e=>{this.selectTab()},this.editor=new s(this.find("editor-container"),new r(this.find("viewport"))),this.on("resize",e=>{this.editor.resize()}),this.tabbar.selected=0}init_textures_list(){const e=this.find("texture-list");e.buttons=[{text:"__(Add texture)",iconclass:"bi bi-plus",onbtclick:t=>{this.openDialog(new i).then(t=>{if(!t)return;const i=(new THREE.TextureLoader).load(t.path.asFileHandle().getlink());i.minFilter=THREE.NearestFilter,i.magFilter=THREE.NearestFilter,i.wrapS=THREE.RepeatWrapping,i.wrapT=THREE.RepeatWrapping,t.texture=i,e.push(t),this.editor.renderer.needupdateTexture=!0})}}],e.itemtag="afx-shader-texture-item",e.onitemclose=e=>(this.editor.renderer.needupdateTexture=!0,!0),e.data=this.editor.renderer.textures}selectTab(){const e=this.tabbar.selected;2===e?($(this.find("editor-container")).hide(),$(this.find("texture-list")).show()):($(this.find("editor-container")).show(),$(this.find("texture-list")).hide()),this.editor.edit(e)}cleanup(e){this.editor.cleanup()}}e.ShaderPlayground=n,n.dependencies=["pkg://libthreejs/main.js","pkg://ACECore/core/ace.js","pkg://ACECore/path.js","pkg://ACECore/core/ext-language_tools.js","pkg://ShaderPlayground/glslx.js"]}(i=e.application||(e.application={}))}(OS||(OS={})); \ No newline at end of file diff --git a/ShaderPlayground/build/debug/package.json b/ShaderPlayground/build/debug/package.json new file mode 100644 index 0000000..58426e4 --- /dev/null +++ b/ShaderPlayground/build/debug/package.json @@ -0,0 +1,16 @@ +{ + "pkgname": "ShaderPlayground", + "app":"ShaderPlayground", + "name":"OpenGL Shader Playground", + "description":"OpenGL Shader Playground", + "info":{ + "author": "Xuan Sang LE", + "email": "mrsang@iohub.dev" + }, + "version":"0.0.1-a", + "category":"Development", + "iconclass":"bi bi-lightbulb-fill", + "mimes":["none"], + "dependencies":["libthreejs@0.0.129-r"], + "locale": {} +} \ No newline at end of file diff --git a/ShaderPlayground/build/debug/scheme.html b/ShaderPlayground/build/debug/scheme.html new file mode 100644 index 0000000..a2f6799 --- /dev/null +++ b/ShaderPlayground/build/debug/scheme.html @@ -0,0 +1,13 @@ + + + + +
+ +
+ + + + +
+
\ No newline at end of file diff --git a/ShaderPlayground/build/release/ShaderPlayground.zip b/ShaderPlayground/build/release/ShaderPlayground.zip new file mode 100644 index 0000000000000000000000000000000000000000..4a77b63fe45575375e3b426f00e12008671eff7b GIT binary patch literal 44449 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 literal 0 HcmV?d00001 diff --git a/ShaderPlayground/glslx.js b/ShaderPlayground/glslx.js new file mode 100644 index 0000000..5767934 --- /dev/null +++ b/ShaderPlayground/glslx.js @@ -0,0 +1,77 @@ +(function(){var ah=Object.create||function(a){return{__proto__:a}};function ph(a,b){a.prototype=ah(b.prototype),a.prototype.constructor=a}var qh=Math.imul||function(a,b){return (a*(b>>>16)<<16)+a*(b&65535)|0};var Xe;function rh(a){return typeof a==='string'}function sh(a){return a===null?a:a+''}function Ue(c,a,b){return c.a=a,c.b=b,c.c=a.length,c}function Ve(c){if(c.b>=c.c)return-1;var a=c.a.charCodeAt((c.b=c.b+1|0)-1|0);if(a&64512^55296)return a;if(c.b>=c.c)return-1;var b=c.a.charCodeAt((c.b=c.b+1|0)-1|0);return ((a<<10)+b|0)-56613888|0}function sc(a){return a.c=a.c+1|0,a.c}function Sc(p,a){switch(a){case 0:var b={};return Array.from(p.b.keys()).forEach(function(c){b[c]=p.b.get(c)}),JSON.stringify({shaders:p.a?p.a.map(function(d){return{name:d.a,contents:d.b}}):null,renaming:b},null,2)+'\n';case 1:if(p.a){for(var e='',C=0,B=p.a,U=B.length;C',"\nimport {\n // The variable `gl_Position` is available only in the vertex language and is intended for writing the\n // homogeneous vertex position. This value will be used by primitive assembly, clipping, culling, and other\n // fixed functionality operations that operate on primitives after vertex processing has occurred.\n //\n // All executions of a well-formed vertex shader should write a value into this variable. It can be\n // written at any time during shader execution. It may also be read back by the shader after being written.\n // Compilers may generate a diagnostic message if they detect `gl_Position` is not written, or read before\n // being written, but not all such cases are detectable. The value of `gl_Position` is undefined if a vertex\n // shader is executed and does not write `gl_Position`.\n highp vec4 gl_Position;\n\n // The variable `gl_PointSize` is available only in the vertex language and is intended for\n // a vertex shader to write the size of the point to be rasterized. It is measured in pixels.\n mediump float gl_PointSize;\n\n const int gl_MaxVertexAttribs;\n const int gl_MaxVertexUniformVectors;\n const int gl_MaxVaryingVectors;\n const int gl_MaxVertexTextureImageUnits;\n const int gl_MaxCombinedTextureImageUnits;\n const int gl_MaxTextureImageUnits;\n const int gl_MaxFragmentUniformVectors;\n const int gl_MaxDrawBuffers;\n\n // The fragment shader has access to the read-only built-in variable `gl_FrontFacing` whose value is `true` if\n // the fragment belongs to a front-facing primitive. One use of this is to emulate two-sided lighting by\n // selecting one of two colors calculated by the vertex shader.\n const bool gl_FrontFacing;\n\n // The fragment shader has access to the read-only built-in variable `gl_PointCoord`. The values in\n // `gl_PointCoord` are two-dimensional coordinates indicating where within a point primitive the current\n // fragment is located. They range from 0.0 to 1.0 across the point. If the current primitive is not a\n // point, then the values read from `gl_PointCoord` are undefined.\n const mediump vec2 gl_PointCoord;\n\n // The variable `gl_FragCoord` is available as a read-only variable from within fragment shaders and it holds\n // the window relative coordinates `x`, `y`, `z`, and `1/w` values for the fragment. This value is the result\n // of the fixed functionality that interpolates primitives after vertex processing to generate fragments. The `z`\n // component is the depth value that will be used for the fragment's depth.\n const mediump vec4 gl_FragCoord;\n\n // Writing to `gl_FragColor` specifies the fragment color that will be used by the subsequent fixed\n // functionality pipeline.\n //\n // If subsequent fixed functionality consumes fragment color and an execution of a fragment shader\n // does not write a value to `gl_FragColor` then the fragment color consumed is undefined.\n mediump vec4 gl_FragColor;\n\n // The variable `gl_FragData` is an array. Writing to `gl_FragData[n]` specifies the fragment data that will be\n // used by the subsequent fixed functionality pipeline for data `n`.\n //\n // If subsequent fixed functionality consumes fragment data and an execution of a fragment shader does not write\n // a value to it, then the fragment data consumed is undefined.\n mediump vec4 gl_FragData[gl_MaxDrawBuffers];\n\n // Depth range in window coordinates\n struct gl_DepthRangeParameters {\n float near;\n float far;\n // Equal to `far - near`\n float diff;\n };\n\n uniform gl_DepthRangeParameters gl_DepthRange;\n\n ////////////////////////////////////////////////////////////////////////////////\n // Angle and Trigonometry Functions\n\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n float radians(float degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec2 radians(vec2 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec3 radians(vec3 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec4 radians(vec4 degrees);\n\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n float degrees(float radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec2 degrees(vec2 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec3 degrees(vec3 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec4 degrees(vec4 radians);\n\n // The standard trigonometric sine function.\n float sin(float angle);\n // The standard trigonometric sine function.\n vec2 sin(vec2 angle);\n // The standard trigonometric sine function.\n vec3 sin(vec3 angle);\n // The standard trigonometric sine function.\n vec4 sin(vec4 angle);\n\n // The standard trigonometric cosine function.\n float cos(float angle);\n // The standard trigonometric cosine function.\n vec2 cos(vec2 angle);\n // The standard trigonometric cosine function.\n vec3 cos(vec3 angle);\n // The standard trigonometric cosine function.\n vec4 cos(vec4 angle);\n\n // The standard trigonometric tangent.\n float tan(float angle);\n // The standard trigonometric tangent.\n vec2 tan(vec2 angle);\n // The standard trigonometric tangent.\n vec3 tan(vec3 angle);\n // The standard trigonometric tangent.\n vec4 tan(vec4 angle);\n\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n float asin(float x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec2 asin(vec2 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec3 asin(vec3 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec4 asin(vec4 x);\n\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n float acos(float x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec2 acos(vec2 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec3 acos(vec3 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec4 acos(vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n float atan(float y, float x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec2 atan(vec2 y, vec2 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec3 atan(vec3 y, vec3 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec4 atan(vec4 y, vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n float atan(float y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec2 atan(vec2 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec3 atan(vec3 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec4 atan(vec4 y_over_x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Exponential Functions\n\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n float pow(float x, float y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec2 pow(vec2 x, vec2 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec3 pow(vec3 x, vec3 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec4 pow(vec4 x, vec4 y);\n\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n float exp(float x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec2 exp(vec2 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec3 exp(vec3 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec4 exp(vec4 x);\n\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n float log(float x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec2 log(vec2 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec3 log(vec3 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec4 log(vec4 x);\n\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n float exp2(float x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec2 exp2(vec2 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec3 exp2(vec3 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec4 exp2(vec4 x);\n\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n float log2(float x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec2 log2(vec2 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec3 log2(vec3 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec4 log2(vec4 x);\n\n // Returns `√x`. Results are undefined if `x < 0`.\n float sqrt(float x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec2 sqrt(vec2 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec3 sqrt(vec3 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec4 sqrt(vec4 x);\n\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n float inversesqrt(float x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec2 inversesqrt(vec2 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec3 inversesqrt(vec3 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec4 inversesqrt(vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Common Functions\n\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n float abs(float x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec2 abs(vec2 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec3 abs(vec3 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec4 abs(vec4 x);\n\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n float sign(float x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec2 sign(vec2 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec3 sign(vec3 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec4 sign(vec4 x);\n\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n float floor(float x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec2 floor(vec2 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec3 floor(vec3 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec4 floor(vec4 x);\n\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n float ceil(float x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec2 ceil(vec2 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec3 ceil(vec3 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec4 ceil(vec4 x);\n\n // Returns `x - floor(x)`\n float fract(float x);\n // Returns `x - floor(x)`\n vec2 fract(vec2 x);\n // Returns `x - floor(x)`\n vec3 fract(vec3 x);\n // Returns `x - floor(x)`\n vec4 fract(vec4 x);\n\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n float mod(float x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, float y);\n\n // Modulus. Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, vec2 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, vec3 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, vec4 y);\n\n // Returns `y` if `y < x`, otherwise it returns `x`\n float min(float x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, vec2 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, vec3 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, vec4 y);\n\n // Returns `y` if `x < y`, otherwise it returns `x`\n float max(float x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, vec2 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, vec3 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, vec4 y);\n\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n float clamp(float x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);\n\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n float mix(float x, float y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, vec2 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, vec3 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, vec4 a);\n\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n float step(float edge, float x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(float edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(vec2 edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(float edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(vec3 edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(float edge, vec4 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(vec4 edge, vec4 x);\n\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n float smoothstep(float edge0, float edge1, float x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(float edge0, float edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(float edge0, float edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(float edge0, float edge1, vec4 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Geometric Functions\n\n // Returns the length of vector `x`, i.e. `√x²`\n float length(float x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]²`\n float length(vec2 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]²`\n float length(vec3 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]² + x[3]²`\n float length(vec4 x);\n\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(float p0, float p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec2 p0, vec2 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec3 p0, vec3 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec4 p0, vec4 p1);\n\n // Returns the dot product of `x` and `y`, i.e. `x*y`\n float dot(float x, float y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1]`\n float dot(vec2 x, vec2 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2]`\n float dot(vec3 x, vec3 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2] + x[3]*y[3]`\n float dot(vec4 x, vec4 y);\n\n // Returns the cross product of `x` and `y`, i.e.\n //\n // ```glslx\n // vec3(\n // x[1]*y[2] - y[1]*x[2],\n // x[2]*y[0] - y[2]*x[0],\n // x[0]*y[1] - y[0]*x[1])\n // ```\n vec3 cross(vec3 x, vec3 y);\n\n // Returns a vector in the same direction as `x` but with a length of 1.\n float normalize(float x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec2 normalize(vec2 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec3 normalize(vec3 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec4 normalize(vec4 x);\n\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n float faceforward(float N, float I, float Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec2 faceforward(vec2 N, vec2 I, vec2 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec3 faceforward(vec3 N, vec3 I, vec3 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec4 faceforward(vec4 N, vec4 I, vec4 Nref);\n\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n float reflect(float I, float N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec2 reflect(vec2 I, vec2 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec3 reflect(vec3 I, vec3 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec4 reflect(vec4 I, vec4 N);\n\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return float(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n float refract(float I, float N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec2(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec2 refract(vec2 I, vec2 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec3(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec3 refract(vec3 I, vec3 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec4(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec4 refract(vec4 I, vec4 N, float eta);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Matrix Functions\n\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat2 matrixCompMult(mat2 x, mat2 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat3 matrixCompMult(mat3 x, mat3 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat4 matrixCompMult(mat4 x, mat4 y);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Vector Relational Functions\n\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(vec2 x, vec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(vec3 x, vec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(vec4 x, vec4 y);\n\n // Returns true if any component of `x` is `true`.\n bool any(bvec2 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec3 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec4 x);\n\n // Returns true only if all components of `x` are `true`.\n bool all(bvec2 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec3 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec4 x);\n\n // Returns the component-wise logical complement of `x`.\n bvec2 not(bvec2 x);\n // Returns the component-wise logical complement of `x`.\n bvec3 not(bvec3 x);\n // Returns the component-wise logical complement of `x`.\n bvec4 not(bvec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Texture Lookup Functions\n\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);\n\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);\n\n #extension GL_OES_standard_derivatives {\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdx(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdx(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdx(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdx(vec4 v);\n\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdy(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdy(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdy(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdy(vec4 v);\n\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n float fwidth(float v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec2 fwidth(vec2 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec3 fwidth(vec3 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec4 fwidth(vec4 v);\n }\n\n #extension GL_EXT_frag_depth {\n // Available only in the fragment language, `gl_FragDepthEXT` is an output variable that is used to establish the depth value for the current fragment.\n // If depth buffering is enabled and no shader writes to `gl_FragDepthEXT`, then the fixed function value for depth will be used (this value is contained\n // in the `z` component of `gl_FragCoord`) otherwise, the value written to `gl_FragDepthEXT` is used.\n //\n // If a shader statically assigns to `gl_FragDepthEXT`, then the value of the fragment's depth may be undefined for executions of the shader that take\n // that path. That is, if the set of linked fragment shaders statically contain a write to `gl_FragDepthEXT`, then it is responsible for always writing it.\n float gl_FragDepthEXT;\n }\n\n #extension GL_EXT_shader_texture_lod {\n vec4 texture2DGradEXT(sampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DLodEXT(sampler2D sampler, vec2 coord, float lod);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec3 coord, float lod);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec4 coord, float lod);\n vec4 textureCubeGradEXT(samplerCube sampler, vec3 P, vec3 dPdx, vec3 dPdy);\n vec4 textureCubeLodEXT(samplerCube sampler, vec3 coord, float lod);\n }\n}\n")); +for(var o=0,k=b.length;o',"\nimport {\n // The variable `gl_Position` is available only in the vertex language and is intended for writing the\n // homogeneous vertex position. This value will be used by primitive assembly, clipping, culling, and other\n // fixed functionality operations that operate on primitives after vertex processing has occurred.\n //\n // All executions of a well-formed vertex shader should write a value into this variable. It can be\n // written at any time during shader execution. It may also be read back by the shader after being written.\n // Compilers may generate a diagnostic message if they detect `gl_Position` is not written, or read before\n // being written, but not all such cases are detectable. The value of `gl_Position` is undefined if a vertex\n // shader is executed and does not write `gl_Position`.\n highp vec4 gl_Position;\n\n // The variable `gl_PointSize` is available only in the vertex language and is intended for\n // a vertex shader to write the size of the point to be rasterized. It is measured in pixels.\n mediump float gl_PointSize;\n\n const int gl_MaxVertexAttribs;\n const int gl_MaxVertexUniformVectors;\n const int gl_MaxVaryingVectors;\n const int gl_MaxVertexTextureImageUnits;\n const int gl_MaxCombinedTextureImageUnits;\n const int gl_MaxTextureImageUnits;\n const int gl_MaxFragmentUniformVectors;\n const int gl_MaxDrawBuffers;\n\n // The fragment shader has access to the read-only built-in variable `gl_FrontFacing` whose value is `true` if\n // the fragment belongs to a front-facing primitive. One use of this is to emulate two-sided lighting by\n // selecting one of two colors calculated by the vertex shader.\n const bool gl_FrontFacing;\n\n // The fragment shader has access to the read-only built-in variable `gl_PointCoord`. The values in\n // `gl_PointCoord` are two-dimensional coordinates indicating where within a point primitive the current\n // fragment is located. They range from 0.0 to 1.0 across the point. If the current primitive is not a\n // point, then the values read from `gl_PointCoord` are undefined.\n const mediump vec2 gl_PointCoord;\n\n // The variable `gl_FragCoord` is available as a read-only variable from within fragment shaders and it holds\n // the window relative coordinates `x`, `y`, `z`, and `1/w` values for the fragment. This value is the result\n // of the fixed functionality that interpolates primitives after vertex processing to generate fragments. The `z`\n // component is the depth value that will be used for the fragment's depth.\n const mediump vec4 gl_FragCoord;\n\n // Writing to `gl_FragColor` specifies the fragment color that will be used by the subsequent fixed\n // functionality pipeline.\n //\n // If subsequent fixed functionality consumes fragment color and an execution of a fragment shader\n // does not write a value to `gl_FragColor` then the fragment color consumed is undefined.\n mediump vec4 gl_FragColor;\n\n // The variable `gl_FragData` is an array. Writing to `gl_FragData[n]` specifies the fragment data that will be\n // used by the subsequent fixed functionality pipeline for data `n`.\n //\n // If subsequent fixed functionality consumes fragment data and an execution of a fragment shader does not write\n // a value to it, then the fragment data consumed is undefined.\n mediump vec4 gl_FragData[gl_MaxDrawBuffers];\n\n // Depth range in window coordinates\n struct gl_DepthRangeParameters {\n float near;\n float far;\n // Equal to `far - near`\n float diff;\n };\n\n uniform gl_DepthRangeParameters gl_DepthRange;\n\n ////////////////////////////////////////////////////////////////////////////////\n // Angle and Trigonometry Functions\n\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n float radians(float degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec2 radians(vec2 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec3 radians(vec3 degrees);\n // Converts `degrees` to radians, i.e. `π / 180 * degrees`\n vec4 radians(vec4 degrees);\n\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n float degrees(float radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec2 degrees(vec2 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec3 degrees(vec3 radians);\n // Converts `radians` to degrees, i.e. `180 / π * radians`\n vec4 degrees(vec4 radians);\n\n // The standard trigonometric sine function.\n float sin(float angle);\n // The standard trigonometric sine function.\n vec2 sin(vec2 angle);\n // The standard trigonometric sine function.\n vec3 sin(vec3 angle);\n // The standard trigonometric sine function.\n vec4 sin(vec4 angle);\n\n // The standard trigonometric cosine function.\n float cos(float angle);\n // The standard trigonometric cosine function.\n vec2 cos(vec2 angle);\n // The standard trigonometric cosine function.\n vec3 cos(vec3 angle);\n // The standard trigonometric cosine function.\n vec4 cos(vec4 angle);\n\n // The standard trigonometric tangent.\n float tan(float angle);\n // The standard trigonometric tangent.\n vec2 tan(vec2 angle);\n // The standard trigonometric tangent.\n vec3 tan(vec3 angle);\n // The standard trigonometric tangent.\n vec4 tan(vec4 angle);\n\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n float asin(float x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec2 asin(vec2 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec3 asin(vec3 x);\n // Arc sine. Returns an angle whose sine is `x`. The range of values returned by this function is `[-π/2, π/2]`. Results are undefined if `∣x∣>1`.\n vec4 asin(vec4 x);\n\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n float acos(float x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec2 acos(vec2 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec3 acos(vec3 x);\n // Arc cosine. Returns an angle whose cosine is `x`. The range of values returned by this function is `[0, π]`. Results are undefined if `∣x∣>1`.\n vec4 acos(vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n float atan(float y, float x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec2 atan(vec2 y, vec2 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec3 atan(vec3 y, vec3 x);\n // Arc tangent. Returns an angle whose tangent is `y/x`. The signs of `x` and `y` are used to determine what quadrant the\n // angle is in. The range of values returned by this function is `[−π,π]`. Results are undefined if `x` and `y` are both 0.\n vec4 atan(vec4 y, vec4 x);\n\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n float atan(float y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec2 atan(vec2 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec3 atan(vec3 y_over_x);\n // Arc tangent. Returns an angle whose tangent is `y_over_x`. The range of values returned by this function is `[-π/2, π/2]`.\n vec4 atan(vec4 y_over_x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Exponential Functions\n\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n float pow(float x, float y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec2 pow(vec2 x, vec2 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec3 pow(vec3 x, vec3 y);\n // Returns `x` raised to the `y` power, i.e., `xʸ`. Results are undefined if `x < 0`. Results are undefined if `x = 0` and `y <= 0`.\n vec4 pow(vec4 x, vec4 y);\n\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n float exp(float x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec2 exp(vec2 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec3 exp(vec3 x);\n // Returns the natural exponentiation of `x`, i.e., `eˣ`\n vec4 exp(vec4 x);\n\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n float log(float x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec2 log(vec2 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec3 log(vec3 x);\n // Returns the natural logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = eʸ`. Results are undefined if `x <= 0`.\n vec4 log(vec4 x);\n\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n float exp2(float x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec2 exp2(vec2 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec3 exp2(vec3 x);\n // Returns 2 raised to the `x` power, i.e., `2ˣ`.\n vec4 exp2(vec4 x);\n\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n float log2(float x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec2 log2(vec2 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec3 log2(vec3 x);\n // Returns the base 2 logarithm of `x`, i.e., returns the value `y` which satisfies the equation `x = 2ʸ`. Results are undefined if `x <= 0`.\n vec4 log2(vec4 x);\n\n // Returns `√x`. Results are undefined if `x < 0`.\n float sqrt(float x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec2 sqrt(vec2 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec3 sqrt(vec3 x);\n // Returns `√x`. Results are undefined if `x < 0`.\n vec4 sqrt(vec4 x);\n\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n float inversesqrt(float x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec2 inversesqrt(vec2 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec3 inversesqrt(vec3 x);\n // Returns `1 / √x`. Results are undefined if `x <= 0`.\n vec4 inversesqrt(vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Common Functions\n\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n float abs(float x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec2 abs(vec2 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec3 abs(vec3 x);\n // Returns `x` if `x >= 0`, otherwise it returns `-x`.\n vec4 abs(vec4 x);\n\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n float sign(float x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec2 sign(vec2 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec3 sign(vec3 x);\n // Returns `1.0` if `x > 0`, `0.0` if `x = 0`, or `-1.0` if `x < 0`\n vec4 sign(vec4 x);\n\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n float floor(float x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec2 floor(vec2 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec3 floor(vec3 x);\n // Returns a value equal to the nearest integer that is less than or equal to `x`\n vec4 floor(vec4 x);\n\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n float ceil(float x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec2 ceil(vec2 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec3 ceil(vec3 x);\n // Returns a value equal to the nearest integer that is greater than or equal to `x`\n vec4 ceil(vec4 x);\n\n // Returns `x - floor(x)`\n float fract(float x);\n // Returns `x - floor(x)`\n vec2 fract(vec2 x);\n // Returns `x - floor(x)`\n vec3 fract(vec3 x);\n // Returns `x - floor(x)`\n vec4 fract(vec4 x);\n\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n float mod(float x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, float y);\n // Modulus (modulo). Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, float y);\n\n // Modulus. Returns `x - y * floor(x/y)`\n vec2 mod(vec2 x, vec2 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec3 mod(vec3 x, vec3 y);\n // Modulus. Returns `x - y * floor(x/y)`\n vec4 mod(vec4 x, vec4 y);\n\n // Returns `y` if `y < x`, otherwise it returns `x`\n float min(float x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec2 min(vec2 x, vec2 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec3 min(vec3 x, vec3 y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, float y);\n // Returns `y` if `y < x`, otherwise it returns `x`\n vec4 min(vec4 x, vec4 y);\n\n // Returns `y` if `x < y`, otherwise it returns `x`\n float max(float x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec2 max(vec2 x, vec2 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec3 max(vec3 x, vec3 y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, float y);\n // Returns `y` if `x < y`, otherwise it returns `x`\n vec4 max(vec4 x, vec4 y);\n\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n float clamp(float x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, float minVal, float maxVal);\n // Returns `min(max(x, minVal), maxVal)`. Results are undefined if `minVal > maxVal`.\n vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);\n\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n float mix(float x, float y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec2 mix(vec2 x, vec2 y, vec2 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec3 mix(vec3 x, vec3 y, vec3 a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, float a);\n // Returns the linear blend of `x` and `y`, i.e. `x * (1-a) + y * a`\n vec4 mix(vec4 x, vec4 y, vec4 a);\n\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n float step(float edge, float x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(float edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec2 step(vec2 edge, vec2 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(float edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec3 step(vec3 edge, vec3 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(float edge, vec4 x);\n // Returns `0.0` if `x < edge`, otherwise it returns `1.0`\n vec4 step(vec4 edge, vec4 x);\n\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n float smoothstep(float edge0, float edge1, float x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(float edge0, float edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec2 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(float edge0, float edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec3 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(float edge0, float edge1, vec4 x);\n // Returns `0.0` if `x <= edge0` and `1.0` if `x >= edge1` and performs smooth Hermite interpolation between 0 and 1 when `edge0 < x < edge1`.\n // This is useful in cases where you would want a threshold function with a smooth transition. This is equivalent to:\n //\n // ```glslx\n // vec4 t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n // return t * t * (3.0 - 2.0 * t);\n // ```\n //\n // Results are undefined if `edge0 >= edge1`.\n vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Geometric Functions\n\n // Returns the length of vector `x`, i.e. `√x²`\n float length(float x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]²`\n float length(vec2 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]²`\n float length(vec3 x);\n // Returns the length of vector `x`, i.e. `√x[0]² + x[1]² + x[2]² + x[3]²`\n float length(vec4 x);\n\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(float p0, float p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec2 p0, vec2 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec3 p0, vec3 p1);\n // Returns the distance between `p0` and `p1`, i.e. `length(p0 - p1)`\n float distance(vec4 p0, vec4 p1);\n\n // Returns the dot product of `x` and `y`, i.e. `x*y`\n float dot(float x, float y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1]`\n float dot(vec2 x, vec2 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2]`\n float dot(vec3 x, vec3 y);\n // Returns the dot product of `x` and `y`, i.e. `x[0]*y[0] + x[1]*y[1] + x[2]*y[2] + x[3]*y[3]`\n float dot(vec4 x, vec4 y);\n\n // Returns the cross product of `x` and `y`, i.e.\n //\n // ```glslx\n // vec3(\n // x[1]*y[2] - y[1]*x[2],\n // x[2]*y[0] - y[2]*x[0],\n // x[0]*y[1] - y[0]*x[1])\n // ```\n vec3 cross(vec3 x, vec3 y);\n\n // Returns a vector in the same direction as `x` but with a length of 1.\n float normalize(float x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec2 normalize(vec2 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec3 normalize(vec3 x);\n // Returns a vector in the same direction as `x` but with a length of 1.\n vec4 normalize(vec4 x);\n\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n float faceforward(float N, float I, float Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec2 faceforward(vec2 N, vec2 I, vec2 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec3 faceforward(vec3 N, vec3 I, vec3 Nref);\n // If `dot(Nref, I) < 0` return `N`, otherwise return `-N`\n vec4 faceforward(vec4 N, vec4 I, vec4 Nref);\n\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n float reflect(float I, float N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec2 reflect(vec2 I, vec2 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec3 reflect(vec3 I, vec3 N);\n // For the incident vector `I` and surface orientation `N`, returns the reflection direction: `I - 2 * dot(N, I) * N`.\n // `N` must already be normalized in order to achieve the desired result.\n vec4 reflect(vec4 I, vec4 N);\n\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return float(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n float refract(float I, float N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec2(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec2 refract(vec2 I, vec2 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec3(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec3 refract(vec3 I, vec3 N, float eta);\n // For the incident vector `I` and surface normal `N`, and the ratio of indices of refraction `eta`, return the refraction vector.\n // The result is computed by:\n //\n // ```glslx\n // float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));\n // if (k < 0.0) return vec4(0.0);\n // else return eta * I - (eta * dot(N, I) + sqrt(k)) * N;\n // ```\n //\n // The input parameters for the incident vector `I` and the surface normal `N`.\n vec4 refract(vec4 I, vec4 N, float eta);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Matrix Functions\n\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat2 matrixCompMult(mat2 x, mat2 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat3 matrixCompMult(mat3 x, mat3 y);\n // Multiply matrix `x` by matrix `y` component-wise, i.e., `result[i][j]` is the scalar product of `x[i][j]` and `y[i][j]`.\n // Note: to get linear algebraic matrix multiplication, use the multiply operator (`*`).\n mat4 matrixCompMult(mat4 x, mat4 y);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Vector Relational Functions\n\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec2 lessThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec3 lessThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x < y`.\n bvec4 lessThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec2 lessThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec3 lessThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x <= y`.\n bvec4 lessThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec2 greaterThan(vec2 x, vec2 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec3 greaterThan(vec3 x, vec3 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x > y`.\n bvec4 greaterThan(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec2 greaterThanEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec3 greaterThanEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x >= y`.\n bvec4 greaterThanEqual(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec2 equal(vec2 x, vec2 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec3 equal(vec3 x, vec3 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x == y`.\n bvec4 equal(vec4 x, vec4 y);\n\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(bvec2 x, bvec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(ivec2 x, ivec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec2 notEqual(vec2 x, vec2 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(bvec3 x, bvec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(ivec3 x, ivec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec3 notEqual(vec3 x, vec3 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(bvec4 x, bvec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(ivec4 x, ivec4 y);\n // Returns the component-wise compare of `x != y`.\n bvec4 notEqual(vec4 x, vec4 y);\n\n // Returns true if any component of `x` is `true`.\n bool any(bvec2 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec3 x);\n // Returns true if any component of `x` is `true`.\n bool any(bvec4 x);\n\n // Returns true only if all components of `x` are `true`.\n bool all(bvec2 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec3 x);\n // Returns true only if all components of `x` are `true`.\n bool all(bvec4 x);\n\n // Returns the component-wise logical complement of `x`.\n bvec2 not(bvec2 x);\n // Returns the component-wise logical complement of `x`.\n bvec3 not(bvec3 x);\n // Returns the component-wise logical complement of `x`.\n bvec4 not(bvec4 x);\n\n ////////////////////////////////////////////////////////////////////////////////\n // Texture Lookup Functions\n\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2D(sampler2D sampler, vec2 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`.\n vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the 2D texture currently bound to `sampler`.\n // The texture coordinate `(coord.s, coord.t)` is divided by the last component of `coord`. The third component of `coord` is ignored.\n vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);\n\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCube(samplerCube sampler, vec3 coord, float bias);\n // Use the texture coordinate `coord` to do a texture lookup in the cube map texture currently bound to `sampler`.\n // The direction of `coord` is used to select which face to do a 2-dimensional texture lookup in.\n vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);\n\n #extension GL_OES_standard_derivatives {\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdx(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdx(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdx(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `x` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdx(dFdx(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdx(vec4 v);\n\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n float dFdy(float v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec2 dFdy(vec2 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec3 dFdy(vec3 v);\n // Available only in the fragment shader, this function returns the partial derivative of expression `p` with respect to the window `y` coordinate.\n //\n // Expressions that imply higher order derivatives such as `dFdy(dFdy(n))` have undefined results, as do mixed-order derivatives such as\n // `dFdx(dFdy(n))`. It is assumed that the expression `p` is continuous and therefore, expressions evaluated via non-uniform control flow may be undefined.\n vec4 dFdy(vec4 v);\n\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n float fwidth(float v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec2 fwidth(vec2 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec3 fwidth(vec3 v);\n // Returns the sum of the absolute derivative in `x` and `y` using local differencing for the input argument `p`, i.e. `abs(dFdx(p)) + abs(dFdy(p))`\n vec4 fwidth(vec4 v);\n }\n\n #extension GL_EXT_frag_depth {\n // Available only in the fragment language, `gl_FragDepthEXT` is an output variable that is used to establish the depth value for the current fragment.\n // If depth buffering is enabled and no shader writes to `gl_FragDepthEXT`, then the fixed function value for depth will be used (this value is contained\n // in the `z` component of `gl_FragCoord`) otherwise, the value written to `gl_FragDepthEXT` is used.\n //\n // If a shader statically assigns to `gl_FragDepthEXT`, then the value of the fragment's depth may be undefined for executions of the shader that take\n // that path. That is, if the set of linked fragment shaders statically contain a write to `gl_FragDepthEXT`, then it is responsible for always writing it.\n float gl_FragDepthEXT;\n }\n\n #extension GL_EXT_shader_texture_lod {\n vec4 texture2DGradEXT(sampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DLodEXT(sampler2D sampler, vec2 coord, float lod);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjGradEXT(sampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec3 coord, float lod);\n vec4 texture2DProjLodEXT(sampler2D sampler, vec4 coord, float lod);\n vec4 textureCubeGradEXT(samplerCube sampler, vec3 P, vec3 dPdx, vec3 dPdy);\n vec4 textureCubeLodEXT(samplerCube sampler, vec3 coord, float lod);\n }\n}\n")); +for(var Q=0,ia=b.length;Q',a,b,10);break;case 42:V(c,'>=',a,b,10);break;case 44:V(c,'<',a,b,10);break;case 45:V(c,'<=',a,b,10);break;case 46:V(c,'&&',a,b,5);break;case 47:V(c,'||',a,b,3);break;case 48:V(c,'^^',a,b,4);break;case 49:V(c,'*',a,b,13);break;case 50:V(c,'!=',a,b,10);break;case 51:V(c,'-',a,b,12); +break;case 52:V(c,'=',a,b,2);break;case 53:V(c,'+=',a,b,2);break;case 54:V(c,'/=',a,b,2);break;case 55:V(c,'*=',a,b,2);break;case 56:V(c,'-=',a,b,2);break;default:c.a+=Sg[a.b];break}}function _b(f,a,b,c){var d=b.g,e=d.b;f.a+=a,(a.charCodeAt(0)==45&&(e==31||e==34||Wf(d))||a.charCodeAt(0)==43&&(e==33||e==35))&&(f.a+=' '),I(f,d,14)}function Nd(d,a,b,c){I(d,b.g,15),d.a+=a}function V(f,a,b,c,d){var e=Bc(b.b);dZ});case 42:return tc(a,function($,ca){return $>=ca});case 44:return tc(a,function(ua,aa){return ua2&&(d=2),Yb(c,d)}function tf(a,b,c){switch(c){case 48:switch(b){case 65:return!0;case 96:return!1}break;case 47:switch(b){case 62:return!0;case 96:return!1}break;case 65:if(b==65)return!0;break;case 62:if(b==62)return!0;break;case 85:if(ud(b)||b==88)return!1;break;case 84:if(ud(b)||b==88)return!1;break;case 81:case 90:case 89:case 88:case 82:return!1;case 87:if(b==83)return!1;break}switch(b){case 85:case 84:case 82:case 49:case 46:return!1;case 65:case 62:switch(a){case 99:case 85:case 84:case 81:case 80:case 90:case 49:case 46:case 32:case 12:return!1}if(Fg(a))return!1;break;case 48:case 47:if(c==96)return!1;break}return!0}function uc(a){return a==10||a==13}function uf(a){for(var b=0,c=a.length;b0&&!uc(b.charCodeAt(g-1|0));)g=g-1|0;for(var i=b.slice(g),o=i,C=0,B=e.slice(1),U=B.length;C',a),h=Jc(e,f,1);if(e.c)return a;var m='',l=99,g=99,i=0,o=0,k=!0,r=0,s=null,w=function(p){return!vc(a.slice(h[p-1|0].a.c,h[p].a.b))},C=function(B,U){switch(B){case 90:case 87: +return!0;case 4:case 9:case 10:case 11:case 12:case 15:case 17:case 32:case 43:return!U}return!1},F=null,Q=function(){for(var ia=1,M=r;M0;s=s-1|0){for(var w=[],Va=0,wa=k,xa=wa.length;Va=s&&w.push(p)}if(w.length){k=w;break}}if(k.length>1){var C=k.slice();Ab(C,function(B){for(var U=l[B].i,F=0,eb=Math.min(U.length,h.length);F-1){c+=' {\n';for(var i=0,o=b.g,k=o.length;id&&c.charCodeAt(e-1|0)==32;)e=e-1|0;b!=''&&(b+='\n'), +b+=c.slice(d,e)}return b}function $d(a,b,c){if(!b)return a+': '+c+'\n';var d=ld(b,0);return kd(b)+': '+a+': '+c+'\n'+d.a+'\n'+d.b+'\n'}function Ff(c){for(var a=new nh,d=0,e=c.a,f=e.length;d1&&a.charCodeAt(0)==48&&a.charCodeAt(1)^120&&a.charCodeAt(1)^88?parseInt(a,8):a|0}function Yf(){var a=new Oh,b=function(c,d,e){return ae(c.a,d.a),v(t(new Jh(27),K),_a(d.a,e.c))},f=function(h,m,l,g){return ae(h.a,l.a),v(t(new Jh(27),K),_a(m.c,g.c))};return P(a,36,function(i,o){return v(t(Ba(new Jh(28),!0),Y),o.a)}),P(a,13,function(k,r){return v(t(Ba(new Jh(28),!1),Y),r.a)}),P(a,97,function(s,w){return v(t(_(new Jh(30),Xf(L(w.a))),ga),w.a)}),P(a,95,function(p,C){return v(t(ma(new Jh(29),+L(C.a)),da),C.a)}),P(a,3,ba(Y)),P(a,5,ba(Lb)),P(a,6,ba(Mb)),P(a,7,ba(Nb)),P(a,14,ba(da)),P(a,20,ba(ga)),P(a,22,ba(vb)),P(a,23,ba(wb)),P(a,24,ba(xb)),P(a,26,ba(ob)),P(a,27,ba(pb)),P(a,28,ba(qb)),P(a,39,ba(Fa)),P(a,40,ba(Ga)),P(a,41,ba(Ha)),P(a,42,ba(yd)),Ib(a,46,14,b),Ib(a,47,14,ec(34)), +Ib(a,48,14,ec(35)),Ib(a,62,14,ec(31)),Ib(a,49,14,ec(32)),Ib(a,65,14,ec(33)),ve(a,47,15,me(36)),ve(a,48,15,me(37)),R(a,53,13,W(39)),R(a,54,10,W(40)),R(a,55,10,W(41)),R(a,56,10,W(42)),R(a,57,10,W(44)),R(a,58,10,W(45)),R(a,62,12,W(51)),R(a,63,13,W(49)),R(a,64,10,W(50)),R(a,65,12,W(38)),R(a,66,13,f),R(a,67,11,f),R(a,68,11,f),R(a,60,3,W(47)),R(a,61,4,W(48)),R(a,59,5,W(46)),R(a,50,8,f),R(a,51,6,f),R(a,52,7,f),ta(a,69,2,W(52)),ta(a,70,2,W(53)),ta(a,71,2,f),ta(a,72,2,f),ta(a,73,2,f),ta(a,74,2,W(54)),ta(a,75,2,W(55)),ta(a,76,2,f),ta(a,77,2,f),ta(a,78,2,f),ta(a,79,2,W(56)),P(a,96,function(B,U){var F=L(U.a),Q=pd(B.l,F);return Q?(Q.m!=null&&ya(B.c.a,Q.m,0)==1&&u(B.a,U.a,'Cannot use "'+F+'" from disabled extension "'+Q.m+'"'),v(Q instanceof Tb?t(new Jh(26),J(Q)):Cc(new Jh(23),Q),U.a)):(Jf(B.a,U.a),v(t(new Jh(24),K),U.a))}),R(a,81,1,function(ia,M,ha,Z){return M.b^25&&(M=v(n(new Jh(25),M),M.c)),n(M,Z),v(M,A(ia,M.c))}),Da(a,82,16).c=function($,ca){var ua=y($).a;E($);var aa=y($).a;return z($,96)?Qa(v(cc(n(new Jh(21),ca),L(aa)), +A($,ca.c)),aa):Qa(v(cc(n(new Jh(21),ca),''),A($,ca.c)),xe(ua))},Da(a,85,0).b=function(ka){var va=E(ka),Ua=T(a,ka,0);return !Ua||!z(ka,89)?v(t(new Jh(24),K),A(ka,va.a)):v(Ua,A(ka,va.a))},Da(a,85,15).c=function(la,rb){var La=E(la),Va=n(new Jh(20),rb);return Zf(la,Va,89)?Qa(v(Va,A(la,rb.c)),A(la,La.a)):v(t(new Jh(24),K),A(la,La.a))},Da(a,84,16).c=function(wa,xa){var eb=E(wa);if(y(wa).b==88)return Gb(wa),E(wa),v(t(new Jh(24),K),A(wa,eb.a));var Ia=T(a,wa,0);return !Ia||!z(wa,88)?v(t(new Jh(24),K),A(wa,eb.a)):Qa(v(n(n(new Jh(43),xa),Ia),A(wa,xa.c)),A(wa,eb.a))},Da(a,86,2).c=function(Ja,fb){var sb=E(Ja),tb=T(a,Ja,1);if(!tb||!z(Ja,80))return v(t(new Jh(24),K),A(Ja,sb.a));var bb=T(a,Ja,1);return bb?v(n(n(n(new Jh(22),fb),tb),bb),A(Ja,fb.c)):v(t(new Jh(24),K),A(Ja,sb.a))},a}function Zf(a,b,c){for(var d=!0;!O(a,c);){d||z(a,81);var e=y(a),f=T(db,a,1);if(f)n(b,f);else if(n(b,v(t(new Jh(24),K),A(a,e.a))),y(a).b^81&&y(a).b^c)return!1;d=!1}return!0}function _f(a){var b=E(a);a.l=new Vh(3,a.l);var c=Za(a,2);if(!c||!z(a,43)||!z(a, +85))return null;var d=T(db,a,0);return !d||!z(a,89)?null:(Hb(a),Eb(a,b.a,n(n(new Jh(7),c),d)))}function $f(a){var b=E(a),c=a.h;if(a.h|=b.b^44?2048:1024,O(a,83)){var d=new Jh(13);return !fc(a,d,1)||!z(a,87)?null:(a.h=c,v(d,A(a,b.a)))}var e=Za(a,1);return e&&(a.h=c,e)}function bg(a){var b=E(a),c=y(a).a;if(!z(a,96))return null;var d=L(c);if(O(a,83)){a.c.a.has(d)||Na(a.c.a,d,0);var e=new Jh(13);if(!fc(a,e,1)||!z(a,87))return null;for(var f=e.g;f;f=f.k)if(f.b^17)f.e&&(f.e.m=d);else for(var h=f.g.k;h;h=h.k)h.e.m=d;return v(e,A(a,b.a))}if(!bh.has(d)&&!a.c.a.has(d)&&Gf(a.a,c,'The extension "'+d+'" is not in the known list of valid WebGL extensions'),!z(a,80))return null;var m=L(y(a).a);if(!ag.has(m))return Gb(a),null;E(a);var l=ag.get(m);return Na(a.c.a,d,l),Qa(v(_(cc(new Jh(9),d),l),A(a,b.a)),c)}function cg(a){var b=E(a);if(a.l=new Vh(3,a.l),!z(a,85))return null;var c=null;if(!O(a,90)){var d=pe(a),e=hd(a,2),f=null;if(e){if(f=Fb(a,1),!f)return null}else f=Fb(a,0);if(f){if(c=oe(a,b.a,e,f,0,d),!c)return null}else if((c=T(db, +a,0),!c)||!z(a,90))return null}var h=null;if(!O(a,90)&&((h=T(db,a,0),!h)||!z(a,90)))return null;var m=null;if(!O(a,89)&&((m=T(db,a,0),!m)||!z(a,89)))return null;var l=Za(a,2);return l&&(Hb(a),v(ke(c,h,m,l),A(a,b.a)))}function dg(a){var b=E(a);if(!z(a,85))return null;var c=y(a),d=T(db,a,0);if(d||(d=v(t(new Jh(24),K),A(a,c.a))),!z(a,89))return null;var e=Za(a,2);if(!e)return null;var f=null;return O(a,12)&&(f=Za(a,2),!f)?null:v(n(n(n(new Jh(12),d),e),f),A(a,b.a))}function eg(a){var b=E(a),c=y(a).a;return z(a,97)?v(_(new Jh(18),L(c)|0),A(a,b.a)):null}function fg(a){var b=E(a);if(a.l=new Vh(3,a.l),!z(a,85))return null;var c=y(a),d=T(db,a,0);if(d||(d=v(t(new Jh(24),K),A(a,c.a))),!z(a,89))return null;var e=Za(a,2);return e&&(Hb(a),v(n(n(new Jh(19),d),e),A(a,b.a)))}function gg(a){var b=E(a),c=null;if(!O(a,90)){var d=y(a);c=T(db,a,0),c||(c=v(t(new Jh(24),K),A(a,d.a))),z(a,90)}return v(n(new Jh(15),c),A(a,b.a))}function hg(a){var b=E(a),c=0;switch(y(a).b){case 25:c=32;break;case 29:c=64;break;case 16:c=4;break;default: +return Gb(a),null}E(a);var d=Fb(a,1);return d&&Eb(a,b.a,n(_(new Jh(14),c),d))}function ig(a,b,c){var d=y(a).a;if(!z(a,96))return null;var e=new Tb(sc(a.c),d,L(d),new Vh(4,a.l));if(e.e|=a.h|b,e.f=c,!id(a,e))return null;var f=y(a).a,h=new Jh(1),m=null;if(!z(a,83))return null;for(a.l=e.d;y(a).b^87&&y(a).b^99;){var l=Za(a,3);if(!l)return null;if(l.b^17)u(a.a,l.c,'This statement cannot be used inside a struct');else{n(h,l);for(var g=l.g.k;g;g=g.k){var i=g.e;e.g.push(i),N(i)&&u(a.a,N(i).c,'Cannot initialize struct variables')}}}if(Hb(a),!z(a,87))return null;if(v(h,A(a,f)),y(a).b^96)z(a,90);else if(m=te(0,t(new Jh(26),J(e)),E(a).a,a,c),!m)return null;return n(n(Cc(new Jh(16),e),h),m)}function ne(a,b,c){for(var d=!1,e=a.l;e;e=e.b)if(e.a==3){d=!0;break}return d||u(a.a,b,'This statement cannot be used outside a loop'),Eb(a,b,c)}function Eb(a,b,c){return z(a,90),v(c,A(a,b))}function oe(a,b,c,d,e,f){var h=y(a).a;if(!c&&y(a).b^96){var m=ue(db,a,0,d);return m&&Eb(a,b,n(new Jh(8),m))}if(!z(a,96))return null;if(O(a,85))return kg(c, +d,h,a,f);var l=te(c,d,h,a,f);return l&&v(l,A(a,b))}function pe(a){var b=y(a),c=b.c;if(!c)return null;for(var d=b.a.b,e=null,f=c.length-1|0;f>-1;f=f-1|0){for(var h=c[f],m=h.a.b.slice(h.c,d),l=0,g=0;g1)break;(e||(e=[])).push(L(h)),d=h.b}return e&&e.reverse(),e}function Za(a,b){var c=y(a);switch(c.b){case 4:return ne(a,E(a).a,new Jh(4));case 9:return ne(a,E(a).a,new Jh(5));case 10:return Eb(a,E(a).a,new Jh(6));case 11:return _f(a);case 44:case 45:return $f(a);case 91:return bg(a);case 15:return cg(a);case 17:return dg(a);case 83:return re(a);case 31:return hg(a);case 32:return gg(a);case 90:return v(new Jh(3),E(a).a);case 92:return eg(a);case 43:return fg(a)}var d=pe(a),e=hd(a,b),f=null;if(O(a,35)){var h=ig(a,e,d);return h&&v(h,A(a,c.a))}if(e){if(f=Fb(a,1),!f)return null}else f=Fb(a,0);if(f)return oe(a,c.a,e,f,1,d);var m=T(db,a,0);return m&&Eb(a,c.a,n(new Jh(8),m))}function qe(a,b){if(b.b^17&&b.b^16){ +var c=a.l.a==1||a.l.a==4,d=b.b==9||b.b==11||b.b==14||b.b==18;d&&!c?u(a.a,b.c,'This statement cannot be used inside a function'):!d&&c&&u(a.a,b.c,'This statement cannot be used outside a function')}}function jg(a,b){var c=y(a).a;if(!z(a,98))return!1;var d=null;try{d=JSON.parse(L(c))}catch(l){return u(a.a,c,'Invalid string literal'),!1}var e=a.c.b;if(!e)return u(a.a,c,'Cannot include files without access to a file system'),!1;var f=e(d,c.a.a);if(!f)return u(a.a,c,'Cannot read the file '+JSON.stringify(d)),!1;if(a.e.has(f.a))return!0;Na(a.e,f.a,!0),a.f.push(new Lh(c,Cg(f)));var h=Jc(a.a,f,0),m=new Mh(a.a,h,a.c,a.d,a.e);return m.l=a.l,!fc(m,b,1)||!z(m,99)?!1:!0}function re(a){var b=y(a),c=new Jh(3);return a.l=new Vh(2,a.l),!z(a,83)||!fc(a,c,2)||!z(a,87)?null:(Hb(a),v(c,A(a,b.a)))}function hd(a,b){for(var c=0;;){var d=y(a).b;switch(d){case 2:c|=1;break;case 8:c|=2;break;case 16:c|=4;break;case 18:c|=8;break;case 19:c|=16;break;case 25:c|=32;break;case 29:c|=64;break;case 30:c|=128;break;case 37:c|=256;break;case 38: +c|=512;break;default:return c}(!b&&(d==2||d==37||d==38)||b==3&&d^25&&d^29&&d^16||b&&(d==18||d==30||d==19))&&u(a.a,y(a).a,'Cannot use this qualifier here'),E(a)}}function Fb(a,b){var c=y(a),d=null;switch(c.b){case 3:d=Y;break;case 5:d=Lb;break;case 6:d=Mb;break;case 7:d=Nb;break;case 14:d=da;break;case 20:d=ga;break;case 22:d=vb;break;case 23:d=wb;break;case 24:d=xb;break;case 26:d=ob;break;case 27:d=pb;break;case 28:d=qb;break;case 33:d=Lg;break;case 34:d=Mg;break;case 39:d=Fa;break;case 40:d=Ga;break;case 41:d=Ha;break;case 42:d=yd;break;case 96:var e=pd(a.l,L(c.a));if(!e||!(e instanceof Tb))return b^1||Gb(a),null;d=J(e);break;default:return b^1||Gb(a),null}return E(a),v(t(new Jh(26),d),A(a,c.a))}function kg(a,b,c,d,e){var f=d.l,h=new oc(sc(d.c),c,L(c),new Vh(0,f));if(h.e|=d.h|a|(h.c=='main'?1024:0),h.f=e,h.o=b,d.l=h.d,O(d,42)){if(!z(d,89))return null}else if(!O(d,89)){for(;;){var m=hd(d,0),l=Fb(d,1);if(!l)return null;var g=y(d).a;if(!z(d,96))return null;var i=new Ge(sc(d.c),g,L(g),d.l,0);if(i.e|=m,i.p=l,h.i.push(i), +id(d,i),!se(d,i))return null;if(!O(d,81))break}if(!z(d,89))return null}var o=ya(f.c,L(c),null),k=!O(d,90);if(o){if(o instanceof oc){for(var r=o;r;r=r.r)if(Eg(r,h)){r.o.f!=h.o.f?Kf(d.a,h.o.c,h.c,h.o.f,r.o.f,r.o.c):r.k||!k?bd(d.a,h.b,r.b):(r.s=h,h.s=r,h.e|=r.e,r.e=h.e);break}h.r=o,Bg(f,h)}else return bd(d.a,c,o.b),null}else Fe(f,h);if(k){var s=d.h;if(d.h&=-3073,h.k=re(d),d.h&=s,!h.k)return null}return Hb(d),v(Cc(new Jh(11),h),A(d,b.c))}function se(a,b){var c=y(a);if(O(a,84)){if(O(a,88))return u(a.a,A(a,c.a),'All array sizes must be specified'),!0;if(b.B=T(db,a,0),!b.B||!z(a,88))return!1;var d=0;if(X(a.d,b.B),pa(a.d,b.B,ga),b.B.f!=K){var e=G(b.B);if(e){if(e.b==30){var f=e.h|0;f<1?u(a.a,b.B.c,'Cannot declare an array with a size of "'+f+'"'):d=f}}else u(a.a,b.B.c,'This value must be a compile-time constant')}for(;y(a).b==84;){if(c=E(a),y(a).b^88&&!T(db,a,0)||!z(a,88))return!1;u(a.a,A(a,c.a),'Multidimensional arrays are not a part of the language')}b.p=v(t(new Jh(26),Ig(b.p.f,d)),b.p.c)}return!0}function te(a,b,c,d,e){ +for(var f=n(_(new Jh(17),d.h|a),b);;){var h=new Ge(sc(d.c),c,L(c),d.l,d.l.a^1?d.l.a^4?2:3:1);if(h.e|=d.h|a,h.f=e,h.p=b,!se(d,h))return null;var m=y(d).a,l=null;if(O(d,69)){var g=y(d);l=T(db,d,1),l||(l=v(t(new Jh(24),K),A(d,g.a)))}else m=null;var i=Qa(v(n(Cc(new Jh(2),h),l),A(d,h.b)),m);if(h.C=i,h.e&2&&X(d.d,i),n(f,i),id(d,h),!O(d,81))return z(d,90),f;if(c=y(d).a,!z(d,96))return null}}function id(a,b){var c=ya(a.l.c,b.c,null);return c?(bd(a.a,b.b,c.b),!1):(Fe(a.l,b),!0)}function fc(a,b,c){for(;y(a).b^99&&y(a).b^87;){var d=y(a).a;if(O(a,93)){if(c^1)return u(a.a,d,'"#include" statements cannot be used here'),O(a,98),!1;if(!jg(a,b))return!1}else{var e=Za(a,c);if(!e)return!1;if(e.b^13)qe(a,e),n(b,e);else for(;e.g;){var f=q(e.g);qe(a,f),n(b,f)}}}return!0}function jd(a,b,c,d,e,f){db||(db=Yf());var h=new Map,m=new Mh(a,b,d,f,h);return m.l=e,fc(m,c,1)&&z(m,99),new Kh(m.f)}function y(a){return a.b[a.m]}function E(b){var a=y(b);return (b.m+1|0)0?c.m-1|0:0];return b.a.c0?e.b[e.m-1|0]:b).a;return a==90||we(d).a^we(c).a?u(e.a,xe(d),'Expected '+Oe[a]):u(e.a,c,'Expected '+Oe[a]+' but found '+Oe[b.b]),!1}function Gb(a){If(a.a,y(a))}function Hb(a){a.l=a.l.b}function Da(e,a,b){var c=ra(e.a,a,null);if(c)b>c.a&&(c.a=b);else{var d=new Nh(b);c=d,za(e.a,a,d)}return c}function T(f,a,b){var c=y(a),d=ra(f.a,c.b,null);if(!d||!d.b)return Gb(a),null;var e=ue(f,a,b,d.b(a));return e}function ue(f,a,b,c){for(;c;){var d=y(a).b,e=ra(f.a,d,null);if(!e||!e.c||e.a<=b)break;c=e.c(a,c)}return c}function P(d,a,b){Da(d,a,0).b=function(c){return b(c,E(c))}}function Ib(h,a,b,c){Da(h,a,0).b=function(d){var e=E(d),f=T(h,d,b);return f&&c(d,e,f)}}function ve(f,a,b,c){Da(f,a,b).c=function(d,e){return c(d,e,E(d))}}function R(m,a,b,c){Da(m,a,b).c=function(d,e){var f=E(d),h=T(m,d,b);return h&&c(d,e,f,h)}}function ta(m,a,b,c){Da(m,a,b).c=function(d,e){var f=E(d),h=T(m,d,b-1|0);return h&&c(d,e,f,h)}}function L(a){ +return a.a.b.slice(a.b,a.c)}function kd(b){var a=Jb(b.a,b.b);return b.a.a+':'+(a.a+1|0)+':'+(a.b+1|0)}function lg(b,a){return b.a==a.a&&b.b0&&k>a){var r=Math.min(g-l|0,a/2|0),s=Math.max((a-r|0)/2|0,3);if(l(a-3|0)&&(g=a-3|0);else if((k-l|0)<(a-s|0)){var w=k-a|0;d='...'+rc(m.slice(w+3|0,k)),l=l-w|0,g=g-w|0}else{var p=l-s|0;d='...'+rc(m.slice(p+3|0,(p+a|0)-3|0))+'...',l=l-p|0,g=g-p|0,g>(a-3|0)&&(g=a-3|0)}}else d=rc(m);return new Ph(d,Yb(' ',l)+((g-l|0)<2?'^':Yb('~',g-l|0)))}function mg(c,a,b){return new Qh(c.a,c.b+a|0,c.b+b|0)}function we(a){return Jb(a.a,a.b)}function xe(a){return new Qh(a.a,a.c,a.c)}function _a(a,b){return new Qh(a.a,a.b,b.c)}function ng(a){ +var b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'[a%53];for(a=a/53|0;a>0;)a=a-1|0,b+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'[a%63],a=a/63|0;return b}function og(o,a){for(var b=0,k=a.length;b=g)&&u(i.a,c.c,'Index "'+l+'" is out of bounds for type "'+D(d)+'"')}}break}a.f==K&&d!=K&&e!=K&&(a.b^43?Qf(i.a,a.d,L(a.d),d,e):u(i.a,a.d,'No index operator for type "'+D(d)+'" and type "'+D(e)+'"'))}function ug(m,a){var b=a.g;X(m,b);for(var c=b.f,d=c.a,e=[],f=!1,h=b.k;h;h=h.k)ja(m, +h),e.push(h),h.f==K&&(f=!0);if(!f){if(d){if(d instanceof oc){wg(m,d,a,e);return}if(d instanceof Tb){xg(m,c,a,e);return}}c!=K&&u(m.a,b.c,'Cannot call type "'+D(c)+'"')}}function vg(m,a){var b=a.g,c=a.m,d=a.d;if(ja(m,b),c!=''){var e=b.f,f=he(a);switch(e){case Lb:case vb:case Fa:case Mb:case wb:case Ga:case Nb:case xb:case Ha:a.f=yg(m,d,e,c,f);break;case K:break;default:if(e.a&&e.a instanceof Tb)for(var l=0,g=e.a.g,i=g.length;l=d&&Lf(w.a,h.c,a,d,f+l|0),ab(m)&&(e=!0),f=f+l|0}var g=ab(a)&&e;g&&c.length^1?u(w.a,b.d,'If a matrix argument is given to a matrix constructor, it is an error to have any other arguments'):f4)return u(l.a,a,'Invalid swizzle "'+c+'" on type "'+D(b)+'"'),K;for(var f=Ea(b),g=0,i=rd(f),o=i.length;g(jc.h|0)):ub.b==29&&jc.b==29&&S(x,a,ub.h>jc.h);break;case 42:var Ka=a.g,Wa=a.i;Ka.b^30?Wa.b^30?Ka.b==30&&Wa.b==30?S(x,a,(Ka.h|0)>=(Wa.h|0)):Ka.b==29&&Wa.b==29&&S(x,a,Ka.h>=Wa.h):(a.b=41,_(Wa,(Wa.h|0)-1|0),x.a=!0):(a.b=41,_(Ka,(Ka.h|0)+1|0),x.a=!0);break;case 43:var pc=a.g,kc=a.i,Oc=pc.f;if(kc.b==30){var Ob=kc.h|0,Pb=0;switch(Oc){case Lb:case vb:case Fa:Pb=2;break;case Mb:case wb:case Ga:Pb=3;break;case Nb:case xb:case Ha: +Pb=4;break}Ob>-1&&Ob=d.d.length)return'';var b=d.d[a],c=(a+1|0)0;){var d=b/2|0,e=c+d|0;h.d[e]<=a?(c=e+1|0,b=(b-d|0)-1|0):b=d}var f=c>0?a-h.d[c-1|0]|0:a;return new Wh(c-1|0,f)}function Kb(d,a,b){if(qd(d),a>-1&&a-1&&(c+b|0)<((a+1|0)64&&r<91||r>96&&r<123||r==95){var s=ya(Gg,g,99);s^99?e.push(new Zh(k, +s,f)):Hg.has(g)?Hf(a,k):e.push(new Zh(k,96,f))}else if(r>47&&r<58||r==46&&i>1)e.push(new Zh(k,gh.test(g)?97:95,f));else if(r^35){if(r^34){var p=ya(hh,g,99);p^99||(g.startsWith('//')?c^1?(f||(f=[])).push(k):p=0:g.startsWith('/*')&&(c^1?(f||(f=[])).push(k):p=1)),p^99&&e.push(new Zh(k,p,f))}else e.push(new Zh(k,98,f))}else{var w=94;switch(g){case'#version':w=92;break;case'#extension':w=91;break;case'#include':w=93;break}e.push(new Zh(k,w,f))}}else if(g!=''){u(a,k,'Syntax error "'+g+'"');break}e.length^h&&(f=null,h=e.length),m=o}return e.push(new Zh(new Qh(b,m,m),99,f)),e}function He(a){return a.b?He(a.b):a}function Ig(c,a){c.f||(c.f=new Map);var b=ra(c.f,a,null);return b||(za(c.f,a,b=new _h(null,c,a)),b.d=!0,b.e=c.e),b}function D(a){return a.b?a.c?D(a.b)+'['+a.c+']':D(a.b)+'[]':a.a.c}function Sa(a){switch(a){case Lb:case Fa:case vb:case ob:return 2;case Mb:case Ga:case wb:case pb:return 3;case Nb:case Ha:case xb:case qb:return 4}return a.c}function vd(a){switch(a){case Lb:case Mb:case Nb:return Y;case Fa:case Ga:case Ha: +return da;case vb:case wb:case xb:return ga;case ob:return Fa;case pb:return Ga;case qb:return Ha}return a.b}function Ea(a){switch(a){case Y:case da:case ga:return 1;case Lb:case Fa:case vb:return 2;case Mb:case Ga:case wb:return 3;case Nb:case Ha:case xb:case ob:return 4;case pb:return 9;case qb:return 16}return 0}function fa(a){switch(a){case Y:case Lb:case Mb:case Nb:return Y;case da:case Fa:case Ga:case Ha:case ob:case pb:case qb:return da;case ga:case vb:case wb:case xb:return ga}return null}function wd(a){switch(a){case Lb:case Mb:case Nb:case vb:case wb:case xb:case Fa:case Ga:case Ha:return!0}return!1}function ab(a){switch(a){case ob:case pb:case qb:return!0}return!1}function Kc(a){switch(a){case ga:case vb:case wb:case xb:return!0}return!1}function Lc(a){switch(a){case da:case Fa:case Ga:case Ha:return!0;case ob:case pb:case qb:return!0}return!1}function Jg(a){return Kc(a)||Lc(a)}function Kg(a){return !a.e&&!a.d}function Ie(a){return a.e=!0,a}function Je(b){var a=b.a.length;return b.a.push(a),a}function xd(c,a,b){ +c.a[Mc(c,a)]=Mc(c,b)}function Mc(c,a){var b=c.a[a];return b^a&&(b=Mc(c,b),c.a[a]=b),b}function qa(a,b){Ke(a),process.stdout.write(b),Ke(0)}function Og(a){qa(3,'error: '),qa(1,a+'\n')}function Pg(a){qa(2,'note: '),qa(1,a+'\n')}function Qg(a){qa(7,'warning: '),qa(1,a+'\n')}function Le(a){for(var b=process.stdout.columns,l=0,g=a.a,i=g.length;l',a)];if(a instanceof Array){for(var b=[],c=0,e=a.length;c27&&a<31}function dd(a){return a>30&&a<38}function Rf(a){return a>30&&a<36}function ed(a){return a>33&&a<38}function Ac(a){return a>37&&a<57}function Bc(a){return a>51&&a<57}function Sf(a){return a==4||a==5||a==6||a==15}function ce(a){return a==7||a==10||a==19}function $a(b){var a='';return b&1&&(a+='attribute '),b&2&&(a+='const '),b&256&&(a+='uniform '),b&512&&(a+='varying '),b&4&&(a+='highp '),b&32&&(a+='lowp '),b&64&&(a+='mediump '),b&8&&(a+='in '),b&16&&(a+='inout '),b&128&&(a+='out '),a}function Fg(a){return a>49&&a<80}function ud(a){switch(a){case 96:case 42:case 33:case 34:case 14:case 39:case 40:case 41:case 20:case 22:case 23:case 24:case 3:case 5:case 6:case 7:case 26:case 27:case 28:return!0}return!1}function Ke(a){process.stdout.isTTY&&process.stdout.write('\x1B[0;'+ih.get(a)+'m')} +function hb(b,a){return b[b.length-1|0]=a}function Rc(a){return a[a.length-1|0]}function Ze(c,a){for(var d=0,e=a.length;db|0)|0}function rc(a){for(var b=new nh,d=0,e=a.length;db|0)|0}function Yb(d,a){for(var b='',c=0;c>10)+55296|0)+String.fromCharCode((a-65536&1023)+56320|0)}function Nc(a){if(!a)return null;var b=a.a,c=Jb(b,a.b),d=Jb(b,a.c);return{source:b.a,start:{line:c.a,column:c.b}, +end:{line:d.a,column:d.b}}}function jh(a,b){b=b||{};var c=Me(a),d=new Ih,e=new th;e.c=ya(Re,b.renaming,0),b.disableRewriting&&(e.a=!1),b.prettyPrint&&(e.b=!1),b.keepSymbols&&(e.d=!1),b.fileAccess&&(e.e=Ne(b.fileAccess));var f=Gd(d,c,e);return{log:Ff(d),output:f?Sc(f,ya(Qe,b.format,0)):null}}function kh(a,b){b=b||{};var c=Me(a),d=new Ih,e=new th;b.fileAccess&&(e.e=Ne(b.fileAccess));var f=_e(d,c,e),h=function(m){for(var Xb,l=m.source+'',g=m.line|0,i=m.column|0,o=!!m.ignoreDiagnostics,k=null,r=null,s=null,zd=0,Ug=c.length;zd>=?|[()[\\]{}\\.,?:;]|[+\\-*/%=!<>&|^~]=?|[A-Za-z_][A-Za-z0-9_]*\\b|#\\w+\\b|"(?:[^"\\\\]|\\\\.)*")'),gh=new RegExp('^([1-9][0-9]*|0[0-7]*|0[xX][0-9A-Fa-f]+)$'),Gg=j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(new Map, +'attribute',2),'bool',3),'break',4),'bvec2',5),'bvec3',6),'bvec4',7),'const',8),'continue',9),'discard',10),'do',11),'else',12),'false',13),'float',14),'for',15),'highp',16),'if',17),'in',18),'inout',19),'int',20),'invariant',21),'ivec2',22),'ivec3',23),'ivec4',24),'lowp',25),'mat2',26),'mat3',27),'mat4',28),'mediump',29),'out',30),'precision',31),'return',32),'sampler2D',33),'samplerCube',34),'struct',35),'true',36),'uniform',37),'varying',38),'vec2',39),'vec3',40),'vec4',41),'void',42),'while',43),'export',44),'import',45),hh=j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(new Map,'~',46),'--',47),'++',48),'!',49),'&',50),'|',51),'^',52),'/',53),'==',54),'>',55),'>=',56),'<',57),'<=',58),'&&',59),'||',60),'^^',61),'-',62),'*',63),'!=',64),'+',65),'%',66),'<<',67),'>>',68),'=',69),'+=',70),'&=',71),'|=',72),'^=',73),'/=',74),'*=',75),'%=',76),'<<=',77),'>>=',78),'-=',79),':',80),',',81),'.',82),'{',83),'[',84),'(',85),'?',86),'}',87),']',88),')',89),';',90),Hg=j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(j(new Map, +'asm',0),'cast',0),'class',0),'default',0),'double',0),'dvec2',0),'dvec3',0),'dvec4',0),'enum',0),'extern',0),'external',0),'fixed',0),'flat',0),'fvec2',0),'fvec3',0),'fvec4',0),'goto',0),'half',0),'hvec2',0),'hvec3',0),'hvec4',0),'inline',0),'input',0),'interface',0),'long',0),'namespace',0),'noinline',0),'output',0),'packed',0),'public',0),'sampler1D',0),'sampler1DShadow',0),'sampler2DRect',0),'sampler2DRectShadow',0),'sampler2DShadow',0),'sampler3D',0),'sampler3DRect',0),'short',0),'sizeof',0),'static',0),'superp',0),'switch',0),'template',0),'this',0),'typedef',0),'union',0),'unsigned',0),'using',0),'volatile',0),Y=J(new Tb(-1,null,'bool',null)),Lb=J(new Tb(-2,null,'bvec2',null)),Mb=J(new Tb(-3,null,'bvec3',null)),Nb=J(new Tb(-4,null,'bvec4',null)),K=J(new Tb(-5,null,'',null)),da=J(new Tb(-6,null,'float',null)),ga=J(new Tb(-7,null,'int',null)),vb=J(new Tb(-8,null,'ivec2',null)),wb=J(new Tb(-9,null,'ivec3',null)),xb=J(new Tb(-10,null,'ivec4',null)),ob=J(new Tb(-11,null,'mat2',null)),pb=J(new Tb(-12,null, +'mat3',null)),qb=J(new Tb(-13,null,'mat4',null)),Lg=Ie(J(new Tb(-14,null,'sampler2D',null))),Mg=Ie(J(new Tb(-15,null,'samplerCube',null))),Fa=J(new Tb(-16,null,'vec2',null)),Ga=J(new Tb(-17,null,'vec3',null)),Ha=J(new Tb(-18,null,'vec4',null)),yd=J(new Tb(-19,null,'void',null)),Ng=[Y,Lb,Mb,Nb,da,ga,vb,wb,xb,ob,pb,qb,Lg,Mg,Fa,Ga,Ha],Qe=j(j(j(j(j(new Map,'json',0),'js',1),'c++',2),'skew',3),'rust',4),Re=j(j(j(new Map,'all',0),'internal-only',1),'none',2),mh=['ERROR','WARNING'],Sg=['GLOBAL','STRUCT_BLOCK','VARIABLE','BLOCK','BREAK','CONTINUE','DISCARD','DO_WHILE','EXPRESSION','EXTENSION','FOR','FUNCTION','IF','MODIFIER_BLOCK','PRECISION','RETURN','STRUCT','VARIABLES','VERSION','WHILE','CALL','DOT','HOOK','NAME','PARSE_ERROR','SEQUENCE','TYPE','UNKNOWN_CONSTANT','BOOL','FLOAT','INT','NEGATIVE','NOT','POSITIVE','PREFIX_DECREMENT','PREFIX_INCREMENT','POSTFIX_DECREMENT','POSTFIX_INCREMENT','ADD','DIVIDE','EQUAL','GREATER_THAN','GREATER_THAN_OR_EQUAL','INDEX','LESS_THAN','LESS_THAN_OR_EQUAL','LOGICAL_AND','LOGICAL_OR', +'LOGICAL_XOR','MULTIPLY','NOT_EQUAL','SUBTRACT','ASSIGN','ASSIGN_ADD','ASSIGN_DIVIDE','ASSIGN_MULTIPLY','ASSIGN_SUBTRACT'],Oe=['SINGLE_LINE_COMMENT','MULTI_LINE_COMMENT','ATTRIBUTE','BOOL','BREAK','BVEC2','BVEC3','BVEC4','CONST','CONTINUE','DISCARD','DO','ELSE','FALSE','FLOAT','FOR','HIGHP','IF','IN','INOUT','INT','INVARIANT','IVEC2','IVEC3','IVEC4','LOWP','MAT2','MAT3','MAT4','MEDIUMP','OUT','PRECISION','RETURN','SAMPLER2D','SAMPLERCUBE','STRUCT','TRUE','UNIFORM','VARYING','VEC2','VEC3','VEC4','VOID','WHILE','EXPORT','IMPORT','COMPLEMENT','DECREMENT','INCREMENT','NOT','BITWISE_AND','BITWISE_OR','BITWISE_XOR','DIVIDE','EQUAL','GREATER_THAN','GREATER_THAN_OR_EQUAL','LESS_THAN','LESS_THAN_OR_EQUAL','LOGICAL_AND','LOGICAL_OR','LOGICAL_XOR','MINUS','MULTIPLY','NOT_EQUAL','PLUS','REMAINDER','SHIFT_LEFT','SHIFT_RIGHT','ASSIGN','ASSIGN_ADD','ASSIGN_BITWISE_AND','ASSIGN_BITWISE_OR','ASSIGN_BITWISE_XOR','ASSIGN_DIVIDE','ASSIGN_MULTIPLY','ASSIGN_REMAINDER','ASSIGN_SHIFT_LEFT','ASSIGN_SHIFT_RIGHT','ASSIGN_SUBTRACT','COLON', +'COMMA','DOT','LEFT_BRACE','LEFT_BRACKET','LEFT_PARENTHESIS','QUESTION','RIGHT_BRACE','RIGHT_BRACKET','RIGHT_PARENTHESIS','SEMICOLON','EXTENSION','VERSION','INCLUDE','PRAGMA','FLOAT_LITERAL','IDENTIFIER','INT_LITERAL','STRING_LITERAL','END_OF_FILE'],ih=Oa(Oa(Oa(Oa(Oa(Oa(Oa(Oa(Oa(new Map,0,0),1,1),2,90),3,31),4,32),5,33),6,34),7,35),8,36);ai()})(); \ No newline at end of file diff --git a/ShaderPlayground/main.css b/ShaderPlayground/main.css new file mode 100644 index 0000000..7b4b052 --- /dev/null +++ b/ShaderPlayground/main.css @@ -0,0 +1,52 @@ +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view ul afx-list-item:nth-child(even) li, +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view > div.list-container > ul li{ + background-color:#333333; + color:#afafaf; + border-radius: 0; + border: 0; + padding-top: 5px; + padding-bottom: 5px; + padding-right: 20px; + border-right: 1px solid #272822; +} + +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view ul afx-list-item:nth-child(even) li.selected, +afx-app-window[data-id = "ShaderPlayground"] afx-tab-bar> afx-list-view > div.list-container > ul > afx-list-item > li.selected{ + background-color:#272822; + color:white; + border: 0; + border-radius: 0; +} + +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item img{ + width: 160px; + height: 82px; + object-fit: contain; + border: 1px solid tomato; + padding: 0; + margin: 0; +} +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item li{ + width: 162px !important; + float: left; + background-color: transparent !important; +} +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item p{ + padding:0; + margin: 0; + text-align: center; + background-color: tomato; + color: white; + width: 162px; +} +afx-app-window[data-id = "ShaderPlayground"] afx-vbox[data-id = "editor-wrapper"]{ + background-color: #333333; +} +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item i.closable{ + margin: 0px 15px 0px 0px; +} + +afx-app-window[data-id = "ShaderPlayground"] afx-shader-texture-item i.closable::before +{ + color: tomato; +} \ No newline at end of file diff --git a/ShaderPlayground/main.ts b/ShaderPlayground/main.ts new file mode 100644 index 0000000..2277e03 --- /dev/null +++ b/ShaderPlayground/main.ts @@ -0,0 +1,469 @@ +namespace OS { + + export namespace GUI { + export namespace tag { + class TextureListItem extends ListViewItemTag + { + protected itemlayout(): TagLayoutType { + return { + el: "div", + children: [ + { + el: "img", + ref: "img" + }, + { + el: "p", + ref: "name" + } + ] + }; + } + protected ondatachange(): void { + const v = this.data; + const img = this.refs.img as HTMLImageElement; + const uri = (v.path as string).asFileHandle().getlink(); + img.src = uri; + $(this.refs.name).text(v.name); + } + protected init(): void { + this.closable = true; + } + protected reload(d?: any): void { + } + } + define("afx-shader-texture-item", TextureListItem); + } + } + + export namespace application { + declare var ace: any; + declare var THREE: any; + declare var GLSLX:any; + + class AddTextureDialog extends GUI.BasicDialog + { + constructor() + { + super("AddTextureDialog", AddTextureDialog.scheme); + } + + main(): void + { + super.main(); + const inputs = $("input", this.scheme); + (this.find("btnOk") as GUI.tag.ButtonTag).onbtclick = (e) => { + let cdata: GenericObject = {}; + for (const el of inputs) { + let input = el as HTMLInputElement; + if (input.value.trim() == "") { + return this.notify(__("All fields should be filled")); + } + cdata[input.name] = input.value.trim(); + } + if (this.handle) + this.handle(cdata); + this.quit(); + }; + + (this.find("btnFile") as GUI.tag.ButtonTag).onbtclick = (e) => { + this.openDialog("FileDialog", { + title: __("Select image file"), + type: "file", + mimes: ["image/.*"] + }) + .then((d) => { + (this.find("txtPath") as HTMLInputElement).value = d.file.path; + }) + }; + } + } + + AddTextureDialog.scheme = `\ + + +
+ +
+ + +
+ + + + + +
+
+ +
+
+
+
+
+
\ +`; + + class ShaderEditor + { + private ums: any[]; + private glsl_values: string[]; + private cursors: any[]; + private editor: any; + private current_idx: number; + renderer: ShaderRenderer; + constructor(domel: HTMLElement, renderer: ShaderRenderer) + { + const empty_main = "void main(){}"; + this.renderer = renderer; + this.ums = [new ace.UndoManager(), new ace.UndoManager()]; + this.current_idx = -1; + this.glsl_values = [empty_main, ""]; + ace.require("ace/ext/language_tools"); + this.editor = ace.edit(domel); + this.editor.setOptions({ + enableBasicAutocompletion: true, + enableLiveAutocompletion: true, + enableSnippets: true, + highlightActiveLine: true, + //fontSize: "9pt" + }); + + this.editor.getSession().setUseWrapMode(true); + this.editor.session.setMode("ace/mode/glsl"); + this.editor.setTheme("ace/theme/monokai"); + this.cursors = [ + this.editor.getCursorPosition(), + this.editor.getCursorPosition() + ]; + this.editor.on("input", (e) => { + const value = this.editor.getValue(); + + const result = GLSLX.compile(value, { + format: "json" + }); + if (result.output) { + this.editor.getSession().setAnnotations([]); + this.glsl_values[this.current_idx] = value; + this.renderer.apply_mat(this.glsl_values[0],this.glsl_values[1]); + } else { + const reg_str = ":([0-9]+):([0-9]+):\\s*error:\\s*(.*)\\n"; + const matches = (result.log as string).match(new RegExp(reg_str, "g")); + if(matches) + { + this.editor.getSession().setAnnotations( + matches.map((match) => { + const err_data = match.match(new RegExp(reg_str)); + let ret = {}; + if(err_data) + { + ret = { + row: parseInt(err_data[1]) - 1, + column: parseInt(err_data[2]), + text: err_data[3], + type: "error" + }; + } + return ret; + }) + ); + } + } + }); + } + + edit(index:number): void + { + if(index < 0) + { + return; + } + if(index != 2 && this.current_idx != 2) + { + if(index === 0) + { + this.glsl_values[1] = this.editor.getValue(); + this.cursors[1] = this.editor.getCursorPosition(); + } + else + { + this.glsl_values[0] = this.editor.getValue(); + this.cursors[0] = this.editor.getCursorPosition(); + } + } + else if(index == 2) + { + this.glsl_values[this.current_idx] = this.editor.getValue(); + this.cursors[this.current_idx] = this.editor.getCursorPosition(); + this.current_idx = index; + return; + } + this.current_idx = index; + this.editor.getSession().setUndoManager(new ace.UndoManager()); + this.editor.setValue(this.glsl_values[index]); + this.editor.getSession().setUndoManager(this.ums[index]); + const c = this.cursors[index]; + this.editor.renderer.scrollCursorIntoView( + { + row: c.row, + column: c.column, + }, + 0.5 + ); + this.editor.selection.moveTo( + c.row, + c.column + ); + this.editor.focus(); + } + + cleanup(): void + { + this.renderer.cleanup(); + } + resize(): void + { + this.editor.resize(); + this.renderer.viewport_resize(); + } + }; + + class ShaderRenderer { + /** + * Private variables for viewport + */ + private renderer: any; + private scene: any; + private camera: any; + private ani_request_id: number; + private uniforms: GenericObject; + private mesh: any; + private clock: any; + needupdateTexture: boolean; + textures: any[]; + constructor(canvas: HTMLCanvasElement) + { + this.textures = []; + this.renderer = new THREE.WebGLRenderer({canvas}); + this.renderer.autoClearColor = false; + this.clock = new THREE.Clock(); + this.camera = new THREE.OrthographicCamera( + -1, // left + 1, // right + 1, // top + -1, // bottom + -1, // near, + 1, // far + ); + this.scene = new THREE.Scene(); + const plane = new THREE.PlaneGeometry(2, 2); + const material = new THREE.MeshBasicMaterial({ + color: 'white', + }); + this.needupdateTexture = false; + this.mesh = new THREE.Mesh(plane, material); + this.scene.add(this.mesh); + this.uniforms = { + u_resolution: { value: { x: 0, y: 0 } }, + u_time: { value: 0.0 }, + u_mouse: { value: { x: 0, y: 0 } }, + }; + this.viewport_resize(); + + this.ani_request_id = requestAnimationFrame(() => this.viewport_render()); + } + private viewport_render(): void + { + if(this.needupdateTexture) + { + this.update_textures(); + this.needupdateTexture = false; + } + + this.uniforms.u_time.value = this.clock.getElapsedTime(); + try{ + this.renderer.render(this.scene, this.camera); + } + catch(e) + { + console.error(e); + const material = new THREE.MeshBasicMaterial({ + color: 'white', + }); + this.mesh.material = material; + } + this.ani_request_id = requestAnimationFrame(() => this.viewport_render()); + } + + viewport_resize(): void + { + const canvas = this.renderer.domElement; + const width = canvas.clientWidth; + const height = canvas.clientHeight; + this.uniforms.u_resolution.value.x = width; + this.uniforms.u_resolution.value.y = height; + const needResize = canvas.width !== width || canvas.height !== height; + if (needResize) { + this.renderer.setSize(width, height, false); + } + } + + cleanup(): void + { + console.log("Stop the animation before quitting..."); + window.cancelAnimationFrame(this.ani_request_id); + } + private update_textures(): void + { + for(const key in this.uniforms) + { + if(["u_resolution", "u_time", "u_mouse"].indexOf(key) === -1) + { + delete this.uniforms[key]; + } + } + for(const v of this.textures) + { + this.uniforms[v.name] = {value: v.texture}; + } + } + apply_mat(fragment_shader:string, vertex_shader: string): void + { + const empty_main = "void main(){}"; + const opts = { + fragmentShader: fragment_shader.trim() === ""?empty_main: fragment_shader, + uniforms: this.uniforms, + vertexShader: undefined + }; + + if(vertex_shader.trim() != "") + opts.vertexShader = vertex_shader; + + const mat = new THREE.ShaderMaterial(opts); + + this.mesh.material = mat; + } + } + /** + * + * @class ShaderPlayground + * @extends {BaseApplication} + */ + export class ShaderPlayground extends BaseApplication { + /** + * Private variable for tab and editor + */ + private tabbar: GUI.tag.TabBarTag; + private editor: ShaderEditor; + + constructor(args: AppArgumentsType[]) { + super("ShaderPlayground", args); + } + main(): void { + this.init_editor(); + this.init_textures_list(); + } + + /** + * Init the editor for fragment and + * vertex shader + */ + private init_editor(): void + { + this.tabbar = this.find("tabbar") as GUI.tag.TabBarTag; + this.tabbar.items = [ + { + text: __("Fragment"), + iconclass: "bi bi-palette" + }, + { + text: __("Vertex"), + iconclass: "bi bi-intersect" + }, + { + text: __("Textures"), + iconclass: "bi bi-image-alt" + } + ]; + + this.tabbar.ontabselect = (_e) => { + this.selectTab(); + }; + this.editor = new ShaderEditor( + this.find("editor-container"), new ShaderRenderer(this.find("viewport") as HTMLCanvasElement)); + this.on("resize", (e) =>{ + this.editor.resize(); + }); + this.tabbar.selected = 0; + } + + private init_textures_list(): void + { + const listview = this.find("texture-list") as GUI.tag.ListViewTag; + listview.buttons = [ + { + text: "__(Add texture)", + iconclass: "bi bi-plus", + onbtclick: (e) => { + this + .openDialog(new AddTextureDialog()) + .then((data) => { + if(!data) + { + return; + } + const loader = new THREE.TextureLoader(); + const texture = loader.load(data.path.asFileHandle().getlink()); + texture.minFilter = THREE.NearestFilter; + texture.magFilter = THREE.NearestFilter; + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; + data.texture = texture; + listview.push(data); + this.editor.renderer.needupdateTexture = true; + }); + } + } + ]; + listview.itemtag = "afx-shader-texture-item"; + listview.onitemclose = (e) => { + this.editor.renderer.needupdateTexture = true; + return true; + }; + listview.data = this.editor.renderer.textures; + } + + private selectTab(): void + { + const index = this.tabbar.selected as number; + if(index === 2) + { + $(this.find("editor-container")).hide(); + $(this.find("texture-list")).show(); + } + else + { + $(this.find("editor-container")).show(); + $(this.find("texture-list")).hide(); + } + this.editor.edit(index); + } + + protected cleanup(_e: any): void + { + this.editor.cleanup(); + } + } + + /** + * Application dependenicies preload + */ + ShaderPlayground.dependencies = [ + "pkg://libthreejs/main.js", + "pkg://ACECore/core/ace.js", + "pkg://ACECore/path.js", + "pkg://ACECore/core/ext-language_tools.js", + "pkg://ShaderPlayground/glslx.js" + ]; + } +} \ No newline at end of file diff --git a/ShaderPlayground/package.json b/ShaderPlayground/package.json new file mode 100644 index 0000000..58426e4 --- /dev/null +++ b/ShaderPlayground/package.json @@ -0,0 +1,16 @@ +{ + "pkgname": "ShaderPlayground", + "app":"ShaderPlayground", + "name":"OpenGL Shader Playground", + "description":"OpenGL Shader Playground", + "info":{ + "author": "Xuan Sang LE", + "email": "mrsang@iohub.dev" + }, + "version":"0.0.1-a", + "category":"Development", + "iconclass":"bi bi-lightbulb-fill", + "mimes":["none"], + "dependencies":["libthreejs@0.0.129-r"], + "locale": {} +} \ No newline at end of file diff --git a/ShaderPlayground/scheme.html b/ShaderPlayground/scheme.html new file mode 100644 index 0000000..a2f6799 --- /dev/null +++ b/ShaderPlayground/scheme.html @@ -0,0 +1,13 @@ + + + + +
+ +
+ + + + +
+
\ No newline at end of file diff --git a/libthreejs/README.md b/libthreejs/README.md new file mode 100644 index 0000000..8482f75 --- /dev/null +++ b/libthreejs/README.md @@ -0,0 +1,12 @@ +# libthreejs + +AntOS package wrapper for the famous Three.js library R129. + +## About Three.js + +The aim of the project is to create an easy to use, lightweight, +cross-browser, general purpose 3D library. The current builds only +include a WebGL renderer but WebGPU (experimental), SVG and CSS3D +renderers are also available in the examples. + +Github: [https://github.com/mrdoob/three.js](https://github.com/mrdoob/three.js) \ No newline at end of file diff --git a/libthreejs/build.json b/libthreejs/build.json new file mode 100644 index 0000000..e8a9a20 --- /dev/null +++ b/libthreejs/build.json @@ -0,0 +1,45 @@ +{ + "name": "libthreejs", + "targets":{ + "clean": { + "jobs": [ + { + "name": "vfs-rm", + "data": ["build/debug","build/release"] + } + ] + }, + "copy": { + "jobs": [ + { + "name": "vfs-mkdir", + "data": ["build","build/debug","build/release"] + }, + { + "name": "vfs-cp", + "data": { + "src": [ + "main.js", + "package.json", + "README.md" + ], + "dest":"build/debug" + } + } + ] + }, + "release": { + "depend": ["clean","copy"], + "require": ["zip"], + "jobs": [ + { + "name": "zip-mk", + "data": { + "src":"build/debug", + "dest":"build/release/libthreejs.zip" + } + } + ] + } + } +} \ No newline at end of file diff --git a/libthreejs/build/debug/README.md b/libthreejs/build/debug/README.md new file mode 100644 index 0000000..8482f75 --- /dev/null +++ b/libthreejs/build/debug/README.md @@ -0,0 +1,12 @@ +# libthreejs + +AntOS package wrapper for the famous Three.js library R129. + +## About Three.js + +The aim of the project is to create an easy to use, lightweight, +cross-browser, general purpose 3D library. The current builds only +include a WebGL renderer but WebGPU (experimental), SVG and CSS3D +renderers are also available in the examples. + +Github: [https://github.com/mrdoob/three.js](https://github.com/mrdoob/three.js) \ No newline at end of file diff --git a/libthreejs/build/debug/main.js b/libthreejs/build/debug/main.js new file mode 100644 index 0000000..9bda096 --- /dev/null +++ b/libthreejs/build/debug/main.js @@ -0,0 +1,6 @@ +/** + * @license + * Copyright 2010-2021 Three.js Authors + * SPDX-License-Identifier: MIT + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="129",n=100,i=300,r=301,s=302,a=303,o=304,l=306,c=307,h=1e3,u=1001,d=1002,p=1003,m=1004,f=1005,g=1006,v=1007,y=1008,x=1009,_=1012,w=1014,b=1015,M=1016,S=1020,T=1022,E=1023,A=1026,L=1027,R=33776,C=33777,P=33778,D=33779,I=35840,N=35841,B=35842,z=35843,F=37492,O=37496,H=2300,G=2301,U=2302,k=2400,V=2401,W=2402,j=2500,q=2501,X=3e3,Y=3001,Z=3007,J=3002,Q=3004,K=3005,$=3006,tt=7680,et=35044,nt=35048,it="300 es";class rt{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(void 0!==n){const t=n.indexOf(e);-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);for(let e=0,i=n.length;e>8&255]+st[t>>16&255]+st[t>>24&255]+"-"+st[255&e]+st[e>>8&255]+"-"+st[e>>16&15|64]+st[e>>24&255]+"-"+st[63&n|128]+st[n>>8&255]+"-"+st[n>>16&255]+st[n>>24&255]+st[255&i]+st[i>>8&255]+st[i>>16&255]+st[i>>24&255]).toUpperCase()}function ht(t,e,n){return Math.max(e,Math.min(n,t))}function ut(t,e){return(t%e+e)%e}function dt(t,e,n){return(1-n)*t+n*e}function pt(t){return 0==(t&t-1)&&0!==t}function mt(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ft(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}var gt=Object.freeze({__proto__:null,DEG2RAD:ot,RAD2DEG:lt,generateUUID:ct,clamp:ht,euclideanModulo:ut,mapLinear:function(t,e,n,i,r){return i+(t-e)*(r-i)/(n-e)},inverseLerp:function(t,e,n){return t!==e?(n-t)/(e-t):0},lerp:dt,damp:function(t,e,n,i){return dt(t,e,1-Math.exp(-n*i))},pingpong:function(t,e=1){return e-Math.abs(ut(t,2*e)-e)},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(at=t%2147483647),at=16807*at%2147483647,(at-1)/2147483646},degToRad:function(t){return t*ot},radToDeg:function(t){return t*lt},isPowerOfTwo:pt,ceilPowerOfTwo:mt,floorPowerOfTwo:ft,setQuaternionFromProperEuler:function(t,e,n,i,r){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),c=s((e+i)/2),h=a((e+i)/2),u=s((e-i)/2),d=a((e-i)/2),p=s((i-e)/2),m=a((i-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}});class vt{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6],this.y=i[1]*e+i[4]*n+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),i=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*n-s*i+t.x,this.y=r*i+s*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}}vt.prototype.isVector2=!0;class yt{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=i,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=n,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[3],o=n[6],l=n[1],c=n[4],h=n[7],u=n[2],d=n[5],p=n[8],m=i[0],f=i[3],g=i[6],v=i[1],y=i[4],x=i[7],_=i[2],w=i[5],b=i[8];return r[0]=s*m+a*v+o*_,r[3]=s*f+a*y+o*w,r[6]=s*g+a*x+o*b,r[1]=l*m+c*v+h*_,r[4]=l*f+c*y+h*w,r[7]=l*g+c*x+h*b,r[2]=u*m+d*v+p*_,r[5]=u*f+d*y+p*w,r[8]=u*g+d*x+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-n*r*c+n*a*o+i*r*l-i*s*o}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+n*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=h*m,t[1]=(i*l-c*n)*m,t[2]=(a*n-i*s)*m,t[3]=u*m,t[4]=(c*e-i*o)*m,t[5]=(i*r-a*e)*m,t[6]=d*m,t[7]=(n*o-l*e)*m,t[8]=(s*e-n*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,i,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(n*o,n*l,-n*(o*s+l*a)+s+t,-i*l,i*o,-i*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){const n=this.elements;return n[0]*=t,n[3]*=t,n[6]*=t,n[1]*=e,n[4]*=e,n[7]*=e,this}rotate(t){const e=Math.cos(t),n=Math.sin(t),i=this.elements,r=i[0],s=i[3],a=i[6],o=i[1],l=i[4],c=i[7];return i[0]=e*r+n*o,i[3]=e*s+n*l,i[6]=e*a+n*c,i[1]=-n*r+e*o,i[4]=-n*s+e*l,i[7]=-n*a+e*c,this}translate(t,e){const n=this.elements;return n[0]+=t*n[2],n[3]+=t*n[5],n[6]+=t*n[8],n[1]+=e*n[2],n[4]+=e*n[5],n[7]+=e*n[8],this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<9;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}let xt;yt.prototype.isMatrix3=!0;class _t{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===xt&&(xt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),xt.width=t.width,xt.height=t.height;const n=xt.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=xt}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}}let wt=0;class bt extends rt{constructor(t=bt.DEFAULT_IMAGE,e=bt.DEFAULT_MAPPING,n=1001,i=1001,r=1006,s=1008,a=1023,o=1009,l=1,c=3e3){super(),Object.defineProperty(this,"id",{value:wt++}),this.uuid=ct(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=n,this.wrapT=i,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=a,this.internalFormat=null,this.type=o,this.offset=new vt(0,0),this.repeat=new vt(1,1),this.center=new vt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new yt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.version=0,this.onUpdate=null}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const i=this.image;if(void 0===i.uuid&&(i.uuid=ct()),!e&&void 0===t.images[i.uuid]){let e;if(Array.isArray(i)){e=[];for(let t=0,n=i.length;t1)switch(this.wrapS){case h:t.x=t.x-Math.floor(t.x);break;case u:t.x=t.x<0?0:1;break;case d:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case h:t.y=t.y-Math.floor(t.y);break;case u:t.y=t.y<0?0:1;break;case d:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&this.version++}}function Mt(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?_t.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}bt.DEFAULT_IMAGE=void 0,bt.DEFAULT_MAPPING=i,bt.prototype.isTexture=!0;class St{constructor(t=0,e=0,n=0,i=1){this.x=t,this.y=e,this.z=n,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,i){return this.x=t,this.y=e,this.z=n,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*n+s[8]*i+s[12]*r,this.y=s[1]*e+s[5]*n+s[9]*i+s[13]*r,this.z=s[2]*e+s[6]*n+s[10]*i+s[14]*r,this.w=s[3]*e+s[7]*n+s[11]*i+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,i,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?o=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),s=Math.atan2(r,e*n);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*n;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,n,i,r,s){const a=n[i],o=n[i+1],l=n[i+2],c=n[i+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const n=t._x,i=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(n/2),c=a(i/2),h=a(r/2),u=o(n/2),d=o(i/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,i=Math.sin(n);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],i=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=n+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-i)*t}else if(n>a&&n>h){const t=2*Math.sqrt(1+n-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(i+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-n-h);this._w=(r-l)/t,this._x=(i+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-n-a);this._w=(s-i)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ht(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(0===n)return this;const i=Math.min(1,e/n);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,i=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=n*c+s*a+i*l-r*o,this._y=i*c+s*o+r*a-n*l,this._z=r*c+s*l+n*o-i*a,this._w=s*c-n*a-i*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const n=this._x,i=this._y,r=this._z,s=this._w;let a=s*t._w+n*t._x+i*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=n,this._y=i,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*n+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=n*h+this._x*u,this._y=i*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,n){this.copy(t).slerp(e,n)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}Lt.prototype.isQuaternion=!0;class Rt{constructor(t=0,e=0,n=0){this.x=t,this.y=e,this.z=n}set(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Pt.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Pt.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*i,this.y=r[1]*e+r[4]*n+r[7]*i,this.z=r[2]*e+r[5]*n+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=t.elements,s=1/(r[3]*e+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*i+r[12])*s,this.y=(r[1]*e+r[5]*n+r[9]*i+r[13])*s,this.z=(r[2]*e+r[6]*n+r[10]*i+r[14])*s,this}applyQuaternion(t){const e=this.x,n=this.y,i=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*i-a*n,c=o*n+a*e-r*i,h=o*i+r*n-s*e,u=-r*e-s*n-a*i;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*i,this.y=r[1]*e+r[5]*n+r[9]*i,this.z=r[2]*e+r[6]*n+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,i=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=i*o-r*a,this.y=r*s-n*o,this.z=n*a-i*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Ct.copy(this).projectOnVector(t),this.sub(Ct)}reflect(t){return this.sub(Ct.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(ht(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,i=this.z-t.z;return e*e+n*n+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const i=Math.sin(e)*t;return this.x=i*Math.sin(n),this.y=Math.cos(e)*t,this.z=i*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}}Rt.prototype.isVector3=!0;const Ct=new Rt,Pt=new Lt;class Dt{constructor(t=new Rt(1/0,1/0,1/0),e=new Rt(-1/0,-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Rt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Nt),Nt.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(kt),Vt.subVectors(this.max,kt),zt.subVectors(t.a,kt),Ft.subVectors(t.b,kt),Ot.subVectors(t.c,kt),Ht.subVectors(Ft,zt),Gt.subVectors(Ot,Ft),Ut.subVectors(zt,Ot);let e=[0,-Ht.z,Ht.y,0,-Gt.z,Gt.y,0,-Ut.z,Ut.y,Ht.z,0,-Ht.x,Gt.z,0,-Gt.x,Ut.z,0,-Ut.x,-Ht.y,Ht.x,0,-Gt.y,Gt.x,0,-Ut.y,Ut.x,0];return!!qt(e,zt,Ft,Ot,Vt)&&(e=[1,0,0,0,1,0,0,0,1],!!qt(e,zt,Ft,Ot,Vt)&&(Wt.crossVectors(Ht,Gt),e=[Wt.x,Wt.y,Wt.z],qt(e,zt,Ft,Ot,Vt)))}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Rt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return Nt.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(Nt).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(It[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),It[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),It[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),It[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),It[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),It[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),It[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),It[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(It)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}Dt.prototype.isBox3=!0;const It=[new Rt,new Rt,new Rt,new Rt,new Rt,new Rt,new Rt,new Rt],Nt=new Rt,Bt=new Dt,zt=new Rt,Ft=new Rt,Ot=new Rt,Ht=new Rt,Gt=new Rt,Ut=new Rt,kt=new Rt,Vt=new Rt,Wt=new Rt,jt=new Rt;function qt(t,e,n,i,r){for(let s=0,a=t.length-3;s<=a;s+=3){jt.fromArray(t,s);const a=r.x*Math.abs(jt.x)+r.y*Math.abs(jt.y)+r.z*Math.abs(jt.z),o=e.dot(jt),l=n.dot(jt),c=i.dot(jt);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const Xt=new Dt,Yt=new Rt,Zt=new Rt,Jt=new Rt;class Qt{constructor(t=new Rt,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;void 0!==e?n.copy(e):Xt.setFromPoints(t).getCenter(n);let i=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Dt),this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){Jt.subVectors(t,this.center);const e=Jt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),n=.5*(t-this.radius);this.center.add(Jt.multiplyScalar(n/t)),this.radius+=n}return this}union(t){return Zt.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(Yt.copy(t.center).add(Zt)),this.expandByPoint(Yt.copy(t.center).sub(Zt)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Kt=new Rt,$t=new Rt,te=new Rt,ee=new Rt,ne=new Rt,ie=new Rt,re=new Rt;class se{constructor(t=new Rt,e=new Rt(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Rt),e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Kt)),this}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Rt),e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Kt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Kt.copy(this.direction).multiplyScalar(e).add(this.origin),Kt.distanceToSquared(t))}distanceSqToSegment(t,e,n,i){$t.copy(t).add(e).multiplyScalar(.5),te.copy(e).sub(t).normalize(),ee.copy(this.origin).sub($t);const r=.5*t.distanceTo(e),s=-this.direction.dot(te),a=ee.dot(this.direction),o=-ee.dot(te),l=ee.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return n&&n.copy(this.direction).multiplyScalar(h).add(this.origin),i&&i.copy(te).multiplyScalar(u).add($t),d}intersectSphere(t,e){Kt.subVectors(t.center,this.origin);const n=Kt.dot(this.direction),i=Kt.dot(Kt)-n*n,r=t.radius*t.radius;if(i>r)return null;const s=Math.sqrt(r-i),a=n-s,o=n+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return null===n?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,i,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(n=(t.min.x-u.x)*l,i=(t.max.x-u.x)*l):(n=(t.max.x-u.x)*l,i=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),n>s||r>i?null:((r>n||n!=n)&&(n=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),n>o||a>i?null:((a>n||n!=n)&&(n=a),(o=0?n:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,Kt)}intersectTriangle(t,e,n,i,r){ne.subVectors(e,t),ie.subVectors(n,t),re.crossVectors(ne,ie);let s,a=this.direction.dot(re);if(a>0){if(i)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}ee.subVectors(this.origin,t);const o=s*this.direction.dot(ie.crossVectors(ee,ie));if(o<0)return null;const l=s*this.direction.dot(ne.cross(ee));if(l<0)return null;if(o+l>a)return null;const c=-s*ee.dot(re);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ae{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l,c,h,u,d,p,m,f){const g=this.elements;return g[0]=t,g[4]=e,g[8]=n,g[12]=i,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ae).fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,i=1/oe.setFromMatrixColumn(t,0).length(),r=1/oe.setFromMatrixColumn(t,1).length(),s=1/oe.setFromMatrixColumn(t,2).length();return e[0]=n[0]*i,e[1]=n[1]*i,e[2]=n[2]*i,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*s,e[9]=n[9]*s,e[10]=n[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,n=t.x,i=t.y,r=t.z,s=Math.cos(n),a=Math.sin(n),o=Math.cos(i),l=Math.sin(i),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=n+i*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=i+n*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,n=o*h,i=l*c,r=l*h;e[0]=t+r*a,e[4]=i*a-n,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=n*a-i,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,n=o*h,i=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=i+n*a,e[1]=n+i*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=i*l-n,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=n*l-i,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=i*h+n,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=n*h+i,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=n*h-i,e[2]=i*h-n,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(ce,t,he)}lookAt(t,e,n){const i=this.elements;return pe.subVectors(t,e),0===pe.lengthSq()&&(pe.z=1),pe.normalize(),ue.crossVectors(n,pe),0===ue.lengthSq()&&(1===Math.abs(n.z)?pe.x+=1e-4:pe.z+=1e-4,pe.normalize(),ue.crossVectors(n,pe)),ue.normalize(),de.crossVectors(pe,ue),i[0]=ue.x,i[4]=de.x,i[8]=pe.x,i[1]=ue.y,i[5]=de.y,i[9]=pe.y,i[2]=ue.z,i[6]=de.z,i[10]=pe.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[4],o=n[8],l=n[12],c=n[1],h=n[5],u=n[9],d=n[13],p=n[2],m=n[6],f=n[10],g=n[14],v=n[3],y=n[7],x=n[11],_=n[15],w=i[0],b=i[4],M=i[8],S=i[12],T=i[1],E=i[5],A=i[9],L=i[13],R=i[2],C=i[6],P=i[10],D=i[14],I=i[3],N=i[7],B=i[11],z=i[15];return r[0]=s*w+a*T+o*R+l*I,r[4]=s*b+a*E+o*C+l*N,r[8]=s*M+a*A+o*P+l*B,r[12]=s*S+a*L+o*D+l*z,r[1]=c*w+h*T+u*R+d*I,r[5]=c*b+h*E+u*C+d*N,r[9]=c*M+h*A+u*P+d*B,r[13]=c*S+h*L+u*D+d*z,r[2]=p*w+m*T+f*R+g*I,r[6]=p*b+m*E+f*C+g*N,r[10]=p*M+m*A+f*P+g*B,r[14]=p*S+m*L+f*D+g*z,r[3]=v*w+y*T+x*R+_*I,r[7]=v*b+y*E+x*C+_*N,r[11]=v*M+y*A+x*P+_*B,r[15]=v*S+y*L+x*D+_*z,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],i=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-i*l*h-r*a*u+n*l*u+i*a*d-n*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-i*s*d+i*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+n*s*d+r*a*c-n*l*c)+t[15]*(-i*a*c-e*o*h+e*a*u+i*s*h-n*s*u+n*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,y=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,x=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,_=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,w=e*v+n*y+i*x+r*_;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/w;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*i*d+n*f*d+h*i*g-n*u*g)*b,t[2]=(a*f*r-m*o*r+m*i*l-n*f*l-a*i*g+n*o*g)*b,t[3]=(h*o*r-a*u*r-h*i*l+n*u*l+a*i*d-n*o*d)*b,t[4]=y*b,t[5]=(c*f*r-p*u*r+p*i*d-e*f*d-c*i*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*i*l+e*f*l+s*i*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*i*l-e*u*l-s*i*d+e*o*d)*b,t[8]=x*b,t[9]=(p*h*r-c*m*r-p*n*d+e*m*d+c*n*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*n*l-e*m*l-s*n*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*n*l+e*h*l+s*n*d-e*a*d)*b,t[12]=_*b,t[13]=(c*m*i-p*h*i+p*n*u-e*m*u-c*n*f+e*h*f)*b,t[14]=(p*a*i-s*m*i-p*n*o+e*m*o+s*n*f-e*a*f)*b,t[15]=(s*h*i-c*a*i+c*n*o-e*h*o-s*n*u+e*a*u)*b,this}scale(t){const e=this.elements,n=t.x,i=t.y,r=t.z;return e[0]*=n,e[4]*=i,e[8]*=r,e[1]*=n,e[5]*=i,e[9]*=r,e[2]*=n,e[6]*=i,e[10]*=r,e[3]*=n,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,i))}makeTranslation(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),i=Math.sin(e),r=1-n,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+n,l*a-i*o,l*o+i*a,0,l*a+i*o,c*a+n,c*o-i*s,0,l*o-i*a,c*o+i*s,r*o*o+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,i,r,s){return this.set(1,n,r,0,t,1,s,0,e,i,1,0,0,0,0,1),this}compose(t,e,n){const i=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,y=o*c,x=o*h,_=n.x,w=n.y,b=n.z;return i[0]=(1-(m+g))*_,i[1]=(d+x)*_,i[2]=(p-y)*_,i[3]=0,i[4]=(d-x)*w,i[5]=(1-(u+g))*w,i[6]=(f+v)*w,i[7]=0,i[8]=(p+y)*b,i[9]=(f-v)*b,i[10]=(1-(u+m))*b,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,n){const i=this.elements;let r=oe.set(i[0],i[1],i[2]).length();const s=oe.set(i[4],i[5],i[6]).length(),a=oe.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],le.copy(this);const o=1/r,l=1/s,c=1/a;return le.elements[0]*=o,le.elements[1]*=o,le.elements[2]*=o,le.elements[4]*=l,le.elements[5]*=l,le.elements[6]*=l,le.elements[8]*=c,le.elements[9]*=c,le.elements[10]*=c,e.setFromRotationMatrix(le),n.x=r,n.y=s,n.z=a,this}makePerspective(t,e,n,i,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const a=this.elements,o=2*r/(e-t),l=2*r/(n-i),c=(e+t)/(e-t),h=(n+i)/(n-i),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,n,i,r,s){const a=this.elements,o=1/(e-t),l=1/(n-i),c=1/(s-r),h=(e+t)*o,u=(n+i)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<16;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}ae.prototype.isMatrix4=!0;const oe=new Rt,le=new ae,ce=new Rt(0,0,0),he=new Rt(1,1,1),ue=new Rt,de=new Rt,pe=new Rt,me=new ae,fe=new Lt;class ge{constructor(t=0,e=0,n=0,i=ge.DefaultOrder){this._x=t,this._y=e,this._z=n,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._order=i||this._order,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e,n){const i=t.elements,r=i[0],s=i[4],a=i[8],o=i[1],l=i[5],c=i[9],h=i[2],u=i[6],d=i[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(ht(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-ht(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(ht(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ht(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(ht(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ht(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==n&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return me.makeRotationFromQuaternion(t),this.setFromRotationMatrix(me,e,n)}setFromVector3(t,e){return this.set(t.x,t.y,t.z,e||this._order)}reorder(t){return fe.setFromEuler(this),this.setFromQuaternion(fe,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new Rt(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}ge.prototype.isEuler=!0,ge.DefaultOrder="XYZ",ge.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class ve{constructor(){this.mask=1}set(t){this.mask=1<1){for(let t=0;t1){for(let t=0;t0){i.children=[];for(let e=0;e0){i.animations=[];for(let e=0;e0&&(n.geometries=e),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),a.length>0&&(n.images=a),o.length>0&&(n.shapes=o),l.length>0&&(n.skeletons=l),c.length>0&&(n.animations=c)}return n.object=i,n;function s(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e1?null:e.copy(n).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Rt),t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Ne.getNormalMatrix(t),i=this.coplanarPoint(De).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}Be.prototype.isPlane=!0;const ze=new Rt,Fe=new Rt,Oe=new Rt,He=new Rt,Ge=new Rt,Ue=new Rt,ke=new Rt,Ve=new Rt,We=new Rt,je=new Rt;class qe{constructor(t=new Rt,e=new Rt,n=new Rt){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,i){void 0===i&&(console.warn("THREE.Triangle: .getNormal() target is now required"),i=new Rt),i.subVectors(n,e),ze.subVectors(t,e),i.cross(ze);const r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,n,i,r){ze.subVectors(i,e),Fe.subVectors(n,e),Oe.subVectors(t,e);const s=ze.dot(ze),a=ze.dot(Fe),o=ze.dot(Oe),l=Fe.dot(Fe),c=Fe.dot(Oe),h=s*l-a*a;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new Rt),0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,n,i){return this.getBarycoord(t,e,n,i,He),He.x>=0&&He.y>=0&&He.x+He.y<=1}static getUV(t,e,n,i,r,s,a,o){return this.getBarycoord(t,e,n,i,He),o.set(0,0),o.addScaledVector(r,He.x),o.addScaledVector(s,He.y),o.addScaledVector(a,He.z),o}static isFrontFacing(t,e,n,i){return ze.subVectors(n,e),Fe.subVectors(t,e),ze.cross(Fe).dot(i)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,i){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[i]),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return ze.subVectors(this.c,this.b),Fe.subVectors(this.a,this.b),.5*ze.cross(Fe).length()}getMidpoint(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Rt),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return qe.getNormal(this.a,this.b,this.c,t)}getPlane(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new Be),t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return qe.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,i,r){return qe.getUV(t,this.a,this.b,this.c,e,n,i,r)}containsPoint(t){return qe.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return qe.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Rt);const n=this.a,i=this.b,r=this.c;let s,a;Ge.subVectors(i,n),Ue.subVectors(r,n),Ve.subVectors(t,n);const o=Ge.dot(Ve),l=Ue.dot(Ve);if(o<=0&&l<=0)return e.copy(n);We.subVectors(t,i);const c=Ge.dot(We),h=Ue.dot(We);if(c>=0&&h<=c)return e.copy(i);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(n).addScaledVector(Ge,s);je.subVectors(t,r);const d=Ge.dot(je),p=Ue.dot(je);if(p>=0&&d<=p)return e.copy(r);const m=d*l-o*p;if(m<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(n).addScaledVector(Ue,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return ke.subVectors(r,i),a=(h-c)/(h-c+(d-p)),e.copy(i).addScaledVector(ke,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(n).addScaledVector(Ge,s).addScaledVector(Ue,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let Xe=0;class Ye extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:Xe++}),this.uuid=ct(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=n,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=tt,this.stencilZFail=tt,this.stencilZPass=tt,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}onBuild(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const n=t[e];if(void 0===n){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[e]=n:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(n.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&(n.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(n.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(n.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(n.textures=e),r.length>0&&(n.images=r)}return n}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(null!==e){const t=e.length;n=new Array(t);for(let i=0;i!==t;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}Ye.prototype.isMaterial=!0;const Ze={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Je={h:0,s:0,l:0},Qe={h:0,s:0,l:0};function Ke(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}function $e(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function tn(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class en{constructor(t,e,n){return void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,n){return this.r=t,this.g=e,this.b=n,this}setHSL(t,e,n){if(t=ut(t,1),e=ht(e,0,1),n=ht(n,0,1),0===e)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+e):n+e-n*e,r=2*n-i;this.r=Ke(r,i,t+1/3),this.g=Ke(r,i,t),this.b=Ke(r,i,t-1/3)}return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const i=n[1],r=n[2];switch(i){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const n=parseFloat(t[1])/360,i=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(n,i,r)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=n[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=Ze[t.toLowerCase()];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const n=e>0?1/e:1;return this.r=Math.pow(t.r,n),this.g=Math.pow(t.g,n),this.b=Math.pow(t.b,n),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=$e(t.r),this.g=$e(t.g),this.b=$e(t.b),this}copyLinearToSRGB(t){return this.r=tn(t.r),this.g=tn(t.g),this.b=tn(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});const e=this.r,n=this.g,i=this.b,r=Math.max(e,n,i),s=Math.min(e,n,i);let a,o;const l=(s+r)/2;if(s===r)a=0,o=0;else{const t=r-s;switch(o=l<=.5?t/(r+s):t/(2-r-s),r){case e:a=(n-i)/t+(ne&&(e=t[n]);return e}const yn={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function xn(t,e){return new yn[t](e)}let _n=0;const wn=new ae,bn=new Pe,Mn=new Rt,Sn=new Dt,Tn=new Dt,En=new Rt;class An extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:_n++}),this.uuid=ct(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(vn(t)>65535?pn:un)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,n=0){this.groups.push({start:t,count:e,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const n=this.attributes.normal;if(void 0!==n){const e=(new yt).getNormalMatrix(t);n.applyNormalMatrix(e),n.needsUpdate=!0}const i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(t),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return wn.makeRotationFromQuaternion(t),this.applyMatrix4(wn),this}rotateX(t){return wn.makeRotationX(t),this.applyMatrix4(wn),this}rotateY(t){return wn.makeRotationY(t),this.applyMatrix4(wn),this}rotateZ(t){return wn.makeRotationZ(t),this.applyMatrix4(wn),this}translate(t,e,n){return wn.makeTranslation(t,e,n),this.applyMatrix4(wn),this}scale(t,e,n){return wn.makeScale(t,e,n),this.applyMatrix4(wn),this}lookAt(t){return bn.lookAt(t),bn.updateMatrix(),this.applyMatrix4(bn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Mn).negate(),this.translate(Mn.x,Mn.y,Mn.z),this}setFromPoints(t){const e=[];for(let n=0,i=t.length;n0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const e in n){const i=n[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const n=this.morphAttributes[e],s=[];for(let e=0,i=n.length;e0&&(i[e]=s,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new An).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;null!==n&&this.setIndex(n.clone(e));const i=t.attributes;for(const t in i){const n=i[t];this.setAttribute(t,n.clone(e))}const r=t.morphAttributes;for(const t in r){const n=[],i=r[t];for(let t=0,r=i.length;t0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(t,e){const n=this.geometry,i=this.material,r=this.matrixWorld;if(void 0===i)return;if(null===n.boundingSphere&&n.computeBoundingSphere(),Cn.copy(n.boundingSphere),Cn.applyMatrix4(r),!1===t.ray.intersectsSphere(Cn))return;if(Ln.copy(r).invert(),Rn.copy(t.ray).applyMatrix4(Ln),null!==n.boundingBox&&!1===Rn.intersectsBox(n.boundingBox))return;let s;if(n.isBufferGeometry){const r=n.index,a=n.attributes.position,o=n.morphAttributes.position,l=n.morphTargetsRelative,c=n.attributes.uv,h=n.attributes.uv2,u=n.groups,d=n.drawRange;if(null!==r)if(Array.isArray(i))for(let n=0,p=u.length;nn.far?null:{distance:c,point:Wn.clone(),object:t}}(t,e,n,i,Pn,Dn,In,Vn);if(p){o&&(Gn.fromBufferAttribute(o,c),Un.fromBufferAttribute(o,h),kn.fromBufferAttribute(o,u),p.uv=qe.getUV(Vn,Pn,Dn,In,Gn,Un,kn,new vt)),l&&(Gn.fromBufferAttribute(l,c),Un.fromBufferAttribute(l,h),kn.fromBufferAttribute(l,u),p.uv2=qe.getUV(Vn,Pn,Dn,In,Gn,Un,kn,new vt));const t={a:c,b:h,c:u,normal:new Rt,materialIndex:0};qe.getNormal(Pn,Dn,In,t.normal),p.face=t}return p}jn.prototype.isMesh=!0;class Xn extends An{constructor(t=1,e=1,n=1,i=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:i,heightSegments:r,depthSegments:s};const a=this;i=Math.floor(i),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,n,i,r,s,p,m,f,g,v){const y=s/f,x=p/g,_=s/2,w=p/2,b=m/2,M=f+1,S=g+1;let T=0,E=0;const A=new Rt;for(let s=0;s0?1:-1,c.push(A.x,A.y,A.z),h.push(o/f),h.push(1-s/g),T+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const n={};for(const t in this.extensions)!0===this.extensions[t]&&(n[t]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}Qn.prototype.isShaderMaterial=!0;class Kn extends Pe{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new ae,this.projectionMatrix=new ae,this.projectionMatrixInverse=new ae}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Rt),this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}Kn.prototype.isCamera=!0;class $n extends Kn{constructor(t=50,e=1,n=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*lt*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ot*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*lt*Math.atan(Math.tan(.5*ot*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,i,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ot*this.fov)/this.zoom,n=2*e,i=this.aspect*n,r=-.5*i;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*i/t,e-=s.offsetY*n/a,i*=s.width/t,n*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}$n.prototype.isPerspectiveCamera=!0;const ti=90;class ei extends Pe{constructor(t,e,n){if(super(),this.type="CubeCamera",!0!==n.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=n;const i=new $n(ti,1,t,e);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new Rt(1,0,0)),this.add(i);const r=new $n(ti,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Rt(-1,0,0)),this.add(r);const s=new $n(ti,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Rt(0,1,0)),this.add(s);const a=new $n(ti,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Rt(0,-1,0)),this.add(a);const o=new $n(ti,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Rt(0,0,1)),this.add(o);const l=new $n(ti,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new Rt(0,0,-1)),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const n=this.renderTarget,[i,r,s,a,o,l]=this.children,c=t.xr.enabled,h=t.getRenderTarget();t.xr.enabled=!1;const u=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,i),t.setRenderTarget(n,1),t.render(e,r),t.setRenderTarget(n,2),t.render(e,s),t.setRenderTarget(n,3),t.render(e,a),t.setRenderTarget(n,4),t.render(e,o),n.texture.generateMipmaps=u,t.setRenderTarget(n,5),t.render(e,l),t.setRenderTarget(h),t.xr.enabled=c}}class ni extends bt{constructor(t,e,n,i,s,a,o,l,c,h){super(t=void 0!==t?t:[],e=void 0!==e?e:r,n,i,s,a,o=void 0!==o?o:T,l,c,h),this._needsFlipEnvMap=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}ni.prototype.isCubeTexture=!0;class ii extends Tt{constructor(t,e,n){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=n),super(t,t,e),e=e||{},this.texture=new ni(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:g,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=E,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new Xn(5,5,5),r=new Qn({name:"CubemapFromEquirect",uniforms:Yn(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new jn(i,r),a=e.minFilter;e.minFilter===y&&(e.minFilter=g);return new ei(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,n,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,n,i);t.setRenderTarget(r)}}ii.prototype.isWebGLCubeRenderTarget=!0;const ri=new Qt,si=new Rt;class ai{constructor(t=new Be,e=new Be,n=new Be,i=new Be,r=new Be,s=new Be){this.planes=[t,e,n,i,r,s]}set(t,e,n,i,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(n),a[3].copy(i),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t){const e=this.planes,n=t.elements,i=n[0],r=n[1],s=n[2],a=n[3],o=n[4],l=n[5],c=n[6],h=n[7],u=n[8],d=n[9],p=n[10],m=n[11],f=n[12],g=n[13],v=n[14],y=n[15];return e[0].setComponents(a-i,h-o,m-u,y-f).normalize(),e[1].setComponents(a+i,h+o,m+u,y+f).normalize(),e[2].setComponents(a+r,h+l,m+d,y+g).normalize(),e[3].setComponents(a-r,h-l,m-d,y-g).normalize(),e[4].setComponents(a-s,h-c,m-p,y-v).normalize(),e[5].setComponents(a+s,h+c,m+p,y+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),ri.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSprite(t){return ri.center.set(0,0,0),ri.radius=.7071067811865476,ri.applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSphere(t){const e=this.planes,n=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(n)0?t.max.x:t.min.x,si.y=i.normal.y>0?t.max.y:t.min.y,si.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(si)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function oi(){let t=null,e=!1,n=null,i=null;function r(e,s){n(e,s),i=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==n&&(i=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(i),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function li(t,e){const n=e.isWebGL2,i=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),i.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const n=i.get(e);n&&(t.deleteBuffer(n.buffer),i.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=i.get(e);return void((!t||t.version 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), rawDiffuseColor, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), rawDiffuseColor, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSNMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition.xyz / vWorldPosition.w;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\tfloat ior = ( 1.0 + 0.4 * reflectivity ) / ( 1.0 - 0.4 * reflectivity );\n\tvec3 f0 = vec3( pow( ior - 1.0, 2.0 ) / pow( ior + 1.0, 2.0 ) );\n\tvec3 f90 = vec3( 1.0 );\n\tvec3 f_transmission = totalTransmission * getIBLVolumeRefraction(\n\t\tnormal, v, viewDir, roughnessFactor, diffuseColor.rgb, f0, f90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance);\n\tdiffuseColor.rgb = mix( diffuseColor.rgb, f_transmission, totalTransmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec4 vWorldPosition;\n\tvec3 getVolumeTransmissionRay(vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix) {\n\t\tvec3 refractionVector = refract(-v, normalize(n), 1.0 / ior);\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length(vec3(modelMatrix[0].xyz));\n\t\tmodelScale.y = length(vec3(modelMatrix[1].xyz));\n\t\tmodelScale.z = length(vec3(modelMatrix[2].xyz));\n\t\treturn normalize(refractionVector) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness(float roughness, float ior) {\n\t\treturn roughness * clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n\t}\n\tvec3 getTransmissionSample(vec2 fragCoord, float roughness, float ior) {\n\t\tfloat framebufferLod = log2(transmissionSamplerSize.x) * applyIorToRoughness(roughness, ior);\n\t\treturn texture2DLodEXT(transmissionSamplerMap, fragCoord.xy, framebufferLod).rgb;\n\t}\n\tvec3 applyVolumeAttenuation(vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance) {\n\t\tif (attenuationDistance == 0.0) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log(attenuationColor) / attenuationDistance;\n\t\t\tvec3 transmittance = exp(-attenuationCoefficient * transmissionDistance);\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec3 getIBLVolumeRefraction(vec3 n, vec3 v, vec3 viewDir, float perceptualRoughness, vec3 baseColor, vec3 f0, vec3 f90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness, vec3 attenuationColor, float attenuationDistance) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, ior, modelMatrix);\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0);\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec3 transmittedLight = getTransmissionSample(refractionCoords, perceptualRoughness, ior);\n\t\tvec3 attenuatedColor = applyVolumeAttenuation(transmittedLight, length(transmissionRay), attenuationColor, attenuationDistance);\n\t\tfloat NdotV = saturate(dot(n, viewDir));\n\t\tvec2 brdf = integrateSpecularBRDF(NdotV, perceptualRoughness);\n\t\tvec3 specularColor = f0 * brdf.x + f90 * brdf.y;\n\t\treturn (1.0 - specularColor) * attenuatedColor * baseColor;\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform vec3 attenuationColor;\n\tuniform float attenuationDistance;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef USE_TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t\tfloat thicknessFactor = thickness;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 rawDiffuseColor = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#ifdef USE_TRANSMISSION\n\tvarying vec4 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition;\n#endif\n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},ui={common:{diffuse:{value:new en(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new yt},uv2Transform:{value:new yt},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new vt(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new en(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new en(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}},sprite:{diffuse:{value:new en(16777215)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}}},di={basic:{uniforms:Zn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.fog]),vertexShader:hi.meshbasic_vert,fragmentShader:hi.meshbasic_frag},lambert:{uniforms:Zn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.fog,ui.lights,{emissive:{value:new en(0)}}]),vertexShader:hi.meshlambert_vert,fragmentShader:hi.meshlambert_frag},phong:{uniforms:Zn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,ui.lights,{emissive:{value:new en(0)},specular:{value:new en(1118481)},shininess:{value:30}}]),vertexShader:hi.meshphong_vert,fragmentShader:hi.meshphong_frag},standard:{uniforms:Zn([ui.common,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.roughnessmap,ui.metalnessmap,ui.fog,ui.lights,{emissive:{value:new en(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:hi.meshphysical_vert,fragmentShader:hi.meshphysical_frag},toon:{uniforms:Zn([ui.common,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.gradientmap,ui.fog,ui.lights,{emissive:{value:new en(0)}}]),vertexShader:hi.meshtoon_vert,fragmentShader:hi.meshtoon_frag},matcap:{uniforms:Zn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,{matcap:{value:null}}]),vertexShader:hi.meshmatcap_vert,fragmentShader:hi.meshmatcap_frag},points:{uniforms:Zn([ui.points,ui.fog]),vertexShader:hi.points_vert,fragmentShader:hi.points_frag},dashed:{uniforms:Zn([ui.common,ui.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:hi.linedashed_vert,fragmentShader:hi.linedashed_frag},depth:{uniforms:Zn([ui.common,ui.displacementmap]),vertexShader:hi.depth_vert,fragmentShader:hi.depth_frag},normal:{uniforms:Zn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,{opacity:{value:1}}]),vertexShader:hi.normal_vert,fragmentShader:hi.normal_frag},sprite:{uniforms:Zn([ui.sprite,ui.fog]),vertexShader:hi.sprite_vert,fragmentShader:hi.sprite_frag},background:{uniforms:{uvTransform:{value:new yt},t2D:{value:null}},vertexShader:hi.background_vert,fragmentShader:hi.background_frag},cube:{uniforms:Zn([ui.envmap,{opacity:{value:1}}]),vertexShader:hi.cube_vert,fragmentShader:hi.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:hi.equirect_vert,fragmentShader:hi.equirect_frag},distanceRGBA:{uniforms:Zn([ui.common,ui.displacementmap,{referencePosition:{value:new Rt},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:hi.distanceRGBA_vert,fragmentShader:hi.distanceRGBA_frag},shadow:{uniforms:Zn([ui.lights,ui.fog,{color:{value:new en(0)},opacity:{value:1}}]),vertexShader:hi.shadow_vert,fragmentShader:hi.shadow_frag}};function pi(t,e,n,i,r){const s=new en(0);let a,o,c=0,h=null,u=0,d=null;function p(t,e){n.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),c=e,p(s,c)},getClearAlpha:function(){return c},setClearAlpha:function(t){c=t,p(s,c)},render:function(n,r){let m=!1,f=!0===r.isScene?r.background:null;f&&f.isTexture&&(f=e.get(f));const g=t.xr,v=g.getSession&&g.getSession();v&&"additive"===v.environmentBlendMode&&(f=null),null===f?p(s,c):f&&f.isColor&&(p(f,1),m=!0),(t.autoClear||m)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),f&&(f.isCubeTexture||f.mapping===l)?(void 0===o&&(o=new jn(new Xn(1,1,1),new Qn({name:"BackgroundCubeMaterial",uniforms:Yn(di.cube.uniforms),vertexShader:di.cube.vertexShader,fragmentShader:di.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(o)),o.material.uniforms.envMap.value=f,o.material.uniforms.flipEnvMap.value=f.isCubeTexture&&f._needsFlipEnvMap?-1:1,h===f&&u===f.version&&d===t.toneMapping||(o.material.needsUpdate=!0,h=f,u=f.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null)):f&&f.isTexture&&(void 0===a&&(a=new jn(new ci(2,2),new Qn({name:"BackgroundMaterial",uniforms:Yn(di.background.uniforms),vertexShader:di.background.vertexShader,fragmentShader:di.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(a)),a.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),a.material.uniforms.uvTransform.value.copy(f.matrix),h===f&&u===f.version&&d===t.toneMapping||(a.material.needsUpdate=!0,h=f,u=f.version,d=t.toneMapping),n.unshift(a,a.geometry,a.material,0,0,null))}}}function mi(t,e,n,i){const r=t.getParameter(34921),s=i.isWebGL2?null:e.get("OES_vertex_array_object"),a=i.isWebGL2||null!==s,o={},l=d(null);let c=l;function h(e){return i.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return i.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],n=[],i=[];for(let t=0;t=0){const s=l[e];if(void 0!==s){const e=s.normalized,r=s.itemSize,a=n.get(s);if(void 0===a)continue;const l=a.buffer,c=a.type,h=a.bytesPerElement;if(s.isInterleavedBufferAttribute){const n=s.data,a=n.stride,u=s.offset;n&&n.isInstancedInterleavedBuffer?(f(i,n.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=n.meshPerAttribute*n.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,a*h,u*h)}else s.isInstancedBufferAttribute?(f(i,s.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,0,0)}else if("instanceMatrix"===e){const e=n.get(r.instanceMatrix);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i+0,1),f(i+1,1),f(i+2,1),f(i+3,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i+0,4,a,!1,64,0),t.vertexAttribPointer(i+1,4,a,!1,64,16),t.vertexAttribPointer(i+2,4,a,!1,64,32),t.vertexAttribPointer(i+3,4,a,!1,64,48)}else if("instanceColor"===e){const e=n.get(r.instanceColor);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i,3,a,!1,12,0)}else if(void 0!==h){const n=h[e];if(void 0!==n)switch(n.length){case 2:t.vertexAttrib2fv(i,n);break;case 3:t.vertexAttrib3fv(i,n);break;case 4:t.vertexAttrib4fv(i,n);break;default:t.vertexAttrib1fv(i,n)}}}}g()}(r,l,u,y),null!==x&&t.bindBuffer(34963,n.get(x).buffer))},reset:y,resetDefaultState:x,dispose:function(){y();for(const t in o){const e=o[t];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t]}},releaseStatesOfGeometry:function(t){if(void 0===o[t.id])return;const e=o[t.id];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t.id]},releaseStatesOfProgram:function(t){for(const e in o){const n=o[e];if(void 0===n[t.id])continue;const i=n[t.id];for(const t in i)u(i[t].object),delete i[t];delete n[t.id]}},initAttributes:p,enableAttribute:m,disableUnusedAttributes:g}}function fi(t,e,n,i){const r=i.isWebGL2;let s;this.setMode=function(t){s=t},this.render=function(e,i){t.drawArrays(s,e,i),n.update(i,s,1)},this.renderInstances=function(i,a,o){if(0===o)return;let l,c;if(r)l=t,c="drawArraysInstanced";else if(l=e.get("ANGLE_instanced_arrays"),c="drawArraysInstancedANGLE",null===l)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[c](s,i,a,o),n.update(a,s,o)}}function gi(t,e,n){let i;function r(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==n.precision?n.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===n.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),f=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),y=u>0,x=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===e.has("EXT_texture_filter_anisotropic")){const n=e.get("EXT_texture_filter_anisotropic");i=t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:y,floatFragmentTextures:x,floatVertexTextures:y&&x,maxSamples:s?t.getParameter(36183):0}}function vi(t){const e=this;let n=null,i=0,r=!1,s=!1;const a=new Be,o=new yt,l={value:null,needsUpdate:!1};function c(){l.value!==n&&(l.value=n,l.needsUpdate=i>0),e.numPlanes=i,e.numIntersection=0}function h(t,n,i,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=i+4*s,r=n.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0){const a=t.getRenderTarget(),o=new ii(s.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),t.setRenderTarget(a),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}function xi(t){const e={};function n(n){if(void 0!==e[n])return e[n];let i;switch(n){case"WEBGL_depth_texture":i=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":i=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":i=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":i=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:i=t.getExtension(n)}return e[n]=i,i}return{has:function(t){return null!==n(t)},init:function(t){t.isWebGL2?n("EXT_color_buffer_float"):(n("WEBGL_depth_texture"),n("OES_texture_float"),n("OES_texture_half_float"),n("OES_texture_half_float_linear"),n("OES_standard_derivatives"),n("OES_element_index_uint"),n("OES_vertex_array_object"),n("ANGLE_instanced_arrays")),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float")},get:function(t){const e=n(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function _i(t,e,n,i){const r={},s=new WeakMap;function a(t){const o=t.target;null!==o.index&&e.remove(o.index);for(const t in o.attributes)e.remove(o.attributes[t]);o.removeEventListener("dispose",a),delete r[o.id];const l=s.get(o);l&&(e.remove(l),s.delete(o)),i.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,n.memory.geometries--}function o(t){const n=[],i=t.index,r=t.attributes.position;let a=0;if(null!==i){const t=i.array;a=i.version;for(let e=0,i=t.length;e65535?pn:un)(n,1);o.version=a;const l=s.get(t);l&&e.remove(l),s.set(t,o)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",a),r[e.id]=!0,n.memory.geometries++),e},update:function(t){const n=t.attributes;for(const t in n)e.update(n[t],34962);const i=t.morphAttributes;for(const t in i){const n=i[t];for(let t=0,i=n.length;t0)return t;const r=e*n;let s=Ii[r];if(void 0===s&&(s=new Float32Array(r),Ii[r]=s),0!==e){i.toArray(s,0);for(let i=1,r=0;i!==e;++i)r+=n,t[i].toArray(s,r)}return s}function Hi(t,e){if(t.length!==e.length)return!1;for(let n=0,i=t.length;n/gm;function kr(t){return t.replace(Ur,Vr)}function Vr(t,e){const n=hi[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return kr(n)}const Wr=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,jr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function qr(t){return t.replace(jr,Yr).replace(Wr,Xr)}function Xr(t,e,n,i){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Yr(t,e,n,i)}function Yr(t,e,n,i){let r="";for(let t=parseInt(e);t0?t.gammaFactor:1,v=n.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap||t.transmission>0)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Or).join("\n")}(n),y=function(t){const e=[];for(const n in t){const i=t[n];!1!==i&&e.push("#define "+n+" "+i)}return e.join("\n")}(o),x=a.createProgram();let _,w,b=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?(_=[y].filter(Or).join("\n"),_.length>0&&(_+="\n"),w=[v,y].filter(Or).join("\n"),w.length>0&&(w+="\n")):(_=[Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+g,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+m:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+d:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Or).join("\n"),w=[v,Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+g,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+p:"",n.envMap?"#define "+m:"",n.envMap?"#define "+f:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+d:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?hi.tonemapping_pars_fragment:"",0!==n.toneMapping?Fr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",hi.encodings_pars_fragment,n.map?Br("mapTexelToLinear",n.mapEncoding):"",n.matcap?Br("matcapTexelToLinear",n.matcapEncoding):"",n.envMap?Br("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMap?Br("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMap?Br("lightMapTexelToLinear",n.lightMapEncoding):"",zr("linearToOutputTexel",n.outputEncoding),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Or).join("\n")),h=kr(h),h=Hr(h,n),h=Gr(h,n),u=kr(u),u=Hr(u,n),u=Gr(u,n),h=qr(h),u=qr(u),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(b="#version 300 es\n",_=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,w=["#define varying in",n.glslVersion===it?"":"out highp vec4 pc_fragColor;",n.glslVersion===it?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+w);const M=b+w+u,S=Pr(a,35633,b+_+h),T=Pr(a,35632,M);if(a.attachShader(x,S),a.attachShader(x,T),void 0!==n.index0AttributeName?a.bindAttribLocation(x,0,n.index0AttributeName):!0===n.morphTargets&&a.bindAttribLocation(x,0,"position"),a.linkProgram(x),t.debug.checkShaderErrors){const t=a.getProgramInfoLog(x).trim(),e=a.getShaderInfoLog(S).trim(),n=a.getShaderInfoLog(T).trim();let i=!0,r=!0;if(!1===a.getProgramParameter(x,35714)){i=!1;const e=Nr(a,S,"vertex"),n=Nr(a,T,"fragment");console.error("THREE.WebGLProgram: shader error: ",a.getError(),"35715",a.getProgramParameter(x,35715),"gl.getProgramInfoLog",t,e,n)}else""!==t?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",t):""!==e&&""!==n||(r=!1);r&&(this.diagnostics={runnable:i,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:n,prefix:w}})}let E,A;return a.deleteShader(S),a.deleteShader(T),this.getUniforms=function(){return void 0===E&&(E=new Cr(a,x)),E},this.getAttributes=function(){return void 0===A&&(A=function(t,e){const n={},i=t.getProgramParameter(e,35721);for(let r=0;r0,maxBones:S,useVertexTexture:u,morphTargets:r.morphTargets,morphNormals:r.morphNormals,numDirLights:a.directional.length,numPointLights:a.point.length,numSpotLights:a.spot.length,numRectAreaLights:a.rectArea.length,numHemiLights:a.hemi.length,numDirLightShadows:a.directionalShadowMap.length,numPointLightShadows:a.pointShadowMap.length,numSpotLightShadows:a.spotShadowMap.length,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:r.dithering,shadowMapEnabled:t.shadowMap.enabled&&g.length>0,shadowMapType:t.shadowMap.type,toneMapping:r.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:r.premultipliedAlpha,alphaTest:r.alphaTest,doubleSided:2===r.side,flipSided:1===r.side,depthPacking:void 0!==r.depthPacking&&r.depthPacking,index0AttributeName:r.index0AttributeName,extensionDerivatives:r.extensions&&r.extensions.derivatives,extensionFragDepth:r.extensions&&r.extensions.fragDepth,extensionDrawBuffers:r.extensions&&r.extensions.drawBuffers,extensionShaderTextureLOD:r.extensions&&r.extensions.shaderTextureLOD,rendererExtensionFragDepth:o||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:o||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:o||n.has("EXT_shader_texture_lod"),customProgramCacheKey:r.customProgramCacheKey()}},getProgramCacheKey:function(e){const n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)n.push(t),n.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t0?r.push(h):!0===n.transparent?s.push(h):i.push(h)},unshift:function(t,e,n,a,l,c){const h=o(t,e,n,a,l,c);n.transmission>0?r.unshift(h):!0===n.transparent?s.unshift(h):i.unshift(h)},finish:function(){for(let t=n,i=e.length;t1&&i.sort(t||$r),r.length>1&&r.sort(e||ts),s.length>1&&s.sort(e||ts)}}}function ns(t){let e=new WeakMap;return{get:function(n,i){let r;return!1===e.has(n)?(r=new es(t),e.set(n,[r])):i>=e.get(n).length?(r=new es(t),e.get(n).push(r)):r=e.get(n)[i],r},dispose:function(){e=new WeakMap}}}function is(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new Rt,color:new en};break;case"SpotLight":n={position:new Rt,direction:new Rt,color:new en,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Rt,color:new en,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Rt,skyColor:new en,groundColor:new en};break;case"RectAreaLight":n={color:new en,position:new Rt,halfWidth:new Rt,halfHeight:new Rt}}return t[e.id]=n,n}}}let rs=0;function ss(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function as(t,e){const n=new is,i=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=n,n}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new Rt);const s=new Rt,a=new ae,o=new ae;return{setup:function(s){let a=0,o=0,l=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let c=0,h=0,u=0,d=0,p=0,m=0,f=0,g=0;s.sort(ss);for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=ui.LTC_FLOAT_1,r.rectAreaLTC2=ui.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=ui.LTC_HALF_1,r.rectAreaLTC2=ui.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=a,r.ambient[1]=o,r.ambient[2]=l;const v=r.hash;v.directionalLength===c&&v.pointLength===h&&v.spotLength===u&&v.rectAreaLength===d&&v.hemiLength===p&&v.numDirectionalShadows===m&&v.numPointShadows===f&&v.numSpotShadows===g||(r.directional.length=c,r.spot.length=u,r.rectArea.length=d,r.point.length=h,r.hemi.length=p,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=f,r.pointShadowMap.length=f,r.spotShadow.length=g,r.spotShadowMap.length=g,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=f,r.spotShadowMatrix.length=g,v.directionalLength=c,v.pointLength=h,v.spotLength=u,v.rectAreaLength=d,v.hemiLength=p,v.numDirectionalShadows=m,v.numPointShadows=f,v.numSpotShadows=g,r.version=rs++)},setupView:function(t,e){let n=0,i=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=n.get(i).length?(s=new os(t,e),n.get(i).push(s)):s=n.get(i)[r],s},dispose:function(){n=new WeakMap}}}class cs extends Ye{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}cs.prototype.isMeshDepthMaterial=!0;class hs extends Ye{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Rt,this.nearDistance=1,this.farDistance=1e3,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}hs.prototype.isMeshDistanceMaterial=!0;function us(t,e,n){let i=new ai;const r=new vt,s=new vt,a=new St,o=[],l=[],c={},h=n.maxTextureSize,u={0:1,1:0,2:2},d=new Qn({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),m=d.clone();m.defines.HORIZONTAL_PASS=1;const f=new An;f.setAttribute("position",new an(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new jn(f,d),y=this;function x(n,i){const r=e.update(v);d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(i,null,r,d,v,null),m.uniforms.shadow_pass.value=n.mapPass.texture,m.uniforms.resolution.value=n.mapSize,m.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(i,null,r,m,v,null)}function _(t){const e=t<<0;let n=o[e];return void 0===n&&(n=new cs({depthPacking:3201,morphTargets:t}),o[e]=n),n}function w(t){const e=t<<0;let n=l[e];return void 0===n&&(n=new hs({morphTargets:t}),l[e]=n),n}function b(e,n,i,r,s,a,o){let l=null,h=_,d=e.customDepthMaterial;if(!0===r.isPointLight&&(h=w,d=e.customDistanceMaterial),void 0===d){let t=!1;!0===i.morphTargets&&(t=n.morphAttributes&&n.morphAttributes.position&&n.morphAttributes.position.length>0),l=h(t)}else l=d;if(t.localClippingEnabled&&!0===i.clipShadows&&0!==i.clippingPlanes.length){const t=l.uuid,e=i.uuid;let n=c[t];void 0===n&&(n={},c[t]=n);let r=n[e];void 0===r&&(r=l.clone(),n[e]=r),l=r}return l.visible=i.visible,l.wireframe=i.wireframe,l.side=3===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:u[i.side],l.clipShadows=i.clipShadows,l.clippingPlanes=i.clippingPlanes,l.clipIntersection=i.clipIntersection,l.wireframeLinewidth=i.wireframeLinewidth,l.linewidth=i.linewidth,!0===r.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(r.matrixWorld),l.nearDistance=s,l.farDistance=a),l}function M(n,r,s,a,o){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===o)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,n.matrixWorld);const i=e.update(n),r=n.material;if(Array.isArray(r)){const e=i.groups;for(let l=0,c=e.length;lh||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/m.x),r.x=s.x*m.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/m.y),r.y=s.y*m.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:g,magFilter:g,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Tt(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:p,magFilter:p,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t=1):-1!==R.indexOf("OpenGL ES")&&(L=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=L>=2);let C=null,P={};const D=t.getParameter(3088),I=t.getParameter(2978),N=(new St).fromArray(D),B=(new St).fromArray(I);function z(e,n,i){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;ei||t.height>i)&&(r=i/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const i=e?ft:Math.floor,s=i(r*t.width),a=i(r*t.height);void 0===P&&(P=I(s,a));const o=n?I(s,a):P;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function B(t){return pt(t.width)&&pt(t.height)}function z(t,e){return t.generateMipmaps&&e&&t.minFilter!==p&&t.minFilter!==g}function F(e,n,r,s){t.generateMipmap(e);i.get(n).__maxMipLevel=Math.log2(Math.max(r,s))}function O(n,i,r){if(!1===o)return i;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let s=i;return 6403===i&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===i&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===i&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function H(t){return t===p||t===m||t===f?9728:9729}function G(e){const n=e.target;n.removeEventListener("dispose",G),function(e){const n=i.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),i.remove(e)}(n),n.isVideoTexture&&C.delete(n),a.memory.textures--}function U(e){const n=e.target;n.removeEventListener("dispose",U),function(e){const n=e.texture,r=i.get(e),s=i.get(n);if(!e)return;void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&t.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&t.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(e.isWebGLMultipleRenderTargets)for(let e=0,r=n.length;e0&&r.__version!==t.version){const n=t.image;if(void 0===n)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==n.complete)return void Z(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+e),n.bindTexture(3553,r.__webglTexture)}function W(e,r){const a=i.get(e);e.version>0&&a.__version!==e.version?function(e,i,r){if(6!==i.image.length)return;Y(e,i),n.activeTexture(33984+r),n.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,i.flipY),t.pixelStorei(37441,i.premultiplyAlpha),t.pixelStorei(3317,i.unpackAlignment),t.pixelStorei(37443,0);const a=i&&(i.isCompressedTexture||i.image[0].isCompressedTexture),l=i.image[0]&&i.image[0].isDataTexture,h=[];for(let t=0;t<6;t++)h[t]=a||l?l?i.image[t].image:i.image[t]:N(i.image[t],!1,!0,c);const u=h[0],d=B(u)||o,p=s.convert(i.format),m=s.convert(i.type),f=O(i.internalFormat,p,m);let g;if(X(34067,i,d),a){for(let t=0;t<6;t++){g=h[t].mipmaps;for(let e=0;e1||i.get(s).__currentAnisotropy)&&(t.texParameterf(n,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),i.get(s).__currentAnisotropy=s.anisotropy)}}function Y(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",G),e.__webglTexture=t.createTexture(),a.memory.textures++)}function Z(e,i,r){let a=3553;i.isDataTexture2DArray&&(a=35866),i.isDataTexture3D&&(a=32879),Y(e,i),n.activeTexture(33984+r),n.bindTexture(a,e.__webglTexture),t.pixelStorei(37440,i.flipY),t.pixelStorei(37441,i.premultiplyAlpha),t.pixelStorei(3317,i.unpackAlignment),t.pixelStorei(37443,0);const l=function(t){return!o&&(t.wrapS!==u||t.wrapT!==u||t.minFilter!==p&&t.minFilter!==g)}(i)&&!1===B(i.image),c=N(i.image,l,!1,x),h=B(c)||o,d=s.convert(i.format);let m,f=s.convert(i.type),v=O(i.internalFormat,d,f);X(a,i,h);const y=i.mipmaps;if(i.isDepthTexture)v=6402,o?v=i.type===b?36012:i.type===w?33190:i.type===S?35056:33189:i.type===b&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),i.format===A&&6402===v&&i.type!==_&&i.type!==w&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),i.type=_,f=s.convert(i.type)),i.format===L&&6402===v&&(v=34041,i.type!==S&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),i.type=S,f=s.convert(i.type))),n.texImage2D(3553,0,v,c.width,c.height,0,d,f,null);else if(i.isDataTexture)if(y.length>0&&h){for(let t=0,e=y.length;t0&&h){for(let t=0,e=y.length;t=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),k+=1,t},this.resetTextureUnits=function(){k=0},this.setTexture2D=V,this.setTexture2DArray=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(32879,r.__webglTexture))},this.setTextureCube=W,this.setupRenderTarget=function(e){const l=e.texture,c=i.get(e),h=i.get(l);e.addEventListener("dispose",U),!0!==e.isWebGLMultipleRenderTargets&&(h.__webglTexture=t.createTexture(),h.__version=l.version,a.memory.textures++);const u=!0===e.isWebGLCubeRenderTarget,d=!0===e.isWebGLMultipleRenderTargets,p=!0===e.isWebGLMultisampleRenderTarget,m=l.isDataTexture3D||l.isDataTexture2DArray,f=B(e)||o;if(!o||l.format!==T||l.type!==b&&l.type!==M||(l.format=E,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){c.__webglFramebuffer=[];for(let e=0;e<6;e++)c.__webglFramebuffer[e]=t.createFramebuffer()}else if(c.__webglFramebuffer=t.createFramebuffer(),d)if(r.drawBuffers){const n=e.texture;for(let e=0,r=n.length;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==i),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}}class xs extends rt{constructor(t,e){super();const n=this,i=t.state;let r=null,s=1,a=null,o="local-floor",l=null;const c=[],h=new Map,u=new $n;u.layers.enable(1),u.viewport=new St;const d=new $n;d.layers.enable(2),d.viewport=new St;const p=[u,d],m=new fs;m.layers.enable(1),m.layers.enable(2);let f=null,g=null;function v(t){const e=h.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function y(){h.forEach((function(t,e){t.disconnect(e)})),h.clear(),f=null,g=null,i.bindXRFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),S.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function x(t){const e=r.inputSources;for(let t=0;t0&&(t.transmissionSamplerMap.value=i.texture,t.transmissionSamplerSize.value.set(i.width,i.height));t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap);t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor)}(t,i,a):n(t,i)):i.isMeshMatcapMaterial?(e(t,i),function(t,e){e.matcap&&(t.matcap.value=e.matcap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDepthMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDistanceMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,i)):i.isMeshNormalMaterial?(e(t,i),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,i),i.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,i)):i.isPointsMaterial?function(t,e,n,i){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*n,t.scale.value=.5*i,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,i,r,s):i.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let n;e.map?n=e.map:e.alphaMap&&(n=e.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),t.uvTransform.value.copy(n.matrix))}(t,i):i.isShadowMaterial?(t.color.value.copy(i.color),t.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function ws(t){const e=void 0!==(t=t||{}).canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),n=void 0!==t.context?t.context:null,i=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,c=void 0!==t.powerPreference?t.powerPreference:"default",h=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let d=null,m=null;const f=[],g=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=X,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const v=this;let _=!1,w=0,S=0,T=null,A=-1,L=null;const R=new St,C=new St;let P=null,D=e.width,I=e.height,N=1,B=null,z=null;const F=new St(0,0,D,I),O=new St(0,0,D,I);let H=!1;const G=[],U=new ai;let k=!1,V=!1,W=null;const j=new ae,q=new Rt,Y={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function Z(){return null===T?N:1}let J,Q,K,$,tt,et,nt,it,rt,st,at,ot,lt,ct,ht,ut,dt,pt,mt,ft,gt,yt,xt=n;function _t(t,n){for(let i=0;i0&&Nt(i,t,e),r.length>0&&function(t,e,n,i){null===W&&(W=new Tt(1024,1024,{generateMipmaps:!0,minFilter:y,magFilter:p,wrapS:u,wrapT:u}));const r=v.getRenderTarget();v.setRenderTarget(W),v.clear(),Nt(t,n,i),et.updateRenderTargetMipmap(W),v.setRenderTarget(r),Nt(e,n,i)}(i,r,t,e),s.length>0&&Nt(s,t,e),null!==T&&(et.updateRenderTargetMipmap(T),et.updateMultisampleRenderTarget(T)),!0===t.isScene&&t.onAfterRender(v,t,e),K.buffers.depth.setTest(!0),K.buffers.depth.setMask(!0),K.buffers.color.setMask(!0),K.setPolygonOffset(!1),yt.resetDefaultState(),A=-1,L=null,g.pop(),m=g.length>0?g[g.length-1]:null,f.pop(),d=f.length>0?f[f.length-1]:null},this.getActiveCubeFace=function(){return w},this.getActiveMipmapLevel=function(){return S},this.getRenderTarget=function(){return T},this.setRenderTarget=function(t,e=0,n=0){T=t,w=e,S=n,t&&void 0===tt.get(t).__webglFramebuffer&&et.setupRenderTarget(t);let i=null,r=!1,s=!1;if(t){const n=t.texture;(n.isDataTexture3D||n.isDataTexture2DArray)&&(s=!0);const a=tt.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(i=a[e],r=!0):i=t.isWebGLMultisampleRenderTarget?tt.get(t).__webglMultisampledFramebuffer:a,R.copy(t.viewport),C.copy(t.scissor),P=t.scissorTest}else R.copy(F).multiplyScalar(N).floor(),C.copy(O).multiplyScalar(N).floor(),P=H;if(K.bindFramebuffer(36160,i)&&Q.drawBuffers){let e=!1;if(t)if(t.isWebGLMultipleRenderTargets){const n=t.texture;if(G.length!==n.length||36064!==G[0]){for(let t=0,e=n.length;t=0&&e<=t.width-i&&n>=0&&n<=t.height-r&&xt.readPixels(e,n,i,r,gt.convert(o),gt.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==T?tt.get(T).__webglFramebuffer:null;K.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),s=Math.floor(e.image.height*i);let a=gt.convert(e.format);Q.isWebGL2&&(6407===a&&(a=32849),6408===a&&(a=32856)),et.setTexture2D(e,0),xt.copyTexImage2D(3553,n,a,t.x,t.y,r,s,0),K.unbindTexture()},this.copyTextureToTexture=function(t,e,n,i=0){const r=e.image.width,s=e.image.height,a=gt.convert(n.format),o=gt.convert(n.type);et.setTexture2D(n,0),xt.pixelStorei(37440,n.flipY),xt.pixelStorei(37441,n.premultiplyAlpha),xt.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?xt.texSubImage2D(3553,i,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?xt.compressedTexSubImage2D(3553,i,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):xt.texSubImage2D(3553,i,t.x,t.y,a,o,e.image),0===i&&n.generateMipmaps&&xt.generateMipmap(3553),K.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,i,r=0){if(v.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const{width:s,height:a,data:o}=n.image,l=gt.convert(i.format),c=gt.convert(i.type);let h;if(i.isDataTexture3D)et.setTexture3D(i,0),h=32879;else{if(!i.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");et.setTexture2DArray(i,0),h=35866}xt.pixelStorei(37440,i.flipY),xt.pixelStorei(37441,i.premultiplyAlpha),xt.pixelStorei(3317,i.unpackAlignment);const u=xt.getParameter(3314),d=xt.getParameter(32878),p=xt.getParameter(3316),m=xt.getParameter(3315),f=xt.getParameter(32877);xt.pixelStorei(3314,s),xt.pixelStorei(32878,a),xt.pixelStorei(3316,t.min.x),xt.pixelStorei(3315,t.min.y),xt.pixelStorei(32877,t.min.z),xt.texSubImage3D(h,r,e.x,e.y,e.z,t.max.x-t.min.x+1,t.max.y-t.min.y+1,t.max.z-t.min.z+1,l,c,o),xt.pixelStorei(3314,u),xt.pixelStorei(32878,d),xt.pixelStorei(3316,p),xt.pixelStorei(3315,m),xt.pixelStorei(32877,f),0===r&&i.generateMipmaps&&xt.generateMipmap(h),K.unbindTexture()},this.initTexture=function(t){et.setTexture2D(t,0),K.unbindTexture()},this.resetState=function(){w=0,S=0,T=null,K.reset(),yt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}class bs extends ws{}bs.prototype.isWebGL1Renderer=!0;class Ms{constructor(t,e=25e-5){this.name="",this.color=new en(t),this.density=e}clone(){return new Ms(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}Ms.prototype.isFogExp2=!0;class Ss{constructor(t,e=1,n=1e3){this.name="",this.color=new en(t),this.near=e,this.far=n}clone(){return new Ss(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}Ss.prototype.isFog=!0;class Ts extends Pe{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.background&&(e.object.background=this.background.toJSON(t)),null!==this.environment&&(e.object.environment=this.environment.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}Ts.prototype.isScene=!0;class Es{constructor(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=et,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=ct()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let i=0,r=this.stride;it.far||e.push({distance:o,point:Ps.clone(),uv:qe.getUV(Ps,Fs,Os,Hs,Gs,Us,ks,new vt),face:null,object:this})}copy(t){return super.copy(t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Ws(t,e,n,i,r,s){Ns.subVectors(t,n).addScalar(.5).multiply(i),void 0!==r?(Bs.x=s*Ns.x-r*Ns.y,Bs.y=r*Ns.x+s*Ns.y):Bs.copy(Ns),t.copy(e),t.x+=Bs.x,t.y+=Bs.y,t.applyMatrix4(zs)}Vs.prototype.isSprite=!0;const js=new Rt,qs=new Rt;class Xs extends Pe{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,n=e.length;t0){let n,i;for(n=1,i=e.length;n0){js.setFromMatrixPosition(this.matrixWorld);const n=t.ray.origin.distanceTo(js);this.getObjectForDistance(n).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){js.setFromMatrixPosition(t.matrixWorld),qs.setFromMatrixPosition(this.matrixWorld);const n=js.distanceTo(qs)/t.zoom;let i,r;for(e[0].object.visible=!0,i=1,r=e.length;i=e[i].distance;i++)e[i-1].object.visible=!1,e[i].object.visible=!0;for(this._currentLevel=i-1;io)continue;u.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(u);dt.far||e.push({distance:d,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}else{for(let n=Math.max(0,s.start),i=Math.min(r.count,s.start+s.count)-1;no)continue;u.applyMatrix4(this.matrixWorld);const i=t.ray.origin.distanceTo(u);it.far||e.push({distance:i,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}}else n.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,n=Object.keys(e);if(n.length>0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}ga.prototype.isLine=!0;const va=new Rt,ya=new Rt;class xa extends ga{constructor(t,e){super(t,e),this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,n=[];for(let t=0,i=e.count;t0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}function Aa(t,e,n,i,r,s,a){const o=Ma.distanceSqToPoint(t);if(or.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:n,index:e,face:null,object:a})}}Ea.prototype.isPoints=!0;class La extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.format=void 0!==a?a:T,this.minFilter=void 0!==s?s:g,this.magFilter=void 0!==r?r:g,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){c.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}La.prototype.isVideoTexture=!0;class Ra extends bt{constructor(t,e,n,i,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,i,r,h,u),this.image={width:e,height:n},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}Ra.prototype.isCompressedTexture=!0;class Ca extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.needsUpdate=!0}}Ca.prototype.isCanvasTexture=!0;class Pa extends bt{constructor(t,e,n,i,r,s,a,o,l,c){if((c=void 0!==c?c:A)!==A&&c!==L)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&c===A&&(n=_),void 0===n&&c===L&&(n=S),super(null,i,r,s,a,o,c,n,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:p,this.minFilter=void 0!==o?o:p,this.flipY=!1,this.generateMipmaps=!1}}Pa.prototype.isDepthTexture=!0;class Da extends An{constructor(t=1,e=8,n=0,i=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:n,thetaLength:i},e=Math.max(3,e);const r=[],s=[],a=[],o=[],l=new Rt,c=new vt;s.push(0,0,0),a.push(0,0,1),o.push(.5,.5);for(let r=0,h=3;r<=e;r++,h+=3){const u=n+r/e*i;l.x=t*Math.cos(u),l.y=t*Math.sin(u),s.push(l.x,l.y,l.z),a.push(0,0,1),c.x=(s[h]/t+1)/2,c.y=(s[h+1]/t+1)/2,o.push(c.x,c.y)}for(let t=1;t<=e;t++)r.push(t,t+1,0);this.setIndex(r),this.setAttribute("position",new fn(s,3)),this.setAttribute("normal",new fn(a,3)),this.setAttribute("uv",new fn(o,2))}}class Ia extends An{constructor(t=1,e=1,n=1,i=8,r=1,s=!1,a=0,o=2*Math.PI){super(),this.type="CylinderGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:n,radialSegments:i,heightSegments:r,openEnded:s,thetaStart:a,thetaLength:o};const l=this;i=Math.floor(i),r=Math.floor(r);const c=[],h=[],u=[],d=[];let p=0;const m=[],f=n/2;let g=0;function v(n){const r=p,s=new vt,m=new Rt;let v=0;const y=!0===n?t:e,x=!0===n?1:-1;for(let t=1;t<=i;t++)h.push(0,f*x,0),u.push(0,x,0),d.push(.5,.5),p++;const _=p;for(let t=0;t<=i;t++){const e=t/i*o+a,n=Math.cos(e),r=Math.sin(e);m.x=y*r,m.y=f*x,m.z=y*n,h.push(m.x,m.y,m.z),u.push(0,x,0),s.x=.5*n+.5,s.y=.5*r*x+.5,d.push(s.x,s.y),p++}for(let t=0;t0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new fn(h,3)),this.setAttribute("normal",new fn(u,3)),this.setAttribute("uv",new fn(d,2))}}class Na extends Ia{constructor(t=1,e=1,n=8,i=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,n,i,r,s,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:s,thetaLength:a}}}class Ba extends An{constructor(t,e,n=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:n,detail:i};const r=[],s=[];function a(t,e,n,i){const r=i+1,s=[];for(let i=0;i<=r;i++){s[i]=[];const a=t.clone().lerp(n,i/r),o=e.clone().lerp(n,i/r),l=r-i;for(let t=0;t<=l;t++)s[i][t]=0===t&&i===r?a:a.clone().lerp(o,t/l)}for(let t=0;t.9&&a<.1&&(e<.2&&(s[t+0]+=1),n<.2&&(s[t+2]+=1),i<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new fn(r,3)),this.setAttribute("normal",new fn(r.slice(),3)),this.setAttribute("uv",new fn(s,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}}class za extends Ba{constructor(t=1,e=0){const n=(1+Math.sqrt(5))/2,i=1/n;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-n,0,-i,n,0,i,-n,0,i,n,-i,-n,0,-i,n,0,i,-n,0,i,n,0,-n,0,-i,n,0,-i,-n,0,i,n,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}}const Fa=new Rt,Oa=new Rt,Ha=new Rt,Ga=new qe;class Ua extends An{constructor(t,e){if(super(),this.type="EdgesGeometry",this.parameters={thresholdAngle:e},e=void 0!==e?e:1,!0===t.isGeometry)return void console.error("THREE.EdgesGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");const n=Math.pow(10,4),i=Math.cos(ot*e),r=t.getIndex(),s=t.getAttribute("position"),a=r?r.count:s.count,o=[0,0,0],l=["a","b","c"],c=new Array(3),h={},u=[];for(let t=0;t80*n){o=c=t[0],l=h=t[1];for(let e=n;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?1/p:0}return ja(s,a,n,o,l,p),a};function Va(t,e,n,i,r){let s,a;if(r===function(t,e,n,i){let r=0;for(let s=e,a=n-i;s0)for(s=e;s=e;s-=i)a=ho(s,t[s],t[s+1],a);return a&&ro(a,a.next)&&(uo(a),a=a.next),a}function Wa(t,e){if(!t)return t;e||(e=t);let n,i=t;do{if(n=!1,i.steiner||!ro(i,i.next)&&0!==io(i.prev,i,i.next))i=i.next;else{if(uo(i),i=e=i.prev,i===i.next)break;n=!0}}while(n||i!==e);return e}function ja(t,e,n,i,r,s,a){if(!t)return;!a&&s&&function(t,e,n,i){let r=t;do{null===r.z&&(r.z=$a(r.x,r.y,e,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,n,i,r,s,a,o,l,c=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,i=n,o=0,e=0;e0||l>0&&i;)0!==o&&(0===l||!i||n.z<=i.z)?(r=n,n=n.nextZ,o--):(r=i,i=i.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;n=i}s.nextZ=null,c*=2}while(a>1)}(r)}(t,i,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?Xa(t,i,r,s):qa(t))e.push(o.i/n),e.push(t.i/n),e.push(l.i/n),uo(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?ja(t=Ya(Wa(t),e,n),e,n,i,r,s,2):2===a&&Za(t,e,n,i,r,s):ja(Wa(t),e,n,i,r,s,1);break}}function qa(t){const e=t.prev,n=t,i=t.next;if(io(e,n,i)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(eo(e.x,e.y,n.x,n.y,i.x,i.y,r.x,r.y)&&io(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Xa(t,e,n,i){const r=t.prev,s=t,a=t.next;if(io(r,s,a)>=0)return!1;const o=r.xs.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,h=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=$a(o,l,e,n,i),d=$a(c,h,e,n,i);let p=t.prevZ,m=t.nextZ;for(;p&&p.z>=u&&m&&m.z<=d;){if(p!==t.prev&&p!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&io(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==t.prev&&m!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&io(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&io(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==t.prev&&m!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&io(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Ya(t,e,n){let i=t;do{const r=i.prev,s=i.next.next;!ro(r,s)&&so(r,i,i.next,s)&&lo(r,s)&&lo(s,r)&&(e.push(r.i/n),e.push(i.i/n),e.push(s.i/n),uo(i),uo(i.next),i=t=s),i=i.next}while(i!==t);return Wa(i)}function Za(t,e,n,i,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&no(a,t)){let o=co(a,t);return a=Wa(a,a.next),o=Wa(o,o.next),ja(a,e,n,i,r,s),void ja(o,e,n,i,r,s)}t=t.next}a=a.next}while(a!==t)}function Ja(t,e){return t.x-e.x}function Qa(t,e){if(e=function(t,e){let n=e;const i=t.x,r=t.y;let s,a=-1/0;do{if(r<=n.y&&r>=n.next.y&&n.next.y!==n.y){const t=n.x+(r-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(t<=i&&t>a){if(a=t,t===i){if(r===n.y)return n;if(r===n.next.y)return n.next}s=n.x=n.x&&n.x>=l&&i!==n.x&&eo(rs.x||n.x===s.x&&Ka(s,n)))&&(s=n,u=h)),n=n.next}while(n!==o);return s}(t,e)){const n=co(e,t);Wa(e,e.next),Wa(n,n.next)}}function Ka(t,e){return io(t.prev,t,e.prev)<0&&io(e.next,t,t.next)<0}function $a(t,e,n,i,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function to(t){let e=t,n=t;do{(e.x=0&&(t-a)*(i-o)-(n-a)*(e-o)>=0&&(n-a)*(s-o)-(r-a)*(i-o)>=0}function no(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&so(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&(lo(t,e)&&lo(e,t)&&function(t,e){let n=t,i=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{n.y>s!=n.next.y>s&&n.next.y!==n.y&&r<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==t);return i}(t,e)&&(io(t.prev,t,e.prev)||io(t,e.prev,e))||ro(t,e)&&io(t.prev,t,t.next)>0&&io(e.prev,e,e.next)>0)}function io(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function ro(t,e){return t.x===e.x&&t.y===e.y}function so(t,e,n,i){const r=oo(io(t,e,n)),s=oo(io(t,e,i)),a=oo(io(n,i,t)),o=oo(io(n,i,e));return r!==s&&a!==o||(!(0!==r||!ao(t,n,e))||(!(0!==s||!ao(t,i,e))||(!(0!==a||!ao(n,t,i))||!(0!==o||!ao(n,e,i)))))}function ao(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function oo(t){return t>0?1:t<0?-1:0}function lo(t,e){return io(t.prev,t,t.next)<0?io(t,e,t.next)>=0&&io(t,t.prev,e)>=0:io(t,e,t.prev)<0||io(t,t.next,e)<0}function co(t,e){const n=new po(t.i,t.x,t.y),i=new po(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,n.next=r,r.prev=n,i.next=n,n.prev=i,s.next=i,i.prev=s,i}function ho(t,e,n,i){const r=new po(t,e,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function uo(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function po(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class mo{static area(t){const e=t.length;let n=0;for(let i=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function go(t,e){for(let n=0;nNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((n.x-c/d-p)*c-(n.y+l/d-m)*l)/(a*c-o*l);i=p+a*f-t.x,r=m+o*f-t.y;const g=i*i+r*r;if(g<=2)return new vt(i,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(i=-o,r=a,s=Math.sqrt(h)):(i=a,r=o,s=Math.sqrt(h/2))}return new vt(i/s,r/s)}const P=[];for(let t=0,e=E.length,n=e-1,i=t+1;t=0;t--){const e=t/p,n=h*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=E.length;t=0;){const i=n;let r=n-1;r<0&&(r=t.length-1);for(let t=0,n=o+2*p;t=0?(t(i-o,p,h),u.subVectors(c,h)):(t(i+o,p,h),u.subVectors(h,c)),p-o>=0?(t(i,p-o,h),d.subVectors(c,h)):(t(i,p+o,h),d.subVectors(h,c)),l.crossVectors(u,d).normalize(),s.push(l.x,l.y,l.z),a.push(i,p)}}for(let t=0;t0)&&d.push(e,r,l),(t!==n-1||o=i)){l.push(e.times[t]);for(let n=0;ns.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=i.times[u]){const t=u*l+o,e=t+l-o;d=Wo.arraySlice(i.values,t,e)}else{const t=i.createInterpolant(),e=o,n=l-o;t.evaluate(s),d=Wo.arraySlice(t.resultBuffer,e,n)}if("quaternion"===r){(new Lt).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=n,n=0}}for(;n>>1;te;)--s;if(++s,0!==r||s!==i){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Wo.arraySlice(n,r,s),this.values=Wo.arraySlice(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const n=this.times,i=this.values,r=n.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const i=n[e];if("number"==typeof i&&isNaN(i)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,i),t=!1;break}if(null!==s&&s>i){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,i,s),t=!1;break}s=i}if(void 0!==i&&Wo.isTypedArray(i))for(let e=0,n=i.length;e!==n;++e){const n=i[e];if(isNaN(n)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,n),t=!1;break}}return t}optimize(){const t=Wo.arraySlice(this.times),e=Wo.arraySlice(this.values),n=this.getValueSize(),i=this.getInterpolation()===U,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*n,i=s*n,a=0;a!==n;++a)e[i+a]=e[t+a];++s}return s!==t.length?(this.times=Wo.arraySlice(t,0,s),this.values=Wo.arraySlice(e,0,s*n)):(this.times=t,this.values=e),this}clone(){const t=Wo.arraySlice(this.times,0),e=Wo.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,t,e);return n.createInterpolant=this.createInterpolant,n}}Zo.prototype.TimeBufferType=Float32Array,Zo.prototype.ValueBufferType=Float32Array,Zo.prototype.DefaultInterpolation=G;class Jo extends Zo{}Jo.prototype.ValueTypeName="bool",Jo.prototype.ValueBufferType=Array,Jo.prototype.DefaultInterpolation=H,Jo.prototype.InterpolantFactoryMethodLinear=void 0,Jo.prototype.InterpolantFactoryMethodSmooth=void 0;class Qo extends Zo{}Qo.prototype.ValueTypeName="color";class Ko extends Zo{}Ko.prototype.ValueTypeName="number";class $o extends jo{constructor(t,e,n,i){super(t,e,n,i)}interpolate_(t,e,n,i){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(n-e)/(i-e);let l=t*a;for(let t=l+a;l!==t;l+=4)Lt.slerpFlat(r,0,s,l-a,s,l,o);return r}}class tl extends Zo{InterpolantFactoryMethodLinear(t){return new $o(this.times,this.values,this.getValueSize(),t)}}tl.prototype.ValueTypeName="quaternion",tl.prototype.DefaultInterpolation=G,tl.prototype.InterpolantFactoryMethodSmooth=void 0;class el extends Zo{}el.prototype.ValueTypeName="string",el.prototype.ValueBufferType=Array,el.prototype.DefaultInterpolation=H,el.prototype.InterpolantFactoryMethodLinear=void 0,el.prototype.InterpolantFactoryMethodSmooth=void 0;class nl extends Zo{}nl.prototype.ValueTypeName="vector";class il{constructor(t,e=-1,n,i=2500){this.name=t,this.tracks=n,this.duration=e,this.blendMode=i,this.uuid=ct(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],n=t.tracks,i=1/(t.fps||1);for(let t=0,r=n.length;t!==r;++t)e.push(rl(n[t]).scale(i));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],n=t.tracks,i={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,i=n.length;t!==i;++t)e.push(Zo.toJSON(n[t]));return i}static CreateFromMorphTargetSequence(t,e,n,i){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=i[t];e||(i[t]=e=[]),e.push(n)}}const s=[];for(const t in i)s.push(this.CreateFromMorphTargetSequence(t,i[t],e,n));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const n=function(t,e,n,i,r){if(0!==n.length){const s=[],a=[];Wo.flattenJSON(n,s,a,i),0!==s.length&&r.push(new t(e,s,a))}},i=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t0||0===t.search(/^data\:image\/jpeg/);r.format=i?T:E,r.needsUpdate=!0,void 0!==e&&e(r)}),n,i),r}}class fl{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const n=this.getUtoTmapping(t);return this.getPoint(n,e)}getPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPoint(n/t));return e}getSpacedPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPointAt(n/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let n,i=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)n=this.getPoint(s/t),r+=n.distanceTo(i),e.push(r),i=n;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const n=this.getLengths();let i=0;const r=n.length;let s;s=e||t*n[r-1];let a,o=0,l=r-1;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),a=n[i]-s,a<0)o=i+1;else{if(!(a>0)){l=i;break}l=i-1}if(i=l,n[i]===s)return i/(r-1);const c=n[i];return(i+(s-c)/(n[i+1]-c))/(r-1)}getTangent(t,e){const n=1e-4;let i=t-n,r=t+n;i<0&&(i=0),r>1&&(r=1);const s=this.getPoint(i),a=this.getPoint(r),o=e||(s.isVector2?new vt:new Rt);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const n=this.getUtoTmapping(t);return this.getTangent(n,e)}computeFrenetFrames(t,e){const n=new Rt,i=[],r=[],s=[],a=new Rt,o=new ae;for(let e=0;e<=t;e++){const n=e/t;i[e]=this.getTangentAt(n,new Rt),i[e].normalize()}r[0]=new Rt,s[0]=new Rt;let l=Number.MAX_VALUE;const c=Math.abs(i[0].x),h=Math.abs(i[0].y),u=Math.abs(i[0].z);c<=l&&(l=c,n.set(1,0,0)),h<=l&&(l=h,n.set(0,1,0)),u<=l&&n.set(0,0,1),a.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],a),s[0].crossVectors(i[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(i[e-1],i[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ht(i[e-1].dot(i[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(i[e],r[e])}if(!0===e){let e=Math.acos(ht(r[0].dot(r[t]),-1,1));e/=t,i[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let n=1;n<=t;n++)r[n].applyMatrix4(o.makeRotationAxis(i[n],e*n)),s[n].crossVectors(i[n],r[n])}return{tangents:i,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class gl extends fl{constructor(t=0,e=0,n=1,i=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const n=e||new vt,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=i[(l-1)%r]:(xl.subVectors(i[0],i[1]).add(i[0]),a=xl);const h=i[l%r],u=i[(l+1)%r];if(this.closed||l+2i.length-2?i.length-1:s+1],h=i[s>i.length-3?i.length-1:s+2];return n.set(Sl(a,o.x,l.x,c.x,h.x),Sl(a,o.y,l.y,c.y,h.y)),n}copy(t){super.copy(t),this.points=[];for(let e=0,n=t.points.length;e=e){const t=n[i]-e,r=this.curves[i],s=r.getLength(),a=0===s?0:1-t/s;return r.getPointAt(a)}i++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let n=0,i=this.curves.length;n1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,n=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Fl extends zl{constructor(t){super(t),this.uuid=ct(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let n=0,i=this.holes.length;n0:i.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(i.uniforms[e]={},r.type){case"t":i.uniforms[e].value=n(r.value);break;case"c":i.uniforms[e].value=(new en).setHex(r.value);break;case"v2":i.uniforms[e].value=(new vt).fromArray(r.value);break;case"v3":i.uniforms[e].value=(new Rt).fromArray(r.value);break;case"v4":i.uniforms[e].value=(new St).fromArray(r.value);break;case"m3":i.uniforms[e].value=(new yt).fromArray(r.value);break;case"m4":i.uniforms[e].value=(new ae).fromArray(r.value);break;default:i.uniforms[e].value=r.value}}if(void 0!==t.defines&&(i.defines=t.defines),void 0!==t.vertexShader&&(i.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(i.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(const e in t.extensions)i.extensions[e]=t.extensions[e];if(void 0!==t.shading&&(i.flatShading=1===t.shading),void 0!==t.size&&(i.size=t.size),void 0!==t.sizeAttenuation&&(i.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(i.map=n(t.map)),void 0!==t.matcap&&(i.matcap=n(t.matcap)),void 0!==t.alphaMap&&(i.alphaMap=n(t.alphaMap)),void 0!==t.bumpMap&&(i.bumpMap=n(t.bumpMap)),void 0!==t.bumpScale&&(i.bumpScale=t.bumpScale),void 0!==t.normalMap&&(i.normalMap=n(t.normalMap)),void 0!==t.normalMapType&&(i.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),i.normalScale=(new vt).fromArray(e)}return void 0!==t.displacementMap&&(i.displacementMap=n(t.displacementMap)),void 0!==t.displacementScale&&(i.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(i.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(i.roughnessMap=n(t.roughnessMap)),void 0!==t.metalnessMap&&(i.metalnessMap=n(t.metalnessMap)),void 0!==t.emissiveMap&&(i.emissiveMap=n(t.emissiveMap)),void 0!==t.emissiveIntensity&&(i.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(i.specularMap=n(t.specularMap)),void 0!==t.envMap&&(i.envMap=n(t.envMap)),void 0!==t.envMapIntensity&&(i.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(i.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(i.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(i.lightMap=n(t.lightMap)),void 0!==t.lightMapIntensity&&(i.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(i.aoMap=n(t.aoMap)),void 0!==t.aoMapIntensity&&(i.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(i.gradientMap=n(t.gradientMap)),void 0!==t.clearcoatMap&&(i.clearcoatMap=n(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=n(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(i.clearcoatNormalMap=n(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(i.clearcoatNormalScale=(new vt).fromArray(t.clearcoatNormalScale)),void 0!==t.transmissionMap&&(i.transmissionMap=n(t.transmissionMap)),void 0!==t.thicknessMap&&(i.thicknessMap=n(t.thicknessMap)),i}setTextures(t){return this.textures=t,this}}class sc{static decodeText(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let n=0,i=t.length;nNumber.EPSILON){if(l<0&&(n=e[s],o=-o,a=e[r],l=-l),t.ya.y)continue;if(t.y===n.y){if(t.x===n.x)return!0}else{const e=l*(t.x-n.x)-o*(t.y-n.y);if(0===e)return!0;if(e<0)continue;i=!i}}else{if(t.y!==n.y)continue;if(a.x<=t.x&&t.x<=n.x||n.x<=t.x&&t.x<=a.x)return!0}}return i}const r=mo.isClockWise,s=this.subPaths;if(0===s.length)return[];if(!0===e)return n(s);let a,o,l;const c=[];if(1===s.length)return o=s[0],l=new Fl,l.curves=o.curves,c.push(l),c;let h=!r(s[0].getPoints());h=t?!h:h;const u=[],d=[];let p,m,f=[],g=0;d[g]=void 0,f[g]=[];for(let e=0,n=s.length;e1){let t=!1;const e=[];for(let t=0,e=d.length;t0&&(t||(f=u))}for(let t=0,e=d.length;t0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(n,i,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(n[t]!==n[t+e]){a.setValue(n,i);break}}saveOriginalState(){const t=this.binding,e=this.buffer,n=this.valueSize,i=n*this._origIndex;t.getValue(e,i);for(let t=n,r=i;t!==r;++t)e[t]=e[i+t%n];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let n=t;n=.5)for(let i=0;i!==r;++i)t[e+i]=t[n+i]}_slerp(t,e,n,i){Lt.slerpFlat(t,e,t,e,t,n,i)}_slerpAdditive(t,e,n,i,r){const s=this._workIndex*r;Lt.multiplyQuaternionsFlat(t,s,t,e,t,n),Lt.slerpFlat(t,e,t,e,t,s,i)}_lerp(t,e,n,i,r){const s=1-i;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[n+a]*i}}_lerpAdditive(t,e,n,i,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[n+s]*i}}}const zc="\\[\\]\\.:\\/",Fc=new RegExp("[\\[\\]\\.:\\/]","g"),Oc="[^\\[\\]\\.:\\/]",Hc="[^"+zc.replace("\\.","")+"]",Gc=/((?:WC+[\/:])*)/.source.replace("WC",Oc),Uc=/(WCOD+)?/.source.replace("WCOD",Hc),kc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Oc),Vc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Oc),Wc=new RegExp("^"+Gc+Uc+kc+Vc+"$"),jc=["material","materials","bones"];class qc{constructor(t,e,n){this.path=e,this.parsedPath=n||qc.parseTrackName(e),this.node=qc.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,n){return t&&t.isAnimationObjectGroup?new qc.Composite(t,e,n):new qc(t,e,n)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Fc,"")}static parseTrackName(t){const e=Wc.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const t=n.nodeName.substring(i+1);-1!==jc.indexOf(t)&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=t)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return n}static findNode(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const n=t.skeleton.getBoneByName(e);if(void 0!==n)return n}if(t.children){const n=function(t){for(let i=0;i=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=i;t!==e;++t){const e=n[t],i=e[s],r=e[l];e[l]=i,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=i;t!==e;++t){const e=n[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const n=this._bindingsIndicesByPath;let i=n[t];const r=this._bindings;if(void 0!==i)return r[i];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);i=r.length,n[t]=i,s.push(t),a.push(e),r.push(h);for(let n=c,i=o.length;n!==i;++n){const i=o[n];h[n]=new qc(i,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,n=e[t];if(void 0!==n){const i=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=n,s[n]=o,s.pop(),r[n]=r[a],r.pop(),i[n]=i[a],i.pop()}}}Xc.prototype.isAnimationObjectGroup=!0;class Yc{constructor(t,e,n=null,i=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=n,this.blendMode=i;const r=e.tracks,s=r.length,a=new Array(s),o={endingStart:k,endingEnd:k};for(let t=0;t!==s;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(s),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,n){if(t.fadeOut(e),this.fadeIn(e),n){const n=this._clip.duration,i=t._clip.duration,r=i/n,s=n/i;t.warp(1,r,e),this.warp(s,1,e)}return this}crossFadeTo(t,e,n){return t.crossFadeFrom(this,e,n)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,n){const i=this._mixer,r=i.time,s=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=i._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,l=a.sampleValues;return o[0]=r,o[1]=r+n,l[0]=t/s,l[1]=e/s,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,n,i){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const i=(t-r)*n;if(i<0||0===n)return;this._startTime=null,e=n*i}e*=this._updateTimeScale(t);const s=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;switch(this.blendMode){case q:for(let n=0,i=t.length;n!==i;++n)t[n].evaluate(s),e[n].accumulateAdditive(a);break;case j:default:for(let n=0,r=t.length;n!==r;++n)t[n].evaluate(s),e[n].accumulate(i,a)}}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const n=this._weightInterpolant;if(null!==n){const i=n.evaluate(t)[0];e*=i,t>n.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const n=this._timeScaleInterpolant;if(null!==n){e*=n.evaluate(t)[0],t>n.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,n=this.loop;let i=this.time+t,r=this._loopCount;const s=2202===n;if(0===t)return-1===r?i:s&&1==(1&r)?e-i:i;if(2200===n){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(i>=e)i=e;else{if(!(i<0)){this.time=i;break t}i=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),i>=e||i<0){const n=Math.floor(i/e);i-=e*n,r+=Math.abs(n);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=t>0?e:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:n})}}else this.time=i;if(s&&1==(1&r))return e-i}return i}_setEndings(t,e,n){const i=this._interpolantSettings;n?(i.endingStart=V,i.endingEnd=V):(i.endingStart=t?this.zeroSlopeAtStart?V:k:W,i.endingEnd=e?this.zeroSlopeAtEnd?V:k:W)}_scheduleFading(t,e,n){const i=this._mixer,r=i.time;let s=this._weightInterpolant;null===s&&(s=i._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=n,this}}class Zc extends rt{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const n=t._localRoot||this._root,i=t._clip.tracks,r=i.length,s=t._propertyBindings,a=t._interpolants,o=n.uuid,l=this._bindingsByRootAndName;let c=l[o];void 0===c&&(c={},l[o]=c);for(let t=0;t!==r;++t){const r=i[t],l=r.name;let h=c[l];if(void 0!==h)s[t]=h;else{if(h=s[t],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,o,l));continue}const i=e&&e._propertyBindings[t].binding.parsedPath;h=new Bc(qc.create(n,l,i),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,o,l),s[t]=h}a[t].resultBuffer=h.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,n=t._clip.uuid,i=this._actionsByClip[n];this._bindAction(t,i&&i.knownActions[0]),this._addInactiveAction(t,n,e)}const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==n.useCount++&&(this._lendBinding(n),n.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==--n.useCount&&(n.restoreOriginalState(),this._takeBackBinding(n))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,n=this._nActiveActions,i=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==n;++a){e[a]._update(i,t,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;tthis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new vt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new vt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return eh.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}nh.prototype.isBox2=!0;const ih=new Rt,rh=new Rt;class sh{constructor(t=new Rt,e=new Rt){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Rt),t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Rt),t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Rt),this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){ih.subVectors(t,this.start),rh.subVectors(this.end,this.start);const n=rh.dot(rh);let i=rh.dot(ih)/n;return e&&(i=ht(i,0,1)),i}closestPointToPoint(t,e,n){const i=this.closestPointToPointParameter(t,e);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new Rt),this.delta(n).multiplyScalar(i).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}class ah extends Pe{constructor(t){super(),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}}ah.prototype.isImmediateRenderObject=!0;const oh=new Rt;const lh=new Rt,ch=new ae,hh=new ae;class uh extends xa{constructor(t){const e=dh(t),n=new An,i=[],r=[],s=new en(0,0,1),a=new en(0,1,0);for(let t=0;t4?a=Dh[r-8+4-1]:0==r&&(a=0),n.push(a);const o=1/(s-1),l=-o/2,c=1+o/2,h=[l,l,c,l,c,c,l,l,c,c,l,c],u=6,d=6,p=3,m=2,f=1,g=new Float32Array(p*d*u),v=new Float32Array(m*d*u),y=new Float32Array(f*d*u);for(let t=0;t2?0:-1,i=[e,n,0,e+2/3,n,0,e+2/3,n+1,0,e,n,0,e+2/3,n+1,0,e,n+1,0];g.set(i,p*d*t),v.set(h,m*d*t);const r=[t,t,t,t,t,t];y.set(r,f*d*t)}const x=new An;x.setAttribute("position",new an(g,p)),x.setAttribute("uv",new an(v,m)),x.setAttribute("faceIndex",new an(y,f)),t.push(x),i>4&&i--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function Jh(t){const e=new Tt(3*Ph,3*Ph,t);return e.texture.mapping=l,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Qh(t,e,n,i,r){t.viewport.set(e,n,i,r),t.scissor.set(e,n,i,r)}function Kh(){const t=new vt(1,1);return new No({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:Bh[3e3]},outputEncoding:{value:Bh[3e3]}},vertexShader:tu(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${eu()}\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function $h(){return new No({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:Bh[3e3]},outputEncoding:{value:Bh[3e3]}},vertexShader:tu(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${eu()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function tu(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function eu(){return"\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t"}fl.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(fl.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},zl.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)},gh.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},uh.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},ll.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),sc.extractUrlBase(t)},ll.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},nh.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},nh.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},nh.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},nh.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)},Dt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Dt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},Dt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},Dt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},Dt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)},Qt.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ai.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},sh.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},yt.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},yt.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},yt.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},yt.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},ae.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},ae.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},ae.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Rt).setFromMatrixColumn(this,3)},ae.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},ae.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},ae.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},ae.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},ae.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},ae.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},ae.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},ae.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},ae.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},ae.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},ae.prototype.makeFrustum=function(t,e,n,i,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,i,n,r,s)},ae.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},Be.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},Lt.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},Lt.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},se.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},se.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},se.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},qe.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},qe.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},qe.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},qe.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},qe.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)},qe.barycoordFromPoint=function(t,e,n,i,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),qe.getBarycoord(t,e,n,i,r)},qe.normal=function(t,e,n,i){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),qe.getNormal(t,e,n,i)},Fl.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},Fl.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new vo(this,t)},Fl.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new So(this,t)},vt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},vt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},vt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Rt.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Rt.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Rt.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},Rt.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},Rt.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},Rt.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},Rt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},Rt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},Rt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},St.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},St.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Pe.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},Pe.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},Pe.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},Pe.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},Pe.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(Pe.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),jn.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")},Object.defineProperties(jn.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),$s.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},$n.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(Ol.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties(an.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===nt},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(nt)}}}),an.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},an.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},an.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},An.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},An.prototype.addAttribute=function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new an(arguments[1],arguments[2])))},An.prototype.addDrawCall=function(t,e,n){void 0!==n&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},An.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},An.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},An.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},An.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(An.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Es.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},Es.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},vo.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},vo.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},vo.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},Ts.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Jc.prototype.onUpdate=function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this},Object.defineProperties(Ye.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new en}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}}}),Object.defineProperties(Qn.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),ws.prototype.clearTarget=function(t,e,n,i){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,n,i)},ws.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},ws.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},ws.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},ws.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},ws.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},ws.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},ws.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},ws.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},ws.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},ws.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},ws.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},ws.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},ws.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},ws.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},ws.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},ws.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},ws.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},ws.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},ws.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},ws.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},ws.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},ws.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},ws.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},ws.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(ws.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===t?Y:X}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(us.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(Tt.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Rc.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return(new yc).load(t,(function(t){e.setBuffer(t)})),this},Nc.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},ei.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)},ei.prototype.clear=function(t,e,n,i){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,i)},_t.crossOrigin=void 0,_t.loadTexture=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new ml;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadTextureCube=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new dl;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},_t.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};const nu={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:e}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=e),t.ACESFilmicToneMapping=4,t.AddEquation=n,t.AddOperation=2,t.AdditiveAnimationBlendMode=q,t.AdditiveBlending=2,t.AlphaFormat=1021,t.AlwaysDepth=1,t.AlwaysStencilFunc=519,t.AmbientLight=tc,t.AmbientLightProbe=_c,t.AnimationClip=il,t.AnimationLoader=class extends ll{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new hl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e=[];for(let n=0;n.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Th.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Th,e)}}setLength(t,e=.2*t,n=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(n,e,n),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}},t.Audio=Rc,t.AudioAnalyser=Nc,t.AudioContext=vc,t.AudioListener=class extends Pe{constructor(){super(),this.type="AudioListener",this.context=vc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new Mc}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,n=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Tc,Ec,Ac),Lc.set(0,0,-1).applyQuaternion(Ec),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Tc.x,t),e.positionY.linearRampToValueAtTime(Tc.y,t),e.positionZ.linearRampToValueAtTime(Tc.z,t),e.forwardX.linearRampToValueAtTime(Lc.x,t),e.forwardY.linearRampToValueAtTime(Lc.y,t),e.forwardZ.linearRampToValueAtTime(Lc.z,t),e.upX.linearRampToValueAtTime(n.x,t),e.upY.linearRampToValueAtTime(n.y,t),e.upZ.linearRampToValueAtTime(n.z,t)}else e.setPosition(Tc.x,Tc.y,Tc.z),e.setOrientation(Lc.x,Lc.y,Lc.z,n.x,n.y,n.z)}},t.AudioLoader=yc,t.AxesHelper=Lh,t.AxisHelper=function(t){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new Lh(t)},t.BackSide=1,t.BasicDepthPacking=3200,t.BasicShadowMap=0,t.BinaryTextureLoader=function(t){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new pl(t)},t.Bone=ta,t.BooleanKeyframeTrack=Jo,t.BoundingBoxHelper=function(t,e){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new Sh(t,e)},t.Box2=nh,t.Box3=Dt,t.Box3Helper=class extends xa{constructor(t,e=16776960){const n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),i=new An;i.setIndex(new an(n,1)),i.setAttribute("position",new fn([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(i,new ha({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}},t.BoxBufferGeometry=Xn,t.BoxGeometry=Xn,t.BoxHelper=Sh,t.BufferAttribute=an,t.BufferGeometry=An,t.BufferGeometryLoader=lc,t.ByteType=1010,t.Cache=sl,t.Camera=Kn,t.CameraHelper=class extends xa{constructor(t){const e=new An,n=new ha({color:16777215,vertexColors:!0,toneMapped:!1}),i=[],r=[],s={},a=new en(16755200),o=new en(16711680),l=new en(43775),c=new en(16777215),h=new en(3355443);function u(t,e,n){d(t,n),d(e,n)}function d(t,e){i.push(0,0,0),r.push(e.r,e.g,e.b),void 0===s[t]&&(s[t]=[]),s[t].push(i.length/3-1)}u("n1","n2",a),u("n2","n4",a),u("n4","n3",a),u("n3","n1",a),u("f1","f2",a),u("f2","f4",a),u("f4","f3",a),u("f3","f1",a),u("n1","f1",a),u("n2","f2",a),u("n3","f3",a),u("n4","f4",a),u("p","n1",o),u("p","n2",o),u("p","n3",o),u("p","n4",o),u("u1","u2",l),u("u2","u3",l),u("u3","u1",l),u("c","t",c),u("p","c",h),u("cn1","cn2",h),u("cn3","cn4",h),u("cf1","cf2",h),u("cf3","cf4",h),e.setAttribute("position",new fn(i,3)),e.setAttribute("color",new fn(r,3)),super(e,n),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}update(){const t=this.geometry,e=this.pointMap;wh.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),bh("c",e,t,wh,0,0,-1),bh("t",e,t,wh,0,0,1),bh("n1",e,t,wh,-1,-1,-1),bh("n2",e,t,wh,1,-1,-1),bh("n3",e,t,wh,-1,1,-1),bh("n4",e,t,wh,1,1,-1),bh("f1",e,t,wh,-1,-1,1),bh("f2",e,t,wh,1,-1,1),bh("f3",e,t,wh,-1,1,1),bh("f4",e,t,wh,1,1,1),bh("u1",e,t,wh,.7,1.1,-1),bh("u2",e,t,wh,-.7,1.1,-1),bh("u3",e,t,wh,0,2,-1),bh("cf1",e,t,wh,-1,0,1),bh("cf2",e,t,wh,1,0,1),bh("cf3",e,t,wh,0,-1,1),bh("cf4",e,t,wh,0,1,1),bh("cn1",e,t,wh,-1,0,-1),bh("cn2",e,t,wh,1,0,-1),bh("cn3",e,t,wh,0,-1,-1),bh("cn4",e,t,wh,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")},t.CanvasTexture=Ca,t.CatmullRomCurve3=Ml,t.CineonToneMapping=3,t.CircleBufferGeometry=Da,t.CircleGeometry=Da,t.ClampToEdgeWrapping=u,t.Clock=Mc,t.Color=en,t.ColorKeyframeTrack=Qo,t.CompressedTexture=Ra,t.CompressedTextureLoader=class extends ll{constructor(t){super(t)}load(t,e,n,i){const r=this,s=[],a=new Ra,o=new hl(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const n=r.parse(t,!0);s[c]={width:n.width,height:n.height,format:n.format,mipmaps:n.mipmaps},l+=1,6===l&&(1===n.mipmapCount&&(a.minFilter=g),a.image=s,a.format=n.format,a.needsUpdate=!0,e&&e(a))}),n,i)}if(Array.isArray(t))for(let e=0,n=t.length;e>16&32768,i=e>>12&2047;const r=e>>23&255;return r<103?n:r>142?(n|=31744,n|=(255==r?0:1)&&8388607&e,n):r<113?(i|=2048,n|=(i>>114-r)+(i>>113-r&1),n):(n|=r-112<<10|i>>1,n+=1&i,n)}},t.DecrementStencilOp=7683,t.DecrementWrapStencilOp=34056,t.DefaultLoadingManager=ol,t.DepthFormat=A,t.DepthStencilFormat=L,t.DepthTexture=Pa,t.DirectionalLight=$l,t.DirectionalLightHelper=class extends Pe{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,void 0===e&&(e=1);let i=new An;i.setAttribute("position",new fn([-e,e,0,e,e,0,e,-e,0,-e,-e,0,-e,e,0],3));const r=new ha({fog:!1,toneMapped:!1});this.lightPlane=new ga(i,r),this.add(this.lightPlane),i=new An,i.setAttribute("position",new fn([0,0,0,0,0,1],3)),this.targetLine=new ga(i,r),this.add(this.targetLine),this.update()}dispose(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()}update(){vh.setFromMatrixPosition(this.light.matrixWorld),yh.setFromMatrixPosition(this.light.target.matrixWorld),xh.subVectors(yh,vh),this.lightPlane.lookAt(yh),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(yh),this.targetLine.scale.z=xh.length()}},t.DiscreteInterpolant=Yo,t.DodecahedronBufferGeometry=za,t.DodecahedronGeometry=za,t.DoubleSide=2,t.DstAlphaFactor=206,t.DstColorFactor=208,t.DynamicBufferAttribute=function(t,e){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),new an(t,e).setUsage(nt)},t.DynamicCopyUsage=35050,t.DynamicDrawUsage=nt,t.DynamicReadUsage=35049,t.EdgesGeometry=Ua,t.EdgesHelper=function(t,e){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new xa(new Ua(t.geometry),new ha({color:void 0!==e?e:16777215}))},t.EllipseCurve=gl,t.EqualDepth=4,t.EqualStencilFunc=514,t.EquirectangularReflectionMapping=a,t.EquirectangularRefractionMapping=o,t.Euler=ge,t.EventDispatcher=rt,t.ExtrudeBufferGeometry=vo,t.ExtrudeGeometry=vo,t.FaceColors=1,t.FileLoader=hl,t.FlatShading=1,t.Float16BufferAttribute=mn,t.Float32Attribute=function(t,e){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new fn(t,e)},t.Float32BufferAttribute=fn,t.Float64Attribute=function(t,e){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new gn(t,e)},t.Float64BufferAttribute=gn,t.FloatType=b,t.Fog=Ss,t.FogExp2=Ms,t.Font=mc,t.FontLoader=class extends ll{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new hl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(t){let n;try{n=JSON.parse(t)}catch(e){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),n=JSON.parse(t.substring(65,t.length-2))}const i=r.parse(n);e&&e(i)}),n,i)}parse(t){return new mc(t)}},t.FrontSide=0,t.Frustum=ai,t.GLBufferAttribute=Kc,t.GLSL1="100",t.GLSL3=it,t.GammaEncoding=Z,t.GreaterDepth=6,t.GreaterEqualDepth=5,t.GreaterEqualStencilFunc=518,t.GreaterStencilFunc=516,t.GridHelper=gh,t.Group=gs,t.HalfFloatType=M,t.HemisphereLight=Hl,t.HemisphereLightHelper=class extends Pe{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;const i=new wo(e);i.rotateY(.5*Math.PI),this.material=new nn({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);const r=i.getAttribute("position"),s=new Float32Array(3*r.count);i.setAttribute("color",new an(s,3)),this.add(new jn(i,this.material)),this.update()}dispose(){this.children[0].geometry.dispose(),this.children[0].material.dispose()}update(){const t=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{const e=t.geometry.getAttribute("color");mh.copy(this.light.color),fh.copy(this.light.groundColor);for(let t=0,n=e.count;t0){const n=new al(e);r=new ul(n),r.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}(Nh),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,i=100){Vh=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(t,n,i,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t){return this._fromTexture(t)}fromCubemap(t){return this._fromTexture(t)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=$h(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Kh(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let t=0;t2?Ph:0,Ph,Ph),o.setRenderTarget(i),u&&o.render(Fh,r),o.render(t,r)}o.toneMapping=h,o.outputEncoding=c,o.autoClear=l}_textureToCubeUV(t,e){const n=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=$h()):null==this._equirectShader&&(this._equirectShader=Kh());const i=t.isCubeTexture?this._cubemapShader:this._equirectShader,r=new jn(Hh[0],i),s=i.uniforms;s.envMap.value=t,t.isCubeTexture||s.texelSize.value.set(1/t.image.width,1/t.image.height),s.inputEncoding.value=Bh[t.encoding],s.outputEncoding.value=Bh[e.texture.encoding],Qh(e,0,0,3*Ph,2*Ph),n.setRenderTarget(e),n.render(r,Oh)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let e=1;eNh&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const f=[];let g=0;for(let t=0;t4?i-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(c,Oh)}},t.ParametricBufferGeometry=bo,t.ParametricGeometry=bo,t.Particle=function(t){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new Vs(t)},t.ParticleBasicMaterial=function(t){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new wa(t)},t.ParticleSystem=function(t,e){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new Ea(t,e)},t.ParticleSystemMaterial=function(t){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new wa(t)},t.Path=zl,t.PerspectiveCamera=$n,t.Plane=Be,t.PlaneBufferGeometry=ci,t.PlaneGeometry=ci,t.PlaneHelper=class extends ga{constructor(t,e=1,n=16776960){const i=n,r=new An;r.setAttribute("position",new fn([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),r.computeBoundingSphere(),super(r,new ha({color:i,toneMapped:!1})),this.type="PlaneHelper",this.plane=t,this.size=e;const s=new An;s.setAttribute("position",new fn([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),s.computeBoundingSphere(),this.add(new jn(s,new nn({color:i,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}updateMatrixWorld(t){let e=-this.plane.constant;Math.abs(e)<1e-8&&(e=1e-8),this.scale.set(.5*this.size,.5*this.size,e),this.children[0].material.side=e<0?1:0,this.lookAt(this.plane.normal),super.updateMatrixWorld(t)}},t.PointCloud=function(t,e){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new Ea(t,e)},t.PointCloudMaterial=function(t){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new wa(t)},t.PointLight=Jl,t.PointLightHelper=class extends jn{constructor(t,e,n){super(new To(e,4,2),new nn({wireframe:!0,fog:!1,toneMapped:!1})),this.light=t,this.light.updateMatrixWorld(),this.color=n,this.type="PointLightHelper",this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}dispose(){this.geometry.dispose(),this.material.dispose()}update(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)}},t.Points=Ea,t.PointsMaterial=wa,t.PolarGridHelper=class extends xa{constructor(t=10,e=16,n=8,i=64,r=4473924,s=8947848){r=new en(r),s=new en(s);const a=[],o=[];for(let n=0;n<=e;n++){const i=n/e*(2*Math.PI),l=Math.sin(i)*t,c=Math.cos(i)*t;a.push(0,0,0),a.push(l,0,c);const h=1&n?r:s;o.push(h.r,h.g,h.b),o.push(h.r,h.g,h.b)}for(let e=0;e<=n;e++){const l=1&e?r:s,c=t-t/n*e;for(let t=0;t8pM00Cm@ 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⪙|*JL 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

<7w?D1Ra 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�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

n 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 BVw?Z~ literal 0 HcmV?d00001 diff --git a/libthreejs/main.js b/libthreejs/main.js new file mode 100644 index 0000000..9bda096 --- /dev/null +++ b/libthreejs/main.js @@ -0,0 +1,6 @@ +/** + * @license + * Copyright 2010-2021 Three.js Authors + * SPDX-License-Identifier: MIT + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="129",n=100,i=300,r=301,s=302,a=303,o=304,l=306,c=307,h=1e3,u=1001,d=1002,p=1003,m=1004,f=1005,g=1006,v=1007,y=1008,x=1009,_=1012,w=1014,b=1015,M=1016,S=1020,T=1022,E=1023,A=1026,L=1027,R=33776,C=33777,P=33778,D=33779,I=35840,N=35841,B=35842,z=35843,F=37492,O=37496,H=2300,G=2301,U=2302,k=2400,V=2401,W=2402,j=2500,q=2501,X=3e3,Y=3001,Z=3007,J=3002,Q=3004,K=3005,$=3006,tt=7680,et=35044,nt=35048,it="300 es";class rt{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(void 0!==n){const t=n.indexOf(e);-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);for(let e=0,i=n.length;e>8&255]+st[t>>16&255]+st[t>>24&255]+"-"+st[255&e]+st[e>>8&255]+"-"+st[e>>16&15|64]+st[e>>24&255]+"-"+st[63&n|128]+st[n>>8&255]+"-"+st[n>>16&255]+st[n>>24&255]+st[255&i]+st[i>>8&255]+st[i>>16&255]+st[i>>24&255]).toUpperCase()}function ht(t,e,n){return Math.max(e,Math.min(n,t))}function ut(t,e){return(t%e+e)%e}function dt(t,e,n){return(1-n)*t+n*e}function pt(t){return 0==(t&t-1)&&0!==t}function mt(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ft(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}var gt=Object.freeze({__proto__:null,DEG2RAD:ot,RAD2DEG:lt,generateUUID:ct,clamp:ht,euclideanModulo:ut,mapLinear:function(t,e,n,i,r){return i+(t-e)*(r-i)/(n-e)},inverseLerp:function(t,e,n){return t!==e?(n-t)/(e-t):0},lerp:dt,damp:function(t,e,n,i){return dt(t,e,1-Math.exp(-n*i))},pingpong:function(t,e=1){return e-Math.abs(ut(t,2*e)-e)},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(at=t%2147483647),at=16807*at%2147483647,(at-1)/2147483646},degToRad:function(t){return t*ot},radToDeg:function(t){return t*lt},isPowerOfTwo:pt,ceilPowerOfTwo:mt,floorPowerOfTwo:ft,setQuaternionFromProperEuler:function(t,e,n,i,r){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),c=s((e+i)/2),h=a((e+i)/2),u=s((e-i)/2),d=a((e-i)/2),p=s((i-e)/2),m=a((i-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}});class vt{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6],this.y=i[1]*e+i[4]*n+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),i=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*n-s*i+t.x,this.y=r*i+s*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}}vt.prototype.isVector2=!0;class yt{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=i,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=n,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[3],o=n[6],l=n[1],c=n[4],h=n[7],u=n[2],d=n[5],p=n[8],m=i[0],f=i[3],g=i[6],v=i[1],y=i[4],x=i[7],_=i[2],w=i[5],b=i[8];return r[0]=s*m+a*v+o*_,r[3]=s*f+a*y+o*w,r[6]=s*g+a*x+o*b,r[1]=l*m+c*v+h*_,r[4]=l*f+c*y+h*w,r[7]=l*g+c*x+h*b,r[2]=u*m+d*v+p*_,r[5]=u*f+d*y+p*w,r[8]=u*g+d*x+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-n*r*c+n*a*o+i*r*l-i*s*o}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+n*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=h*m,t[1]=(i*l-c*n)*m,t[2]=(a*n-i*s)*m,t[3]=u*m,t[4]=(c*e-i*o)*m,t[5]=(i*r-a*e)*m,t[6]=d*m,t[7]=(n*o-l*e)*m,t[8]=(s*e-n*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,i,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(n*o,n*l,-n*(o*s+l*a)+s+t,-i*l,i*o,-i*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){const n=this.elements;return n[0]*=t,n[3]*=t,n[6]*=t,n[1]*=e,n[4]*=e,n[7]*=e,this}rotate(t){const e=Math.cos(t),n=Math.sin(t),i=this.elements,r=i[0],s=i[3],a=i[6],o=i[1],l=i[4],c=i[7];return i[0]=e*r+n*o,i[3]=e*s+n*l,i[6]=e*a+n*c,i[1]=-n*r+e*o,i[4]=-n*s+e*l,i[7]=-n*a+e*c,this}translate(t,e){const n=this.elements;return n[0]+=t*n[2],n[3]+=t*n[5],n[6]+=t*n[8],n[1]+=e*n[2],n[4]+=e*n[5],n[7]+=e*n[8],this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<9;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}let xt;yt.prototype.isMatrix3=!0;class _t{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===xt&&(xt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),xt.width=t.width,xt.height=t.height;const n=xt.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=xt}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}}let wt=0;class bt extends rt{constructor(t=bt.DEFAULT_IMAGE,e=bt.DEFAULT_MAPPING,n=1001,i=1001,r=1006,s=1008,a=1023,o=1009,l=1,c=3e3){super(),Object.defineProperty(this,"id",{value:wt++}),this.uuid=ct(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=n,this.wrapT=i,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=a,this.internalFormat=null,this.type=o,this.offset=new vt(0,0),this.repeat=new vt(1,1),this.center=new vt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new yt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.version=0,this.onUpdate=null}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const i=this.image;if(void 0===i.uuid&&(i.uuid=ct()),!e&&void 0===t.images[i.uuid]){let e;if(Array.isArray(i)){e=[];for(let t=0,n=i.length;t1)switch(this.wrapS){case h:t.x=t.x-Math.floor(t.x);break;case u:t.x=t.x<0?0:1;break;case d:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case h:t.y=t.y-Math.floor(t.y);break;case u:t.y=t.y<0?0:1;break;case d:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&this.version++}}function Mt(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?_t.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}bt.DEFAULT_IMAGE=void 0,bt.DEFAULT_MAPPING=i,bt.prototype.isTexture=!0;class St{constructor(t=0,e=0,n=0,i=1){this.x=t,this.y=e,this.z=n,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,i){return this.x=t,this.y=e,this.z=n,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*n+s[8]*i+s[12]*r,this.y=s[1]*e+s[5]*n+s[9]*i+s[13]*r,this.z=s[2]*e+s[6]*n+s[10]*i+s[14]*r,this.w=s[3]*e+s[7]*n+s[11]*i+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,i,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)o&&t>v?tv?o=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),s=Math.atan2(r,e*n);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*n;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,n,i,r,s){const a=n[i],o=n[i+1],l=n[i+2],c=n[i+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const n=t._x,i=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(n/2),c=a(i/2),h=a(r/2),u=o(n/2),d=o(i/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,i=Math.sin(n);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],i=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=n+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-i)*t}else if(n>a&&n>h){const t=2*Math.sqrt(1+n-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(i+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-n-h);this._w=(r-l)/t,this._x=(i+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-n-a);this._w=(s-i)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ht(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(0===n)return this;const i=Math.min(1,e/n);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,i=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=n*c+s*a+i*l-r*o,this._y=i*c+s*o+r*a-n*l,this._z=r*c+s*l+n*o-i*a,this._w=s*c-n*a-i*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const n=this._x,i=this._y,r=this._z,s=this._w;let a=s*t._w+n*t._x+i*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=n,this._y=i,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*n+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=n*h+this._x*u,this._y=i*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,n){this.copy(t).slerp(e,n)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}Lt.prototype.isQuaternion=!0;class Rt{constructor(t=0,e=0,n=0){this.x=t,this.y=e,this.z=n}set(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Pt.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Pt.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*i,this.y=r[1]*e+r[4]*n+r[7]*i,this.z=r[2]*e+r[5]*n+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=t.elements,s=1/(r[3]*e+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*i+r[12])*s,this.y=(r[1]*e+r[5]*n+r[9]*i+r[13])*s,this.z=(r[2]*e+r[6]*n+r[10]*i+r[14])*s,this}applyQuaternion(t){const e=this.x,n=this.y,i=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*i-a*n,c=o*n+a*e-r*i,h=o*i+r*n-s*e,u=-r*e-s*n-a*i;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*i,this.y=r[1]*e+r[5]*n+r[9]*i,this.z=r[2]*e+r[6]*n+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,i=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=i*o-r*a,this.y=r*s-n*o,this.z=n*a-i*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Ct.copy(this).projectOnVector(t),this.sub(Ct)}reflect(t){return this.sub(Ct.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(ht(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,i=this.z-t.z;return e*e+n*n+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const i=Math.sin(e)*t;return this.x=i*Math.sin(n),this.y=Math.cos(e)*t,this.z=i*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}}Rt.prototype.isVector3=!0;const Ct=new Rt,Pt=new Lt;class Dt{constructor(t=new Rt(1/0,1/0,1/0),e=new Rt(-1/0,-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;or&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Rt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Nt),Nt.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(kt),Vt.subVectors(this.max,kt),zt.subVectors(t.a,kt),Ft.subVectors(t.b,kt),Ot.subVectors(t.c,kt),Ht.subVectors(Ft,zt),Gt.subVectors(Ot,Ft),Ut.subVectors(zt,Ot);let e=[0,-Ht.z,Ht.y,0,-Gt.z,Gt.y,0,-Ut.z,Ut.y,Ht.z,0,-Ht.x,Gt.z,0,-Gt.x,Ut.z,0,-Ut.x,-Ht.y,Ht.x,0,-Gt.y,Gt.x,0,-Ut.y,Ut.x,0];return!!qt(e,zt,Ft,Ot,Vt)&&(e=[1,0,0,0,1,0,0,0,1],!!qt(e,zt,Ft,Ot,Vt)&&(Wt.crossVectors(Ht,Gt),e=[Wt.x,Wt.y,Wt.z],qt(e,zt,Ft,Ot,Vt)))}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Rt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return Nt.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(Nt).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(It[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),It[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),It[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),It[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),It[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),It[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),It[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),It[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(It)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}Dt.prototype.isBox3=!0;const It=[new Rt,new Rt,new Rt,new Rt,new Rt,new Rt,new Rt,new Rt],Nt=new Rt,Bt=new Dt,zt=new Rt,Ft=new Rt,Ot=new Rt,Ht=new Rt,Gt=new Rt,Ut=new Rt,kt=new Rt,Vt=new Rt,Wt=new Rt,jt=new Rt;function qt(t,e,n,i,r){for(let s=0,a=t.length-3;s<=a;s+=3){jt.fromArray(t,s);const a=r.x*Math.abs(jt.x)+r.y*Math.abs(jt.y)+r.z*Math.abs(jt.z),o=e.dot(jt),l=n.dot(jt),c=i.dot(jt);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const Xt=new Dt,Yt=new Rt,Zt=new Rt,Jt=new Rt;class Qt{constructor(t=new Rt,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;void 0!==e?n.copy(e):Xt.setFromPoints(t).getCenter(n);let i=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Dt),this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){Jt.subVectors(t,this.center);const e=Jt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),n=.5*(t-this.radius);this.center.add(Jt.multiplyScalar(n/t)),this.radius+=n}return this}union(t){return Zt.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(Yt.copy(t.center).add(Zt)),this.expandByPoint(Yt.copy(t.center).sub(Zt)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Kt=new Rt,$t=new Rt,te=new Rt,ee=new Rt,ne=new Rt,ie=new Rt,re=new Rt;class se{constructor(t=new Rt,e=new Rt(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Rt),e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Kt)),this}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Rt),e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Kt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Kt.copy(this.direction).multiplyScalar(e).add(this.origin),Kt.distanceToSquared(t))}distanceSqToSegment(t,e,n,i){$t.copy(t).add(e).multiplyScalar(.5),te.copy(e).sub(t).normalize(),ee.copy(this.origin).sub($t);const r=.5*t.distanceTo(e),s=-this.direction.dot(te),a=ee.dot(this.direction),o=-ee.dot(te),l=ee.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return n&&n.copy(this.direction).multiplyScalar(h).add(this.origin),i&&i.copy(te).multiplyScalar(u).add($t),d}intersectSphere(t,e){Kt.subVectors(t.center,this.origin);const n=Kt.dot(this.direction),i=Kt.dot(Kt)-n*n,r=t.radius*t.radius;if(i>r)return null;const s=Math.sqrt(r-i),a=n-s,o=n+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return null===n?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,i,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(n=(t.min.x-u.x)*l,i=(t.max.x-u.x)*l):(n=(t.max.x-u.x)*l,i=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),n>s||r>i?null:((r>n||n!=n)&&(n=r),(s=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),n>o||a>i?null:((a>n||n!=n)&&(n=a),(o=0?n:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,Kt)}intersectTriangle(t,e,n,i,r){ne.subVectors(e,t),ie.subVectors(n,t),re.crossVectors(ne,ie);let s,a=this.direction.dot(re);if(a>0){if(i)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}ee.subVectors(this.origin,t);const o=s*this.direction.dot(ie.crossVectors(ee,ie));if(o<0)return null;const l=s*this.direction.dot(ne.cross(ee));if(l<0)return null;if(o+l>a)return null;const c=-s*ee.dot(re);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ae{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l,c,h,u,d,p,m,f){const g=this.elements;return g[0]=t,g[4]=e,g[8]=n,g[12]=i,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ae).fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,i=1/oe.setFromMatrixColumn(t,0).length(),r=1/oe.setFromMatrixColumn(t,1).length(),s=1/oe.setFromMatrixColumn(t,2).length();return e[0]=n[0]*i,e[1]=n[1]*i,e[2]=n[2]*i,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*s,e[9]=n[9]*s,e[10]=n[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,n=t.x,i=t.y,r=t.z,s=Math.cos(n),a=Math.sin(n),o=Math.cos(i),l=Math.sin(i),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=n+i*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=i+n*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,n=o*h,i=l*c,r=l*h;e[0]=t+r*a,e[4]=i*a-n,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=n*a-i,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,n=o*h,i=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=i+n*a,e[1]=n+i*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=i*l-n,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=n*l-i,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=i*h+n,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=n*h+i,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=n*h-i,e[2]=i*h-n,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(ce,t,he)}lookAt(t,e,n){const i=this.elements;return pe.subVectors(t,e),0===pe.lengthSq()&&(pe.z=1),pe.normalize(),ue.crossVectors(n,pe),0===ue.lengthSq()&&(1===Math.abs(n.z)?pe.x+=1e-4:pe.z+=1e-4,pe.normalize(),ue.crossVectors(n,pe)),ue.normalize(),de.crossVectors(pe,ue),i[0]=ue.x,i[4]=de.x,i[8]=pe.x,i[1]=ue.y,i[5]=de.y,i[9]=pe.y,i[2]=ue.z,i[6]=de.z,i[10]=pe.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[4],o=n[8],l=n[12],c=n[1],h=n[5],u=n[9],d=n[13],p=n[2],m=n[6],f=n[10],g=n[14],v=n[3],y=n[7],x=n[11],_=n[15],w=i[0],b=i[4],M=i[8],S=i[12],T=i[1],E=i[5],A=i[9],L=i[13],R=i[2],C=i[6],P=i[10],D=i[14],I=i[3],N=i[7],B=i[11],z=i[15];return r[0]=s*w+a*T+o*R+l*I,r[4]=s*b+a*E+o*C+l*N,r[8]=s*M+a*A+o*P+l*B,r[12]=s*S+a*L+o*D+l*z,r[1]=c*w+h*T+u*R+d*I,r[5]=c*b+h*E+u*C+d*N,r[9]=c*M+h*A+u*P+d*B,r[13]=c*S+h*L+u*D+d*z,r[2]=p*w+m*T+f*R+g*I,r[6]=p*b+m*E+f*C+g*N,r[10]=p*M+m*A+f*P+g*B,r[14]=p*S+m*L+f*D+g*z,r[3]=v*w+y*T+x*R+_*I,r[7]=v*b+y*E+x*C+_*N,r[11]=v*M+y*A+x*P+_*B,r[15]=v*S+y*L+x*D+_*z,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],i=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-i*l*h-r*a*u+n*l*u+i*a*d-n*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-i*s*d+i*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+n*s*d+r*a*c-n*l*c)+t[15]*(-i*a*c-e*o*h+e*a*u+i*s*h-n*s*u+n*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,y=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,x=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,_=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,w=e*v+n*y+i*x+r*_;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/w;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*i*d+n*f*d+h*i*g-n*u*g)*b,t[2]=(a*f*r-m*o*r+m*i*l-n*f*l-a*i*g+n*o*g)*b,t[3]=(h*o*r-a*u*r-h*i*l+n*u*l+a*i*d-n*o*d)*b,t[4]=y*b,t[5]=(c*f*r-p*u*r+p*i*d-e*f*d-c*i*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*i*l+e*f*l+s*i*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*i*l-e*u*l-s*i*d+e*o*d)*b,t[8]=x*b,t[9]=(p*h*r-c*m*r-p*n*d+e*m*d+c*n*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*n*l-e*m*l-s*n*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*n*l+e*h*l+s*n*d-e*a*d)*b,t[12]=_*b,t[13]=(c*m*i-p*h*i+p*n*u-e*m*u-c*n*f+e*h*f)*b,t[14]=(p*a*i-s*m*i-p*n*o+e*m*o+s*n*f-e*a*f)*b,t[15]=(s*h*i-c*a*i+c*n*o-e*h*o-s*n*u+e*a*u)*b,this}scale(t){const e=this.elements,n=t.x,i=t.y,r=t.z;return e[0]*=n,e[4]*=i,e[8]*=r,e[1]*=n,e[5]*=i,e[9]*=r,e[2]*=n,e[6]*=i,e[10]*=r,e[3]*=n,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,i))}makeTranslation(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),i=Math.sin(e),r=1-n,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+n,l*a-i*o,l*o+i*a,0,l*a+i*o,c*a+n,c*o-i*s,0,l*o-i*a,c*o+i*s,r*o*o+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,i,r,s){return this.set(1,n,r,0,t,1,s,0,e,i,1,0,0,0,0,1),this}compose(t,e,n){const i=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,y=o*c,x=o*h,_=n.x,w=n.y,b=n.z;return i[0]=(1-(m+g))*_,i[1]=(d+x)*_,i[2]=(p-y)*_,i[3]=0,i[4]=(d-x)*w,i[5]=(1-(u+g))*w,i[6]=(f+v)*w,i[7]=0,i[8]=(p+y)*b,i[9]=(f-v)*b,i[10]=(1-(u+m))*b,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,n){const i=this.elements;let r=oe.set(i[0],i[1],i[2]).length();const s=oe.set(i[4],i[5],i[6]).length(),a=oe.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],le.copy(this);const o=1/r,l=1/s,c=1/a;return le.elements[0]*=o,le.elements[1]*=o,le.elements[2]*=o,le.elements[4]*=l,le.elements[5]*=l,le.elements[6]*=l,le.elements[8]*=c,le.elements[9]*=c,le.elements[10]*=c,e.setFromRotationMatrix(le),n.x=r,n.y=s,n.z=a,this}makePerspective(t,e,n,i,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const a=this.elements,o=2*r/(e-t),l=2*r/(n-i),c=(e+t)/(e-t),h=(n+i)/(n-i),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,n,i,r,s){const a=this.elements,o=1/(e-t),l=1/(n-i),c=1/(s-r),h=(e+t)*o,u=(n+i)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<16;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}ae.prototype.isMatrix4=!0;const oe=new Rt,le=new ae,ce=new Rt(0,0,0),he=new Rt(1,1,1),ue=new Rt,de=new Rt,pe=new Rt,me=new ae,fe=new Lt;class ge{constructor(t=0,e=0,n=0,i=ge.DefaultOrder){this._x=t,this._y=e,this._z=n,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._order=i||this._order,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e,n){const i=t.elements,r=i[0],s=i[4],a=i[8],o=i[1],l=i[5],c=i[9],h=i[2],u=i[6],d=i[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(ht(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-ht(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(ht(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ht(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(ht(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ht(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==n&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return me.makeRotationFromQuaternion(t),this.setFromRotationMatrix(me,e,n)}setFromVector3(t,e){return this.set(t.x,t.y,t.z,e||this._order)}reorder(t){return fe.setFromEuler(this),this.setFromQuaternion(fe,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new Rt(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}ge.prototype.isEuler=!0,ge.DefaultOrder="XYZ",ge.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class ve{constructor(){this.mask=1}set(t){this.mask=1<1){for(let t=0;t1){for(let t=0;t0){i.children=[];for(let e=0;e0){i.animations=[];for(let e=0;e0&&(n.geometries=e),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),a.length>0&&(n.images=a),o.length>0&&(n.shapes=o),l.length>0&&(n.skeletons=l),c.length>0&&(n.animations=c)}return n.object=i,n;function s(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e1?null:e.copy(n).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Rt),t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Ne.getNormalMatrix(t),i=this.coplanarPoint(De).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}Be.prototype.isPlane=!0;const ze=new Rt,Fe=new Rt,Oe=new Rt,He=new Rt,Ge=new Rt,Ue=new Rt,ke=new Rt,Ve=new Rt,We=new Rt,je=new Rt;class qe{constructor(t=new Rt,e=new Rt,n=new Rt){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,i){void 0===i&&(console.warn("THREE.Triangle: .getNormal() target is now required"),i=new Rt),i.subVectors(n,e),ze.subVectors(t,e),i.cross(ze);const r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,n,i,r){ze.subVectors(i,e),Fe.subVectors(n,e),Oe.subVectors(t,e);const s=ze.dot(ze),a=ze.dot(Fe),o=ze.dot(Oe),l=Fe.dot(Fe),c=Fe.dot(Oe),h=s*l-a*a;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new Rt),0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,n,i){return this.getBarycoord(t,e,n,i,He),He.x>=0&&He.y>=0&&He.x+He.y<=1}static getUV(t,e,n,i,r,s,a,o){return this.getBarycoord(t,e,n,i,He),o.set(0,0),o.addScaledVector(r,He.x),o.addScaledVector(s,He.y),o.addScaledVector(a,He.z),o}static isFrontFacing(t,e,n,i){return ze.subVectors(n,e),Fe.subVectors(t,e),ze.cross(Fe).dot(i)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,i){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[i]),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return ze.subVectors(this.c,this.b),Fe.subVectors(this.a,this.b),.5*ze.cross(Fe).length()}getMidpoint(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Rt),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return qe.getNormal(this.a,this.b,this.c,t)}getPlane(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new Be),t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return qe.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,i,r){return qe.getUV(t,this.a,this.b,this.c,e,n,i,r)}containsPoint(t){return qe.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return qe.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Rt);const n=this.a,i=this.b,r=this.c;let s,a;Ge.subVectors(i,n),Ue.subVectors(r,n),Ve.subVectors(t,n);const o=Ge.dot(Ve),l=Ue.dot(Ve);if(o<=0&&l<=0)return e.copy(n);We.subVectors(t,i);const c=Ge.dot(We),h=Ue.dot(We);if(c>=0&&h<=c)return e.copy(i);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(n).addScaledVector(Ge,s);je.subVectors(t,r);const d=Ge.dot(je),p=Ue.dot(je);if(p>=0&&d<=p)return e.copy(r);const m=d*l-o*p;if(m<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(n).addScaledVector(Ue,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return ke.subVectors(r,i),a=(h-c)/(h-c+(d-p)),e.copy(i).addScaledVector(ke,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(n).addScaledVector(Ge,s).addScaledVector(Ue,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let Xe=0;class Ye extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:Xe++}),this.uuid=ct(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=n,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=tt,this.stencilZFail=tt,this.stencilZPass=tt,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}onBuild(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const n=t[e];if(void 0===n){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[e]=n:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(n.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&(n.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(n.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(n.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(n.textures=e),r.length>0&&(n.images=r)}return n}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(null!==e){const t=e.length;n=new Array(t);for(let i=0;i!==t;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}Ye.prototype.isMaterial=!0;const Ze={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Je={h:0,s:0,l:0},Qe={h:0,s:0,l:0};function Ke(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}function $e(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function tn(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class en{constructor(t,e,n){return void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,n){return this.r=t,this.g=e,this.b=n,this}setHSL(t,e,n){if(t=ut(t,1),e=ht(e,0,1),n=ht(n,0,1),0===e)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+e):n+e-n*e,r=2*n-i;this.r=Ke(r,i,t+1/3),this.g=Ke(r,i,t),this.b=Ke(r,i,t-1/3)}return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const i=n[1],r=n[2];switch(i){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const n=parseFloat(t[1])/360,i=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(n,i,r)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=n[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=Ze[t.toLowerCase()];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const n=e>0?1/e:1;return this.r=Math.pow(t.r,n),this.g=Math.pow(t.g,n),this.b=Math.pow(t.b,n),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=$e(t.r),this.g=$e(t.g),this.b=$e(t.b),this}copyLinearToSRGB(t){return this.r=tn(t.r),this.g=tn(t.g),this.b=tn(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});const e=this.r,n=this.g,i=this.b,r=Math.max(e,n,i),s=Math.min(e,n,i);let a,o;const l=(s+r)/2;if(s===r)a=0,o=0;else{const t=r-s;switch(o=l<=.5?t/(r+s):t/(2-r-s),r){case e:a=(n-i)/t+(ne&&(e=t[n]);return e}const yn={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function xn(t,e){return new yn[t](e)}let _n=0;const wn=new ae,bn=new Pe,Mn=new Rt,Sn=new Dt,Tn=new Dt,En=new Rt;class An extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:_n++}),this.uuid=ct(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(vn(t)>65535?pn:un)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,n=0){this.groups.push({start:t,count:e,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const n=this.attributes.normal;if(void 0!==n){const e=(new yt).getNormalMatrix(t);n.applyNormalMatrix(e),n.needsUpdate=!0}const i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(t),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(t){return wn.makeRotationFromQuaternion(t),this.applyMatrix4(wn),this}rotateX(t){return wn.makeRotationX(t),this.applyMatrix4(wn),this}rotateY(t){return wn.makeRotationY(t),this.applyMatrix4(wn),this}rotateZ(t){return wn.makeRotationZ(t),this.applyMatrix4(wn),this}translate(t,e,n){return wn.makeTranslation(t,e,n),this.applyMatrix4(wn),this}scale(t,e,n){return wn.makeScale(t,e,n),this.applyMatrix4(wn),this}lookAt(t){return bn.lookAt(t),bn.updateMatrix(),this.applyMatrix4(bn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Mn).negate(),this.translate(Mn.x,Mn.y,Mn.z),this}setFromPoints(t){const e=[];for(let n=0,i=t.length;n0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const e in n){const i=n[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const n=this.morphAttributes[e],s=[];for(let e=0,i=n.length;e0&&(i[e]=s,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new An).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;null!==n&&this.setIndex(n.clone(e));const i=t.attributes;for(const t in i){const n=i[t];this.setAttribute(t,n.clone(e))}const r=t.morphAttributes;for(const t in r){const n=[],i=r[t];for(let t=0,r=i.length;t0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(t,e){const n=this.geometry,i=this.material,r=this.matrixWorld;if(void 0===i)return;if(null===n.boundingSphere&&n.computeBoundingSphere(),Cn.copy(n.boundingSphere),Cn.applyMatrix4(r),!1===t.ray.intersectsSphere(Cn))return;if(Ln.copy(r).invert(),Rn.copy(t.ray).applyMatrix4(Ln),null!==n.boundingBox&&!1===Rn.intersectsBox(n.boundingBox))return;let s;if(n.isBufferGeometry){const r=n.index,a=n.attributes.position,o=n.morphAttributes.position,l=n.morphTargetsRelative,c=n.attributes.uv,h=n.attributes.uv2,u=n.groups,d=n.drawRange;if(null!==r)if(Array.isArray(i))for(let n=0,p=u.length;nn.far?null:{distance:c,point:Wn.clone(),object:t}}(t,e,n,i,Pn,Dn,In,Vn);if(p){o&&(Gn.fromBufferAttribute(o,c),Un.fromBufferAttribute(o,h),kn.fromBufferAttribute(o,u),p.uv=qe.getUV(Vn,Pn,Dn,In,Gn,Un,kn,new vt)),l&&(Gn.fromBufferAttribute(l,c),Un.fromBufferAttribute(l,h),kn.fromBufferAttribute(l,u),p.uv2=qe.getUV(Vn,Pn,Dn,In,Gn,Un,kn,new vt));const t={a:c,b:h,c:u,normal:new Rt,materialIndex:0};qe.getNormal(Pn,Dn,In,t.normal),p.face=t}return p}jn.prototype.isMesh=!0;class Xn extends An{constructor(t=1,e=1,n=1,i=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:i,heightSegments:r,depthSegments:s};const a=this;i=Math.floor(i),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,n,i,r,s,p,m,f,g,v){const y=s/f,x=p/g,_=s/2,w=p/2,b=m/2,M=f+1,S=g+1;let T=0,E=0;const A=new Rt;for(let s=0;s0?1:-1,c.push(A.x,A.y,A.z),h.push(o/f),h.push(1-s/g),T+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const n={};for(const t in this.extensions)!0===this.extensions[t]&&(n[t]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}Qn.prototype.isShaderMaterial=!0;class Kn extends Pe{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new ae,this.projectionMatrix=new ae,this.projectionMatrixInverse=new ae}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Rt),this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}Kn.prototype.isCamera=!0;class $n extends Kn{constructor(t=50,e=1,n=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*lt*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ot*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*lt*Math.atan(Math.tan(.5*ot*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,i,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ot*this.fov)/this.zoom,n=2*e,i=this.aspect*n,r=-.5*i;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*i/t,e-=s.offsetY*n/a,i*=s.width/t,n*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}$n.prototype.isPerspectiveCamera=!0;const ti=90;class ei extends Pe{constructor(t,e,n){if(super(),this.type="CubeCamera",!0!==n.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=n;const i=new $n(ti,1,t,e);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new Rt(1,0,0)),this.add(i);const r=new $n(ti,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Rt(-1,0,0)),this.add(r);const s=new $n(ti,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Rt(0,1,0)),this.add(s);const a=new $n(ti,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Rt(0,-1,0)),this.add(a);const o=new $n(ti,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Rt(0,0,1)),this.add(o);const l=new $n(ti,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new Rt(0,0,-1)),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const n=this.renderTarget,[i,r,s,a,o,l]=this.children,c=t.xr.enabled,h=t.getRenderTarget();t.xr.enabled=!1;const u=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,i),t.setRenderTarget(n,1),t.render(e,r),t.setRenderTarget(n,2),t.render(e,s),t.setRenderTarget(n,3),t.render(e,a),t.setRenderTarget(n,4),t.render(e,o),n.texture.generateMipmaps=u,t.setRenderTarget(n,5),t.render(e,l),t.setRenderTarget(h),t.xr.enabled=c}}class ni extends bt{constructor(t,e,n,i,s,a,o,l,c,h){super(t=void 0!==t?t:[],e=void 0!==e?e:r,n,i,s,a,o=void 0!==o?o:T,l,c,h),this._needsFlipEnvMap=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}ni.prototype.isCubeTexture=!0;class ii extends Tt{constructor(t,e,n){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=n),super(t,t,e),e=e||{},this.texture=new ni(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:g,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=E,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new Xn(5,5,5),r=new Qn({name:"CubemapFromEquirect",uniforms:Yn(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new jn(i,r),a=e.minFilter;e.minFilter===y&&(e.minFilter=g);return new ei(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,n,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,n,i);t.setRenderTarget(r)}}ii.prototype.isWebGLCubeRenderTarget=!0;const ri=new Qt,si=new Rt;class ai{constructor(t=new Be,e=new Be,n=new Be,i=new Be,r=new Be,s=new Be){this.planes=[t,e,n,i,r,s]}set(t,e,n,i,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(n),a[3].copy(i),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t){const e=this.planes,n=t.elements,i=n[0],r=n[1],s=n[2],a=n[3],o=n[4],l=n[5],c=n[6],h=n[7],u=n[8],d=n[9],p=n[10],m=n[11],f=n[12],g=n[13],v=n[14],y=n[15];return e[0].setComponents(a-i,h-o,m-u,y-f).normalize(),e[1].setComponents(a+i,h+o,m+u,y+f).normalize(),e[2].setComponents(a+r,h+l,m+d,y+g).normalize(),e[3].setComponents(a-r,h-l,m-d,y-g).normalize(),e[4].setComponents(a-s,h-c,m-p,y-v).normalize(),e[5].setComponents(a+s,h+c,m+p,y+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),ri.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSprite(t){return ri.center.set(0,0,0),ri.radius=.7071067811865476,ri.applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSphere(t){const e=this.planes,n=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(n)0?t.max.x:t.min.x,si.y=i.normal.y>0?t.max.y:t.min.y,si.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(si)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function oi(){let t=null,e=!1,n=null,i=null;function r(e,s){n(e,s),i=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==n&&(i=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(i),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function li(t,e){const n=e.isWebGL2,i=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),i.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const n=i.get(e);n&&(t.deleteBuffer(n.buffer),i.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=i.get(e);return void((!t||t.version 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), rawDiffuseColor, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), rawDiffuseColor, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSNMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition.xyz / vWorldPosition.w;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\tfloat ior = ( 1.0 + 0.4 * reflectivity ) / ( 1.0 - 0.4 * reflectivity );\n\tvec3 f0 = vec3( pow( ior - 1.0, 2.0 ) / pow( ior + 1.0, 2.0 ) );\n\tvec3 f90 = vec3( 1.0 );\n\tvec3 f_transmission = totalTransmission * getIBLVolumeRefraction(\n\t\tnormal, v, viewDir, roughnessFactor, diffuseColor.rgb, f0, f90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance);\n\tdiffuseColor.rgb = mix( diffuseColor.rgb, f_transmission, totalTransmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec4 vWorldPosition;\n\tvec3 getVolumeTransmissionRay(vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix) {\n\t\tvec3 refractionVector = refract(-v, normalize(n), 1.0 / ior);\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length(vec3(modelMatrix[0].xyz));\n\t\tmodelScale.y = length(vec3(modelMatrix[1].xyz));\n\t\tmodelScale.z = length(vec3(modelMatrix[2].xyz));\n\t\treturn normalize(refractionVector) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness(float roughness, float ior) {\n\t\treturn roughness * clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n\t}\n\tvec3 getTransmissionSample(vec2 fragCoord, float roughness, float ior) {\n\t\tfloat framebufferLod = log2(transmissionSamplerSize.x) * applyIorToRoughness(roughness, ior);\n\t\treturn texture2DLodEXT(transmissionSamplerMap, fragCoord.xy, framebufferLod).rgb;\n\t}\n\tvec3 applyVolumeAttenuation(vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance) {\n\t\tif (attenuationDistance == 0.0) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log(attenuationColor) / attenuationDistance;\n\t\t\tvec3 transmittance = exp(-attenuationCoefficient * transmissionDistance);\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec3 getIBLVolumeRefraction(vec3 n, vec3 v, vec3 viewDir, float perceptualRoughness, vec3 baseColor, vec3 f0, vec3 f90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness, vec3 attenuationColor, float attenuationDistance) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, ior, modelMatrix);\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0);\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec3 transmittedLight = getTransmissionSample(refractionCoords, perceptualRoughness, ior);\n\t\tvec3 attenuatedColor = applyVolumeAttenuation(transmittedLight, length(transmissionRay), attenuationColor, attenuationDistance);\n\t\tfloat NdotV = saturate(dot(n, viewDir));\n\t\tvec2 brdf = integrateSpecularBRDF(NdotV, perceptualRoughness);\n\t\tvec3 specularColor = f0 * brdf.x + f90 * brdf.y;\n\t\treturn (1.0 - specularColor) * attenuatedColor * baseColor;\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform vec3 attenuationColor;\n\tuniform float attenuationDistance;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef USE_TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t\tfloat thicknessFactor = thickness;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 rawDiffuseColor = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#ifdef USE_TRANSMISSION\n\tvarying vec4 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition;\n#endif\n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},ui={common:{diffuse:{value:new en(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new yt},uv2Transform:{value:new yt},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new vt(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new en(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new en(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}},sprite:{diffuse:{value:new en(16777215)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}}},di={basic:{uniforms:Zn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.fog]),vertexShader:hi.meshbasic_vert,fragmentShader:hi.meshbasic_frag},lambert:{uniforms:Zn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.fog,ui.lights,{emissive:{value:new en(0)}}]),vertexShader:hi.meshlambert_vert,fragmentShader:hi.meshlambert_frag},phong:{uniforms:Zn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,ui.lights,{emissive:{value:new en(0)},specular:{value:new en(1118481)},shininess:{value:30}}]),vertexShader:hi.meshphong_vert,fragmentShader:hi.meshphong_frag},standard:{uniforms:Zn([ui.common,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.roughnessmap,ui.metalnessmap,ui.fog,ui.lights,{emissive:{value:new en(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:hi.meshphysical_vert,fragmentShader:hi.meshphysical_frag},toon:{uniforms:Zn([ui.common,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.gradientmap,ui.fog,ui.lights,{emissive:{value:new en(0)}}]),vertexShader:hi.meshtoon_vert,fragmentShader:hi.meshtoon_frag},matcap:{uniforms:Zn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,{matcap:{value:null}}]),vertexShader:hi.meshmatcap_vert,fragmentShader:hi.meshmatcap_frag},points:{uniforms:Zn([ui.points,ui.fog]),vertexShader:hi.points_vert,fragmentShader:hi.points_frag},dashed:{uniforms:Zn([ui.common,ui.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:hi.linedashed_vert,fragmentShader:hi.linedashed_frag},depth:{uniforms:Zn([ui.common,ui.displacementmap]),vertexShader:hi.depth_vert,fragmentShader:hi.depth_frag},normal:{uniforms:Zn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,{opacity:{value:1}}]),vertexShader:hi.normal_vert,fragmentShader:hi.normal_frag},sprite:{uniforms:Zn([ui.sprite,ui.fog]),vertexShader:hi.sprite_vert,fragmentShader:hi.sprite_frag},background:{uniforms:{uvTransform:{value:new yt},t2D:{value:null}},vertexShader:hi.background_vert,fragmentShader:hi.background_frag},cube:{uniforms:Zn([ui.envmap,{opacity:{value:1}}]),vertexShader:hi.cube_vert,fragmentShader:hi.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:hi.equirect_vert,fragmentShader:hi.equirect_frag},distanceRGBA:{uniforms:Zn([ui.common,ui.displacementmap,{referencePosition:{value:new Rt},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:hi.distanceRGBA_vert,fragmentShader:hi.distanceRGBA_frag},shadow:{uniforms:Zn([ui.lights,ui.fog,{color:{value:new en(0)},opacity:{value:1}}]),vertexShader:hi.shadow_vert,fragmentShader:hi.shadow_frag}};function pi(t,e,n,i,r){const s=new en(0);let a,o,c=0,h=null,u=0,d=null;function p(t,e){n.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),c=e,p(s,c)},getClearAlpha:function(){return c},setClearAlpha:function(t){c=t,p(s,c)},render:function(n,r){let m=!1,f=!0===r.isScene?r.background:null;f&&f.isTexture&&(f=e.get(f));const g=t.xr,v=g.getSession&&g.getSession();v&&"additive"===v.environmentBlendMode&&(f=null),null===f?p(s,c):f&&f.isColor&&(p(f,1),m=!0),(t.autoClear||m)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),f&&(f.isCubeTexture||f.mapping===l)?(void 0===o&&(o=new jn(new Xn(1,1,1),new Qn({name:"BackgroundCubeMaterial",uniforms:Yn(di.cube.uniforms),vertexShader:di.cube.vertexShader,fragmentShader:di.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(o)),o.material.uniforms.envMap.value=f,o.material.uniforms.flipEnvMap.value=f.isCubeTexture&&f._needsFlipEnvMap?-1:1,h===f&&u===f.version&&d===t.toneMapping||(o.material.needsUpdate=!0,h=f,u=f.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null)):f&&f.isTexture&&(void 0===a&&(a=new jn(new ci(2,2),new Qn({name:"BackgroundMaterial",uniforms:Yn(di.background.uniforms),vertexShader:di.background.vertexShader,fragmentShader:di.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(a)),a.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),a.material.uniforms.uvTransform.value.copy(f.matrix),h===f&&u===f.version&&d===t.toneMapping||(a.material.needsUpdate=!0,h=f,u=f.version,d=t.toneMapping),n.unshift(a,a.geometry,a.material,0,0,null))}}}function mi(t,e,n,i){const r=t.getParameter(34921),s=i.isWebGL2?null:e.get("OES_vertex_array_object"),a=i.isWebGL2||null!==s,o={},l=d(null);let c=l;function h(e){return i.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return i.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],n=[],i=[];for(let t=0;t=0){const s=l[e];if(void 0!==s){const e=s.normalized,r=s.itemSize,a=n.get(s);if(void 0===a)continue;const l=a.buffer,c=a.type,h=a.bytesPerElement;if(s.isInterleavedBufferAttribute){const n=s.data,a=n.stride,u=s.offset;n&&n.isInstancedInterleavedBuffer?(f(i,n.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=n.meshPerAttribute*n.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,a*h,u*h)}else s.isInstancedBufferAttribute?(f(i,s.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,0,0)}else if("instanceMatrix"===e){const e=n.get(r.instanceMatrix);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i+0,1),f(i+1,1),f(i+2,1),f(i+3,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i+0,4,a,!1,64,0),t.vertexAttribPointer(i+1,4,a,!1,64,16),t.vertexAttribPointer(i+2,4,a,!1,64,32),t.vertexAttribPointer(i+3,4,a,!1,64,48)}else if("instanceColor"===e){const e=n.get(r.instanceColor);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i,3,a,!1,12,0)}else if(void 0!==h){const n=h[e];if(void 0!==n)switch(n.length){case 2:t.vertexAttrib2fv(i,n);break;case 3:t.vertexAttrib3fv(i,n);break;case 4:t.vertexAttrib4fv(i,n);break;default:t.vertexAttrib1fv(i,n)}}}}g()}(r,l,u,y),null!==x&&t.bindBuffer(34963,n.get(x).buffer))},reset:y,resetDefaultState:x,dispose:function(){y();for(const t in o){const e=o[t];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t]}},releaseStatesOfGeometry:function(t){if(void 0===o[t.id])return;const e=o[t.id];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t.id]},releaseStatesOfProgram:function(t){for(const e in o){const n=o[e];if(void 0===n[t.id])continue;const i=n[t.id];for(const t in i)u(i[t].object),delete i[t];delete n[t.id]}},initAttributes:p,enableAttribute:m,disableUnusedAttributes:g}}function fi(t,e,n,i){const r=i.isWebGL2;let s;this.setMode=function(t){s=t},this.render=function(e,i){t.drawArrays(s,e,i),n.update(i,s,1)},this.renderInstances=function(i,a,o){if(0===o)return;let l,c;if(r)l=t,c="drawArraysInstanced";else if(l=e.get("ANGLE_instanced_arrays"),c="drawArraysInstancedANGLE",null===l)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[c](s,i,a,o),n.update(a,s,o)}}function gi(t,e,n){let i;function r(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==n.precision?n.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||e.has("WEBGL_draw_buffers"),c=!0===n.logarithmicDepthBuffer,h=t.getParameter(34930),u=t.getParameter(35660),d=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),f=t.getParameter(36347),g=t.getParameter(36348),v=t.getParameter(36349),y=u>0,x=s||e.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===e.has("EXT_texture_filter_anisotropic")){const n=e.get("EXT_texture_filter_anisotropic");i=t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:v,vertexTextures:y,floatFragmentTextures:x,floatVertexTextures:y&&x,maxSamples:s?t.getParameter(36183):0}}function vi(t){const e=this;let n=null,i=0,r=!1,s=!1;const a=new Be,o=new yt,l={value:null,needsUpdate:!1};function c(){l.value!==n&&(l.value=n,l.needsUpdate=i>0),e.numPlanes=i,e.numIntersection=0}function h(t,n,i,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=i+4*s,r=n.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0){const a=t.getRenderTarget(),o=new ii(s.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),t.setRenderTarget(a),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}function xi(t){const e={};function n(n){if(void 0!==e[n])return e[n];let i;switch(n){case"WEBGL_depth_texture":i=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":i=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":i=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":i=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:i=t.getExtension(n)}return e[n]=i,i}return{has:function(t){return null!==n(t)},init:function(t){t.isWebGL2?n("EXT_color_buffer_float"):(n("WEBGL_depth_texture"),n("OES_texture_float"),n("OES_texture_half_float"),n("OES_texture_half_float_linear"),n("OES_standard_derivatives"),n("OES_element_index_uint"),n("OES_vertex_array_object"),n("ANGLE_instanced_arrays")),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float")},get:function(t){const e=n(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function _i(t,e,n,i){const r={},s=new WeakMap;function a(t){const o=t.target;null!==o.index&&e.remove(o.index);for(const t in o.attributes)e.remove(o.attributes[t]);o.removeEventListener("dispose",a),delete r[o.id];const l=s.get(o);l&&(e.remove(l),s.delete(o)),i.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,n.memory.geometries--}function o(t){const n=[],i=t.index,r=t.attributes.position;let a=0;if(null!==i){const t=i.array;a=i.version;for(let e=0,i=t.length;e65535?pn:un)(n,1);o.version=a;const l=s.get(t);l&&e.remove(l),s.set(t,o)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",a),r[e.id]=!0,n.memory.geometries++),e},update:function(t){const n=t.attributes;for(const t in n)e.update(n[t],34962);const i=t.morphAttributes;for(const t in i){const n=i[t];for(let t=0,i=n.length;t0)return t;const r=e*n;let s=Ii[r];if(void 0===s&&(s=new Float32Array(r),Ii[r]=s),0!==e){i.toArray(s,0);for(let i=1,r=0;i!==e;++i)r+=n,t[i].toArray(s,r)}return s}function Hi(t,e){if(t.length!==e.length)return!1;for(let n=0,i=t.length;n/gm;function kr(t){return t.replace(Ur,Vr)}function Vr(t,e){const n=hi[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return kr(n)}const Wr=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,jr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function qr(t){return t.replace(jr,Yr).replace(Wr,Xr)}function Xr(t,e,n,i){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Yr(t,e,n,i)}function Yr(t,e,n,i){let r="";for(let t=parseInt(e);t0?t.gammaFactor:1,v=n.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap||t.transmission>0)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Or).join("\n")}(n),y=function(t){const e=[];for(const n in t){const i=t[n];!1!==i&&e.push("#define "+n+" "+i)}return e.join("\n")}(o),x=a.createProgram();let _,w,b=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?(_=[y].filter(Or).join("\n"),_.length>0&&(_+="\n"),w=[v,y].filter(Or).join("\n"),w.length>0&&(w+="\n")):(_=[Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+g,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+m:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+d:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Or).join("\n"),w=[v,Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+g,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+p:"",n.envMap?"#define "+m:"",n.envMap?"#define "+f:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+d:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?hi.tonemapping_pars_fragment:"",0!==n.toneMapping?Fr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",hi.encodings_pars_fragment,n.map?Br("mapTexelToLinear",n.mapEncoding):"",n.matcap?Br("matcapTexelToLinear",n.matcapEncoding):"",n.envMap?Br("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMap?Br("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMap?Br("lightMapTexelToLinear",n.lightMapEncoding):"",zr("linearToOutputTexel",n.outputEncoding),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Or).join("\n")),h=kr(h),h=Hr(h,n),h=Gr(h,n),u=kr(u),u=Hr(u,n),u=Gr(u,n),h=qr(h),u=qr(u),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(b="#version 300 es\n",_=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,w=["#define varying in",n.glslVersion===it?"":"out highp vec4 pc_fragColor;",n.glslVersion===it?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+w);const M=b+w+u,S=Pr(a,35633,b+_+h),T=Pr(a,35632,M);if(a.attachShader(x,S),a.attachShader(x,T),void 0!==n.index0AttributeName?a.bindAttribLocation(x,0,n.index0AttributeName):!0===n.morphTargets&&a.bindAttribLocation(x,0,"position"),a.linkProgram(x),t.debug.checkShaderErrors){const t=a.getProgramInfoLog(x).trim(),e=a.getShaderInfoLog(S).trim(),n=a.getShaderInfoLog(T).trim();let i=!0,r=!0;if(!1===a.getProgramParameter(x,35714)){i=!1;const e=Nr(a,S,"vertex"),n=Nr(a,T,"fragment");console.error("THREE.WebGLProgram: shader error: ",a.getError(),"35715",a.getProgramParameter(x,35715),"gl.getProgramInfoLog",t,e,n)}else""!==t?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",t):""!==e&&""!==n||(r=!1);r&&(this.diagnostics={runnable:i,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:n,prefix:w}})}let E,A;return a.deleteShader(S),a.deleteShader(T),this.getUniforms=function(){return void 0===E&&(E=new Cr(a,x)),E},this.getAttributes=function(){return void 0===A&&(A=function(t,e){const n={},i=t.getProgramParameter(e,35721);for(let r=0;r0,maxBones:S,useVertexTexture:u,morphTargets:r.morphTargets,morphNormals:r.morphNormals,numDirLights:a.directional.length,numPointLights:a.point.length,numSpotLights:a.spot.length,numRectAreaLights:a.rectArea.length,numHemiLights:a.hemi.length,numDirLightShadows:a.directionalShadowMap.length,numPointLightShadows:a.pointShadowMap.length,numSpotLightShadows:a.spotShadowMap.length,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:r.dithering,shadowMapEnabled:t.shadowMap.enabled&&g.length>0,shadowMapType:t.shadowMap.type,toneMapping:r.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:r.premultipliedAlpha,alphaTest:r.alphaTest,doubleSided:2===r.side,flipSided:1===r.side,depthPacking:void 0!==r.depthPacking&&r.depthPacking,index0AttributeName:r.index0AttributeName,extensionDerivatives:r.extensions&&r.extensions.derivatives,extensionFragDepth:r.extensions&&r.extensions.fragDepth,extensionDrawBuffers:r.extensions&&r.extensions.drawBuffers,extensionShaderTextureLOD:r.extensions&&r.extensions.shaderTextureLOD,rendererExtensionFragDepth:o||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:o||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:o||n.has("EXT_shader_texture_lod"),customProgramCacheKey:r.customProgramCacheKey()}},getProgramCacheKey:function(e){const n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)n.push(t),n.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t0?r.push(h):!0===n.transparent?s.push(h):i.push(h)},unshift:function(t,e,n,a,l,c){const h=o(t,e,n,a,l,c);n.transmission>0?r.unshift(h):!0===n.transparent?s.unshift(h):i.unshift(h)},finish:function(){for(let t=n,i=e.length;t1&&i.sort(t||$r),r.length>1&&r.sort(e||ts),s.length>1&&s.sort(e||ts)}}}function ns(t){let e=new WeakMap;return{get:function(n,i){let r;return!1===e.has(n)?(r=new es(t),e.set(n,[r])):i>=e.get(n).length?(r=new es(t),e.get(n).push(r)):r=e.get(n)[i],r},dispose:function(){e=new WeakMap}}}function is(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new Rt,color:new en};break;case"SpotLight":n={position:new Rt,direction:new Rt,color:new en,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Rt,color:new en,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Rt,skyColor:new en,groundColor:new en};break;case"RectAreaLight":n={color:new en,position:new Rt,halfWidth:new Rt,halfHeight:new Rt}}return t[e.id]=n,n}}}let rs=0;function ss(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function as(t,e){const n=new is,i=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=n,n}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new Rt);const s=new Rt,a=new ae,o=new ae;return{setup:function(s){let a=0,o=0,l=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let c=0,h=0,u=0,d=0,p=0,m=0,f=0,g=0;s.sort(ss);for(let t=0,e=s.length;t0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=ui.LTC_FLOAT_1,r.rectAreaLTC2=ui.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=ui.LTC_HALF_1,r.rectAreaLTC2=ui.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=a,r.ambient[1]=o,r.ambient[2]=l;const v=r.hash;v.directionalLength===c&&v.pointLength===h&&v.spotLength===u&&v.rectAreaLength===d&&v.hemiLength===p&&v.numDirectionalShadows===m&&v.numPointShadows===f&&v.numSpotShadows===g||(r.directional.length=c,r.spot.length=u,r.rectArea.length=d,r.point.length=h,r.hemi.length=p,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=f,r.pointShadowMap.length=f,r.spotShadow.length=g,r.spotShadowMap.length=g,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=f,r.spotShadowMatrix.length=g,v.directionalLength=c,v.pointLength=h,v.spotLength=u,v.rectAreaLength=d,v.hemiLength=p,v.numDirectionalShadows=m,v.numPointShadows=f,v.numSpotShadows=g,r.version=rs++)},setupView:function(t,e){let n=0,i=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e=n.get(i).length?(s=new os(t,e),n.get(i).push(s)):s=n.get(i)[r],s},dispose:function(){n=new WeakMap}}}class cs extends Ye{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}cs.prototype.isMeshDepthMaterial=!0;class hs extends Ye{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Rt,this.nearDistance=1,this.farDistance=1e3,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}hs.prototype.isMeshDistanceMaterial=!0;function us(t,e,n){let i=new ai;const r=new vt,s=new vt,a=new St,o=[],l=[],c={},h=n.maxTextureSize,u={0:1,1:0,2:2},d=new Qn({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),m=d.clone();m.defines.HORIZONTAL_PASS=1;const f=new An;f.setAttribute("position",new an(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new jn(f,d),y=this;function x(n,i){const r=e.update(v);d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(i,null,r,d,v,null),m.uniforms.shadow_pass.value=n.mapPass.texture,m.uniforms.resolution.value=n.mapSize,m.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(i,null,r,m,v,null)}function _(t){const e=t<<0;let n=o[e];return void 0===n&&(n=new cs({depthPacking:3201,morphTargets:t}),o[e]=n),n}function w(t){const e=t<<0;let n=l[e];return void 0===n&&(n=new hs({morphTargets:t}),l[e]=n),n}function b(e,n,i,r,s,a,o){let l=null,h=_,d=e.customDepthMaterial;if(!0===r.isPointLight&&(h=w,d=e.customDistanceMaterial),void 0===d){let t=!1;!0===i.morphTargets&&(t=n.morphAttributes&&n.morphAttributes.position&&n.morphAttributes.position.length>0),l=h(t)}else l=d;if(t.localClippingEnabled&&!0===i.clipShadows&&0!==i.clippingPlanes.length){const t=l.uuid,e=i.uuid;let n=c[t];void 0===n&&(n={},c[t]=n);let r=n[e];void 0===r&&(r=l.clone(),n[e]=r),l=r}return l.visible=i.visible,l.wireframe=i.wireframe,l.side=3===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:u[i.side],l.clipShadows=i.clipShadows,l.clippingPlanes=i.clippingPlanes,l.clipIntersection=i.clipIntersection,l.wireframeLinewidth=i.wireframeLinewidth,l.linewidth=i.linewidth,!0===r.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(r.matrixWorld),l.nearDistance=s,l.farDistance=a),l}function M(n,r,s,a,o){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===o)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,n.matrixWorld);const i=e.update(n),r=n.material;if(Array.isArray(r)){const e=i.groups;for(let l=0,c=e.length;lh||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/m.x),r.x=s.x*m.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/m.y),r.y=s.y*m.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:g,magFilter:g,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Tt(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:p,magFilter:p,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t=1):-1!==R.indexOf("OpenGL ES")&&(L=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=L>=2);let C=null,P={};const D=t.getParameter(3088),I=t.getParameter(2978),N=(new St).fromArray(D),B=(new St).fromArray(I);function z(e,n,i){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;ei||t.height>i)&&(r=i/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const i=e?ft:Math.floor,s=i(r*t.width),a=i(r*t.height);void 0===P&&(P=I(s,a));const o=n?I(s,a):P;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function B(t){return pt(t.width)&&pt(t.height)}function z(t,e){return t.generateMipmaps&&e&&t.minFilter!==p&&t.minFilter!==g}function F(e,n,r,s){t.generateMipmap(e);i.get(n).__maxMipLevel=Math.log2(Math.max(r,s))}function O(n,i,r){if(!1===o)return i;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let s=i;return 6403===i&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===i&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===i&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function H(t){return t===p||t===m||t===f?9728:9729}function G(e){const n=e.target;n.removeEventListener("dispose",G),function(e){const n=i.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),i.remove(e)}(n),n.isVideoTexture&&C.delete(n),a.memory.textures--}function U(e){const n=e.target;n.removeEventListener("dispose",U),function(e){const n=e.texture,r=i.get(e),s=i.get(n);if(!e)return;void 0!==s.__webglTexture&&(t.deleteTexture(s.__webglTexture),a.memory.textures--);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&t.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&t.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(e.isWebGLMultipleRenderTargets)for(let e=0,r=n.length;e0&&r.__version!==t.version){const n=t.image;if(void 0===n)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==n.complete)return void Z(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+e),n.bindTexture(3553,r.__webglTexture)}function W(e,r){const a=i.get(e);e.version>0&&a.__version!==e.version?function(e,i,r){if(6!==i.image.length)return;Y(e,i),n.activeTexture(33984+r),n.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,i.flipY),t.pixelStorei(37441,i.premultiplyAlpha),t.pixelStorei(3317,i.unpackAlignment),t.pixelStorei(37443,0);const a=i&&(i.isCompressedTexture||i.image[0].isCompressedTexture),l=i.image[0]&&i.image[0].isDataTexture,h=[];for(let t=0;t<6;t++)h[t]=a||l?l?i.image[t].image:i.image[t]:N(i.image[t],!1,!0,c);const u=h[0],d=B(u)||o,p=s.convert(i.format),m=s.convert(i.type),f=O(i.internalFormat,p,m);let g;if(X(34067,i,d),a){for(let t=0;t<6;t++){g=h[t].mipmaps;for(let e=0;e1||i.get(s).__currentAnisotropy)&&(t.texParameterf(n,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),i.get(s).__currentAnisotropy=s.anisotropy)}}function Y(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",G),e.__webglTexture=t.createTexture(),a.memory.textures++)}function Z(e,i,r){let a=3553;i.isDataTexture2DArray&&(a=35866),i.isDataTexture3D&&(a=32879),Y(e,i),n.activeTexture(33984+r),n.bindTexture(a,e.__webglTexture),t.pixelStorei(37440,i.flipY),t.pixelStorei(37441,i.premultiplyAlpha),t.pixelStorei(3317,i.unpackAlignment),t.pixelStorei(37443,0);const l=function(t){return!o&&(t.wrapS!==u||t.wrapT!==u||t.minFilter!==p&&t.minFilter!==g)}(i)&&!1===B(i.image),c=N(i.image,l,!1,x),h=B(c)||o,d=s.convert(i.format);let m,f=s.convert(i.type),v=O(i.internalFormat,d,f);X(a,i,h);const y=i.mipmaps;if(i.isDepthTexture)v=6402,o?v=i.type===b?36012:i.type===w?33190:i.type===S?35056:33189:i.type===b&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),i.format===A&&6402===v&&i.type!==_&&i.type!==w&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),i.type=_,f=s.convert(i.type)),i.format===L&&6402===v&&(v=34041,i.type!==S&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),i.type=S,f=s.convert(i.type))),n.texImage2D(3553,0,v,c.width,c.height,0,d,f,null);else if(i.isDataTexture)if(y.length>0&&h){for(let t=0,e=y.length;t0&&h){for(let t=0,e=y.length;t=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),k+=1,t},this.resetTextureUnits=function(){k=0},this.setTexture2D=V,this.setTexture2DArray=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(32879,r.__webglTexture))},this.setTextureCube=W,this.setupRenderTarget=function(e){const l=e.texture,c=i.get(e),h=i.get(l);e.addEventListener("dispose",U),!0!==e.isWebGLMultipleRenderTargets&&(h.__webglTexture=t.createTexture(),h.__version=l.version,a.memory.textures++);const u=!0===e.isWebGLCubeRenderTarget,d=!0===e.isWebGLMultipleRenderTargets,p=!0===e.isWebGLMultisampleRenderTarget,m=l.isDataTexture3D||l.isDataTexture2DArray,f=B(e)||o;if(!o||l.format!==T||l.type!==b&&l.type!==M||(l.format=E,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){c.__webglFramebuffer=[];for(let e=0;e<6;e++)c.__webglFramebuffer[e]=t.createFramebuffer()}else if(c.__webglFramebuffer=t.createFramebuffer(),d)if(r.drawBuffers){const n=e.texture;for(let e=0,r=n.length;eo+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==i),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}}class xs extends rt{constructor(t,e){super();const n=this,i=t.state;let r=null,s=1,a=null,o="local-floor",l=null;const c=[],h=new Map,u=new $n;u.layers.enable(1),u.viewport=new St;const d=new $n;d.layers.enable(2),d.viewport=new St;const p=[u,d],m=new fs;m.layers.enable(1),m.layers.enable(2);let f=null,g=null;function v(t){const e=h.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function y(){h.forEach((function(t,e){t.disconnect(e)})),h.clear(),f=null,g=null,i.bindXRFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),S.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function x(t){const e=r.inputSources;for(let t=0;t0&&(t.transmissionSamplerMap.value=i.texture,t.transmissionSamplerSize.value.set(i.width,i.height));t.thickness.value=e.thickness,e.thicknessMap&&(t.thicknessMap.value=e.thicknessMap);t.attenuationDistance.value=e.attenuationDistance,t.attenuationColor.value.copy(e.attenuationColor)}(t,i,a):n(t,i)):i.isMeshMatcapMaterial?(e(t,i),function(t,e){e.matcap&&(t.matcap.value=e.matcap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDepthMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDistanceMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,i)):i.isMeshNormalMaterial?(e(t,i),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,i),i.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,i)):i.isPointsMaterial?function(t,e,n,i){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*n,t.scale.value=.5*i,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,i,r,s):i.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let n;e.map?n=e.map:e.alphaMap&&(n=e.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),t.uvTransform.value.copy(n.matrix))}(t,i):i.isShadowMaterial?(t.color.value.copy(i.color),t.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function ws(t){const e=void 0!==(t=t||{}).canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),n=void 0!==t.context?t.context:null,i=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,c=void 0!==t.powerPreference?t.powerPreference:"default",h=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let d=null,m=null;const f=[],g=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=X,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const v=this;let _=!1,w=0,S=0,T=null,A=-1,L=null;const R=new St,C=new St;let P=null,D=e.width,I=e.height,N=1,B=null,z=null;const F=new St(0,0,D,I),O=new St(0,0,D,I);let H=!1;const G=[],U=new ai;let k=!1,V=!1,W=null;const j=new ae,q=new Rt,Y={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function Z(){return null===T?N:1}let J,Q,K,$,tt,et,nt,it,rt,st,at,ot,lt,ct,ht,ut,dt,pt,mt,ft,gt,yt,xt=n;function _t(t,n){for(let i=0;i0&&Nt(i,t,e),r.length>0&&function(t,e,n,i){null===W&&(W=new Tt(1024,1024,{generateMipmaps:!0,minFilter:y,magFilter:p,wrapS:u,wrapT:u}));const r=v.getRenderTarget();v.setRenderTarget(W),v.clear(),Nt(t,n,i),et.updateRenderTargetMipmap(W),v.setRenderTarget(r),Nt(e,n,i)}(i,r,t,e),s.length>0&&Nt(s,t,e),null!==T&&(et.updateRenderTargetMipmap(T),et.updateMultisampleRenderTarget(T)),!0===t.isScene&&t.onAfterRender(v,t,e),K.buffers.depth.setTest(!0),K.buffers.depth.setMask(!0),K.buffers.color.setMask(!0),K.setPolygonOffset(!1),yt.resetDefaultState(),A=-1,L=null,g.pop(),m=g.length>0?g[g.length-1]:null,f.pop(),d=f.length>0?f[f.length-1]:null},this.getActiveCubeFace=function(){return w},this.getActiveMipmapLevel=function(){return S},this.getRenderTarget=function(){return T},this.setRenderTarget=function(t,e=0,n=0){T=t,w=e,S=n,t&&void 0===tt.get(t).__webglFramebuffer&&et.setupRenderTarget(t);let i=null,r=!1,s=!1;if(t){const n=t.texture;(n.isDataTexture3D||n.isDataTexture2DArray)&&(s=!0);const a=tt.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(i=a[e],r=!0):i=t.isWebGLMultisampleRenderTarget?tt.get(t).__webglMultisampledFramebuffer:a,R.copy(t.viewport),C.copy(t.scissor),P=t.scissorTest}else R.copy(F).multiplyScalar(N).floor(),C.copy(O).multiplyScalar(N).floor(),P=H;if(K.bindFramebuffer(36160,i)&&Q.drawBuffers){let e=!1;if(t)if(t.isWebGLMultipleRenderTargets){const n=t.texture;if(G.length!==n.length||36064!==G[0]){for(let t=0,e=n.length;t=0&&e<=t.width-i&&n>=0&&n<=t.height-r&&xt.readPixels(e,n,i,r,gt.convert(o),gt.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==T?tt.get(T).__webglFramebuffer:null;K.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),s=Math.floor(e.image.height*i);let a=gt.convert(e.format);Q.isWebGL2&&(6407===a&&(a=32849),6408===a&&(a=32856)),et.setTexture2D(e,0),xt.copyTexImage2D(3553,n,a,t.x,t.y,r,s,0),K.unbindTexture()},this.copyTextureToTexture=function(t,e,n,i=0){const r=e.image.width,s=e.image.height,a=gt.convert(n.format),o=gt.convert(n.type);et.setTexture2D(n,0),xt.pixelStorei(37440,n.flipY),xt.pixelStorei(37441,n.premultiplyAlpha),xt.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?xt.texSubImage2D(3553,i,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?xt.compressedTexSubImage2D(3553,i,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):xt.texSubImage2D(3553,i,t.x,t.y,a,o,e.image),0===i&&n.generateMipmaps&&xt.generateMipmap(3553),K.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,i,r=0){if(v.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const{width:s,height:a,data:o}=n.image,l=gt.convert(i.format),c=gt.convert(i.type);let h;if(i.isDataTexture3D)et.setTexture3D(i,0),h=32879;else{if(!i.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");et.setTexture2DArray(i,0),h=35866}xt.pixelStorei(37440,i.flipY),xt.pixelStorei(37441,i.premultiplyAlpha),xt.pixelStorei(3317,i.unpackAlignment);const u=xt.getParameter(3314),d=xt.getParameter(32878),p=xt.getParameter(3316),m=xt.getParameter(3315),f=xt.getParameter(32877);xt.pixelStorei(3314,s),xt.pixelStorei(32878,a),xt.pixelStorei(3316,t.min.x),xt.pixelStorei(3315,t.min.y),xt.pixelStorei(32877,t.min.z),xt.texSubImage3D(h,r,e.x,e.y,e.z,t.max.x-t.min.x+1,t.max.y-t.min.y+1,t.max.z-t.min.z+1,l,c,o),xt.pixelStorei(3314,u),xt.pixelStorei(32878,d),xt.pixelStorei(3316,p),xt.pixelStorei(3315,m),xt.pixelStorei(32877,f),0===r&&i.generateMipmaps&&xt.generateMipmap(h),K.unbindTexture()},this.initTexture=function(t){et.setTexture2D(t,0),K.unbindTexture()},this.resetState=function(){w=0,S=0,T=null,K.reset(),yt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}class bs extends ws{}bs.prototype.isWebGL1Renderer=!0;class Ms{constructor(t,e=25e-5){this.name="",this.color=new en(t),this.density=e}clone(){return new Ms(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}Ms.prototype.isFogExp2=!0;class Ss{constructor(t,e=1,n=1e3){this.name="",this.color=new en(t),this.near=e,this.far=n}clone(){return new Ss(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}Ss.prototype.isFog=!0;class Ts extends Pe{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.background&&(e.object.background=this.background.toJSON(t)),null!==this.environment&&(e.object.environment=this.environment.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}Ts.prototype.isScene=!0;class Es{constructor(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=et,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=ct()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let i=0,r=this.stride;it.far||e.push({distance:o,point:Ps.clone(),uv:qe.getUV(Ps,Fs,Os,Hs,Gs,Us,ks,new vt),face:null,object:this})}copy(t){return super.copy(t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Ws(t,e,n,i,r,s){Ns.subVectors(t,n).addScalar(.5).multiply(i),void 0!==r?(Bs.x=s*Ns.x-r*Ns.y,Bs.y=r*Ns.x+s*Ns.y):Bs.copy(Ns),t.copy(e),t.x+=Bs.x,t.y+=Bs.y,t.applyMatrix4(zs)}Vs.prototype.isSprite=!0;const js=new Rt,qs=new Rt;class Xs extends Pe{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,n=e.length;t0){let n,i;for(n=1,i=e.length;n0){js.setFromMatrixPosition(this.matrixWorld);const n=t.ray.origin.distanceTo(js);this.getObjectForDistance(n).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){js.setFromMatrixPosition(t.matrixWorld),qs.setFromMatrixPosition(this.matrixWorld);const n=js.distanceTo(qs)/t.zoom;let i,r;for(e[0].object.visible=!0,i=1,r=e.length;i=e[i].distance;i++)e[i-1].object.visible=!1,e[i].object.visible=!0;for(this._currentLevel=i-1;io)continue;u.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(u);dt.far||e.push({distance:d,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}else{for(let n=Math.max(0,s.start),i=Math.min(r.count,s.start+s.count)-1;no)continue;u.applyMatrix4(this.matrixWorld);const i=t.ray.origin.distanceTo(u);it.far||e.push({distance:i,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}}else n.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,n=Object.keys(e);if(n.length>0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}ga.prototype.isLine=!0;const va=new Rt,ya=new Rt;class xa extends ga{constructor(t,e){super(t,e),this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,n=[];for(let t=0,i=e.count;t0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}function Aa(t,e,n,i,r,s,a){const o=Ma.distanceSqToPoint(t);if(or.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:n,index:e,face:null,object:a})}}Ea.prototype.isPoints=!0;class La extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.format=void 0!==a?a:T,this.minFilter=void 0!==s?s:g,this.magFilter=void 0!==r?r:g,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){c.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}La.prototype.isVideoTexture=!0;class Ra extends bt{constructor(t,e,n,i,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,i,r,h,u),this.image={width:e,height:n},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}Ra.prototype.isCompressedTexture=!0;class Ca extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.needsUpdate=!0}}Ca.prototype.isCanvasTexture=!0;class Pa extends bt{constructor(t,e,n,i,r,s,a,o,l,c){if((c=void 0!==c?c:A)!==A&&c!==L)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&c===A&&(n=_),void 0===n&&c===L&&(n=S),super(null,i,r,s,a,o,c,n,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:p,this.minFilter=void 0!==o?o:p,this.flipY=!1,this.generateMipmaps=!1}}Pa.prototype.isDepthTexture=!0;class Da extends An{constructor(t=1,e=8,n=0,i=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:n,thetaLength:i},e=Math.max(3,e);const r=[],s=[],a=[],o=[],l=new Rt,c=new vt;s.push(0,0,0),a.push(0,0,1),o.push(.5,.5);for(let r=0,h=3;r<=e;r++,h+=3){const u=n+r/e*i;l.x=t*Math.cos(u),l.y=t*Math.sin(u),s.push(l.x,l.y,l.z),a.push(0,0,1),c.x=(s[h]/t+1)/2,c.y=(s[h+1]/t+1)/2,o.push(c.x,c.y)}for(let t=1;t<=e;t++)r.push(t,t+1,0);this.setIndex(r),this.setAttribute("position",new fn(s,3)),this.setAttribute("normal",new fn(a,3)),this.setAttribute("uv",new fn(o,2))}}class Ia extends An{constructor(t=1,e=1,n=1,i=8,r=1,s=!1,a=0,o=2*Math.PI){super(),this.type="CylinderGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:n,radialSegments:i,heightSegments:r,openEnded:s,thetaStart:a,thetaLength:o};const l=this;i=Math.floor(i),r=Math.floor(r);const c=[],h=[],u=[],d=[];let p=0;const m=[],f=n/2;let g=0;function v(n){const r=p,s=new vt,m=new Rt;let v=0;const y=!0===n?t:e,x=!0===n?1:-1;for(let t=1;t<=i;t++)h.push(0,f*x,0),u.push(0,x,0),d.push(.5,.5),p++;const _=p;for(let t=0;t<=i;t++){const e=t/i*o+a,n=Math.cos(e),r=Math.sin(e);m.x=y*r,m.y=f*x,m.z=y*n,h.push(m.x,m.y,m.z),u.push(0,x,0),s.x=.5*n+.5,s.y=.5*r*x+.5,d.push(s.x,s.y),p++}for(let t=0;t0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new fn(h,3)),this.setAttribute("normal",new fn(u,3)),this.setAttribute("uv",new fn(d,2))}}class Na extends Ia{constructor(t=1,e=1,n=8,i=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,n,i,r,s,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:s,thetaLength:a}}}class Ba extends An{constructor(t,e,n=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:n,detail:i};const r=[],s=[];function a(t,e,n,i){const r=i+1,s=[];for(let i=0;i<=r;i++){s[i]=[];const a=t.clone().lerp(n,i/r),o=e.clone().lerp(n,i/r),l=r-i;for(let t=0;t<=l;t++)s[i][t]=0===t&&i===r?a:a.clone().lerp(o,t/l)}for(let t=0;t.9&&a<.1&&(e<.2&&(s[t+0]+=1),n<.2&&(s[t+2]+=1),i<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new fn(r,3)),this.setAttribute("normal",new fn(r.slice(),3)),this.setAttribute("uv",new fn(s,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}}class za extends Ba{constructor(t=1,e=0){const n=(1+Math.sqrt(5))/2,i=1/n;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-n,0,-i,n,0,i,-n,0,i,n,-i,-n,0,-i,n,0,i,-n,0,i,n,0,-n,0,-i,n,0,-i,-n,0,i,n,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}}const Fa=new Rt,Oa=new Rt,Ha=new Rt,Ga=new qe;class Ua extends An{constructor(t,e){if(super(),this.type="EdgesGeometry",this.parameters={thresholdAngle:e},e=void 0!==e?e:1,!0===t.isGeometry)return void console.error("THREE.EdgesGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");const n=Math.pow(10,4),i=Math.cos(ot*e),r=t.getIndex(),s=t.getAttribute("position"),a=r?r.count:s.count,o=[0,0,0],l=["a","b","c"],c=new Array(3),h={},u=[];for(let t=0;t80*n){o=c=t[0],l=h=t[1];for(let e=n;ec&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?1/p:0}return ja(s,a,n,o,l,p),a};function Va(t,e,n,i,r){let s,a;if(r===function(t,e,n,i){let r=0;for(let s=e,a=n-i;s0)for(s=e;s=e;s-=i)a=ho(s,t[s],t[s+1],a);return a&&ro(a,a.next)&&(uo(a),a=a.next),a}function Wa(t,e){if(!t)return t;e||(e=t);let n,i=t;do{if(n=!1,i.steiner||!ro(i,i.next)&&0!==io(i.prev,i,i.next))i=i.next;else{if(uo(i),i=e=i.prev,i===i.next)break;n=!0}}while(n||i!==e);return e}function ja(t,e,n,i,r,s,a){if(!t)return;!a&&s&&function(t,e,n,i){let r=t;do{null===r.z&&(r.z=$a(r.x,r.y,e,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,n,i,r,s,a,o,l,c=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,i=n,o=0,e=0;e0||l>0&&i;)0!==o&&(0===l||!i||n.z<=i.z)?(r=n,n=n.nextZ,o--):(r=i,i=i.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;n=i}s.nextZ=null,c*=2}while(a>1)}(r)}(t,i,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?Xa(t,i,r,s):qa(t))e.push(o.i/n),e.push(t.i/n),e.push(l.i/n),uo(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?ja(t=Ya(Wa(t),e,n),e,n,i,r,s,2):2===a&&Za(t,e,n,i,r,s):ja(Wa(t),e,n,i,r,s,1);break}}function qa(t){const e=t.prev,n=t,i=t.next;if(io(e,n,i)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(eo(e.x,e.y,n.x,n.y,i.x,i.y,r.x,r.y)&&io(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Xa(t,e,n,i){const r=t.prev,s=t,a=t.next;if(io(r,s,a)>=0)return!1;const o=r.xs.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,h=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=$a(o,l,e,n,i),d=$a(c,h,e,n,i);let p=t.prevZ,m=t.nextZ;for(;p&&p.z>=u&&m&&m.z<=d;){if(p!==t.prev&&p!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&io(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==t.prev&&m!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&io(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&io(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==t.prev&&m!==t.next&&eo(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&io(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Ya(t,e,n){let i=t;do{const r=i.prev,s=i.next.next;!ro(r,s)&&so(r,i,i.next,s)&&lo(r,s)&&lo(s,r)&&(e.push(r.i/n),e.push(i.i/n),e.push(s.i/n),uo(i),uo(i.next),i=t=s),i=i.next}while(i!==t);return Wa(i)}function Za(t,e,n,i,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&no(a,t)){let o=co(a,t);return a=Wa(a,a.next),o=Wa(o,o.next),ja(a,e,n,i,r,s),void ja(o,e,n,i,r,s)}t=t.next}a=a.next}while(a!==t)}function Ja(t,e){return t.x-e.x}function Qa(t,e){if(e=function(t,e){let n=e;const i=t.x,r=t.y;let s,a=-1/0;do{if(r<=n.y&&r>=n.next.y&&n.next.y!==n.y){const t=n.x+(r-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(t<=i&&t>a){if(a=t,t===i){if(r===n.y)return n;if(r===n.next.y)return n.next}s=n.x=n.x&&n.x>=l&&i!==n.x&&eo(rs.x||n.x===s.x&&Ka(s,n)))&&(s=n,u=h)),n=n.next}while(n!==o);return s}(t,e)){const n=co(e,t);Wa(e,e.next),Wa(n,n.next)}}function Ka(t,e){return io(t.prev,t,e.prev)<0&&io(e.next,t,t.next)<0}function $a(t,e,n,i,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function to(t){let e=t,n=t;do{(e.x=0&&(t-a)*(i-o)-(n-a)*(e-o)>=0&&(n-a)*(s-o)-(r-a)*(i-o)>=0}function no(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&so(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&(lo(t,e)&&lo(e,t)&&function(t,e){let n=t,i=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{n.y>s!=n.next.y>s&&n.next.y!==n.y&&r<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==t);return i}(t,e)&&(io(t.prev,t,e.prev)||io(t,e.prev,e))||ro(t,e)&&io(t.prev,t,t.next)>0&&io(e.prev,e,e.next)>0)}function io(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function ro(t,e){return t.x===e.x&&t.y===e.y}function so(t,e,n,i){const r=oo(io(t,e,n)),s=oo(io(t,e,i)),a=oo(io(n,i,t)),o=oo(io(n,i,e));return r!==s&&a!==o||(!(0!==r||!ao(t,n,e))||(!(0!==s||!ao(t,i,e))||(!(0!==a||!ao(n,t,i))||!(0!==o||!ao(n,e,i)))))}function ao(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function oo(t){return t>0?1:t<0?-1:0}function lo(t,e){return io(t.prev,t,t.next)<0?io(t,e,t.next)>=0&&io(t,t.prev,e)>=0:io(t,e,t.prev)<0||io(t,t.next,e)<0}function co(t,e){const n=new po(t.i,t.x,t.y),i=new po(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,n.next=r,r.prev=n,i.next=n,n.prev=i,s.next=i,i.prev=s,i}function ho(t,e,n,i){const r=new po(t,e,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function uo(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function po(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class mo{static area(t){const e=t.length;let n=0;for(let i=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function go(t,e){for(let n=0;nNumber.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((n.x-c/d-p)*c-(n.y+l/d-m)*l)/(a*c-o*l);i=p+a*f-t.x,r=m+o*f-t.y;const g=i*i+r*r;if(g<=2)return new vt(i,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(i=-o,r=a,s=Math.sqrt(h)):(i=a,r=o,s=Math.sqrt(h/2))}return new vt(i/s,r/s)}const P=[];for(let t=0,e=E.length,n=e-1,i=t+1;t=0;t--){const e=t/p,n=h*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=E.length;t=0;){const i=n;let r=n-1;r<0&&(r=t.length-1);for(let t=0,n=o+2*p;t=0?(t(i-o,p,h),u.subVectors(c,h)):(t(i+o,p,h),u.subVectors(h,c)),p-o>=0?(t(i,p-o,h),d.subVectors(c,h)):(t(i,p+o,h),d.subVectors(h,c)),l.crossVectors(u,d).normalize(),s.push(l.x,l.y,l.z),a.push(i,p)}}for(let t=0;t0)&&d.push(e,r,l),(t!==n-1||o=i)){l.push(e.times[t]);for(let n=0;ns.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t=i.times[u]){const t=u*l+o,e=t+l-o;d=Wo.arraySlice(i.values,t,e)}else{const t=i.createInterpolant(),e=o,n=l-o;t.evaluate(s),d=Wo.arraySlice(t.resultBuffer,e,n)}if("quaternion"===r){(new Lt).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}s=n,n=0}}for(;n>>1;te;)--s;if(++s,0!==r||s!==i){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Wo.arraySlice(n,r,s),this.values=Wo.arraySlice(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const n=this.times,i=this.values,r=n.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const i=n[e];if("number"==typeof i&&isNaN(i)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,i),t=!1;break}if(null!==s&&s>i){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,i,s),t=!1;break}s=i}if(void 0!==i&&Wo.isTypedArray(i))for(let e=0,n=i.length;e!==n;++e){const n=i[e];if(isNaN(n)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,n),t=!1;break}}return t}optimize(){const t=Wo.arraySlice(this.times),e=Wo.arraySlice(this.values),n=this.getValueSize(),i=this.getInterpolation()===U,r=t.length-1;let s=1;for(let a=1;a0){t[s]=t[r];for(let t=r*n,i=s*n,a=0;a!==n;++a)e[i+a]=e[t+a];++s}return s!==t.length?(this.times=Wo.arraySlice(t,0,s),this.values=Wo.arraySlice(e,0,s*n)):(this.times=t,this.values=e),this}clone(){const t=Wo.arraySlice(this.times,0),e=Wo.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,t,e);return n.createInterpolant=this.createInterpolant,n}}Zo.prototype.TimeBufferType=Float32Array,Zo.prototype.ValueBufferType=Float32Array,Zo.prototype.DefaultInterpolation=G;class Jo extends Zo{}Jo.prototype.ValueTypeName="bool",Jo.prototype.ValueBufferType=Array,Jo.prototype.DefaultInterpolation=H,Jo.prototype.InterpolantFactoryMethodLinear=void 0,Jo.prototype.InterpolantFactoryMethodSmooth=void 0;class Qo extends Zo{}Qo.prototype.ValueTypeName="color";class Ko extends Zo{}Ko.prototype.ValueTypeName="number";class $o extends jo{constructor(t,e,n,i){super(t,e,n,i)}interpolate_(t,e,n,i){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(n-e)/(i-e);let l=t*a;for(let t=l+a;l!==t;l+=4)Lt.slerpFlat(r,0,s,l-a,s,l,o);return r}}class tl extends Zo{InterpolantFactoryMethodLinear(t){return new $o(this.times,this.values,this.getValueSize(),t)}}tl.prototype.ValueTypeName="quaternion",tl.prototype.DefaultInterpolation=G,tl.prototype.InterpolantFactoryMethodSmooth=void 0;class el extends Zo{}el.prototype.ValueTypeName="string",el.prototype.ValueBufferType=Array,el.prototype.DefaultInterpolation=H,el.prototype.InterpolantFactoryMethodLinear=void 0,el.prototype.InterpolantFactoryMethodSmooth=void 0;class nl extends Zo{}nl.prototype.ValueTypeName="vector";class il{constructor(t,e=-1,n,i=2500){this.name=t,this.tracks=n,this.duration=e,this.blendMode=i,this.uuid=ct(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],n=t.tracks,i=1/(t.fps||1);for(let t=0,r=n.length;t!==r;++t)e.push(rl(n[t]).scale(i));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],n=t.tracks,i={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,i=n.length;t!==i;++t)e.push(Zo.toJSON(n[t]));return i}static CreateFromMorphTargetSequence(t,e,n,i){const r=e.length,s=[];for(let t=0;t1){const t=s[1];let e=i[t];e||(i[t]=e=[]),e.push(n)}}const s=[];for(const t in i)s.push(this.CreateFromMorphTargetSequence(t,i[t],e,n));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const n=function(t,e,n,i,r){if(0!==n.length){const s=[],a=[];Wo.flattenJSON(n,s,a,i),0!==s.length&&r.push(new t(e,s,a))}},i=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t0||0===t.search(/^data\:image\/jpeg/);r.format=i?T:E,r.needsUpdate=!0,void 0!==e&&e(r)}),n,i),r}}class fl{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const n=this.getUtoTmapping(t);return this.getPoint(n,e)}getPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPoint(n/t));return e}getSpacedPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPointAt(n/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let n,i=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)n=this.getPoint(s/t),r+=n.distanceTo(i),e.push(r),i=n;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const n=this.getLengths();let i=0;const r=n.length;let s;s=e||t*n[r-1];let a,o=0,l=r-1;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),a=n[i]-s,a<0)o=i+1;else{if(!(a>0)){l=i;break}l=i-1}if(i=l,n[i]===s)return i/(r-1);const c=n[i];return(i+(s-c)/(n[i+1]-c))/(r-1)}getTangent(t,e){const n=1e-4;let i=t-n,r=t+n;i<0&&(i=0),r>1&&(r=1);const s=this.getPoint(i),a=this.getPoint(r),o=e||(s.isVector2?new vt:new Rt);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const n=this.getUtoTmapping(t);return this.getTangent(n,e)}computeFrenetFrames(t,e){const n=new Rt,i=[],r=[],s=[],a=new Rt,o=new ae;for(let e=0;e<=t;e++){const n=e/t;i[e]=this.getTangentAt(n,new Rt),i[e].normalize()}r[0]=new Rt,s[0]=new Rt;let l=Number.MAX_VALUE;const c=Math.abs(i[0].x),h=Math.abs(i[0].y),u=Math.abs(i[0].z);c<=l&&(l=c,n.set(1,0,0)),h<=l&&(l=h,n.set(0,1,0)),u<=l&&n.set(0,0,1),a.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],a),s[0].crossVectors(i[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(i[e-1],i[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ht(i[e-1].dot(i[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(i[e],r[e])}if(!0===e){let e=Math.acos(ht(r[0].dot(r[t]),-1,1));e/=t,i[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let n=1;n<=t;n++)r[n].applyMatrix4(o.makeRotationAxis(i[n],e*n)),s[n].crossVectors(i[n],r[n])}return{tangents:i,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class gl extends fl{constructor(t=0,e=0,n=1,i=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const n=e||new vt,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=i[(l-1)%r]:(xl.subVectors(i[0],i[1]).add(i[0]),a=xl);const h=i[l%r],u=i[(l+1)%r];if(this.closed||l+2i.length-2?i.length-1:s+1],h=i[s>i.length-3?i.length-1:s+2];return n.set(Sl(a,o.x,l.x,c.x,h.x),Sl(a,o.y,l.y,c.y,h.y)),n}copy(t){super.copy(t),this.points=[];for(let e=0,n=t.points.length;e=e){const t=n[i]-e,r=this.curves[i],s=r.getLength(),a=0===s?0:1-t/s;return r.getPointAt(a)}i++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let n=0,i=this.curves.length;n1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,n=t.curves.length;e0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Fl extends zl{constructor(t){super(t),this.uuid=ct(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let n=0,i=this.holes.length;n0:i.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(i.uniforms[e]={},r.type){case"t":i.uniforms[e].value=n(r.value);break;case"c":i.uniforms[e].value=(new en).setHex(r.value);break;case"v2":i.uniforms[e].value=(new vt).fromArray(r.value);break;case"v3":i.uniforms[e].value=(new Rt).fromArray(r.value);break;case"v4":i.uniforms[e].value=(new St).fromArray(r.value);break;case"m3":i.uniforms[e].value=(new yt).fromArray(r.value);break;case"m4":i.uniforms[e].value=(new ae).fromArray(r.value);break;default:i.uniforms[e].value=r.value}}if(void 0!==t.defines&&(i.defines=t.defines),void 0!==t.vertexShader&&(i.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(i.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(const e in t.extensions)i.extensions[e]=t.extensions[e];if(void 0!==t.shading&&(i.flatShading=1===t.shading),void 0!==t.size&&(i.size=t.size),void 0!==t.sizeAttenuation&&(i.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(i.map=n(t.map)),void 0!==t.matcap&&(i.matcap=n(t.matcap)),void 0!==t.alphaMap&&(i.alphaMap=n(t.alphaMap)),void 0!==t.bumpMap&&(i.bumpMap=n(t.bumpMap)),void 0!==t.bumpScale&&(i.bumpScale=t.bumpScale),void 0!==t.normalMap&&(i.normalMap=n(t.normalMap)),void 0!==t.normalMapType&&(i.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),i.normalScale=(new vt).fromArray(e)}return void 0!==t.displacementMap&&(i.displacementMap=n(t.displacementMap)),void 0!==t.displacementScale&&(i.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(i.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(i.roughnessMap=n(t.roughnessMap)),void 0!==t.metalnessMap&&(i.metalnessMap=n(t.metalnessMap)),void 0!==t.emissiveMap&&(i.emissiveMap=n(t.emissiveMap)),void 0!==t.emissiveIntensity&&(i.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(i.specularMap=n(t.specularMap)),void 0!==t.envMap&&(i.envMap=n(t.envMap)),void 0!==t.envMapIntensity&&(i.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(i.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(i.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(i.lightMap=n(t.lightMap)),void 0!==t.lightMapIntensity&&(i.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(i.aoMap=n(t.aoMap)),void 0!==t.aoMapIntensity&&(i.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(i.gradientMap=n(t.gradientMap)),void 0!==t.clearcoatMap&&(i.clearcoatMap=n(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=n(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(i.clearcoatNormalMap=n(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(i.clearcoatNormalScale=(new vt).fromArray(t.clearcoatNormalScale)),void 0!==t.transmissionMap&&(i.transmissionMap=n(t.transmissionMap)),void 0!==t.thicknessMap&&(i.thicknessMap=n(t.thicknessMap)),i}setTextures(t){return this.textures=t,this}}class sc{static decodeText(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let n=0,i=t.length;nNumber.EPSILON){if(l<0&&(n=e[s],o=-o,a=e[r],l=-l),t.ya.y)continue;if(t.y===n.y){if(t.x===n.x)return!0}else{const e=l*(t.x-n.x)-o*(t.y-n.y);if(0===e)return!0;if(e<0)continue;i=!i}}else{if(t.y!==n.y)continue;if(a.x<=t.x&&t.x<=n.x||n.x<=t.x&&t.x<=a.x)return!0}}return i}const r=mo.isClockWise,s=this.subPaths;if(0===s.length)return[];if(!0===e)return n(s);let a,o,l;const c=[];if(1===s.length)return o=s[0],l=new Fl,l.curves=o.curves,c.push(l),c;let h=!r(s[0].getPoints());h=t?!h:h;const u=[],d=[];let p,m,f=[],g=0;d[g]=void 0,f[g]=[];for(let e=0,n=s.length;e1){let t=!1;const e=[];for(let t=0,e=d.length;t0&&(t||(f=u))}for(let t=0,e=d.length;t0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(n,i,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(n[t]!==n[t+e]){a.setValue(n,i);break}}saveOriginalState(){const t=this.binding,e=this.buffer,n=this.valueSize,i=n*this._origIndex;t.getValue(e,i);for(let t=n,r=i;t!==r;++t)e[t]=e[i+t%n];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let n=t;n=.5)for(let i=0;i!==r;++i)t[e+i]=t[n+i]}_slerp(t,e,n,i){Lt.slerpFlat(t,e,t,e,t,n,i)}_slerpAdditive(t,e,n,i,r){const s=this._workIndex*r;Lt.multiplyQuaternionsFlat(t,s,t,e,t,n),Lt.slerpFlat(t,e,t,e,t,s,i)}_lerp(t,e,n,i,r){const s=1-i;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[n+a]*i}}_lerpAdditive(t,e,n,i,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[n+s]*i}}}const zc="\\[\\]\\.:\\/",Fc=new RegExp("[\\[\\]\\.:\\/]","g"),Oc="[^\\[\\]\\.:\\/]",Hc="[^"+zc.replace("\\.","")+"]",Gc=/((?:WC+[\/:])*)/.source.replace("WC",Oc),Uc=/(WCOD+)?/.source.replace("WCOD",Hc),kc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Oc),Vc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Oc),Wc=new RegExp("^"+Gc+Uc+kc+Vc+"$"),jc=["material","materials","bones"];class qc{constructor(t,e,n){this.path=e,this.parsedPath=n||qc.parseTrackName(e),this.node=qc.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,n){return t&&t.isAnimationObjectGroup?new qc.Composite(t,e,n):new qc(t,e,n)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(Fc,"")}static parseTrackName(t){const e=Wc.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const t=n.nodeName.substring(i+1);-1!==jc.indexOf(t)&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=t)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return n}static findNode(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const n=t.skeleton.getBoneByName(e);if(void 0!==n)return n}if(t.children){const n=function(t){for(let i=0;i=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=i;t!==e;++t){const e=n[t],i=e[s],r=e[l];e[l]=i,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=i;t!==e;++t){const e=n[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const n=this._bindingsIndicesByPath;let i=n[t];const r=this._bindings;if(void 0!==i)return r[i];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);i=r.length,n[t]=i,s.push(t),a.push(e),r.push(h);for(let n=c,i=o.length;n!==i;++n){const i=o[n];h[n]=new qc(i,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,n=e[t];if(void 0!==n){const i=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=n,s[n]=o,s.pop(),r[n]=r[a],r.pop(),i[n]=i[a],i.pop()}}}Xc.prototype.isAnimationObjectGroup=!0;class Yc{constructor(t,e,n=null,i=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=n,this.blendMode=i;const r=e.tracks,s=r.length,a=new Array(s),o={endingStart:k,endingEnd:k};for(let t=0;t!==s;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(s),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,n){if(t.fadeOut(e),this.fadeIn(e),n){const n=this._clip.duration,i=t._clip.duration,r=i/n,s=n/i;t.warp(1,r,e),this.warp(s,1,e)}return this}crossFadeTo(t,e,n){return t.crossFadeFrom(this,e,n)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,n){const i=this._mixer,r=i.time,s=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=i._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,l=a.sampleValues;return o[0]=r,o[1]=r+n,l[0]=t/s,l[1]=e/s,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,n,i){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const i=(t-r)*n;if(i<0||0===n)return;this._startTime=null,e=n*i}e*=this._updateTimeScale(t);const s=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;switch(this.blendMode){case q:for(let n=0,i=t.length;n!==i;++n)t[n].evaluate(s),e[n].accumulateAdditive(a);break;case j:default:for(let n=0,r=t.length;n!==r;++n)t[n].evaluate(s),e[n].accumulate(i,a)}}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const n=this._weightInterpolant;if(null!==n){const i=n.evaluate(t)[0];e*=i,t>n.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const n=this._timeScaleInterpolant;if(null!==n){e*=n.evaluate(t)[0],t>n.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,n=this.loop;let i=this.time+t,r=this._loopCount;const s=2202===n;if(0===t)return-1===r?i:s&&1==(1&r)?e-i:i;if(2200===n){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(i>=e)i=e;else{if(!(i<0)){this.time=i;break t}i=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),i>=e||i<0){const n=Math.floor(i/e);i-=e*n,r+=Math.abs(n);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=t>0?e:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:n})}}else this.time=i;if(s&&1==(1&r))return e-i}return i}_setEndings(t,e,n){const i=this._interpolantSettings;n?(i.endingStart=V,i.endingEnd=V):(i.endingStart=t?this.zeroSlopeAtStart?V:k:W,i.endingEnd=e?this.zeroSlopeAtEnd?V:k:W)}_scheduleFading(t,e,n){const i=this._mixer,r=i.time;let s=this._weightInterpolant;null===s&&(s=i._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=n,this}}class Zc extends rt{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const n=t._localRoot||this._root,i=t._clip.tracks,r=i.length,s=t._propertyBindings,a=t._interpolants,o=n.uuid,l=this._bindingsByRootAndName;let c=l[o];void 0===c&&(c={},l[o]=c);for(let t=0;t!==r;++t){const r=i[t],l=r.name;let h=c[l];if(void 0!==h)s[t]=h;else{if(h=s[t],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,o,l));continue}const i=e&&e._propertyBindings[t].binding.parsedPath;h=new Bc(qc.create(n,l,i),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,o,l),s[t]=h}a[t].resultBuffer=h.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,n=t._clip.uuid,i=this._actionsByClip[n];this._bindAction(t,i&&i.knownActions[0]),this._addInactiveAction(t,n,e)}const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==n.useCount++&&(this._lendBinding(n),n.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==--n.useCount&&(n.restoreOriginalState(),this._takeBackBinding(n))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,n=this._nActiveActions,i=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==n;++a){e[a]._update(i,t,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;tthis.max.x||t.ythis.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new vt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new vt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return eh.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}nh.prototype.isBox2=!0;const ih=new Rt,rh=new Rt;class sh{constructor(t=new Rt,e=new Rt){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Rt),t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Rt),t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Rt),this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){ih.subVectors(t,this.start),rh.subVectors(this.end,this.start);const n=rh.dot(rh);let i=rh.dot(ih)/n;return e&&(i=ht(i,0,1)),i}closestPointToPoint(t,e,n){const i=this.closestPointToPointParameter(t,e);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new Rt),this.delta(n).multiplyScalar(i).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}class ah extends Pe{constructor(t){super(),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}}ah.prototype.isImmediateRenderObject=!0;const oh=new Rt;const lh=new Rt,ch=new ae,hh=new ae;class uh extends xa{constructor(t){const e=dh(t),n=new An,i=[],r=[],s=new en(0,0,1),a=new en(0,1,0);for(let t=0;t4?a=Dh[r-8+4-1]:0==r&&(a=0),n.push(a);const o=1/(s-1),l=-o/2,c=1+o/2,h=[l,l,c,l,c,c,l,l,c,c,l,c],u=6,d=6,p=3,m=2,f=1,g=new Float32Array(p*d*u),v=new Float32Array(m*d*u),y=new Float32Array(f*d*u);for(let t=0;t2?0:-1,i=[e,n,0,e+2/3,n,0,e+2/3,n+1,0,e,n,0,e+2/3,n+1,0,e,n+1,0];g.set(i,p*d*t),v.set(h,m*d*t);const r=[t,t,t,t,t,t];y.set(r,f*d*t)}const x=new An;x.setAttribute("position",new an(g,p)),x.setAttribute("uv",new an(v,m)),x.setAttribute("faceIndex",new an(y,f)),t.push(x),i>4&&i--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function Jh(t){const e=new Tt(3*Ph,3*Ph,t);return e.texture.mapping=l,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Qh(t,e,n,i,r){t.viewport.set(e,n,i,r),t.scissor.set(e,n,i,r)}function Kh(){const t=new vt(1,1);return new No({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:Bh[3e3]},outputEncoding:{value:Bh[3e3]}},vertexShader:tu(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${eu()}\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function $h(){return new No({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:Bh[3e3]},outputEncoding:{value:Bh[3e3]}},vertexShader:tu(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${eu()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function tu(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function eu(){return"\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t"}fl.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(fl.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},zl.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)},gh.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},uh.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},ll.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),sc.extractUrlBase(t)},ll.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},nh.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},nh.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},nh.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},nh.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)},Dt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Dt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},Dt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},Dt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},Dt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)},Qt.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ai.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},sh.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},yt.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},yt.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},yt.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},yt.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},ae.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},ae.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},ae.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Rt).setFromMatrixColumn(this,3)},ae.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},ae.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},ae.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},ae.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},ae.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},ae.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},ae.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},ae.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},ae.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},ae.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},ae.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},ae.prototype.makeFrustum=function(t,e,n,i,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,i,n,r,s)},ae.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},Be.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},Lt.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},Lt.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},se.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},se.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},se.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},qe.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},qe.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},qe.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},qe.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},qe.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)},qe.barycoordFromPoint=function(t,e,n,i,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),qe.getBarycoord(t,e,n,i,r)},qe.normal=function(t,e,n,i){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),qe.getNormal(t,e,n,i)},Fl.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},Fl.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new vo(this,t)},Fl.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new So(this,t)},vt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},vt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},vt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Rt.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Rt.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Rt.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},Rt.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},Rt.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},Rt.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},Rt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},Rt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},Rt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},St.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},St.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Pe.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},Pe.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},Pe.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},Pe.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},Pe.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(Pe.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),jn.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")},Object.defineProperties(jn.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),$s.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},$n.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(Ol.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties(an.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===nt},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(nt)}}}),an.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},an.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},an.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},An.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},An.prototype.addAttribute=function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new an(arguments[1],arguments[2])))},An.prototype.addDrawCall=function(t,e,n){void 0!==n&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},An.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},An.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},An.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},An.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(An.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Es.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},Es.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},vo.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},vo.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},vo.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},Ts.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Jc.prototype.onUpdate=function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this},Object.defineProperties(Ye.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new en}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}}}),Object.defineProperties(Qn.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),ws.prototype.clearTarget=function(t,e,n,i){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,n,i)},ws.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},ws.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},ws.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},ws.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},ws.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},ws.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},ws.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},ws.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},ws.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},ws.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},ws.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},ws.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},ws.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},ws.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},ws.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},ws.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},ws.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},ws.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},ws.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},ws.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},ws.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},ws.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},ws.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},ws.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(ws.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===t?Y:X}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(us.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(Tt.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Rc.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return(new yc).load(t,(function(t){e.setBuffer(t)})),this},Nc.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},ei.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)},ei.prototype.clear=function(t,e,n,i){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,i)},_t.crossOrigin=void 0,_t.loadTexture=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new ml;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadTextureCube=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new dl;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},_t.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};const nu={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:e}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=e),t.ACESFilmicToneMapping=4,t.AddEquation=n,t.AddOperation=2,t.AdditiveAnimationBlendMode=q,t.AdditiveBlending=2,t.AlphaFormat=1021,t.AlwaysDepth=1,t.AlwaysStencilFunc=519,t.AmbientLight=tc,t.AmbientLightProbe=_c,t.AnimationClip=il,t.AnimationLoader=class extends ll{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new hl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e=[];for(let n=0;n.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Th.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Th,e)}}setLength(t,e=.2*t,n=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(n,e,n),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}},t.Audio=Rc,t.AudioAnalyser=Nc,t.AudioContext=vc,t.AudioListener=class extends Pe{constructor(){super(),this.type="AudioListener",this.context=vc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new Mc}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,n=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Tc,Ec,Ac),Lc.set(0,0,-1).applyQuaternion(Ec),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Tc.x,t),e.positionY.linearRampToValueAtTime(Tc.y,t),e.positionZ.linearRampToValueAtTime(Tc.z,t),e.forwardX.linearRampToValueAtTime(Lc.x,t),e.forwardY.linearRampToValueAtTime(Lc.y,t),e.forwardZ.linearRampToValueAtTime(Lc.z,t),e.upX.linearRampToValueAtTime(n.x,t),e.upY.linearRampToValueAtTime(n.y,t),e.upZ.linearRampToValueAtTime(n.z,t)}else e.setPosition(Tc.x,Tc.y,Tc.z),e.setOrientation(Lc.x,Lc.y,Lc.z,n.x,n.y,n.z)}},t.AudioLoader=yc,t.AxesHelper=Lh,t.AxisHelper=function(t){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new Lh(t)},t.BackSide=1,t.BasicDepthPacking=3200,t.BasicShadowMap=0,t.BinaryTextureLoader=function(t){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new pl(t)},t.Bone=ta,t.BooleanKeyframeTrack=Jo,t.BoundingBoxHelper=function(t,e){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new Sh(t,e)},t.Box2=nh,t.Box3=Dt,t.Box3Helper=class extends xa{constructor(t,e=16776960){const n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),i=new An;i.setIndex(new an(n,1)),i.setAttribute("position",new fn([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(i,new ha({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}},t.BoxBufferGeometry=Xn,t.BoxGeometry=Xn,t.BoxHelper=Sh,t.BufferAttribute=an,t.BufferGeometry=An,t.BufferGeometryLoader=lc,t.ByteType=1010,t.Cache=sl,t.Camera=Kn,t.CameraHelper=class extends xa{constructor(t){const e=new An,n=new ha({color:16777215,vertexColors:!0,toneMapped:!1}),i=[],r=[],s={},a=new en(16755200),o=new en(16711680),l=new en(43775),c=new en(16777215),h=new en(3355443);function u(t,e,n){d(t,n),d(e,n)}function d(t,e){i.push(0,0,0),r.push(e.r,e.g,e.b),void 0===s[t]&&(s[t]=[]),s[t].push(i.length/3-1)}u("n1","n2",a),u("n2","n4",a),u("n4","n3",a),u("n3","n1",a),u("f1","f2",a),u("f2","f4",a),u("f4","f3",a),u("f3","f1",a),u("n1","f1",a),u("n2","f2",a),u("n3","f3",a),u("n4","f4",a),u("p","n1",o),u("p","n2",o),u("p","n3",o),u("p","n4",o),u("u1","u2",l),u("u2","u3",l),u("u3","u1",l),u("c","t",c),u("p","c",h),u("cn1","cn2",h),u("cn3","cn4",h),u("cf1","cf2",h),u("cf3","cf4",h),e.setAttribute("position",new fn(i,3)),e.setAttribute("color",new fn(r,3)),super(e,n),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}update(){const t=this.geometry,e=this.pointMap;wh.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),bh("c",e,t,wh,0,0,-1),bh("t",e,t,wh,0,0,1),bh("n1",e,t,wh,-1,-1,-1),bh("n2",e,t,wh,1,-1,-1),bh("n3",e,t,wh,-1,1,-1),bh("n4",e,t,wh,1,1,-1),bh("f1",e,t,wh,-1,-1,1),bh("f2",e,t,wh,1,-1,1),bh("f3",e,t,wh,-1,1,1),bh("f4",e,t,wh,1,1,1),bh("u1",e,t,wh,.7,1.1,-1),bh("u2",e,t,wh,-.7,1.1,-1),bh("u3",e,t,wh,0,2,-1),bh("cf1",e,t,wh,-1,0,1),bh("cf2",e,t,wh,1,0,1),bh("cf3",e,t,wh,0,-1,1),bh("cf4",e,t,wh,0,1,1),bh("cn1",e,t,wh,-1,0,-1),bh("cn2",e,t,wh,1,0,-1),bh("cn3",e,t,wh,0,-1,-1),bh("cn4",e,t,wh,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")},t.CanvasTexture=Ca,t.CatmullRomCurve3=Ml,t.CineonToneMapping=3,t.CircleBufferGeometry=Da,t.CircleGeometry=Da,t.ClampToEdgeWrapping=u,t.Clock=Mc,t.Color=en,t.ColorKeyframeTrack=Qo,t.CompressedTexture=Ra,t.CompressedTextureLoader=class extends ll{constructor(t){super(t)}load(t,e,n,i){const r=this,s=[],a=new Ra,o=new hl(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const n=r.parse(t,!0);s[c]={width:n.width,height:n.height,format:n.format,mipmaps:n.mipmaps},l+=1,6===l&&(1===n.mipmapCount&&(a.minFilter=g),a.image=s,a.format=n.format,a.needsUpdate=!0,e&&e(a))}),n,i)}if(Array.isArray(t))for(let e=0,n=t.length;e>16&32768,i=e>>12&2047;const r=e>>23&255;return r<103?n:r>142?(n|=31744,n|=(255==r?0:1)&&8388607&e,n):r<113?(i|=2048,n|=(i>>114-r)+(i>>113-r&1),n):(n|=r-112<<10|i>>1,n+=1&i,n)}},t.DecrementStencilOp=7683,t.DecrementWrapStencilOp=34056,t.DefaultLoadingManager=ol,t.DepthFormat=A,t.DepthStencilFormat=L,t.DepthTexture=Pa,t.DirectionalLight=$l,t.DirectionalLightHelper=class extends Pe{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,void 0===e&&(e=1);let i=new An;i.setAttribute("position",new fn([-e,e,0,e,e,0,e,-e,0,-e,-e,0,-e,e,0],3));const r=new ha({fog:!1,toneMapped:!1});this.lightPlane=new ga(i,r),this.add(this.lightPlane),i=new An,i.setAttribute("position",new fn([0,0,0,0,0,1],3)),this.targetLine=new ga(i,r),this.add(this.targetLine),this.update()}dispose(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()}update(){vh.setFromMatrixPosition(this.light.matrixWorld),yh.setFromMatrixPosition(this.light.target.matrixWorld),xh.subVectors(yh,vh),this.lightPlane.lookAt(yh),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(yh),this.targetLine.scale.z=xh.length()}},t.DiscreteInterpolant=Yo,t.DodecahedronBufferGeometry=za,t.DodecahedronGeometry=za,t.DoubleSide=2,t.DstAlphaFactor=206,t.DstColorFactor=208,t.DynamicBufferAttribute=function(t,e){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),new an(t,e).setUsage(nt)},t.DynamicCopyUsage=35050,t.DynamicDrawUsage=nt,t.DynamicReadUsage=35049,t.EdgesGeometry=Ua,t.EdgesHelper=function(t,e){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new xa(new Ua(t.geometry),new ha({color:void 0!==e?e:16777215}))},t.EllipseCurve=gl,t.EqualDepth=4,t.EqualStencilFunc=514,t.EquirectangularReflectionMapping=a,t.EquirectangularRefractionMapping=o,t.Euler=ge,t.EventDispatcher=rt,t.ExtrudeBufferGeometry=vo,t.ExtrudeGeometry=vo,t.FaceColors=1,t.FileLoader=hl,t.FlatShading=1,t.Float16BufferAttribute=mn,t.Float32Attribute=function(t,e){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new fn(t,e)},t.Float32BufferAttribute=fn,t.Float64Attribute=function(t,e){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new gn(t,e)},t.Float64BufferAttribute=gn,t.FloatType=b,t.Fog=Ss,t.FogExp2=Ms,t.Font=mc,t.FontLoader=class extends ll{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new hl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(t){let n;try{n=JSON.parse(t)}catch(e){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),n=JSON.parse(t.substring(65,t.length-2))}const i=r.parse(n);e&&e(i)}),n,i)}parse(t){return new mc(t)}},t.FrontSide=0,t.Frustum=ai,t.GLBufferAttribute=Kc,t.GLSL1="100",t.GLSL3=it,t.GammaEncoding=Z,t.GreaterDepth=6,t.GreaterEqualDepth=5,t.GreaterEqualStencilFunc=518,t.GreaterStencilFunc=516,t.GridHelper=gh,t.Group=gs,t.HalfFloatType=M,t.HemisphereLight=Hl,t.HemisphereLightHelper=class extends Pe{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;const i=new wo(e);i.rotateY(.5*Math.PI),this.material=new nn({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);const r=i.getAttribute("position"),s=new Float32Array(3*r.count);i.setAttribute("color",new an(s,3)),this.add(new jn(i,this.material)),this.update()}dispose(){this.children[0].geometry.dispose(),this.children[0].material.dispose()}update(){const t=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{const e=t.geometry.getAttribute("color");mh.copy(this.light.color),fh.copy(this.light.groundColor);for(let t=0,n=e.count;t0){const n=new al(e);r=new ul(n),r.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}(Nh),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,i=100){Vh=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(t,n,i,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t){return this._fromTexture(t)}fromCubemap(t){return this._fromTexture(t)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=$h(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Kh(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let t=0;t2?Ph:0,Ph,Ph),o.setRenderTarget(i),u&&o.render(Fh,r),o.render(t,r)}o.toneMapping=h,o.outputEncoding=c,o.autoClear=l}_textureToCubeUV(t,e){const n=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=$h()):null==this._equirectShader&&(this._equirectShader=Kh());const i=t.isCubeTexture?this._cubemapShader:this._equirectShader,r=new jn(Hh[0],i),s=i.uniforms;s.envMap.value=t,t.isCubeTexture||s.texelSize.value.set(1/t.image.width,1/t.image.height),s.inputEncoding.value=Bh[t.encoding],s.outputEncoding.value=Bh[e.texture.encoding],Qh(e,0,0,3*Ph,2*Ph),n.setRenderTarget(e),n.render(r,Oh)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let e=1;eNh&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const f=[];let g=0;for(let t=0;t4?i-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(c,Oh)}},t.ParametricBufferGeometry=bo,t.ParametricGeometry=bo,t.Particle=function(t){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new Vs(t)},t.ParticleBasicMaterial=function(t){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new wa(t)},t.ParticleSystem=function(t,e){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new Ea(t,e)},t.ParticleSystemMaterial=function(t){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new wa(t)},t.Path=zl,t.PerspectiveCamera=$n,t.Plane=Be,t.PlaneBufferGeometry=ci,t.PlaneGeometry=ci,t.PlaneHelper=class extends ga{constructor(t,e=1,n=16776960){const i=n,r=new An;r.setAttribute("position",new fn([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),r.computeBoundingSphere(),super(r,new ha({color:i,toneMapped:!1})),this.type="PlaneHelper",this.plane=t,this.size=e;const s=new An;s.setAttribute("position",new fn([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),s.computeBoundingSphere(),this.add(new jn(s,new nn({color:i,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}updateMatrixWorld(t){let e=-this.plane.constant;Math.abs(e)<1e-8&&(e=1e-8),this.scale.set(.5*this.size,.5*this.size,e),this.children[0].material.side=e<0?1:0,this.lookAt(this.plane.normal),super.updateMatrixWorld(t)}},t.PointCloud=function(t,e){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new Ea(t,e)},t.PointCloudMaterial=function(t){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new wa(t)},t.PointLight=Jl,t.PointLightHelper=class extends jn{constructor(t,e,n){super(new To(e,4,2),new nn({wireframe:!0,fog:!1,toneMapped:!1})),this.light=t,this.light.updateMatrixWorld(),this.color=n,this.type="PointLightHelper",this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}dispose(){this.geometry.dispose(),this.material.dispose()}update(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)}},t.Points=Ea,t.PointsMaterial=wa,t.PolarGridHelper=class extends xa{constructor(t=10,e=16,n=8,i=64,r=4473924,s=8947848){r=new en(r),s=new en(s);const a=[],o=[];for(let n=0;n<=e;n++){const i=n/e*(2*Math.PI),l=Math.sin(i)*t,c=Math.cos(i)*t;a.push(0,0,0),a.push(l,0,c);const h=1&n?r:s;o.push(h.r,h.g,h.b),o.push(h.r,h.g,h.b)}for(let e=0;e<=n;e++){const l=1&e?r:s,c=t-t/n*e;for(let t=0;t