{
    "canvas": {
        "width": 1709,
        "height": 881,
        "clientWidth": 1709,
        "clientHeight": 881,
        "browserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    },
    "context": {
        "version": 2,
        "contextAttributes": {
            "alpha": false,
            "antialias": true,
            "depth": true,
            "desynchronized": false,
            "failIfMajorPerformanceCaveat": false,
            "powerPreference": "default",
            "premultipliedAlpha": true,
            "preserveDrawingBuffer": false,
            "stencil": true,
            "xrCompatible": false
        },
        "capabilities": {
            "RENDERER": "WebKit WebGL",
            "VENDOR": "WebKit",
            "VERSION": "WebGL 2.0 (OpenGL ES 3.0 Chromium)",
            "SHADING_LANGUAGE_VERSION": "WebGL GLSL ES 3.00 (OpenGL ES GLSL ES 3.0 Chromium)",
            "SAMPLES": 4,
            "SAMPLE_BUFFERS": 1,
            "RED_BITS": 8,
            "GREEN_BITS": 8,
            "BLUE_BITS": 8,
            "ALPHA_BITS": 0,
            "DEPTH_BITS": 24,
            "STENCIL_BITS": 8,
            "SUBPIXEL_BITS": 4,
            "LINE_WIDTH": 1,
            "ALIASED_LINE_WIDTH_RANGE": [
                1,
                10
            ],
            "ALIASED_POINT_SIZE_RANGE": [
                1,
                2047
            ],
            "IMPLEMENTATION_COLOR_READ_FORMAT": "RGB",
            "IMPLEMENTATION_COLOR_READ_TYPE": "UNSIGNED_BYTE",
            "MAX_COMBINED_TEXTURE_IMAGE_UNITS": 64,
            "MAX_CUBE_MAP_TEXTURE_SIZE": 32768,
            "MAX_FRAGMENT_UNIFORM_VECTORS": 1024,
            "MAX_RENDERBUFFER_SIZE": 32768,
            "MAX_TEXTURE_IMAGE_UNITS": 32,
            "MAX_TEXTURE_SIZE": 32768,
            "MAX_VARYING_VECTORS": 31,
            "MAX_VERTEX_ATTRIBS": 16,
            "MAX_VERTEX_TEXTURE_IMAGE_UNITS": 32,
            "MAX_VERTEX_UNIFORM_VECTORS": 1024,
            "MAX_VIEWPORT_DIMS": [
                32768,
                32768
            ],
            "MAX_TEXTURE_MAX_ANISOTROPY_EXT": 16,
            "MAX_COLOR_ATTACHMENTS_WEBGL": "Extension WEBGL_draw_buffers is unavailble.",
            "MAX_DRAW_BUFFERS_WEBGL": "Extension WEBGL_draw_buffers is unavailble.",
            "MAX_3D_TEXTURE_SIZE": 16384,
            "MAX_ARRAY_TEXTURE_LAYERS": 2048,
            "MAX_CLIENT_WAIT_TIMEOUT_WEBGL": 0,
            "MAX_COLOR_ATTACHMENTS": 8,
            "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS": 233472,
            "MAX_COMBINED_UNIFORM_BLOCKS": 42,
            "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS": 233472,
            "MAX_DRAW_BUFFERS": 8,
            "MAX_ELEMENT_INDEX": 4294967295,
            "MAX_ELEMENTS_INDICES": 1048576,
            "MAX_ELEMENTS_VERTICES": 1048576,
            "MAX_FRAGMENT_INPUT_COMPONENTS": 128,
            "MAX_FRAGMENT_UNIFORM_BLOCKS": 14,
            "MAX_FRAGMENT_UNIFORM_COMPONENTS": 4096,
            "MAX_PROGRAM_TEXEL_OFFSET": 7,
            "MAX_SAMPLES": 8,
            "MAX_SERVER_WAIT_TIMEOUT": 0,
            "MAX_TEXTURE_LOD_BIAS": 15,
            "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS": 128,
            "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS": 4,
            "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS": 4,
            "MAX_UNIFORM_BLOCK_SIZE": 65536,
            "MAX_UNIFORM_BUFFER_BINDINGS": 72,
            "MAX_VARYING_COMPONENTS": 124,
            "MAX_VERTEX_OUTPUT_COMPONENTS": 128,
            "MAX_VERTEX_UNIFORM_BLOCKS": 14,
            "MAX_VERTEX_UNIFORM_COMPONENTS": 4096,
            "MIN_PROGRAM_TEXEL_OFFSET": -8
        },
        "extensions": {
            "EXT_color_buffer_float": true,
            "EXT_disjoint_timer_query": false,
            "EXT_disjoint_timer_query_webgl2": true,
            "EXT_texture_filter_anisotropic": true,
            "OES_texture_float_linear": true,
            "WEBGL_compressed_texture_astc": false,
            "WEBGL_compressed_texture_atc": false,
            "WEBGL_compressed_texture_etc": false,
            "WEBGL_compressed_texture_etc1": false,
            "WEBGL_compressed_texture_pvrtc": false,
            "WEBGL_compressed_texture_s3tc": true
        },
        "compressedTextures": {
            "COMPRESSED_TEXTURE_FORMATS": [
                "COMPRESSED_RGB_S3TC_DXT1_EXT",
                "COMPRESSED_RGBA_S3TC_DXT1_EXT",
                "COMPRESSED_RGBA_S3TC_DXT3_EXT",
                "COMPRESSED_RGBA_S3TC_DXT5_EXT"
            ]
        }
    },
    "commands": [
        {
            "id": 0,
            "startTime": 1629734999196.2,
            "commandEndTime": 1629734999196.2,
            "endTime": 1629734999197.1,
            "name": "enable",
            "commandArguments": [
                32823
            ],
            "stackTrace": [
                "GraphicsDevice.setDepthBias (https://code.playcanvas.com/playcanvas-stable.dbg.js:15290:13)",
                "ShadowRenderer.setupRenderState (https://code.playcanvas.com/playcanvas-stable.dbg.js:21734:13)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21852:10)",
                "ForwardRenderer.renderShadows (https://code.playcanvas.com/playcanvas-stable.dbg.js:22878:26)"
            ],
            "status": 40,
            "marker": "SHADOW Light # ",
            "text": "enable: POLYGON_OFFSET_FILL",
            "consumeCommandId": 13
        },
        {
            "id": 1,
            "startTime": 1629734999197.1,
            "commandEndTime": 1629734999197.1,
            "endTime": 1629734999197.3,
            "name": "polygonOffset",
            "commandArguments": [
                2,
                2
            ],
            "stackTrace": [
                "GraphicsDevice.setDepthBiasValues (https://code.playcanvas.com/playcanvas-stable.dbg.js:15297:12)",
                "ShadowRenderer.setupRenderState (https://code.playcanvas.com/playcanvas-stable.dbg.js:21735:13)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21852:10)",
                "ForwardRenderer.renderShadows (https://code.playcanvas.com/playcanvas-stable.dbg.js:22878:26)"
            ],
            "status": 30,
            "marker": "SHADOW Light # ",
            "text": "polygonOffset: LINE_LOOP, LINE_LOOP",
            "consumeCommandId": 13
        },
        {
            "id": 2,
            "startTime": 1629734999197.3,
            "commandEndTime": 1629734999197.3,
            "endTime": 1629734999197.4,
            "name": "colorMask",
            "commandArguments": [
                false,
                false,
                false,
                false
            ],
            "stackTrace": [
                "GraphicsDevice.setColorWrite (https://code.playcanvas.com/playcanvas-stable.dbg.js:15233:13)",
                "ShadowRenderer.setupRenderState (https://code.playcanvas.com/playcanvas-stable.dbg.js:21756:12)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21852:10)",
                "ForwardRenderer.renderShadows (https://code.playcanvas.com/playcanvas-stable.dbg.js:22878:26)"
            ],
            "status": 40,
            "marker": "SHADOW Light # ",
            "text": "colorMask: false, false, false, false",
            "consumeCommandId": 13
        },
        {
            "id": 3,
            "startTime": 1629734999197.4,
            "commandEndTime": 1629734999197.4,
            "endTime": 1629734999197.6,
            "name": "bindFramebuffer",
            "commandArguments": [
                36160,
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLFramebuffer",
                        "id": 0,
                        "displayText": "WebGLFramebuffer - ID: 0"
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setFramebuffer (https://code.playcanvas.com/playcanvas-stable.dbg.js:14111:13)",
                "GraphicsDevice.updateBegin (https://code.playcanvas.com/playcanvas-stable.dbg.js:14325:11)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22313:11)",
                "ForwardRenderer.setCamera (https://code.playcanvas.com/playcanvas-stable.dbg.js:22297:9)"
            ],
            "status": 0,
            "marker": "SHADOW Light # ",
            "text": "bindFramebuffer: FRAMEBUFFER, WebGLFramebuffer - ID: 0"
        },
        {
            "id": 4,
            "startTime": 1629734999197.6,
            "commandEndTime": 1629734999197.6,
            "endTime": 1629734999197.8,
            "name": "viewport",
            "commandArguments": [
                0,
                0,
                1024,
                1024
            ],
            "stackTrace": [
                "GraphicsDevice.setViewport (https://code.playcanvas.com/playcanvas-stable.dbg.js:14083:13)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22327:11)",
                "ForwardRenderer.setCamera (https://code.playcanvas.com/playcanvas-stable.dbg.js:22297:9)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21862:22)"
            ],
            "status": 0,
            "marker": "SHADOW Light # ",
            "text": "viewport: 0, 0, 1024, 1024"
        },
        {
            "id": 5,
            "startTime": 1629734999197.8,
            "commandEndTime": 1629734999197.8,
            "endTime": 1629734999198,
            "name": "scissor",
            "commandArguments": [
                0,
                0,
                1024,
                1024
            ],
            "stackTrace": [
                "GraphicsDevice.setScissor (https://code.playcanvas.com/playcanvas-stable.dbg.js:14093:13)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22328:11)",
                "ForwardRenderer.setCamera (https://code.playcanvas.com/playcanvas-stable.dbg.js:22297:9)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21862:22)"
            ],
            "status": 30,
            "marker": "SHADOW Light # ",
            "text": "scissor: 0, 0, 1024, 1024",
            "consumeCommandId": 13
        },
        {
            "id": 6,
            "startTime": 1629734999198,
            "commandEndTime": 1629734999198,
            "endTime": 1629734999199.7,
            "name": "clear",
            "commandArguments": [
                256
            ],
            "stackTrace": [
                "GraphicsDevice.clear (https://code.playcanvas.com/playcanvas-stable.dbg.js:15149:8)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22332:12)",
                "ForwardRenderer.setCamera (https://code.playcanvas.com/playcanvas-stable.dbg.js:22297:9)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21862:22)"
            ],
            "status": 0,
            "marker": "SHADOW Light # ",
            "text": "clear: DEPTH_BUFFER_BIT",
            "ClearState": {
                "COLOR_CLEAR_VALUE": [
                    0.11800000071525574,
                    0.11800000071525574,
                    0.11800000071525574,
                    1
                ],
                "DEPTH_CLEAR_VALUE": 1,
                "STENCIL_CLEAR_VALUE": 0
            },
            "VisualState": {
                "Attachments": [],
                "FrameBuffer": {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLFramebuffer",
                        "id": 0,
                        "displayText": "WebGLFramebuffer - ID: 0"
                    }
                },
                "FrameBufferStatus": "FRAMEBUFFER_COMPLETE"
            }
        },
        {
            "id": 7,
            "startTime": 1629734999199.7,
            "commandEndTime": 1629734999199.7,
            "endTime": 1629734999199.8,
            "name": "scissor",
            "commandArguments": [
                1,
                1,
                1022,
                1022
            ],
            "stackTrace": [
                "GraphicsDevice.setScissor (https://code.playcanvas.com/playcanvas-stable.dbg.js:14093:13)",
                "ForwardRenderer.setCamera (https://code.playcanvas.com/playcanvas-stable.dbg.js:22307:27)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21862:22)",
                "ForwardRenderer.renderShadows (https://code.playcanvas.com/playcanvas-stable.dbg.js:22878:26)"
            ],
            "status": 40,
            "marker": "SHADOW Light # ",
            "text": "scissor: 1, 1, 1022, 1022",
            "consumeCommandId": 13
        },
        {
            "id": 8,
            "startTime": 1629734999199.8,
            "commandEndTime": 1629734999199.8,
            "endTime": 1629734999200.1,
            "name": "useProgram",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLProgram",
                        "id": 0,
                        "displayText": "WebGLProgram - ID: 0"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "programStatus": {
                            "LINK_STATUS": true,
                            "VALIDATE_STATUS": false
                        },
                        "shaders": [
                            {
                                "COMPILE_STATUS": true,
                                "fragment": false,
                                "name": "Vertex",
                                "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\n}",
                                "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                            },
                            {
                                "COMPILE_STATUS": true,
                                "fragment": true,
                                "name": "Fragment",
                                "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvoid main(void)\n{\n\t float depth = gl_FragCoord.z;\n\t gl_FragColor = vec4(1.0);\n}\n",
                                "translatedSource": "#version 450\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nvoid main(){\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_upc_fragColor = vec4(1.0, 1.0, 1.0, 1.0));\n}\n\u0000"
                            }
                        ],
                        "length": 4425
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setShader (https://code.playcanvas.com/playcanvas-stable.dbg.js:15674:13)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21822:12)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21863:11)",
                "ForwardRenderer.renderShadows (https://code.playcanvas.com/playcanvas-stable.dbg.js:22878:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light # ",
            "text": "useProgram: WebGLProgram - ID: 0"
        },
        {
            "id": 9,
            "startTime": 1629734999200.1,
            "commandEndTime": 1629734999200.1,
            "endTime": 1629734999200.2,
            "name": "bindVertexArray",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLVertexArrayObject",
                        "id": 0,
                        "displayText": "WebGLVertexArrayObject - ID: 0"
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15003:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "bindVertexArray: WebGLVertexArrayObject - ID: 0"
        },
        {
            "id": 10,
            "startTime": 1629734999200.2,
            "commandEndTime": 1629734999200.2,
            "endTime": 1629734999200.4,
            "name": "bindBuffer",
            "commandArguments": [
                34963,
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLBuffer",
                        "id": 3,
                        "displayText": "WebGLBuffer - ID: 3"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "target": "ELEMENT_ARRAY_BUFFER",
                        "length": 12,
                        "usage": 35044
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15008:7)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "bindBuffer: ELEMENT_ARRAY_BUFFER, WebGLBuffer - ID: 3"
        },
        {
            "id": 11,
            "startTime": 1629734999200.4,
            "commandEndTime": 1629734999200.4,
            "endTime": 1629734999200.5,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 0,
                        "displayText": "WebGLUniformLocation - ID: 0"
                    }
                },
                false,
                {
                    "0": -0.04284273087978363,
                    "1": -0.0302943866699934,
                    "2": -0.11226990073919296,
                    "3": 0,
                    "4": 0,
                    "5": 0.04284273087978363,
                    "6": -0.15877361595630646,
                    "7": 0,
                    "8": -0.04284273087978363,
                    "9": 0.0302943866699934,
                    "10": 0.11226990073919296,
                    "11": 0,
                    "12": -0.08203125,
                    "13": 0.01953124813735485,
                    "14": 0.06619937717914581,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 0, false, [..(16)..]"
        },
        {
            "id": 12,
            "startTime": 1629734999200.5,
            "commandEndTime": 1629734999200.5,
            "endTime": 1629734999200.6,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 1,
                        "displayText": "WebGLUniformLocation - ID: 1"
                    }
                },
                false,
                {
                    "0": 8,
                    "1": 0,
                    "2": 0,
                    "3": 0,
                    "4": 0,
                    "5": 1,
                    "6": 0,
                    "7": 0,
                    "8": 0,
                    "9": 0,
                    "10": 8,
                    "11": 0,
                    "12": 0,
                    "13": 0,
                    "14": 0,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 1, false, [..(16)..]"
        },
        {
            "id": 13,
            "startTime": 1629734999200.6,
            "commandEndTime": 1629734999200.6,
            "endTime": 1629734999211.4,
            "name": "drawElements",
            "commandArguments": [
                4,
                6,
                5123,
                0
            ],
            "stackTrace": [
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15101:9)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21863:11)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "drawElements: TRIANGLES, 6, UNSIGNED_SHORT, 0",
            "BlendState": {
                "BLEND": false,
                "BLEND_COLOR": [
                    0,
                    0,
                    0,
                    0
                ],
                "BLEND_DST_ALPHA": "ZERO",
                "BLEND_DST_RGB": "ZERO",
                "BLEND_EQUATION_ALPHA": "FUNC_ADD",
                "BLEND_EQUATION_RGB": "FUNC_ADD",
                "BLEND_SRC_ALPHA": "ONE",
                "BLEND_SRC_RGB": "ONE"
            },
            "ColorState": {
                "COLOR_WRITEMASK": [
                    false,
                    false,
                    false,
                    false
                ],
                "validCommandIds": [
                    2
                ]
            },
            "CoverageState": {
                "SAMPLE_COVERAGE_VALUE": 1,
                "SAMPLE_COVERAGE_INVERT": false,
                "SAMPLE_COVERAGE": false,
                "SAMPLE_ALPHA_TO_COVERAGE": false
            },
            "CullState": {
                "CULL_FACE": true,
                "CULL_FACE_MODE": "BACK"
            },
            "DepthState": {
                "DEPTH_TEST": true,
                "DEPTH_FUNC": "LEQUAL",
                "DEPTH_RANGE": [
                    0,
                    1
                ],
                "DEPTH_WRITEMASK": true
            },
            "DrawState": {
                "DITHER": true,
                "VIEWPORT": [
                    0,
                    0,
                    1024,
                    1024
                ],
                "FRONT_FACE": "CCW",
                "FRAGMENT_SHADER_DERIVATIVE_HINT_OES": "Extension OES_standard_derivatives is unavailble.",
                "RASTERIZER_DISCARD": false,
                "FRAGMENT_SHADER_DERIVATIVE_HINT": 4354
            },
            "PolygonOffsetState": {
                "POLYGON_OFFSET_FILL": true,
                "POLYGON_OFFSET_FACTOR": 2,
                "POLYGON_OFFSET_UNITS": 2,
                "redundantCommandIds": [
                    1,
                    1,
                    1,
                    1
                ],
                "validCommandIds": [
                    0
                ]
            },
            "ScissorState": {
                "SCISSOR_TEST": true,
                "SCISSOR_BOX": [
                    1,
                    1,
                    1022,
                    1022
                ],
                "redundantCommandIds": [
                    5
                ],
                "validCommandIds": [
                    7
                ]
            },
            "StencilState": {
                "STENCIL_TEST": false,
                "STENCIL_BACK_FAIL": "KEEP",
                "STENCIL_BACK_FUNC": "ALWAYS",
                "STENCIL_BACK_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_BACK_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_BACK_REF": 0,
                "STENCIL_BACK_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_BACK_WRITEMASK": "00000000000000000000000011111111",
                "STENCIL_FAIL": "KEEP",
                "STENCIL_FUNC": "ALWAYS",
                "STENCIL_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_REF": 0,
                "STENCIL_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_WRITEMASK": "00000000000000000000000011111111"
            },
            "VisualState": {
                "Attachments": [],
                "FrameBuffer": {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLFramebuffer",
                        "id": 0,
                        "displayText": "WebGLFramebuffer - ID: 0"
                    }
                },
                "FrameBufferStatus": "FRAMEBUFFER_COMPLETE"
            },
            "DrawCall": {
                "frameBuffer": {
                    "frameBuffer": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLFramebuffer",
                            "id": 0,
                            "displayText": "WebGLFramebuffer - ID: 0"
                        }
                    },
                    "depthAttachment": {
                        "type": "TEXTURE",
                        "texture": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLTexture",
                                "id": 0,
                                "displayText": "WebGLTexture - ID: 0"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "TEXTURE_2D",
                                "internalFormat": 36012,
                                "width": 1024,
                                "height": 1024,
                                "format": 6402,
                                "type": 5126,
                                "length": 4194304
                            }
                        },
                        "textureLevel": 0,
                        "textureCubeMapFace": "NONE",
                        "textureType": "FLOAT",
                        "format": "DEPTH_COMPONENT",
                        "internalFormat": "DEPTH_COMPONENT32F",
                        "width": 1024,
                        "height": 1024,
                        "alphaSize": 0,
                        "blueSize": 0,
                        "encoding": "LINEAR",
                        "componentType": "FLOAT",
                        "depthSize": 32,
                        "greenSize": 0,
                        "redSize": 0,
                        "stencilSize": 0,
                        "textureLayer": 0
                    },
                    "colorAttachments": []
                },
                "programStatus": {
                    "LINK_STATUS": true,
                    "VALIDATE_STATUS": false,
                    "program": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLProgram",
                            "id": 0,
                            "displayText": "WebGLProgram - ID: 0"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "programStatus": {
                                "LINK_STATUS": true,
                                "VALIDATE_STATUS": false
                            },
                            "shaders": [
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": false,
                                    "name": "Vertex",
                                    "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\n}",
                                    "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                                },
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": true,
                                    "name": "Fragment",
                                    "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvoid main(void)\n{\n\t float depth = gl_FragCoord.z;\n\t gl_FragColor = vec4(1.0);\n}\n",
                                    "translatedSource": "#version 450\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nvoid main(){\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_upc_fragColor = vec4(1.0, 1.0, 1.0, 1.0));\n}\n\u0000"
                                }
                            ],
                            "length": 4425
                        }
                    },
                    "RECOMPILABLE": false
                },
                "shaders": [
                    {
                        "COMPILE_STATUS": true,
                        "fragment": false,
                        "name": "Vertex",
                        "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\n}",
                        "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                    },
                    {
                        "COMPILE_STATUS": true,
                        "fragment": true,
                        "name": "Fragment",
                        "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvoid main(void)\n{\n\t float depth = gl_FragCoord.z;\n\t gl_FragColor = vec4(1.0);\n}\n",
                        "translatedSource": "#version 450\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nvoid main(){\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_upc_fragColor = vec4(1.0, 1.0, 1.0, 1.0));\n}\n\u0000"
                    }
                ],
                "elementArray": {
                    "arrayBuffer": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLBuffer",
                            "id": 3,
                            "displayText": "WebGLBuffer - ID: 3"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "target": "ELEMENT_ARRAY_BUFFER",
                            "length": 12,
                            "usage": 35044
                        }
                    }
                },
                "attributes": [
                    {
                        "name": "vertex_position",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": 0,
                        "offsetPointer": 0,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 2,
                                "displayText": "WebGLBuffer - ID: 2"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 160,
                                "usage": 35044
                            }
                        },
                        "enabled": true,
                        "arraySize": 3,
                        "stride": 12,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "STATIC_DRAW",
                        "bufferLength": 160
                    }
                ],
                "uniforms": [
                    {
                        "name": "matrix_viewProjection",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 30,
                                "displayText": "WebGLUniformLocation - ID: 30"
                            }
                        },
                        "value": [
                            -0.04284273087978363,
                            -0.0302943866699934,
                            -0.11226990073919296,
                            0,
                            0,
                            0.04284273087978363,
                            -0.15877361595630646,
                            0,
                            -0.04284273087978363,
                            0.0302943866699934,
                            0.11226990073919296,
                            0,
                            -0.08203125,
                            0.01953124813735485,
                            0.06619937717914581,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "matrix_model",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 31,
                                "displayText": "WebGLUniformLocation - ID: 31"
                            }
                        },
                        "value": [
                            8,
                            0,
                            0,
                            0,
                            0,
                            1,
                            0,
                            0,
                            0,
                            0,
                            8,
                            0,
                            0,
                            0,
                            0,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    }
                ],
                "uniformBlocks": []
            }
        },
        {
            "id": 14,
            "startTime": 1629734999211.4,
            "commandEndTime": 1629734999211.4,
            "endTime": 1629734999211.6,
            "name": "bindVertexArray",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLVertexArrayObject",
                        "id": 1,
                        "displayText": "WebGLVertexArrayObject - ID: 1"
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15003:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "bindVertexArray: WebGLVertexArrayObject - ID: 1"
        },
        {
            "id": 15,
            "startTime": 1629734999211.6,
            "commandEndTime": 1629734999211.6,
            "endTime": 1629734999211.7,
            "name": "bindBuffer",
            "commandArguments": [
                34963,
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLBuffer",
                        "id": 5,
                        "displayText": "WebGLBuffer - ID: 5"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "target": "ELEMENT_ARRAY_BUFFER",
                        "length": 72,
                        "usage": 35048
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15008:7)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "bindBuffer: ELEMENT_ARRAY_BUFFER, WebGLBuffer - ID: 5"
        },
        {
            "id": 16,
            "startTime": 1629734999211.7,
            "commandEndTime": 1629734999211.7,
            "endTime": 1629734999211.9,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 1,
                        "displayText": "WebGLUniformLocation - ID: 1"
                    }
                },
                false,
                {
                    "0": -1,
                    "1": 1.2246468525851679e-16,
                    "2": 0,
                    "3": 0,
                    "4": 1.2246468525851679e-16,
                    "5": 1,
                    "6": 1.2246468525851679e-16,
                    "7": 0,
                    "8": 5.999039028884777e-32,
                    "9": 4.898587410340671e-16,
                    "10": -4,
                    "11": 0,
                    "12": 0,
                    "13": 0.5,
                    "14": 0,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 1, false, [..(16)..]"
        },
        {
            "id": 17,
            "startTime": 1629734999211.9,
            "commandEndTime": 1629734999211.9,
            "endTime": 1629734999220.5,
            "name": "drawElements",
            "commandArguments": [
                4,
                36,
                5123,
                0
            ],
            "stackTrace": [
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15101:9)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ShadowRenderer.submitCasters (https://code.playcanvas.com/playcanvas-stable.dbg.js:21827:26)",
                "ShadowRenderer.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:21863:11)"
            ],
            "status": 0,
            "marker": "SHADOW Light | Untitled # ",
            "text": "drawElements: TRIANGLES, 36, UNSIGNED_SHORT, 0",
            "BlendState": {
                "BLEND": false,
                "BLEND_COLOR": [
                    0,
                    0,
                    0,
                    0
                ],
                "BLEND_DST_ALPHA": "ZERO",
                "BLEND_DST_RGB": "ZERO",
                "BLEND_EQUATION_ALPHA": "FUNC_ADD",
                "BLEND_EQUATION_RGB": "FUNC_ADD",
                "BLEND_SRC_ALPHA": "ONE",
                "BLEND_SRC_RGB": "ONE"
            },
            "ColorState": {
                "COLOR_WRITEMASK": [
                    false,
                    false,
                    false,
                    false
                ]
            },
            "CoverageState": {
                "SAMPLE_COVERAGE_VALUE": 1,
                "SAMPLE_COVERAGE_INVERT": false,
                "SAMPLE_COVERAGE": false,
                "SAMPLE_ALPHA_TO_COVERAGE": false
            },
            "CullState": {
                "CULL_FACE": true,
                "CULL_FACE_MODE": "BACK"
            },
            "DepthState": {
                "DEPTH_TEST": true,
                "DEPTH_FUNC": "LEQUAL",
                "DEPTH_RANGE": [
                    0,
                    1
                ],
                "DEPTH_WRITEMASK": true
            },
            "DrawState": {
                "DITHER": true,
                "VIEWPORT": [
                    0,
                    0,
                    1024,
                    1024
                ],
                "FRONT_FACE": "CCW",
                "FRAGMENT_SHADER_DERIVATIVE_HINT_OES": "Extension OES_standard_derivatives is unavailble.",
                "RASTERIZER_DISCARD": false,
                "FRAGMENT_SHADER_DERIVATIVE_HINT": 4354
            },
            "PolygonOffsetState": {
                "POLYGON_OFFSET_FILL": true,
                "POLYGON_OFFSET_FACTOR": 2,
                "POLYGON_OFFSET_UNITS": 2
            },
            "ScissorState": {
                "SCISSOR_TEST": true,
                "SCISSOR_BOX": [
                    1,
                    1,
                    1022,
                    1022
                ]
            },
            "StencilState": {
                "STENCIL_TEST": false,
                "STENCIL_BACK_FAIL": "KEEP",
                "STENCIL_BACK_FUNC": "ALWAYS",
                "STENCIL_BACK_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_BACK_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_BACK_REF": 0,
                "STENCIL_BACK_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_BACK_WRITEMASK": "00000000000000000000000011111111",
                "STENCIL_FAIL": "KEEP",
                "STENCIL_FUNC": "ALWAYS",
                "STENCIL_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_REF": 0,
                "STENCIL_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_WRITEMASK": "00000000000000000000000011111111"
            },
            "VisualState": {
                "Attachments": [],
                "FrameBuffer": {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLFramebuffer",
                        "id": 0,
                        "displayText": "WebGLFramebuffer - ID: 0"
                    }
                },
                "FrameBufferStatus": "FRAMEBUFFER_COMPLETE"
            },
            "DrawCall": {
                "frameBuffer": {
                    "frameBuffer": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLFramebuffer",
                            "id": 0,
                            "displayText": "WebGLFramebuffer - ID: 0"
                        }
                    },
                    "depthAttachment": {
                        "type": "TEXTURE",
                        "texture": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLTexture",
                                "id": 0,
                                "displayText": "WebGLTexture - ID: 0"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "TEXTURE_2D",
                                "internalFormat": 36012,
                                "width": 1024,
                                "height": 1024,
                                "format": 6402,
                                "type": 5126,
                                "length": 4194304
                            }
                        },
                        "textureLevel": 0,
                        "textureCubeMapFace": "NONE",
                        "textureType": "FLOAT",
                        "format": "DEPTH_COMPONENT",
                        "internalFormat": "DEPTH_COMPONENT32F",
                        "width": 1024,
                        "height": 1024,
                        "alphaSize": 0,
                        "blueSize": 0,
                        "encoding": "LINEAR",
                        "componentType": "FLOAT",
                        "depthSize": 32,
                        "greenSize": 0,
                        "redSize": 0,
                        "stencilSize": 0,
                        "textureLayer": 0
                    },
                    "colorAttachments": []
                },
                "programStatus": {
                    "LINK_STATUS": true,
                    "VALIDATE_STATUS": false,
                    "program": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLProgram",
                            "id": 0,
                            "displayText": "WebGLProgram - ID: 0"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "programStatus": {
                                "LINK_STATUS": true,
                                "VALIDATE_STATUS": false
                            },
                            "shaders": [
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": false,
                                    "name": "Vertex",
                                    "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\n}",
                                    "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                                },
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": true,
                                    "name": "Fragment",
                                    "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvoid main(void)\n{\n\t float depth = gl_FragCoord.z;\n\t gl_FragColor = vec4(1.0);\n}\n",
                                    "translatedSource": "#version 450\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nvoid main(){\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_upc_fragColor = vec4(1.0, 1.0, 1.0, 1.0));\n}\n\u0000"
                                }
                            ],
                            "length": 4425
                        }
                    },
                    "RECOMPILABLE": false
                },
                "shaders": [
                    {
                        "COMPILE_STATUS": true,
                        "fragment": false,
                        "name": "Vertex",
                        "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\n}",
                        "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                    },
                    {
                        "COMPILE_STATUS": true,
                        "fragment": true,
                        "name": "Fragment",
                        "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvoid main(void)\n{\n\t float depth = gl_FragCoord.z;\n\t gl_FragColor = vec4(1.0);\n}\n",
                        "translatedSource": "#version 450\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nvoid main(){\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_upc_fragColor = vec4(1.0, 1.0, 1.0, 1.0));\n}\n\u0000"
                    }
                ],
                "elementArray": {
                    "arrayBuffer": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLBuffer",
                            "id": 5,
                            "displayText": "WebGLBuffer - ID: 5"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "target": "ELEMENT_ARRAY_BUFFER",
                            "length": 72,
                            "usage": 35048
                        }
                    }
                },
                "attributes": [
                    {
                        "name": "vertex_position",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": 0,
                        "offsetPointer": 192,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 4,
                                "displayText": "WebGLBuffer - ID: 4"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 1152,
                                "usage": 35048
                            }
                        },
                        "enabled": true,
                        "arraySize": 3,
                        "stride": 12,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "DYNAMIC_DRAW",
                        "bufferLength": 1152
                    }
                ],
                "uniforms": [
                    {
                        "name": "matrix_viewProjection",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 32,
                                "displayText": "WebGLUniformLocation - ID: 32"
                            }
                        },
                        "value": [
                            -0.04284273087978363,
                            -0.0302943866699934,
                            -0.11226990073919296,
                            0,
                            0,
                            0.04284273087978363,
                            -0.15877361595630646,
                            0,
                            -0.04284273087978363,
                            0.0302943866699934,
                            0.11226990073919296,
                            0,
                            -0.08203125,
                            0.01953124813735485,
                            0.06619937717914581,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "matrix_model",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 33,
                                "displayText": "WebGLUniformLocation - ID: 33"
                            }
                        },
                        "value": [
                            -1,
                            1.2246468525851679e-16,
                            0,
                            0,
                            1.2246468525851679e-16,
                            1,
                            1.2246468525851679e-16,
                            0,
                            5.999039028884777e-32,
                            4.898587410340671e-16,
                            -4,
                            0,
                            0,
                            0.5,
                            0,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    }
                ],
                "uniformBlocks": []
            }
        },
        {
            "id": 18,
            "startTime": 1629734999220.6,
            "commandEndTime": 1629734999220.6,
            "endTime": 1629734999220.9,
            "name": "disable",
            "commandArguments": [
                32823
            ],
            "stackTrace": [
                "GraphicsDevice.setDepthBias (https://code.playcanvas.com/playcanvas-stable.dbg.js:15292:13)",
                "ForwardRenderer.renderShadows (https://code.playcanvas.com/playcanvas-stable.dbg.js:22882:12)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23852:11)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 20,
            "marker": null,
            "text": "disable: POLYGON_OFFSET_FILL",
            "consumeCommandId": 32
        },
        {
            "id": 19,
            "startTime": 1629734999221,
            "commandEndTime": 1629734999221,
            "endTime": 1629734999221.1,
            "name": "bindFramebuffer",
            "commandArguments": [
                36160,
                null
            ],
            "stackTrace": [
                "GraphicsDevice.setFramebuffer (https://code.playcanvas.com/playcanvas-stable.dbg.js:14111:13)",
                "GraphicsDevice.updateBegin (https://code.playcanvas.com/playcanvas-stable.dbg.js:14328:10)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22313:11)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23891:12)"
            ],
            "status": 0,
            "marker": "Camera | World # ",
            "text": "bindFramebuffer: FRAMEBUFFER, null"
        },
        {
            "id": 20,
            "startTime": 1629734999221.1,
            "commandEndTime": 1629734999221.1,
            "endTime": 1629734999221.4,
            "name": "colorMask",
            "commandArguments": [
                true,
                true,
                true,
                true
            ],
            "stackTrace": [
                "GraphicsDevice.setColorWrite (https://code.playcanvas.com/playcanvas-stable.dbg.js:15233:13)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22316:12)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23891:12)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 40,
            "marker": "Camera | World # ",
            "text": "colorMask: true, true, true, true",
            "consumeCommandId": 32
        },
        {
            "id": 21,
            "startTime": 1629734999221.4,
            "commandEndTime": 1629734999221.4,
            "endTime": 1629734999221.5,
            "name": "viewport",
            "commandArguments": [
                0,
                0,
                1709,
                881
            ],
            "stackTrace": [
                "GraphicsDevice.setViewport (https://code.playcanvas.com/playcanvas-stable.dbg.js:14083:13)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22327:11)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23891:12)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 0,
            "marker": "Camera | World # ",
            "text": "viewport: 0, 0, 1709, 881"
        },
        {
            "id": 22,
            "startTime": 1629734999221.5,
            "commandEndTime": 1629734999221.5,
            "endTime": 1629734999221.7,
            "name": "scissor",
            "commandArguments": [
                0,
                0,
                1709,
                881
            ],
            "stackTrace": [
                "GraphicsDevice.setScissor (https://code.playcanvas.com/playcanvas-stable.dbg.js:14093:13)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22328:11)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23891:12)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 40,
            "marker": "Camera | World # ",
            "text": "scissor: 0, 0, 1709, 881",
            "consumeCommandId": 32
        },
        {
            "id": 23,
            "startTime": 1629734999221.7,
            "commandEndTime": 1629734999221.7,
            "endTime": 1629734999234.6,
            "name": "clear",
            "commandArguments": [
                17664
            ],
            "stackTrace": [
                "GraphicsDevice.clear (https://code.playcanvas.com/playcanvas-stable.dbg.js:15149:8)",
                "ForwardRenderer.clearView (https://code.playcanvas.com/playcanvas-stable.dbg.js:22332:12)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23891:12)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 0,
            "marker": "Camera | World # ",
            "text": "clear: DEPTH_BUFFER_BIT, STENCIL_BUFFER_BIT, COLOR_BUFFER_BIT",
            "ClearState": {
                "COLOR_CLEAR_VALUE": [
                    0.11800000071525574,
                    0.11800000071525574,
                    0.11800000071525574,
                    1
                ],
                "DEPTH_CLEAR_VALUE": 1,
                "STENCIL_CLEAR_VALUE": 0
            },
            "VisualState": {
                "Attachments": [
                    {
                        "attachmentName": "Canvas COLOR_ATTACHMENT",
                        "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACDCAYAAABiIcWkAAAAAXNSR0IArs4c6QAAA0pJREFUeF7t1AENACAMA0FmZP5dQoKNvznYtens7j2OAIGkwBiAZO6eJvAFDIAiEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLPHIhsQ/CLzYNAAAAAElFTkSuQmCC",
                        "textureCubeMapFace": null,
                        "textureLayer": 0
                    }
                ],
                "FrameBuffer": null
            }
        },
        {
            "id": 24,
            "startTime": 1629734999234.7,
            "commandEndTime": 1629734999234.7,
            "endTime": 1629734999235.3,
            "name": "useProgram",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLProgram",
                        "id": 1,
                        "displayText": "WebGLProgram - ID: 1"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "programStatus": {
                            "LINK_STATUS": true,
                            "VALIDATE_STATUS": false
                        },
                        "shaders": [
                            {
                                "COMPILE_STATUS": true,
                                "fragment": false,
                                "name": "Vertex",
                                "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nvarying vec2 vUv0;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef NINESLICED\nvec2 getUv0() {\n\tvec2 uv = vertex_position.xz;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tuv += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tuv = uv * -0.5 + 0.5;\n\tuv = uv * atlasRect.zw + atlasRect.xy;\n\n\tvMask = vertex_texCoord0.xy;\n\n\treturn uv;\n}\n#else\nvec2 getUv0() {\n\treturn vertex_texCoord0;\n}\n#endif\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n#ifdef MORPHING_TEXTURE_BASED_NORMAL\nuniform highp sampler2D morphNormalTex;\n#endif\n\nvec3 getNormal() {\n\t#ifdef SKIN\n\tdNormalMatrix = mat3(dModelMatrix[0].xyz, dModelMatrix[1].xyz, dModelMatrix[2].xyz);\n\t#elif defined(INSTANCING)\n\tdNormalMatrix = mat3(instance_line1.xyz, instance_line2.xyz, instance_line3.xyz);\n\t#else\n\tdNormalMatrix = matrix_normal;\n\t#endif\n\n\tvec3 tempNormal = vertex_normal;\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_NRM03\n\ttempNormal += morph_weights_a[0] * morph_nrm0;\n\ttempNormal += morph_weights_a[1] * morph_nrm1;\n\ttempNormal += morph_weights_a[2] * morph_nrm2;\n\ttempNormal += morph_weights_a[3] * morph_nrm3;\n\t#endif\n\t#ifdef MORPHING_NRM47\n\ttempNormal += morph_weights_b[0] * morph_nrm4;\n\ttempNormal += morph_weights_b[1] * morph_nrm5;\n\ttempNormal += morph_weights_b[2] * morph_nrm6;\n\ttempNormal += morph_weights_b[3] * morph_nrm7;\n\t#endif\n\t#endif\n\n\t#ifdef MORPHING_TEXTURE_BASED_NORMAL\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphNormal = texture2D(morphNormalTex, morphUV).xyz;\n\ttempNormal += morphNormal;\n\t#endif\n\n\treturn normalize(dNormalMatrix * tempNormal);\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\t vNormalW = getNormal();\n\t vec2 uv0 = getUv0();\n\t vUv0 = uv0;\n\n}",
                                "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nout vec3 _uvNormalW;\nout vec2 _uvUv0;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat3 _udNormalMatrix;\nvec2 _ugetUv0(){\nreturn _uvertex_texCoord0;\n}\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvec3 _ugetNormal(){\n(_udNormalMatrix = _umatrix_normal);\nvec3 _utempNormal = _uvertex_normal;\nreturn normalize((_udNormalMatrix * _utempNormal));\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvUv0 = vec2(0.0, 0.0));\n(_uvNormalW = vec3(0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n(_uvNormalW = _ugetNormal());\nvec2 _uuv0 = _ugetUv0();\n(_uvUv0 = _uuv0);\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n(_udNormalMatrix = mat3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                            },
                            {
                                "COMPILE_STATUS": true,
                                "fragment": true,
                                "name": "Fragment",
                                "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nvarying vec2 vUv0;\nuniform vec3 view_position;\n\nuniform vec3 light_globalAmbient;\n\nfloat square(float x) {\n\treturn x*x;\n}\n\nfloat saturate(float x) {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nvec3 saturate(vec3 x) {\n\treturn clamp(x, vec3(0.0), vec3(1.0));\n}\nvec3 detailMode_mul(vec3 c1, vec3 c2) {\n\treturn c1 * c2;\n}\n\nvec3 detailMode_add(vec3 c1, vec3 c2) {\n\treturn c1 + c2;\n}\n\n// https://en.wikipedia.org/wiki/Blend_modes#Screen\nvec3 detailMode_screen(vec3 c1, vec3 c2) {\n\treturn 1.0 - (1.0 - c1)*(1.0 - c2);\n}\n\n// https://en.wikipedia.org/wiki/Blend_modes#Overlay\nvec3 detailMode_overlay(vec3 c1, vec3 c2) {\n\treturn mix(1.0 - 2.0*(1.0 - c1)*(1.0 - c2), 2.0*c1*c2, step(c1, vec3(0.5)));\n}\n\nvec3 detailMode_min(vec3 c1, vec3 c2) {\n\treturn min(c1, c2);\n}\n\nvec3 detailMode_max(vec3 c1, vec3 c2) {\n\treturn max(c1, c2);\n}\nvec4 dReflection;\nvec3 dAlbedo;\nvec3 dNormalW;\nvec3 dVertexNormalW;\nvec3 dViewDirW;\nvec3 dReflDirW;\nvec3 dDiffuseLight;\nvec3 dSpecularLight;\nvec3 dLightDirNormW;\nvec3 dLightDirW;\nvec3 dLightPosW;\nvec3 dShadowCoord;\nvec3 dSpecularity;\nfloat dGlossiness;\nfloat dAlpha;\nfloat dAtten;\nvec4 ccReflection;\nvec3 ccNormalW;\nvec3 ccSpecularLight;\nfloat ccSpecularity;\nfloat ccGlossiness;\n#define AREA_LUTS_PRECISION highp\nuniform vec3 light0_color;\nuniform vec3 light0_direction;\nuniform mat4 light0_shadowMatrix;\nuniform mat4 light0_shadowMatrixPalette[4];\nuniform float light0_shadowCascadeDistances[4];\nuniform float light0_shadowCascadeCount;\nuniform vec3 light0_shadowParams;\nuniform sampler2DShadow light0_shadowMap;\n\nvoid getNormal() {\n\tdNormalW = normalize(dVertexNormalW);\n}\nvec3 gammaCorrectInput(vec3 color) {\n\treturn pow(color, vec3(2.2));\n}\n\nfloat gammaCorrectInput(float color) {\n\treturn pow(color, 2.2);\n}\n\nvec4 gammaCorrectInput(vec4 color) {\n\treturn vec4(pow(color.rgb, vec3(2.2)), color.a);\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv) {\n\tvec4 rgba = texture2D(tex, uv);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv, float bias) {\n\tvec4 rgba = texture2D(tex, uv, bias);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 textureCubeSRGB(samplerCube tex, vec3 uvw) {\n\tvec4 rgba = textureCube(tex, uvw);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec3 gammaCorrectOutput(vec3 color) {\n\t#ifdef HDR\n\treturn color;\n\t#else\n\tcolor += vec3(0.0000001);\n\treturn pow(color, vec3(0.45));\n\t#endif\n}\nuniform float exposure;\n\nvec3 toneMap(vec3 color) {\n\treturn color * exposure;\n}\nfloat dBlendModeFogFactor = 1.0;\n\nvec3 addFog(vec3 color) {\n\treturn color;\n}\n#ifdef CUBEMAP_ROTATION\nuniform mat3 cubeMapRotationMatrix;\n#endif\n\nvec3 cubeMapRotate(vec3 refDir) {\n#ifdef CUBEMAP_ROTATION\n\treturn refDir * cubeMapRotationMatrix;\n#else\n\treturn refDir;\n#endif\n}\nvec3 cubeMapProject(vec3 dir) {\n\treturn cubeMapRotate(dir);\n}\nvec3 processEnvironment(vec3 color) {\n\treturn color;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseDetailMap;\n#endif\n\nvec3 addAlbedoDetail(vec3 albedo) {\n\t#ifdef MAPTEXTURE\n\tvec3 albedoDetail = vec3(texture2D(texture_diffuseDetailMap, UV).CH);\n\treturn detailMode_mul(albedo, albedoDetail);\n\t#else\n\treturn albedo;\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n #define MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_diffuse;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseMap;\n#endif\n\nvoid getAlbedo() {\n\tdAlbedo = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdAlbedo *= material_diffuse.rgb;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdAlbedo *= gammaCorrectInput(addAlbedoDetail(texture2D(texture_diffuseMap, vUv0).rgb));\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdAlbedo *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_emissive;\n#endif\n\n#ifdef MAPFLOAT\nuniform float material_emissiveIntensity;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_emissiveMap;\n#endif\n\nvec3 getEmission() {\n\tvec3 emission = vec3(1.0);\n\n\t#ifdef MAPFLOAT\n\temission *= material_emissiveIntensity;\n\t#endif\n\n\t#ifdef MAPCOLOR\n\temission *= material_emissive;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\temission *= texture2DSAMPLE(texture_emissiveMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\temission *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n\n\treturn emission;\n}\nfloat antiAliasGlossiness(float power) {\n\treturn power;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_specular;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_specularMap;\n#endif\n\nvoid getSpecularity() {\n\tdSpecularity = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdSpecularity *= material_specular;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdSpecularity *= texture2D(texture_specularMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdSpecularity *= saturate(vVertexColor.VC);\n\t#endif\n}\n\n#undef MAPFLOAT\n #define MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPFLOAT\nuniform float material_shininess;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_glossMap;\n#endif\n\nvoid getGlossiness() {\n\tdGlossiness = 1.0;\n\n\t#ifdef MAPFLOAT\n\tdGlossiness *= material_shininess;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdGlossiness *= texture2D(texture_glossMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdGlossiness *= saturate(vVertexColor.VC);\n\t#endif\n\n\tdGlossiness += 0.0000001;\n}\n// Schlick's approximation\nuniform float material_fresnelFactor; // unused\n\nvoid getFresnel() {\n\tfloat fresnel = 1.0 - max(dot(dNormalW, dViewDirW), 0.0);\n\tfloat fresnel2 = fresnel * fresnel;\n\tfresnel *= fresnel2 * fresnel2;\n\tfresnel *= dGlossiness * dGlossiness;\n\tdSpecularity = dSpecularity + (1.0 - dSpecularity) * fresnel;\n\n\t#ifdef CLEARCOAT\n\tfresnel = 1.0 - max(dot(ccNormalW, dViewDirW), 0.0);\n\tfresnel2 = fresnel * fresnel;\n\tfresnel *= fresnel2 * fresnel2;\n\tfresnel *= ccGlossiness * ccGlossiness;\n\tccSpecularity = ccSpecularity + (1.0 - ccSpecularity) * fresnel;\n\t#endif\n}\nconst float maxCascades = 4.0;\n\n// shadow matrix for selected cascade\nmat4 cascadeShadowMat;\n\n// function which selects a shadow projection matrix based on cascade distances \nvoid getShadowCascadeMatrix(mat4 shadowMatrixPalette[4], float shadowCascadeDistances[4], float shadowCascadeCount) {\n\n\t// depth in 0 .. far plane range\n\tfloat depth = 1.0 / gl_FragCoord.w;\n\n\t// find cascade index based on the depth (loop as there is no per component vec compare operator in webgl)\n\tfloat cascadeIndex = 0.0;\n\tfor (float i = 0.0; i < maxCascades; i++) {\n\t\tif (depth < shadowCascadeDistances[int(i)]) {\n\t\t\tcascadeIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// limit to actual number of used cascades\n\tcascadeIndex = min(cascadeIndex, shadowCascadeCount - 1.0);\n\n\t// pick shadow matrix\n\t#ifdef GL2\n\t\tcascadeShadowMat = shadowMatrixPalette[int(cascadeIndex)];\n\t#else\n\t\t// webgl 1 does not allow non-cost index array lookup\n\t\tif (cascadeIndex == 0.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[0];\n\t\t}\n\t\telse if (cascadeIndex == 1.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[1];\n\t\t}\n\t\telse if (cascadeIndex == 2.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[2];\n\t\t}\n\t\telse {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[3];\n\t\t}\n\t#endif\n}\n\nvoid fadeShadow(float shadowCascadeDistances[4]) {\t\t\t\t  \n\n\t// if the pixel is past the shadow distance, remove shadow\n\t// this enforces straight line instead of corner of shadow which moves when camera rotates  \n\tfloat depth = 1.0 / gl_FragCoord.w;\n\tif (depth > shadowCascadeDistances[int(maxCascades - 1.0)]) {\n\t\tdShadowCoord.z = -9999999.0;\n\t}\n}\nvec3 lessThan2(vec3 a, vec3 b) {\n\treturn clamp((b - a)*1000.0, 0.0, 1.0); // softer version\n}\n\n#ifndef UNPACKFLOAT\n#define UNPACKFLOAT\nfloat unpackFloat(vec4 rgbaDepth) {\n\tconst vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\treturn dot(rgbaDepth, bitShift);\n}\n#endif\n\n// ----- Direct/Spot Sampling -----\n\n#ifdef GL2\nfloat _getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\tfloat z = dShadowCoord.z;\n\tvec2 uv = dShadowCoord.xy * shadowParams.x; // 1 unit - 1 texel\n\tfloat shadowMapSizeInv = 1.0 / shadowParams.x;\n\tvec2 base_uv = floor(uv + 0.5);\n\tfloat s = (uv.x + 0.5 - base_uv.x);\n\tfloat t = (uv.y + 0.5 - base_uv.y);\n\tbase_uv -= vec2(0.5);\n\tbase_uv *= shadowMapSizeInv;\n\n\tfloat sum = 0.0;\n\n\tfloat uw0 = (3.0 - 2.0 * s);\n\tfloat uw1 = (1.0 + 2.0 * s);\n\n\tfloat u0 = (2.0 - s) / uw0 - 1.0;\n\tfloat u1 = s / uw1 + 1.0;\n\n\tfloat vw0 = (3.0 - 2.0 * t);\n\tfloat vw1 = (1.0 + 2.0 * t);\n\n\tfloat v0 = (2.0 - t) / vw0 - 1.0;\n\tfloat v1 = t / vw1 + 1.0;\n\n\tu0 = u0 * shadowMapSizeInv + base_uv.x;\n\tv0 = v0 * shadowMapSizeInv + base_uv.y;\n\n\tu1 = u1 * shadowMapSizeInv + base_uv.x;\n\tv1 = v1 * shadowMapSizeInv + base_uv.y;\n\n\tsum += uw0 * vw0 * texture(shadowMap, vec3(u0, v0, z));\n\tsum += uw1 * vw0 * texture(shadowMap, vec3(u1, v0, z));\n\tsum += uw0 * vw1 * texture(shadowMap, vec3(u0, v1, z));\n\tsum += uw1 * vw1 * texture(shadowMap, vec3(u1, v1, z));\n\n\tsum *= 1.0f / 16.0;\n\treturn sum;\n}\n\nfloat getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2DShadow shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#else\nfloat _xgetShadowPCF3x3(mat3 depthKernel, sampler2D shadowMap, vec3 shadowParams) {\n\tmat3 shadowKernel;\n\tvec3 shadowCoord = dShadowCoord;\n\tvec3 shadowZ = vec3(shadowCoord.z);\n\tshadowKernel[0] = vec3(greaterThan(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(greaterThan(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(greaterThan(depthKernel[2], shadowZ));\n\n\tvec2 fractionalCoord = fract( shadowCoord.xy * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat _getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\tvec3 shadowCoord = dShadowCoord;\n\n\tfloat xoffset = 1.0 / shadowParams.x; // 1/shadow map width\n\tfloat dx0 = -xoffset;\n\tfloat dx1 = xoffset;\n\n\tmat3 depthKernel;\n\tdepthKernel[0][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx0)));\n\tdepthKernel[0][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, 0.0)));\n\tdepthKernel[0][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx1)));\n\tdepthKernel[1][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx0)));\n\tdepthKernel[1][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy));\n\tdepthKernel[1][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx1)));\n\tdepthKernel[2][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx0)));\n\tdepthKernel[2][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, 0.0)));\n\tdepthKernel[2][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx1)));\n\n\treturn _xgetShadowPCF3x3(depthKernel, shadowMap, shadowParams);\n}\n\nfloat getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2D shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#endif\n\n\n// ----- Point Sampling -----\n\nfloat _getShadowPoint(samplerCube shadowMap, vec4 shadowParams, vec3 dir) {\n\n\tvec3 tc = normalize(dir);\n\tvec3 tcAbs = abs(tc);\n\n\tvec4 dirX = vec4(1,0,0, tc.x);\n\tvec4 dirY = vec4(0,1,0, tc.y);\n\tfloat majorAxisLength = tc.z;\n\tif ((tcAbs.x > tcAbs.y) && (tcAbs.x > tcAbs.z)) {\n\t\tdirX = vec4(0,0,1, tc.z);\n\t\tdirY = vec4(0,1,0, tc.y);\n\t\tmajorAxisLength = tc.x;\n\t} else if ((tcAbs.y > tcAbs.x) && (tcAbs.y > tcAbs.z)) {\n\t\tdirX = vec4(1,0,0, tc.x);\n\t\tdirY = vec4(0,0,1, tc.z);\n\t\tmajorAxisLength = tc.y;\n\t}\n\n\tfloat shadowParamsInFaceSpace = ((1.0/shadowParams.x) * 2.0) * abs(majorAxisLength);\n\n\tvec3 xoffset = (dirX.xyz * shadowParamsInFaceSpace);\n\tvec3 yoffset = (dirY.xyz * shadowParamsInFaceSpace);\n\tvec3 dx0 = -xoffset;\n\tvec3 dy0 = -yoffset;\n\tvec3 dx1 = xoffset;\n\tvec3 dy1 = yoffset;\n\n\tmat3 shadowKernel;\n\tmat3 depthKernel;\n\n\tdepthKernel[0][0] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy0));\n\tdepthKernel[0][1] = unpackFloat(textureCube(shadowMap, tc + dx0));\n\tdepthKernel[0][2] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy1));\n\tdepthKernel[1][0] = unpackFloat(textureCube(shadowMap, tc + dy0));\n\tdepthKernel[1][1] = unpackFloat(textureCube(shadowMap, tc));\n\tdepthKernel[1][2] = unpackFloat(textureCube(shadowMap, tc + dy1));\n\tdepthKernel[2][0] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy0));\n\tdepthKernel[2][1] = unpackFloat(textureCube(shadowMap, tc + dx1));\n\tdepthKernel[2][2] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy1));\n\n\tvec3 shadowZ = vec3(length(dir) * shadowParams.w + shadowParams.z);\n\n\tshadowKernel[0] = vec3(lessThan2(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(lessThan2(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(lessThan2(depthKernel[2], shadowZ));\n\n\tvec2 uv = (vec2(dirX.w, dirY.w) / abs(majorAxisLength)) * 0.5;\n\n\tvec2 fractionalCoord = fract( uv * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn 1.0 - dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat getShadowPointPCF3x3(samplerCube shadowMap, vec4 shadowParams) {\n\treturn _getShadowPoint(shadowMap, shadowParams, dLightDirW);\n}\nvoid _getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams, vec3 wPos) {\n\tdShadowCoord = (shadowMatrix * vec4(wPos, 1.0)).xyz;\n\tdShadowCoord.z = saturate(dShadowCoord.z) - 0.0001;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid _getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n\tvec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n\tprojPos.xy /= projPos.w;\n\tdShadowCoord.xy = projPos.xy;\n\tdShadowCoord.z = length(dLightDirW) * shadowParams.w;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams) {\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams) {\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPerspNormalOffset(mat4 shadowMatrix, vec4 shadowParams) {\n\tfloat distScale = abs(dot(vPositionW - dLightPosW, dLightDirNormW)); // fov?\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale;\n\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, wPos);\n}\n\nvoid getShadowCoordOrthoNormalOffset(mat4 shadowMatrix, vec3 shadowParams) {\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0); //0.08\n\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, wPos);\n}\nvoid normalOffsetPointShadow(vec4 shadowParams) {\n\tfloat distScale = length(dLightDirW);\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale; //0.02\n\tvec3 dir = wPos - dLightPosW;\n\tdLightDirW = dir;\n}\nfloat getLightDiffuse() {\n\treturn max(dot(dNormalW, -dLightDirNormW), 0.0);\n}\n// Energy-conserving (hopefully) Blinn-Phong\nfloat calcLightSpecular(float tGlossiness, vec3 tNormalW) {\n\tvec3 h = normalize( -dLightDirNormW + dViewDirW );\n\tfloat nh = max( dot( h, tNormalW ), 0.0 );\n\n\tfloat specPow = exp2(tGlossiness * 11.0); // glossiness is linear, power is not; 0 - 2048\n\tspecPow = antiAliasGlossiness(specPow);\n\n\t// Hack: On Mac OS X, calling pow with zero for the exponent generates hideous artifacts so bias up a little\n\tspecPow = max(specPow, 0.0001);\n\n\treturn pow(nh, specPow) * (specPow + 2.0) / 8.0;\n}\n\nfloat getLightSpecular() {\n\treturn calcLightSpecular(dGlossiness, dNormalW);\n}\n\nfloat getLightSpecularCC() {\n\treturn calcLightSpecular(ccGlossiness, ccNormalW);\n}\nvec3 combineColor() {\n\treturn mix(dAlbedo * dDiffuseLight, dSpecularLight + dReflection.rgb * dReflection.a, dSpecularity);\n}\nvoid addAmbient() {\n\tdDiffuseLight += light_globalAmbient;\n}\nvoid getViewDir() {\n\tdViewDirW = normalize(view_position - vPositionW);\n}\nvoid getReflDir() {\n\tdReflDirW = normalize(-reflect(dViewDirW, dNormalW));\n}\nvoid main(void) {\n\tdDiffuseLight = vec3(0);\n\tdSpecularLight = vec3(0);\n\tdReflection = vec4(0);\n\tdSpecularity = vec3(0);\n\n\t#ifdef CLEARCOAT\n\tccSpecularLight = vec3(0);\n\tccReflection = vec4(0);\n\t#endif\n\t dVertexNormalW = normalize(vNormalW);\n\t dAlpha = 1.0;\n\t getViewDir();\n\t getNormal();\n\t getReflDir();\n\t getAlbedo();\n\t getSpecularity();\n\t getGlossiness();\n\t getFresnel();\n\t addAmbient();\n\t dLightDirNormW = light0_direction;\n\t dAtten = 1.0;\n\t\t\t dAtten *= getLightDiffuse();\ngetShadowCoordOrthoNormalOffset(light0_shadowMatrix, light0_shadowParams);\nfadeShadow(light0_shadowCascadeDistances);\n\t\t\t dAtten *= getShadowPCF3x3(light0_shadowMap, light0_shadowParams);\n\t\t\t dDiffuseLight += dAtten * light0_color;\n\t\t\t dSpecularLight += getLightSpecular() * dAtten * light0_color;\n\n\n\t#ifdef CLEARCOAT\n\tgl_FragColor.rgb = combineColorCC();\n\t#else\n\tgl_FragColor.rgb = combineColor();\n\t#endif \n\n\tgl_FragColor.rgb += getEmission();\n\tgl_FragColor.rgb = addFog(gl_FragColor.rgb);\n\n\t#ifndef HDR\n\tgl_FragColor.rgb = toneMap(gl_FragColor.rgb);\n\tgl_FragColor.rgb = gammaCorrectOutput(gl_FragColor.rgb);\n\t#endif\ngl_FragColor.a = 1.0;\n\n}\n",
                                "translatedSource": "#version 450\nvoid initGlobals();\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nin vec3 _uvNormalW;\nin vec2 _uvUv0;\nuniform vec3 _uview_position;\nuniform vec3 _ulight_globalAmbient;\nfloat _usaturate(in float _ux){\nreturn clamp(_ux, 0.0, 1.0);\n}\nvec4 _udReflection;\nvec3 _udAlbedo;\nvec3 _udNormalW;\nvec3 _udVertexNormalW;\nvec3 _udViewDirW;\nvec3 _udReflDirW;\nvec3 _udDiffuseLight;\nvec3 _udSpecularLight;\nvec3 _udLightDirNormW;\nvec3 _udShadowCoord;\nvec3 _udSpecularity;\nfloat _udGlossiness;\nfloat _udAlpha;\nfloat _udAtten;\nuniform vec3 _ulight0_color;\nuniform vec3 _ulight0_direction;\nuniform mat4 _ulight0_shadowMatrix;\nuniform mat4 _ulight0_shadowMatrixPalette[4];\nuniform float _ulight0_shadowCascadeDistances[4];\nuniform float _ulight0_shadowCascadeCount;\nuniform vec3 _ulight0_shadowParams;\nuniform sampler2DShadow _ulight0_shadowMap;\nvoid _ugetNormal(){\n(_udNormalW = normalize(_udVertexNormalW));\n}\nvec3 _ugammaCorrectInput(in vec3 _ucolor){\nreturn pow(_ucolor, vec3(2.2, 2.2, 2.2));\n}\nvec3 _ugammaCorrectOutput(in vec3 _ucolor){\n(_ucolor += vec3(1e-07, 1e-07, 1e-07));\nreturn pow(_ucolor, vec3(0.44999999, 0.44999999, 0.44999999));\n}\nuniform float _uexposure;\nvec3 _utoneMap(in vec3 _ucolor){\nreturn (_ucolor * _uexposure);\n}\nvec3 _uaddFog(in vec3 _ucolor){\nreturn _ucolor;\n}\nvec3 _uaddAlbedoDetail(in vec3 _ualbedo){\nreturn _ualbedo;\n}\nuniform sampler2D _utexture_diffuseMap;\nvoid _ugetAlbedo(){\n(_udAlbedo = vec3(1.0, 1.0, 1.0));\n(_udAlbedo *= _ugammaCorrectInput(_uaddAlbedoDetail(texture(_utexture_diffuseMap, _uvUv0).xyz)));\n}\nuniform vec3 _umaterial_emissive;\nvec3 _ugetEmission(){\nvec3 _uemission = vec3(1.0, 1.0, 1.0);\n(_uemission *= _umaterial_emissive);\nreturn _uemission;\n}\nfloat _uantiAliasGlossiness(in float _upower){\nreturn _upower;\n}\nuniform vec3 _umaterial_specular;\nvoid _ugetSpecularity(){\n(_udSpecularity = vec3(1.0, 1.0, 1.0));\n(_udSpecularity *= _umaterial_specular);\n}\nuniform float _umaterial_shininess;\nvoid _ugetGlossiness(){\n(_udGlossiness = 1.0);\n(_udGlossiness *= _umaterial_shininess);\n(_udGlossiness += 1e-07);\n}\nuniform float _umaterial_fresnelFactor;\nvoid _ugetFresnel(){\nfloat _ufresnel = (1.0 - max(dot(_udNormalW, _udViewDirW), 0.0));\nfloat _ufresnel2 = (_ufresnel * _ufresnel);\n(_ufresnel *= (_ufresnel2 * _ufresnel2));\n(_ufresnel *= (_udGlossiness * _udGlossiness));\n(_udSpecularity = (_udSpecularity + ((1.0 - _udSpecularity) * _ufresnel)));\n}\nvoid _ufadeShadow(in float _ushadowCascadeDistances[4]){\nfloat _udepth = (1.0 / gl_FragCoord.w);\nif ((_udepth > _ushadowCascadeDistances[3]))\n{\n(_udShadowCoord.z = -9999999.0);\n}\n}\nfloat _u_getShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nfloat _uz = _udShadowCoord.z;\nvec2 _uuv = (_udShadowCoord.xy * _ushadowParams.x);\nfloat _ushadowMapSizeInv = (1.0 / _ushadowParams.x);\nvec2 _ubase_uv = floor((_uuv + vec2(0.5, 0.5)));\nfloat _us = ((_uuv.x + 0.5) - _ubase_uv.x);\nfloat _ut = ((_uuv.y + 0.5) - _ubase_uv.y);\n(_ubase_uv -= vec2(0.5, 0.5));\n(_ubase_uv *= _ushadowMapSizeInv);\nfloat _usum = 0.0;\nfloat _uuw0 = (3.0 - (2.0 * _us));\nfloat _uuw1 = (1.0 + (2.0 * _us));\nfloat _uu0 = (((2.0 - _us) / _uuw0) - 1.0);\nfloat _uu1 = ((_us / _uuw1) + 1.0);\nfloat _uvw0 = (3.0 - (2.0 * _ut));\nfloat _uvw1 = (1.0 + (2.0 * _ut));\nfloat _uv0 = (((2.0 - _ut) / _uvw0) - 1.0);\nfloat _uv1 = ((_ut / _uvw1) + 1.0);\n(_uu0 = ((_uu0 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv0 = ((_uv0 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_uu1 = ((_uu1 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv1 = ((_uv1 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_usum += ((_uuw0 * _uvw0) * texture(_ushadowMap, vec3(_uu0, _uv0, _uz))));\n(_usum += ((_uuw1 * _uvw0) * texture(_ushadowMap, vec3(_uu1, _uv0, _uz))));\n(_usum += ((_uuw0 * _uvw1) * texture(_ushadowMap, vec3(_uu0, _uv1, _uz))));\n(_usum += ((_uuw1 * _uvw1) * texture(_ushadowMap, vec3(_uu1, _uv1, _uz))));\n(_usum *= 0.0625);\nreturn _usum;\n}\nfloat _ugetShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nreturn _u_getShadowPCF3x3(_ushadowMap, _ushadowParams);\n}\nvoid _u_getShadowCoordOrtho(in mat4 _ushadowMatrix, in vec3 _ushadowParams, in vec3 _uwPos){\n(_udShadowCoord = (_ushadowMatrix * vec4(_uwPos, 1.0)).xyz);\n(_udShadowCoord.z = (_usaturate(_udShadowCoord.z) - 9.9999997e-05));\n}\nvoid _ugetShadowCoordOrthoNormalOffset(in mat4 _ushadowMatrix, in vec3 _ushadowParams){\nvec3 _uwPos = (_uvPositionW + ((_udVertexNormalW * _ushadowParams.y) * clamp((1.0 - dot(_udVertexNormalW, (-_udLightDirNormW))), 0.0, 1.0)));\n_u_getShadowCoordOrtho(_ushadowMatrix, _ushadowParams, _uwPos);\n}\nfloat _ugetLightDiffuse(){\nreturn max(dot(_udNormalW, (-_udLightDirNormW)), 0.0);\n}\nfloat _ucalcLightSpecular(in float _utGlossiness, in vec3 _utNormalW){\nvec3 _uh = normalize(((-_udLightDirNormW) + _udViewDirW));\nfloat _unh = max(dot(_uh, _utNormalW), 0.0);\nfloat _uspecPow = exp2((_utGlossiness * 11.0));\n(_uspecPow = _uantiAliasGlossiness(_uspecPow));\n(_uspecPow = max(_uspecPow, 9.9999997e-05));\nreturn ((pow(_unh, _uspecPow) * (_uspecPow + 2.0)) / 8.0);\n}\nfloat _ugetLightSpecular(){\nreturn _ucalcLightSpecular(_udGlossiness, _udNormalW);\n}\nvec3 _ucombineColor(){\nreturn mix((_udAlbedo * _udDiffuseLight), (_udSpecularLight + (_udReflection.xyz * _udReflection.w)), _udSpecularity);\n}\nvoid _uaddAmbient(){\n(_udDiffuseLight += _ulight_globalAmbient);\n}\nvoid _ugetViewDir(){\n(_udViewDirW = normalize((_uview_position - _uvPositionW)));\n}\nvoid _ugetReflDir(){\n(_udReflDirW = normalize((-reflect(_udViewDirW, _udNormalW))));\n}\nvoid main(){\ninitGlobals();\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = normalize(_uvNormalW));\n(_udAlpha = 1.0);\n_ugetViewDir();\n_ugetNormal();\n_ugetReflDir();\n_ugetAlbedo();\n_ugetSpecularity();\n_ugetGlossiness();\n_ugetFresnel();\n_uaddAmbient();\n(_udLightDirNormW = _ulight0_direction);\n(_udAtten = 1.0);\n(_udAtten *= _ugetLightDiffuse());\n_ugetShadowCoordOrthoNormalOffset(_ulight0_shadowMatrix, _ulight0_shadowParams);\n_ufadeShadow(_ulight0_shadowCascadeDistances);\n(_udAtten *= _ugetShadowPCF3x3(_ulight0_shadowMap, _ulight0_shadowParams));\n(_udDiffuseLight += (_udAtten * _ulight0_color));\n(_udSpecularLight += ((_ugetLightSpecular() * _udAtten) * _ulight0_color));\n(_upc_fragColor.xyz = _ucombineColor());\n(_upc_fragColor.xyz += _ugetEmission());\n(_upc_fragColor.xyz = _uaddFog(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _utoneMap(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _ugammaCorrectOutput(_upc_fragColor.xyz));\n(_upc_fragColor.w = 1.0);\n}\nvoid initGlobals(){\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udAlbedo = vec3(0.0, 0.0, 0.0));\n(_udNormalW = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = vec3(0.0, 0.0, 0.0));\n(_udViewDirW = vec3(0.0, 0.0, 0.0));\n(_udReflDirW = vec3(0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udLightDirNormW = vec3(0.0, 0.0, 0.0));\n(_udShadowCoord = vec3(0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udGlossiness = 0.0);\n(_udAlpha = 0.0);\n(_udAtten = 0.0);\n}\n\u0000"
                            }
                        ],
                        "length": 24282
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setShader (https://code.playcanvas.com/playcanvas-stable.dbg.js:15674:13)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23060:53)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23913:11)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 0,
            "marker": "Camera | World # ",
            "text": "useProgram: WebGLProgram - ID: 1"
        },
        {
            "id": 25,
            "startTime": 1629734999235.3,
            "commandEndTime": 1629734999235.3,
            "endTime": 1629734999235.4,
            "name": "bindVertexArray",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLVertexArrayObject",
                        "id": 1,
                        "displayText": "WebGLVertexArrayObject - ID: 1"
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15003:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "bindVertexArray: WebGLVertexArrayObject - ID: 1"
        },
        {
            "id": 26,
            "startTime": 1629734999235.4,
            "commandEndTime": 1629734999235.4,
            "endTime": 1629734999235.6,
            "name": "bindBuffer",
            "commandArguments": [
                34963,
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLBuffer",
                        "id": 5,
                        "displayText": "WebGLBuffer - ID: 5"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "target": "ELEMENT_ARRAY_BUFFER",
                        "length": 72,
                        "usage": 35048
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15008:7)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "bindBuffer: ELEMENT_ARRAY_BUFFER, WebGLBuffer - ID: 5"
        },
        {
            "id": 27,
            "startTime": 1629734999235.6,
            "commandEndTime": 1629734999235.6,
            "endTime": 1629734999235.7,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 2,
                        "displayText": "WebGLUniformLocation - ID: 2"
                    }
                },
                false,
                {
                    "0": 0.8800240159034729,
                    "1": -0.8535534143447876,
                    "2": -0.6124948859214783,
                    "3": -0.6123723983764648,
                    "4": 0,
                    "5": 2.0907704830169678,
                    "6": -0.5001000165939331,
                    "7": -0.5,
                    "8": -0.8800240159034729,
                    "9": -0.8535534143447876,
                    "10": -0.6124948859214783,
                    "11": -0.6123723983764648,
                    "12": 0,
                    "13": -0.4892691373825073,
                    "14": 6.450289249420166,
                    "15": 6.648979187011719
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 2, false, [..(16)..]"
        },
        {
            "id": 28,
            "startTime": 1629734999235.7,
            "commandEndTime": 1629734999235.7,
            "endTime": 1629734999235.8,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 3,
                        "displayText": "WebGLUniformLocation - ID: 3"
                    }
                },
                false,
                {
                    "0": -1,
                    "1": 1.2246468525851679e-16,
                    "2": 0,
                    "3": 0,
                    "4": 1.2246468525851679e-16,
                    "5": 1,
                    "6": 1.2246468525851679e-16,
                    "7": 0,
                    "8": 5.999039028884777e-32,
                    "9": 4.898587410340671e-16,
                    "10": -4,
                    "11": 0,
                    "12": 0,
                    "13": 0.5,
                    "14": 0,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 3, false, [..(16)..]"
        },
        {
            "id": 29,
            "startTime": 1629734999235.8,
            "commandEndTime": 1629734999235.8,
            "endTime": 1629734999235.8,
            "name": "uniformMatrix3fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 4,
                        "displayText": "WebGLUniformLocation - ID: 4"
                    }
                },
                false,
                {
                    "0": -1,
                    "1": 1.2246468525851679e-16,
                    "2": 1.563254935637622e-39,
                    "3": 1.2246468525851679e-16,
                    "4": 1,
                    "5": 1.2246468525851679e-16,
                    "6": 3.74939976039497e-33,
                    "7": 3.0616171314629196e-17,
                    "8": -0.25
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13570:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix3fv: WebGLUniformLocation - ID: 4, false, [..(9)..]"
        },
        {
            "id": 30,
            "startTime": 1629734999235.9,
            "commandEndTime": 1629734999235.9,
            "endTime": 1629734999236.2,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 9,
                        "displayText": "WebGLUniformLocation - ID: 9"
                    }
                },
                false,
                {
                    "0": -0.021421365439891815,
                    "1": -0.0151471933349967,
                    "2": -0.05613495036959648,
                    "3": 0,
                    "4": 0,
                    "5": 0.021421365439891815,
                    "6": -0.07938680797815323,
                    "7": 0,
                    "8": -0.021421365439891815,
                    "9": 0.0151471933349967,
                    "10": 0.05613495036959648,
                    "11": 0,
                    "12": 0.458984375,
                    "13": 0.509765625,
                    "14": 0.5330997109413147,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 9, false, [..(16)..]"
        },
        {
            "id": 31,
            "startTime": 1629734999236.2,
            "commandEndTime": 1629734999236.2,
            "endTime": 1629734999236.4,
            "name": "uniform1fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 10,
                        "displayText": "WebGLUniformLocation - ID: 10"
                    }
                },
                {
                    "0": 16,
                    "1": 16,
                    "2": 16,
                    "3": 16
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13578:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniform1fv: WebGLUniformLocation - ID: 10, [..(4)..]"
        },
        {
            "id": 32,
            "startTime": 1629734999236.4,
            "commandEndTime": 1629734999236.4,
            "endTime": 1629734999261.1,
            "name": "drawElements",
            "commandArguments": [
                4,
                36,
                5123,
                0
            ],
            "stackTrace": [
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15101:9)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23913:11)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "drawElements: TRIANGLES, 36, UNSIGNED_SHORT, 0",
            "BlendState": {
                "BLEND": false,
                "BLEND_COLOR": [
                    0,
                    0,
                    0,
                    0
                ],
                "BLEND_DST_ALPHA": "ZERO",
                "BLEND_DST_RGB": "ZERO",
                "BLEND_EQUATION_ALPHA": "FUNC_ADD",
                "BLEND_EQUATION_RGB": "FUNC_ADD",
                "BLEND_SRC_ALPHA": "ONE",
                "BLEND_SRC_RGB": "ONE"
            },
            "ColorState": {
                "COLOR_WRITEMASK": [
                    true,
                    true,
                    true,
                    true
                ],
                "validCommandIds": [
                    20
                ]
            },
            "CoverageState": {
                "SAMPLE_COVERAGE_VALUE": 1,
                "SAMPLE_COVERAGE_INVERT": false,
                "SAMPLE_COVERAGE": false,
                "SAMPLE_ALPHA_TO_COVERAGE": false
            },
            "CullState": {
                "CULL_FACE": true,
                "CULL_FACE_MODE": "BACK"
            },
            "DepthState": {
                "DEPTH_TEST": true,
                "DEPTH_FUNC": "LEQUAL",
                "DEPTH_RANGE": [
                    0,
                    1
                ],
                "DEPTH_WRITEMASK": true
            },
            "DrawState": {
                "DITHER": true,
                "VIEWPORT": [
                    0,
                    0,
                    1709,
                    881
                ],
                "FRONT_FACE": "CCW",
                "FRAGMENT_SHADER_DERIVATIVE_HINT_OES": "Extension OES_standard_derivatives is unavailble.",
                "RASTERIZER_DISCARD": false,
                "FRAGMENT_SHADER_DERIVATIVE_HINT": 4354
            },
            "PolygonOffsetState": {
                "POLYGON_OFFSET_FILL": false,
                "POLYGON_OFFSET_FACTOR": 2,
                "POLYGON_OFFSET_UNITS": 2,
                "disabledCommandIds": [
                    18
                ]
            },
            "ScissorState": {
                "SCISSOR_TEST": true,
                "SCISSOR_BOX": [
                    0,
                    0,
                    1709,
                    881
                ],
                "validCommandIds": [
                    22
                ]
            },
            "StencilState": {
                "STENCIL_TEST": false,
                "STENCIL_BACK_FAIL": "KEEP",
                "STENCIL_BACK_FUNC": "ALWAYS",
                "STENCIL_BACK_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_BACK_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_BACK_REF": 0,
                "STENCIL_BACK_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_BACK_WRITEMASK": "00000000000000000000000011111111",
                "STENCIL_FAIL": "KEEP",
                "STENCIL_FUNC": "ALWAYS",
                "STENCIL_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_REF": 0,
                "STENCIL_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_WRITEMASK": "00000000000000000000000011111111"
            },
            "VisualState": {
                "Attachments": [
                    {
                        "attachmentName": "Canvas COLOR_ATTACHMENT",
                        "src": "data:image/png;base64,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",
                        "textureCubeMapFace": null,
                        "textureLayer": 0
                    }
                ],
                "FrameBuffer": null
            },
            "DrawCall": {
                "frameBuffer": null,
                "programStatus": {
                    "LINK_STATUS": true,
                    "VALIDATE_STATUS": false,
                    "program": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLProgram",
                            "id": 1,
                            "displayText": "WebGLProgram - ID: 1"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "programStatus": {
                                "LINK_STATUS": true,
                                "VALIDATE_STATUS": false
                            },
                            "shaders": [
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": false,
                                    "name": "Vertex",
                                    "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nvarying vec2 vUv0;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef NINESLICED\nvec2 getUv0() {\n\tvec2 uv = vertex_position.xz;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tuv += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tuv = uv * -0.5 + 0.5;\n\tuv = uv * atlasRect.zw + atlasRect.xy;\n\n\tvMask = vertex_texCoord0.xy;\n\n\treturn uv;\n}\n#else\nvec2 getUv0() {\n\treturn vertex_texCoord0;\n}\n#endif\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n#ifdef MORPHING_TEXTURE_BASED_NORMAL\nuniform highp sampler2D morphNormalTex;\n#endif\n\nvec3 getNormal() {\n\t#ifdef SKIN\n\tdNormalMatrix = mat3(dModelMatrix[0].xyz, dModelMatrix[1].xyz, dModelMatrix[2].xyz);\n\t#elif defined(INSTANCING)\n\tdNormalMatrix = mat3(instance_line1.xyz, instance_line2.xyz, instance_line3.xyz);\n\t#else\n\tdNormalMatrix = matrix_normal;\n\t#endif\n\n\tvec3 tempNormal = vertex_normal;\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_NRM03\n\ttempNormal += morph_weights_a[0] * morph_nrm0;\n\ttempNormal += morph_weights_a[1] * morph_nrm1;\n\ttempNormal += morph_weights_a[2] * morph_nrm2;\n\ttempNormal += morph_weights_a[3] * morph_nrm3;\n\t#endif\n\t#ifdef MORPHING_NRM47\n\ttempNormal += morph_weights_b[0] * morph_nrm4;\n\ttempNormal += morph_weights_b[1] * morph_nrm5;\n\ttempNormal += morph_weights_b[2] * morph_nrm6;\n\ttempNormal += morph_weights_b[3] * morph_nrm7;\n\t#endif\n\t#endif\n\n\t#ifdef MORPHING_TEXTURE_BASED_NORMAL\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphNormal = texture2D(morphNormalTex, morphUV).xyz;\n\ttempNormal += morphNormal;\n\t#endif\n\n\treturn normalize(dNormalMatrix * tempNormal);\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\t vNormalW = getNormal();\n\t vec2 uv0 = getUv0();\n\t vUv0 = uv0;\n\n}",
                                    "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nout vec3 _uvNormalW;\nout vec2 _uvUv0;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat3 _udNormalMatrix;\nvec2 _ugetUv0(){\nreturn _uvertex_texCoord0;\n}\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvec3 _ugetNormal(){\n(_udNormalMatrix = _umatrix_normal);\nvec3 _utempNormal = _uvertex_normal;\nreturn normalize((_udNormalMatrix * _utempNormal));\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvUv0 = vec2(0.0, 0.0));\n(_uvNormalW = vec3(0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n(_uvNormalW = _ugetNormal());\nvec2 _uuv0 = _ugetUv0();\n(_uvUv0 = _uuv0);\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n(_udNormalMatrix = mat3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                                },
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": true,
                                    "name": "Fragment",
                                    "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nvarying vec2 vUv0;\nuniform vec3 view_position;\n\nuniform vec3 light_globalAmbient;\n\nfloat square(float x) {\n\treturn x*x;\n}\n\nfloat saturate(float x) {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nvec3 saturate(vec3 x) {\n\treturn clamp(x, vec3(0.0), vec3(1.0));\n}\nvec3 detailMode_mul(vec3 c1, vec3 c2) {\n\treturn c1 * c2;\n}\n\nvec3 detailMode_add(vec3 c1, vec3 c2) {\n\treturn c1 + c2;\n}\n\n// https://en.wikipedia.org/wiki/Blend_modes#Screen\nvec3 detailMode_screen(vec3 c1, vec3 c2) {\n\treturn 1.0 - (1.0 - c1)*(1.0 - c2);\n}\n\n// https://en.wikipedia.org/wiki/Blend_modes#Overlay\nvec3 detailMode_overlay(vec3 c1, vec3 c2) {\n\treturn mix(1.0 - 2.0*(1.0 - c1)*(1.0 - c2), 2.0*c1*c2, step(c1, vec3(0.5)));\n}\n\nvec3 detailMode_min(vec3 c1, vec3 c2) {\n\treturn min(c1, c2);\n}\n\nvec3 detailMode_max(vec3 c1, vec3 c2) {\n\treturn max(c1, c2);\n}\nvec4 dReflection;\nvec3 dAlbedo;\nvec3 dNormalW;\nvec3 dVertexNormalW;\nvec3 dViewDirW;\nvec3 dReflDirW;\nvec3 dDiffuseLight;\nvec3 dSpecularLight;\nvec3 dLightDirNormW;\nvec3 dLightDirW;\nvec3 dLightPosW;\nvec3 dShadowCoord;\nvec3 dSpecularity;\nfloat dGlossiness;\nfloat dAlpha;\nfloat dAtten;\nvec4 ccReflection;\nvec3 ccNormalW;\nvec3 ccSpecularLight;\nfloat ccSpecularity;\nfloat ccGlossiness;\n#define AREA_LUTS_PRECISION highp\nuniform vec3 light0_color;\nuniform vec3 light0_direction;\nuniform mat4 light0_shadowMatrix;\nuniform mat4 light0_shadowMatrixPalette[4];\nuniform float light0_shadowCascadeDistances[4];\nuniform float light0_shadowCascadeCount;\nuniform vec3 light0_shadowParams;\nuniform sampler2DShadow light0_shadowMap;\n\nvoid getNormal() {\n\tdNormalW = normalize(dVertexNormalW);\n}\nvec3 gammaCorrectInput(vec3 color) {\n\treturn pow(color, vec3(2.2));\n}\n\nfloat gammaCorrectInput(float color) {\n\treturn pow(color, 2.2);\n}\n\nvec4 gammaCorrectInput(vec4 color) {\n\treturn vec4(pow(color.rgb, vec3(2.2)), color.a);\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv) {\n\tvec4 rgba = texture2D(tex, uv);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv, float bias) {\n\tvec4 rgba = texture2D(tex, uv, bias);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 textureCubeSRGB(samplerCube tex, vec3 uvw) {\n\tvec4 rgba = textureCube(tex, uvw);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec3 gammaCorrectOutput(vec3 color) {\n\t#ifdef HDR\n\treturn color;\n\t#else\n\tcolor += vec3(0.0000001);\n\treturn pow(color, vec3(0.45));\n\t#endif\n}\nuniform float exposure;\n\nvec3 toneMap(vec3 color) {\n\treturn color * exposure;\n}\nfloat dBlendModeFogFactor = 1.0;\n\nvec3 addFog(vec3 color) {\n\treturn color;\n}\n#ifdef CUBEMAP_ROTATION\nuniform mat3 cubeMapRotationMatrix;\n#endif\n\nvec3 cubeMapRotate(vec3 refDir) {\n#ifdef CUBEMAP_ROTATION\n\treturn refDir * cubeMapRotationMatrix;\n#else\n\treturn refDir;\n#endif\n}\nvec3 cubeMapProject(vec3 dir) {\n\treturn cubeMapRotate(dir);\n}\nvec3 processEnvironment(vec3 color) {\n\treturn color;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseDetailMap;\n#endif\n\nvec3 addAlbedoDetail(vec3 albedo) {\n\t#ifdef MAPTEXTURE\n\tvec3 albedoDetail = vec3(texture2D(texture_diffuseDetailMap, UV).CH);\n\treturn detailMode_mul(albedo, albedoDetail);\n\t#else\n\treturn albedo;\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n #define MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_diffuse;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseMap;\n#endif\n\nvoid getAlbedo() {\n\tdAlbedo = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdAlbedo *= material_diffuse.rgb;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdAlbedo *= gammaCorrectInput(addAlbedoDetail(texture2D(texture_diffuseMap, vUv0).rgb));\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdAlbedo *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_emissive;\n#endif\n\n#ifdef MAPFLOAT\nuniform float material_emissiveIntensity;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_emissiveMap;\n#endif\n\nvec3 getEmission() {\n\tvec3 emission = vec3(1.0);\n\n\t#ifdef MAPFLOAT\n\temission *= material_emissiveIntensity;\n\t#endif\n\n\t#ifdef MAPCOLOR\n\temission *= material_emissive;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\temission *= texture2DSAMPLE(texture_emissiveMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\temission *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n\n\treturn emission;\n}\nfloat antiAliasGlossiness(float power) {\n\treturn power;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_specular;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_specularMap;\n#endif\n\nvoid getSpecularity() {\n\tdSpecularity = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdSpecularity *= material_specular;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdSpecularity *= texture2D(texture_specularMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdSpecularity *= saturate(vVertexColor.VC);\n\t#endif\n}\n\n#undef MAPFLOAT\n #define MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPFLOAT\nuniform float material_shininess;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_glossMap;\n#endif\n\nvoid getGlossiness() {\n\tdGlossiness = 1.0;\n\n\t#ifdef MAPFLOAT\n\tdGlossiness *= material_shininess;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdGlossiness *= texture2D(texture_glossMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdGlossiness *= saturate(vVertexColor.VC);\n\t#endif\n\n\tdGlossiness += 0.0000001;\n}\n// Schlick's approximation\nuniform float material_fresnelFactor; // unused\n\nvoid getFresnel() {\n\tfloat fresnel = 1.0 - max(dot(dNormalW, dViewDirW), 0.0);\n\tfloat fresnel2 = fresnel * fresnel;\n\tfresnel *= fresnel2 * fresnel2;\n\tfresnel *= dGlossiness * dGlossiness;\n\tdSpecularity = dSpecularity + (1.0 - dSpecularity) * fresnel;\n\n\t#ifdef CLEARCOAT\n\tfresnel = 1.0 - max(dot(ccNormalW, dViewDirW), 0.0);\n\tfresnel2 = fresnel * fresnel;\n\tfresnel *= fresnel2 * fresnel2;\n\tfresnel *= ccGlossiness * ccGlossiness;\n\tccSpecularity = ccSpecularity + (1.0 - ccSpecularity) * fresnel;\n\t#endif\n}\nconst float maxCascades = 4.0;\n\n// shadow matrix for selected cascade\nmat4 cascadeShadowMat;\n\n// function which selects a shadow projection matrix based on cascade distances \nvoid getShadowCascadeMatrix(mat4 shadowMatrixPalette[4], float shadowCascadeDistances[4], float shadowCascadeCount) {\n\n\t// depth in 0 .. far plane range\n\tfloat depth = 1.0 / gl_FragCoord.w;\n\n\t// find cascade index based on the depth (loop as there is no per component vec compare operator in webgl)\n\tfloat cascadeIndex = 0.0;\n\tfor (float i = 0.0; i < maxCascades; i++) {\n\t\tif (depth < shadowCascadeDistances[int(i)]) {\n\t\t\tcascadeIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// limit to actual number of used cascades\n\tcascadeIndex = min(cascadeIndex, shadowCascadeCount - 1.0);\n\n\t// pick shadow matrix\n\t#ifdef GL2\n\t\tcascadeShadowMat = shadowMatrixPalette[int(cascadeIndex)];\n\t#else\n\t\t// webgl 1 does not allow non-cost index array lookup\n\t\tif (cascadeIndex == 0.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[0];\n\t\t}\n\t\telse if (cascadeIndex == 1.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[1];\n\t\t}\n\t\telse if (cascadeIndex == 2.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[2];\n\t\t}\n\t\telse {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[3];\n\t\t}\n\t#endif\n}\n\nvoid fadeShadow(float shadowCascadeDistances[4]) {\t\t\t\t  \n\n\t// if the pixel is past the shadow distance, remove shadow\n\t// this enforces straight line instead of corner of shadow which moves when camera rotates  \n\tfloat depth = 1.0 / gl_FragCoord.w;\n\tif (depth > shadowCascadeDistances[int(maxCascades - 1.0)]) {\n\t\tdShadowCoord.z = -9999999.0;\n\t}\n}\nvec3 lessThan2(vec3 a, vec3 b) {\n\treturn clamp((b - a)*1000.0, 0.0, 1.0); // softer version\n}\n\n#ifndef UNPACKFLOAT\n#define UNPACKFLOAT\nfloat unpackFloat(vec4 rgbaDepth) {\n\tconst vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\treturn dot(rgbaDepth, bitShift);\n}\n#endif\n\n// ----- Direct/Spot Sampling -----\n\n#ifdef GL2\nfloat _getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\tfloat z = dShadowCoord.z;\n\tvec2 uv = dShadowCoord.xy * shadowParams.x; // 1 unit - 1 texel\n\tfloat shadowMapSizeInv = 1.0 / shadowParams.x;\n\tvec2 base_uv = floor(uv + 0.5);\n\tfloat s = (uv.x + 0.5 - base_uv.x);\n\tfloat t = (uv.y + 0.5 - base_uv.y);\n\tbase_uv -= vec2(0.5);\n\tbase_uv *= shadowMapSizeInv;\n\n\tfloat sum = 0.0;\n\n\tfloat uw0 = (3.0 - 2.0 * s);\n\tfloat uw1 = (1.0 + 2.0 * s);\n\n\tfloat u0 = (2.0 - s) / uw0 - 1.0;\n\tfloat u1 = s / uw1 + 1.0;\n\n\tfloat vw0 = (3.0 - 2.0 * t);\n\tfloat vw1 = (1.0 + 2.0 * t);\n\n\tfloat v0 = (2.0 - t) / vw0 - 1.0;\n\tfloat v1 = t / vw1 + 1.0;\n\n\tu0 = u0 * shadowMapSizeInv + base_uv.x;\n\tv0 = v0 * shadowMapSizeInv + base_uv.y;\n\n\tu1 = u1 * shadowMapSizeInv + base_uv.x;\n\tv1 = v1 * shadowMapSizeInv + base_uv.y;\n\n\tsum += uw0 * vw0 * texture(shadowMap, vec3(u0, v0, z));\n\tsum += uw1 * vw0 * texture(shadowMap, vec3(u1, v0, z));\n\tsum += uw0 * vw1 * texture(shadowMap, vec3(u0, v1, z));\n\tsum += uw1 * vw1 * texture(shadowMap, vec3(u1, v1, z));\n\n\tsum *= 1.0f / 16.0;\n\treturn sum;\n}\n\nfloat getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2DShadow shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#else\nfloat _xgetShadowPCF3x3(mat3 depthKernel, sampler2D shadowMap, vec3 shadowParams) {\n\tmat3 shadowKernel;\n\tvec3 shadowCoord = dShadowCoord;\n\tvec3 shadowZ = vec3(shadowCoord.z);\n\tshadowKernel[0] = vec3(greaterThan(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(greaterThan(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(greaterThan(depthKernel[2], shadowZ));\n\n\tvec2 fractionalCoord = fract( shadowCoord.xy * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat _getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\tvec3 shadowCoord = dShadowCoord;\n\n\tfloat xoffset = 1.0 / shadowParams.x; // 1/shadow map width\n\tfloat dx0 = -xoffset;\n\tfloat dx1 = xoffset;\n\n\tmat3 depthKernel;\n\tdepthKernel[0][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx0)));\n\tdepthKernel[0][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, 0.0)));\n\tdepthKernel[0][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx1)));\n\tdepthKernel[1][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx0)));\n\tdepthKernel[1][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy));\n\tdepthKernel[1][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx1)));\n\tdepthKernel[2][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx0)));\n\tdepthKernel[2][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, 0.0)));\n\tdepthKernel[2][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx1)));\n\n\treturn _xgetShadowPCF3x3(depthKernel, shadowMap, shadowParams);\n}\n\nfloat getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2D shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#endif\n\n\n// ----- Point Sampling -----\n\nfloat _getShadowPoint(samplerCube shadowMap, vec4 shadowParams, vec3 dir) {\n\n\tvec3 tc = normalize(dir);\n\tvec3 tcAbs = abs(tc);\n\n\tvec4 dirX = vec4(1,0,0, tc.x);\n\tvec4 dirY = vec4(0,1,0, tc.y);\n\tfloat majorAxisLength = tc.z;\n\tif ((tcAbs.x > tcAbs.y) && (tcAbs.x > tcAbs.z)) {\n\t\tdirX = vec4(0,0,1, tc.z);\n\t\tdirY = vec4(0,1,0, tc.y);\n\t\tmajorAxisLength = tc.x;\n\t} else if ((tcAbs.y > tcAbs.x) && (tcAbs.y > tcAbs.z)) {\n\t\tdirX = vec4(1,0,0, tc.x);\n\t\tdirY = vec4(0,0,1, tc.z);\n\t\tmajorAxisLength = tc.y;\n\t}\n\n\tfloat shadowParamsInFaceSpace = ((1.0/shadowParams.x) * 2.0) * abs(majorAxisLength);\n\n\tvec3 xoffset = (dirX.xyz * shadowParamsInFaceSpace);\n\tvec3 yoffset = (dirY.xyz * shadowParamsInFaceSpace);\n\tvec3 dx0 = -xoffset;\n\tvec3 dy0 = -yoffset;\n\tvec3 dx1 = xoffset;\n\tvec3 dy1 = yoffset;\n\n\tmat3 shadowKernel;\n\tmat3 depthKernel;\n\n\tdepthKernel[0][0] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy0));\n\tdepthKernel[0][1] = unpackFloat(textureCube(shadowMap, tc + dx0));\n\tdepthKernel[0][2] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy1));\n\tdepthKernel[1][0] = unpackFloat(textureCube(shadowMap, tc + dy0));\n\tdepthKernel[1][1] = unpackFloat(textureCube(shadowMap, tc));\n\tdepthKernel[1][2] = unpackFloat(textureCube(shadowMap, tc + dy1));\n\tdepthKernel[2][0] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy0));\n\tdepthKernel[2][1] = unpackFloat(textureCube(shadowMap, tc + dx1));\n\tdepthKernel[2][2] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy1));\n\n\tvec3 shadowZ = vec3(length(dir) * shadowParams.w + shadowParams.z);\n\n\tshadowKernel[0] = vec3(lessThan2(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(lessThan2(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(lessThan2(depthKernel[2], shadowZ));\n\n\tvec2 uv = (vec2(dirX.w, dirY.w) / abs(majorAxisLength)) * 0.5;\n\n\tvec2 fractionalCoord = fract( uv * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn 1.0 - dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat getShadowPointPCF3x3(samplerCube shadowMap, vec4 shadowParams) {\n\treturn _getShadowPoint(shadowMap, shadowParams, dLightDirW);\n}\nvoid _getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams, vec3 wPos) {\n\tdShadowCoord = (shadowMatrix * vec4(wPos, 1.0)).xyz;\n\tdShadowCoord.z = saturate(dShadowCoord.z) - 0.0001;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid _getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n\tvec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n\tprojPos.xy /= projPos.w;\n\tdShadowCoord.xy = projPos.xy;\n\tdShadowCoord.z = length(dLightDirW) * shadowParams.w;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams) {\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams) {\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPerspNormalOffset(mat4 shadowMatrix, vec4 shadowParams) {\n\tfloat distScale = abs(dot(vPositionW - dLightPosW, dLightDirNormW)); // fov?\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale;\n\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, wPos);\n}\n\nvoid getShadowCoordOrthoNormalOffset(mat4 shadowMatrix, vec3 shadowParams) {\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0); //0.08\n\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, wPos);\n}\nvoid normalOffsetPointShadow(vec4 shadowParams) {\n\tfloat distScale = length(dLightDirW);\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale; //0.02\n\tvec3 dir = wPos - dLightPosW;\n\tdLightDirW = dir;\n}\nfloat getLightDiffuse() {\n\treturn max(dot(dNormalW, -dLightDirNormW), 0.0);\n}\n// Energy-conserving (hopefully) Blinn-Phong\nfloat calcLightSpecular(float tGlossiness, vec3 tNormalW) {\n\tvec3 h = normalize( -dLightDirNormW + dViewDirW );\n\tfloat nh = max( dot( h, tNormalW ), 0.0 );\n\n\tfloat specPow = exp2(tGlossiness * 11.0); // glossiness is linear, power is not; 0 - 2048\n\tspecPow = antiAliasGlossiness(specPow);\n\n\t// Hack: On Mac OS X, calling pow with zero for the exponent generates hideous artifacts so bias up a little\n\tspecPow = max(specPow, 0.0001);\n\n\treturn pow(nh, specPow) * (specPow + 2.0) / 8.0;\n}\n\nfloat getLightSpecular() {\n\treturn calcLightSpecular(dGlossiness, dNormalW);\n}\n\nfloat getLightSpecularCC() {\n\treturn calcLightSpecular(ccGlossiness, ccNormalW);\n}\nvec3 combineColor() {\n\treturn mix(dAlbedo * dDiffuseLight, dSpecularLight + dReflection.rgb * dReflection.a, dSpecularity);\n}\nvoid addAmbient() {\n\tdDiffuseLight += light_globalAmbient;\n}\nvoid getViewDir() {\n\tdViewDirW = normalize(view_position - vPositionW);\n}\nvoid getReflDir() {\n\tdReflDirW = normalize(-reflect(dViewDirW, dNormalW));\n}\nvoid main(void) {\n\tdDiffuseLight = vec3(0);\n\tdSpecularLight = vec3(0);\n\tdReflection = vec4(0);\n\tdSpecularity = vec3(0);\n\n\t#ifdef CLEARCOAT\n\tccSpecularLight = vec3(0);\n\tccReflection = vec4(0);\n\t#endif\n\t dVertexNormalW = normalize(vNormalW);\n\t dAlpha = 1.0;\n\t getViewDir();\n\t getNormal();\n\t getReflDir();\n\t getAlbedo();\n\t getSpecularity();\n\t getGlossiness();\n\t getFresnel();\n\t addAmbient();\n\t dLightDirNormW = light0_direction;\n\t dAtten = 1.0;\n\t\t\t dAtten *= getLightDiffuse();\ngetShadowCoordOrthoNormalOffset(light0_shadowMatrix, light0_shadowParams);\nfadeShadow(light0_shadowCascadeDistances);\n\t\t\t dAtten *= getShadowPCF3x3(light0_shadowMap, light0_shadowParams);\n\t\t\t dDiffuseLight += dAtten * light0_color;\n\t\t\t dSpecularLight += getLightSpecular() * dAtten * light0_color;\n\n\n\t#ifdef CLEARCOAT\n\tgl_FragColor.rgb = combineColorCC();\n\t#else\n\tgl_FragColor.rgb = combineColor();\n\t#endif \n\n\tgl_FragColor.rgb += getEmission();\n\tgl_FragColor.rgb = addFog(gl_FragColor.rgb);\n\n\t#ifndef HDR\n\tgl_FragColor.rgb = toneMap(gl_FragColor.rgb);\n\tgl_FragColor.rgb = gammaCorrectOutput(gl_FragColor.rgb);\n\t#endif\ngl_FragColor.a = 1.0;\n\n}\n",
                                    "translatedSource": "#version 450\nvoid initGlobals();\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nin vec3 _uvNormalW;\nin vec2 _uvUv0;\nuniform vec3 _uview_position;\nuniform vec3 _ulight_globalAmbient;\nfloat _usaturate(in float _ux){\nreturn clamp(_ux, 0.0, 1.0);\n}\nvec4 _udReflection;\nvec3 _udAlbedo;\nvec3 _udNormalW;\nvec3 _udVertexNormalW;\nvec3 _udViewDirW;\nvec3 _udReflDirW;\nvec3 _udDiffuseLight;\nvec3 _udSpecularLight;\nvec3 _udLightDirNormW;\nvec3 _udShadowCoord;\nvec3 _udSpecularity;\nfloat _udGlossiness;\nfloat _udAlpha;\nfloat _udAtten;\nuniform vec3 _ulight0_color;\nuniform vec3 _ulight0_direction;\nuniform mat4 _ulight0_shadowMatrix;\nuniform mat4 _ulight0_shadowMatrixPalette[4];\nuniform float _ulight0_shadowCascadeDistances[4];\nuniform float _ulight0_shadowCascadeCount;\nuniform vec3 _ulight0_shadowParams;\nuniform sampler2DShadow _ulight0_shadowMap;\nvoid _ugetNormal(){\n(_udNormalW = normalize(_udVertexNormalW));\n}\nvec3 _ugammaCorrectInput(in vec3 _ucolor){\nreturn pow(_ucolor, vec3(2.2, 2.2, 2.2));\n}\nvec3 _ugammaCorrectOutput(in vec3 _ucolor){\n(_ucolor += vec3(1e-07, 1e-07, 1e-07));\nreturn pow(_ucolor, vec3(0.44999999, 0.44999999, 0.44999999));\n}\nuniform float _uexposure;\nvec3 _utoneMap(in vec3 _ucolor){\nreturn (_ucolor * _uexposure);\n}\nvec3 _uaddFog(in vec3 _ucolor){\nreturn _ucolor;\n}\nvec3 _uaddAlbedoDetail(in vec3 _ualbedo){\nreturn _ualbedo;\n}\nuniform sampler2D _utexture_diffuseMap;\nvoid _ugetAlbedo(){\n(_udAlbedo = vec3(1.0, 1.0, 1.0));\n(_udAlbedo *= _ugammaCorrectInput(_uaddAlbedoDetail(texture(_utexture_diffuseMap, _uvUv0).xyz)));\n}\nuniform vec3 _umaterial_emissive;\nvec3 _ugetEmission(){\nvec3 _uemission = vec3(1.0, 1.0, 1.0);\n(_uemission *= _umaterial_emissive);\nreturn _uemission;\n}\nfloat _uantiAliasGlossiness(in float _upower){\nreturn _upower;\n}\nuniform vec3 _umaterial_specular;\nvoid _ugetSpecularity(){\n(_udSpecularity = vec3(1.0, 1.0, 1.0));\n(_udSpecularity *= _umaterial_specular);\n}\nuniform float _umaterial_shininess;\nvoid _ugetGlossiness(){\n(_udGlossiness = 1.0);\n(_udGlossiness *= _umaterial_shininess);\n(_udGlossiness += 1e-07);\n}\nuniform float _umaterial_fresnelFactor;\nvoid _ugetFresnel(){\nfloat _ufresnel = (1.0 - max(dot(_udNormalW, _udViewDirW), 0.0));\nfloat _ufresnel2 = (_ufresnel * _ufresnel);\n(_ufresnel *= (_ufresnel2 * _ufresnel2));\n(_ufresnel *= (_udGlossiness * _udGlossiness));\n(_udSpecularity = (_udSpecularity + ((1.0 - _udSpecularity) * _ufresnel)));\n}\nvoid _ufadeShadow(in float _ushadowCascadeDistances[4]){\nfloat _udepth = (1.0 / gl_FragCoord.w);\nif ((_udepth > _ushadowCascadeDistances[3]))\n{\n(_udShadowCoord.z = -9999999.0);\n}\n}\nfloat _u_getShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nfloat _uz = _udShadowCoord.z;\nvec2 _uuv = (_udShadowCoord.xy * _ushadowParams.x);\nfloat _ushadowMapSizeInv = (1.0 / _ushadowParams.x);\nvec2 _ubase_uv = floor((_uuv + vec2(0.5, 0.5)));\nfloat _us = ((_uuv.x + 0.5) - _ubase_uv.x);\nfloat _ut = ((_uuv.y + 0.5) - _ubase_uv.y);\n(_ubase_uv -= vec2(0.5, 0.5));\n(_ubase_uv *= _ushadowMapSizeInv);\nfloat _usum = 0.0;\nfloat _uuw0 = (3.0 - (2.0 * _us));\nfloat _uuw1 = (1.0 + (2.0 * _us));\nfloat _uu0 = (((2.0 - _us) / _uuw0) - 1.0);\nfloat _uu1 = ((_us / _uuw1) + 1.0);\nfloat _uvw0 = (3.0 - (2.0 * _ut));\nfloat _uvw1 = (1.0 + (2.0 * _ut));\nfloat _uv0 = (((2.0 - _ut) / _uvw0) - 1.0);\nfloat _uv1 = ((_ut / _uvw1) + 1.0);\n(_uu0 = ((_uu0 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv0 = ((_uv0 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_uu1 = ((_uu1 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv1 = ((_uv1 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_usum += ((_uuw0 * _uvw0) * texture(_ushadowMap, vec3(_uu0, _uv0, _uz))));\n(_usum += ((_uuw1 * _uvw0) * texture(_ushadowMap, vec3(_uu1, _uv0, _uz))));\n(_usum += ((_uuw0 * _uvw1) * texture(_ushadowMap, vec3(_uu0, _uv1, _uz))));\n(_usum += ((_uuw1 * _uvw1) * texture(_ushadowMap, vec3(_uu1, _uv1, _uz))));\n(_usum *= 0.0625);\nreturn _usum;\n}\nfloat _ugetShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nreturn _u_getShadowPCF3x3(_ushadowMap, _ushadowParams);\n}\nvoid _u_getShadowCoordOrtho(in mat4 _ushadowMatrix, in vec3 _ushadowParams, in vec3 _uwPos){\n(_udShadowCoord = (_ushadowMatrix * vec4(_uwPos, 1.0)).xyz);\n(_udShadowCoord.z = (_usaturate(_udShadowCoord.z) - 9.9999997e-05));\n}\nvoid _ugetShadowCoordOrthoNormalOffset(in mat4 _ushadowMatrix, in vec3 _ushadowParams){\nvec3 _uwPos = (_uvPositionW + ((_udVertexNormalW * _ushadowParams.y) * clamp((1.0 - dot(_udVertexNormalW, (-_udLightDirNormW))), 0.0, 1.0)));\n_u_getShadowCoordOrtho(_ushadowMatrix, _ushadowParams, _uwPos);\n}\nfloat _ugetLightDiffuse(){\nreturn max(dot(_udNormalW, (-_udLightDirNormW)), 0.0);\n}\nfloat _ucalcLightSpecular(in float _utGlossiness, in vec3 _utNormalW){\nvec3 _uh = normalize(((-_udLightDirNormW) + _udViewDirW));\nfloat _unh = max(dot(_uh, _utNormalW), 0.0);\nfloat _uspecPow = exp2((_utGlossiness * 11.0));\n(_uspecPow = _uantiAliasGlossiness(_uspecPow));\n(_uspecPow = max(_uspecPow, 9.9999997e-05));\nreturn ((pow(_unh, _uspecPow) * (_uspecPow + 2.0)) / 8.0);\n}\nfloat _ugetLightSpecular(){\nreturn _ucalcLightSpecular(_udGlossiness, _udNormalW);\n}\nvec3 _ucombineColor(){\nreturn mix((_udAlbedo * _udDiffuseLight), (_udSpecularLight + (_udReflection.xyz * _udReflection.w)), _udSpecularity);\n}\nvoid _uaddAmbient(){\n(_udDiffuseLight += _ulight_globalAmbient);\n}\nvoid _ugetViewDir(){\n(_udViewDirW = normalize((_uview_position - _uvPositionW)));\n}\nvoid _ugetReflDir(){\n(_udReflDirW = normalize((-reflect(_udViewDirW, _udNormalW))));\n}\nvoid main(){\ninitGlobals();\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = normalize(_uvNormalW));\n(_udAlpha = 1.0);\n_ugetViewDir();\n_ugetNormal();\n_ugetReflDir();\n_ugetAlbedo();\n_ugetSpecularity();\n_ugetGlossiness();\n_ugetFresnel();\n_uaddAmbient();\n(_udLightDirNormW = _ulight0_direction);\n(_udAtten = 1.0);\n(_udAtten *= _ugetLightDiffuse());\n_ugetShadowCoordOrthoNormalOffset(_ulight0_shadowMatrix, _ulight0_shadowParams);\n_ufadeShadow(_ulight0_shadowCascadeDistances);\n(_udAtten *= _ugetShadowPCF3x3(_ulight0_shadowMap, _ulight0_shadowParams));\n(_udDiffuseLight += (_udAtten * _ulight0_color));\n(_udSpecularLight += ((_ugetLightSpecular() * _udAtten) * _ulight0_color));\n(_upc_fragColor.xyz = _ucombineColor());\n(_upc_fragColor.xyz += _ugetEmission());\n(_upc_fragColor.xyz = _uaddFog(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _utoneMap(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _ugammaCorrectOutput(_upc_fragColor.xyz));\n(_upc_fragColor.w = 1.0);\n}\nvoid initGlobals(){\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udAlbedo = vec3(0.0, 0.0, 0.0));\n(_udNormalW = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = vec3(0.0, 0.0, 0.0));\n(_udViewDirW = vec3(0.0, 0.0, 0.0));\n(_udReflDirW = vec3(0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udLightDirNormW = vec3(0.0, 0.0, 0.0));\n(_udShadowCoord = vec3(0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udGlossiness = 0.0);\n(_udAlpha = 0.0);\n(_udAtten = 0.0);\n}\n\u0000"
                                }
                            ],
                            "length": 24282
                        }
                    },
                    "RECOMPILABLE": false
                },
                "shaders": [
                    {
                        "COMPILE_STATUS": true,
                        "fragment": false,
                        "name": "Vertex",
                        "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nvarying vec2 vUv0;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef NINESLICED\nvec2 getUv0() {\n\tvec2 uv = vertex_position.xz;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tuv += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tuv = uv * -0.5 + 0.5;\n\tuv = uv * atlasRect.zw + atlasRect.xy;\n\n\tvMask = vertex_texCoord0.xy;\n\n\treturn uv;\n}\n#else\nvec2 getUv0() {\n\treturn vertex_texCoord0;\n}\n#endif\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n#ifdef MORPHING_TEXTURE_BASED_NORMAL\nuniform highp sampler2D morphNormalTex;\n#endif\n\nvec3 getNormal() {\n\t#ifdef SKIN\n\tdNormalMatrix = mat3(dModelMatrix[0].xyz, dModelMatrix[1].xyz, dModelMatrix[2].xyz);\n\t#elif defined(INSTANCING)\n\tdNormalMatrix = mat3(instance_line1.xyz, instance_line2.xyz, instance_line3.xyz);\n\t#else\n\tdNormalMatrix = matrix_normal;\n\t#endif\n\n\tvec3 tempNormal = vertex_normal;\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_NRM03\n\ttempNormal += morph_weights_a[0] * morph_nrm0;\n\ttempNormal += morph_weights_a[1] * morph_nrm1;\n\ttempNormal += morph_weights_a[2] * morph_nrm2;\n\ttempNormal += morph_weights_a[3] * morph_nrm3;\n\t#endif\n\t#ifdef MORPHING_NRM47\n\ttempNormal += morph_weights_b[0] * morph_nrm4;\n\ttempNormal += morph_weights_b[1] * morph_nrm5;\n\ttempNormal += morph_weights_b[2] * morph_nrm6;\n\ttempNormal += morph_weights_b[3] * morph_nrm7;\n\t#endif\n\t#endif\n\n\t#ifdef MORPHING_TEXTURE_BASED_NORMAL\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphNormal = texture2D(morphNormalTex, morphUV).xyz;\n\ttempNormal += morphNormal;\n\t#endif\n\n\treturn normalize(dNormalMatrix * tempNormal);\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\t vNormalW = getNormal();\n\t vec2 uv0 = getUv0();\n\t vUv0 = uv0;\n\n}",
                        "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nout vec3 _uvNormalW;\nout vec2 _uvUv0;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat3 _udNormalMatrix;\nvec2 _ugetUv0(){\nreturn _uvertex_texCoord0;\n}\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvec3 _ugetNormal(){\n(_udNormalMatrix = _umatrix_normal);\nvec3 _utempNormal = _uvertex_normal;\nreturn normalize((_udNormalMatrix * _utempNormal));\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvUv0 = vec2(0.0, 0.0));\n(_uvNormalW = vec3(0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n(_uvNormalW = _ugetNormal());\nvec2 _uuv0 = _ugetUv0();\n(_uvUv0 = _uuv0);\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n(_udNormalMatrix = mat3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                    },
                    {
                        "COMPILE_STATUS": true,
                        "fragment": true,
                        "name": "Fragment",
                        "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nvarying vec2 vUv0;\nuniform vec3 view_position;\n\nuniform vec3 light_globalAmbient;\n\nfloat square(float x) {\n\treturn x*x;\n}\n\nfloat saturate(float x) {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nvec3 saturate(vec3 x) {\n\treturn clamp(x, vec3(0.0), vec3(1.0));\n}\nvec3 detailMode_mul(vec3 c1, vec3 c2) {\n\treturn c1 * c2;\n}\n\nvec3 detailMode_add(vec3 c1, vec3 c2) {\n\treturn c1 + c2;\n}\n\n// https://en.wikipedia.org/wiki/Blend_modes#Screen\nvec3 detailMode_screen(vec3 c1, vec3 c2) {\n\treturn 1.0 - (1.0 - c1)*(1.0 - c2);\n}\n\n// https://en.wikipedia.org/wiki/Blend_modes#Overlay\nvec3 detailMode_overlay(vec3 c1, vec3 c2) {\n\treturn mix(1.0 - 2.0*(1.0 - c1)*(1.0 - c2), 2.0*c1*c2, step(c1, vec3(0.5)));\n}\n\nvec3 detailMode_min(vec3 c1, vec3 c2) {\n\treturn min(c1, c2);\n}\n\nvec3 detailMode_max(vec3 c1, vec3 c2) {\n\treturn max(c1, c2);\n}\nvec4 dReflection;\nvec3 dAlbedo;\nvec3 dNormalW;\nvec3 dVertexNormalW;\nvec3 dViewDirW;\nvec3 dReflDirW;\nvec3 dDiffuseLight;\nvec3 dSpecularLight;\nvec3 dLightDirNormW;\nvec3 dLightDirW;\nvec3 dLightPosW;\nvec3 dShadowCoord;\nvec3 dSpecularity;\nfloat dGlossiness;\nfloat dAlpha;\nfloat dAtten;\nvec4 ccReflection;\nvec3 ccNormalW;\nvec3 ccSpecularLight;\nfloat ccSpecularity;\nfloat ccGlossiness;\n#define AREA_LUTS_PRECISION highp\nuniform vec3 light0_color;\nuniform vec3 light0_direction;\nuniform mat4 light0_shadowMatrix;\nuniform mat4 light0_shadowMatrixPalette[4];\nuniform float light0_shadowCascadeDistances[4];\nuniform float light0_shadowCascadeCount;\nuniform vec3 light0_shadowParams;\nuniform sampler2DShadow light0_shadowMap;\n\nvoid getNormal() {\n\tdNormalW = normalize(dVertexNormalW);\n}\nvec3 gammaCorrectInput(vec3 color) {\n\treturn pow(color, vec3(2.2));\n}\n\nfloat gammaCorrectInput(float color) {\n\treturn pow(color, 2.2);\n}\n\nvec4 gammaCorrectInput(vec4 color) {\n\treturn vec4(pow(color.rgb, vec3(2.2)), color.a);\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv) {\n\tvec4 rgba = texture2D(tex, uv);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv, float bias) {\n\tvec4 rgba = texture2D(tex, uv, bias);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 textureCubeSRGB(samplerCube tex, vec3 uvw) {\n\tvec4 rgba = textureCube(tex, uvw);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec3 gammaCorrectOutput(vec3 color) {\n\t#ifdef HDR\n\treturn color;\n\t#else\n\tcolor += vec3(0.0000001);\n\treturn pow(color, vec3(0.45));\n\t#endif\n}\nuniform float exposure;\n\nvec3 toneMap(vec3 color) {\n\treturn color * exposure;\n}\nfloat dBlendModeFogFactor = 1.0;\n\nvec3 addFog(vec3 color) {\n\treturn color;\n}\n#ifdef CUBEMAP_ROTATION\nuniform mat3 cubeMapRotationMatrix;\n#endif\n\nvec3 cubeMapRotate(vec3 refDir) {\n#ifdef CUBEMAP_ROTATION\n\treturn refDir * cubeMapRotationMatrix;\n#else\n\treturn refDir;\n#endif\n}\nvec3 cubeMapProject(vec3 dir) {\n\treturn cubeMapRotate(dir);\n}\nvec3 processEnvironment(vec3 color) {\n\treturn color;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseDetailMap;\n#endif\n\nvec3 addAlbedoDetail(vec3 albedo) {\n\t#ifdef MAPTEXTURE\n\tvec3 albedoDetail = vec3(texture2D(texture_diffuseDetailMap, UV).CH);\n\treturn detailMode_mul(albedo, albedoDetail);\n\t#else\n\treturn albedo;\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n #define MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_diffuse;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseMap;\n#endif\n\nvoid getAlbedo() {\n\tdAlbedo = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdAlbedo *= material_diffuse.rgb;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdAlbedo *= gammaCorrectInput(addAlbedoDetail(texture2D(texture_diffuseMap, vUv0).rgb));\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdAlbedo *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_emissive;\n#endif\n\n#ifdef MAPFLOAT\nuniform float material_emissiveIntensity;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_emissiveMap;\n#endif\n\nvec3 getEmission() {\n\tvec3 emission = vec3(1.0);\n\n\t#ifdef MAPFLOAT\n\temission *= material_emissiveIntensity;\n\t#endif\n\n\t#ifdef MAPCOLOR\n\temission *= material_emissive;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\temission *= texture2DSAMPLE(texture_emissiveMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\temission *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n\n\treturn emission;\n}\nfloat antiAliasGlossiness(float power) {\n\treturn power;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_specular;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_specularMap;\n#endif\n\nvoid getSpecularity() {\n\tdSpecularity = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdSpecularity *= material_specular;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdSpecularity *= texture2D(texture_specularMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdSpecularity *= saturate(vVertexColor.VC);\n\t#endif\n}\n\n#undef MAPFLOAT\n #define MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPFLOAT\nuniform float material_shininess;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_glossMap;\n#endif\n\nvoid getGlossiness() {\n\tdGlossiness = 1.0;\n\n\t#ifdef MAPFLOAT\n\tdGlossiness *= material_shininess;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdGlossiness *= texture2D(texture_glossMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdGlossiness *= saturate(vVertexColor.VC);\n\t#endif\n\n\tdGlossiness += 0.0000001;\n}\n// Schlick's approximation\nuniform float material_fresnelFactor; // unused\n\nvoid getFresnel() {\n\tfloat fresnel = 1.0 - max(dot(dNormalW, dViewDirW), 0.0);\n\tfloat fresnel2 = fresnel * fresnel;\n\tfresnel *= fresnel2 * fresnel2;\n\tfresnel *= dGlossiness * dGlossiness;\n\tdSpecularity = dSpecularity + (1.0 - dSpecularity) * fresnel;\n\n\t#ifdef CLEARCOAT\n\tfresnel = 1.0 - max(dot(ccNormalW, dViewDirW), 0.0);\n\tfresnel2 = fresnel * fresnel;\n\tfresnel *= fresnel2 * fresnel2;\n\tfresnel *= ccGlossiness * ccGlossiness;\n\tccSpecularity = ccSpecularity + (1.0 - ccSpecularity) * fresnel;\n\t#endif\n}\nconst float maxCascades = 4.0;\n\n// shadow matrix for selected cascade\nmat4 cascadeShadowMat;\n\n// function which selects a shadow projection matrix based on cascade distances \nvoid getShadowCascadeMatrix(mat4 shadowMatrixPalette[4], float shadowCascadeDistances[4], float shadowCascadeCount) {\n\n\t// depth in 0 .. far plane range\n\tfloat depth = 1.0 / gl_FragCoord.w;\n\n\t// find cascade index based on the depth (loop as there is no per component vec compare operator in webgl)\n\tfloat cascadeIndex = 0.0;\n\tfor (float i = 0.0; i < maxCascades; i++) {\n\t\tif (depth < shadowCascadeDistances[int(i)]) {\n\t\t\tcascadeIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// limit to actual number of used cascades\n\tcascadeIndex = min(cascadeIndex, shadowCascadeCount - 1.0);\n\n\t// pick shadow matrix\n\t#ifdef GL2\n\t\tcascadeShadowMat = shadowMatrixPalette[int(cascadeIndex)];\n\t#else\n\t\t// webgl 1 does not allow non-cost index array lookup\n\t\tif (cascadeIndex == 0.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[0];\n\t\t}\n\t\telse if (cascadeIndex == 1.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[1];\n\t\t}\n\t\telse if (cascadeIndex == 2.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[2];\n\t\t}\n\t\telse {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[3];\n\t\t}\n\t#endif\n}\n\nvoid fadeShadow(float shadowCascadeDistances[4]) {\t\t\t\t  \n\n\t// if the pixel is past the shadow distance, remove shadow\n\t// this enforces straight line instead of corner of shadow which moves when camera rotates  \n\tfloat depth = 1.0 / gl_FragCoord.w;\n\tif (depth > shadowCascadeDistances[int(maxCascades - 1.0)]) {\n\t\tdShadowCoord.z = -9999999.0;\n\t}\n}\nvec3 lessThan2(vec3 a, vec3 b) {\n\treturn clamp((b - a)*1000.0, 0.0, 1.0); // softer version\n}\n\n#ifndef UNPACKFLOAT\n#define UNPACKFLOAT\nfloat unpackFloat(vec4 rgbaDepth) {\n\tconst vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\treturn dot(rgbaDepth, bitShift);\n}\n#endif\n\n// ----- Direct/Spot Sampling -----\n\n#ifdef GL2\nfloat _getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\tfloat z = dShadowCoord.z;\n\tvec2 uv = dShadowCoord.xy * shadowParams.x; // 1 unit - 1 texel\n\tfloat shadowMapSizeInv = 1.0 / shadowParams.x;\n\tvec2 base_uv = floor(uv + 0.5);\n\tfloat s = (uv.x + 0.5 - base_uv.x);\n\tfloat t = (uv.y + 0.5 - base_uv.y);\n\tbase_uv -= vec2(0.5);\n\tbase_uv *= shadowMapSizeInv;\n\n\tfloat sum = 0.0;\n\n\tfloat uw0 = (3.0 - 2.0 * s);\n\tfloat uw1 = (1.0 + 2.0 * s);\n\n\tfloat u0 = (2.0 - s) / uw0 - 1.0;\n\tfloat u1 = s / uw1 + 1.0;\n\n\tfloat vw0 = (3.0 - 2.0 * t);\n\tfloat vw1 = (1.0 + 2.0 * t);\n\n\tfloat v0 = (2.0 - t) / vw0 - 1.0;\n\tfloat v1 = t / vw1 + 1.0;\n\n\tu0 = u0 * shadowMapSizeInv + base_uv.x;\n\tv0 = v0 * shadowMapSizeInv + base_uv.y;\n\n\tu1 = u1 * shadowMapSizeInv + base_uv.x;\n\tv1 = v1 * shadowMapSizeInv + base_uv.y;\n\n\tsum += uw0 * vw0 * texture(shadowMap, vec3(u0, v0, z));\n\tsum += uw1 * vw0 * texture(shadowMap, vec3(u1, v0, z));\n\tsum += uw0 * vw1 * texture(shadowMap, vec3(u0, v1, z));\n\tsum += uw1 * vw1 * texture(shadowMap, vec3(u1, v1, z));\n\n\tsum *= 1.0f / 16.0;\n\treturn sum;\n}\n\nfloat getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2DShadow shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#else\nfloat _xgetShadowPCF3x3(mat3 depthKernel, sampler2D shadowMap, vec3 shadowParams) {\n\tmat3 shadowKernel;\n\tvec3 shadowCoord = dShadowCoord;\n\tvec3 shadowZ = vec3(shadowCoord.z);\n\tshadowKernel[0] = vec3(greaterThan(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(greaterThan(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(greaterThan(depthKernel[2], shadowZ));\n\n\tvec2 fractionalCoord = fract( shadowCoord.xy * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat _getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\tvec3 shadowCoord = dShadowCoord;\n\n\tfloat xoffset = 1.0 / shadowParams.x; // 1/shadow map width\n\tfloat dx0 = -xoffset;\n\tfloat dx1 = xoffset;\n\n\tmat3 depthKernel;\n\tdepthKernel[0][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx0)));\n\tdepthKernel[0][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, 0.0)));\n\tdepthKernel[0][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx1)));\n\tdepthKernel[1][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx0)));\n\tdepthKernel[1][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy));\n\tdepthKernel[1][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx1)));\n\tdepthKernel[2][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx0)));\n\tdepthKernel[2][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, 0.0)));\n\tdepthKernel[2][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx1)));\n\n\treturn _xgetShadowPCF3x3(depthKernel, shadowMap, shadowParams);\n}\n\nfloat getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2D shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#endif\n\n\n// ----- Point Sampling -----\n\nfloat _getShadowPoint(samplerCube shadowMap, vec4 shadowParams, vec3 dir) {\n\n\tvec3 tc = normalize(dir);\n\tvec3 tcAbs = abs(tc);\n\n\tvec4 dirX = vec4(1,0,0, tc.x);\n\tvec4 dirY = vec4(0,1,0, tc.y);\n\tfloat majorAxisLength = tc.z;\n\tif ((tcAbs.x > tcAbs.y) && (tcAbs.x > tcAbs.z)) {\n\t\tdirX = vec4(0,0,1, tc.z);\n\t\tdirY = vec4(0,1,0, tc.y);\n\t\tmajorAxisLength = tc.x;\n\t} else if ((tcAbs.y > tcAbs.x) && (tcAbs.y > tcAbs.z)) {\n\t\tdirX = vec4(1,0,0, tc.x);\n\t\tdirY = vec4(0,0,1, tc.z);\n\t\tmajorAxisLength = tc.y;\n\t}\n\n\tfloat shadowParamsInFaceSpace = ((1.0/shadowParams.x) * 2.0) * abs(majorAxisLength);\n\n\tvec3 xoffset = (dirX.xyz * shadowParamsInFaceSpace);\n\tvec3 yoffset = (dirY.xyz * shadowParamsInFaceSpace);\n\tvec3 dx0 = -xoffset;\n\tvec3 dy0 = -yoffset;\n\tvec3 dx1 = xoffset;\n\tvec3 dy1 = yoffset;\n\n\tmat3 shadowKernel;\n\tmat3 depthKernel;\n\n\tdepthKernel[0][0] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy0));\n\tdepthKernel[0][1] = unpackFloat(textureCube(shadowMap, tc + dx0));\n\tdepthKernel[0][2] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy1));\n\tdepthKernel[1][0] = unpackFloat(textureCube(shadowMap, tc + dy0));\n\tdepthKernel[1][1] = unpackFloat(textureCube(shadowMap, tc));\n\tdepthKernel[1][2] = unpackFloat(textureCube(shadowMap, tc + dy1));\n\tdepthKernel[2][0] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy0));\n\tdepthKernel[2][1] = unpackFloat(textureCube(shadowMap, tc + dx1));\n\tdepthKernel[2][2] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy1));\n\n\tvec3 shadowZ = vec3(length(dir) * shadowParams.w + shadowParams.z);\n\n\tshadowKernel[0] = vec3(lessThan2(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(lessThan2(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(lessThan2(depthKernel[2], shadowZ));\n\n\tvec2 uv = (vec2(dirX.w, dirY.w) / abs(majorAxisLength)) * 0.5;\n\n\tvec2 fractionalCoord = fract( uv * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn 1.0 - dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat getShadowPointPCF3x3(samplerCube shadowMap, vec4 shadowParams) {\n\treturn _getShadowPoint(shadowMap, shadowParams, dLightDirW);\n}\nvoid _getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams, vec3 wPos) {\n\tdShadowCoord = (shadowMatrix * vec4(wPos, 1.0)).xyz;\n\tdShadowCoord.z = saturate(dShadowCoord.z) - 0.0001;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid _getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n\tvec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n\tprojPos.xy /= projPos.w;\n\tdShadowCoord.xy = projPos.xy;\n\tdShadowCoord.z = length(dLightDirW) * shadowParams.w;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams) {\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams) {\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPerspNormalOffset(mat4 shadowMatrix, vec4 shadowParams) {\n\tfloat distScale = abs(dot(vPositionW - dLightPosW, dLightDirNormW)); // fov?\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale;\n\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, wPos);\n}\n\nvoid getShadowCoordOrthoNormalOffset(mat4 shadowMatrix, vec3 shadowParams) {\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0); //0.08\n\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, wPos);\n}\nvoid normalOffsetPointShadow(vec4 shadowParams) {\n\tfloat distScale = length(dLightDirW);\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale; //0.02\n\tvec3 dir = wPos - dLightPosW;\n\tdLightDirW = dir;\n}\nfloat getLightDiffuse() {\n\treturn max(dot(dNormalW, -dLightDirNormW), 0.0);\n}\n// Energy-conserving (hopefully) Blinn-Phong\nfloat calcLightSpecular(float tGlossiness, vec3 tNormalW) {\n\tvec3 h = normalize( -dLightDirNormW + dViewDirW );\n\tfloat nh = max( dot( h, tNormalW ), 0.0 );\n\n\tfloat specPow = exp2(tGlossiness * 11.0); // glossiness is linear, power is not; 0 - 2048\n\tspecPow = antiAliasGlossiness(specPow);\n\n\t// Hack: On Mac OS X, calling pow with zero for the exponent generates hideous artifacts so bias up a little\n\tspecPow = max(specPow, 0.0001);\n\n\treturn pow(nh, specPow) * (specPow + 2.0) / 8.0;\n}\n\nfloat getLightSpecular() {\n\treturn calcLightSpecular(dGlossiness, dNormalW);\n}\n\nfloat getLightSpecularCC() {\n\treturn calcLightSpecular(ccGlossiness, ccNormalW);\n}\nvec3 combineColor() {\n\treturn mix(dAlbedo * dDiffuseLight, dSpecularLight + dReflection.rgb * dReflection.a, dSpecularity);\n}\nvoid addAmbient() {\n\tdDiffuseLight += light_globalAmbient;\n}\nvoid getViewDir() {\n\tdViewDirW = normalize(view_position - vPositionW);\n}\nvoid getReflDir() {\n\tdReflDirW = normalize(-reflect(dViewDirW, dNormalW));\n}\nvoid main(void) {\n\tdDiffuseLight = vec3(0);\n\tdSpecularLight = vec3(0);\n\tdReflection = vec4(0);\n\tdSpecularity = vec3(0);\n\n\t#ifdef CLEARCOAT\n\tccSpecularLight = vec3(0);\n\tccReflection = vec4(0);\n\t#endif\n\t dVertexNormalW = normalize(vNormalW);\n\t dAlpha = 1.0;\n\t getViewDir();\n\t getNormal();\n\t getReflDir();\n\t getAlbedo();\n\t getSpecularity();\n\t getGlossiness();\n\t getFresnel();\n\t addAmbient();\n\t dLightDirNormW = light0_direction;\n\t dAtten = 1.0;\n\t\t\t dAtten *= getLightDiffuse();\ngetShadowCoordOrthoNormalOffset(light0_shadowMatrix, light0_shadowParams);\nfadeShadow(light0_shadowCascadeDistances);\n\t\t\t dAtten *= getShadowPCF3x3(light0_shadowMap, light0_shadowParams);\n\t\t\t dDiffuseLight += dAtten * light0_color;\n\t\t\t dSpecularLight += getLightSpecular() * dAtten * light0_color;\n\n\n\t#ifdef CLEARCOAT\n\tgl_FragColor.rgb = combineColorCC();\n\t#else\n\tgl_FragColor.rgb = combineColor();\n\t#endif \n\n\tgl_FragColor.rgb += getEmission();\n\tgl_FragColor.rgb = addFog(gl_FragColor.rgb);\n\n\t#ifndef HDR\n\tgl_FragColor.rgb = toneMap(gl_FragColor.rgb);\n\tgl_FragColor.rgb = gammaCorrectOutput(gl_FragColor.rgb);\n\t#endif\ngl_FragColor.a = 1.0;\n\n}\n",
                        "translatedSource": "#version 450\nvoid initGlobals();\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nin vec3 _uvNormalW;\nin vec2 _uvUv0;\nuniform vec3 _uview_position;\nuniform vec3 _ulight_globalAmbient;\nfloat _usaturate(in float _ux){\nreturn clamp(_ux, 0.0, 1.0);\n}\nvec4 _udReflection;\nvec3 _udAlbedo;\nvec3 _udNormalW;\nvec3 _udVertexNormalW;\nvec3 _udViewDirW;\nvec3 _udReflDirW;\nvec3 _udDiffuseLight;\nvec3 _udSpecularLight;\nvec3 _udLightDirNormW;\nvec3 _udShadowCoord;\nvec3 _udSpecularity;\nfloat _udGlossiness;\nfloat _udAlpha;\nfloat _udAtten;\nuniform vec3 _ulight0_color;\nuniform vec3 _ulight0_direction;\nuniform mat4 _ulight0_shadowMatrix;\nuniform mat4 _ulight0_shadowMatrixPalette[4];\nuniform float _ulight0_shadowCascadeDistances[4];\nuniform float _ulight0_shadowCascadeCount;\nuniform vec3 _ulight0_shadowParams;\nuniform sampler2DShadow _ulight0_shadowMap;\nvoid _ugetNormal(){\n(_udNormalW = normalize(_udVertexNormalW));\n}\nvec3 _ugammaCorrectInput(in vec3 _ucolor){\nreturn pow(_ucolor, vec3(2.2, 2.2, 2.2));\n}\nvec3 _ugammaCorrectOutput(in vec3 _ucolor){\n(_ucolor += vec3(1e-07, 1e-07, 1e-07));\nreturn pow(_ucolor, vec3(0.44999999, 0.44999999, 0.44999999));\n}\nuniform float _uexposure;\nvec3 _utoneMap(in vec3 _ucolor){\nreturn (_ucolor * _uexposure);\n}\nvec3 _uaddFog(in vec3 _ucolor){\nreturn _ucolor;\n}\nvec3 _uaddAlbedoDetail(in vec3 _ualbedo){\nreturn _ualbedo;\n}\nuniform sampler2D _utexture_diffuseMap;\nvoid _ugetAlbedo(){\n(_udAlbedo = vec3(1.0, 1.0, 1.0));\n(_udAlbedo *= _ugammaCorrectInput(_uaddAlbedoDetail(texture(_utexture_diffuseMap, _uvUv0).xyz)));\n}\nuniform vec3 _umaterial_emissive;\nvec3 _ugetEmission(){\nvec3 _uemission = vec3(1.0, 1.0, 1.0);\n(_uemission *= _umaterial_emissive);\nreturn _uemission;\n}\nfloat _uantiAliasGlossiness(in float _upower){\nreturn _upower;\n}\nuniform vec3 _umaterial_specular;\nvoid _ugetSpecularity(){\n(_udSpecularity = vec3(1.0, 1.0, 1.0));\n(_udSpecularity *= _umaterial_specular);\n}\nuniform float _umaterial_shininess;\nvoid _ugetGlossiness(){\n(_udGlossiness = 1.0);\n(_udGlossiness *= _umaterial_shininess);\n(_udGlossiness += 1e-07);\n}\nuniform float _umaterial_fresnelFactor;\nvoid _ugetFresnel(){\nfloat _ufresnel = (1.0 - max(dot(_udNormalW, _udViewDirW), 0.0));\nfloat _ufresnel2 = (_ufresnel * _ufresnel);\n(_ufresnel *= (_ufresnel2 * _ufresnel2));\n(_ufresnel *= (_udGlossiness * _udGlossiness));\n(_udSpecularity = (_udSpecularity + ((1.0 - _udSpecularity) * _ufresnel)));\n}\nvoid _ufadeShadow(in float _ushadowCascadeDistances[4]){\nfloat _udepth = (1.0 / gl_FragCoord.w);\nif ((_udepth > _ushadowCascadeDistances[3]))\n{\n(_udShadowCoord.z = -9999999.0);\n}\n}\nfloat _u_getShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nfloat _uz = _udShadowCoord.z;\nvec2 _uuv = (_udShadowCoord.xy * _ushadowParams.x);\nfloat _ushadowMapSizeInv = (1.0 / _ushadowParams.x);\nvec2 _ubase_uv = floor((_uuv + vec2(0.5, 0.5)));\nfloat _us = ((_uuv.x + 0.5) - _ubase_uv.x);\nfloat _ut = ((_uuv.y + 0.5) - _ubase_uv.y);\n(_ubase_uv -= vec2(0.5, 0.5));\n(_ubase_uv *= _ushadowMapSizeInv);\nfloat _usum = 0.0;\nfloat _uuw0 = (3.0 - (2.0 * _us));\nfloat _uuw1 = (1.0 + (2.0 * _us));\nfloat _uu0 = (((2.0 - _us) / _uuw0) - 1.0);\nfloat _uu1 = ((_us / _uuw1) + 1.0);\nfloat _uvw0 = (3.0 - (2.0 * _ut));\nfloat _uvw1 = (1.0 + (2.0 * _ut));\nfloat _uv0 = (((2.0 - _ut) / _uvw0) - 1.0);\nfloat _uv1 = ((_ut / _uvw1) + 1.0);\n(_uu0 = ((_uu0 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv0 = ((_uv0 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_uu1 = ((_uu1 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv1 = ((_uv1 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_usum += ((_uuw0 * _uvw0) * texture(_ushadowMap, vec3(_uu0, _uv0, _uz))));\n(_usum += ((_uuw1 * _uvw0) * texture(_ushadowMap, vec3(_uu1, _uv0, _uz))));\n(_usum += ((_uuw0 * _uvw1) * texture(_ushadowMap, vec3(_uu0, _uv1, _uz))));\n(_usum += ((_uuw1 * _uvw1) * texture(_ushadowMap, vec3(_uu1, _uv1, _uz))));\n(_usum *= 0.0625);\nreturn _usum;\n}\nfloat _ugetShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nreturn _u_getShadowPCF3x3(_ushadowMap, _ushadowParams);\n}\nvoid _u_getShadowCoordOrtho(in mat4 _ushadowMatrix, in vec3 _ushadowParams, in vec3 _uwPos){\n(_udShadowCoord = (_ushadowMatrix * vec4(_uwPos, 1.0)).xyz);\n(_udShadowCoord.z = (_usaturate(_udShadowCoord.z) - 9.9999997e-05));\n}\nvoid _ugetShadowCoordOrthoNormalOffset(in mat4 _ushadowMatrix, in vec3 _ushadowParams){\nvec3 _uwPos = (_uvPositionW + ((_udVertexNormalW * _ushadowParams.y) * clamp((1.0 - dot(_udVertexNormalW, (-_udLightDirNormW))), 0.0, 1.0)));\n_u_getShadowCoordOrtho(_ushadowMatrix, _ushadowParams, _uwPos);\n}\nfloat _ugetLightDiffuse(){\nreturn max(dot(_udNormalW, (-_udLightDirNormW)), 0.0);\n}\nfloat _ucalcLightSpecular(in float _utGlossiness, in vec3 _utNormalW){\nvec3 _uh = normalize(((-_udLightDirNormW) + _udViewDirW));\nfloat _unh = max(dot(_uh, _utNormalW), 0.0);\nfloat _uspecPow = exp2((_utGlossiness * 11.0));\n(_uspecPow = _uantiAliasGlossiness(_uspecPow));\n(_uspecPow = max(_uspecPow, 9.9999997e-05));\nreturn ((pow(_unh, _uspecPow) * (_uspecPow + 2.0)) / 8.0);\n}\nfloat _ugetLightSpecular(){\nreturn _ucalcLightSpecular(_udGlossiness, _udNormalW);\n}\nvec3 _ucombineColor(){\nreturn mix((_udAlbedo * _udDiffuseLight), (_udSpecularLight + (_udReflection.xyz * _udReflection.w)), _udSpecularity);\n}\nvoid _uaddAmbient(){\n(_udDiffuseLight += _ulight_globalAmbient);\n}\nvoid _ugetViewDir(){\n(_udViewDirW = normalize((_uview_position - _uvPositionW)));\n}\nvoid _ugetReflDir(){\n(_udReflDirW = normalize((-reflect(_udViewDirW, _udNormalW))));\n}\nvoid main(){\ninitGlobals();\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = normalize(_uvNormalW));\n(_udAlpha = 1.0);\n_ugetViewDir();\n_ugetNormal();\n_ugetReflDir();\n_ugetAlbedo();\n_ugetSpecularity();\n_ugetGlossiness();\n_ugetFresnel();\n_uaddAmbient();\n(_udLightDirNormW = _ulight0_direction);\n(_udAtten = 1.0);\n(_udAtten *= _ugetLightDiffuse());\n_ugetShadowCoordOrthoNormalOffset(_ulight0_shadowMatrix, _ulight0_shadowParams);\n_ufadeShadow(_ulight0_shadowCascadeDistances);\n(_udAtten *= _ugetShadowPCF3x3(_ulight0_shadowMap, _ulight0_shadowParams));\n(_udDiffuseLight += (_udAtten * _ulight0_color));\n(_udSpecularLight += ((_ugetLightSpecular() * _udAtten) * _ulight0_color));\n(_upc_fragColor.xyz = _ucombineColor());\n(_upc_fragColor.xyz += _ugetEmission());\n(_upc_fragColor.xyz = _uaddFog(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _utoneMap(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _ugammaCorrectOutput(_upc_fragColor.xyz));\n(_upc_fragColor.w = 1.0);\n}\nvoid initGlobals(){\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udAlbedo = vec3(0.0, 0.0, 0.0));\n(_udNormalW = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = vec3(0.0, 0.0, 0.0));\n(_udViewDirW = vec3(0.0, 0.0, 0.0));\n(_udReflDirW = vec3(0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udLightDirNormW = vec3(0.0, 0.0, 0.0));\n(_udShadowCoord = vec3(0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udGlossiness = 0.0);\n(_udAlpha = 0.0);\n(_udAtten = 0.0);\n}\n\u0000"
                    }
                ],
                "elementArray": {
                    "arrayBuffer": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLBuffer",
                            "id": 5,
                            "displayText": "WebGLBuffer - ID: 5"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "target": "ELEMENT_ARRAY_BUFFER",
                            "length": 72,
                            "usage": 35048
                        }
                    }
                },
                "attributes": [
                    {
                        "name": "vertex_position",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": 0,
                        "offsetPointer": 192,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 4,
                                "displayText": "WebGLBuffer - ID: 4"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 1152,
                                "usage": 35048
                            }
                        },
                        "enabled": true,
                        "arraySize": 3,
                        "stride": 12,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "DYNAMIC_DRAW",
                        "bufferLength": 1152
                    },
                    {
                        "name": "vertex_normal",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": 1,
                        "offsetPointer": 480,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 4,
                                "displayText": "WebGLBuffer - ID: 4"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 1152,
                                "usage": 35048
                            }
                        },
                        "enabled": true,
                        "arraySize": 3,
                        "stride": 12,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "DYNAMIC_DRAW",
                        "bufferLength": 1152
                    },
                    {
                        "name": "vertex_texCoord0",
                        "size": 1,
                        "type": "FLOAT_VEC2",
                        "location": 5,
                        "offsetPointer": 0,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 4,
                                "displayText": "WebGLBuffer - ID: 4"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 1152,
                                "usage": 35048
                            }
                        },
                        "enabled": true,
                        "arraySize": 2,
                        "stride": 8,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "DYNAMIC_DRAW",
                        "bufferLength": 1152
                    }
                ],
                "uniforms": [
                    {
                        "name": "matrix_viewProjection",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 34,
                                "displayText": "WebGLUniformLocation - ID: 34"
                            }
                        },
                        "value": [
                            0.8800240159034729,
                            -0.8535534143447876,
                            -0.6124948859214783,
                            -0.6123723983764648,
                            0,
                            2.0907704830169678,
                            -0.5001000165939331,
                            -0.5,
                            -0.8800240159034729,
                            -0.8535534143447876,
                            -0.6124948859214783,
                            -0.6123723983764648,
                            0,
                            -0.4892691373825073,
                            6.450289249420166,
                            6.648979187011719
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "matrix_model",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 35,
                                "displayText": "WebGLUniformLocation - ID: 35"
                            }
                        },
                        "value": [
                            -1,
                            1.2246468525851679e-16,
                            0,
                            0,
                            1.2246468525851679e-16,
                            1,
                            1.2246468525851679e-16,
                            0,
                            5.999039028884777e-32,
                            4.898587410340671e-16,
                            -4,
                            0,
                            0,
                            0.5,
                            0,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "matrix_normal",
                        "size": 1,
                        "type": "FLOAT_MAT3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 36,
                                "displayText": "WebGLUniformLocation - ID: 36"
                            }
                        },
                        "value": [
                            -1,
                            1.2246468525851679e-16,
                            1.563254935637622e-39,
                            1.2246468525851679e-16,
                            1,
                            1.2246468525851679e-16,
                            3.74939976039497e-33,
                            3.0616171314629196e-17,
                            -0.25
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "view_position",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 37,
                                "displayText": "WebGLUniformLocation - ID: 37"
                            }
                        },
                        "value": [
                            4,
                            3.5,
                            4
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light_globalAmbient",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 38,
                                "displayText": "WebGLUniformLocation - ID: 38"
                            }
                        },
                        "value": [
                            0.02899118699133396,
                            0.02899118699133396,
                            0.02899118699133396
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_color",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 39,
                                "displayText": "WebGLUniformLocation - ID: 39"
                            }
                        },
                        "value": [
                            1,
                            1,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_direction",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 40,
                                "displayText": "WebGLUniformLocation - ID: 40"
                            }
                        },
                        "value": [
                            -0.5,
                            -0.7071067690849304,
                            0.5
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowMatrix",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 41,
                                "displayText": "WebGLUniformLocation - ID: 41"
                            }
                        },
                        "value": [
                            -0.021421365439891815,
                            -0.0151471933349967,
                            -0.05613495036959648,
                            0,
                            0,
                            0.021421365439891815,
                            -0.07938680797815323,
                            0,
                            -0.021421365439891815,
                            0.0151471933349967,
                            0.05613495036959648,
                            0,
                            0.458984375,
                            0.509765625,
                            0.5330997109413147,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowCascadeDistances",
                        "size": 4,
                        "type": "FLOAT",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 42,
                                "displayText": "WebGLUniformLocation - ID: 42"
                            }
                        },
                        "values": [
                            {
                                "value": 16
                            },
                            {
                                "value": 16
                            },
                            {
                                "value": 16
                            },
                            {
                                "value": 16
                            }
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowParams",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 43,
                                "displayText": "WebGLUniformLocation - ID: 43"
                            }
                        },
                        "value": [
                            1024,
                            0.05000000074505806,
                            -0.022453980520367622
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "exposure",
                        "size": 1,
                        "type": "FLOAT",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 44,
                                "displayText": "WebGLUniformLocation - ID: 44"
                            }
                        },
                        "value": 1,
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "material_emissive",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 45,
                                "displayText": "WebGLUniformLocation - ID: 45"
                            }
                        },
                        "value": [
                            0,
                            0,
                            0
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "material_specular",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 46,
                                "displayText": "WebGLUniformLocation - ID: 46"
                            }
                        },
                        "value": [
                            0.039427682757377625,
                            0.039427682757377625,
                            0.039427682757377625
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "material_shininess",
                        "size": 1,
                        "type": "FLOAT",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 47,
                                "displayText": "WebGLUniformLocation - ID: 47"
                            }
                        },
                        "value": 0.3199999928474426,
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowMap",
                        "size": 1,
                        "type": "SAMPLER_2D_SHADOW",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 48,
                                "displayText": "WebGLUniformLocation - ID: 48"
                            }
                        },
                        "value": 0,
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false,
                        "texture": {
                            "magFilter": "LINEAR",
                            "minFilter": "LINEAR",
                            "wrapS": "CLAMP_TO_EDGE",
                            "wrapT": "CLAMP_TO_EDGE",
                            "anisotropy": 1,
                            "baseLevel": 0,
                            "immutable": false,
                            "immutableLevels": 0,
                            "maxLevel": 1000,
                            "maxLod": 1000,
                            "minLod": -1000,
                            "compareFunc": "LESS",
                            "compareMode": "COMPARE_REF_TO_TEXTURE",
                            "wrapR": "REPEAT",
                            "textureType": "FLOAT",
                            "format": "DEPTH_COMPONENT",
                            "internalFormat": "DEPTH_COMPONENT32F",
                            "width": 1024,
                            "height": 1024,
                            "visual": {}
                        }
                    },
                    {
                        "name": "texture_diffuseMap",
                        "size": 1,
                        "type": "SAMPLER_2D",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 49,
                                "displayText": "WebGLUniformLocation - ID: 49"
                            }
                        },
                        "value": 1,
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false,
                        "texture": {
                            "magFilter": "LINEAR",
                            "minFilter": "LINEAR_MIPMAP_LINEAR",
                            "wrapS": "REPEAT",
                            "wrapT": "REPEAT",
                            "anisotropy": 1,
                            "baseLevel": 0,
                            "immutable": false,
                            "immutableLevels": 0,
                            "maxLevel": 1000,
                            "maxLod": 1000,
                            "minLod": -1000,
                            "compareFunc": "LESS",
                            "compareMode": "NONE",
                            "wrapR": "REPEAT",
                            "textureType": "UNSIGNED_BYTE",
                            "format": "RGBA",
                            "internalFormat": "RGBA8",
                            "width": 64,
                            "height": 64,
                            "visual": {
                                "TEXTURE_2D": "data:image/png;base64,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"
                            }
                        }
                    }
                ],
                "uniformBlocks": []
            }
        },
        {
            "id": 33,
            "startTime": 1629734999261.1,
            "commandEndTime": 1629734999261.1,
            "endTime": 1629734999261.9,
            "name": "useProgram",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLProgram",
                        "id": 2,
                        "displayText": "WebGLProgram - ID: 2"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "programStatus": {
                            "LINK_STATUS": true,
                            "VALIDATE_STATUS": false
                        },
                        "shaders": [
                            {
                                "COMPILE_STATUS": true,
                                "fragment": false,
                                "name": "Vertex",
                                "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n#ifdef MORPHING_TEXTURE_BASED_NORMAL\nuniform highp sampler2D morphNormalTex;\n#endif\n\nvec3 getNormal() {\n\t#ifdef SKIN\n\tdNormalMatrix = mat3(dModelMatrix[0].xyz, dModelMatrix[1].xyz, dModelMatrix[2].xyz);\n\t#elif defined(INSTANCING)\n\tdNormalMatrix = mat3(instance_line1.xyz, instance_line2.xyz, instance_line3.xyz);\n\t#else\n\tdNormalMatrix = matrix_normal;\n\t#endif\n\n\tvec3 tempNormal = vertex_normal;\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_NRM03\n\ttempNormal += morph_weights_a[0] * morph_nrm0;\n\ttempNormal += morph_weights_a[1] * morph_nrm1;\n\ttempNormal += morph_weights_a[2] * morph_nrm2;\n\ttempNormal += morph_weights_a[3] * morph_nrm3;\n\t#endif\n\t#ifdef MORPHING_NRM47\n\ttempNormal += morph_weights_b[0] * morph_nrm4;\n\ttempNormal += morph_weights_b[1] * morph_nrm5;\n\ttempNormal += morph_weights_b[2] * morph_nrm6;\n\ttempNormal += morph_weights_b[3] * morph_nrm7;\n\t#endif\n\t#endif\n\n\t#ifdef MORPHING_TEXTURE_BASED_NORMAL\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphNormal = texture2D(morphNormalTex, morphUV).xyz;\n\ttempNormal += morphNormal;\n\t#endif\n\n\treturn normalize(dNormalMatrix * tempNormal);\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\t vNormalW = getNormal();\n\n}",
                                "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nout vec3 _uvNormalW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat3 _udNormalMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvec3 _ugetNormal(){\n(_udNormalMatrix = _umatrix_normal);\nvec3 _utempNormal = _uvertex_normal;\nreturn normalize((_udNormalMatrix * _utempNormal));\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvNormalW = vec3(0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n(_uvNormalW = _ugetNormal());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n(_udNormalMatrix = mat3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                            },
                            {
                                "COMPILE_STATUS": true,
                                "fragment": true,
                                "name": "Fragment",
                                "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nuniform vec3 view_position;\n\nuniform vec3 light_globalAmbient;\n\nfloat square(float x) {\n\treturn x*x;\n}\n\nfloat saturate(float x) {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nvec3 saturate(vec3 x) {\n\treturn clamp(x, vec3(0.0), vec3(1.0));\n}\nvec4 dReflection;\nvec3 dAlbedo;\nvec3 dNormalW;\nvec3 dVertexNormalW;\nvec3 dViewDirW;\nvec3 dDiffuseLight;\nvec3 dSpecularLight;\nvec3 dLightDirNormW;\nvec3 dLightDirW;\nvec3 dLightPosW;\nvec3 dShadowCoord;\nvec3 dSpecularity;\nfloat dAlpha;\nfloat dAtten;\nvec4 ccReflection;\nvec3 ccSpecularLight;\n#define AREA_LUTS_PRECISION highp\nuniform vec3 light0_color;\nuniform vec3 light0_direction;\nuniform mat4 light0_shadowMatrix;\nuniform mat4 light0_shadowMatrixPalette[4];\nuniform float light0_shadowCascadeDistances[4];\nuniform float light0_shadowCascadeCount;\nuniform vec3 light0_shadowParams;\nuniform sampler2DShadow light0_shadowMap;\n\nvoid getNormal() {\n\tdNormalW = normalize(dVertexNormalW);\n}\nvec3 gammaCorrectInput(vec3 color) {\n\treturn pow(color, vec3(2.2));\n}\n\nfloat gammaCorrectInput(float color) {\n\treturn pow(color, 2.2);\n}\n\nvec4 gammaCorrectInput(vec4 color) {\n\treturn vec4(pow(color.rgb, vec3(2.2)), color.a);\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv) {\n\tvec4 rgba = texture2D(tex, uv);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv, float bias) {\n\tvec4 rgba = texture2D(tex, uv, bias);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 textureCubeSRGB(samplerCube tex, vec3 uvw) {\n\tvec4 rgba = textureCube(tex, uvw);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec3 gammaCorrectOutput(vec3 color) {\n\t#ifdef HDR\n\treturn color;\n\t#else\n\tcolor += vec3(0.0000001);\n\treturn pow(color, vec3(0.45));\n\t#endif\n}\nuniform float exposure;\n\nvec3 toneMap(vec3 color) {\n\treturn color * exposure;\n}\nfloat dBlendModeFogFactor = 1.0;\n\nvec3 addFog(vec3 color) {\n\treturn color;\n}\n#ifdef CUBEMAP_ROTATION\nuniform mat3 cubeMapRotationMatrix;\n#endif\n\nvec3 cubeMapRotate(vec3 refDir) {\n#ifdef CUBEMAP_ROTATION\n\treturn refDir * cubeMapRotationMatrix;\n#else\n\treturn refDir;\n#endif\n}\nvec3 cubeMapProject(vec3 dir) {\n\treturn cubeMapRotate(dir);\n}\nvec3 processEnvironment(vec3 color) {\n\treturn color;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_diffuse;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseMap;\n#endif\n\nvoid getAlbedo() {\n\tdAlbedo = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdAlbedo *= material_diffuse.rgb;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdAlbedo *= gammaCorrectInput(addAlbedoDetail(texture2D(texture_diffuseMap, UV).CH));\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdAlbedo *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_emissive;\n#endif\n\n#ifdef MAPFLOAT\nuniform float material_emissiveIntensity;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_emissiveMap;\n#endif\n\nvec3 getEmission() {\n\tvec3 emission = vec3(1.0);\n\n\t#ifdef MAPFLOAT\n\temission *= material_emissiveIntensity;\n\t#endif\n\n\t#ifdef MAPCOLOR\n\temission *= material_emissive;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\temission *= texture2DSAMPLE(texture_emissiveMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\temission *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n\n\treturn emission;\n}\nconst float maxCascades = 4.0;\n\n// shadow matrix for selected cascade\nmat4 cascadeShadowMat;\n\n// function which selects a shadow projection matrix based on cascade distances \nvoid getShadowCascadeMatrix(mat4 shadowMatrixPalette[4], float shadowCascadeDistances[4], float shadowCascadeCount) {\n\n\t// depth in 0 .. far plane range\n\tfloat depth = 1.0 / gl_FragCoord.w;\n\n\t// find cascade index based on the depth (loop as there is no per component vec compare operator in webgl)\n\tfloat cascadeIndex = 0.0;\n\tfor (float i = 0.0; i < maxCascades; i++) {\n\t\tif (depth < shadowCascadeDistances[int(i)]) {\n\t\t\tcascadeIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// limit to actual number of used cascades\n\tcascadeIndex = min(cascadeIndex, shadowCascadeCount - 1.0);\n\n\t// pick shadow matrix\n\t#ifdef GL2\n\t\tcascadeShadowMat = shadowMatrixPalette[int(cascadeIndex)];\n\t#else\n\t\t// webgl 1 does not allow non-cost index array lookup\n\t\tif (cascadeIndex == 0.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[0];\n\t\t}\n\t\telse if (cascadeIndex == 1.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[1];\n\t\t}\n\t\telse if (cascadeIndex == 2.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[2];\n\t\t}\n\t\telse {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[3];\n\t\t}\n\t#endif\n}\n\nvoid fadeShadow(float shadowCascadeDistances[4]) {\t\t\t\t  \n\n\t// if the pixel is past the shadow distance, remove shadow\n\t// this enforces straight line instead of corner of shadow which moves when camera rotates  \n\tfloat depth = 1.0 / gl_FragCoord.w;\n\tif (depth > shadowCascadeDistances[int(maxCascades - 1.0)]) {\n\t\tdShadowCoord.z = -9999999.0;\n\t}\n}\nvec3 lessThan2(vec3 a, vec3 b) {\n\treturn clamp((b - a)*1000.0, 0.0, 1.0); // softer version\n}\n\n#ifndef UNPACKFLOAT\n#define UNPACKFLOAT\nfloat unpackFloat(vec4 rgbaDepth) {\n\tconst vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\treturn dot(rgbaDepth, bitShift);\n}\n#endif\n\n// ----- Direct/Spot Sampling -----\n\n#ifdef GL2\nfloat _getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\tfloat z = dShadowCoord.z;\n\tvec2 uv = dShadowCoord.xy * shadowParams.x; // 1 unit - 1 texel\n\tfloat shadowMapSizeInv = 1.0 / shadowParams.x;\n\tvec2 base_uv = floor(uv + 0.5);\n\tfloat s = (uv.x + 0.5 - base_uv.x);\n\tfloat t = (uv.y + 0.5 - base_uv.y);\n\tbase_uv -= vec2(0.5);\n\tbase_uv *= shadowMapSizeInv;\n\n\tfloat sum = 0.0;\n\n\tfloat uw0 = (3.0 - 2.0 * s);\n\tfloat uw1 = (1.0 + 2.0 * s);\n\n\tfloat u0 = (2.0 - s) / uw0 - 1.0;\n\tfloat u1 = s / uw1 + 1.0;\n\n\tfloat vw0 = (3.0 - 2.0 * t);\n\tfloat vw1 = (1.0 + 2.0 * t);\n\n\tfloat v0 = (2.0 - t) / vw0 - 1.0;\n\tfloat v1 = t / vw1 + 1.0;\n\n\tu0 = u0 * shadowMapSizeInv + base_uv.x;\n\tv0 = v0 * shadowMapSizeInv + base_uv.y;\n\n\tu1 = u1 * shadowMapSizeInv + base_uv.x;\n\tv1 = v1 * shadowMapSizeInv + base_uv.y;\n\n\tsum += uw0 * vw0 * texture(shadowMap, vec3(u0, v0, z));\n\tsum += uw1 * vw0 * texture(shadowMap, vec3(u1, v0, z));\n\tsum += uw0 * vw1 * texture(shadowMap, vec3(u0, v1, z));\n\tsum += uw1 * vw1 * texture(shadowMap, vec3(u1, v1, z));\n\n\tsum *= 1.0f / 16.0;\n\treturn sum;\n}\n\nfloat getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2DShadow shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#else\nfloat _xgetShadowPCF3x3(mat3 depthKernel, sampler2D shadowMap, vec3 shadowParams) {\n\tmat3 shadowKernel;\n\tvec3 shadowCoord = dShadowCoord;\n\tvec3 shadowZ = vec3(shadowCoord.z);\n\tshadowKernel[0] = vec3(greaterThan(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(greaterThan(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(greaterThan(depthKernel[2], shadowZ));\n\n\tvec2 fractionalCoord = fract( shadowCoord.xy * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat _getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\tvec3 shadowCoord = dShadowCoord;\n\n\tfloat xoffset = 1.0 / shadowParams.x; // 1/shadow map width\n\tfloat dx0 = -xoffset;\n\tfloat dx1 = xoffset;\n\n\tmat3 depthKernel;\n\tdepthKernel[0][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx0)));\n\tdepthKernel[0][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, 0.0)));\n\tdepthKernel[0][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx1)));\n\tdepthKernel[1][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx0)));\n\tdepthKernel[1][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy));\n\tdepthKernel[1][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx1)));\n\tdepthKernel[2][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx0)));\n\tdepthKernel[2][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, 0.0)));\n\tdepthKernel[2][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx1)));\n\n\treturn _xgetShadowPCF3x3(depthKernel, shadowMap, shadowParams);\n}\n\nfloat getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2D shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#endif\n\n\n// ----- Point Sampling -----\n\nfloat _getShadowPoint(samplerCube shadowMap, vec4 shadowParams, vec3 dir) {\n\n\tvec3 tc = normalize(dir);\n\tvec3 tcAbs = abs(tc);\n\n\tvec4 dirX = vec4(1,0,0, tc.x);\n\tvec4 dirY = vec4(0,1,0, tc.y);\n\tfloat majorAxisLength = tc.z;\n\tif ((tcAbs.x > tcAbs.y) && (tcAbs.x > tcAbs.z)) {\n\t\tdirX = vec4(0,0,1, tc.z);\n\t\tdirY = vec4(0,1,0, tc.y);\n\t\tmajorAxisLength = tc.x;\n\t} else if ((tcAbs.y > tcAbs.x) && (tcAbs.y > tcAbs.z)) {\n\t\tdirX = vec4(1,0,0, tc.x);\n\t\tdirY = vec4(0,0,1, tc.z);\n\t\tmajorAxisLength = tc.y;\n\t}\n\n\tfloat shadowParamsInFaceSpace = ((1.0/shadowParams.x) * 2.0) * abs(majorAxisLength);\n\n\tvec3 xoffset = (dirX.xyz * shadowParamsInFaceSpace);\n\tvec3 yoffset = (dirY.xyz * shadowParamsInFaceSpace);\n\tvec3 dx0 = -xoffset;\n\tvec3 dy0 = -yoffset;\n\tvec3 dx1 = xoffset;\n\tvec3 dy1 = yoffset;\n\n\tmat3 shadowKernel;\n\tmat3 depthKernel;\n\n\tdepthKernel[0][0] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy0));\n\tdepthKernel[0][1] = unpackFloat(textureCube(shadowMap, tc + dx0));\n\tdepthKernel[0][2] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy1));\n\tdepthKernel[1][0] = unpackFloat(textureCube(shadowMap, tc + dy0));\n\tdepthKernel[1][1] = unpackFloat(textureCube(shadowMap, tc));\n\tdepthKernel[1][2] = unpackFloat(textureCube(shadowMap, tc + dy1));\n\tdepthKernel[2][0] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy0));\n\tdepthKernel[2][1] = unpackFloat(textureCube(shadowMap, tc + dx1));\n\tdepthKernel[2][2] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy1));\n\n\tvec3 shadowZ = vec3(length(dir) * shadowParams.w + shadowParams.z);\n\n\tshadowKernel[0] = vec3(lessThan2(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(lessThan2(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(lessThan2(depthKernel[2], shadowZ));\n\n\tvec2 uv = (vec2(dirX.w, dirY.w) / abs(majorAxisLength)) * 0.5;\n\n\tvec2 fractionalCoord = fract( uv * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn 1.0 - dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat getShadowPointPCF3x3(samplerCube shadowMap, vec4 shadowParams) {\n\treturn _getShadowPoint(shadowMap, shadowParams, dLightDirW);\n}\nvoid _getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams, vec3 wPos) {\n\tdShadowCoord = (shadowMatrix * vec4(wPos, 1.0)).xyz;\n\tdShadowCoord.z = saturate(dShadowCoord.z) - 0.0001;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid _getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n\tvec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n\tprojPos.xy /= projPos.w;\n\tdShadowCoord.xy = projPos.xy;\n\tdShadowCoord.z = length(dLightDirW) * shadowParams.w;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams) {\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams) {\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPerspNormalOffset(mat4 shadowMatrix, vec4 shadowParams) {\n\tfloat distScale = abs(dot(vPositionW - dLightPosW, dLightDirNormW)); // fov?\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale;\n\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, wPos);\n}\n\nvoid getShadowCoordOrthoNormalOffset(mat4 shadowMatrix, vec3 shadowParams) {\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0); //0.08\n\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, wPos);\n}\nvoid normalOffsetPointShadow(vec4 shadowParams) {\n\tfloat distScale = length(dLightDirW);\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale; //0.02\n\tvec3 dir = wPos - dLightPosW;\n\tdLightDirW = dir;\n}\nfloat getLightDiffuse() {\n\treturn max(dot(dNormalW, -dLightDirNormW), 0.0);\n}\nvec3 combineColor() {\n\treturn dAlbedo * dDiffuseLight;\n}\nvoid addAmbient() {\n\tdDiffuseLight += light_globalAmbient;\n}\nvoid getViewDir() {\n\tdViewDirW = normalize(view_position - vPositionW);\n}\nvoid main(void) {\n\tdDiffuseLight = vec3(0);\n\tdSpecularLight = vec3(0);\n\tdReflection = vec4(0);\n\tdSpecularity = vec3(0);\n\n\t#ifdef CLEARCOAT\n\tccSpecularLight = vec3(0);\n\tccReflection = vec4(0);\n\t#endif\n\t dVertexNormalW = normalize(vNormalW);\n\t dAlpha = 1.0;\n\t getViewDir();\n\t getNormal();\n\t getAlbedo();\n\t addAmbient();\n\t dLightDirNormW = light0_direction;\n\t dAtten = 1.0;\n\t\t\t dAtten *= getLightDiffuse();\ngetShadowCoordOrthoNormalOffset(light0_shadowMatrix, light0_shadowParams);\nfadeShadow(light0_shadowCascadeDistances);\n\t\t\t dAtten *= getShadowPCF3x3(light0_shadowMap, light0_shadowParams);\n\t\t\t dDiffuseLight += dAtten * light0_color;\n\n\n\t#ifdef CLEARCOAT\n\tgl_FragColor.rgb = combineColorCC();\n\t#else\n\tgl_FragColor.rgb = combineColor();\n\t#endif \n\n\tgl_FragColor.rgb += getEmission();\n\tgl_FragColor.rgb = addFog(gl_FragColor.rgb);\n\n\t#ifndef HDR\n\tgl_FragColor.rgb = toneMap(gl_FragColor.rgb);\n\tgl_FragColor.rgb = gammaCorrectOutput(gl_FragColor.rgb);\n\t#endif\ngl_FragColor.a = 1.0;\n\n}\n",
                                "translatedSource": "#version 450\nvoid initGlobals();\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nin vec3 _uvNormalW;\nuniform vec3 _uview_position;\nuniform vec3 _ulight_globalAmbient;\nfloat _usaturate(in float _ux){\nreturn clamp(_ux, 0.0, 1.0);\n}\nvec4 _udReflection;\nvec3 _udAlbedo;\nvec3 _udNormalW;\nvec3 _udVertexNormalW;\nvec3 _udViewDirW;\nvec3 _udDiffuseLight;\nvec3 _udSpecularLight;\nvec3 _udLightDirNormW;\nvec3 _udShadowCoord;\nvec3 _udSpecularity;\nfloat _udAlpha;\nfloat _udAtten;\nuniform vec3 _ulight0_color;\nuniform vec3 _ulight0_direction;\nuniform mat4 _ulight0_shadowMatrix;\nuniform mat4 _ulight0_shadowMatrixPalette[4];\nuniform float _ulight0_shadowCascadeDistances[4];\nuniform float _ulight0_shadowCascadeCount;\nuniform vec3 _ulight0_shadowParams;\nuniform sampler2DShadow _ulight0_shadowMap;\nvoid _ugetNormal(){\n(_udNormalW = normalize(_udVertexNormalW));\n}\nvec3 _ugammaCorrectOutput(in vec3 _ucolor){\n(_ucolor += vec3(1e-07, 1e-07, 1e-07));\nreturn pow(_ucolor, vec3(0.44999999, 0.44999999, 0.44999999));\n}\nuniform float _uexposure;\nvec3 _utoneMap(in vec3 _ucolor){\nreturn (_ucolor * _uexposure);\n}\nvec3 _uaddFog(in vec3 _ucolor){\nreturn _ucolor;\n}\nvoid _ugetAlbedo(){\n(_udAlbedo = vec3(1.0, 1.0, 1.0));\n}\nuniform vec3 _umaterial_emissive;\nvec3 _ugetEmission(){\nvec3 _uemission = vec3(1.0, 1.0, 1.0);\n(_uemission *= _umaterial_emissive);\nreturn _uemission;\n}\nvoid _ufadeShadow(in float _ushadowCascadeDistances[4]){\nfloat _udepth = (1.0 / gl_FragCoord.w);\nif ((_udepth > _ushadowCascadeDistances[3]))\n{\n(_udShadowCoord.z = -9999999.0);\n}\n}\nfloat _u_getShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nfloat _uz = _udShadowCoord.z;\nvec2 _uuv = (_udShadowCoord.xy * _ushadowParams.x);\nfloat _ushadowMapSizeInv = (1.0 / _ushadowParams.x);\nvec2 _ubase_uv = floor((_uuv + vec2(0.5, 0.5)));\nfloat _us = ((_uuv.x + 0.5) - _ubase_uv.x);\nfloat _ut = ((_uuv.y + 0.5) - _ubase_uv.y);\n(_ubase_uv -= vec2(0.5, 0.5));\n(_ubase_uv *= _ushadowMapSizeInv);\nfloat _usum = 0.0;\nfloat _uuw0 = (3.0 - (2.0 * _us));\nfloat _uuw1 = (1.0 + (2.0 * _us));\nfloat _uu0 = (((2.0 - _us) / _uuw0) - 1.0);\nfloat _uu1 = ((_us / _uuw1) + 1.0);\nfloat _uvw0 = (3.0 - (2.0 * _ut));\nfloat _uvw1 = (1.0 + (2.0 * _ut));\nfloat _uv0 = (((2.0 - _ut) / _uvw0) - 1.0);\nfloat _uv1 = ((_ut / _uvw1) + 1.0);\n(_uu0 = ((_uu0 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv0 = ((_uv0 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_uu1 = ((_uu1 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv1 = ((_uv1 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_usum += ((_uuw0 * _uvw0) * texture(_ushadowMap, vec3(_uu0, _uv0, _uz))));\n(_usum += ((_uuw1 * _uvw0) * texture(_ushadowMap, vec3(_uu1, _uv0, _uz))));\n(_usum += ((_uuw0 * _uvw1) * texture(_ushadowMap, vec3(_uu0, _uv1, _uz))));\n(_usum += ((_uuw1 * _uvw1) * texture(_ushadowMap, vec3(_uu1, _uv1, _uz))));\n(_usum *= 0.0625);\nreturn _usum;\n}\nfloat _ugetShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nreturn _u_getShadowPCF3x3(_ushadowMap, _ushadowParams);\n}\nvoid _u_getShadowCoordOrtho(in mat4 _ushadowMatrix, in vec3 _ushadowParams, in vec3 _uwPos){\n(_udShadowCoord = (_ushadowMatrix * vec4(_uwPos, 1.0)).xyz);\n(_udShadowCoord.z = (_usaturate(_udShadowCoord.z) - 9.9999997e-05));\n}\nvoid _ugetShadowCoordOrthoNormalOffset(in mat4 _ushadowMatrix, in vec3 _ushadowParams){\nvec3 _uwPos = (_uvPositionW + ((_udVertexNormalW * _ushadowParams.y) * clamp((1.0 - dot(_udVertexNormalW, (-_udLightDirNormW))), 0.0, 1.0)));\n_u_getShadowCoordOrtho(_ushadowMatrix, _ushadowParams, _uwPos);\n}\nfloat _ugetLightDiffuse(){\nreturn max(dot(_udNormalW, (-_udLightDirNormW)), 0.0);\n}\nvec3 _ucombineColor(){\nreturn (_udAlbedo * _udDiffuseLight);\n}\nvoid _uaddAmbient(){\n(_udDiffuseLight += _ulight_globalAmbient);\n}\nvoid _ugetViewDir(){\n(_udViewDirW = normalize((_uview_position - _uvPositionW)));\n}\nvoid main(){\ninitGlobals();\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = normalize(_uvNormalW));\n(_udAlpha = 1.0);\n_ugetViewDir();\n_ugetNormal();\n_ugetAlbedo();\n_uaddAmbient();\n(_udLightDirNormW = _ulight0_direction);\n(_udAtten = 1.0);\n(_udAtten *= _ugetLightDiffuse());\n_ugetShadowCoordOrthoNormalOffset(_ulight0_shadowMatrix, _ulight0_shadowParams);\n_ufadeShadow(_ulight0_shadowCascadeDistances);\n(_udAtten *= _ugetShadowPCF3x3(_ulight0_shadowMap, _ulight0_shadowParams));\n(_udDiffuseLight += (_udAtten * _ulight0_color));\n(_upc_fragColor.xyz = _ucombineColor());\n(_upc_fragColor.xyz += _ugetEmission());\n(_upc_fragColor.xyz = _uaddFog(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _utoneMap(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _ugammaCorrectOutput(_upc_fragColor.xyz));\n(_upc_fragColor.w = 1.0);\n}\nvoid initGlobals(){\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udAlbedo = vec3(0.0, 0.0, 0.0));\n(_udNormalW = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = vec3(0.0, 0.0, 0.0));\n(_udViewDirW = vec3(0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udLightDirNormW = vec3(0.0, 0.0, 0.0));\n(_udShadowCoord = vec3(0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udAlpha = 0.0);\n(_udAtten = 0.0);\n}\n\u0000"
                            }
                        ],
                        "length": 20021
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setShader (https://code.playcanvas.com/playcanvas-stable.dbg.js:15674:13)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23060:53)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23913:11)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 0,
            "marker": "Camera | World # ",
            "text": "useProgram: WebGLProgram - ID: 2"
        },
        {
            "id": 34,
            "startTime": 1629734999261.9,
            "commandEndTime": 1629734999261.9,
            "endTime": 1629734999262,
            "name": "bindVertexArray",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLVertexArrayObject",
                        "id": 0,
                        "displayText": "WebGLVertexArrayObject - ID: 0"
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15003:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "bindVertexArray: WebGLVertexArrayObject - ID: 0"
        },
        {
            "id": 35,
            "startTime": 1629734999262,
            "commandEndTime": 1629734999262,
            "endTime": 1629734999262.2,
            "name": "bindBuffer",
            "commandArguments": [
                34963,
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLBuffer",
                        "id": 3,
                        "displayText": "WebGLBuffer - ID: 3"
                    },
                    "__SPECTOR_Object_CustomData": {
                        "target": "ELEMENT_ARRAY_BUFFER",
                        "length": 12,
                        "usage": 35044
                    }
                }
            ],
            "stackTrace": [
                "GraphicsDevice.setBuffers (https://code.playcanvas.com/playcanvas-stable.dbg.js:15008:7)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15021:10)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "bindBuffer: ELEMENT_ARRAY_BUFFER, WebGLBuffer - ID: 3"
        },
        {
            "id": 36,
            "startTime": 1629734999262.2,
            "commandEndTime": 1629734999262.2,
            "endTime": 1629734999262.3,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 18,
                        "displayText": "WebGLUniformLocation - ID: 18"
                    }
                },
                false,
                {
                    "0": 0.8800240159034729,
                    "1": -0.8535534143447876,
                    "2": -0.6124948859214783,
                    "3": -0.6123723983764648,
                    "4": 0,
                    "5": 2.0907704830169678,
                    "6": -0.5001000165939331,
                    "7": -0.5,
                    "8": -0.8800240159034729,
                    "9": -0.8535534143447876,
                    "10": -0.6124948859214783,
                    "11": -0.6123723983764648,
                    "12": 0,
                    "13": -0.4892691373825073,
                    "14": 6.450289249420166,
                    "15": 6.648979187011719
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 18, false, [..(16)..]"
        },
        {
            "id": 37,
            "startTime": 1629734999262.3,
            "commandEndTime": 1629734999262.3,
            "endTime": 1629734999262.4,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 19,
                        "displayText": "WebGLUniformLocation - ID: 19"
                    }
                },
                false,
                {
                    "0": 8,
                    "1": 0,
                    "2": 0,
                    "3": 0,
                    "4": 0,
                    "5": 1,
                    "6": 0,
                    "7": 0,
                    "8": 0,
                    "9": 0,
                    "10": 8,
                    "11": 0,
                    "12": 0,
                    "13": 0,
                    "14": 0,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 19, false, [..(16)..]"
        },
        {
            "id": 38,
            "startTime": 1629734999262.4,
            "commandEndTime": 1629734999262.4,
            "endTime": 1629734999262.5,
            "name": "uniformMatrix3fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 20,
                        "displayText": "WebGLUniformLocation - ID: 20"
                    }
                },
                false,
                {
                    "0": 0.125,
                    "1": 0,
                    "2": 0,
                    "3": 0,
                    "4": 1,
                    "5": 0,
                    "6": 0,
                    "7": 0,
                    "8": 0.125
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13570:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix3fv: WebGLUniformLocation - ID: 20, false, [..(9)..]"
        },
        {
            "id": 39,
            "startTime": 1629734999262.5,
            "commandEndTime": 1629734999262.5,
            "endTime": 1629734999262.7,
            "name": "uniformMatrix4fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 24,
                        "displayText": "WebGLUniformLocation - ID: 24"
                    }
                },
                false,
                {
                    "0": -0.021421365439891815,
                    "1": -0.0151471933349967,
                    "2": -0.05613495036959648,
                    "3": 0,
                    "4": 0,
                    "5": 0.021421365439891815,
                    "6": -0.07938680797815323,
                    "7": 0,
                    "8": -0.021421365439891815,
                    "9": 0.0151471933349967,
                    "10": 0.05613495036959648,
                    "11": 0,
                    "12": 0.458984375,
                    "13": 0.509765625,
                    "14": 0.5330997109413147,
                    "15": 1
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13574:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniformMatrix4fv: WebGLUniformLocation - ID: 24, false, [..(16)..]"
        },
        {
            "id": 40,
            "startTime": 1629734999262.7,
            "commandEndTime": 1629734999262.7,
            "endTime": 1629734999262.9,
            "name": "uniform1fv",
            "commandArguments": [
                {
                    "__SPECTOR_Object_TAG": {
                        "typeName": "WebGLUniformLocation",
                        "id": 25,
                        "displayText": "WebGLUniformLocation - ID: 25"
                    }
                },
                {
                    "0": 16,
                    "1": 16,
                    "2": 16,
                    "3": 16
                }
            ],
            "stackTrace": [
                "Array.GraphicsDevice._this.commitFunction.<computed> (https://code.playcanvas.com/playcanvas-stable.dbg.js:13578:8)",
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15080:44)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "uniform1fv: WebGLUniformLocation - ID: 25, [..(4)..]"
        },
        {
            "id": 41,
            "startTime": 1629734999262.9,
            "commandEndTime": 1629734999262.9,
            "endTime": 1629734999285.8,
            "name": "drawElements",
            "commandArguments": [
                4,
                6,
                5123,
                0
            ],
            "stackTrace": [
                "GraphicsDevice.draw (https://code.playcanvas.com/playcanvas-stable.dbg.js:15101:9)",
                "ForwardRenderer.drawInstance (https://code.playcanvas.com/playcanvas-stable.dbg.js:22842:12)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23191:17)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23913:11)"
            ],
            "status": 0,
            "marker": "Camera | World | Untitled # ",
            "text": "drawElements: TRIANGLES, 6, UNSIGNED_SHORT, 0",
            "BlendState": {
                "BLEND": false,
                "BLEND_COLOR": [
                    0,
                    0,
                    0,
                    0
                ],
                "BLEND_DST_ALPHA": "ZERO",
                "BLEND_DST_RGB": "ZERO",
                "BLEND_EQUATION_ALPHA": "FUNC_ADD",
                "BLEND_EQUATION_RGB": "FUNC_ADD",
                "BLEND_SRC_ALPHA": "ONE",
                "BLEND_SRC_RGB": "ONE"
            },
            "ColorState": {
                "COLOR_WRITEMASK": [
                    true,
                    true,
                    true,
                    true
                ]
            },
            "CoverageState": {
                "SAMPLE_COVERAGE_VALUE": 1,
                "SAMPLE_COVERAGE_INVERT": false,
                "SAMPLE_COVERAGE": false,
                "SAMPLE_ALPHA_TO_COVERAGE": false
            },
            "CullState": {
                "CULL_FACE": true,
                "CULL_FACE_MODE": "BACK"
            },
            "DepthState": {
                "DEPTH_TEST": true,
                "DEPTH_FUNC": "LEQUAL",
                "DEPTH_RANGE": [
                    0,
                    1
                ],
                "DEPTH_WRITEMASK": true
            },
            "DrawState": {
                "DITHER": true,
                "VIEWPORT": [
                    0,
                    0,
                    1709,
                    881
                ],
                "FRONT_FACE": "CCW",
                "FRAGMENT_SHADER_DERIVATIVE_HINT_OES": "Extension OES_standard_derivatives is unavailble.",
                "RASTERIZER_DISCARD": false,
                "FRAGMENT_SHADER_DERIVATIVE_HINT": 4354
            },
            "PolygonOffsetState": {
                "POLYGON_OFFSET_FILL": false,
                "POLYGON_OFFSET_FACTOR": 2,
                "POLYGON_OFFSET_UNITS": 2
            },
            "ScissorState": {
                "SCISSOR_TEST": true,
                "SCISSOR_BOX": [
                    0,
                    0,
                    1709,
                    881
                ]
            },
            "StencilState": {
                "STENCIL_TEST": false,
                "STENCIL_BACK_FAIL": "KEEP",
                "STENCIL_BACK_FUNC": "ALWAYS",
                "STENCIL_BACK_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_BACK_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_BACK_REF": 0,
                "STENCIL_BACK_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_BACK_WRITEMASK": "00000000000000000000000011111111",
                "STENCIL_FAIL": "KEEP",
                "STENCIL_FUNC": "ALWAYS",
                "STENCIL_PASS_DEPTH_FAIL": "KEEP",
                "STENCIL_PASS_DEPTH_PASS": "KEEP",
                "STENCIL_REF": 0,
                "STENCIL_VALUE_MASK": "00000000000000000000000011111111",
                "STENCIL_WRITEMASK": "00000000000000000000000011111111"
            },
            "VisualState": {
                "Attachments": [
                    {
                        "attachmentName": "Canvas COLOR_ATTACHMENT",
                        "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACDCAYAAABiIcWkAAAAAXNSR0IArs4c6QAAGrxJREFUeF7tnXeoHcUXxzf23nuJDSIi+Jeg2EusMXZjIfZeo9hA9B//UMTyhwUbsStiwRgJFmwIBhLFGjUmGo0t9t7rj8/4+17Pm7fv3bv33bKzexYe7969s7MzZ+f7nXPOnDk7avTo0f9kfrgEXAK1lMAoJ4BaPnfvtEsgSMAJwAeCS6DGEnACqPHD9667BJwAfAy4BGosASeAGj9877pLwAnAx4BLoMYScAKo8cP3rrsEnAB8DLgEaiwBJ4AaP3zvukvACcDHgEugxhJwAqjxw/euuwScAHwMuARqLAEngBo/fO+6S8AJwMeAS6DGEnACqPHD9667BJwAfAy4BGosASeAGj9877pLwAnAx4BLoMYScAKo8cP3rrsEnAB8DLgEaiwBJ4AaP3zvukvACcDHgEugxhJwAqjxw/euuwScAHwMuARqLAEngBo/fO+6S8AJwMeAS6DGEnACqPHD9667BJwAfAy4BGosASeAGj9877pLwAmgZmNgzJgx2U033ZTb6wMOOCD76quvaiaRenfXCaAGz/+kk07KDjnkkEI9ve6667L777+/0DVeOD0JOAGk98xaavGzzz7bUrlWCqEVTJgwIfvrr79aKe5lEpKAE0BCD6tZUzsJ+qHu9ccff2S77LJLs6b474lIwAkgkQeV18yJEydmxx13XF97cNttt2X8cay77rrZ+PHjG+355ZdfslGjRmW33HJLX9voNx9aAk4AiY2ORx55JFt22WVL0+q///47u+eee7LFFlsstInv33//fbbiiitm//zzT/j7+eefs2WWWSaQwWOPPZa98847pWl/3RviBJDACHjmmWcCeMp0TJ48OVtuueUC2AE3/1deeeXszz//DM3EVIAUIAAO/Ac//vhjtsIKKzSI4bvvvgvk4Uf/JOAE0D/ZD3nnPfbYIzv//PNL1zJ8DF9++WWY5Tl+++23bPHFF2+0k/M//PBDA+T8AOiXX375hmaw1FJLBXJYYoklwnUQxLfffputssoq2cyZM7MZM2aUrt9VbpATQEme7hVXXJFtvvnmJWnNf80AnE888cQAkANqAIxWsuiii2bY+ksvvXSDGJjtf/rpp0AEIgu+ozFoJQFNQWWkJYgsKPPZZ59lDz74YOnk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",
                        "textureCubeMapFace": null,
                        "textureLayer": 0
                    }
                ],
                "FrameBuffer": null
            },
            "DrawCall": {
                "frameBuffer": null,
                "programStatus": {
                    "LINK_STATUS": true,
                    "VALIDATE_STATUS": false,
                    "program": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLProgram",
                            "id": 2,
                            "displayText": "WebGLProgram - ID: 2"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "programStatus": {
                                "LINK_STATUS": true,
                                "VALIDATE_STATUS": false
                            },
                            "shaders": [
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": false,
                                    "name": "Vertex",
                                    "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n#ifdef MORPHING_TEXTURE_BASED_NORMAL\nuniform highp sampler2D morphNormalTex;\n#endif\n\nvec3 getNormal() {\n\t#ifdef SKIN\n\tdNormalMatrix = mat3(dModelMatrix[0].xyz, dModelMatrix[1].xyz, dModelMatrix[2].xyz);\n\t#elif defined(INSTANCING)\n\tdNormalMatrix = mat3(instance_line1.xyz, instance_line2.xyz, instance_line3.xyz);\n\t#else\n\tdNormalMatrix = matrix_normal;\n\t#endif\n\n\tvec3 tempNormal = vertex_normal;\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_NRM03\n\ttempNormal += morph_weights_a[0] * morph_nrm0;\n\ttempNormal += morph_weights_a[1] * morph_nrm1;\n\ttempNormal += morph_weights_a[2] * morph_nrm2;\n\ttempNormal += morph_weights_a[3] * morph_nrm3;\n\t#endif\n\t#ifdef MORPHING_NRM47\n\ttempNormal += morph_weights_b[0] * morph_nrm4;\n\ttempNormal += morph_weights_b[1] * morph_nrm5;\n\ttempNormal += morph_weights_b[2] * morph_nrm6;\n\ttempNormal += morph_weights_b[3] * morph_nrm7;\n\t#endif\n\t#endif\n\n\t#ifdef MORPHING_TEXTURE_BASED_NORMAL\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphNormal = texture2D(morphNormalTex, morphUV).xyz;\n\ttempNormal += morphNormal;\n\t#endif\n\n\treturn normalize(dNormalMatrix * tempNormal);\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\t vNormalW = getNormal();\n\n}",
                                    "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nout vec3 _uvNormalW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat3 _udNormalMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvec3 _ugetNormal(){\n(_udNormalMatrix = _umatrix_normal);\nvec3 _utempNormal = _uvertex_normal;\nreturn normalize((_udNormalMatrix * _utempNormal));\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvNormalW = vec3(0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n(_uvNormalW = _ugetNormal());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n(_udNormalMatrix = mat3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                                },
                                {
                                    "COMPILE_STATUS": true,
                                    "fragment": true,
                                    "name": "Fragment",
                                    "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nuniform vec3 view_position;\n\nuniform vec3 light_globalAmbient;\n\nfloat square(float x) {\n\treturn x*x;\n}\n\nfloat saturate(float x) {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nvec3 saturate(vec3 x) {\n\treturn clamp(x, vec3(0.0), vec3(1.0));\n}\nvec4 dReflection;\nvec3 dAlbedo;\nvec3 dNormalW;\nvec3 dVertexNormalW;\nvec3 dViewDirW;\nvec3 dDiffuseLight;\nvec3 dSpecularLight;\nvec3 dLightDirNormW;\nvec3 dLightDirW;\nvec3 dLightPosW;\nvec3 dShadowCoord;\nvec3 dSpecularity;\nfloat dAlpha;\nfloat dAtten;\nvec4 ccReflection;\nvec3 ccSpecularLight;\n#define AREA_LUTS_PRECISION highp\nuniform vec3 light0_color;\nuniform vec3 light0_direction;\nuniform mat4 light0_shadowMatrix;\nuniform mat4 light0_shadowMatrixPalette[4];\nuniform float light0_shadowCascadeDistances[4];\nuniform float light0_shadowCascadeCount;\nuniform vec3 light0_shadowParams;\nuniform sampler2DShadow light0_shadowMap;\n\nvoid getNormal() {\n\tdNormalW = normalize(dVertexNormalW);\n}\nvec3 gammaCorrectInput(vec3 color) {\n\treturn pow(color, vec3(2.2));\n}\n\nfloat gammaCorrectInput(float color) {\n\treturn pow(color, 2.2);\n}\n\nvec4 gammaCorrectInput(vec4 color) {\n\treturn vec4(pow(color.rgb, vec3(2.2)), color.a);\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv) {\n\tvec4 rgba = texture2D(tex, uv);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv, float bias) {\n\tvec4 rgba = texture2D(tex, uv, bias);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 textureCubeSRGB(samplerCube tex, vec3 uvw) {\n\tvec4 rgba = textureCube(tex, uvw);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec3 gammaCorrectOutput(vec3 color) {\n\t#ifdef HDR\n\treturn color;\n\t#else\n\tcolor += vec3(0.0000001);\n\treturn pow(color, vec3(0.45));\n\t#endif\n}\nuniform float exposure;\n\nvec3 toneMap(vec3 color) {\n\treturn color * exposure;\n}\nfloat dBlendModeFogFactor = 1.0;\n\nvec3 addFog(vec3 color) {\n\treturn color;\n}\n#ifdef CUBEMAP_ROTATION\nuniform mat3 cubeMapRotationMatrix;\n#endif\n\nvec3 cubeMapRotate(vec3 refDir) {\n#ifdef CUBEMAP_ROTATION\n\treturn refDir * cubeMapRotationMatrix;\n#else\n\treturn refDir;\n#endif\n}\nvec3 cubeMapProject(vec3 dir) {\n\treturn cubeMapRotate(dir);\n}\nvec3 processEnvironment(vec3 color) {\n\treturn color;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_diffuse;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseMap;\n#endif\n\nvoid getAlbedo() {\n\tdAlbedo = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdAlbedo *= material_diffuse.rgb;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdAlbedo *= gammaCorrectInput(addAlbedoDetail(texture2D(texture_diffuseMap, UV).CH));\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdAlbedo *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_emissive;\n#endif\n\n#ifdef MAPFLOAT\nuniform float material_emissiveIntensity;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_emissiveMap;\n#endif\n\nvec3 getEmission() {\n\tvec3 emission = vec3(1.0);\n\n\t#ifdef MAPFLOAT\n\temission *= material_emissiveIntensity;\n\t#endif\n\n\t#ifdef MAPCOLOR\n\temission *= material_emissive;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\temission *= texture2DSAMPLE(texture_emissiveMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\temission *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n\n\treturn emission;\n}\nconst float maxCascades = 4.0;\n\n// shadow matrix for selected cascade\nmat4 cascadeShadowMat;\n\n// function which selects a shadow projection matrix based on cascade distances \nvoid getShadowCascadeMatrix(mat4 shadowMatrixPalette[4], float shadowCascadeDistances[4], float shadowCascadeCount) {\n\n\t// depth in 0 .. far plane range\n\tfloat depth = 1.0 / gl_FragCoord.w;\n\n\t// find cascade index based on the depth (loop as there is no per component vec compare operator in webgl)\n\tfloat cascadeIndex = 0.0;\n\tfor (float i = 0.0; i < maxCascades; i++) {\n\t\tif (depth < shadowCascadeDistances[int(i)]) {\n\t\t\tcascadeIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// limit to actual number of used cascades\n\tcascadeIndex = min(cascadeIndex, shadowCascadeCount - 1.0);\n\n\t// pick shadow matrix\n\t#ifdef GL2\n\t\tcascadeShadowMat = shadowMatrixPalette[int(cascadeIndex)];\n\t#else\n\t\t// webgl 1 does not allow non-cost index array lookup\n\t\tif (cascadeIndex == 0.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[0];\n\t\t}\n\t\telse if (cascadeIndex == 1.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[1];\n\t\t}\n\t\telse if (cascadeIndex == 2.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[2];\n\t\t}\n\t\telse {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[3];\n\t\t}\n\t#endif\n}\n\nvoid fadeShadow(float shadowCascadeDistances[4]) {\t\t\t\t  \n\n\t// if the pixel is past the shadow distance, remove shadow\n\t// this enforces straight line instead of corner of shadow which moves when camera rotates  \n\tfloat depth = 1.0 / gl_FragCoord.w;\n\tif (depth > shadowCascadeDistances[int(maxCascades - 1.0)]) {\n\t\tdShadowCoord.z = -9999999.0;\n\t}\n}\nvec3 lessThan2(vec3 a, vec3 b) {\n\treturn clamp((b - a)*1000.0, 0.0, 1.0); // softer version\n}\n\n#ifndef UNPACKFLOAT\n#define UNPACKFLOAT\nfloat unpackFloat(vec4 rgbaDepth) {\n\tconst vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\treturn dot(rgbaDepth, bitShift);\n}\n#endif\n\n// ----- Direct/Spot Sampling -----\n\n#ifdef GL2\nfloat _getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\tfloat z = dShadowCoord.z;\n\tvec2 uv = dShadowCoord.xy * shadowParams.x; // 1 unit - 1 texel\n\tfloat shadowMapSizeInv = 1.0 / shadowParams.x;\n\tvec2 base_uv = floor(uv + 0.5);\n\tfloat s = (uv.x + 0.5 - base_uv.x);\n\tfloat t = (uv.y + 0.5 - base_uv.y);\n\tbase_uv -= vec2(0.5);\n\tbase_uv *= shadowMapSizeInv;\n\n\tfloat sum = 0.0;\n\n\tfloat uw0 = (3.0 - 2.0 * s);\n\tfloat uw1 = (1.0 + 2.0 * s);\n\n\tfloat u0 = (2.0 - s) / uw0 - 1.0;\n\tfloat u1 = s / uw1 + 1.0;\n\n\tfloat vw0 = (3.0 - 2.0 * t);\n\tfloat vw1 = (1.0 + 2.0 * t);\n\n\tfloat v0 = (2.0 - t) / vw0 - 1.0;\n\tfloat v1 = t / vw1 + 1.0;\n\n\tu0 = u0 * shadowMapSizeInv + base_uv.x;\n\tv0 = v0 * shadowMapSizeInv + base_uv.y;\n\n\tu1 = u1 * shadowMapSizeInv + base_uv.x;\n\tv1 = v1 * shadowMapSizeInv + base_uv.y;\n\n\tsum += uw0 * vw0 * texture(shadowMap, vec3(u0, v0, z));\n\tsum += uw1 * vw0 * texture(shadowMap, vec3(u1, v0, z));\n\tsum += uw0 * vw1 * texture(shadowMap, vec3(u0, v1, z));\n\tsum += uw1 * vw1 * texture(shadowMap, vec3(u1, v1, z));\n\n\tsum *= 1.0f / 16.0;\n\treturn sum;\n}\n\nfloat getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2DShadow shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#else\nfloat _xgetShadowPCF3x3(mat3 depthKernel, sampler2D shadowMap, vec3 shadowParams) {\n\tmat3 shadowKernel;\n\tvec3 shadowCoord = dShadowCoord;\n\tvec3 shadowZ = vec3(shadowCoord.z);\n\tshadowKernel[0] = vec3(greaterThan(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(greaterThan(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(greaterThan(depthKernel[2], shadowZ));\n\n\tvec2 fractionalCoord = fract( shadowCoord.xy * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat _getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\tvec3 shadowCoord = dShadowCoord;\n\n\tfloat xoffset = 1.0 / shadowParams.x; // 1/shadow map width\n\tfloat dx0 = -xoffset;\n\tfloat dx1 = xoffset;\n\n\tmat3 depthKernel;\n\tdepthKernel[0][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx0)));\n\tdepthKernel[0][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, 0.0)));\n\tdepthKernel[0][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx1)));\n\tdepthKernel[1][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx0)));\n\tdepthKernel[1][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy));\n\tdepthKernel[1][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx1)));\n\tdepthKernel[2][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx0)));\n\tdepthKernel[2][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, 0.0)));\n\tdepthKernel[2][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx1)));\n\n\treturn _xgetShadowPCF3x3(depthKernel, shadowMap, shadowParams);\n}\n\nfloat getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2D shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#endif\n\n\n// ----- Point Sampling -----\n\nfloat _getShadowPoint(samplerCube shadowMap, vec4 shadowParams, vec3 dir) {\n\n\tvec3 tc = normalize(dir);\n\tvec3 tcAbs = abs(tc);\n\n\tvec4 dirX = vec4(1,0,0, tc.x);\n\tvec4 dirY = vec4(0,1,0, tc.y);\n\tfloat majorAxisLength = tc.z;\n\tif ((tcAbs.x > tcAbs.y) && (tcAbs.x > tcAbs.z)) {\n\t\tdirX = vec4(0,0,1, tc.z);\n\t\tdirY = vec4(0,1,0, tc.y);\n\t\tmajorAxisLength = tc.x;\n\t} else if ((tcAbs.y > tcAbs.x) && (tcAbs.y > tcAbs.z)) {\n\t\tdirX = vec4(1,0,0, tc.x);\n\t\tdirY = vec4(0,0,1, tc.z);\n\t\tmajorAxisLength = tc.y;\n\t}\n\n\tfloat shadowParamsInFaceSpace = ((1.0/shadowParams.x) * 2.0) * abs(majorAxisLength);\n\n\tvec3 xoffset = (dirX.xyz * shadowParamsInFaceSpace);\n\tvec3 yoffset = (dirY.xyz * shadowParamsInFaceSpace);\n\tvec3 dx0 = -xoffset;\n\tvec3 dy0 = -yoffset;\n\tvec3 dx1 = xoffset;\n\tvec3 dy1 = yoffset;\n\n\tmat3 shadowKernel;\n\tmat3 depthKernel;\n\n\tdepthKernel[0][0] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy0));\n\tdepthKernel[0][1] = unpackFloat(textureCube(shadowMap, tc + dx0));\n\tdepthKernel[0][2] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy1));\n\tdepthKernel[1][0] = unpackFloat(textureCube(shadowMap, tc + dy0));\n\tdepthKernel[1][1] = unpackFloat(textureCube(shadowMap, tc));\n\tdepthKernel[1][2] = unpackFloat(textureCube(shadowMap, tc + dy1));\n\tdepthKernel[2][0] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy0));\n\tdepthKernel[2][1] = unpackFloat(textureCube(shadowMap, tc + dx1));\n\tdepthKernel[2][2] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy1));\n\n\tvec3 shadowZ = vec3(length(dir) * shadowParams.w + shadowParams.z);\n\n\tshadowKernel[0] = vec3(lessThan2(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(lessThan2(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(lessThan2(depthKernel[2], shadowZ));\n\n\tvec2 uv = (vec2(dirX.w, dirY.w) / abs(majorAxisLength)) * 0.5;\n\n\tvec2 fractionalCoord = fract( uv * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn 1.0 - dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat getShadowPointPCF3x3(samplerCube shadowMap, vec4 shadowParams) {\n\treturn _getShadowPoint(shadowMap, shadowParams, dLightDirW);\n}\nvoid _getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams, vec3 wPos) {\n\tdShadowCoord = (shadowMatrix * vec4(wPos, 1.0)).xyz;\n\tdShadowCoord.z = saturate(dShadowCoord.z) - 0.0001;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid _getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n\tvec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n\tprojPos.xy /= projPos.w;\n\tdShadowCoord.xy = projPos.xy;\n\tdShadowCoord.z = length(dLightDirW) * shadowParams.w;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams) {\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams) {\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPerspNormalOffset(mat4 shadowMatrix, vec4 shadowParams) {\n\tfloat distScale = abs(dot(vPositionW - dLightPosW, dLightDirNormW)); // fov?\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale;\n\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, wPos);\n}\n\nvoid getShadowCoordOrthoNormalOffset(mat4 shadowMatrix, vec3 shadowParams) {\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0); //0.08\n\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, wPos);\n}\nvoid normalOffsetPointShadow(vec4 shadowParams) {\n\tfloat distScale = length(dLightDirW);\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale; //0.02\n\tvec3 dir = wPos - dLightPosW;\n\tdLightDirW = dir;\n}\nfloat getLightDiffuse() {\n\treturn max(dot(dNormalW, -dLightDirNormW), 0.0);\n}\nvec3 combineColor() {\n\treturn dAlbedo * dDiffuseLight;\n}\nvoid addAmbient() {\n\tdDiffuseLight += light_globalAmbient;\n}\nvoid getViewDir() {\n\tdViewDirW = normalize(view_position - vPositionW);\n}\nvoid main(void) {\n\tdDiffuseLight = vec3(0);\n\tdSpecularLight = vec3(0);\n\tdReflection = vec4(0);\n\tdSpecularity = vec3(0);\n\n\t#ifdef CLEARCOAT\n\tccSpecularLight = vec3(0);\n\tccReflection = vec4(0);\n\t#endif\n\t dVertexNormalW = normalize(vNormalW);\n\t dAlpha = 1.0;\n\t getViewDir();\n\t getNormal();\n\t getAlbedo();\n\t addAmbient();\n\t dLightDirNormW = light0_direction;\n\t dAtten = 1.0;\n\t\t\t dAtten *= getLightDiffuse();\ngetShadowCoordOrthoNormalOffset(light0_shadowMatrix, light0_shadowParams);\nfadeShadow(light0_shadowCascadeDistances);\n\t\t\t dAtten *= getShadowPCF3x3(light0_shadowMap, light0_shadowParams);\n\t\t\t dDiffuseLight += dAtten * light0_color;\n\n\n\t#ifdef CLEARCOAT\n\tgl_FragColor.rgb = combineColorCC();\n\t#else\n\tgl_FragColor.rgb = combineColor();\n\t#endif \n\n\tgl_FragColor.rgb += getEmission();\n\tgl_FragColor.rgb = addFog(gl_FragColor.rgb);\n\n\t#ifndef HDR\n\tgl_FragColor.rgb = toneMap(gl_FragColor.rgb);\n\tgl_FragColor.rgb = gammaCorrectOutput(gl_FragColor.rgb);\n\t#endif\ngl_FragColor.a = 1.0;\n\n}\n",
                                    "translatedSource": "#version 450\nvoid initGlobals();\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nin vec3 _uvNormalW;\nuniform vec3 _uview_position;\nuniform vec3 _ulight_globalAmbient;\nfloat _usaturate(in float _ux){\nreturn clamp(_ux, 0.0, 1.0);\n}\nvec4 _udReflection;\nvec3 _udAlbedo;\nvec3 _udNormalW;\nvec3 _udVertexNormalW;\nvec3 _udViewDirW;\nvec3 _udDiffuseLight;\nvec3 _udSpecularLight;\nvec3 _udLightDirNormW;\nvec3 _udShadowCoord;\nvec3 _udSpecularity;\nfloat _udAlpha;\nfloat _udAtten;\nuniform vec3 _ulight0_color;\nuniform vec3 _ulight0_direction;\nuniform mat4 _ulight0_shadowMatrix;\nuniform mat4 _ulight0_shadowMatrixPalette[4];\nuniform float _ulight0_shadowCascadeDistances[4];\nuniform float _ulight0_shadowCascadeCount;\nuniform vec3 _ulight0_shadowParams;\nuniform sampler2DShadow _ulight0_shadowMap;\nvoid _ugetNormal(){\n(_udNormalW = normalize(_udVertexNormalW));\n}\nvec3 _ugammaCorrectOutput(in vec3 _ucolor){\n(_ucolor += vec3(1e-07, 1e-07, 1e-07));\nreturn pow(_ucolor, vec3(0.44999999, 0.44999999, 0.44999999));\n}\nuniform float _uexposure;\nvec3 _utoneMap(in vec3 _ucolor){\nreturn (_ucolor * _uexposure);\n}\nvec3 _uaddFog(in vec3 _ucolor){\nreturn _ucolor;\n}\nvoid _ugetAlbedo(){\n(_udAlbedo = vec3(1.0, 1.0, 1.0));\n}\nuniform vec3 _umaterial_emissive;\nvec3 _ugetEmission(){\nvec3 _uemission = vec3(1.0, 1.0, 1.0);\n(_uemission *= _umaterial_emissive);\nreturn _uemission;\n}\nvoid _ufadeShadow(in float _ushadowCascadeDistances[4]){\nfloat _udepth = (1.0 / gl_FragCoord.w);\nif ((_udepth > _ushadowCascadeDistances[3]))\n{\n(_udShadowCoord.z = -9999999.0);\n}\n}\nfloat _u_getShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nfloat _uz = _udShadowCoord.z;\nvec2 _uuv = (_udShadowCoord.xy * _ushadowParams.x);\nfloat _ushadowMapSizeInv = (1.0 / _ushadowParams.x);\nvec2 _ubase_uv = floor((_uuv + vec2(0.5, 0.5)));\nfloat _us = ((_uuv.x + 0.5) - _ubase_uv.x);\nfloat _ut = ((_uuv.y + 0.5) - _ubase_uv.y);\n(_ubase_uv -= vec2(0.5, 0.5));\n(_ubase_uv *= _ushadowMapSizeInv);\nfloat _usum = 0.0;\nfloat _uuw0 = (3.0 - (2.0 * _us));\nfloat _uuw1 = (1.0 + (2.0 * _us));\nfloat _uu0 = (((2.0 - _us) / _uuw0) - 1.0);\nfloat _uu1 = ((_us / _uuw1) + 1.0);\nfloat _uvw0 = (3.0 - (2.0 * _ut));\nfloat _uvw1 = (1.0 + (2.0 * _ut));\nfloat _uv0 = (((2.0 - _ut) / _uvw0) - 1.0);\nfloat _uv1 = ((_ut / _uvw1) + 1.0);\n(_uu0 = ((_uu0 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv0 = ((_uv0 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_uu1 = ((_uu1 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv1 = ((_uv1 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_usum += ((_uuw0 * _uvw0) * texture(_ushadowMap, vec3(_uu0, _uv0, _uz))));\n(_usum += ((_uuw1 * _uvw0) * texture(_ushadowMap, vec3(_uu1, _uv0, _uz))));\n(_usum += ((_uuw0 * _uvw1) * texture(_ushadowMap, vec3(_uu0, _uv1, _uz))));\n(_usum += ((_uuw1 * _uvw1) * texture(_ushadowMap, vec3(_uu1, _uv1, _uz))));\n(_usum *= 0.0625);\nreturn _usum;\n}\nfloat _ugetShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nreturn _u_getShadowPCF3x3(_ushadowMap, _ushadowParams);\n}\nvoid _u_getShadowCoordOrtho(in mat4 _ushadowMatrix, in vec3 _ushadowParams, in vec3 _uwPos){\n(_udShadowCoord = (_ushadowMatrix * vec4(_uwPos, 1.0)).xyz);\n(_udShadowCoord.z = (_usaturate(_udShadowCoord.z) - 9.9999997e-05));\n}\nvoid _ugetShadowCoordOrthoNormalOffset(in mat4 _ushadowMatrix, in vec3 _ushadowParams){\nvec3 _uwPos = (_uvPositionW + ((_udVertexNormalW * _ushadowParams.y) * clamp((1.0 - dot(_udVertexNormalW, (-_udLightDirNormW))), 0.0, 1.0)));\n_u_getShadowCoordOrtho(_ushadowMatrix, _ushadowParams, _uwPos);\n}\nfloat _ugetLightDiffuse(){\nreturn max(dot(_udNormalW, (-_udLightDirNormW)), 0.0);\n}\nvec3 _ucombineColor(){\nreturn (_udAlbedo * _udDiffuseLight);\n}\nvoid _uaddAmbient(){\n(_udDiffuseLight += _ulight_globalAmbient);\n}\nvoid _ugetViewDir(){\n(_udViewDirW = normalize((_uview_position - _uvPositionW)));\n}\nvoid main(){\ninitGlobals();\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = normalize(_uvNormalW));\n(_udAlpha = 1.0);\n_ugetViewDir();\n_ugetNormal();\n_ugetAlbedo();\n_uaddAmbient();\n(_udLightDirNormW = _ulight0_direction);\n(_udAtten = 1.0);\n(_udAtten *= _ugetLightDiffuse());\n_ugetShadowCoordOrthoNormalOffset(_ulight0_shadowMatrix, _ulight0_shadowParams);\n_ufadeShadow(_ulight0_shadowCascadeDistances);\n(_udAtten *= _ugetShadowPCF3x3(_ulight0_shadowMap, _ulight0_shadowParams));\n(_udDiffuseLight += (_udAtten * _ulight0_color));\n(_upc_fragColor.xyz = _ucombineColor());\n(_upc_fragColor.xyz += _ugetEmission());\n(_upc_fragColor.xyz = _uaddFog(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _utoneMap(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _ugammaCorrectOutput(_upc_fragColor.xyz));\n(_upc_fragColor.w = 1.0);\n}\nvoid initGlobals(){\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udAlbedo = vec3(0.0, 0.0, 0.0));\n(_udNormalW = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = vec3(0.0, 0.0, 0.0));\n(_udViewDirW = vec3(0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udLightDirNormW = vec3(0.0, 0.0, 0.0));\n(_udShadowCoord = vec3(0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udAlpha = 0.0);\n(_udAtten = 0.0);\n}\n\u0000"
                                }
                            ],
                            "length": 20021
                        }
                    },
                    "RECOMPILABLE": false
                },
                "shaders": [
                    {
                        "COMPILE_STATUS": true,
                        "fragment": false,
                        "name": "Vertex",
                        "source": "#version 300 es\n\n\n#define attribute in\n#define varying out\n#define texture2D texture\n#define GL2\n#define VERTEXSHADER\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nattribute vec3 vertex_position;\nattribute vec3 vertex_normal;\nattribute vec4 vertex_tangent;\nattribute vec2 vertex_texCoord0;\nattribute vec2 vertex_texCoord1;\nattribute vec4 vertex_color;\n\nuniform mat4 matrix_viewProjection;\nuniform mat4 matrix_model;\nuniform mat3 matrix_normal;\n\nvec3 dPositionW;\nmat4 dModelMatrix;\nmat3 dNormalMatrix;\n#ifdef PIXELSNAP\nuniform vec4 uScreenSize;\n#endif\n\n#ifdef MORPHING\nuniform vec4 morph_weights_a;\nuniform vec4 morph_weights_b;\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED\nuniform vec4 morph_tex_params;\n\nvec2 getTextureMorphCoords() {\n\tfloat vertexId = morph_vertex_id;\n\tvec2 textureSize = morph_tex_params.xy;\n\tvec2 invTextureSize = morph_tex_params.zw;\n\n\t// turn vertexId into int grid coordinates\n\tfloat morphGridV = floor(vertexId * invTextureSize.x);\n\tfloat morphGridU = vertexId - (morphGridV * textureSize.x);\n\n\t// convert grid coordinates to uv coordinates with half pixel offset\n\treturn (vec2(morphGridU, morphGridV) * invTextureSize) + (0.5 * invTextureSize);\n}\n#endif\n\n#ifdef MORPHING_TEXTURE_BASED_POSITION\nuniform highp sampler2D morphPositionTex;\n#endif\n\nmat4 getModelMatrix() {\n\t#ifdef DYNAMICBATCH\n\treturn getBoneMatrix(vertex_boneIndices);\n\t#elif defined(SKIN)\n\treturn matrix_model * getSkinMatrix(vertex_boneIndices, vertex_boneWeights);\n\t#elif defined(INSTANCING)\n\treturn mat4(instance_line1, instance_line2, instance_line3, instance_line4);\n\t#else\n\treturn matrix_model;\n\t#endif\n}\n\nvec4 getPosition() {\n\tdModelMatrix = getModelMatrix();\n\tvec3 localPos = vertex_position;\n\n\t#ifdef NINESLICED\n\t// outer and inner vertices are at the same position, scale both\n\tlocalPos.xz *= outerScale;\n\n\t// offset inner vertices inside\n\t// (original vertices must be in [-1;1] range)\n\tvec2 positiveUnitOffset = clamp(vertex_position.xz, vec2(0.0), vec2(1.0));\n\tvec2 negativeUnitOffset = clamp(-vertex_position.xz, vec2(0.0), vec2(1.0));\n\tlocalPos.xz += (-positiveUnitOffset * innerOffset.xy + negativeUnitOffset * innerOffset.zw) * vertex_texCoord0.xy;\n\n\tvTiledUv = (localPos.xz - outerScale + innerOffset.xy) * -0.5 + 1.0; // uv = local pos - inner corner\n\n\tlocalPos.xz *= -0.5; // move from -1;1 to -0.5;0.5\n\tlocalPos = localPos.xzy;\n\t#endif\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_POS03\n\tlocalPos.xyz += morph_weights_a[0] * morph_pos0;\n\tlocalPos.xyz += morph_weights_a[1] * morph_pos1;\n\tlocalPos.xyz += morph_weights_a[2] * morph_pos2;\n\tlocalPos.xyz += morph_weights_a[3] * morph_pos3;\n\t#endif // MORPHING_POS03\n\t#ifdef MORPHING_POS47\n\tlocalPos.xyz += morph_weights_b[0] * morph_pos4;\n\tlocalPos.xyz += morph_weights_b[1] * morph_pos5;\n\tlocalPos.xyz += morph_weights_b[2] * morph_pos6;\n\tlocalPos.xyz += morph_weights_b[3] * morph_pos7;\n\t#endif // MORPHING_POS47\n\t#endif // MORPHING\n\n\t#ifdef MORPHING_TEXTURE_BASED_POSITION\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphPos = texture2D(morphPositionTex, morphUV).xyz;\n\tlocalPos += morphPos;\n\t#endif\n\n\tvec4 posW = dModelMatrix * vec4(localPos, 1.0);\n\t#ifdef SCREENSPACE\n\tposW.zw = vec2(0.0, 1.0);\n\t#endif\n\tdPositionW = posW.xyz;\n\n\tvec4 screenPos;\n\t#ifdef UV1LAYOUT\n\tscreenPos = vec4(vertex_texCoord1.xy * 2.0 - 1.0, 0.5, 1);\n\t#else\n\t#ifdef SCREENSPACE\n\tscreenPos = posW;\n\t#else\n\tscreenPos = matrix_viewProjection * posW;\n\t#endif\n\n\t#ifdef PIXELSNAP\n\t// snap vertex to a pixel boundary\n\tscreenPos.xy = (screenPos.xy * 0.5) + 0.5;\n\tscreenPos.xy *= uScreenSize.xy;\n\tscreenPos.xy = floor(screenPos.xy);\n\tscreenPos.xy *= uScreenSize.zw;\n\tscreenPos.xy = (screenPos.xy * 2.0) - 1.0;\n\t#endif\n\t#endif\n\n\treturn screenPos;\n}\n\nvec3 getWorldPosition() {\n\treturn dPositionW;\n}\n#ifdef MORPHING_TEXTURE_BASED_NORMAL\nuniform highp sampler2D morphNormalTex;\n#endif\n\nvec3 getNormal() {\n\t#ifdef SKIN\n\tdNormalMatrix = mat3(dModelMatrix[0].xyz, dModelMatrix[1].xyz, dModelMatrix[2].xyz);\n\t#elif defined(INSTANCING)\n\tdNormalMatrix = mat3(instance_line1.xyz, instance_line2.xyz, instance_line3.xyz);\n\t#else\n\tdNormalMatrix = matrix_normal;\n\t#endif\n\n\tvec3 tempNormal = vertex_normal;\n\n\t#ifdef MORPHING\n\t#ifdef MORPHING_NRM03\n\ttempNormal += morph_weights_a[0] * morph_nrm0;\n\ttempNormal += morph_weights_a[1] * morph_nrm1;\n\ttempNormal += morph_weights_a[2] * morph_nrm2;\n\ttempNormal += morph_weights_a[3] * morph_nrm3;\n\t#endif\n\t#ifdef MORPHING_NRM47\n\ttempNormal += morph_weights_b[0] * morph_nrm4;\n\ttempNormal += morph_weights_b[1] * morph_nrm5;\n\ttempNormal += morph_weights_b[2] * morph_nrm6;\n\ttempNormal += morph_weights_b[3] * morph_nrm7;\n\t#endif\n\t#endif\n\n\t#ifdef MORPHING_TEXTURE_BASED_NORMAL\n\t// apply morph offset from texture\n\tvec2 morphUV = getTextureMorphCoords();\n\tvec3 morphNormal = texture2D(morphNormalTex, morphUV).xyz;\n\ttempNormal += morphNormal;\n\t#endif\n\n\treturn normalize(dNormalMatrix * tempNormal);\n}\n\nvoid main(void) {\n\tgl_Position = getPosition();\n\t vPositionW\t\t= getWorldPosition();\n\t vNormalW = getNormal();\n\n}",
                        "translatedSource": "#version 450\nvoid initGlobals();\nout vec3 _uvPositionW;\nout vec3 _uvNormalW;\nin vec3 _uvertex_position;\nin vec3 _uvertex_normal;\nin vec4 _uvertex_tangent;\nin vec2 _uvertex_texCoord0;\nin vec2 _uvertex_texCoord1;\nin vec4 _uvertex_color;\nuniform mat4 _umatrix_viewProjection;\nuniform mat4 _umatrix_model;\nuniform mat3 _umatrix_normal;\nvec3 _udPositionW;\nmat4 _udModelMatrix;\nmat3 _udNormalMatrix;\nmat4 _ugetModelMatrix(){\nreturn _umatrix_model;\n}\nvec4 _ugetPosition(){\n(_udModelMatrix = _ugetModelMatrix());\nvec3 _ulocalPos = _uvertex_position;\nvec4 _uposW = (_udModelMatrix * vec4(_ulocalPos, 1.0));\n(_udPositionW = _uposW.xyz);\nvec4 _uscreenPos = vec4(0.0, 0.0, 0.0, 0.0);\n(_uscreenPos = (_umatrix_viewProjection * _uposW));\nreturn _uscreenPos;\n}\nvec3 _ugetWorldPosition(){\nreturn _udPositionW;\n}\nvec3 _ugetNormal(){\n(_udNormalMatrix = _umatrix_normal);\nvec3 _utempNormal = _uvertex_normal;\nreturn normalize((_udNormalMatrix * _utempNormal));\n}\nvoid main(){\ninitGlobals();\n(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));\n(_uvNormalW = vec3(0.0, 0.0, 0.0));\n(_uvPositionW = vec3(0.0, 0.0, 0.0));\n(gl_Position = _ugetPosition());\n(_uvPositionW = _ugetWorldPosition());\n(_uvNormalW = _ugetNormal());\n}\nvoid initGlobals(){\n(_udPositionW = vec3(0.0, 0.0, 0.0));\n(_udModelMatrix = mat4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n(_udNormalMatrix = mat3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));\n}\n\u0000"
                    },
                    {
                        "COMPILE_STATUS": true,
                        "fragment": true,
                        "name": "Fragment",
                        "source": "#version 300 es\n#define varying in\nout highp vec4 pc_fragColor;\n#define gl_FragColor pc_fragColor\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad\n#define GL2\nprecision highp float;\n#ifdef GL2\nprecision highp sampler2DShadow;\n#endif\nvarying vec3 vPositionW;\nvarying vec3 vNormalW;\nuniform vec3 view_position;\n\nuniform vec3 light_globalAmbient;\n\nfloat square(float x) {\n\treturn x*x;\n}\n\nfloat saturate(float x) {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nvec3 saturate(vec3 x) {\n\treturn clamp(x, vec3(0.0), vec3(1.0));\n}\nvec4 dReflection;\nvec3 dAlbedo;\nvec3 dNormalW;\nvec3 dVertexNormalW;\nvec3 dViewDirW;\nvec3 dDiffuseLight;\nvec3 dSpecularLight;\nvec3 dLightDirNormW;\nvec3 dLightDirW;\nvec3 dLightPosW;\nvec3 dShadowCoord;\nvec3 dSpecularity;\nfloat dAlpha;\nfloat dAtten;\nvec4 ccReflection;\nvec3 ccSpecularLight;\n#define AREA_LUTS_PRECISION highp\nuniform vec3 light0_color;\nuniform vec3 light0_direction;\nuniform mat4 light0_shadowMatrix;\nuniform mat4 light0_shadowMatrixPalette[4];\nuniform float light0_shadowCascadeDistances[4];\nuniform float light0_shadowCascadeCount;\nuniform vec3 light0_shadowParams;\nuniform sampler2DShadow light0_shadowMap;\n\nvoid getNormal() {\n\tdNormalW = normalize(dVertexNormalW);\n}\nvec3 gammaCorrectInput(vec3 color) {\n\treturn pow(color, vec3(2.2));\n}\n\nfloat gammaCorrectInput(float color) {\n\treturn pow(color, 2.2);\n}\n\nvec4 gammaCorrectInput(vec4 color) {\n\treturn vec4(pow(color.rgb, vec3(2.2)), color.a);\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv) {\n\tvec4 rgba = texture2D(tex, uv);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 texture2DSRGB(sampler2D tex, vec2 uv, float bias) {\n\tvec4 rgba = texture2D(tex, uv, bias);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec4 textureCubeSRGB(samplerCube tex, vec3 uvw) {\n\tvec4 rgba = textureCube(tex, uvw);\n\trgba.rgb = gammaCorrectInput(rgba.rgb);\n\treturn rgba;\n}\n\nvec3 gammaCorrectOutput(vec3 color) {\n\t#ifdef HDR\n\treturn color;\n\t#else\n\tcolor += vec3(0.0000001);\n\treturn pow(color, vec3(0.45));\n\t#endif\n}\nuniform float exposure;\n\nvec3 toneMap(vec3 color) {\n\treturn color * exposure;\n}\nfloat dBlendModeFogFactor = 1.0;\n\nvec3 addFog(vec3 color) {\n\treturn color;\n}\n#ifdef CUBEMAP_ROTATION\nuniform mat3 cubeMapRotationMatrix;\n#endif\n\nvec3 cubeMapRotate(vec3 refDir) {\n#ifdef CUBEMAP_ROTATION\n\treturn refDir * cubeMapRotationMatrix;\n#else\n\treturn refDir;\n#endif\n}\nvec3 cubeMapProject(vec3 dir) {\n\treturn cubeMapRotate(dir);\n}\nvec3 processEnvironment(vec3 color) {\n\treturn color;\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_diffuse;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_diffuseMap;\n#endif\n\nvoid getAlbedo() {\n\tdAlbedo = vec3(1.0);\n\n\t#ifdef MAPCOLOR\n\tdAlbedo *= material_diffuse.rgb;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\tdAlbedo *= gammaCorrectInput(addAlbedoDetail(texture2D(texture_diffuseMap, UV).CH));\n\t#endif\n\n\t#ifdef MAPVERTEX\n\tdAlbedo *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n}\n\n#undef MAPFLOAT\n\n#undef MAPCOLOR\n #define MAPCOLOR\n\n#undef MAPVERTEX\n\n#undef MAPTEXTURE\n#ifdef MAPCOLOR\nuniform vec3 material_emissive;\n#endif\n\n#ifdef MAPFLOAT\nuniform float material_emissiveIntensity;\n#endif\n\n#ifdef MAPTEXTURE\nuniform sampler2D texture_emissiveMap;\n#endif\n\nvec3 getEmission() {\n\tvec3 emission = vec3(1.0);\n\n\t#ifdef MAPFLOAT\n\temission *= material_emissiveIntensity;\n\t#endif\n\n\t#ifdef MAPCOLOR\n\temission *= material_emissive;\n\t#endif\n\n\t#ifdef MAPTEXTURE\n\temission *= texture2DSAMPLE(texture_emissiveMap, UV).CH;\n\t#endif\n\n\t#ifdef MAPVERTEX\n\temission *= gammaCorrectInput(saturate(vVertexColor.VC));\n\t#endif\n\n\treturn emission;\n}\nconst float maxCascades = 4.0;\n\n// shadow matrix for selected cascade\nmat4 cascadeShadowMat;\n\n// function which selects a shadow projection matrix based on cascade distances \nvoid getShadowCascadeMatrix(mat4 shadowMatrixPalette[4], float shadowCascadeDistances[4], float shadowCascadeCount) {\n\n\t// depth in 0 .. far plane range\n\tfloat depth = 1.0 / gl_FragCoord.w;\n\n\t// find cascade index based on the depth (loop as there is no per component vec compare operator in webgl)\n\tfloat cascadeIndex = 0.0;\n\tfor (float i = 0.0; i < maxCascades; i++) {\n\t\tif (depth < shadowCascadeDistances[int(i)]) {\n\t\t\tcascadeIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// limit to actual number of used cascades\n\tcascadeIndex = min(cascadeIndex, shadowCascadeCount - 1.0);\n\n\t// pick shadow matrix\n\t#ifdef GL2\n\t\tcascadeShadowMat = shadowMatrixPalette[int(cascadeIndex)];\n\t#else\n\t\t// webgl 1 does not allow non-cost index array lookup\n\t\tif (cascadeIndex == 0.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[0];\n\t\t}\n\t\telse if (cascadeIndex == 1.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[1];\n\t\t}\n\t\telse if (cascadeIndex == 2.0) {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[2];\n\t\t}\n\t\telse {\n\t\t\tcascadeShadowMat = shadowMatrixPalette[3];\n\t\t}\n\t#endif\n}\n\nvoid fadeShadow(float shadowCascadeDistances[4]) {\t\t\t\t  \n\n\t// if the pixel is past the shadow distance, remove shadow\n\t// this enforces straight line instead of corner of shadow which moves when camera rotates  \n\tfloat depth = 1.0 / gl_FragCoord.w;\n\tif (depth > shadowCascadeDistances[int(maxCascades - 1.0)]) {\n\t\tdShadowCoord.z = -9999999.0;\n\t}\n}\nvec3 lessThan2(vec3 a, vec3 b) {\n\treturn clamp((b - a)*1000.0, 0.0, 1.0); // softer version\n}\n\n#ifndef UNPACKFLOAT\n#define UNPACKFLOAT\nfloat unpackFloat(vec4 rgbaDepth) {\n\tconst vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\treturn dot(rgbaDepth, bitShift);\n}\n#endif\n\n// ----- Direct/Spot Sampling -----\n\n#ifdef GL2\nfloat _getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\tfloat z = dShadowCoord.z;\n\tvec2 uv = dShadowCoord.xy * shadowParams.x; // 1 unit - 1 texel\n\tfloat shadowMapSizeInv = 1.0 / shadowParams.x;\n\tvec2 base_uv = floor(uv + 0.5);\n\tfloat s = (uv.x + 0.5 - base_uv.x);\n\tfloat t = (uv.y + 0.5 - base_uv.y);\n\tbase_uv -= vec2(0.5);\n\tbase_uv *= shadowMapSizeInv;\n\n\tfloat sum = 0.0;\n\n\tfloat uw0 = (3.0 - 2.0 * s);\n\tfloat uw1 = (1.0 + 2.0 * s);\n\n\tfloat u0 = (2.0 - s) / uw0 - 1.0;\n\tfloat u1 = s / uw1 + 1.0;\n\n\tfloat vw0 = (3.0 - 2.0 * t);\n\tfloat vw1 = (1.0 + 2.0 * t);\n\n\tfloat v0 = (2.0 - t) / vw0 - 1.0;\n\tfloat v1 = t / vw1 + 1.0;\n\n\tu0 = u0 * shadowMapSizeInv + base_uv.x;\n\tv0 = v0 * shadowMapSizeInv + base_uv.y;\n\n\tu1 = u1 * shadowMapSizeInv + base_uv.x;\n\tv1 = v1 * shadowMapSizeInv + base_uv.y;\n\n\tsum += uw0 * vw0 * texture(shadowMap, vec3(u0, v0, z));\n\tsum += uw1 * vw0 * texture(shadowMap, vec3(u1, v0, z));\n\tsum += uw0 * vw1 * texture(shadowMap, vec3(u0, v1, z));\n\tsum += uw1 * vw1 * texture(shadowMap, vec3(u1, v1, z));\n\n\tsum *= 1.0f / 16.0;\n\treturn sum;\n}\n\nfloat getShadowPCF3x3(sampler2DShadow shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2DShadow shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#else\nfloat _xgetShadowPCF3x3(mat3 depthKernel, sampler2D shadowMap, vec3 shadowParams) {\n\tmat3 shadowKernel;\n\tvec3 shadowCoord = dShadowCoord;\n\tvec3 shadowZ = vec3(shadowCoord.z);\n\tshadowKernel[0] = vec3(greaterThan(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(greaterThan(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(greaterThan(depthKernel[2], shadowZ));\n\n\tvec2 fractionalCoord = fract( shadowCoord.xy * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat _getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\tvec3 shadowCoord = dShadowCoord;\n\n\tfloat xoffset = 1.0 / shadowParams.x; // 1/shadow map width\n\tfloat dx0 = -xoffset;\n\tfloat dx1 = xoffset;\n\n\tmat3 depthKernel;\n\tdepthKernel[0][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx0)));\n\tdepthKernel[0][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, 0.0)));\n\tdepthKernel[0][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx0, dx1)));\n\tdepthKernel[1][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx0)));\n\tdepthKernel[1][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy));\n\tdepthKernel[1][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(0.0, dx1)));\n\tdepthKernel[2][0] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx0)));\n\tdepthKernel[2][1] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, 0.0)));\n\tdepthKernel[2][2] = unpackFloat(texture2D(shadowMap, shadowCoord.xy + vec2(dx1, dx1)));\n\n\treturn _xgetShadowPCF3x3(depthKernel, shadowMap, shadowParams);\n}\n\nfloat getShadowPCF3x3(sampler2D shadowMap, vec3 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams);\n}\n\nfloat getShadowSpotPCF3x3(sampler2D shadowMap, vec4 shadowParams) {\n\treturn _getShadowPCF3x3(shadowMap, shadowParams.xyz);\n}\n#endif\n\n\n// ----- Point Sampling -----\n\nfloat _getShadowPoint(samplerCube shadowMap, vec4 shadowParams, vec3 dir) {\n\n\tvec3 tc = normalize(dir);\n\tvec3 tcAbs = abs(tc);\n\n\tvec4 dirX = vec4(1,0,0, tc.x);\n\tvec4 dirY = vec4(0,1,0, tc.y);\n\tfloat majorAxisLength = tc.z;\n\tif ((tcAbs.x > tcAbs.y) && (tcAbs.x > tcAbs.z)) {\n\t\tdirX = vec4(0,0,1, tc.z);\n\t\tdirY = vec4(0,1,0, tc.y);\n\t\tmajorAxisLength = tc.x;\n\t} else if ((tcAbs.y > tcAbs.x) && (tcAbs.y > tcAbs.z)) {\n\t\tdirX = vec4(1,0,0, tc.x);\n\t\tdirY = vec4(0,0,1, tc.z);\n\t\tmajorAxisLength = tc.y;\n\t}\n\n\tfloat shadowParamsInFaceSpace = ((1.0/shadowParams.x) * 2.0) * abs(majorAxisLength);\n\n\tvec3 xoffset = (dirX.xyz * shadowParamsInFaceSpace);\n\tvec3 yoffset = (dirY.xyz * shadowParamsInFaceSpace);\n\tvec3 dx0 = -xoffset;\n\tvec3 dy0 = -yoffset;\n\tvec3 dx1 = xoffset;\n\tvec3 dy1 = yoffset;\n\n\tmat3 shadowKernel;\n\tmat3 depthKernel;\n\n\tdepthKernel[0][0] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy0));\n\tdepthKernel[0][1] = unpackFloat(textureCube(shadowMap, tc + dx0));\n\tdepthKernel[0][2] = unpackFloat(textureCube(shadowMap, tc + dx0 + dy1));\n\tdepthKernel[1][0] = unpackFloat(textureCube(shadowMap, tc + dy0));\n\tdepthKernel[1][1] = unpackFloat(textureCube(shadowMap, tc));\n\tdepthKernel[1][2] = unpackFloat(textureCube(shadowMap, tc + dy1));\n\tdepthKernel[2][0] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy0));\n\tdepthKernel[2][1] = unpackFloat(textureCube(shadowMap, tc + dx1));\n\tdepthKernel[2][2] = unpackFloat(textureCube(shadowMap, tc + dx1 + dy1));\n\n\tvec3 shadowZ = vec3(length(dir) * shadowParams.w + shadowParams.z);\n\n\tshadowKernel[0] = vec3(lessThan2(depthKernel[0], shadowZ));\n\tshadowKernel[1] = vec3(lessThan2(depthKernel[1], shadowZ));\n\tshadowKernel[2] = vec3(lessThan2(depthKernel[2], shadowZ));\n\n\tvec2 uv = (vec2(dirX.w, dirY.w) / abs(majorAxisLength)) * 0.5;\n\n\tvec2 fractionalCoord = fract( uv * shadowParams.x );\n\n\tshadowKernel[0] = mix(shadowKernel[0], shadowKernel[1], fractionalCoord.x);\n\tshadowKernel[1] = mix(shadowKernel[1], shadowKernel[2], fractionalCoord.x);\n\n\tvec4 shadowValues;\n\tshadowValues.x = mix(shadowKernel[0][0], shadowKernel[0][1], fractionalCoord.y);\n\tshadowValues.y = mix(shadowKernel[0][1], shadowKernel[0][2], fractionalCoord.y);\n\tshadowValues.z = mix(shadowKernel[1][0], shadowKernel[1][1], fractionalCoord.y);\n\tshadowValues.w = mix(shadowKernel[1][1], shadowKernel[1][2], fractionalCoord.y);\n\n\treturn 1.0 - dot( shadowValues, vec4( 1.0 ) ) * 0.25;\n}\n\nfloat getShadowPointPCF3x3(samplerCube shadowMap, vec4 shadowParams) {\n\treturn _getShadowPoint(shadowMap, shadowParams, dLightDirW);\n}\nvoid _getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams, vec3 wPos) {\n\tdShadowCoord = (shadowMatrix * vec4(wPos, 1.0)).xyz;\n\tdShadowCoord.z = saturate(dShadowCoord.z) - 0.0001;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid _getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams, vec3 wPos) {\n\tvec4 projPos = shadowMatrix * vec4(wPos, 1.0);\n\tprojPos.xy /= projPos.w;\n\tdShadowCoord.xy = projPos.xy;\n\tdShadowCoord.z = length(dLightDirW) * shadowParams.w;\n\n\t#ifdef SHADOWBIAS\n\tdShadowCoord.z += getShadowBias(shadowParams.x, shadowParams.z);\n\t#endif\n}\n\nvoid getShadowCoordOrtho(mat4 shadowMatrix, vec3 shadowParams) {\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPersp(mat4 shadowMatrix, vec4 shadowParams) {\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, vPositionW);\n}\n\nvoid getShadowCoordPerspNormalOffset(mat4 shadowMatrix, vec4 shadowParams) {\n\tfloat distScale = abs(dot(vPositionW - dLightPosW, dLightDirNormW)); // fov?\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale;\n\n\t_getShadowCoordPersp(shadowMatrix, shadowParams, wPos);\n}\n\nvoid getShadowCoordOrthoNormalOffset(mat4 shadowMatrix, vec3 shadowParams) {\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0); //0.08\n\n\t_getShadowCoordOrtho(shadowMatrix, shadowParams, wPos);\n}\nvoid normalOffsetPointShadow(vec4 shadowParams) {\n\tfloat distScale = length(dLightDirW);\n\tvec3 wPos = vPositionW + dVertexNormalW * shadowParams.y * clamp(1.0 - dot(dVertexNormalW, -dLightDirNormW), 0.0, 1.0) * distScale; //0.02\n\tvec3 dir = wPos - dLightPosW;\n\tdLightDirW = dir;\n}\nfloat getLightDiffuse() {\n\treturn max(dot(dNormalW, -dLightDirNormW), 0.0);\n}\nvec3 combineColor() {\n\treturn dAlbedo * dDiffuseLight;\n}\nvoid addAmbient() {\n\tdDiffuseLight += light_globalAmbient;\n}\nvoid getViewDir() {\n\tdViewDirW = normalize(view_position - vPositionW);\n}\nvoid main(void) {\n\tdDiffuseLight = vec3(0);\n\tdSpecularLight = vec3(0);\n\tdReflection = vec4(0);\n\tdSpecularity = vec3(0);\n\n\t#ifdef CLEARCOAT\n\tccSpecularLight = vec3(0);\n\tccReflection = vec4(0);\n\t#endif\n\t dVertexNormalW = normalize(vNormalW);\n\t dAlpha = 1.0;\n\t getViewDir();\n\t getNormal();\n\t getAlbedo();\n\t addAmbient();\n\t dLightDirNormW = light0_direction;\n\t dAtten = 1.0;\n\t\t\t dAtten *= getLightDiffuse();\ngetShadowCoordOrthoNormalOffset(light0_shadowMatrix, light0_shadowParams);\nfadeShadow(light0_shadowCascadeDistances);\n\t\t\t dAtten *= getShadowPCF3x3(light0_shadowMap, light0_shadowParams);\n\t\t\t dDiffuseLight += dAtten * light0_color;\n\n\n\t#ifdef CLEARCOAT\n\tgl_FragColor.rgb = combineColorCC();\n\t#else\n\tgl_FragColor.rgb = combineColor();\n\t#endif \n\n\tgl_FragColor.rgb += getEmission();\n\tgl_FragColor.rgb = addFog(gl_FragColor.rgb);\n\n\t#ifndef HDR\n\tgl_FragColor.rgb = toneMap(gl_FragColor.rgb);\n\tgl_FragColor.rgb = gammaCorrectOutput(gl_FragColor.rgb);\n\t#endif\ngl_FragColor.a = 1.0;\n\n}\n",
                        "translatedSource": "#version 450\nvoid initGlobals();\nout vec4 _upc_fragColor;\nin vec3 _uvPositionW;\nin vec3 _uvNormalW;\nuniform vec3 _uview_position;\nuniform vec3 _ulight_globalAmbient;\nfloat _usaturate(in float _ux){\nreturn clamp(_ux, 0.0, 1.0);\n}\nvec4 _udReflection;\nvec3 _udAlbedo;\nvec3 _udNormalW;\nvec3 _udVertexNormalW;\nvec3 _udViewDirW;\nvec3 _udDiffuseLight;\nvec3 _udSpecularLight;\nvec3 _udLightDirNormW;\nvec3 _udShadowCoord;\nvec3 _udSpecularity;\nfloat _udAlpha;\nfloat _udAtten;\nuniform vec3 _ulight0_color;\nuniform vec3 _ulight0_direction;\nuniform mat4 _ulight0_shadowMatrix;\nuniform mat4 _ulight0_shadowMatrixPalette[4];\nuniform float _ulight0_shadowCascadeDistances[4];\nuniform float _ulight0_shadowCascadeCount;\nuniform vec3 _ulight0_shadowParams;\nuniform sampler2DShadow _ulight0_shadowMap;\nvoid _ugetNormal(){\n(_udNormalW = normalize(_udVertexNormalW));\n}\nvec3 _ugammaCorrectOutput(in vec3 _ucolor){\n(_ucolor += vec3(1e-07, 1e-07, 1e-07));\nreturn pow(_ucolor, vec3(0.44999999, 0.44999999, 0.44999999));\n}\nuniform float _uexposure;\nvec3 _utoneMap(in vec3 _ucolor){\nreturn (_ucolor * _uexposure);\n}\nvec3 _uaddFog(in vec3 _ucolor){\nreturn _ucolor;\n}\nvoid _ugetAlbedo(){\n(_udAlbedo = vec3(1.0, 1.0, 1.0));\n}\nuniform vec3 _umaterial_emissive;\nvec3 _ugetEmission(){\nvec3 _uemission = vec3(1.0, 1.0, 1.0);\n(_uemission *= _umaterial_emissive);\nreturn _uemission;\n}\nvoid _ufadeShadow(in float _ushadowCascadeDistances[4]){\nfloat _udepth = (1.0 / gl_FragCoord.w);\nif ((_udepth > _ushadowCascadeDistances[3]))\n{\n(_udShadowCoord.z = -9999999.0);\n}\n}\nfloat _u_getShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nfloat _uz = _udShadowCoord.z;\nvec2 _uuv = (_udShadowCoord.xy * _ushadowParams.x);\nfloat _ushadowMapSizeInv = (1.0 / _ushadowParams.x);\nvec2 _ubase_uv = floor((_uuv + vec2(0.5, 0.5)));\nfloat _us = ((_uuv.x + 0.5) - _ubase_uv.x);\nfloat _ut = ((_uuv.y + 0.5) - _ubase_uv.y);\n(_ubase_uv -= vec2(0.5, 0.5));\n(_ubase_uv *= _ushadowMapSizeInv);\nfloat _usum = 0.0;\nfloat _uuw0 = (3.0 - (2.0 * _us));\nfloat _uuw1 = (1.0 + (2.0 * _us));\nfloat _uu0 = (((2.0 - _us) / _uuw0) - 1.0);\nfloat _uu1 = ((_us / _uuw1) + 1.0);\nfloat _uvw0 = (3.0 - (2.0 * _ut));\nfloat _uvw1 = (1.0 + (2.0 * _ut));\nfloat _uv0 = (((2.0 - _ut) / _uvw0) - 1.0);\nfloat _uv1 = ((_ut / _uvw1) + 1.0);\n(_uu0 = ((_uu0 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv0 = ((_uv0 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_uu1 = ((_uu1 * _ushadowMapSizeInv) + _ubase_uv.x));\n(_uv1 = ((_uv1 * _ushadowMapSizeInv) + _ubase_uv.y));\n(_usum += ((_uuw0 * _uvw0) * texture(_ushadowMap, vec3(_uu0, _uv0, _uz))));\n(_usum += ((_uuw1 * _uvw0) * texture(_ushadowMap, vec3(_uu1, _uv0, _uz))));\n(_usum += ((_uuw0 * _uvw1) * texture(_ushadowMap, vec3(_uu0, _uv1, _uz))));\n(_usum += ((_uuw1 * _uvw1) * texture(_ushadowMap, vec3(_uu1, _uv1, _uz))));\n(_usum *= 0.0625);\nreturn _usum;\n}\nfloat _ugetShadowPCF3x3(in sampler2DShadow _ushadowMap, in vec3 _ushadowParams){\nreturn _u_getShadowPCF3x3(_ushadowMap, _ushadowParams);\n}\nvoid _u_getShadowCoordOrtho(in mat4 _ushadowMatrix, in vec3 _ushadowParams, in vec3 _uwPos){\n(_udShadowCoord = (_ushadowMatrix * vec4(_uwPos, 1.0)).xyz);\n(_udShadowCoord.z = (_usaturate(_udShadowCoord.z) - 9.9999997e-05));\n}\nvoid _ugetShadowCoordOrthoNormalOffset(in mat4 _ushadowMatrix, in vec3 _ushadowParams){\nvec3 _uwPos = (_uvPositionW + ((_udVertexNormalW * _ushadowParams.y) * clamp((1.0 - dot(_udVertexNormalW, (-_udLightDirNormW))), 0.0, 1.0)));\n_u_getShadowCoordOrtho(_ushadowMatrix, _ushadowParams, _uwPos);\n}\nfloat _ugetLightDiffuse(){\nreturn max(dot(_udNormalW, (-_udLightDirNormW)), 0.0);\n}\nvec3 _ucombineColor(){\nreturn (_udAlbedo * _udDiffuseLight);\n}\nvoid _uaddAmbient(){\n(_udDiffuseLight += _ulight_globalAmbient);\n}\nvoid _ugetViewDir(){\n(_udViewDirW = normalize((_uview_position - _uvPositionW)));\n}\nvoid main(){\ninitGlobals();\n(_upc_fragColor = vec4(0.0, 0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = normalize(_uvNormalW));\n(_udAlpha = 1.0);\n_ugetViewDir();\n_ugetNormal();\n_ugetAlbedo();\n_uaddAmbient();\n(_udLightDirNormW = _ulight0_direction);\n(_udAtten = 1.0);\n(_udAtten *= _ugetLightDiffuse());\n_ugetShadowCoordOrthoNormalOffset(_ulight0_shadowMatrix, _ulight0_shadowParams);\n_ufadeShadow(_ulight0_shadowCascadeDistances);\n(_udAtten *= _ugetShadowPCF3x3(_ulight0_shadowMap, _ulight0_shadowParams));\n(_udDiffuseLight += (_udAtten * _ulight0_color));\n(_upc_fragColor.xyz = _ucombineColor());\n(_upc_fragColor.xyz += _ugetEmission());\n(_upc_fragColor.xyz = _uaddFog(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _utoneMap(_upc_fragColor.xyz));\n(_upc_fragColor.xyz = _ugammaCorrectOutput(_upc_fragColor.xyz));\n(_upc_fragColor.w = 1.0);\n}\nvoid initGlobals(){\n(_udReflection = vec4(0.0, 0.0, 0.0, 0.0));\n(_udAlbedo = vec3(0.0, 0.0, 0.0));\n(_udNormalW = vec3(0.0, 0.0, 0.0));\n(_udVertexNormalW = vec3(0.0, 0.0, 0.0));\n(_udViewDirW = vec3(0.0, 0.0, 0.0));\n(_udDiffuseLight = vec3(0.0, 0.0, 0.0));\n(_udSpecularLight = vec3(0.0, 0.0, 0.0));\n(_udLightDirNormW = vec3(0.0, 0.0, 0.0));\n(_udShadowCoord = vec3(0.0, 0.0, 0.0));\n(_udSpecularity = vec3(0.0, 0.0, 0.0));\n(_udAlpha = 0.0);\n(_udAtten = 0.0);\n}\n\u0000"
                    }
                ],
                "elementArray": {
                    "arrayBuffer": {
                        "__SPECTOR_Object_TAG": {
                            "typeName": "WebGLBuffer",
                            "id": 3,
                            "displayText": "WebGLBuffer - ID: 3"
                        },
                        "__SPECTOR_Object_CustomData": {
                            "target": "ELEMENT_ARRAY_BUFFER",
                            "length": 12,
                            "usage": 35044
                        }
                    }
                },
                "attributes": [
                    {
                        "name": "vertex_position",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": 0,
                        "offsetPointer": 0,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 2,
                                "displayText": "WebGLBuffer - ID: 2"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 160,
                                "usage": 35044
                            }
                        },
                        "enabled": true,
                        "arraySize": 3,
                        "stride": 12,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "STATIC_DRAW",
                        "bufferLength": 160
                    },
                    {
                        "name": "vertex_normal",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": 1,
                        "offsetPointer": 48,
                        "bufferBinding": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLBuffer",
                                "id": 2,
                                "displayText": "WebGLBuffer - ID: 2"
                            },
                            "__SPECTOR_Object_CustomData": {
                                "target": "ARRAY_BUFFER",
                                "length": 160,
                                "usage": 35044
                            }
                        },
                        "enabled": true,
                        "arraySize": 3,
                        "stride": 12,
                        "arrayType": "FLOAT",
                        "normalized": false,
                        "vertexAttrib": [
                            0,
                            0,
                            0,
                            1
                        ],
                        "integer": false,
                        "divisor": 0,
                        "bufferUsage": "STATIC_DRAW",
                        "bufferLength": 160
                    }
                ],
                "uniforms": [
                    {
                        "name": "matrix_viewProjection",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 50,
                                "displayText": "WebGLUniformLocation - ID: 50"
                            }
                        },
                        "value": [
                            0.8800240159034729,
                            -0.8535534143447876,
                            -0.6124948859214783,
                            -0.6123723983764648,
                            0,
                            2.0907704830169678,
                            -0.5001000165939331,
                            -0.5,
                            -0.8800240159034729,
                            -0.8535534143447876,
                            -0.6124948859214783,
                            -0.6123723983764648,
                            0,
                            -0.4892691373825073,
                            6.450289249420166,
                            6.648979187011719
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "matrix_model",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 51,
                                "displayText": "WebGLUniformLocation - ID: 51"
                            }
                        },
                        "value": [
                            8,
                            0,
                            0,
                            0,
                            0,
                            1,
                            0,
                            0,
                            0,
                            0,
                            8,
                            0,
                            0,
                            0,
                            0,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "matrix_normal",
                        "size": 1,
                        "type": "FLOAT_MAT3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 52,
                                "displayText": "WebGLUniformLocation - ID: 52"
                            }
                        },
                        "value": [
                            0.125,
                            0,
                            0,
                            0,
                            1,
                            0,
                            0,
                            0,
                            0.125
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "view_position",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light_globalAmbient",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 53,
                                "displayText": "WebGLUniformLocation - ID: 53"
                            }
                        },
                        "value": [
                            0.02899118699133396,
                            0.02899118699133396,
                            0.02899118699133396
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_color",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 54,
                                "displayText": "WebGLUniformLocation - ID: 54"
                            }
                        },
                        "value": [
                            1,
                            1,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_direction",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 55,
                                "displayText": "WebGLUniformLocation - ID: 55"
                            }
                        },
                        "value": [
                            -0.5,
                            -0.7071067690849304,
                            0.5
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowMatrix",
                        "size": 1,
                        "type": "FLOAT_MAT4",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 56,
                                "displayText": "WebGLUniformLocation - ID: 56"
                            }
                        },
                        "value": [
                            -0.021421365439891815,
                            -0.0151471933349967,
                            -0.05613495036959648,
                            0,
                            0,
                            0.021421365439891815,
                            -0.07938680797815323,
                            0,
                            -0.021421365439891815,
                            0.0151471933349967,
                            0.05613495036959648,
                            0,
                            0.458984375,
                            0.509765625,
                            0.5330997109413147,
                            1
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowCascadeDistances",
                        "size": 4,
                        "type": "FLOAT",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 57,
                                "displayText": "WebGLUniformLocation - ID: 57"
                            }
                        },
                        "values": [
                            {
                                "value": 16
                            },
                            {
                                "value": 16
                            },
                            {
                                "value": 16
                            },
                            {
                                "value": 16
                            }
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowParams",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 58,
                                "displayText": "WebGLUniformLocation - ID: 58"
                            }
                        },
                        "value": [
                            1024,
                            0.05000000074505806,
                            -0.022453980520367622
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "exposure",
                        "size": 1,
                        "type": "FLOAT",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 59,
                                "displayText": "WebGLUniformLocation - ID: 59"
                            }
                        },
                        "value": 1,
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "material_emissive",
                        "size": 1,
                        "type": "FLOAT_VEC3",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 60,
                                "displayText": "WebGLUniformLocation - ID: 60"
                            }
                        },
                        "value": [
                            0,
                            0,
                            0
                        ],
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false
                    },
                    {
                        "name": "light0_shadowMap",
                        "size": 1,
                        "type": "SAMPLER_2D_SHADOW",
                        "location": {
                            "__SPECTOR_Object_TAG": {
                                "typeName": "WebGLUniformLocation",
                                "id": 61,
                                "displayText": "WebGLUniformLocation - ID: 61"
                            }
                        },
                        "value": 0,
                        "blockIndice": -1,
                        "offset": -1,
                        "arrayStride": -1,
                        "matrixStride": -1,
                        "rowMajor": false,
                        "texture": {
                            "magFilter": "LINEAR",
                            "minFilter": "LINEAR",
                            "wrapS": "CLAMP_TO_EDGE",
                            "wrapT": "CLAMP_TO_EDGE",
                            "anisotropy": 1,
                            "baseLevel": 0,
                            "immutable": false,
                            "immutableLevels": 0,
                            "maxLevel": 1000,
                            "maxLod": 1000,
                            "minLod": -1000,
                            "compareFunc": "LESS",
                            "compareMode": "COMPARE_REF_TO_TEXTURE",
                            "wrapR": "REPEAT",
                            "textureType": "FLOAT",
                            "format": "DEPTH_COMPONENT",
                            "internalFormat": "DEPTH_COMPONENT32F",
                            "width": 1024,
                            "height": 1024,
                            "visual": {}
                        }
                    }
                ],
                "uniformBlocks": []
            }
        },
        {
            "id": 42,
            "startTime": 1629734999285.8,
            "commandEndTime": 1629734999285.8,
            "endTime": 1629734999286,
            "name": "bindVertexArray",
            "commandArguments": [
                null
            ],
            "stackTrace": [
                "GraphicsDevice.updateEnd (https://code.playcanvas.com/playcanvas-stable.dbg.js:14337:13)",
                "ForwardRenderer.renderForward (https://code.playcanvas.com/playcanvas-stable.dbg.js:23206:11)",
                "ForwardRenderer.renderComposition (https://code.playcanvas.com/playcanvas-stable.dbg.js:23913:11)",
                "Application.render (https://code.playcanvas.com/playcanvas-stable.dbg.js:70461:18)"
            ],
            "status": 0,
            "marker": "Camera | World # ",
            "text": "bindVertexArray: null"
        }
    ],
    "initState": {
        "AlignmentState": {
            "PACK_ALIGNMENT": 4,
            "UNPACK_ALIGNMENT": 1,
            "UNPACK_COLORSPACE_CONVERSION_WEBGL": "0",
            "UNPACK_FLIP_Y_WEBGL": false,
            "UNPACK_PREMULTIPLY_ALPHA_WEBGL": false,
            "PACK_ROW_LENGTH": 0,
            "PACK_SKIP_PIXELS": 0,
            "PACK_SKIP_ROWS": 0,
            "UNPACK_IMAGE_HEIGHT": 0,
            "UNPACK_SKIP_PIXELS": 0,
            "UNPACK_SKIP_ROWS": 0,
            "UNPACK_SKIP_IMAGES": 0
        },
        "BlendState": {
            "BLEND": false,
            "BLEND_COLOR": [
                0,
                0,
                0,
                0
            ],
            "BLEND_DST_ALPHA": "ZERO",
            "BLEND_DST_RGB": "ZERO",
            "BLEND_EQUATION_ALPHA": "FUNC_ADD",
            "BLEND_EQUATION_RGB": "FUNC_ADD",
            "BLEND_SRC_ALPHA": "ONE",
            "BLEND_SRC_RGB": "ONE"
        },
        "ClearState": {
            "COLOR_CLEAR_VALUE": [
                0.11800000071525574,
                0.11800000071525574,
                0.11800000071525574,
                1
            ],
            "DEPTH_CLEAR_VALUE": 1,
            "STENCIL_CLEAR_VALUE": 0
        },
        "ColorState": {
            "COLOR_WRITEMASK": [
                true,
                true,
                true,
                true
            ]
        },
        "CoverageState": {
            "SAMPLE_COVERAGE_VALUE": 1,
            "SAMPLE_COVERAGE_INVERT": false,
            "SAMPLE_COVERAGE": false,
            "SAMPLE_ALPHA_TO_COVERAGE": false
        },
        "CullState": {
            "CULL_FACE": true,
            "CULL_FACE_MODE": "BACK"
        },
        "DepthState": {
            "DEPTH_TEST": true,
            "DEPTH_FUNC": "LEQUAL",
            "DEPTH_RANGE": [
                0,
                1
            ],
            "DEPTH_WRITEMASK": true
        },
        "DrawState": {
            "DITHER": true,
            "VIEWPORT": [
                0,
                0,
                1709,
                881
            ],
            "FRONT_FACE": "CCW",
            "FRAGMENT_SHADER_DERIVATIVE_HINT_OES": "Extension OES_standard_derivatives is unavailble.",
            "RASTERIZER_DISCARD": false,
            "FRAGMENT_SHADER_DERIVATIVE_HINT": 4354
        },
        "MipmapHintState": {
            "GENERATE_MIPMAP_HINT": 4352
        },
        "PolygonOffsetState": {
            "POLYGON_OFFSET_FILL": false,
            "POLYGON_OFFSET_FACTOR": 2,
            "POLYGON_OFFSET_UNITS": 2
        },
        "ScissorState": {
            "SCISSOR_TEST": true,
            "SCISSOR_BOX": [
                0,
                0,
                1709,
                881
            ]
        },
        "StencilState": {
            "STENCIL_TEST": false,
            "STENCIL_BACK_FAIL": "KEEP",
            "STENCIL_BACK_FUNC": "ALWAYS",
            "STENCIL_BACK_PASS_DEPTH_FAIL": "KEEP",
            "STENCIL_BACK_PASS_DEPTH_PASS": "KEEP",
            "STENCIL_BACK_REF": 0,
            "STENCIL_BACK_VALUE_MASK": "00000000000000000000000011111111",
            "STENCIL_BACK_WRITEMASK": "00000000000000000000000011111111",
            "STENCIL_FAIL": "KEEP",
            "STENCIL_FUNC": "ALWAYS",
            "STENCIL_PASS_DEPTH_FAIL": "KEEP",
            "STENCIL_PASS_DEPTH_PASS": "KEEP",
            "STENCIL_REF": 0,
            "STENCIL_VALUE_MASK": "00000000000000000000000011111111",
            "STENCIL_WRITEMASK": "00000000000000000000000011111111"
        },
        "VisualState": {
            "Attachments": [
                {
                    "attachmentName": "Canvas COLOR_ATTACHMENT",
                    "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACDCAYAAABiIcWkAAAAAXNSR0IArs4c6QAAA0hJREFUeF7t1AENADAMAkHmX/SWzMZfHfQgnG13jgCBpMAxAMncPU3gCxgARSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFjAA4fC9TsAA6ACBsIABCIfvdQIGQAcIhAUMQDh8rxMwADpAICxgAMLhe52AAdABAmEBAxAO3+sEDIAOEAgLGIBw+F4nYAB0gEBYwACEw/c6AQOgAwTCAgYgHL7XCRgAHSAQFni1XoMBe5hr+gAAAABJRU5ErkJggg==",
                    "textureCubeMapFace": null,
                    "textureLayer": 0
                }
            ],
            "FrameBuffer": null
        }
    },
    "endState": {
        "AlignmentState": {
            "PACK_ALIGNMENT": 4,
            "UNPACK_ALIGNMENT": 1,
            "UNPACK_COLORSPACE_CONVERSION_WEBGL": "0",
            "UNPACK_FLIP_Y_WEBGL": false,
            "UNPACK_PREMULTIPLY_ALPHA_WEBGL": false,
            "PACK_ROW_LENGTH": 0,
            "PACK_SKIP_PIXELS": 0,
            "PACK_SKIP_ROWS": 0,
            "UNPACK_IMAGE_HEIGHT": 0,
            "UNPACK_SKIP_PIXELS": 0,
            "UNPACK_SKIP_ROWS": 0,
            "UNPACK_SKIP_IMAGES": 0
        },
        "BlendState": {
            "BLEND": false,
            "BLEND_COLOR": [
                0,
                0,
                0,
                0
            ],
            "BLEND_DST_ALPHA": "ZERO",
            "BLEND_DST_RGB": "ZERO",
            "BLEND_EQUATION_ALPHA": "FUNC_ADD",
            "BLEND_EQUATION_RGB": "FUNC_ADD",
            "BLEND_SRC_ALPHA": "ONE",
            "BLEND_SRC_RGB": "ONE"
        },
        "ClearState": {
            "COLOR_CLEAR_VALUE": [
                0.11800000071525574,
                0.11800000071525574,
                0.11800000071525574,
                1
            ],
            "DEPTH_CLEAR_VALUE": 1,
            "STENCIL_CLEAR_VALUE": 0
        },
        "ColorState": {
            "COLOR_WRITEMASK": [
                true,
                true,
                true,
                true
            ]
        },
        "CoverageState": {
            "SAMPLE_COVERAGE_VALUE": 1,
            "SAMPLE_COVERAGE_INVERT": false,
            "SAMPLE_COVERAGE": false,
            "SAMPLE_ALPHA_TO_COVERAGE": false
        },
        "CullState": {
            "CULL_FACE": true,
            "CULL_FACE_MODE": "BACK"
        },
        "DepthState": {
            "DEPTH_TEST": true,
            "DEPTH_FUNC": "LEQUAL",
            "DEPTH_RANGE": [
                0,
                1
            ],
            "DEPTH_WRITEMASK": true
        },
        "DrawState": {
            "DITHER": true,
            "VIEWPORT": [
                0,
                0,
                1709,
                881
            ],
            "FRONT_FACE": "CCW",
            "FRAGMENT_SHADER_DERIVATIVE_HINT_OES": "Extension OES_standard_derivatives is unavailble.",
            "RASTERIZER_DISCARD": false,
            "FRAGMENT_SHADER_DERIVATIVE_HINT": 4354
        },
        "MipmapHintState": {
            "GENERATE_MIPMAP_HINT": 4352
        },
        "PolygonOffsetState": {
            "POLYGON_OFFSET_FILL": false,
            "POLYGON_OFFSET_FACTOR": 2,
            "POLYGON_OFFSET_UNITS": 2
        },
        "ScissorState": {
            "SCISSOR_TEST": true,
            "SCISSOR_BOX": [
                0,
                0,
                1709,
                881
            ]
        },
        "StencilState": {
            "STENCIL_TEST": false,
            "STENCIL_BACK_FAIL": "KEEP",
            "STENCIL_BACK_FUNC": "ALWAYS",
            "STENCIL_BACK_PASS_DEPTH_FAIL": "KEEP",
            "STENCIL_BACK_PASS_DEPTH_PASS": "KEEP",
            "STENCIL_BACK_REF": 0,
            "STENCIL_BACK_VALUE_MASK": "00000000000000000000000011111111",
            "STENCIL_BACK_WRITEMASK": "00000000000000000000000011111111",
            "STENCIL_FAIL": "KEEP",
            "STENCIL_FUNC": "ALWAYS",
            "STENCIL_PASS_DEPTH_FAIL": "KEEP",
            "STENCIL_PASS_DEPTH_PASS": "KEEP",
            "STENCIL_REF": 0,
            "STENCIL_VALUE_MASK": "00000000000000000000000011111111",
            "STENCIL_WRITEMASK": "00000000000000000000000011111111"
        },
        "VisualState": {
            "Attachments": [
                {
                    "attachmentName": "Canvas COLOR_ATTACHMENT",
                    "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACDCAYAAABiIcWkAAAAAXNSR0IArs4c6QAAGrxJREFUeF7tnXeoHcUXxzf23nuJDSIi+Jeg2EusMXZjIfZeo9hA9B//UMTyhwUbsStiwRgJFmwIBhLFGjUmGo0t9t7rj8/4+17Pm7fv3bv33bKzexYe7969s7MzZ+f7nXPOnDk7avTo0f9kfrgEXAK1lMAoJ4BaPnfvtEsgSMAJwAeCS6DGEnACqPHD9667BJwAfAy4BGosASeAGj9877pLwAnAx4BLoMYScAKo8cP3rrsEnAB8DLgEaiwBJ4AaP3zvukvACcDHgEugxhJwAqjxw/euuwScAHwMuARqLAEngBo/fO+6S8AJwMeAS6DGEnACqPHD9667BJwAfAy4BGosASeAGj9877pLwAnAx4BLoMYScAKo8cP3rrsEnAB8DLgEaiwBJ4AaP3zvukvACcDHgEugxhJwAqjxw/euuwScAHwMuARqLAEngBo/fO+6S8AJwMeAS6DGEnACqPHD9667BJwAfAy4BGosASeAGj9877pLwAmgZmNgzJgx2U033ZTb6wMOOCD76quvaiaRenfXCaAGz/+kk07KDjnkkEI9ve6667L777+/0DVeOD0JOAGk98xaavGzzz7bUrlWCqEVTJgwIfvrr79aKe5lEpKAE0BCD6tZUzsJ+qHu9ccff2S77LJLs6b474lIwAkgkQeV18yJEydmxx13XF97cNttt2X8cay77rrZ+PHjG+355ZdfslGjRmW33HJLX9voNx9aAk4AiY2ORx55JFt22WVL0+q///47u+eee7LFFlsstInv33//fbbiiitm//zzT/j7+eefs2WWWSaQwWOPPZa98847pWl/3RviBJDACHjmmWcCeMp0TJ48OVtuueUC2AE3/1deeeXszz//DM3EVIAUIAAO/Ac//vhjtsIKKzSI4bvvvgvk4Uf/JOAE0D/ZD3nnPfbYIzv//PNL1zJ8DF9++WWY5Tl+++23bPHFF2+0k/M//PBDA+T8AOiXX375hmaw1FJLBXJYYoklwnUQxLfffputssoq2cyZM7MZM2aUrt9VbpATQEme7hVXXJFtvvnmJWnNf80AnE888cQAkANqAIxWsuiii2bY+ksvvXSDGJjtf/rpp0AEIgu+ozFoJQFNQWWkJYgsKPPZZ59lDz74YOnk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",
                    "textureCubeMapFace": null,
                    "textureLayer": 0
                }
            ],
            "FrameBuffer": null
        }
    },
    "startTime": 1629734999176.7,
    "listenCommandsStartTime": 1629734999195.9,
    "listenCommandsEndTime": 1629734999286.5,
    "endTime": 1629734999333.6,
    "analyses": [
        {
            "analyserName": "Commands",
            "uniformMatrix4fv": 9,
            "bindVertexArray": 5,
            "bindBuffer": 4,
            "drawElements": 4,
            "scissor": 3,
            "useProgram": 3,
            "bindFramebuffer": 2,
            "clear": 2,
            "colorMask": 2,
            "uniform1fv": 2,
            "uniformMatrix3fv": 2,
            "viewport": 2,
            "disable": 1,
            "enable": 1,
            "polygonOffset": 1
        },
        {
            "analyserName": "CommandsSummary",
            "total": 43,
            "draw": 4,
            "clear": 2
        },
        {
            "analyserName": "Primitives",
            "total": 84,
            "triangles": 84,
            "triangleStrip": 0,
            "triangleFan": 0,
            "lines": 0,
            "lineStrip": 0,
            "lineLoop": 0,
            "points": 0
        }
    ],
    "frameMemory": {
        "Buffer": 0,
        "Renderbuffer": 0,
        "Texture2d": 0,
        "Texture3d": 0,
        "Program": 0
    },
    "memory": {
        "Buffer": {
            "3": 1396
        },
        "Renderbuffer": {},
        "Texture2d": {
            "3": 4210688
        },
        "Texture3d": {},
        "Program": {
            "3": 48728
        }
    }
}