From c827dad22a1af3e23265c08655e5889961ab04af Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 29 Nov 2013 23:15:50 +0100 Subject: [PATCH 1/8] Added camera. --- examples/common/entry/camera.cpp | 228 +++++++++++++++++++++++++++++++ examples/common/entry/camera.h | 36 +++++ examples/common/entry/entry.cpp | 16 +++ examples/common/fpumath.h | 8 +- 4 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 examples/common/entry/camera.cpp create mode 100644 examples/common/entry/camera.h diff --git a/examples/common/entry/camera.cpp b/examples/common/entry/camera.cpp new file mode 100644 index 000000000..0d2ad1b86 --- /dev/null +++ b/examples/common/entry/camera.cpp @@ -0,0 +1,228 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include +#include "../fpumath.h" +#include "camera.h" + +struct Camera +{ + struct MouseCoords + { + int32_t m_mx; + int32_t m_my; + }; + + Camera() + { + reset(); + } + + void reset() + { + m_mouseNow.m_mx = 0; + m_mouseNow.m_my = 0; + m_mouseLast.m_mx = 0; + m_mouseLast.m_my = 0; + m_eye[0] = 0.0f; + m_eye[1] = 0.0f; + m_eye[2] = -35.0f; + m_at[0] = 0.0f; + m_at[1] = 0.0f; + m_at[2] = -1.0f; + m_up[0] = 0.0f; + m_up[1] = 1.0f; + m_up[2] = 0.0f; + m_horizontalAngle = 0.01f; + m_verticalAngle = 0.0f; + m_mouseSpeed = 0.0020f; + m_moveSpeed = 30.0f; + m_keys = 0; + m_mouseDown = false; + } + + void setMouseState(uint32_t _mx, uint32_t _my, bool _down, bool _move) + { + if (_down) + { + m_mouseDown = true; + m_mouseLast.m_mx = _mx; + m_mouseLast.m_my = _my; + m_mouseNow.m_mx = _mx; + m_mouseNow.m_my = _my; + } + + if (!_down && !_move) + { + m_mouseDown = false; + } + + if (m_mouseDown && _move) + { + m_mouseNow.m_mx = _mx; + m_mouseNow.m_my = _my; + } + } + + void setKeyState(uint8_t _key, bool _down) + { + m_keys &= ~_key; + m_keys |= _down ? _key : 0; + } + + void update(float _deltaTime) + { + if (m_mouseDown) + { + int32_t deltaX = m_mouseNow.m_mx - m_mouseLast.m_mx; + int32_t deltaY = m_mouseNow.m_my - m_mouseLast.m_my; + + m_horizontalAngle += m_mouseSpeed * float(deltaX); + m_verticalAngle -= m_mouseSpeed * float(deltaY); + + m_mouseLast.m_mx = m_mouseNow.m_mx; + m_mouseLast.m_my = m_mouseNow.m_my; + } + + float direction[3] = + { + cosf(m_verticalAngle) * sinf(m_horizontalAngle), + sinf(m_verticalAngle), + cosf(m_verticalAngle) * cosf(m_horizontalAngle), + }; + + float right[3] = + { + sinf(m_horizontalAngle - float(M_PI)/2.0f), + 0, + cosf(m_horizontalAngle - float(M_PI)/2.0f), + }; + + if (m_keys & CAMERA_KEY_UP) + { + // m_eye += direction * _deltaTime * m_moveSpeed + float tmpRhs[3]; + float tmpPos[3]; + memcpy(tmpPos, m_eye, sizeof(float)*3); + vec3Mul(tmpRhs, direction, _deltaTime * m_moveSpeed); + vec3Add(m_eye, tmpPos, tmpRhs); + setKeyState(CAMERA_KEY_UP, false); + } + + if (m_keys & CAMERA_KEY_DOWN) + { + // m_eye -= direction * _deltaTime * m_moveSpeed + float tmpRhs[3]; + float tmpPos[3]; + memcpy(tmpPos, m_eye, sizeof(float)*3); + vec3Mul(tmpRhs, direction, _deltaTime * m_moveSpeed); + vec3Sub(m_eye, tmpPos, tmpRhs); + setKeyState(CAMERA_KEY_DOWN, false); + } + + if (m_keys & CAMERA_KEY_LEFT) + { + // m_eye += right * _deltaTime * m_moveSpeed + float tmpRhs[3]; + float tmpPos[3]; + memcpy(tmpPos, m_eye, sizeof(float)*3); + vec3Mul(tmpRhs, right, _deltaTime * m_moveSpeed); + vec3Add(m_eye, tmpPos, tmpRhs); + setKeyState(CAMERA_KEY_LEFT, false); + } + + if (m_keys & CAMERA_KEY_RIGHT) + { + // m_eye -= right * _deltaTime * m_moveSpeed + float tmpRhs[3]; + float tmpPos[3]; + memcpy(tmpPos, m_eye, sizeof(float)*3); + vec3Mul(tmpRhs, right, _deltaTime * m_moveSpeed); + vec3Sub(m_eye, tmpPos, tmpRhs); + setKeyState(CAMERA_KEY_RIGHT, false); + } + + vec3Add(m_at, m_eye, direction); + vec3Cross(m_up, right, direction); + } + + void getViewMtx(float* _viewMtx) + { + mtxLookAt(_viewMtx, m_eye, m_at, m_up); + } + + void setPosition(float* _pos) + { + memcpy(m_eye, _pos, sizeof(float)*3); + } + + void setVerticalAngle(float _verticalAngle) + { + m_verticalAngle = _verticalAngle; + } + + void setHorizontalAngle(float _horizontalAngle) + { + m_horizontalAngle = _horizontalAngle; + } + + MouseCoords m_mouseNow, m_mouseLast; + float m_eye[3]; + float m_at[3]; + float m_up[3]; + float m_horizontalAngle; + float m_verticalAngle; + float m_mouseSpeed; + float m_moveSpeed; + uint8_t m_keys; + bool m_mouseDown; +}; + +static Camera s_camera; + +void cameraSetPosition(float* _pos) +{ + s_camera.setPosition(_pos); +} + +void cameraSetHorizontalAngle(float _horizontalAngle) +{ + s_camera.setHorizontalAngle(_horizontalAngle); +} + +void cameraSetVerticalAngle(float _verticalAngle) +{ + s_camera.setVerticalAngle(_verticalAngle); +} + +void cameraSetMouseState(uint32_t _mx, uint32_t _my, bool _down, bool _move) +{ + s_camera.setMouseState(_mx, _my, _down, _move); +} + +void cameraSetKeyState(uint8_t _key, bool _down) +{ + s_camera.setKeyState(_key, _down); +} + +void cameraGetViewMtx(float* _viewMtx) +{ + s_camera.getViewMtx(_viewMtx); +} + +void cameraGetPosition(float* _pos) +{ + memcpy(_pos, s_camera.m_eye, 3*sizeof(float)); +} + +void cameraGetAt(float* _at) +{ + memcpy(_at, s_camera.m_at, 3*sizeof(float)); +} + +void cameraUpdate(float _deltaTime) +{ + s_camera.update(_deltaTime); +} diff --git a/examples/common/entry/camera.h b/examples/common/entry/camera.h new file mode 100644 index 000000000..934985e4e --- /dev/null +++ b/examples/common/entry/camera.h @@ -0,0 +1,36 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +static const uint8_t CAMERA_KEY_UP = 1u << 1; +static const uint8_t CAMERA_KEY_DOWN = 1u << 2; +static const uint8_t CAMERA_KEY_LEFT = 1u << 3; +static const uint8_t CAMERA_KEY_RIGHT = 1u << 4; + +/// +void cameraSetPosition(float* _pos); + +/// +void cameraSetHorizontalAngle(float _horizontalAngle); + +/// +void cameraSetVerticalAngle(float _verticalAngle); + +/// +void cameraSetMouseState(uint32_t _mx, uint32_t _my, bool _down, bool _move); + +/// +void cameraSetKeyState(uint8_t _key, bool _down); + +/// +void cameraGetViewMtx(float* _viewMtx); + +/// +void cameraGetPosition(float* _pos); + +/// +void cameraGetAt(float* _at); + +/// +void cameraUpdate(float _deltaTime = 0.0f); diff --git a/examples/common/entry/entry.cpp b/examples/common/entry/entry.cpp index df8a30ffb..a2b60ee71 100644 --- a/examples/common/entry/entry.cpp +++ b/examples/common/entry/entry.cpp @@ -11,6 +11,7 @@ #include "entry_p.h" #include "cmd.h" #include "input.h" +#include "camera.h" extern int _main_(int _argc, char** _argv); @@ -116,6 +117,16 @@ namespace entry INPUT_BINDING_END }; + static const InputBinding s_camBindings[] = + { + { entry::Key::KeyW, entry::Modifier::None, 0, cmd, "move forward" }, + { entry::Key::KeyA, entry::Modifier::None, 0, cmd, "move left" }, + { entry::Key::KeyS, entry::Modifier::None, 0, cmd, "move backward" }, + { entry::Key::KeyD, entry::Modifier::None, 0, cmd, "move right" }, + + INPUT_BINDING_END + }; + int main(int _argc, char** _argv) { DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME); @@ -123,8 +134,10 @@ namespace entry cmdAdd("mouselock", cmdMouseLock); cmdAdd("graphics", cmdGraphics ); cmdAdd("exit", cmdExit ); + cmdAdd("move", cmdMove ); inputAddBindings("bindings", s_bindings); + inputAddBindings("camBindings", s_camBindings); int32_t result = ::_main_(_argc, _argv); return result; @@ -154,6 +167,9 @@ namespace entry { const MouseEvent* mouse = static_cast(ev); + //TODO: move this from here. + cameraSetMouseState(mouse->m_mx, mouse->m_my, mouse->m_down, mouse->m_move); + if (mouse->m_move) { inputSetMousePos(mouse->m_mx, mouse->m_my); diff --git a/examples/common/fpumath.h b/examples/common/fpumath.h index 6d85d8ff0..68b1cc01b 100644 --- a/examples/common/fpumath.h +++ b/examples/common/fpumath.h @@ -143,7 +143,7 @@ inline void mtxScale(float* _result, float _x, float _y, float _z) _result[15] = 1.0f; } -inline void mtxLookAt(float* __restrict _result, const float* __restrict _eye, const float* __restrict _at) +inline void mtxLookAt(float* __restrict _result, const float* __restrict _eye, const float* __restrict _at, const float* __restrict _up = NULL) { float tmp[4]; vec3Sub(tmp, _at, _eye); @@ -152,6 +152,12 @@ inline void mtxLookAt(float* __restrict _result, const float* __restrict _eye, c vec3Norm(view, tmp); float up[3] = { 0.0f, 1.0f, 0.0f }; + if (NULL != _up) + { + up[0] = _up[0]; + up[1] = _up[1]; + up[2] = _up[2]; + } vec3Cross(tmp, up, view); float right[4]; From 530790970d0178bb4a44ac710712d1ac83562379 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Sun, 1 Dec 2013 00:48:01 +0100 Subject: [PATCH 2/8] Fixed cube mesh normals. --- examples/runtime/meshes/cube.bin | Bin 1144 -> 856 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/runtime/meshes/cube.bin b/examples/runtime/meshes/cube.bin index 89daac8be821eac17e9df3c8c2d1d72f9ff6b21a..ca95bea8299a32f2dd0057856e19762b8911c042 100644 GIT binary patch literal 856 zcmcJNF-`+95Ji8&5<&=pgb)xF1y@M7k|n4@g(x@x5=Wr-oj5=WZh=I{IavN5k9WOE zjU~@|-u^%K&idv47R6Y9eS8NXZi}frj5+lzw7%SD)xK^mZ+QIuS<-c06qy!lEpI*> zjk(39!8Muf>?dM2h_PS+b<12seT~|6neo}O(D}(4t0$efbl72OkEAoNbwhh}O#ZFT zLX^*!>QPs+)X5%`m)f2;vpRB<^gjOuW{J7RzPDtF>wKLq*8|(9dOhzB(|6Pbla{k( z!Ovs5$VRuh>zujIdzy4&@>{Q@+wcb7u{bcmka36uR5-+lafBm`af}J$1Sgo{6f?#d p&UlOFSTHVdfh8`nVqD=0PtO~xRpH_N^-XnCb=X}}?&DwY`X3gEs`>x` literal 1144 zcmcIkJ5mEN41M_!LI?o@1W1*FE2Q=eROuKB4!}%~K#dQ=EvTsW9?WnCsA-lb+472A zDA9~%SxhcTDzt~Q6=+^}1>mfp|juh$j3P94eA#S$); zwb-Tlx*l9Gr<1cHUoI-e3f@v!@Z76)uBL-KKIL`i7(VJJcec4!XBy;eCOI*Env7%E zs@9ZEx&iVk);!_TXZ?a#4UckW%wp5m{*7(^rruN}9j4K;rlHi!{5(_lNQ6u0GH+jq z)T>2$F4dEJHO?G@{lMEbf8gv=({~pca+!9||10iiFfJM-pBJ-5bHRh;();%_v{w2A zZ}kf%W_jCFw(*uP9OUvAs||1Hm8N>=bMIq-A$BmLA7K|`>|sJb!9J!qz>I!|Lmc54 lbNV?>c;n8npkLq|w|5(|^w@p#_^=h?#16<^bM~+Q1>ceFvts}N From c01085856c21aca95ca2239237ab01f0be0c9d0a Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Wed, 11 Dec 2013 04:32:13 +0100 Subject: [PATCH 3/8] Added packHalfFloat(). --- examples/common/shaderlib.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/common/shaderlib.sh b/examples/common/shaderlib.sh index 08a5447aa..253cdf7fc 100644 --- a/examples/common/shaderlib.sh +++ b/examples/common/shaderlib.sh @@ -250,6 +250,21 @@ float unpackRgbaToFloat(vec4 _rgba) return dot(_rgba, shift); } +vec2 packHalfFloat(float _value) +{ + const vec2 shift = vec2(256, 1.0); + const vec2 mask = vec2(0, 1.0 / 256.0); + vec2 comp = fract(_value * shift); + comp -= comp.xx * mask; + return comp; +} + +float unpackHalfFloat(vec2 _rg) +{ + const vec2 shift = vec2(1.0 / 256.0, 1.0); + return dot(_rg, shift); +} + float random(vec2 _uv) { return fract(sin(dot(_uv.xy, vec2(12.9898, 78.233) ) ) * 43758.5453); From 5594e9af8c81f648bce38e4ac3abdff6147eb349 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Wed, 11 Dec 2013 04:37:51 +0100 Subject: [PATCH 4/8] Added 15-shadowmaps-simple and 16-shadowmaps. --- .../15-shadowmaps-simple/fs_smsimple_draw.sc | 96 + .../fs_smsimple_packdepth.sc | 15 + examples/15-shadowmaps-simple/hollowcube.obj | 934 + examples/15-shadowmaps-simple/makefile | 22 + .../shadowmaps_simple.cpp | 670 + examples/15-shadowmaps-simple/varying.def.sc | 7 + .../15-shadowmaps-simple/vs_smsimple_draw.sc | 24 + .../vs_smsimple_packdepth.sc | 15 + examples/16-shadowmaps/common.sh | 235 + .../fs_shadowmaps_color_black.sc | 11 + .../fs_shadowmaps_color_lightning.sh | 84 + .../fs_shadowmaps_color_lightning_esm.sc | 15 + .../fs_shadowmaps_color_lightning_esm_csm.sc | 17 + ...s_shadowmaps_color_lightning_esm_linear.sc | 16 + ...adowmaps_color_lightning_esm_linear_csm.sc | 18 + ...dowmaps_color_lightning_esm_linear_omni.sc | 17 + .../fs_shadowmaps_color_lightning_esm_omni.sc | 16 + .../fs_shadowmaps_color_lightning_hard.sc | 15 + .../fs_shadowmaps_color_lightning_hard_csm.sc | 16 + ..._shadowmaps_color_lightning_hard_linear.sc | 15 + ...dowmaps_color_lightning_hard_linear_csm.sc | 17 + ...owmaps_color_lightning_hard_linear_omni.sc | 16 + ...fs_shadowmaps_color_lightning_hard_omni.sc | 16 + .../fs_shadowmaps_color_lightning_main.sh | 151 + .../fs_shadowmaps_color_lightning_pcf.sc | 15 + .../fs_shadowmaps_color_lightning_pcf_csm.sc | 17 + ...s_shadowmaps_color_lightning_pcf_linear.sc | 16 + ...adowmaps_color_lightning_pcf_linear_csm.sc | 17 + ...dowmaps_color_lightning_pcf_linear_omni.sc | 17 + .../fs_shadowmaps_color_lightning_pcf_omni.sc | 16 + .../fs_shadowmaps_color_lightning_vsm.sc | 15 + .../fs_shadowmaps_color_lightning_vsm_csm.sc | 16 + ...s_shadowmaps_color_lightning_vsm_linear.sc | 16 + ...adowmaps_color_lightning_vsm_linear_csm.sc | 17 + ...dowmaps_color_lightning_vsm_linear_omni.sc | 17 + .../fs_shadowmaps_color_lightning_vsm_omni.sc | 16 + .../fs_shadowmaps_color_texture.sc | 22 + examples/16-shadowmaps/fs_shadowmaps_hblur.sc | 14 + .../16-shadowmaps/fs_shadowmaps_hblur_vsm.sc | 15 + .../16-shadowmaps/fs_shadowmaps_packdepth.sc | 14 + .../fs_shadowmaps_packdepth_linear.sc | 13 + .../fs_shadowmaps_packdepth_vsm.sc | 20 + .../fs_shadowmaps_packdepth_vsm_linear.sc | 20 + .../16-shadowmaps/fs_shadowmaps_texture.sc | 14 + .../fs_shadowmaps_unpackdepth.sc | 19 + .../fs_shadowmaps_unpackdepth_vsm.sc | 20 + examples/16-shadowmaps/fs_shadowmaps_vblur.sc | 14 + .../16-shadowmaps/fs_shadowmaps_vblur_vsm.sc | 15 + examples/16-shadowmaps/hollowcube.obj | 934 + examples/16-shadowmaps/makefile | 22 + examples/16-shadowmaps/shadowmaps.cpp | 3296 ++++ examples/16-shadowmaps/tree.obj | 14156 ++++++++++++++++ examples/16-shadowmaps/varying.def.sc | 14 + examples/16-shadowmaps/vs_shadowmaps_color.sc | 13 + .../vs_shadowmaps_color_lightning.sc | 25 + .../vs_shadowmaps_color_lightning_csm.sc | 36 + .../vs_shadowmaps_color_lightning_linear.sc | 26 + ...s_shadowmaps_color_lightning_linear_csm.sc | 41 + ..._shadowmaps_color_lightning_linear_omni.sc | 40 + .../vs_shadowmaps_color_lightning_omni.sc | 35 + .../vs_shadowmaps_color_texture.sc | 16 + examples/16-shadowmaps/vs_shadowmaps_depth.sc | 13 + examples/16-shadowmaps/vs_shadowmaps_hblur.sc | 32 + .../16-shadowmaps/vs_shadowmaps_packdepth.sc | 15 + .../vs_shadowmaps_packdepth_linear.sc | 15 + .../16-shadowmaps/vs_shadowmaps_texture.sc | 16 + .../vs_shadowmaps_texture_lightning.sc | 20 + .../vs_shadowmaps_unpackdepth.sc | 16 + examples/16-shadowmaps/vs_shadowmaps_vblur.sc | 32 + examples/common/entry/entry.cpp | 31 +- examples/common/fpumath.h | 10 + examples/runtime/meshes/hollowcube.bin | Bin 0 -> 24175 bytes examples/runtime/meshes/tree.bin | Bin 0 -> 100745 bytes examples/runtime/meshes/tricube.bin | Bin 0 -> 24175 bytes .../glsl/fs_shadowmaps_color_black.bin | Bin 0 -> 70 bytes .../glsl/fs_shadowmaps_color_lightning.bin | Bin 0 -> 2325 bytes .../fs_shadowmaps_color_lightning_esm.bin | Bin 0 -> 3086 bytes .../fs_shadowmaps_color_lightning_esm_csm.bin | Bin 0 -> 5957 bytes ..._shadowmaps_color_lightning_esm_linear.bin | Bin 0 -> 3057 bytes ...dowmaps_color_lightning_esm_linear_csm.bin | Bin 0 -> 6163 bytes ...owmaps_color_lightning_esm_linear_omni.bin | Bin 0 -> 5988 bytes ...fs_shadowmaps_color_lightning_esm_omni.bin | Bin 0 -> 5945 bytes .../fs_shadowmaps_color_lightning_hard.bin | Bin 0 -> 2930 bytes ...fs_shadowmaps_color_lightning_hard_csm.bin | Bin 0 -> 5297 bytes ...shadowmaps_color_lightning_hard_linear.bin | Bin 0 -> 2942 bytes ...owmaps_color_lightning_hard_linear_csm.bin | Bin 0 -> 5700 bytes ...wmaps_color_lightning_hard_linear_omni.bin | Bin 0 -> 5872 bytes ...s_shadowmaps_color_lightning_hard_omni.bin | Bin 0 -> 5789 bytes .../fs_shadowmaps_color_lightning_omni.bin | Bin 0 -> 3992 bytes .../fs_shadowmaps_color_lightning_pcf.bin | Bin 0 -> 4282 bytes .../fs_shadowmaps_color_lightning_pcf_csm.bin | 293 + ..._shadowmaps_color_lightning_pcf_linear.bin | Bin 0 -> 4443 bytes ...dowmaps_color_lightning_pcf_linear_csm.bin | 321 + ...owmaps_color_lightning_pcf_linear_omni.bin | Bin 0 -> 7385 bytes ...fs_shadowmaps_color_lightning_pcf_omni.bin | Bin 0 -> 7153 bytes .../fs_shadowmaps_color_lightning_pfc.bin | Bin 0 -> 3535 bytes .../fs_shadowmaps_color_lightning_vsm.bin | Bin 0 -> 3718 bytes .../fs_shadowmaps_color_lightning_vsm_csm.bin | 194 + ..._shadowmaps_color_lightning_vsm_linear.bin | Bin 0 -> 3689 bytes ...dowmaps_color_lightning_vsm_linear_csm.bin | 202 + ...owmaps_color_lightning_vsm_linear_omni.bin | Bin 0 -> 6621 bytes ...fs_shadowmaps_color_lightning_vsm_omni.bin | Bin 0 -> 6578 bytes .../glsl/fs_shadowmaps_color_texture.bin | Bin 0 -> 552 bytes .../shaders/glsl/fs_shadowmaps_depth.bin | Bin 0 -> 78 bytes .../shaders/glsl/fs_shadowmaps_hblur.bin | Bin 0 -> 1379 bytes .../shaders/glsl/fs_shadowmaps_hblur_vsm.bin | Bin 0 -> 2650 bytes .../shaders/glsl/fs_shadowmaps_packdepth.bin | Bin 0 -> 274 bytes .../glsl/fs_shadowmaps_packdepth_linear.bin | Bin 0 -> 234 bytes .../glsl/fs_shadowmaps_packdepth_vsm.bin | Bin 0 -> 459 bytes .../fs_shadowmaps_packdepth_vsm_linear.bin | Bin 0 -> 376 bytes .../shaders/glsl/fs_shadowmaps_texture.bin | Bin 0 -> 137 bytes .../glsl/fs_shadowmaps_texture_lightning.bin | Bin 0 -> 2116 bytes .../glsl/fs_shadowmaps_unpackdepth.bin | Bin 0 -> 311 bytes .../glsl/fs_shadowmaps_unpackdepth_vsm.bin | Bin 0 -> 288 bytes .../shaders/glsl/fs_shadowmaps_vblur.bin | Bin 0 -> 1379 bytes .../shaders/glsl/fs_shadowmaps_vblur_vsm.bin | Bin 0 -> 2650 bytes .../shaders/glsl/vs_shadowmaps_color.bin | Bin 0 -> 196 bytes .../glsl/vs_shadowmaps_color_lightning.bin | Bin 0 -> 795 bytes .../vs_shadowmaps_color_lightning_csm.bin | Bin 0 -> 1278 bytes .../vs_shadowmaps_color_lightning_linear.bin | Bin 0 -> 883 bytes ..._shadowmaps_color_lightning_linear_csm.bin | Bin 0 -> 1626 bytes ...shadowmaps_color_lightning_linear_omni.bin | Bin 0 -> 1581 bytes .../vs_shadowmaps_color_lightning_omni.bin | Bin 0 -> 1233 bytes .../glsl/vs_shadowmaps_color_texture.bin | Bin 0 -> 279 bytes .../shaders/glsl/vs_shadowmaps_depth.bin | Bin 0 -> 196 bytes .../shaders/glsl/vs_shadowmaps_hblur.bin | Bin 0 -> 1317 bytes .../shaders/glsl/vs_shadowmaps_packdepth.bin | Bin 0 -> 286 bytes .../glsl/vs_shadowmaps_packdepth_linear.bin | Bin 0 -> 299 bytes .../shaders/glsl/vs_shadowmaps_texture.bin | Bin 0 -> 279 bytes .../glsl/vs_shadowmaps_texture_lightning.bin | Bin 0 -> 608 bytes .../glsl/vs_shadowmaps_unpackdepth.bin | Bin 0 -> 279 bytes .../shaders/glsl/vs_shadowmaps_vblur.bin | Bin 0 -> 1317 bytes premake/premake4.lua | 33 +- 133 files changed, 22734 insertions(+), 16 deletions(-) create mode 100644 examples/15-shadowmaps-simple/fs_smsimple_draw.sc create mode 100644 examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc create mode 100644 examples/15-shadowmaps-simple/hollowcube.obj create mode 100644 examples/15-shadowmaps-simple/makefile create mode 100644 examples/15-shadowmaps-simple/shadowmaps_simple.cpp create mode 100644 examples/15-shadowmaps-simple/varying.def.sc create mode 100644 examples/15-shadowmaps-simple/vs_smsimple_draw.sc create mode 100644 examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc create mode 100644 examples/16-shadowmaps/common.sh create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_black.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_color_texture.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_hblur.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_packdepth.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_texture.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_vblur.sc create mode 100644 examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc create mode 100644 examples/16-shadowmaps/hollowcube.obj create mode 100644 examples/16-shadowmaps/makefile create mode 100644 examples/16-shadowmaps/shadowmaps.cpp create mode 100644 examples/16-shadowmaps/tree.obj create mode 100644 examples/16-shadowmaps/varying.def.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_color_texture.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_depth.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_hblur.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_packdepth.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_texture.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc create mode 100644 examples/16-shadowmaps/vs_shadowmaps_vblur.sc create mode 100644 examples/runtime/meshes/hollowcube.bin create mode 100644 examples/runtime/meshes/tree.bin create mode 100644 examples/runtime/meshes/tricube.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_black.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pfc.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_depth.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_hblur_vsm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm_linear.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth_vsm.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/glsl/fs_shadowmaps_vblur_vsm.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_csm.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_csm.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_omni.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_omni.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_depth.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/glsl/vs_shadowmaps_vblur.bin diff --git a/examples/15-shadowmaps-simple/fs_smsimple_draw.sc b/examples/15-shadowmaps-simple/fs_smsimple_draw.sc new file mode 100644 index 000000000..176030b30 --- /dev/null +++ b/examples/15-shadowmaps-simple/fs_smsimple_draw.sc @@ -0,0 +1,96 @@ +$input v_view, v_normal, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_lightPos; +SAMPLER2D(u_shadowMap, 4); + +vec2 lit(vec3 _ld, vec3 _n, vec3 _vd, float _exp) +{ + //diff + float ndotl = dot(_n, _ld); + + //spec + vec3 r = 2.0*ndotl*_n - _ld; //reflect(_ld, _n); + float rdotv = dot(r, _vd); + float spec = step(0.0, ndotl) * pow(max(0.0, rdotv), _exp) * (2.0 + _exp)/8.0; + + return max(vec2(ndotl, spec), 0.0); +} + +float hardShadow(sampler2D _sampler, vec4 _shadowCoord, float _bias) +{ + vec2 texCoord = _shadowCoord.xy/_shadowCoord.w; + + bool outside = any(greaterThan(texCoord, vec2_splat(1.0))) + || any(lessThan (texCoord, vec2_splat(0.0))) + ; + + if (outside) + { + return 1.0; + } + + float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w; + float occluder = unpackRgbaToFloat(texture2D(_sampler, texCoord) ); + + float visibility = step(receiver, occluder); + return visibility; +} + +float PCF(sampler2D _sampler, vec4 _shadowCoord, float _bias, vec2 _texelSize) +{ + float result = 0.0; + vec2 offset = _texelSize * _shadowCoord.w; + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), _bias); + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), _bias); + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), _bias); + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), _bias); + + return result / 16.0; +} + +void main() +{ + const float shadowMapBias = 0.005; + const vec3 color = vec3_splat(1.0); + + vec3 v = v_view; + vec3 vd = -normalize(v); + vec3 n = v_normal; + vec3 l = u_lightPos.xyz; + vec3 ld = -normalize(l); + + vec2 lc = lit(ld, n, vd, 1.0); + + vec2 texelSize = vec2_splat(1.0/512.0); + float visibility = PCF(u_shadowMap, v_shadowcoord, shadowMapBias, texelSize); + + vec3 ambient = 0.1 * color; + vec3 brdf = (lc.x + lc.y) * color * visibility; + + vec3 final = toGamma(abs(ambient + brdf) ); + gl_FragColor.xyz = final; + gl_FragColor.w = 1.0; +} diff --git a/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc b/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc new file mode 100644 index 000000000..b77d2972e --- /dev/null +++ b/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc @@ -0,0 +1,15 @@ +$input v_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + float depth = v_position.z/v_position.w * 0.5 + 0.5; + gl_FragColor = packFloatToRgba(depth); +} + diff --git a/examples/15-shadowmaps-simple/hollowcube.obj b/examples/15-shadowmaps-simple/hollowcube.obj new file mode 100644 index 000000000..2980086ba --- /dev/null +++ b/examples/15-shadowmaps-simple/hollowcube.obj @@ -0,0 +1,934 @@ +# Blender v2.66 (sub 1) OBJ File: '' +# www.blender.org +g holeycube +v 1.500000 1.211657 0.000000 +v 1.500000 1.211656 1.209338 +v 1.236416 1.211656 1.209338 +v 1.236416 1.211657 0.000000 +v 1.500000 1.500000 0.000000 +v 1.500000 1.500000 1.209338 +v 1.236416 1.500000 1.209338 +v 1.236416 1.500000 0.000000 +v 1.500000 -0.000000 1.209337 +v 1.500000 -1.211657 1.209337 +v 1.236416 -1.211657 1.209337 +v 1.236416 -0.000000 1.209337 +v 1.236416 -0.000000 1.500000 +v 1.236416 -1.211657 1.500000 +v 1.500000 -1.211657 1.500000 +v 1.500000 -0.000000 1.500000 +v 1.500000 0.000000 -1.500000 +v 1.500000 -1.211656 -1.500000 +v 1.236416 -1.211656 -1.500000 +v 1.236416 0.000000 -1.500000 +v -1.236416 0.000000 -1.500000 +v -1.236416 -1.211656 -1.500000 +v -1.500000 -1.211656 -1.500000 +v -1.500000 0.000000 -1.500000 +v -1.500000 -0.000000 1.500000 +v -1.500000 -1.211657 1.500000 +v -1.236416 -1.211657 1.500000 +v -1.236416 -0.000000 1.500000 +v -1.236416 -0.000000 1.209337 +v -1.236416 -1.211657 1.209337 +v -1.500000 -1.211657 1.209337 +v -1.500000 -0.000000 1.209337 +v -1.500000 1.211656 1.500000 +v -1.500000 1.211656 1.209338 +v -1.236416 1.211656 1.209338 +v -1.236416 1.211656 1.500000 +v -1.500000 1.211657 -1.500000 +v -1.236416 1.211657 -1.500000 +v 1.236416 1.211657 -1.500000 +v 1.500000 1.211657 -1.500000 +v 1.500000 1.211656 1.500000 +v 1.236416 1.211656 1.500000 +v 0.000000 -1.500000 1.209337 +v -1.236416 -1.500000 1.209337 +v 0.000000 -1.211657 1.209337 +v 0.000000 1.211656 1.209338 +v -1.236416 1.500000 1.209338 +v 0.000000 1.500000 1.209338 +v -1.236416 1.500000 1.500000 +v 0.000000 1.500000 1.500000 +v 0.000000 1.211656 1.500000 +v 1.236416 1.500000 1.500000 +v -1.500000 1.500000 1.500000 +v 1.500000 1.500000 1.500000 +v 0.000000 -1.500000 -1.500000 +v -1.236416 -1.500000 -1.500000 +v 0.000000 -1.211656 -1.500000 +v 0.000000 -1.500000 -1.209338 +v -1.236416 -1.500000 -1.209338 +v 1.236416 -1.211657 -0.000000 +v 1.236416 -1.211656 -1.209338 +v 1.236416 -1.500000 -1.209338 +v 1.236416 -1.500000 -0.000000 +v 1.500000 -1.500000 -0.000000 +v 1.500000 -1.500000 -1.209338 +v 1.500000 -1.211656 -1.209338 +v 1.500000 -1.211657 -0.000000 +v 1.500000 -1.500000 1.209337 +v 1.236416 -1.500000 1.209337 +v -1.236416 -1.500000 -0.000000 +v -1.500000 -1.500000 1.209337 +v -1.500000 -1.500000 -0.000000 +v -1.500000 -1.500000 -1.209338 +v -1.236416 -1.211657 -0.000000 +v -1.236416 -1.211656 -1.209338 +v -1.500000 -1.211656 -1.209338 +v -1.500000 -1.211657 -0.000000 +v -1.500000 1.211657 0.000000 +v -1.500000 1.211657 -1.209337 +v -1.236416 1.211657 -1.209337 +v -1.236416 1.211657 0.000000 +v -1.236416 1.500000 0.000000 +v -1.236416 1.500000 -1.209337 +v -1.500000 1.500000 -1.209337 +v -1.500000 1.500000 0.000000 +v -1.500000 1.500000 1.209338 +v 1.500000 1.500000 -1.209337 +v 1.236416 1.500000 -1.209337 +v 1.236416 1.211657 -1.209337 +v 1.500000 1.211657 -1.209337 +v 1.236416 0.000000 -1.209337 +v 1.500000 0.000000 -1.209337 +v -1.500000 0.000000 -1.209337 +v -1.236416 0.000000 -1.209337 +v 0.000000 -1.211656 -1.209338 +v 0.000000 1.211657 -1.209337 +v 0.000000 1.211657 -1.500000 +v 0.000000 1.500000 -1.209337 +v 0.000000 1.500000 -1.500000 +v -1.236416 1.500000 -1.500000 +v 1.236416 1.500000 -1.500000 +v -1.500000 1.500000 -1.500000 +v 1.500000 1.500000 -1.500000 +v -1.500000 -1.500000 1.500000 +v -1.236416 -1.500000 1.500000 +v 0.000000 -1.211657 1.500000 +v -1.500000 -1.500000 -1.500000 +v 0.000000 -1.500000 1.500000 +v 1.236416 -1.500000 1.500000 +v 1.500000 -1.500000 1.500000 +v 1.236416 -1.500000 -1.500000 +v 1.500000 -1.500000 -1.500000 +v 1.500000 1.500000 0.000000 +v 1.500000 1.500000 1.209338 +v 1.236416 1.500000 1.209338 +v 1.236416 1.500000 0.000000 +v -1.236416 1.500000 1.209338 +v 0.000000 1.500000 1.209338 +v -1.236416 1.500000 1.500000 +v 0.000000 1.500000 1.500000 +v 1.236416 1.500000 1.500000 +v -1.500000 1.500000 1.500000 +v 1.500000 1.500000 1.500000 +v -1.236416 1.500000 0.000000 +v -1.236416 1.500000 -1.209337 +v -1.500000 1.500000 -1.209337 +v -1.500000 1.500000 0.000000 +v -1.500000 1.500000 1.209338 +v 1.500000 1.500000 -1.209337 +v 1.236416 1.500000 -1.209337 +v 0.000000 1.500000 -1.209337 +v 0.000000 1.500000 -1.500000 +v -1.236416 1.500000 -1.500000 +v 1.236416 1.500000 -1.500000 +v -1.500000 1.500000 -1.500000 +v 1.500000 1.500000 -1.500000 +v 0.000000 -1.500000 1.209337 +v 0.000000 -1.211657 1.209337 +v 0.000000 -1.211657 1.500000 +v 0.000000 -1.500000 1.500000 +v 1.236416 -1.211657 1.209337 +v -1.236416 -1.211657 1.209337 +v 0.000000 -1.211657 1.209337 +vn 0.000000 -1.000000 -0.000001 +vn 1.000000 0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000001 -1.000000 +vn 0.000000 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000001 +vn 0.000000 -0.000001 1.000000 +vn 0.000000 1.000000 0.000000 +s off +f 1//1 2//1 3//1 4//1 +f 2//2 1//2 5//2 6//2 +f 4//3 3//3 7//3 8//3 +f 9//4 10//4 11//4 12//4 +f 13//5 14//5 15//5 16//5 +f 17//4 18//4 19//4 20//4 +f 21//4 22//4 23//4 24//4 +f 25//5 26//5 27//5 28//5 +f 29//4 30//4 31//4 32//4 +f 32//3 31//3 26//3 25//3 +f 25//3 33//3 34//3 32//3 +f 32//6 34//6 35//6 29//6 +f 28//5 36//5 33//5 25//5 +f 24//4 37//4 38//4 21//4 +f 20//4 39//4 40//4 17//4 +f 16//5 41//5 42//5 13//5 +f 12//6 3//6 2//6 9//6 +f 9//2 2//2 41//2 16//2 +f 13//3 42//3 3//3 12//3 +f 43//4 44//4 30//4 45//4 +f 46//4 35//4 47//4 48//4 +f 99//7 100//7 133//7 132//7 +f 50//5 49//5 36//5 51//5 +f 51//5 42//5 52//5 50//5 +f 100//7 102//7 135//7 133//7 +f 48//4 7//4 3//4 46//4 +f 46//8 3//8 42//8 51//8 +f 49//5 53//5 33//5 36//5 +f 42//5 41//5 54//5 52//5 +f 86//7 53//7 122//7 128//7 +f 41//2 2//2 6//2 54//2 +f 55//4 56//4 22//4 57//4 +f 58//8 59//8 56//8 55//8 +f 60//3 61//3 62//3 63//3 +f 64//2 65//2 66//2 67//2 +f 67//9 66//9 61//9 60//9 +f 63//8 62//8 65//8 64//8 +f 64//8 68//8 69//8 63//8 +f 70//8 44//8 71//8 72//8 +f 72//8 73//8 59//8 70//8 +f 74//9 75//9 76//9 77//9 +f 78//8 79//8 80//8 81//8 +f 5//7 87//7 129//7 113//7 +f 54//7 6//7 114//7 123//7 +f 48//7 47//7 117//7 118//7 +f 87//7 103//7 136//7 129//7 +f 90//8 1//8 4//8 89//8 +f 1//2 90//2 87//2 5//2 +f 8//3 88//3 89//3 4//3 +f 20//3 19//3 61//3 91//3 +f 92//2 66//2 18//2 17//2 +f 91//10 61//10 66//10 92//10 +f 93//10 76//10 75//10 94//10 +f 24//3 23//3 76//3 93//3 +f 94//2 75//2 22//2 21//2 +f 21//2 38//2 80//2 94//2 +f 57//11 22//11 75//11 95//11 +f 96//8 80//8 38//8 97//8 +f 93//3 79//3 37//3 24//3 +f 94//5 80//5 79//5 93//5 +f 92//5 90//5 89//5 91//5 +f 17//2 40//2 90//2 92//2 +f 91//3 89//3 39//3 20//3 +f 95//5 75//5 59//5 58//5 +f 98//5 83//5 80//5 96//5 +f 103//7 101//7 134//7 136//7 +f 97//4 38//4 100//4 99//4 +f 99//4 101//4 39//4 97//4 +f 6//7 5//7 113//7 114//7 +f 96//5 89//5 88//5 98//5 +f 97//8 39//8 89//8 96//8 +f 38//4 37//4 102//4 100//4 +f 101//4 103//4 40//4 39//4 +f 7//7 48//7 118//7 115//7 +f 103//2 87//2 90//2 40//2 +f 26//3 31//3 71//3 104//3 +f 71//8 44//8 105//8 104//8 +f 28//2 27//2 30//2 29//2 +f 29//2 35//2 36//2 28//2 +f 74//2 30//2 44//2 70//2 +f 72//3 71//3 31//3 77//3 +f 77//11 31//11 30//11 74//11 +f 81//1 35//1 34//1 78//1 +f 78//3 34//3 86//3 85//3 +f 82//2 47//2 35//2 81//2 +f 45//11 30//11 27//11 106//11 +f 51//8 36//8 35//8 46//8 +f 102//7 84//7 126//7 135//7 +f 53//3 86//3 34//3 33//3 +f 107//3 73//3 76//3 23//3 +f 107//8 56//8 59//8 73//8 +f 70//2 59//2 75//2 74//2 +f 77//3 76//3 73//3 72//3 +f 85//3 84//3 79//3 78//3 +f 81//2 80//2 83//2 82//2 +f 88//7 8//7 116//7 130//7 +f 37//3 79//3 84//3 102//3 +f 60//11 11//11 10//11 67//11 +f 67//2 10//2 68//2 64//2 +f 63//3 69//3 11//3 60//3 +f 16//2 15//2 10//2 9//2 +f 12//3 11//3 14//3 13//3 +f 108//8 105//8 44//8 43//8 +f 106//5 27//5 105//5 108//5 +f 108//5 109//5 14//5 106//5 +f 43//8 69//8 109//8 108//8 +f 45//4 11//4 69//4 43//4 +f 106//11 14//11 11//11 45//11 +f 27//5 26//5 104//5 105//5 +f 109//5 110//5 15//5 14//5 +f 110//8 109//8 69//8 68//8 +f 110//2 68//2 10//2 15//2 +f 57//4 19//4 111//4 55//4 +f 55//8 111//8 62//8 58//8 +f 58//5 62//5 61//5 95//5 +f 95//11 61//11 19//11 57//11 +f 56//4 107//4 23//4 22//4 +f 19//4 18//4 112//4 111//4 +f 65//8 62//8 111//8 112//8 +f 18//2 66//2 65//2 112//2 +f 118//11 117//11 119//11 120//11 +f 120//11 121//11 115//11 118//11 +f 114//11 115//11 121//11 123//11 +f 124//11 125//11 126//11 127//11 +f 127//11 128//11 117//11 124//11 +f 116//11 115//11 114//11 113//11 +f 113//11 129//11 130//11 116//11 +f 132//11 133//11 125//11 131//11 +f 131//11 130//11 134//11 132//11 +f 136//11 134//11 130//11 129//11 +f 122//11 119//11 117//11 128//11 +f 126//11 125//11 133//11 135//11 +f 82//7 83//7 125//7 124//7 +f 49//7 50//7 120//7 119//7 +f 84//7 85//7 127//7 126//7 +f 50//7 52//7 121//7 120//7 +f 52//7 54//7 123//7 121//7 +f 53//7 49//7 119//7 122//7 +f 8//7 7//7 115//7 116//7 +f 85//7 86//7 128//7 127//7 +f 83//7 98//7 131//7 125//7 +f 47//7 82//7 124//7 117//7 +f 101//7 99//7 132//7 134//7 +f 98//7 88//7 130//7 131//7 +f 108//7 106//7 139//7 140//7 +f 45//7 43//7 137//7 138//7 +f 106//7 45//7 138//7 139//7 +f 43//7 108//7 140//7 137//7 +f 30//7 45//7 143//7 142//7 +f 45//7 11//7 141//7 143//7 +g holeycube.001 +v 0.037848 0.053616 0.680965 +v 0.414385 -0.152030 0.676229 +v 0.382376 -0.209100 0.609416 +v 0.005839 -0.003453 0.614153 +v 0.003506 -0.010911 0.752536 +v 0.380043 -0.216558 0.747800 +v 0.348034 -0.273628 0.680987 +v -0.028503 -0.067981 0.685724 +v 0.558694 0.119124 0.375479 +v 0.703003 0.390278 0.074730 +v 0.670994 0.333208 0.007917 +v 0.526685 0.062054 0.308667 +v 0.617185 0.012627 0.307529 +v 0.761494 0.283781 0.006779 +v 0.793503 0.340851 0.073591 +v 0.649194 0.069697 0.374341 +v -0.284880 0.579845 0.386090 +v -0.140571 0.850998 0.085340 +v -0.172580 0.793929 0.018528 +v -0.316889 0.522775 0.319277 +v -0.617185 -0.012627 -0.307529 +v -0.472876 0.258527 -0.608278 +v -0.504885 0.201457 -0.675091 +v -0.649194 -0.069697 -0.374341 +v 0.284880 -0.579845 -0.386090 +v 0.429189 -0.308690 -0.686840 +v 0.461198 -0.251621 -0.620027 +v 0.316889 -0.522775 -0.319277 +v 0.226389 -0.473348 -0.318139 +v 0.370698 -0.202194 -0.618889 +v 0.338689 -0.259263 -0.685701 +v 0.194380 -0.530418 -0.384952 +v 0.140571 -0.850998 -0.085340 +v 0.050071 -0.801571 -0.084202 +v 0.082080 -0.744502 -0.017389 +v 0.172580 -0.793929 -0.018528 +v -0.793503 -0.340851 -0.073591 +v -0.761494 -0.283781 -0.006779 +v -0.461198 0.251621 0.620027 +v -0.429189 0.308690 0.686840 +v 0.504885 -0.201457 0.675091 +v 0.472876 -0.258527 0.608278 +v 0.555187 0.130035 -0.377057 +v 0.405040 -0.137666 -0.690460 +v 0.520846 0.065507 -0.305486 +v 0.232228 -0.476801 0.296014 +v 0.047738 -0.809030 0.054181 +v 0.197886 -0.541329 0.367584 +v 0.138238 -0.858457 0.053043 +v 0.288386 -0.590756 0.366446 +v 0.322728 -0.526228 0.294875 +v 0.438534 -0.323055 0.679849 +v 0.106229 -0.915526 -0.013769 +v 0.470543 -0.265985 0.746662 +v -0.288386 0.590756 -0.366446 +v -0.438534 0.323055 -0.679849 +v -0.322728 0.526228 -0.294875 +v -0.197886 0.541329 -0.367584 +v -0.348034 0.273628 -0.680987 +v 0.294457 0.538855 0.012653 +v -0.082080 0.744502 0.017389 +v -0.047738 0.809030 -0.054181 +v 0.328799 0.603383 -0.058918 +v 0.360808 0.660452 0.007895 +v -0.015729 0.866099 0.012631 +v -0.050071 0.801571 0.084202 +v 0.326466 0.595925 0.079466 +v 0.737345 0.454805 0.003159 +v 0.705335 0.397736 -0.063654 +v 0.028503 0.067981 -0.685724 +v 0.373030 -0.194736 -0.757272 +v -0.003506 0.010911 -0.752536 +v -0.380043 0.216558 -0.747800 +v -0.005839 0.003453 -0.614153 +v -0.382376 0.209100 -0.609416 +v -0.414385 0.152030 -0.676229 +v -0.037848 -0.053616 -0.680965 +v -0.326466 -0.595925 -0.079466 +v -0.703003 -0.390278 -0.074730 +v -0.670994 -0.333208 -0.007917 +v -0.294457 -0.538855 -0.012653 +v -0.328799 -0.603383 0.058918 +v -0.705335 -0.397736 0.063654 +v -0.737345 -0.454805 -0.003159 +v -0.360808 -0.660452 -0.007895 +v 0.015729 -0.866099 -0.012631 +v -0.373030 0.194736 0.757272 +v -0.405040 0.137666 0.690460 +v -0.370698 0.202194 0.618889 +v -0.338689 0.259263 0.685701 +v -0.226389 0.473348 0.318139 +v -0.194380 0.530418 0.384952 +v -0.558694 -0.119124 -0.375479 +v -0.526685 -0.062054 -0.308667 +v -0.232228 0.476801 -0.296014 +v -0.520846 -0.065507 0.305486 +v -0.611346 -0.016080 0.306624 +v -0.555187 -0.130035 0.377057 +v -0.645688 -0.080608 0.378195 +v -0.795836 -0.348309 0.064792 +v -0.495540 0.187093 0.691598 +v -0.827845 -0.405378 -0.002021 +v -0.463531 0.244163 0.758410 +v 0.463531 -0.244163 -0.758410 +v 0.495540 -0.187093 -0.691598 +v 0.611346 0.016080 -0.306624 +v -0.470543 0.265985 -0.746662 +v 0.645688 0.080608 -0.378195 +v 0.795836 0.348309 -0.064792 +v 0.827845 0.405378 0.002021 +v -0.138238 0.858457 -0.053043 +v -0.106229 0.915526 0.013769 +v 0.003506 -0.010911 0.752536 +v 0.380043 -0.216558 0.747800 +v 0.348034 -0.273628 0.680987 +v -0.028503 -0.067981 0.685724 +v 0.047738 -0.809030 0.054181 +v 0.197886 -0.541329 0.367584 +v 0.138238 -0.858457 0.053043 +v 0.288386 -0.590756 0.366446 +v 0.438534 -0.323055 0.679849 +v 0.106229 -0.915526 -0.013769 +v 0.470543 -0.265985 0.746662 +v -0.328799 -0.603383 0.058918 +v -0.705335 -0.397736 0.063654 +v -0.737345 -0.454805 -0.003159 +v -0.360808 -0.660452 -0.007895 +v 0.015729 -0.866099 -0.012631 +v -0.373030 0.194736 0.757272 +v -0.405040 0.137666 0.690460 +v -0.555187 -0.130035 0.377057 +v -0.645688 -0.080608 0.378195 +v -0.795836 -0.348309 0.064792 +v -0.495540 0.187093 0.691598 +v -0.827845 -0.405378 -0.002021 +v -0.463531 0.244163 0.758410 +v 0.555187 0.130035 -0.377057 +v 0.520846 0.065507 -0.305486 +v 0.611346 0.016080 -0.306624 +v 0.645688 0.080608 -0.378195 +v 0.670994 0.333208 0.007917 +v 0.370698 -0.202194 -0.618889 +v 0.520846 0.065507 -0.305486 +vn 0.335692 0.630762 -0.699607 +vn 0.342281 0.610259 0.714442 +vn -0.342282 -0.610259 -0.714442 +vn -0.877584 0.479296 0.011038 +vn 0.877584 -0.479296 -0.011038 +vn -0.877584 0.479295 0.011038 +vn -0.342281 -0.610259 -0.714442 +vn -0.877584 0.479295 0.011039 +vn 0.877584 -0.479295 -0.011038 +vn 0.335693 0.630761 -0.699607 +vn -0.335692 -0.630762 0.699607 +vn 0.342282 0.610259 0.714442 +vn 0.877584 -0.479295 -0.011039 +vn -0.335693 -0.630761 0.699607 +vn -0.877584 0.479296 0.011039 +vn 0.335693 0.630761 -0.699608 +vn 0.877584 -0.479296 -0.011039 +vn -0.335693 -0.630761 0.699608 +s off +f 144//12 145//12 146//12 147//12 +f 145//13 144//13 148//13 149//13 +f 147//14 146//14 150//14 151//14 +f 152//15 153//15 154//15 155//15 +f 156//16 157//16 158//16 159//16 +f 160//15 161//15 162//15 163//15 +f 164//17 165//17 166//17 167//17 +f 168//16 169//16 170//16 171//16 +f 172//15 173//15 174//15 175//15 +f 175//18 174//18 169//18 168//18 +f 168//14 176//14 177//14 175//14 +f 175//19 177//19 178//19 172//19 +f 171//16 179//16 176//16 168//16 +f 167//15 180//15 181//15 164//15 +f 163//15 182//15 183//15 160//15 +f 159//20 184//20 185//20 156//20 +f 155//19 146//19 145//19 152//19 +f 152//13 145//13 184//13 159//13 +f 156//18 185//18 146//18 155//18 +f 186//15 187//15 173//15 188//15 +f 189//15 178//15 190//15 191//15 +f 242//7 243//7 276//7 275//7 +f 193//16 192//16 179//16 194//16 +f 194//16 185//16 195//16 193//16 +f 243//7 245//7 278//7 276//7 +f 191//15 150//15 146//15 189//15 +f 189//21 146//21 185//21 194//21 +f 192//16 196//16 176//16 179//16 +f 185//16 184//16 197//16 195//16 +f 229//7 196//7 265//7 271//7 +f 184//13 145//13 149//13 197//13 +f 198//15 199//15 165//15 200//15 +f 201//21 202//21 199//21 198//21 +f 203//18 204//18 205//18 206//18 +f 207//13 208//13 209//13 210//13 +f 210//22 209//22 204//22 203//22 +f 206//21 205//21 208//21 207//21 +f 207//21 211//21 212//21 206//21 +f 213//21 187//21 214//21 215//21 +f 215//21 216//21 202//21 213//21 +f 217//22 218//22 219//22 220//22 +f 221//21 222//21 223//21 224//21 +f 148//7 230//7 272//7 256//7 +f 197//7 149//7 257//7 266//7 +f 191//7 190//7 260//7 261//7 +f 230//7 246//7 279//7 272//7 +f 233//21 144//21 147//21 232//21 +f 144//13 233//13 230//13 148//13 +f 151//14 231//14 232//14 147//14 +f 163//18 162//18 204//18 234//18 +f 235//23 209//23 161//23 160//23 +f 234//24 204//24 209//24 235//24 +f 236//24 219//24 218//24 237//24 +f 167//18 166//18 219//18 236//18 +f 237//13 218//13 165//13 164//13 +f 164//13 181//13 223//13 237//13 +f 200//25 165//25 218//25 238//25 +f 239//21 223//21 181//21 240//21 +f 236//14 222//14 180//14 167//14 +f 237//16 223//16 222//16 236//16 +f 235//16 233//16 232//16 234//16 +f 160//13 183//13 233//13 235//13 +f 234//18 232//18 182//18 163//18 +f 238//16 218//16 202//16 201//16 +f 241//16 226//16 223//16 239//16 +f 246//7 244//7 277//7 279//7 +f 240//15 181//15 243//15 242//15 +f 242//15 244//15 182//15 240//15 +f 149//7 148//7 256//7 257//7 +f 239//16 232//16 231//16 241//16 +f 240//21 182//21 232//21 239//21 +f 181//26 180//26 245//26 243//26 +f 244//15 246//15 183//15 182//15 +f 150//7 191//7 261//7 258//7 +f 246//13 230//13 233//13 183//13 +f 169//18 174//18 214//18 247//18 +f 214//21 187//21 248//21 247//21 +f 171//13 170//13 173//13 172//13 +f 172//13 178//13 179//13 171//13 +f 217//23 173//23 187//23 213//23 +f 215//18 214//18 174//18 220//18 +f 220//25 174//25 173//25 217//25 +f 224//12 178//12 177//12 221//12 +f 221//18 177//18 229//18 228//18 +f 225//13 190//13 178//13 224//13 +f 188//25 173//25 170//25 249//25 +f 194//21 179//21 178//21 189//21 +f 245//7 227//7 269//7 278//7 +f 196//14 229//14 177//14 176//14 +f 250//18 216//18 219//18 166//18 +f 250//27 199//27 202//27 216//27 +f 213//23 202//23 218//23 217//23 +f 220//18 219//18 216//18 215//18 +f 228//18 227//18 222//18 221//18 +f 224//13 223//13 226//13 225//13 +f 231//7 151//7 259//7 273//7 +f 180//14 222//14 227//14 245//14 +f 203//25 154//25 153//25 210//25 +f 210//13 153//13 211//13 207//13 +f 206//18 212//18 154//18 203//18 +f 159//23 158//23 153//23 152//23 +f 155//18 154//18 157//18 156//18 +f 251//21 248//21 187//21 186//21 +f 249//16 170//16 248//16 251//16 +f 251//16 252//16 157//16 249//16 +f 186//21 212//21 252//21 251//21 +f 188//15 154//15 212//15 186//15 +f 249//25 157//25 154//25 188//25 +f 170//16 169//16 247//16 248//16 +f 252//28 253//28 158//28 157//28 +f 253//21 252//21 212//21 211//21 +f 253//23 211//23 153//23 158//23 +f 200//15 162//15 254//15 198//15 +f 198//21 254//21 205//21 201//21 +f 201//16 205//16 204//16 238//16 +f 238//25 204//25 162//25 200//25 +f 199//15 250//15 166//15 165//15 +f 162//15 161//15 255//15 254//15 +f 208//21 205//21 254//21 255//21 +f 161//23 209//23 208//23 255//23 +f 261//25 260//25 262//25 263//25 +f 263//25 264//25 258//25 261//25 +f 257//29 258//29 264//29 266//29 +f 267//25 268//25 269//25 270//25 +f 270//25 271//25 260//25 267//25 +f 259//25 258//25 257//25 256//25 +f 256//25 272//25 273//25 259//25 +f 275//25 276//25 268//25 274//25 +f 274//25 273//25 277//25 275//25 +f 279//25 277//25 273//25 272//25 +f 265//25 262//25 260//25 271//25 +f 269//25 268//25 276//25 278//25 +f 225//7 226//7 268//7 267//7 +f 192//7 193//7 263//7 262//7 +f 227//7 228//7 270//7 269//7 +f 193//7 195//7 264//7 263//7 +f 195//7 197//7 266//7 264//7 +f 196//7 192//7 262//7 265//7 +f 151//7 150//7 258//7 259//7 +f 228//7 229//7 271//7 270//7 +f 226//7 241//7 274//7 268//7 +f 190//7 225//7 267//7 260//7 +f 244//7 242//7 275//7 277//7 +f 241//7 231//7 273//7 274//7 +f 251//7 249//7 282//7 283//7 +f 188//7 186//7 280//7 281//7 +f 249//7 188//7 281//7 282//7 +f 186//7 251//7 283//7 280//7 +f 173//7 188//7 286//7 285//7 +f 188//7 154//7 284//7 286//7 +g holeycube.002 +v 0.369385 2.003562 1.792544 +v 0.963329 0.880686 2.925211 +v 0.707927 0.635014 2.815589 +v 0.113983 1.757890 1.682922 +v 0.111409 2.147654 2.070667 +v 0.705351 1.024778 3.203335 +v 0.449950 0.779106 3.093713 +v -0.143993 1.901982 1.961045 +v 2.047380 0.275193 1.756502 +v 3.131433 -0.330301 0.587792 +v 2.876031 -0.575973 0.478171 +v 1.791978 0.029521 1.646880 +v 1.934732 -0.240361 1.919116 +v 3.018785 -0.845855 0.750406 +v 3.274187 -0.600183 0.860028 +v 2.190134 0.005311 2.028738 +v 0.716742 2.790825 -0.781068 +v 1.800794 2.185331 -1.949777 +v 1.545392 1.939659 -2.059399 +v 0.461340 2.545153 -0.890690 +v -1.934732 0.240361 -1.919116 +v -0.850680 -0.365133 -3.087824 +v -1.106082 -0.610805 -3.197446 +v -2.190134 -0.005311 -2.028738 +v -0.716742 -2.790825 0.781068 +v 0.367311 -3.396319 -0.387641 +v 0.622713 -3.150647 -0.278019 +v -0.461340 -2.545153 0.890690 +v -0.604093 -2.275271 0.618455 +v 0.479959 -2.880765 -0.550255 +v 0.224557 -3.126437 -0.659877 +v -0.859495 -2.520943 0.508833 +v -1.800794 -2.185331 1.949777 +v -1.943547 -1.915450 1.677542 +v -1.688145 -1.669778 1.787164 +v -1.545392 -1.939659 2.059399 +v -3.274187 0.600183 -0.860028 +v -3.018785 0.845855 -0.750406 +v -0.622713 3.150647 0.278019 +v -0.367311 3.396319 0.387641 +v 1.106082 0.610805 3.197446 +v 0.850680 0.365133 3.087824 +v 1.935972 -1.872461 -0.314165 +v 0.737936 -3.024857 -0.828377 +v 1.677995 -1.728369 -0.036042 +v -0.490109 -0.517382 2.301377 +v -1.946122 -1.525685 2.065288 +v -0.748086 -0.373290 2.579500 +v -1.803369 -1.795566 2.337522 +v -0.605333 -0.643171 2.851735 +v -0.347356 -0.787263 2.573611 +v 0.592703 0.509225 3.365948 +v -2.058771 -2.041239 2.227901 +v 0.848105 0.754897 3.475569 +v 0.605333 0.643171 -2.851735 +v -0.592703 -0.509225 -3.365948 +v 0.347356 0.787263 -2.573611 +v 0.748086 0.373290 -2.579500 +v -0.449950 -0.779106 -3.093713 +v 2.282089 0.546902 -0.654497 +v 1.688145 1.669778 -1.787164 +v 1.946122 1.525685 -2.065288 +v 2.540065 0.402810 -0.932619 +v 2.795467 0.648482 -0.822998 +v 2.201524 1.771358 -1.955666 +v 1.943547 1.915450 -1.677542 +v 2.537491 0.792574 -0.544875 +v 3.389409 -0.474393 0.309670 +v 3.134007 -0.720065 0.200048 +v 0.143993 -1.901982 -1.961045 +v 0.482534 -3.270529 -0.937999 +v -0.111409 -2.147654 -2.070667 +v -0.705351 -1.024778 -3.203335 +v -0.113983 -1.757890 -1.682922 +v -0.707927 -0.635014 -2.815589 +v -0.963329 -0.880686 -2.925211 +v -0.369385 -2.003562 -1.792544 +v -2.537491 -0.792574 0.544875 +v -3.131433 0.330301 -0.587792 +v -2.876031 0.575973 -0.478171 +v -2.282089 -0.546902 0.654497 +v -2.540065 -0.402810 0.932619 +v -3.134007 0.720065 -0.200048 +v -3.389409 0.474393 -0.309670 +v -2.795467 -0.648482 0.822998 +v -2.201524 -1.771358 1.955666 +v -0.482534 3.270529 0.937999 +v -0.737936 3.024857 0.828377 +v -0.479959 2.880765 0.550255 +v -0.224557 3.126437 0.659877 +v 0.604093 2.275271 -0.618455 +v 0.859495 2.520943 -0.508833 +v -2.047380 -0.275193 -1.756502 +v -1.791978 -0.029521 -1.646880 +v 0.490109 0.517382 -2.301377 +v -1.677995 1.728369 0.036042 +v -1.820749 1.998251 -0.236193 +v -1.935972 1.872461 0.314165 +v -2.078725 2.142343 0.041929 +v -3.276761 0.989947 -0.472284 +v -0.880689 3.294739 0.556142 +v -3.532163 0.744275 -0.581905 +v -0.625287 3.540411 0.665764 +v 0.625287 -3.540411 -0.665764 +v 0.880689 -3.294739 -0.556142 +v 1.820749 -1.998251 0.236193 +v -0.848105 -0.754897 -3.475569 +v 2.078725 -2.142343 -0.041929 +v 3.276761 -0.989947 0.472284 +v 3.532163 -0.744275 0.581905 +v 1.803369 1.795566 -2.337522 +v 2.058771 2.041239 -2.227901 +v 0.111409 2.147654 2.070667 +v 0.705351 1.024778 3.203335 +v 0.449950 0.779106 3.093713 +v -0.143993 1.901982 1.961045 +v -1.946122 -1.525685 2.065288 +v -0.748086 -0.373290 2.579500 +v -1.803369 -1.795566 2.337522 +v -0.605333 -0.643171 2.851735 +v 0.592703 0.509225 3.365948 +v -2.058771 -2.041239 2.227901 +v 0.848105 0.754897 3.475569 +v -2.540065 -0.402810 0.932619 +v -3.134007 0.720065 -0.200048 +v -3.389409 0.474393 -0.309670 +v -2.795467 -0.648482 0.822998 +v -2.201524 -1.771358 1.955666 +v -0.482534 3.270529 0.937999 +v -0.737936 3.024857 0.828377 +v -1.935972 1.872461 0.314165 +v -2.078725 2.142343 0.041929 +v -3.276761 0.989947 -0.472284 +v -0.880689 3.294739 0.556142 +v -3.532163 0.744275 -0.581905 +v -0.625287 3.540411 0.665764 +v 1.935972 -1.872461 -0.314165 +v 1.677995 -1.728369 -0.036042 +v 1.820749 -1.998251 0.236193 +v 2.078725 -2.142343 -0.041929 +v 2.876031 -0.575973 0.478171 +v 0.479959 -2.880765 -0.550255 +v 1.677995 -1.728369 -0.036042 +vn 0.635737 -0.355088 -0.685384 +vn 0.688513 0.662283 0.295519 +vn -0.688513 -0.662283 -0.295518 +vn -0.348983 0.659767 -0.665521 +vn 0.348982 -0.659767 0.665521 +vn -0.348982 0.659767 -0.665521 +vn 0.348982 -0.659768 0.665521 +vn -0.688513 -0.662283 -0.295519 +vn 0.348983 -0.659767 0.665521 +vn -0.348982 0.659768 -0.665521 +vn 0.688513 0.662283 0.295518 +vn 0.635737 -0.355089 -0.685383 +vn -0.635737 0.355088 0.685384 +vn 0.688512 0.662283 0.295519 +vn -0.635737 0.355089 0.685383 +vn -0.688512 -0.662283 -0.295519 +vn 0.635737 -0.355089 -0.685384 +vn -0.635737 0.355089 0.685384 +s off +f 287//30 288//30 289//30 290//30 +f 288//31 287//31 291//31 292//31 +f 290//32 289//32 293//32 294//32 +f 295//33 296//33 297//33 298//33 +f 299//34 300//34 301//34 302//34 +f 303//33 304//33 305//33 306//33 +f 307//35 308//35 309//35 310//35 +f 311//36 312//36 313//36 314//36 +f 315//35 316//35 317//35 318//35 +f 318//37 317//37 312//37 311//37 +f 311//37 319//37 320//37 318//37 +f 318//33 320//33 321//33 315//33 +f 314//38 322//38 319//38 311//38 +f 310//35 323//35 324//35 307//35 +f 306//39 325//39 326//39 303//39 +f 302//34 327//34 328//34 299//34 +f 298//33 289//33 288//33 295//33 +f 295//40 288//40 327//40 302//40 +f 299//37 328//37 289//37 298//37 +f 329//33 330//33 316//33 331//33 +f 332//33 321//33 333//33 334//33 +f 385//7 386//7 419//7 418//7 +f 336//38 335//38 322//38 337//38 +f 337//38 328//38 338//38 336//38 +f 386//7 388//7 421//7 419//7 +f 334//33 293//33 289//33 332//33 +f 332//41 289//41 328//41 337//41 +f 335//38 339//38 319//38 322//38 +f 328//38 327//38 340//38 338//38 +f 372//7 339//7 408//7 414//7 +f 327//31 288//31 292//31 340//31 +f 341//33 342//33 308//33 343//33 +f 344//41 345//41 342//41 341//41 +f 346//32 347//32 348//32 349//32 +f 350//40 351//40 352//40 353//40 +f 353//42 352//42 347//42 346//42 +f 349//41 348//41 351//41 350//41 +f 350//41 354//41 355//41 349//41 +f 356//41 330//41 357//41 358//41 +f 358//41 359//41 345//41 356//41 +f 360//42 361//42 362//42 363//42 +f 364//41 365//41 366//41 367//41 +f 291//7 373//7 415//7 399//7 +f 340//7 292//7 400//7 409//7 +f 334//7 333//7 403//7 404//7 +f 373//7 389//7 422//7 415//7 +f 376//41 287//41 290//41 375//41 +f 287//43 376//43 373//43 291//43 +f 294//37 374//37 375//37 290//37 +f 306//37 305//37 347//37 377//37 +f 378//31 352//31 304//31 303//31 +f 377//38 347//38 352//38 378//38 +f 379//38 362//38 361//38 380//38 +f 310//32 309//32 362//32 379//32 +f 380//31 361//31 308//31 307//31 +f 307//31 324//31 366//31 380//31 +f 343//44 308//44 361//44 381//44 +f 382//41 366//41 324//41 383//41 +f 379//32 365//32 323//32 310//32 +f 380//38 366//38 365//38 379//38 +f 378//34 376//34 375//34 377//34 +f 303//31 326//31 376//31 378//31 +f 377//37 375//37 325//37 306//37 +f 381//38 361//38 345//38 344//38 +f 384//38 369//38 366//38 382//38 +f 389//7 387//7 420//7 422//7 +f 383//33 324//33 386//33 385//33 +f 385//33 387//33 325//33 383//33 +f 292//7 291//7 399//7 400//7 +f 382//38 375//38 374//38 384//38 +f 383//41 325//41 375//41 382//41 +f 324//33 323//33 388//33 386//33 +f 387//35 389//35 326//35 325//35 +f 293//7 334//7 404//7 401//7 +f 389//43 373//43 376//43 326//43 +f 312//45 317//45 357//45 390//45 +f 357//46 330//46 391//46 390//46 +f 314//31 313//31 316//31 315//31 +f 315//31 321//31 322//31 314//31 +f 360//31 316//31 330//31 356//31 +f 358//45 357//45 317//45 363//45 +f 363//44 317//44 316//44 360//44 +f 367//30 321//30 320//30 364//30 +f 364//32 320//32 372//32 371//32 +f 368//40 333//40 321//40 367//40 +f 331//44 316//44 313//44 392//44 +f 337//46 322//46 321//46 332//46 +f 388//7 370//7 412//7 421//7 +f 339//32 372//32 320//32 319//32 +f 393//37 359//37 362//37 309//37 +f 393//41 342//41 345//41 359//41 +f 356//40 345//40 361//40 360//40 +f 363//37 362//37 359//37 358//37 +f 371//32 370//32 365//32 364//32 +f 367//40 366//40 369//40 368//40 +f 374//7 294//7 402//7 416//7 +f 323//32 365//32 370//32 388//32 +f 346//44 297//44 296//44 353//44 +f 353//40 296//40 354//40 350//40 +f 349//32 355//32 297//32 346//32 +f 302//40 301//40 296//40 295//40 +f 298//37 297//37 300//37 299//37 +f 394//41 391//41 330//41 329//41 +f 392//38 313//38 391//38 394//38 +f 394//38 395//38 300//38 392//38 +f 329//41 355//41 395//41 394//41 +f 331//33 297//33 355//33 329//33 +f 392//44 300//44 297//44 331//44 +f 313//34 312//34 390//34 391//34 +f 395//38 396//38 301//38 300//38 +f 396//41 395//41 355//41 354//41 +f 396//40 354//40 296//40 301//40 +f 343//33 305//33 397//33 341//33 +f 341//41 397//41 348//41 344//41 +f 344//38 348//38 347//38 381//38 +f 381//47 347//47 305//47 343//47 +f 342//33 393//33 309//33 308//33 +f 305//33 304//33 398//33 397//33 +f 351//41 348//41 397//41 398//41 +f 304//40 352//40 351//40 398//40 +f 404//44 403//44 405//44 406//44 +f 406//44 407//44 401//44 404//44 +f 400//44 401//44 407//44 409//44 +f 410//44 411//44 412//44 413//44 +f 413//44 414//44 403//44 410//44 +f 402//44 401//44 400//44 399//44 +f 399//44 415//44 416//44 402//44 +f 418//44 419//44 411//44 417//44 +f 417//44 416//44 420//44 418//44 +f 422//47 420//47 416//47 415//47 +f 408//44 405//44 403//44 414//44 +f 412//44 411//44 419//44 421//44 +f 368//7 369//7 411//7 410//7 +f 335//7 336//7 406//7 405//7 +f 370//7 371//7 413//7 412//7 +f 336//7 338//7 407//7 406//7 +f 338//7 340//7 409//7 407//7 +f 339//7 335//7 405//7 408//7 +f 294//7 293//7 401//7 402//7 +f 371//7 372//7 414//7 413//7 +f 369//7 384//7 417//7 411//7 +f 333//7 368//7 410//7 403//7 +f 387//7 385//7 418//7 420//7 +f 384//7 374//7 416//7 417//7 +f 394//7 392//7 425//7 426//7 +f 331//7 329//7 423//7 424//7 +f 392//7 331//7 424//7 425//7 +f 329//7 394//7 426//7 423//7 +f 316//7 331//7 429//7 428//7 +f 331//7 297//7 427//7 429//7 diff --git a/examples/15-shadowmaps-simple/makefile b/examples/15-shadowmaps-simple/makefile new file mode 100644 index 000000000..6525ae16a --- /dev/null +++ b/examples/15-shadowmaps-simple/makefile @@ -0,0 +1,22 @@ +# +# Copyright 2013 Dario Manesku. All rights reserved. +# License: http://www.opensource.org/licenses/BSD-2-Clause +# + +BGFX_DIR=../.. +RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build + +include $(BGFX_DIR)/premake/shader.mk + +geometry: ../runtime/meshes/column.bin + +../runtime/meshes/column.bin: column.obj + ../../tools/bin/geometryc -f column.obj -o ../runtime/meshes/column.bin --packnormal 1 + +rebuild: + @make -s --no-print-directory TARGET=0 clean all + @make -s --no-print-directory TARGET=1 clean all + @make -s --no-print-directory TARGET=2 clean all + @make -s --no-print-directory TARGET=3 clean all + @make -s --no-print-directory TARGET=4 clean all diff --git a/examples/15-shadowmaps-simple/shadowmaps_simple.cpp b/examples/15-shadowmaps-simple/shadowmaps_simple.cpp new file mode 100644 index 000000000..0a22c2d38 --- /dev/null +++ b/examples/15-shadowmaps-simple/shadowmaps_simple.cpp @@ -0,0 +1,670 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include +#include +#include + +#include "common.h" + +#include +#include +#include +#include "entry/entry.h" +#include "fpumath.h" + +#define RENDER_PASS_0 0 +#define RENDER_PASS_1 1 + +uint32_t packUint32(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) +{ + union + { + uint32_t ui32; + uint8_t arr[4]; + } un; + + un.arr[0] = _x; + un.arr[1] = _y; + un.arr[2] = _z; + un.arr[3] = _w; + + return un.ui32; +} + +uint32_t packF4u(float _x, float _y = 0.0f, float _z = 0.0f, float _w = 0.0f) +{ + const uint8_t xx = uint8_t(_x*127.0f + 128.0f); + const uint8_t yy = uint8_t(_y*127.0f + 128.0f); + const uint8_t zz = uint8_t(_z*127.0f + 128.0f); + const uint8_t ww = uint8_t(_w*127.0f + 128.0f); + return packUint32(xx, yy, zz, ww); +} + +struct PosNormalVertex +{ + float m_x; + float m_y; + float m_z; + uint32_t m_normal; +}; + +static const float s_texcoord = 5.0f; +static const uint32_t s_numHPlaneVertices = 4; +static PosNormalVertex s_hplaneVertices[s_numHPlaneVertices] = +{ + { -1.0f, 0.0f, 1.0f, packF4u(0.0f, 1.0f, 0.0f) }, + { 1.0f, 0.0f, 1.0f, packF4u(0.0f, 1.0f, 0.0f) }, + { -1.0f, 0.0f, -1.0f, packF4u(0.0f, 1.0f, 0.0f) }, + { 1.0f, 0.0f, -1.0f, packF4u(0.0f, 1.0f, 0.0f) }, +}; + +static const uint32_t s_numPlaneIndices = 6; +static const uint16_t s_planeIndices[s_numPlaneIndices] = +{ + 0, 1, 2, + 1, 3, 2, +}; + +static const char* s_shaderPath = NULL; +static bool s_flipV = false; +static float s_texelHalf = 0.0f; +static bgfx::RenderTargetHandle s_rtShadowMap; +static bgfx::UniformHandle u_shadowMap; + +static void shaderFilePath(char* _out, const char* _name) +{ + strcpy(_out, s_shaderPath); + strcat(_out, _name); + strcat(_out, ".bin"); +} + +long int fsize(FILE* _file) +{ + long int pos = ftell(_file); + fseek(_file, 0L, SEEK_END); + long int size = ftell(_file); + fseek(_file, pos, SEEK_SET); + return size; +} + +static const bgfx::Memory* load(const char* _filePath) +{ + FILE* file = fopen(_filePath, "rb"); + if (NULL != file) + { + uint32_t size = (uint32_t)fsize(file); + const bgfx::Memory* mem = bgfx::alloc(size+1); + size_t ignore = fread(mem->data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + mem->data[mem->size-1] = '\0'; + return mem; + } + + return NULL; +} + +static const bgfx::Memory* loadShader(const char* _name) +{ + char filePath[512]; + shaderFilePath(filePath, _name); + return load(filePath); +} + +static bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName) +{ + const bgfx::Memory* mem; + + // Load vertex shader. + mem = loadShader(_vsName); + bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem); + + // Load fragment shader. + mem = loadShader(_fsName); + bgfx::FragmentShaderHandle fsh = bgfx::createFragmentShader(mem); + + // Create program from shaders. + bgfx::ProgramHandle program = bgfx::createProgram(vsh, fsh); + + // We can destroy vertex and fragment shader here since + // their reference is kept inside bgfx after calling createProgram. + // Vertex and fragment shader will be destroyed once program is + // destroyed. + bgfx::destroyVertexShader(vsh); + bgfx::destroyFragmentShader(fsh); + + return program; +} + +void mtxScaleRotateTranslate(float* _result + , const float _scaleX + , const float _scaleY + , const float _scaleZ + , const float _rotX + , const float _rotY + , const float _rotZ + , const float _translateX + , const float _translateY + , const float _translateZ + ) +{ + float mtxRotateTranslate[16]; + float mtxScale[16]; + + mtxRotateXYZ(mtxRotateTranslate, _rotX, _rotY, _rotZ); + mtxRotateTranslate[12] = _translateX; + mtxRotateTranslate[13] = _translateY; + mtxRotateTranslate[14] = _translateZ; + + memset(mtxScale, 0, sizeof(float)*16); + mtxScale[0] = _scaleX; + mtxScale[5] = _scaleY; + mtxScale[10] = _scaleZ; + mtxScale[15] = 1.0f; + + mtxMul(_result, mtxScale, mtxRotateTranslate); +} + +struct Aabb +{ + float m_min[3]; + float m_max[3]; +}; + +struct Obb +{ + float m_mtx[16]; +}; + +struct Sphere +{ + float m_center[3]; + float m_radius; +}; + +struct Primitive +{ + uint32_t m_startIndex; + uint32_t m_numIndices; + uint32_t m_startVertex; + uint32_t m_numVertices; + + Sphere m_sphere; + Aabb m_aabb; + Obb m_obb; +}; + +typedef std::vector PrimitiveArray; + +struct Group +{ + Group() + { + reset(); + } + + void reset() + { + m_vbh.idx = bgfx::invalidHandle; + m_ibh.idx = bgfx::invalidHandle; + m_prims.clear(); + } + + bgfx::VertexBufferHandle m_vbh; + bgfx::IndexBufferHandle m_ibh; + Sphere m_sphere; + Aabb m_aabb; + Obb m_obb; + PrimitiveArray m_prims; +}; +; + +struct Mesh +{ + void load(const void* _vertices, uint32_t _numVertices, const bgfx::VertexDecl _decl, const uint16_t* _indices, uint32_t _numIndices) + { + Group group; + const bgfx::Memory* mem; + uint32_t size; + + size = _numVertices*_decl.getStride(); + mem = bgfx::makeRef(_vertices, size); + group.m_vbh = bgfx::createVertexBuffer(mem, _decl); + + size = _numIndices*2; + mem = bgfx::makeRef(_indices, size); + group.m_ibh = bgfx::createIndexBuffer(mem); + + //TODO: + // group.m_sphere = ... + // group.m_aabb = ... + // group.m_obb = ... + // group.m_prims = ... + + m_groups.push_back(group); + } + + void load(const char* _filePath) + { +#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x0) +#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0) +#define BGFX_CHUNK_MAGIC_PRI BX_MAKEFOURCC('P', 'R', 'I', 0x0) + + bx::CrtFileReader reader; + reader.open(_filePath); + + Group group; + + uint32_t chunk; + while (4 == bx::read(&reader, chunk) ) + { + switch (chunk) + { + case BGFX_CHUNK_MAGIC_VB: + { + bx::read(&reader, group.m_sphere); + bx::read(&reader, group.m_aabb); + bx::read(&reader, group.m_obb); + + bx::read(&reader, m_decl); + uint16_t stride = m_decl.getStride(); + + uint16_t numVertices; + bx::read(&reader, numVertices); + const bgfx::Memory* mem = bgfx::alloc(numVertices*stride); + bx::read(&reader, mem->data, mem->size); + + group.m_vbh = bgfx::createVertexBuffer(mem, m_decl); + } + break; + + case BGFX_CHUNK_MAGIC_IB: + { + uint32_t numIndices; + bx::read(&reader, numIndices); + const bgfx::Memory* mem = bgfx::alloc(numIndices*2); + bx::read(&reader, mem->data, mem->size); + group.m_ibh = bgfx::createIndexBuffer(mem); + } + break; + + case BGFX_CHUNK_MAGIC_PRI: + { + uint16_t len; + bx::read(&reader, len); + + std::string material; + material.resize(len); + bx::read(&reader, const_cast(material.c_str() ), len); + + uint16_t num; + bx::read(&reader, num); + + for (uint32_t ii = 0; ii < num; ++ii) + { + bx::read(&reader, len); + + std::string name; + name.resize(len); + bx::read(&reader, const_cast(name.c_str() ), len); + + Primitive prim; + bx::read(&reader, prim.m_startIndex); + bx::read(&reader, prim.m_numIndices); + bx::read(&reader, prim.m_startVertex); + bx::read(&reader, prim.m_numVertices); + bx::read(&reader, prim.m_sphere); + bx::read(&reader, prim.m_aabb); + bx::read(&reader, prim.m_obb); + + group.m_prims.push_back(prim); + } + + m_groups.push_back(group); + group.reset(); + } + break; + + default: + DBG("%08x at %d", chunk, reader.seek() ); + break; + } + } + + reader.close(); + } + + void unload() + { + for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) + { + const Group& group = *it; + bgfx::destroyVertexBuffer(group.m_vbh); + + if (bgfx::isValid(group.m_ibh) ) + { + bgfx::destroyIndexBuffer(group.m_ibh); + } + } + m_groups.clear(); + } + + void submit(uint8_t _view, float* _mtx, bgfx::ProgramHandle _program) + { + for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) + { + const Group& group = *it; + + // Set model matrix for rendering. + bgfx::setTransform(_mtx); + bgfx::setProgram(_program); + bgfx::setIndexBuffer(group.m_ibh); + bgfx::setVertexBuffer(group.m_vbh); + + // Set shadow map. + bgfx::setTexture(4, u_shadowMap, s_rtShadowMap); + + // Set render states. + bgfx::setState(0 + |BGFX_STATE_RGB_WRITE + |BGFX_STATE_ALPHA_WRITE + |BGFX_STATE_DEPTH_WRITE + |BGFX_STATE_DEPTH_TEST_LESS + |BGFX_STATE_CULL_CCW + |BGFX_STATE_MSAA + ); + + // Submit primitive for rendering. + bgfx::submit(_view); + } + } + + bgfx::VertexDecl m_decl; + typedef std::vector GroupArray; + GroupArray m_groups; +}; + +int _main_(int /*_argc*/, char** /*_argv*/) +{ + uint32_t width = 1280; + uint32_t height = 720; + uint32_t debug = BGFX_DEBUG_TEXT; + uint32_t reset = BGFX_RESET_VSYNC; + + bgfx::init(); + bgfx::reset(width, height, reset); + + // Enable debug text. + bgfx::setDebug(debug); + + // Setup root path for binary shaders. Shader binaries are different + // for each renderer. + switch (bgfx::getRendererType() ) + { + default: + case bgfx::RendererType::Direct3D9: + s_shaderPath = "shaders/dx9/"; + s_texelHalf = 0.5f; + break; + + case bgfx::RendererType::Direct3D11: + s_shaderPath = "shaders/dx11/"; + break; + + case bgfx::RendererType::OpenGL: + s_shaderPath = "shaders/glsl/"; + s_flipV = true; + break; + + case bgfx::RendererType::OpenGLES2: + case bgfx::RendererType::OpenGLES3: + s_shaderPath = "shaders/gles/"; + s_flipV = true; + break; + } + + // Uniforms. + u_shadowMap = bgfx::createUniform("u_shadowMap", bgfx::UniformType::Uniform1iv); + + bgfx::UniformHandle u_lightPos = bgfx::createUniform("u_lightPos", bgfx::UniformType::Uniform4fv); + bgfx::UniformHandle u_lightMtx = bgfx::createUniform("u_lightMtx", bgfx::UniformType::Uniform4x4fv); + + // Programs. + bgfx::ProgramHandle progPackDepth = loadProgram("vs_smsimple_packdepth", "fs_smsimple_packdepth"); + bgfx::ProgramHandle progDraw = loadProgram("vs_smsimple_draw", "fs_smsimple_draw"); + + // Vertex declarations. + bgfx::VertexDecl PosNormalDecl; + PosNormalDecl.begin(); + PosNormalDecl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + PosNormalDecl.add(bgfx::Attrib::Normal, 4, bgfx::AttribType::Uint8, true, true); + PosNormalDecl.end(); + + // Meshes. + Mesh bunnyMesh; + Mesh cubeMesh; + Mesh hollowcubeMesh; + Mesh hplaneMesh; + bunnyMesh.load("meshes/bunny.bin"); + cubeMesh.load("meshes/cube.bin"); + hollowcubeMesh.load("meshes/hollowcube.bin"); + hplaneMesh.load(s_hplaneVertices, s_numHPlaneVertices, PosNormalDecl, s_planeIndices, s_numPlaneIndices); + + // Render targets. + uint16_t shadowMapSize = 512; + s_rtShadowMap = bgfx::createRenderTarget(shadowMapSize, shadowMapSize, BGFX_RENDER_TARGET_COLOR_RGBA8 | BGFX_RENDER_TARGET_DEPTH_D16); + + // Set view and projection matrices. + float view[16]; + float proj[16]; + + const float eye[3] = { 0.0f, 30.0f, -60.0f }; + const float at[3] = { 0.0f, 5.0f, 0.0f }; + mtxLookAt(view, eye, at); + + const float aspect = float(int32_t(width) ) / float(int32_t(height) ); + mtxProj(proj, 60.0f, aspect, 0.1f, 1000.0f); + + // Time acumulators. + float timeAccumulatorLight = 0.0f; + float timeAccumulatorScene = 0.0f; + + entry::MouseState mouseState; + while (!entry::processEvents(width, height, debug, reset, &mouseState) ) + { + // Time. + int64_t now = bx::getHPCounter(); + static int64_t last = now; + const int64_t frameTime = now - last; + last = now; + const double freq = double(bx::getHPFrequency() ); + const double toMs = 1000.0/freq; + const float deltaTime = float(frameTime/freq); + + // Update time accumulators. + timeAccumulatorLight += deltaTime; + timeAccumulatorScene += deltaTime; + + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/15-shadowmaps-simple"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Shadow maps example."); + bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); + + // Setup lights. + float lightPos[4]; + lightPos[0] = -cos(timeAccumulatorLight); + lightPos[1] = -1.0f; + lightPos[2] = -sin(timeAccumulatorLight); + lightPos[3] = 0.0f; + + bgfx::setUniform(u_lightPos, lightPos); + + // Setup instance matrices. + float mtxFloor[16]; + mtxScaleRotateTranslate(mtxFloor + , 30.0f //scaleX + , 30.0f //scaleY + , 30.0f //scaleZ + , 0.0f //rotX + , 0.0f //rotY + , 0.0f //rotZ + , 0.0f //translateX + , 0.0f //translateY + , 0.0f //translateZ + ); + + float mtxBunny[16]; + mtxScaleRotateTranslate(mtxBunny + , 5.0f + , 5.0f + , 5.0f + , 0.0f + , float(M_PI) - timeAccumulatorScene + , 0.0f + , 15.0f + , 5.0f + , 0.0f + ); + + float mtxHollowcube[16]; + mtxScaleRotateTranslate(mtxHollowcube + , 2.5f + , 2.5f + , 2.5f + , 0.0f + , 1.56f - timeAccumulatorScene + , 0.0f + , 0.0f + , 10.0f + , 0.0f + ); + + float mtxCube[16]; + mtxScaleRotateTranslate(mtxCube + , 2.5f + , 2.5f + , 2.5f + , 0.0f + , 1.56f - timeAccumulatorScene + , 0.0f + , -15.0f + , 5.0f + , 0.0f + ); + + // Define matrices. + float screenView[16]; + float screenProj[16]; + mtxIdentity(screenView); + mtxOrtho(screenProj, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f); + + float lightView[16]; + float lightProj[16]; + + const float eye[3] = + { + -lightPos[0], + -lightPos[1], + -lightPos[2], + }; + const float at[3] = { 0.0f, 0.0f, 0.0f }; + mtxLookAt(lightView, eye, at); + + const float area = 30.0f; + mtxOrtho(lightProj, -area, area, -area, area, -100.0f, 100.0f); + + /** + * RENDER_PASS_0 - Craft shadow map. + * RENDER_PASS_1 - Draw scene. + */ + bgfx::setViewRect(RENDER_PASS_0, 0, 0, shadowMapSize, shadowMapSize); + bgfx::setViewRect(RENDER_PASS_1, 0, 0, width, height); + + bgfx::setViewTransform(RENDER_PASS_0, lightView, lightProj); + bgfx::setViewTransform(RENDER_PASS_1, view, proj); + + bgfx::setViewRenderTarget(RENDER_PASS_0, s_rtShadowMap); + + // Clear backbuffer and shadowmap rendertarget at beginning. + bgfx::setViewClearMask(0x3, BGFX_CLEAR_COLOR_BIT | BGFX_CLEAR_DEPTH_BIT, 0x303030ff, 1.0f, 0); + bgfx::submitMask(0x3); + + // Render. + + { // Craft shadow map. + + hplaneMesh.submit(RENDER_PASS_0, mtxFloor, progPackDepth); + bunnyMesh.submit(RENDER_PASS_0, mtxBunny, progPackDepth); + hollowcubeMesh.submit(RENDER_PASS_0, mtxHollowcube, progPackDepth); + cubeMesh.submit(RENDER_PASS_0, mtxCube, progPackDepth); + } + + { // Draw Scene. + + float mtxShadow[16]; //lightviewProjCrop + float lightMtx[16]; //modelLightviewProjCrop + + const float s = (s_flipV) ? 1.0f : -1.0f; //sign + + const float mtxCrop[16] = + { + 0.5f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.5f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, + }; + + float mtxTmp[16]; + mtxMul(mtxTmp, lightProj, mtxCrop); + mtxMul(mtxShadow, lightView, mtxTmp); + + // Floor. + mtxMul(lightMtx, mtxFloor, mtxShadow); + bgfx::setUniform(u_lightMtx, lightMtx); + hplaneMesh.submit(RENDER_PASS_1, mtxFloor, progDraw); + + // Bunny. + mtxMul(lightMtx, mtxBunny, mtxShadow); + bgfx::setUniform(u_lightMtx, lightMtx); + bunnyMesh.submit(RENDER_PASS_1, mtxBunny, progDraw); + + // Hollow cube. + mtxMul(lightMtx, mtxHollowcube, mtxShadow); + bgfx::setUniform(u_lightMtx, lightMtx); + hollowcubeMesh.submit(RENDER_PASS_1, mtxHollowcube, progDraw); + + // Cube. + mtxMul(lightMtx, mtxCube, mtxShadow); + bgfx::setUniform(u_lightMtx, lightMtx); + cubeMesh.submit(RENDER_PASS_1, mtxCube, progDraw); + } + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx::frame(); + + } + + bunnyMesh.unload(); + cubeMesh.unload(); + hollowcubeMesh.unload(); + hplaneMesh.unload(); + + bgfx::destroyProgram(progPackDepth); + bgfx::destroyProgram(progDraw); + + bgfx::destroyRenderTarget(s_rtShadowMap); + + bgfx::destroyUniform(u_shadowMap); + bgfx::destroyUniform(u_lightPos); + bgfx::destroyUniform(u_lightMtx); + + // Shutdown bgfx. + bgfx::shutdown(); + + return 0; +} diff --git a/examples/15-shadowmaps-simple/varying.def.sc b/examples/15-shadowmaps-simple/varying.def.sc new file mode 100644 index 000000000..abd336b22 --- /dev/null +++ b/examples/15-shadowmaps-simple/varying.def.sc @@ -0,0 +1,7 @@ +vec3 v_view : TEXCOORD0 = vec3(0.0, 0.0, 0.0); +vec4 v_shadowcoord : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_position : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0); + +vec3 a_position : POSITION; +vec4 a_normal : NORMAL; diff --git a/examples/15-shadowmaps-simple/vs_smsimple_draw.sc b/examples/15-shadowmaps-simple/vs_smsimple_draw.sc new file mode 100644 index 000000000..20d6f0943 --- /dev/null +++ b/examples/15-shadowmaps-simple/vs_smsimple_draw.sc @@ -0,0 +1,24 @@ +$input a_position, a_normal +$output v_view, v_normal, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform mat4 u_lightMtx; + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + const float shadowMapOffset = 0.001; + vec3 posOffset = a_position + normal.xyz * shadowMapOffset; + v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) ); +} diff --git a/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc b/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc new file mode 100644 index 000000000..dc1024b62 --- /dev/null +++ b/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc @@ -0,0 +1,15 @@ +$input a_position +$output v_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_position = gl_Position; +} diff --git a/examples/16-shadowmaps/common.sh b/examples/16-shadowmaps/common.sh new file mode 100644 index 000000000..29785b94e --- /dev/null +++ b/examples/16-shadowmaps/common.sh @@ -0,0 +1,235 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +float linstep(float _edge0, float _edge1, float _x) +{ + return clamp((_x-_edge0)/(_edge1-_edge0), 0.0, 1.0); +} + +float attenuation(float _dist, vec3 _attn) +{ + return 1.0 / ( _attn.x //const + + _attn.y * _dist //linear + + _attn.z * _dist * _dist //quadrantic + ); +} + +float spot(float _ldotsd, float _inner, float _outer) +{ + float inner = cos(radians(_inner)); + float outer = cos(radians(min(_outer, _inner - 0.001))); + float spot = clamp((_ldotsd - inner) / (outer - inner), 0.0, 1.0); + return spot; +} + +vec2 lit(vec3 _ld, vec3 _n, vec3 _vd, float _exp) +{ + //diff + float ndotl = dot(_n, _ld); + + //spec + vec3 r = 2.0*ndotl*_n - _ld; // reflect(_ld, _n); + float rdotv = dot(r, _vd); + float spec = step(0.0, ndotl) * pow(max(0.0, rdotv), _exp) * (2.0 + _exp)/8.0; + + return max(vec2(ndotl, spec), 0.0); +} + +struct Light +{ + vec3 l; + vec3 ld; + float attn; +}; + +Light evalLight(vec3 _v, vec4 _l, vec3 _spotDirection, float _spotInner, float _spotOuter, vec3 _attnParams) +{ + Light light; + + //directional + light.l = _l.xyz; + light.ld = -normalize(light.l); + light.attn = 1.0; + + if (0.0 != _l.w) //point or spot + { + light.l = _l.xyz - _v; + light.ld = normalize(light.l); + + float ldotsd = max(0.0, dot(-light.ld, normalize(_spotDirection))); + float falloff = spot(ldotsd, _spotOuter, _spotInner); + light.attn = attenuation(length(light.l), _attnParams) * mix(falloff, 1.0, step(90, _spotOuter)); + } + + return light; +} + +float texcoordInRange(vec2 _texcoord) +{ + bool inRange = all(greaterThan(_texcoord, vec2_splat(0.0))) + && all(lessThan (_texcoord, vec2_splat(1.0))) + ; + + return float(inRange); +} + +float hardShadow(sampler2D _sampler, vec4 _shadowCoord, float _bias) +{ + vec2 texCoord = _shadowCoord.xy/_shadowCoord.w; + + bool outside = any(greaterThan(texCoord, vec2_splat(1.0))) + || any(lessThan (texCoord, vec2_splat(0.0))) + ; + + if (outside) + { + return 1.0; + } + + float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w; + float occluder = unpackRgbaToFloat(texture2D(_sampler, texCoord) ); + + float visibility = step(receiver, occluder); + return visibility; +} + +float PCF(sampler2D _sampler, vec4 _shadowCoord, float _bias, vec4 _pcfParams, vec2 _texelSize) +{ + float result = 0.0; + vec2 offset = _pcfParams.zw * _texelSize * _shadowCoord.w; + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), _bias); + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), _bias); + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), _bias); + + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), _bias); + result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), _bias); + + return result / 16.0; +} + +float VSM(sampler2D _sampler, vec4 _shadowCoord, float _bias, float _depthMultiplier, float _minVariance) +{ + vec2 texCoord = _shadowCoord.xy/_shadowCoord.w; + + bool outside = any(greaterThan(texCoord, vec2_splat(1.0))) + || any(lessThan (texCoord, vec2_splat(0.0))) + ; + + if (outside) + { + return 1.0; + } + + float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w * _depthMultiplier; + vec4 rgba = texture2D(_sampler, texCoord); + vec2 occluder = vec2(unpackHalfFloat(rgba.rg), unpackHalfFloat(rgba.ba)) * _depthMultiplier; + + if (receiver < occluder.x) + { + return 1.0; + } + + float variance = max(occluder.y - (occluder.x*occluder.x), _minVariance); + float d = receiver - occluder.x; + + float visibility = variance / (variance + d*d); + + return visibility; +} + +float ESM(sampler2D _sampler, vec4 _shadowCoord, float _bias, float _depthMultiplier) +{ + vec2 texCoord = _shadowCoord.xy/_shadowCoord.w; + + bool outside = any(greaterThan(texCoord, vec2_splat(1.0))) + || any(lessThan (texCoord, vec2_splat(0.0))) + ; + + if (outside) + { + return 1.0; + } + + float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w; + float occluder = unpackRgbaToFloat(texture2D(_sampler, texCoord) ); + + float visibility = clamp(exp(_depthMultiplier * (occluder-receiver) ), 0.0, 1.0); + + return visibility; +} + + +vec4 blur9(sampler2D _sampler, vec2 _uv0, vec4 _uv1, vec4 _uv2, vec4 _uv3, vec4 _uv4) +{ +#define _BLUR9_WEIGHT_0 1.0 +#define _BLUR9_WEIGHT_1 0.9 +#define _BLUR9_WEIGHT_2 0.55 +#define _BLUR9_WEIGHT_3 0.18 +#define _BLUR9_WEIGHT_4 0.1 +#define _BLUR9_NORMALIZE (_BLUR9_WEIGHT_0+2.0*(_BLUR9_WEIGHT_1+_BLUR9_WEIGHT_2+_BLUR9_WEIGHT_3+_BLUR9_WEIGHT_4) ) +#define BLUR9_WEIGHT(_x) (_BLUR9_WEIGHT_##_x/_BLUR9_NORMALIZE) + + float blur; + blur = unpackRgbaToFloat(texture2D(_sampler, _uv0) * BLUR9_WEIGHT(0)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv1.xy) * BLUR9_WEIGHT(1)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv1.zw) * BLUR9_WEIGHT(1)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv2.xy) * BLUR9_WEIGHT(2)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv2.zw) * BLUR9_WEIGHT(2)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv3.xy) * BLUR9_WEIGHT(3)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv3.zw) * BLUR9_WEIGHT(3)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv4.xy) * BLUR9_WEIGHT(4)); + blur += unpackRgbaToFloat(texture2D(_sampler, _uv4.zw) * BLUR9_WEIGHT(4)); + return packFloatToRgba(blur); +} + +vec4 blur9VSM(sampler2D _sampler, vec2 _uv0, vec4 _uv1, vec4 _uv2, vec4 _uv3, vec4 _uv4) +{ +#define _BLUR9_WEIGHT_0 1.0 +#define _BLUR9_WEIGHT_1 0.9 +#define _BLUR9_WEIGHT_2 0.55 +#define _BLUR9_WEIGHT_3 0.18 +#define _BLUR9_WEIGHT_4 0.1 +#define _BLUR9_NORMALIZE (_BLUR9_WEIGHT_0+2.0*(_BLUR9_WEIGHT_1+_BLUR9_WEIGHT_2+_BLUR9_WEIGHT_3+_BLUR9_WEIGHT_4) ) +#define BLUR9_WEIGHT(_x) (_BLUR9_WEIGHT_##_x/_BLUR9_NORMALIZE) + + vec2 blur; + vec4 val; + val = texture2D(_sampler, _uv0) * BLUR9_WEIGHT(0); + blur = vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv1.xy) * BLUR9_WEIGHT(1); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv1.zw) * BLUR9_WEIGHT(1); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv2.xy) * BLUR9_WEIGHT(2); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv2.zw) * BLUR9_WEIGHT(2); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv3.xy) * BLUR9_WEIGHT(3); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv3.zw) * BLUR9_WEIGHT(3); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv4.xy) * BLUR9_WEIGHT(4); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + val = texture2D(_sampler, _uv4.zw) * BLUR9_WEIGHT(4); + blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba)); + + return vec4(packHalfFloat(blur.x), packHalfFloat(blur.y)); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_black.sc b/examples/16-shadowmaps/fs_shadowmaps_color_black.sc new file mode 100644 index 000000000..057b621ba --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_black.sc @@ -0,0 +1,11 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh b/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh new file mode 100644 index 000000000..c6adfa8b0 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh @@ -0,0 +1,84 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.sh" + +uniform vec4 u_params0; +uniform vec4 u_params1; +uniform vec4 u_params2; +uniform vec4 u_color; + +uniform vec3 u_materialKa; +uniform vec3 u_materialKd; +uniform vec4 u_materialKs; +uniform vec4 u_lightPosition; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_smSamplingParams; +uniform vec4 u_csmFarDistances; + +#if SM_OMNI +uniform vec3 u_tetraNormalGreen; +uniform vec3 u_tetraNormalYellow; +uniform vec3 u_tetraNormalBlue; +uniform vec3 u_tetraNormalRed; +#endif + +SAMPLER2D(u_shadowMap0, 4); +SAMPLER2D(u_shadowMap1, 5); +SAMPLER2D(u_shadowMap2, 6); +SAMPLER2D(u_shadowMap3, 7); + +struct Shader +{ + vec3 ambi; + vec3 diff; + vec3 spec; +}; + +Shader evalShader(float _diff, float _spec) +{ + Shader shader; + + shader.ambi = u_lightAmbientPower.xyz * u_lightAmbientPower.w * u_materialKa; + shader.diff = u_lightDiffusePower.xyz * u_lightDiffusePower.w * u_materialKd * _diff; + shader.spec = u_lightSpecularPower.xyz * u_lightSpecularPower.w * u_materialKs.xyz * _spec; + + return shader; +} + +float computeVisibility(sampler2D _sampler + , vec4 _shadowCoord + , float _bias + , vec4 _samplingParams + , vec2 _texelSize + , float _depthMultiplier + , float _minVariance + , float _hardness + ) +{ + float visibility; + +#if SM_LINEAR + vec4 shadowcoord = vec4(_shadowCoord.xy / _shadowCoord.w, _shadowCoord.z, 1.0); +#else + vec4 shadowcoord = _shadowCoord; +#endif + +#if SM_HARD + visibility = hardShadow(_sampler, shadowcoord, _bias); +#elif SM_PCF + visibility = PCF(_sampler, shadowcoord, _bias, _samplingParams, _texelSize); +#elif SM_VSM + visibility = VSM(_sampler, shadowcoord, _bias, _depthMultiplier, _minVariance); +#elif SM_ESM + visibility = ESM(_sampler, shadowcoord, _bias, _depthMultiplier * _hardness); +#endif + + return visibility; +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc new file mode 100644 index 000000000..1b7644cfe --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc @@ -0,0 +1,15 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_ESM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc new file mode 100644 index 000000000..fa53a9d0e --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_ESM 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc new file mode 100644 index 000000000..8f960b20e --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc @@ -0,0 +1,16 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_ESM 1 +#define SM_LINEAR 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc new file mode 100644 index 000000000..5ca772630 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc @@ -0,0 +1,18 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_ESM 1 +#define SM_LINEAR 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc new file mode 100644 index 000000000..f578abd7f --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_ESM 1 +#define SM_LINEAR 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc new file mode 100644 index 000000000..ebeac2cc1 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_ESM 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc new file mode 100644 index 000000000..f06666db5 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc @@ -0,0 +1,15 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_HARD 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc new file mode 100644 index 000000000..27918465d --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_HARD 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc new file mode 100644 index 000000000..b6d7554e9 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc @@ -0,0 +1,15 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_HARD 1 +#define SM_LINEAR 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc new file mode 100644 index 000000000..05bf3ac50 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_HARD 1 +#define SM_LINEAR 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc new file mode 100644 index 000000000..90947dbfe --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_HARD 1 +#define SM_LINEAR 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc new file mode 100644 index 000000000..78ad2baee --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_HARD 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh new file mode 100644 index 000000000..fb8b90971 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh @@ -0,0 +1,151 @@ +#define u_ambientPass u_params0.x +#define u_lightningPass u_params0.y + +#define u_shadowMapBias u_params1.x +#define u_shadowMapParam0 u_params1.z +#define u_shadowMapParam1 u_params1.w + +#define u_shadowMapShowCoverage u_params2.y +#define u_shadowMapTexelSize u_params2.z + +#define u_spotDirection u_lightSpotDirectionInner.xyz +#define u_spotInner u_lightSpotDirectionInner.w +#define u_lightAttnParams u_lightAttenuationSpotOuter.xyz +#define u_spotOuter u_lightAttenuationSpotOuter.w + +// Pcf +#define u_shadowMapPcfMode u_shadowMapParam0 +#define u_shadowMapNoiseAmount u_shadowMapParam1 + +// Vsm +#define u_shadowMapMinVariance u_shadowMapParam0 +#define u_shadowMapDepthMultiplier u_shadowMapParam1 + +// Esm +#define u_shadowMapHardness u_shadowMapParam0 +#define u_shadowMapDepthMultiplier u_shadowMapParam1 + +{ + vec3 colorCoverage; + float visibility; + +#if SM_CSM + vec2 texelSize = vec2_splat(u_shadowMapTexelSize); + + vec2 texcoord1 = v_texcoord1.xy/v_texcoord1.w; + vec2 texcoord2 = v_texcoord2.xy/v_texcoord2.w; + vec2 texcoord3 = v_texcoord3.xy/v_texcoord3.w; + vec2 texcoord4 = v_texcoord4.xy/v_texcoord4.w; + + bool selection0 = all(lessThan(texcoord1, vec2_splat(0.99))) && all(greaterThan(texcoord1, vec2_splat(0.01))); + bool selection1 = all(lessThan(texcoord2, vec2_splat(0.99))) && all(greaterThan(texcoord2, vec2_splat(0.01))); + bool selection2 = all(lessThan(texcoord3, vec2_splat(0.99))) && all(greaterThan(texcoord3, vec2_splat(0.01))); + bool selection3 = all(lessThan(texcoord4, vec2_splat(0.99))) && all(greaterThan(texcoord4, vec2_splat(0.01))); + + if (selection0) + { + vec4 shadowcoord = v_texcoord1; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.4; + colorCoverage = vec3(-coverage, coverage, -coverage); + visibility = computeVisibility(u_shadowMap0, shadowcoord, u_shadowMapBias, u_smSamplingParams, texelSize, u_shadowMapDepthMultiplier, u_shadowMapMinVariance, u_shadowMapHardness); + } + else if (selection1) + { + vec4 shadowcoord = v_texcoord2; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.4; + colorCoverage = vec3(coverage, coverage, -coverage); + visibility = computeVisibility(u_shadowMap1, shadowcoord, u_shadowMapBias, u_smSamplingParams, texelSize/2.0, u_shadowMapDepthMultiplier, u_shadowMapMinVariance, u_shadowMapHardness); + } + else if (selection2) + { + vec4 shadowcoord = v_texcoord3; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.4; + colorCoverage = vec3(-coverage, -coverage, coverage); + visibility = computeVisibility(u_shadowMap2, shadowcoord, u_shadowMapBias, u_smSamplingParams, texelSize/3.0, u_shadowMapDepthMultiplier, u_shadowMapMinVariance, u_shadowMapHardness); + } + else //selection3 + { + vec4 shadowcoord = v_texcoord4; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.4; + colorCoverage = vec3(coverage, -coverage, -coverage); + visibility = computeVisibility(u_shadowMap3, shadowcoord, u_shadowMapBias, u_smSamplingParams, texelSize/4.0, u_shadowMapDepthMultiplier, u_shadowMapMinVariance, u_shadowMapHardness); + } +#elif SM_OMNI + vec2 texelSize = vec2_splat(u_shadowMapTexelSize/4.0); + + vec4 faceSelection; + vec3 pos = v_position.xyz; + faceSelection.x = dot(u_tetraNormalGreen, pos); + faceSelection.y = dot(u_tetraNormalYellow, pos); + faceSelection.z = dot(u_tetraNormalBlue, pos); + faceSelection.w = dot(u_tetraNormalRed, pos); + + vec4 shadowcoord; + float faceMax = max(max(faceSelection.x, faceSelection.y), max(faceSelection.z, faceSelection.w)); + if (faceSelection.x == faceMax) + { + shadowcoord = v_texcoord1; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.3; + colorCoverage = vec3(-coverage, coverage, -coverage); + } + else if (faceSelection.y == faceMax) + { + shadowcoord = v_texcoord2; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.3; + colorCoverage = vec3(coverage, coverage, -coverage); + } + else if (faceSelection.z == faceMax) + { + shadowcoord = v_texcoord3; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.3; + colorCoverage = vec3(-coverage, -coverage, coverage); + } + else // (faceSelection.w == faceMax) + { + shadowcoord = v_texcoord4; + + float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.3; + colorCoverage = vec3(coverage, -coverage, -coverage); + } + + visibility = computeVisibility(u_shadowMap0, shadowcoord, u_shadowMapBias, u_smSamplingParams, texelSize, u_shadowMapDepthMultiplier, u_shadowMapMinVariance, u_shadowMapHardness); +#else + vec2 texelSize = vec2_splat(u_shadowMapTexelSize); + + float coverage = texcoordInRange(v_shadowcoord.xy/v_shadowcoord.w) * 0.3; + colorCoverage = vec3(coverage, -coverage, -coverage); + + visibility = computeVisibility(u_shadowMap0, v_shadowcoord, u_shadowMapBias, u_smSamplingParams, texelSize, u_shadowMapDepthMultiplier, u_shadowMapMinVariance, u_shadowMapHardness); +#endif + + vec3 v = v_view; + vec3 vd = -normalize(v_view); + vec3 n = v_normal; + Light light = evalLight(v, u_lightPosition, u_spotDirection, u_spotInner, u_spotOuter, u_lightAttnParams); + + vec2 lc = lit(light.ld, n, vd, u_materialKs.w) * light.attn; + Shader shader = evalShader(lc.x, lc.y); + + //Fog. + const vec3 fogColor = vec3_splat(0.0); + const float fogDensity = 0.0035; + const float LOG2 = 1.442695; + float z = length(v); + float fogFactor = clamp(1.0/exp2(fogDensity*fogDensity*z*z*LOG2), 0.0, 1.0); + + vec3 color = u_color.xyz; + + vec3 ambient = shader.ambi * color; + vec3 brdf = (shader.diff + shader.spec) * color * visibility; + + vec3 final = toGamma(abs(ambient + brdf)) + (colorCoverage * u_shadowMapShowCoverage); + gl_FragColor.xyz = mix(fogColor, final, fogFactor); + gl_FragColor.w = 1.0; +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc new file mode 100644 index 000000000..89a7c5011 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc @@ -0,0 +1,15 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_PCF 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc new file mode 100644 index 000000000..f356d0c88 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_PCF 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc new file mode 100644 index 000000000..7b593b75e --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc @@ -0,0 +1,16 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_PCF 1 +#define SM_LINEAR 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc new file mode 100644 index 000000000..182562fc4 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_PCF 1 +#define SM_LINEAR 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc new file mode 100644 index 000000000..e601ae88f --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_PCF 1 +#define SM_LINEAR 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc new file mode 100644 index 000000000..f6da783ac --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_PCF 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc new file mode 100644 index 000000000..c3e675df7 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc @@ -0,0 +1,15 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_VSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc new file mode 100644 index 000000000..7b5e33ff1 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_VSM 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc new file mode 100644 index 000000000..6078739ff --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc @@ -0,0 +1,16 @@ +$input v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_VSM 1 +#define SM_LINEAR 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc new file mode 100644 index 000000000..9b46fea28 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_VSM 1 +#define SM_LINEAR 1 +#define SM_CSM 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc new file mode 100644 index 000000000..70027ef14 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc @@ -0,0 +1,17 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ +#define SM_VSM 1 +#define SM_LINEAR 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc new file mode 100644 index 000000000..ecf3533ea --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc @@ -0,0 +1,16 @@ +$input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#define SM_VSM 1 +#define SM_OMNI 1 + +#include "fs_shadowmaps_color_lightning.sh" + +void main() +{ +#include "fs_shadowmaps_color_lightning_main.sh" +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc b/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc new file mode 100644 index 000000000..5a109e08e --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc @@ -0,0 +1,22 @@ +$input v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" +uniform vec4 u_color; +SAMPLER2D(u_texColor, 0); + +void main() +{ + vec4 tcolor = toLinear(texture2D(u_texColor, v_texcoord0)); + + if (tcolor.x < 0.1) //OK for now. + { + discard; + } + + gl_FragColor = toGamma(tcolor + u_color); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_hblur.sc b/examples/16-shadowmaps/fs_shadowmaps_hblur.sc new file mode 100644 index 000000000..401f3f77c --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_hblur.sc @@ -0,0 +1,14 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.sh" +SAMPLER2D(u_shadowMap0, 4); + +void main() +{ + gl_FragColor = blur9(u_shadowMap0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc new file mode 100644 index 000000000..bccdfe087 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc @@ -0,0 +1,15 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.sh" +SAMPLER2D(u_shadowMap0, 4); + +void main() +{ + gl_FragColor = blur9VSM(u_shadowMap0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4); +} + diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc new file mode 100644 index 000000000..867e92c40 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc @@ -0,0 +1,14 @@ +$input v_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + float depth = v_position.z/v_position.w * 0.5 + 0.5; + gl_FragColor = packFloatToRgba(depth); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc new file mode 100644 index 000000000..cc18624c2 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc @@ -0,0 +1,13 @@ +$input v_depth + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_FragColor = packFloatToRgba(v_depth); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc new file mode 100644 index 000000000..b683249b1 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc @@ -0,0 +1,20 @@ +$input v_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + float depth = v_position.z/v_position.w * 0.5 + 0.5; + float depthSq = depth*depth; + + //TODO: try this. + //vec2 dxy = vec2(dFdx(depth), dFdy(depth)); + //depthSq += 0.25*dot(dxy, dxy); + + gl_FragColor = vec4(packHalfFloat(depth), packHalfFloat(depthSq)); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc new file mode 100644 index 000000000..d1cd1537a --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc @@ -0,0 +1,20 @@ +$input v_depth + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + float depth = v_depth; + float depthSq = depth*depth; + + //TODO: try this. + //vec2 dxy = vec2(dFdx(depth), dFdy(depth)); + //depthSq += 0.25*dot(dxy, dxy); + + gl_FragColor = vec4(packHalfFloat(depth), packHalfFloat(depthSq)); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_texture.sc b/examples/16-shadowmaps/fs_shadowmaps_texture.sc new file mode 100644 index 000000000..78156e1ca --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_texture.sc @@ -0,0 +1,14 @@ +$input v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" +SAMPLER2D(u_texColor, 0); + +void main() +{ + gl_FragColor = texture2D(u_texColor, v_texcoord0); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc new file mode 100644 index 000000000..1cd1ab49f --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc @@ -0,0 +1,19 @@ +$input v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" +SAMPLER2D(u_shadowMap0, 4); + +uniform vec4 u_params2; +#define u_depthValuePow u_params2.x + +void main() +{ + float depth = unpackRgbaToFloat(texture2D(u_shadowMap0, v_texcoord0) ); + vec3 rgba = pow(vec3_splat(depth), vec3_splat(u_depthValuePow) ); + gl_FragColor = vec4(rgba, 1.0); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc new file mode 100644 index 000000000..ee8f0269e --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc @@ -0,0 +1,20 @@ +$input v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" +SAMPLER2D(u_shadowMap0, 4); + +uniform vec4 u_params2; +#define u_depthValuePow u_params2.x + +void main() +{ + vec4 val = texture2D(u_shadowMap0, v_texcoord0); + float depth = unpackHalfFloat(val.rg); + vec3 rgba = pow(vec3_splat(depth), vec3_splat(u_depthValuePow) ); + gl_FragColor = vec4(rgba, 1.0); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_vblur.sc b/examples/16-shadowmaps/fs_shadowmaps_vblur.sc new file mode 100644 index 000000000..401f3f77c --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_vblur.sc @@ -0,0 +1,14 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.sh" +SAMPLER2D(u_shadowMap0, 4); + +void main() +{ + gl_FragColor = blur9(u_shadowMap0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4); +} diff --git a/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc new file mode 100644 index 000000000..bccdfe087 --- /dev/null +++ b/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc @@ -0,0 +1,15 @@ +$input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.sh" +SAMPLER2D(u_shadowMap0, 4); + +void main() +{ + gl_FragColor = blur9VSM(u_shadowMap0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4); +} + diff --git a/examples/16-shadowmaps/hollowcube.obj b/examples/16-shadowmaps/hollowcube.obj new file mode 100644 index 000000000..2980086ba --- /dev/null +++ b/examples/16-shadowmaps/hollowcube.obj @@ -0,0 +1,934 @@ +# Blender v2.66 (sub 1) OBJ File: '' +# www.blender.org +g holeycube +v 1.500000 1.211657 0.000000 +v 1.500000 1.211656 1.209338 +v 1.236416 1.211656 1.209338 +v 1.236416 1.211657 0.000000 +v 1.500000 1.500000 0.000000 +v 1.500000 1.500000 1.209338 +v 1.236416 1.500000 1.209338 +v 1.236416 1.500000 0.000000 +v 1.500000 -0.000000 1.209337 +v 1.500000 -1.211657 1.209337 +v 1.236416 -1.211657 1.209337 +v 1.236416 -0.000000 1.209337 +v 1.236416 -0.000000 1.500000 +v 1.236416 -1.211657 1.500000 +v 1.500000 -1.211657 1.500000 +v 1.500000 -0.000000 1.500000 +v 1.500000 0.000000 -1.500000 +v 1.500000 -1.211656 -1.500000 +v 1.236416 -1.211656 -1.500000 +v 1.236416 0.000000 -1.500000 +v -1.236416 0.000000 -1.500000 +v -1.236416 -1.211656 -1.500000 +v -1.500000 -1.211656 -1.500000 +v -1.500000 0.000000 -1.500000 +v -1.500000 -0.000000 1.500000 +v -1.500000 -1.211657 1.500000 +v -1.236416 -1.211657 1.500000 +v -1.236416 -0.000000 1.500000 +v -1.236416 -0.000000 1.209337 +v -1.236416 -1.211657 1.209337 +v -1.500000 -1.211657 1.209337 +v -1.500000 -0.000000 1.209337 +v -1.500000 1.211656 1.500000 +v -1.500000 1.211656 1.209338 +v -1.236416 1.211656 1.209338 +v -1.236416 1.211656 1.500000 +v -1.500000 1.211657 -1.500000 +v -1.236416 1.211657 -1.500000 +v 1.236416 1.211657 -1.500000 +v 1.500000 1.211657 -1.500000 +v 1.500000 1.211656 1.500000 +v 1.236416 1.211656 1.500000 +v 0.000000 -1.500000 1.209337 +v -1.236416 -1.500000 1.209337 +v 0.000000 -1.211657 1.209337 +v 0.000000 1.211656 1.209338 +v -1.236416 1.500000 1.209338 +v 0.000000 1.500000 1.209338 +v -1.236416 1.500000 1.500000 +v 0.000000 1.500000 1.500000 +v 0.000000 1.211656 1.500000 +v 1.236416 1.500000 1.500000 +v -1.500000 1.500000 1.500000 +v 1.500000 1.500000 1.500000 +v 0.000000 -1.500000 -1.500000 +v -1.236416 -1.500000 -1.500000 +v 0.000000 -1.211656 -1.500000 +v 0.000000 -1.500000 -1.209338 +v -1.236416 -1.500000 -1.209338 +v 1.236416 -1.211657 -0.000000 +v 1.236416 -1.211656 -1.209338 +v 1.236416 -1.500000 -1.209338 +v 1.236416 -1.500000 -0.000000 +v 1.500000 -1.500000 -0.000000 +v 1.500000 -1.500000 -1.209338 +v 1.500000 -1.211656 -1.209338 +v 1.500000 -1.211657 -0.000000 +v 1.500000 -1.500000 1.209337 +v 1.236416 -1.500000 1.209337 +v -1.236416 -1.500000 -0.000000 +v -1.500000 -1.500000 1.209337 +v -1.500000 -1.500000 -0.000000 +v -1.500000 -1.500000 -1.209338 +v -1.236416 -1.211657 -0.000000 +v -1.236416 -1.211656 -1.209338 +v -1.500000 -1.211656 -1.209338 +v -1.500000 -1.211657 -0.000000 +v -1.500000 1.211657 0.000000 +v -1.500000 1.211657 -1.209337 +v -1.236416 1.211657 -1.209337 +v -1.236416 1.211657 0.000000 +v -1.236416 1.500000 0.000000 +v -1.236416 1.500000 -1.209337 +v -1.500000 1.500000 -1.209337 +v -1.500000 1.500000 0.000000 +v -1.500000 1.500000 1.209338 +v 1.500000 1.500000 -1.209337 +v 1.236416 1.500000 -1.209337 +v 1.236416 1.211657 -1.209337 +v 1.500000 1.211657 -1.209337 +v 1.236416 0.000000 -1.209337 +v 1.500000 0.000000 -1.209337 +v -1.500000 0.000000 -1.209337 +v -1.236416 0.000000 -1.209337 +v 0.000000 -1.211656 -1.209338 +v 0.000000 1.211657 -1.209337 +v 0.000000 1.211657 -1.500000 +v 0.000000 1.500000 -1.209337 +v 0.000000 1.500000 -1.500000 +v -1.236416 1.500000 -1.500000 +v 1.236416 1.500000 -1.500000 +v -1.500000 1.500000 -1.500000 +v 1.500000 1.500000 -1.500000 +v -1.500000 -1.500000 1.500000 +v -1.236416 -1.500000 1.500000 +v 0.000000 -1.211657 1.500000 +v -1.500000 -1.500000 -1.500000 +v 0.000000 -1.500000 1.500000 +v 1.236416 -1.500000 1.500000 +v 1.500000 -1.500000 1.500000 +v 1.236416 -1.500000 -1.500000 +v 1.500000 -1.500000 -1.500000 +v 1.500000 1.500000 0.000000 +v 1.500000 1.500000 1.209338 +v 1.236416 1.500000 1.209338 +v 1.236416 1.500000 0.000000 +v -1.236416 1.500000 1.209338 +v 0.000000 1.500000 1.209338 +v -1.236416 1.500000 1.500000 +v 0.000000 1.500000 1.500000 +v 1.236416 1.500000 1.500000 +v -1.500000 1.500000 1.500000 +v 1.500000 1.500000 1.500000 +v -1.236416 1.500000 0.000000 +v -1.236416 1.500000 -1.209337 +v -1.500000 1.500000 -1.209337 +v -1.500000 1.500000 0.000000 +v -1.500000 1.500000 1.209338 +v 1.500000 1.500000 -1.209337 +v 1.236416 1.500000 -1.209337 +v 0.000000 1.500000 -1.209337 +v 0.000000 1.500000 -1.500000 +v -1.236416 1.500000 -1.500000 +v 1.236416 1.500000 -1.500000 +v -1.500000 1.500000 -1.500000 +v 1.500000 1.500000 -1.500000 +v 0.000000 -1.500000 1.209337 +v 0.000000 -1.211657 1.209337 +v 0.000000 -1.211657 1.500000 +v 0.000000 -1.500000 1.500000 +v 1.236416 -1.211657 1.209337 +v -1.236416 -1.211657 1.209337 +v 0.000000 -1.211657 1.209337 +vn 0.000000 -1.000000 -0.000001 +vn 1.000000 0.000000 0.000000 +vn -1.000000 -0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000001 -1.000000 +vn 0.000000 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000001 +vn 0.000000 -0.000001 1.000000 +vn 0.000000 1.000000 0.000000 +s off +f 1//1 2//1 3//1 4//1 +f 2//2 1//2 5//2 6//2 +f 4//3 3//3 7//3 8//3 +f 9//4 10//4 11//4 12//4 +f 13//5 14//5 15//5 16//5 +f 17//4 18//4 19//4 20//4 +f 21//4 22//4 23//4 24//4 +f 25//5 26//5 27//5 28//5 +f 29//4 30//4 31//4 32//4 +f 32//3 31//3 26//3 25//3 +f 25//3 33//3 34//3 32//3 +f 32//6 34//6 35//6 29//6 +f 28//5 36//5 33//5 25//5 +f 24//4 37//4 38//4 21//4 +f 20//4 39//4 40//4 17//4 +f 16//5 41//5 42//5 13//5 +f 12//6 3//6 2//6 9//6 +f 9//2 2//2 41//2 16//2 +f 13//3 42//3 3//3 12//3 +f 43//4 44//4 30//4 45//4 +f 46//4 35//4 47//4 48//4 +f 99//7 100//7 133//7 132//7 +f 50//5 49//5 36//5 51//5 +f 51//5 42//5 52//5 50//5 +f 100//7 102//7 135//7 133//7 +f 48//4 7//4 3//4 46//4 +f 46//8 3//8 42//8 51//8 +f 49//5 53//5 33//5 36//5 +f 42//5 41//5 54//5 52//5 +f 86//7 53//7 122//7 128//7 +f 41//2 2//2 6//2 54//2 +f 55//4 56//4 22//4 57//4 +f 58//8 59//8 56//8 55//8 +f 60//3 61//3 62//3 63//3 +f 64//2 65//2 66//2 67//2 +f 67//9 66//9 61//9 60//9 +f 63//8 62//8 65//8 64//8 +f 64//8 68//8 69//8 63//8 +f 70//8 44//8 71//8 72//8 +f 72//8 73//8 59//8 70//8 +f 74//9 75//9 76//9 77//9 +f 78//8 79//8 80//8 81//8 +f 5//7 87//7 129//7 113//7 +f 54//7 6//7 114//7 123//7 +f 48//7 47//7 117//7 118//7 +f 87//7 103//7 136//7 129//7 +f 90//8 1//8 4//8 89//8 +f 1//2 90//2 87//2 5//2 +f 8//3 88//3 89//3 4//3 +f 20//3 19//3 61//3 91//3 +f 92//2 66//2 18//2 17//2 +f 91//10 61//10 66//10 92//10 +f 93//10 76//10 75//10 94//10 +f 24//3 23//3 76//3 93//3 +f 94//2 75//2 22//2 21//2 +f 21//2 38//2 80//2 94//2 +f 57//11 22//11 75//11 95//11 +f 96//8 80//8 38//8 97//8 +f 93//3 79//3 37//3 24//3 +f 94//5 80//5 79//5 93//5 +f 92//5 90//5 89//5 91//5 +f 17//2 40//2 90//2 92//2 +f 91//3 89//3 39//3 20//3 +f 95//5 75//5 59//5 58//5 +f 98//5 83//5 80//5 96//5 +f 103//7 101//7 134//7 136//7 +f 97//4 38//4 100//4 99//4 +f 99//4 101//4 39//4 97//4 +f 6//7 5//7 113//7 114//7 +f 96//5 89//5 88//5 98//5 +f 97//8 39//8 89//8 96//8 +f 38//4 37//4 102//4 100//4 +f 101//4 103//4 40//4 39//4 +f 7//7 48//7 118//7 115//7 +f 103//2 87//2 90//2 40//2 +f 26//3 31//3 71//3 104//3 +f 71//8 44//8 105//8 104//8 +f 28//2 27//2 30//2 29//2 +f 29//2 35//2 36//2 28//2 +f 74//2 30//2 44//2 70//2 +f 72//3 71//3 31//3 77//3 +f 77//11 31//11 30//11 74//11 +f 81//1 35//1 34//1 78//1 +f 78//3 34//3 86//3 85//3 +f 82//2 47//2 35//2 81//2 +f 45//11 30//11 27//11 106//11 +f 51//8 36//8 35//8 46//8 +f 102//7 84//7 126//7 135//7 +f 53//3 86//3 34//3 33//3 +f 107//3 73//3 76//3 23//3 +f 107//8 56//8 59//8 73//8 +f 70//2 59//2 75//2 74//2 +f 77//3 76//3 73//3 72//3 +f 85//3 84//3 79//3 78//3 +f 81//2 80//2 83//2 82//2 +f 88//7 8//7 116//7 130//7 +f 37//3 79//3 84//3 102//3 +f 60//11 11//11 10//11 67//11 +f 67//2 10//2 68//2 64//2 +f 63//3 69//3 11//3 60//3 +f 16//2 15//2 10//2 9//2 +f 12//3 11//3 14//3 13//3 +f 108//8 105//8 44//8 43//8 +f 106//5 27//5 105//5 108//5 +f 108//5 109//5 14//5 106//5 +f 43//8 69//8 109//8 108//8 +f 45//4 11//4 69//4 43//4 +f 106//11 14//11 11//11 45//11 +f 27//5 26//5 104//5 105//5 +f 109//5 110//5 15//5 14//5 +f 110//8 109//8 69//8 68//8 +f 110//2 68//2 10//2 15//2 +f 57//4 19//4 111//4 55//4 +f 55//8 111//8 62//8 58//8 +f 58//5 62//5 61//5 95//5 +f 95//11 61//11 19//11 57//11 +f 56//4 107//4 23//4 22//4 +f 19//4 18//4 112//4 111//4 +f 65//8 62//8 111//8 112//8 +f 18//2 66//2 65//2 112//2 +f 118//11 117//11 119//11 120//11 +f 120//11 121//11 115//11 118//11 +f 114//11 115//11 121//11 123//11 +f 124//11 125//11 126//11 127//11 +f 127//11 128//11 117//11 124//11 +f 116//11 115//11 114//11 113//11 +f 113//11 129//11 130//11 116//11 +f 132//11 133//11 125//11 131//11 +f 131//11 130//11 134//11 132//11 +f 136//11 134//11 130//11 129//11 +f 122//11 119//11 117//11 128//11 +f 126//11 125//11 133//11 135//11 +f 82//7 83//7 125//7 124//7 +f 49//7 50//7 120//7 119//7 +f 84//7 85//7 127//7 126//7 +f 50//7 52//7 121//7 120//7 +f 52//7 54//7 123//7 121//7 +f 53//7 49//7 119//7 122//7 +f 8//7 7//7 115//7 116//7 +f 85//7 86//7 128//7 127//7 +f 83//7 98//7 131//7 125//7 +f 47//7 82//7 124//7 117//7 +f 101//7 99//7 132//7 134//7 +f 98//7 88//7 130//7 131//7 +f 108//7 106//7 139//7 140//7 +f 45//7 43//7 137//7 138//7 +f 106//7 45//7 138//7 139//7 +f 43//7 108//7 140//7 137//7 +f 30//7 45//7 143//7 142//7 +f 45//7 11//7 141//7 143//7 +g holeycube.001 +v 0.037848 0.053616 0.680965 +v 0.414385 -0.152030 0.676229 +v 0.382376 -0.209100 0.609416 +v 0.005839 -0.003453 0.614153 +v 0.003506 -0.010911 0.752536 +v 0.380043 -0.216558 0.747800 +v 0.348034 -0.273628 0.680987 +v -0.028503 -0.067981 0.685724 +v 0.558694 0.119124 0.375479 +v 0.703003 0.390278 0.074730 +v 0.670994 0.333208 0.007917 +v 0.526685 0.062054 0.308667 +v 0.617185 0.012627 0.307529 +v 0.761494 0.283781 0.006779 +v 0.793503 0.340851 0.073591 +v 0.649194 0.069697 0.374341 +v -0.284880 0.579845 0.386090 +v -0.140571 0.850998 0.085340 +v -0.172580 0.793929 0.018528 +v -0.316889 0.522775 0.319277 +v -0.617185 -0.012627 -0.307529 +v -0.472876 0.258527 -0.608278 +v -0.504885 0.201457 -0.675091 +v -0.649194 -0.069697 -0.374341 +v 0.284880 -0.579845 -0.386090 +v 0.429189 -0.308690 -0.686840 +v 0.461198 -0.251621 -0.620027 +v 0.316889 -0.522775 -0.319277 +v 0.226389 -0.473348 -0.318139 +v 0.370698 -0.202194 -0.618889 +v 0.338689 -0.259263 -0.685701 +v 0.194380 -0.530418 -0.384952 +v 0.140571 -0.850998 -0.085340 +v 0.050071 -0.801571 -0.084202 +v 0.082080 -0.744502 -0.017389 +v 0.172580 -0.793929 -0.018528 +v -0.793503 -0.340851 -0.073591 +v -0.761494 -0.283781 -0.006779 +v -0.461198 0.251621 0.620027 +v -0.429189 0.308690 0.686840 +v 0.504885 -0.201457 0.675091 +v 0.472876 -0.258527 0.608278 +v 0.555187 0.130035 -0.377057 +v 0.405040 -0.137666 -0.690460 +v 0.520846 0.065507 -0.305486 +v 0.232228 -0.476801 0.296014 +v 0.047738 -0.809030 0.054181 +v 0.197886 -0.541329 0.367584 +v 0.138238 -0.858457 0.053043 +v 0.288386 -0.590756 0.366446 +v 0.322728 -0.526228 0.294875 +v 0.438534 -0.323055 0.679849 +v 0.106229 -0.915526 -0.013769 +v 0.470543 -0.265985 0.746662 +v -0.288386 0.590756 -0.366446 +v -0.438534 0.323055 -0.679849 +v -0.322728 0.526228 -0.294875 +v -0.197886 0.541329 -0.367584 +v -0.348034 0.273628 -0.680987 +v 0.294457 0.538855 0.012653 +v -0.082080 0.744502 0.017389 +v -0.047738 0.809030 -0.054181 +v 0.328799 0.603383 -0.058918 +v 0.360808 0.660452 0.007895 +v -0.015729 0.866099 0.012631 +v -0.050071 0.801571 0.084202 +v 0.326466 0.595925 0.079466 +v 0.737345 0.454805 0.003159 +v 0.705335 0.397736 -0.063654 +v 0.028503 0.067981 -0.685724 +v 0.373030 -0.194736 -0.757272 +v -0.003506 0.010911 -0.752536 +v -0.380043 0.216558 -0.747800 +v -0.005839 0.003453 -0.614153 +v -0.382376 0.209100 -0.609416 +v -0.414385 0.152030 -0.676229 +v -0.037848 -0.053616 -0.680965 +v -0.326466 -0.595925 -0.079466 +v -0.703003 -0.390278 -0.074730 +v -0.670994 -0.333208 -0.007917 +v -0.294457 -0.538855 -0.012653 +v -0.328799 -0.603383 0.058918 +v -0.705335 -0.397736 0.063654 +v -0.737345 -0.454805 -0.003159 +v -0.360808 -0.660452 -0.007895 +v 0.015729 -0.866099 -0.012631 +v -0.373030 0.194736 0.757272 +v -0.405040 0.137666 0.690460 +v -0.370698 0.202194 0.618889 +v -0.338689 0.259263 0.685701 +v -0.226389 0.473348 0.318139 +v -0.194380 0.530418 0.384952 +v -0.558694 -0.119124 -0.375479 +v -0.526685 -0.062054 -0.308667 +v -0.232228 0.476801 -0.296014 +v -0.520846 -0.065507 0.305486 +v -0.611346 -0.016080 0.306624 +v -0.555187 -0.130035 0.377057 +v -0.645688 -0.080608 0.378195 +v -0.795836 -0.348309 0.064792 +v -0.495540 0.187093 0.691598 +v -0.827845 -0.405378 -0.002021 +v -0.463531 0.244163 0.758410 +v 0.463531 -0.244163 -0.758410 +v 0.495540 -0.187093 -0.691598 +v 0.611346 0.016080 -0.306624 +v -0.470543 0.265985 -0.746662 +v 0.645688 0.080608 -0.378195 +v 0.795836 0.348309 -0.064792 +v 0.827845 0.405378 0.002021 +v -0.138238 0.858457 -0.053043 +v -0.106229 0.915526 0.013769 +v 0.003506 -0.010911 0.752536 +v 0.380043 -0.216558 0.747800 +v 0.348034 -0.273628 0.680987 +v -0.028503 -0.067981 0.685724 +v 0.047738 -0.809030 0.054181 +v 0.197886 -0.541329 0.367584 +v 0.138238 -0.858457 0.053043 +v 0.288386 -0.590756 0.366446 +v 0.438534 -0.323055 0.679849 +v 0.106229 -0.915526 -0.013769 +v 0.470543 -0.265985 0.746662 +v -0.328799 -0.603383 0.058918 +v -0.705335 -0.397736 0.063654 +v -0.737345 -0.454805 -0.003159 +v -0.360808 -0.660452 -0.007895 +v 0.015729 -0.866099 -0.012631 +v -0.373030 0.194736 0.757272 +v -0.405040 0.137666 0.690460 +v -0.555187 -0.130035 0.377057 +v -0.645688 -0.080608 0.378195 +v -0.795836 -0.348309 0.064792 +v -0.495540 0.187093 0.691598 +v -0.827845 -0.405378 -0.002021 +v -0.463531 0.244163 0.758410 +v 0.555187 0.130035 -0.377057 +v 0.520846 0.065507 -0.305486 +v 0.611346 0.016080 -0.306624 +v 0.645688 0.080608 -0.378195 +v 0.670994 0.333208 0.007917 +v 0.370698 -0.202194 -0.618889 +v 0.520846 0.065507 -0.305486 +vn 0.335692 0.630762 -0.699607 +vn 0.342281 0.610259 0.714442 +vn -0.342282 -0.610259 -0.714442 +vn -0.877584 0.479296 0.011038 +vn 0.877584 -0.479296 -0.011038 +vn -0.877584 0.479295 0.011038 +vn -0.342281 -0.610259 -0.714442 +vn -0.877584 0.479295 0.011039 +vn 0.877584 -0.479295 -0.011038 +vn 0.335693 0.630761 -0.699607 +vn -0.335692 -0.630762 0.699607 +vn 0.342282 0.610259 0.714442 +vn 0.877584 -0.479295 -0.011039 +vn -0.335693 -0.630761 0.699607 +vn -0.877584 0.479296 0.011039 +vn 0.335693 0.630761 -0.699608 +vn 0.877584 -0.479296 -0.011039 +vn -0.335693 -0.630761 0.699608 +s off +f 144//12 145//12 146//12 147//12 +f 145//13 144//13 148//13 149//13 +f 147//14 146//14 150//14 151//14 +f 152//15 153//15 154//15 155//15 +f 156//16 157//16 158//16 159//16 +f 160//15 161//15 162//15 163//15 +f 164//17 165//17 166//17 167//17 +f 168//16 169//16 170//16 171//16 +f 172//15 173//15 174//15 175//15 +f 175//18 174//18 169//18 168//18 +f 168//14 176//14 177//14 175//14 +f 175//19 177//19 178//19 172//19 +f 171//16 179//16 176//16 168//16 +f 167//15 180//15 181//15 164//15 +f 163//15 182//15 183//15 160//15 +f 159//20 184//20 185//20 156//20 +f 155//19 146//19 145//19 152//19 +f 152//13 145//13 184//13 159//13 +f 156//18 185//18 146//18 155//18 +f 186//15 187//15 173//15 188//15 +f 189//15 178//15 190//15 191//15 +f 242//7 243//7 276//7 275//7 +f 193//16 192//16 179//16 194//16 +f 194//16 185//16 195//16 193//16 +f 243//7 245//7 278//7 276//7 +f 191//15 150//15 146//15 189//15 +f 189//21 146//21 185//21 194//21 +f 192//16 196//16 176//16 179//16 +f 185//16 184//16 197//16 195//16 +f 229//7 196//7 265//7 271//7 +f 184//13 145//13 149//13 197//13 +f 198//15 199//15 165//15 200//15 +f 201//21 202//21 199//21 198//21 +f 203//18 204//18 205//18 206//18 +f 207//13 208//13 209//13 210//13 +f 210//22 209//22 204//22 203//22 +f 206//21 205//21 208//21 207//21 +f 207//21 211//21 212//21 206//21 +f 213//21 187//21 214//21 215//21 +f 215//21 216//21 202//21 213//21 +f 217//22 218//22 219//22 220//22 +f 221//21 222//21 223//21 224//21 +f 148//7 230//7 272//7 256//7 +f 197//7 149//7 257//7 266//7 +f 191//7 190//7 260//7 261//7 +f 230//7 246//7 279//7 272//7 +f 233//21 144//21 147//21 232//21 +f 144//13 233//13 230//13 148//13 +f 151//14 231//14 232//14 147//14 +f 163//18 162//18 204//18 234//18 +f 235//23 209//23 161//23 160//23 +f 234//24 204//24 209//24 235//24 +f 236//24 219//24 218//24 237//24 +f 167//18 166//18 219//18 236//18 +f 237//13 218//13 165//13 164//13 +f 164//13 181//13 223//13 237//13 +f 200//25 165//25 218//25 238//25 +f 239//21 223//21 181//21 240//21 +f 236//14 222//14 180//14 167//14 +f 237//16 223//16 222//16 236//16 +f 235//16 233//16 232//16 234//16 +f 160//13 183//13 233//13 235//13 +f 234//18 232//18 182//18 163//18 +f 238//16 218//16 202//16 201//16 +f 241//16 226//16 223//16 239//16 +f 246//7 244//7 277//7 279//7 +f 240//15 181//15 243//15 242//15 +f 242//15 244//15 182//15 240//15 +f 149//7 148//7 256//7 257//7 +f 239//16 232//16 231//16 241//16 +f 240//21 182//21 232//21 239//21 +f 181//26 180//26 245//26 243//26 +f 244//15 246//15 183//15 182//15 +f 150//7 191//7 261//7 258//7 +f 246//13 230//13 233//13 183//13 +f 169//18 174//18 214//18 247//18 +f 214//21 187//21 248//21 247//21 +f 171//13 170//13 173//13 172//13 +f 172//13 178//13 179//13 171//13 +f 217//23 173//23 187//23 213//23 +f 215//18 214//18 174//18 220//18 +f 220//25 174//25 173//25 217//25 +f 224//12 178//12 177//12 221//12 +f 221//18 177//18 229//18 228//18 +f 225//13 190//13 178//13 224//13 +f 188//25 173//25 170//25 249//25 +f 194//21 179//21 178//21 189//21 +f 245//7 227//7 269//7 278//7 +f 196//14 229//14 177//14 176//14 +f 250//18 216//18 219//18 166//18 +f 250//27 199//27 202//27 216//27 +f 213//23 202//23 218//23 217//23 +f 220//18 219//18 216//18 215//18 +f 228//18 227//18 222//18 221//18 +f 224//13 223//13 226//13 225//13 +f 231//7 151//7 259//7 273//7 +f 180//14 222//14 227//14 245//14 +f 203//25 154//25 153//25 210//25 +f 210//13 153//13 211//13 207//13 +f 206//18 212//18 154//18 203//18 +f 159//23 158//23 153//23 152//23 +f 155//18 154//18 157//18 156//18 +f 251//21 248//21 187//21 186//21 +f 249//16 170//16 248//16 251//16 +f 251//16 252//16 157//16 249//16 +f 186//21 212//21 252//21 251//21 +f 188//15 154//15 212//15 186//15 +f 249//25 157//25 154//25 188//25 +f 170//16 169//16 247//16 248//16 +f 252//28 253//28 158//28 157//28 +f 253//21 252//21 212//21 211//21 +f 253//23 211//23 153//23 158//23 +f 200//15 162//15 254//15 198//15 +f 198//21 254//21 205//21 201//21 +f 201//16 205//16 204//16 238//16 +f 238//25 204//25 162//25 200//25 +f 199//15 250//15 166//15 165//15 +f 162//15 161//15 255//15 254//15 +f 208//21 205//21 254//21 255//21 +f 161//23 209//23 208//23 255//23 +f 261//25 260//25 262//25 263//25 +f 263//25 264//25 258//25 261//25 +f 257//29 258//29 264//29 266//29 +f 267//25 268//25 269//25 270//25 +f 270//25 271//25 260//25 267//25 +f 259//25 258//25 257//25 256//25 +f 256//25 272//25 273//25 259//25 +f 275//25 276//25 268//25 274//25 +f 274//25 273//25 277//25 275//25 +f 279//25 277//25 273//25 272//25 +f 265//25 262//25 260//25 271//25 +f 269//25 268//25 276//25 278//25 +f 225//7 226//7 268//7 267//7 +f 192//7 193//7 263//7 262//7 +f 227//7 228//7 270//7 269//7 +f 193//7 195//7 264//7 263//7 +f 195//7 197//7 266//7 264//7 +f 196//7 192//7 262//7 265//7 +f 151//7 150//7 258//7 259//7 +f 228//7 229//7 271//7 270//7 +f 226//7 241//7 274//7 268//7 +f 190//7 225//7 267//7 260//7 +f 244//7 242//7 275//7 277//7 +f 241//7 231//7 273//7 274//7 +f 251//7 249//7 282//7 283//7 +f 188//7 186//7 280//7 281//7 +f 249//7 188//7 281//7 282//7 +f 186//7 251//7 283//7 280//7 +f 173//7 188//7 286//7 285//7 +f 188//7 154//7 284//7 286//7 +g holeycube.002 +v 0.369385 2.003562 1.792544 +v 0.963329 0.880686 2.925211 +v 0.707927 0.635014 2.815589 +v 0.113983 1.757890 1.682922 +v 0.111409 2.147654 2.070667 +v 0.705351 1.024778 3.203335 +v 0.449950 0.779106 3.093713 +v -0.143993 1.901982 1.961045 +v 2.047380 0.275193 1.756502 +v 3.131433 -0.330301 0.587792 +v 2.876031 -0.575973 0.478171 +v 1.791978 0.029521 1.646880 +v 1.934732 -0.240361 1.919116 +v 3.018785 -0.845855 0.750406 +v 3.274187 -0.600183 0.860028 +v 2.190134 0.005311 2.028738 +v 0.716742 2.790825 -0.781068 +v 1.800794 2.185331 -1.949777 +v 1.545392 1.939659 -2.059399 +v 0.461340 2.545153 -0.890690 +v -1.934732 0.240361 -1.919116 +v -0.850680 -0.365133 -3.087824 +v -1.106082 -0.610805 -3.197446 +v -2.190134 -0.005311 -2.028738 +v -0.716742 -2.790825 0.781068 +v 0.367311 -3.396319 -0.387641 +v 0.622713 -3.150647 -0.278019 +v -0.461340 -2.545153 0.890690 +v -0.604093 -2.275271 0.618455 +v 0.479959 -2.880765 -0.550255 +v 0.224557 -3.126437 -0.659877 +v -0.859495 -2.520943 0.508833 +v -1.800794 -2.185331 1.949777 +v -1.943547 -1.915450 1.677542 +v -1.688145 -1.669778 1.787164 +v -1.545392 -1.939659 2.059399 +v -3.274187 0.600183 -0.860028 +v -3.018785 0.845855 -0.750406 +v -0.622713 3.150647 0.278019 +v -0.367311 3.396319 0.387641 +v 1.106082 0.610805 3.197446 +v 0.850680 0.365133 3.087824 +v 1.935972 -1.872461 -0.314165 +v 0.737936 -3.024857 -0.828377 +v 1.677995 -1.728369 -0.036042 +v -0.490109 -0.517382 2.301377 +v -1.946122 -1.525685 2.065288 +v -0.748086 -0.373290 2.579500 +v -1.803369 -1.795566 2.337522 +v -0.605333 -0.643171 2.851735 +v -0.347356 -0.787263 2.573611 +v 0.592703 0.509225 3.365948 +v -2.058771 -2.041239 2.227901 +v 0.848105 0.754897 3.475569 +v 0.605333 0.643171 -2.851735 +v -0.592703 -0.509225 -3.365948 +v 0.347356 0.787263 -2.573611 +v 0.748086 0.373290 -2.579500 +v -0.449950 -0.779106 -3.093713 +v 2.282089 0.546902 -0.654497 +v 1.688145 1.669778 -1.787164 +v 1.946122 1.525685 -2.065288 +v 2.540065 0.402810 -0.932619 +v 2.795467 0.648482 -0.822998 +v 2.201524 1.771358 -1.955666 +v 1.943547 1.915450 -1.677542 +v 2.537491 0.792574 -0.544875 +v 3.389409 -0.474393 0.309670 +v 3.134007 -0.720065 0.200048 +v 0.143993 -1.901982 -1.961045 +v 0.482534 -3.270529 -0.937999 +v -0.111409 -2.147654 -2.070667 +v -0.705351 -1.024778 -3.203335 +v -0.113983 -1.757890 -1.682922 +v -0.707927 -0.635014 -2.815589 +v -0.963329 -0.880686 -2.925211 +v -0.369385 -2.003562 -1.792544 +v -2.537491 -0.792574 0.544875 +v -3.131433 0.330301 -0.587792 +v -2.876031 0.575973 -0.478171 +v -2.282089 -0.546902 0.654497 +v -2.540065 -0.402810 0.932619 +v -3.134007 0.720065 -0.200048 +v -3.389409 0.474393 -0.309670 +v -2.795467 -0.648482 0.822998 +v -2.201524 -1.771358 1.955666 +v -0.482534 3.270529 0.937999 +v -0.737936 3.024857 0.828377 +v -0.479959 2.880765 0.550255 +v -0.224557 3.126437 0.659877 +v 0.604093 2.275271 -0.618455 +v 0.859495 2.520943 -0.508833 +v -2.047380 -0.275193 -1.756502 +v -1.791978 -0.029521 -1.646880 +v 0.490109 0.517382 -2.301377 +v -1.677995 1.728369 0.036042 +v -1.820749 1.998251 -0.236193 +v -1.935972 1.872461 0.314165 +v -2.078725 2.142343 0.041929 +v -3.276761 0.989947 -0.472284 +v -0.880689 3.294739 0.556142 +v -3.532163 0.744275 -0.581905 +v -0.625287 3.540411 0.665764 +v 0.625287 -3.540411 -0.665764 +v 0.880689 -3.294739 -0.556142 +v 1.820749 -1.998251 0.236193 +v -0.848105 -0.754897 -3.475569 +v 2.078725 -2.142343 -0.041929 +v 3.276761 -0.989947 0.472284 +v 3.532163 -0.744275 0.581905 +v 1.803369 1.795566 -2.337522 +v 2.058771 2.041239 -2.227901 +v 0.111409 2.147654 2.070667 +v 0.705351 1.024778 3.203335 +v 0.449950 0.779106 3.093713 +v -0.143993 1.901982 1.961045 +v -1.946122 -1.525685 2.065288 +v -0.748086 -0.373290 2.579500 +v -1.803369 -1.795566 2.337522 +v -0.605333 -0.643171 2.851735 +v 0.592703 0.509225 3.365948 +v -2.058771 -2.041239 2.227901 +v 0.848105 0.754897 3.475569 +v -2.540065 -0.402810 0.932619 +v -3.134007 0.720065 -0.200048 +v -3.389409 0.474393 -0.309670 +v -2.795467 -0.648482 0.822998 +v -2.201524 -1.771358 1.955666 +v -0.482534 3.270529 0.937999 +v -0.737936 3.024857 0.828377 +v -1.935972 1.872461 0.314165 +v -2.078725 2.142343 0.041929 +v -3.276761 0.989947 -0.472284 +v -0.880689 3.294739 0.556142 +v -3.532163 0.744275 -0.581905 +v -0.625287 3.540411 0.665764 +v 1.935972 -1.872461 -0.314165 +v 1.677995 -1.728369 -0.036042 +v 1.820749 -1.998251 0.236193 +v 2.078725 -2.142343 -0.041929 +v 2.876031 -0.575973 0.478171 +v 0.479959 -2.880765 -0.550255 +v 1.677995 -1.728369 -0.036042 +vn 0.635737 -0.355088 -0.685384 +vn 0.688513 0.662283 0.295519 +vn -0.688513 -0.662283 -0.295518 +vn -0.348983 0.659767 -0.665521 +vn 0.348982 -0.659767 0.665521 +vn -0.348982 0.659767 -0.665521 +vn 0.348982 -0.659768 0.665521 +vn -0.688513 -0.662283 -0.295519 +vn 0.348983 -0.659767 0.665521 +vn -0.348982 0.659768 -0.665521 +vn 0.688513 0.662283 0.295518 +vn 0.635737 -0.355089 -0.685383 +vn -0.635737 0.355088 0.685384 +vn 0.688512 0.662283 0.295519 +vn -0.635737 0.355089 0.685383 +vn -0.688512 -0.662283 -0.295519 +vn 0.635737 -0.355089 -0.685384 +vn -0.635737 0.355089 0.685384 +s off +f 287//30 288//30 289//30 290//30 +f 288//31 287//31 291//31 292//31 +f 290//32 289//32 293//32 294//32 +f 295//33 296//33 297//33 298//33 +f 299//34 300//34 301//34 302//34 +f 303//33 304//33 305//33 306//33 +f 307//35 308//35 309//35 310//35 +f 311//36 312//36 313//36 314//36 +f 315//35 316//35 317//35 318//35 +f 318//37 317//37 312//37 311//37 +f 311//37 319//37 320//37 318//37 +f 318//33 320//33 321//33 315//33 +f 314//38 322//38 319//38 311//38 +f 310//35 323//35 324//35 307//35 +f 306//39 325//39 326//39 303//39 +f 302//34 327//34 328//34 299//34 +f 298//33 289//33 288//33 295//33 +f 295//40 288//40 327//40 302//40 +f 299//37 328//37 289//37 298//37 +f 329//33 330//33 316//33 331//33 +f 332//33 321//33 333//33 334//33 +f 385//7 386//7 419//7 418//7 +f 336//38 335//38 322//38 337//38 +f 337//38 328//38 338//38 336//38 +f 386//7 388//7 421//7 419//7 +f 334//33 293//33 289//33 332//33 +f 332//41 289//41 328//41 337//41 +f 335//38 339//38 319//38 322//38 +f 328//38 327//38 340//38 338//38 +f 372//7 339//7 408//7 414//7 +f 327//31 288//31 292//31 340//31 +f 341//33 342//33 308//33 343//33 +f 344//41 345//41 342//41 341//41 +f 346//32 347//32 348//32 349//32 +f 350//40 351//40 352//40 353//40 +f 353//42 352//42 347//42 346//42 +f 349//41 348//41 351//41 350//41 +f 350//41 354//41 355//41 349//41 +f 356//41 330//41 357//41 358//41 +f 358//41 359//41 345//41 356//41 +f 360//42 361//42 362//42 363//42 +f 364//41 365//41 366//41 367//41 +f 291//7 373//7 415//7 399//7 +f 340//7 292//7 400//7 409//7 +f 334//7 333//7 403//7 404//7 +f 373//7 389//7 422//7 415//7 +f 376//41 287//41 290//41 375//41 +f 287//43 376//43 373//43 291//43 +f 294//37 374//37 375//37 290//37 +f 306//37 305//37 347//37 377//37 +f 378//31 352//31 304//31 303//31 +f 377//38 347//38 352//38 378//38 +f 379//38 362//38 361//38 380//38 +f 310//32 309//32 362//32 379//32 +f 380//31 361//31 308//31 307//31 +f 307//31 324//31 366//31 380//31 +f 343//44 308//44 361//44 381//44 +f 382//41 366//41 324//41 383//41 +f 379//32 365//32 323//32 310//32 +f 380//38 366//38 365//38 379//38 +f 378//34 376//34 375//34 377//34 +f 303//31 326//31 376//31 378//31 +f 377//37 375//37 325//37 306//37 +f 381//38 361//38 345//38 344//38 +f 384//38 369//38 366//38 382//38 +f 389//7 387//7 420//7 422//7 +f 383//33 324//33 386//33 385//33 +f 385//33 387//33 325//33 383//33 +f 292//7 291//7 399//7 400//7 +f 382//38 375//38 374//38 384//38 +f 383//41 325//41 375//41 382//41 +f 324//33 323//33 388//33 386//33 +f 387//35 389//35 326//35 325//35 +f 293//7 334//7 404//7 401//7 +f 389//43 373//43 376//43 326//43 +f 312//45 317//45 357//45 390//45 +f 357//46 330//46 391//46 390//46 +f 314//31 313//31 316//31 315//31 +f 315//31 321//31 322//31 314//31 +f 360//31 316//31 330//31 356//31 +f 358//45 357//45 317//45 363//45 +f 363//44 317//44 316//44 360//44 +f 367//30 321//30 320//30 364//30 +f 364//32 320//32 372//32 371//32 +f 368//40 333//40 321//40 367//40 +f 331//44 316//44 313//44 392//44 +f 337//46 322//46 321//46 332//46 +f 388//7 370//7 412//7 421//7 +f 339//32 372//32 320//32 319//32 +f 393//37 359//37 362//37 309//37 +f 393//41 342//41 345//41 359//41 +f 356//40 345//40 361//40 360//40 +f 363//37 362//37 359//37 358//37 +f 371//32 370//32 365//32 364//32 +f 367//40 366//40 369//40 368//40 +f 374//7 294//7 402//7 416//7 +f 323//32 365//32 370//32 388//32 +f 346//44 297//44 296//44 353//44 +f 353//40 296//40 354//40 350//40 +f 349//32 355//32 297//32 346//32 +f 302//40 301//40 296//40 295//40 +f 298//37 297//37 300//37 299//37 +f 394//41 391//41 330//41 329//41 +f 392//38 313//38 391//38 394//38 +f 394//38 395//38 300//38 392//38 +f 329//41 355//41 395//41 394//41 +f 331//33 297//33 355//33 329//33 +f 392//44 300//44 297//44 331//44 +f 313//34 312//34 390//34 391//34 +f 395//38 396//38 301//38 300//38 +f 396//41 395//41 355//41 354//41 +f 396//40 354//40 296//40 301//40 +f 343//33 305//33 397//33 341//33 +f 341//41 397//41 348//41 344//41 +f 344//38 348//38 347//38 381//38 +f 381//47 347//47 305//47 343//47 +f 342//33 393//33 309//33 308//33 +f 305//33 304//33 398//33 397//33 +f 351//41 348//41 397//41 398//41 +f 304//40 352//40 351//40 398//40 +f 404//44 403//44 405//44 406//44 +f 406//44 407//44 401//44 404//44 +f 400//44 401//44 407//44 409//44 +f 410//44 411//44 412//44 413//44 +f 413//44 414//44 403//44 410//44 +f 402//44 401//44 400//44 399//44 +f 399//44 415//44 416//44 402//44 +f 418//44 419//44 411//44 417//44 +f 417//44 416//44 420//44 418//44 +f 422//47 420//47 416//47 415//47 +f 408//44 405//44 403//44 414//44 +f 412//44 411//44 419//44 421//44 +f 368//7 369//7 411//7 410//7 +f 335//7 336//7 406//7 405//7 +f 370//7 371//7 413//7 412//7 +f 336//7 338//7 407//7 406//7 +f 338//7 340//7 409//7 407//7 +f 339//7 335//7 405//7 408//7 +f 294//7 293//7 401//7 402//7 +f 371//7 372//7 414//7 413//7 +f 369//7 384//7 417//7 411//7 +f 333//7 368//7 410//7 403//7 +f 387//7 385//7 418//7 420//7 +f 384//7 374//7 416//7 417//7 +f 394//7 392//7 425//7 426//7 +f 331//7 329//7 423//7 424//7 +f 392//7 331//7 424//7 425//7 +f 329//7 394//7 426//7 423//7 +f 316//7 331//7 429//7 428//7 +f 331//7 297//7 427//7 429//7 diff --git a/examples/16-shadowmaps/makefile b/examples/16-shadowmaps/makefile new file mode 100644 index 000000000..6525ae16a --- /dev/null +++ b/examples/16-shadowmaps/makefile @@ -0,0 +1,22 @@ +# +# Copyright 2013 Dario Manesku. All rights reserved. +# License: http://www.opensource.org/licenses/BSD-2-Clause +# + +BGFX_DIR=../.. +RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build + +include $(BGFX_DIR)/premake/shader.mk + +geometry: ../runtime/meshes/column.bin + +../runtime/meshes/column.bin: column.obj + ../../tools/bin/geometryc -f column.obj -o ../runtime/meshes/column.bin --packnormal 1 + +rebuild: + @make -s --no-print-directory TARGET=0 clean all + @make -s --no-print-directory TARGET=1 clean all + @make -s --no-print-directory TARGET=2 clean all + @make -s --no-print-directory TARGET=3 clean all + @make -s --no-print-directory TARGET=4 clean all diff --git a/examples/16-shadowmaps/shadowmaps.cpp b/examples/16-shadowmaps/shadowmaps.cpp new file mode 100644 index 000000000..1ba57667c --- /dev/null +++ b/examples/16-shadowmaps/shadowmaps.cpp @@ -0,0 +1,3296 @@ +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include +#include +#include + +#include "common.h" + +#include +#include +#include +#include "entry/entry.h" +#include "entry/camera.h" +#include "fpumath.h" +#include "imgui/imgui.h" + +#define RENDER_PASS_0 1 +#define RENDER_PASS_1 2 +#define RENDER_PASS_2 3 +#define RENDER_PASS_3 4 +#define RENDER_PASS_4 5 +#define RENDER_PASS_5 6 +#define RENDER_PASS_6 7 +#define RENDER_PASS_7 8 +#define RENDER_PASS_8 9 +#define RENDER_PASS_9 10 +#define RENDER_PASS_10 11 +#define RENDER_PASS_11 12 +#define RENDER_PASS_12 13 +#define RENDER_PASS_13 14 +#define RENDER_PASS_14 15 +#define RENDER_PASS_15 16 +#define RENDER_PASS_16 17 +#define RENDER_PASS_17 18 +#define RENDER_PASS_18 19 + +uint32_t packUint32(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) +{ + union + { + uint32_t ui32; + uint8_t arr[4]; + } un; + + un.arr[0] = _x; + un.arr[1] = _y; + un.arr[2] = _z; + un.arr[3] = _w; + + return un.ui32; +} + +uint32_t packF4u(float _x, float _y = 0.0f, float _z = 0.0f, float _w = 0.0f) +{ + const uint8_t xx = uint8_t(_x*127.0f + 128.0f); + const uint8_t yy = uint8_t(_y*127.0f + 128.0f); + const uint8_t zz = uint8_t(_z*127.0f + 128.0f); + const uint8_t ww = uint8_t(_w*127.0f + 128.0f); + return packUint32(xx, yy, zz, ww); +} + +struct LightType +{ + enum Enum + { + SpotLight = 0, + PointLight = 1, + DirectionalLight = 2, + + Count + }; + +}; + +struct DepthImpl +{ + enum Enum + { + InvZ = 0, + Linear = 1, + + Count + }; +}; + +struct PackDepth +{ + enum Enum + { + RGBA = 0, + VSM = 1, + + Count + }; +}; + +struct SmImpl +{ + enum Enum + { + Hard = 0, + PCF = 1, + VSM = 2, + ESM = 3, + + Count + }; +}; + +struct SmType +{ + enum Enum + { + Single = 0, + Omni = 1, + Cascade = 2, + + Count + }; +}; + +struct TetrahedronFaces +{ + enum Enum + { + Green = 0, + Yellow = 1, + Blue = 2, + Red = 3, + + Count = 4 + }; +}; + +struct ProjType +{ + enum Enum + { + Horizontal = 0, + Vertical = 1, + + Count + }; +}; + +struct ShadowMapRenderTargets +{ + enum Enum + { + First = 0, + Second = 1, + Third = 2, + Fourth = 3, + + Count + }; +}; + +void imguiEnum(SmImpl::Enum& _enum) +{ + if (imguiCheck("Hard", SmImpl::Hard == _enum) ) + { + _enum = SmImpl::Hard; + } + + if (imguiCheck("PCF", SmImpl::PCF == _enum) ) + { + _enum = SmImpl::PCF; + } + + if (imguiCheck("VSM", SmImpl::VSM == _enum) ) + { + _enum = SmImpl::VSM; + } + + if (imguiCheck("ESM", SmImpl::ESM == _enum) ) + { + _enum = SmImpl::ESM; + } +} + +void imguiEnum(DepthImpl::Enum& _enum) +{ + if (imguiCheck("InvZ", DepthImpl::InvZ == _enum) ) + { + _enum = DepthImpl::InvZ; + } + + if (imguiCheck("Linear", DepthImpl::Linear == _enum) ) + { + _enum = DepthImpl::Linear; + } +} + +void imguiEnum(LightType::Enum& _enum) +{ + if (imguiCheck("Spot light", LightType::SpotLight == _enum) ) + { + _enum = LightType::SpotLight; + } + + if (imguiCheck("Point light", LightType::PointLight == _enum) ) + { + _enum = LightType::PointLight; + } + + if (imguiCheck("Directional light", LightType::DirectionalLight == _enum) ) + { + _enum = LightType::DirectionalLight; + } +} + +void imguiBool(const char* _str, bool& _flag, bool _enabled = true) +{ + if (imguiCheck(_str, _flag, _enabled) ) + { + _flag = !_flag; + } +} + +struct PosNormalTexcoordVertex +{ + float m_x; + float m_y; + float m_z; + uint32_t m_normal; + float m_u; + float m_v; +}; + +static const float s_texcoord = 5.0f; +static const uint32_t s_numHPlaneVertices = 4; +static PosNormalTexcoordVertex s_hplaneVertices[s_numHPlaneVertices] = +{ + { -1.0f, 0.0f, 1.0f, packF4u(0.0f, 1.0f, 0.0f), s_texcoord, s_texcoord }, + { 1.0f, 0.0f, 1.0f, packF4u(0.0f, 1.0f, 0.0f), s_texcoord, 0.0f }, + { -1.0f, 0.0f, -1.0f, packF4u(0.0f, 1.0f, 0.0f), 0.0f, s_texcoord }, + { 1.0f, 0.0f, -1.0f, packF4u(0.0f, 1.0f, 0.0f), 0.0f, 0.0f }, +}; + +static const uint32_t s_numVPlaneVertices = 4; +static PosNormalTexcoordVertex s_vplaneVertices[s_numVPlaneVertices] = +{ + { -1.0f, 1.0f, 0.0f, packF4u(0.0f, 0.0f, -1.0f), 1.0f, 1.0f }, + { 1.0f, 1.0f, 0.0f, packF4u(0.0f, 0.0f, -1.0f), 1.0f, 0.0f }, + { -1.0f, -1.0f, 0.0f, packF4u(0.0f, 0.0f, -1.0f), 0.0f, 1.0f }, + { 1.0f, -1.0f, 0.0f, packF4u(0.0f, 0.0f, -1.0f), 0.0f, 0.0f }, +}; + +static const uint32_t s_numPlaneIndices = 6; +static const uint16_t s_planeIndices[s_numPlaneIndices] = +{ + 0, 1, 2, + 1, 3, 2, +}; + +static const char* s_shaderPath = NULL; +static bool s_flipV = false; +static float s_texelHalf = 0.0f; + +static bgfx::UniformHandle u_texColor; +static bgfx::UniformHandle u_shadowMap[ShadowMapRenderTargets::Count]; +static bgfx::RenderTargetHandle s_rtShadowMap[ShadowMapRenderTargets::Count]; +static bgfx::RenderTargetHandle s_rtBlur; + +static void shaderFilePath(char* _out, const char* _name) +{ + strcpy(_out, s_shaderPath); + strcat(_out, _name); + strcat(_out, ".bin"); +} + +long int fsize(FILE* _file) +{ + long int pos = ftell(_file); + fseek(_file, 0L, SEEK_END); + long int size = ftell(_file); + fseek(_file, pos, SEEK_SET); + return size; +} + +static const bgfx::Memory* load(const char* _filePath) +{ + FILE* file = fopen(_filePath, "rb"); + if (NULL != file) + { + uint32_t size = (uint32_t)fsize(file); + const bgfx::Memory* mem = bgfx::alloc(size+1); + size_t ignore = fread(mem->data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + mem->data[mem->size-1] = '\0'; + return mem; + } + + return NULL; +} + +static const bgfx::Memory* loadShader(const char* _name) +{ + char filePath[512]; + shaderFilePath(filePath, _name); + return load(filePath); +} + +static const bgfx::Memory* loadTexture(const char* _name) +{ + char filePath[512]; + strcpy(filePath, "textures/"); + strcat(filePath, _name); + return load(filePath); +} + +static bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName) +{ + const bgfx::Memory* mem; + + // Load vertex shader. + mem = loadShader(_vsName); + bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem); + + // Load fragment shader. + mem = loadShader(_fsName); + bgfx::FragmentShaderHandle fsh = bgfx::createFragmentShader(mem); + + // Create program from shaders. + bgfx::ProgramHandle program = bgfx::createProgram(vsh, fsh); + + // We can destroy vertex and fragment shader here since + // their reference is kept inside bgfx after calling createProgram. + // Vertex and fragment shader will be destroyed once program is + // destroyed. + bgfx::destroyVertexShader(vsh); + bgfx::destroyFragmentShader(fsh); + + return program; +} + +void mtxScaleRotateTranslate(float* _result + , const float _scaleX + , const float _scaleY + , const float _scaleZ + , const float _rotX + , const float _rotY + , const float _rotZ + , const float _translateX + , const float _translateY + , const float _translateZ + ) +{ + float mtxRotateTranslate[16]; + float mtxScale[16]; + + mtxRotateXYZ(mtxRotateTranslate, _rotX, _rotY, _rotZ); + mtxRotateTranslate[12] = _translateX; + mtxRotateTranslate[13] = _translateY; + mtxRotateTranslate[14] = _translateZ; + + memset(mtxScale, 0, sizeof(float)*16); + mtxScale[0] = _scaleX; + mtxScale[5] = _scaleY; + mtxScale[10] = _scaleZ; + mtxScale[15] = 1.0f; + + mtxMul(_result, mtxScale, mtxRotateTranslate); +} + +void mtxBillboard(float* __restrict _result + , const float* __restrict _view + , const float* __restrict _pos + , const float* __restrict _scale) +{ + _result[ 0] = _view[0] * _scale[0]; + _result[ 1] = _view[4] * _scale[0]; + _result[ 2] = _view[8] * _scale[0]; + _result[ 3] = 0.0f; + _result[ 4] = _view[1] * _scale[1]; + _result[ 5] = _view[5] * _scale[1]; + _result[ 6] = _view[9] * _scale[1]; + _result[ 7] = 0.0f; + _result[ 8] = _view[2] * _scale[2]; + _result[ 9] = _view[6] * _scale[2]; + _result[10] = _view[10] * _scale[2]; + _result[11] = 0.0f; + _result[12] = _pos[0]; + _result[13] = _pos[1]; + _result[14] = _pos[2]; + _result[15] = 1.0f; +} + +void mtxYawPitchRoll(float* __restrict _result + , float _yaw + , float _pitch + , float _roll + ) +{ + float sroll = sinf(_roll); + float croll = cosf(_roll); + float spitch = sinf(_pitch); + float cpitch = cosf(_pitch); + float syaw = sinf(_yaw); + float cyaw = cosf(_yaw); + + _result[ 0] = sroll * spitch * syaw + croll * cyaw; + _result[ 1] = sroll * cpitch; + _result[ 2] = sroll * spitch * cyaw - croll * syaw; + _result[ 3] = 0.0f; + _result[ 4] = croll * spitch * syaw - sroll * cyaw; + _result[ 5] = croll * cpitch; + _result[ 6] = croll * spitch * cyaw + sroll * syaw; + _result[ 7] = 0.0f; + _result[ 8] = cpitch * syaw; + _result[ 9] = -spitch; + _result[10] = cpitch * cyaw; + _result[11] = 0.0f; + _result[12] = 0.0f; + _result[13] = 0.0f; + _result[14] = 0.0f; + _result[15] = 1.0f; +} + +struct Material +{ + union Ambient + { + struct + { + float m_r; + float m_g; + float m_b; + float m_unused; + }; + + float m_v[4]; + }; + + union Diffuse + { + struct + { + float m_r; + float m_g; + float m_b; + float m_unused; + }; + + float m_v[4]; + }; + + union Specular + { + struct + { + float m_r; + float m_g; + float m_b; + float m_ns; + }; + + float m_v[4]; + }; + + Ambient m_ka; + Diffuse m_kd; + Specular m_ks; +}; + +struct Light +{ + union Position + { + struct + { + float m_x; + float m_y; + float m_z; + float m_w; + }; + + float m_v[4]; + }; + + union LightRgbPower + { + struct + { + float m_r; + float m_g; + float m_b; + float m_power; + }; + + float m_v[4]; + }; + + union SpotDirectionInner + { + struct + { + float m_x; + float m_y; + float m_z; + float m_inner; + }; + + float m_v[4]; + }; + + union AttenuationSpotOuter + { + struct + { + float m_attnConst; + float m_attnLinear; + float m_attnQuadrantic; + float m_outer; + }; + + float m_v[4]; + }; + + void computeViewSpaceComponents(float* _viewMtx) + { + vec4MulMtx(m_position_viewSpace, m_position.m_v, _viewMtx); + + float tmp[] = + { + m_spotDirectionInner.m_x + , m_spotDirectionInner.m_y + , m_spotDirectionInner.m_z + , 0.0f + }; + vec4MulMtx(m_spotDirectionInner_viewSpace, tmp, _viewMtx); + m_spotDirectionInner_viewSpace[3] = m_spotDirectionInner.m_v[3]; + } + + Position m_position; + float m_position_viewSpace[4]; + LightRgbPower m_ambientPower; + LightRgbPower m_diffusePower; + LightRgbPower m_specularPower; + SpotDirectionInner m_spotDirectionInner; + float m_spotDirectionInner_viewSpace[4]; + AttenuationSpotOuter m_attenuationSpotOuter; +}; + +struct Uniforms +{ + void init() + { + m_ambientPass = 1.0f; + m_lightningPass = 1.0f; + + m_shadowMapBias = 0.003f; + m_shadowMapOffset = 0.0f; + m_shadowMapParam0 = 0.5; + m_shadowMapParam1 = 1.0; + m_depthValuePow = 1.0f; + m_showSmCoverage = 1.0f; + m_shadowMapTexelSize = 1.0f/512.0f; + + m_csmFarDistances[0] = 30.0f; + m_csmFarDistances[1] = 90.0f; + m_csmFarDistances[2] = 180.0f; + m_csmFarDistances[3] = 1000.0f; + + m_tetraNormalGreen[0] = 0.0f; + m_tetraNormalGreen[1] = -0.57735026f; + m_tetraNormalGreen[2] = 0.81649661f; + + m_tetraNormalYellow[0] = 0.0f; + m_tetraNormalYellow[1] = -0.57735026f; + m_tetraNormalYellow[2] = -0.81649661f; + + m_tetraNormalBlue[0] = -0.81649661f; + m_tetraNormalBlue[1] = 0.57735026f; + m_tetraNormalBlue[2] = 0.0f; + + m_tetraNormalRed[0] = 0.81649661f; + m_tetraNormalRed[1] = 0.57735026f; + m_tetraNormalRed[2] = 0.0f; + + m_XNum = 2.0f; + m_YNum = 2.0f; + m_XOffset = 10.0f/512.0f; + m_YOffset = 10.0f/512.0f; + + u_params0 = bgfx::createUniform("u_params0", bgfx::UniformType::Uniform4fv); + u_params1 = bgfx::createUniform("u_params1", bgfx::UniformType::Uniform4fv); + u_params2 = bgfx::createUniform("u_params2", bgfx::UniformType::Uniform4fv); + u_color = bgfx::createUniform("u_color", bgfx::UniformType::Uniform4fv); + u_smSamplingParams = bgfx::createUniform("u_smSamplingParams", bgfx::UniformType::Uniform4fv); + u_csmFarDistances = bgfx::createUniform("u_csmFarDistances", bgfx::UniformType::Uniform4fv); + u_lightMtx = bgfx::createUniform("u_lightMtx", bgfx::UniformType::Uniform4x4fv); + + u_tetraNormalGreen = bgfx::createUniform("u_tetraNormalGreen", bgfx::UniformType::Uniform3fv); + u_tetraNormalYellow = bgfx::createUniform("u_tetraNormalYellow", bgfx::UniformType::Uniform3fv); + u_tetraNormalBlue = bgfx::createUniform("u_tetraNormalBlue", bgfx::UniformType::Uniform3fv); + u_tetraNormalRed = bgfx::createUniform("u_tetraNormalRed", bgfx::UniformType::Uniform3fv); + + u_shadowMapMtx0 = bgfx::createUniform("u_shadowMapMtx0", bgfx::UniformType::Uniform4x4fv); + u_shadowMapMtx1 = bgfx::createUniform("u_shadowMapMtx1", bgfx::UniformType::Uniform4x4fv); + u_shadowMapMtx2 = bgfx::createUniform("u_shadowMapMtx2", bgfx::UniformType::Uniform4x4fv); + u_shadowMapMtx3 = bgfx::createUniform("u_shadowMapMtx3", bgfx::UniformType::Uniform4x4fv); + + u_lightPosition = bgfx::createUniform("u_lightPosition", bgfx::UniformType::Uniform4fv); + u_lightAmbientPower = bgfx::createUniform("u_lightAmbientPower", bgfx::UniformType::Uniform4fv); + u_lightDiffusePower = bgfx::createUniform("u_lightDiffusePower", bgfx::UniformType::Uniform4fv); + u_lightSpecularPower = bgfx::createUniform("u_lightSpecularPower", bgfx::UniformType::Uniform4fv); + u_lightSpotDirectionInner = bgfx::createUniform("u_lightSpotDirectionInner", bgfx::UniformType::Uniform4fv); + u_lightAttenuationSpotOuter = bgfx::createUniform("u_lightAttenuationSpotOuter", bgfx::UniformType::Uniform4fv); + + u_materialKa = bgfx::createUniform("u_materialKa", bgfx::UniformType::Uniform4fv); + u_materialKd = bgfx::createUniform("u_materialKd", bgfx::UniformType::Uniform4fv); + u_materialKs = bgfx::createUniform("u_materialKs", bgfx::UniformType::Uniform4fv); + + } + + void setPtrs(Material* _materialPtr, Light* _lightPtr, float* _colorPtr, float* _lightMtxPtr, float* _shadowMapMtx0, float* _shadowMapMtx1, float* _shadowMapMtx2, float* _shadowMapMtx3) + { + m_lightMtxPtr = _lightMtxPtr; + m_colorPtr = _colorPtr; + m_materialPtr = _materialPtr; + m_lightPtr = _lightPtr; + + m_shadowMapMtx0 = _shadowMapMtx0; + m_shadowMapMtx1 = _shadowMapMtx1; + m_shadowMapMtx2 = _shadowMapMtx2; + m_shadowMapMtx3 = _shadowMapMtx3; + } + + // Call this once at initialization. + void submitConstUniforms() + { + bgfx::setUniform(u_tetraNormalGreen, m_tetraNormalGreen); + bgfx::setUniform(u_tetraNormalYellow, m_tetraNormalYellow); + bgfx::setUniform(u_tetraNormalBlue, m_tetraNormalBlue); + bgfx::setUniform(u_tetraNormalRed, m_tetraNormalRed); + } + + // Call this once per frame. + void submitPerFrameUniforms() + { + bgfx::setUniform(u_params1, m_params1); + bgfx::setUniform(u_params2, m_params2); + bgfx::setUniform(u_smSamplingParams, m_paramsBlur); + bgfx::setUniform(u_csmFarDistances, m_csmFarDistances); + + bgfx::setUniform(u_materialKa, &m_materialPtr->m_ka); + bgfx::setUniform(u_materialKd, &m_materialPtr->m_kd); + bgfx::setUniform(u_materialKs, &m_materialPtr->m_ks); + + bgfx::setUniform(u_lightPosition, &m_lightPtr->m_position_viewSpace); + bgfx::setUniform(u_lightAmbientPower, &m_lightPtr->m_ambientPower); + bgfx::setUniform(u_lightDiffusePower, &m_lightPtr->m_diffusePower); + bgfx::setUniform(u_lightSpecularPower, &m_lightPtr->m_specularPower); + bgfx::setUniform(u_lightSpotDirectionInner, &m_lightPtr->m_spotDirectionInner_viewSpace); + bgfx::setUniform(u_lightAttenuationSpotOuter, &m_lightPtr->m_attenuationSpotOuter); + } + + // Call this before each draw call. + void submitPerDrawUniforms() + { + bgfx::setUniform(u_shadowMapMtx0, m_shadowMapMtx0); + bgfx::setUniform(u_shadowMapMtx1, m_shadowMapMtx1); + bgfx::setUniform(u_shadowMapMtx2, m_shadowMapMtx2); + bgfx::setUniform(u_shadowMapMtx3, m_shadowMapMtx3); + + bgfx::setUniform(u_params0, m_params0); + bgfx::setUniform(u_lightMtx, m_lightMtxPtr); + bgfx::setUniform(u_color, m_colorPtr); + } + + void destroy() + { + bgfx::destroyUniform(u_params0); + bgfx::destroyUniform(u_params1); + bgfx::destroyUniform(u_params2); + bgfx::destroyUniform(u_color); + bgfx::destroyUniform(u_smSamplingParams); + bgfx::destroyUniform(u_csmFarDistances); + + bgfx::destroyUniform(u_materialKa); + bgfx::destroyUniform(u_materialKd); + bgfx::destroyUniform(u_materialKs); + + bgfx::destroyUniform(u_tetraNormalGreen); + bgfx::destroyUniform(u_tetraNormalYellow); + bgfx::destroyUniform(u_tetraNormalBlue); + bgfx::destroyUniform(u_tetraNormalRed); + + bgfx::destroyUniform(u_shadowMapMtx0); + bgfx::destroyUniform(u_shadowMapMtx1); + bgfx::destroyUniform(u_shadowMapMtx2); + bgfx::destroyUniform(u_shadowMapMtx3); + + bgfx::destroyUniform(u_lightMtx); + bgfx::destroyUniform(u_lightPosition); + bgfx::destroyUniform(u_lightAmbientPower); + bgfx::destroyUniform(u_lightDiffusePower); + bgfx::destroyUniform(u_lightSpecularPower); + bgfx::destroyUniform(u_lightSpotDirectionInner); + bgfx::destroyUniform(u_lightAttenuationSpotOuter); + } + + union + { + struct + { + float m_ambientPass; + float m_lightningPass; + float m_unused00; + float m_unused01; + }; + + float m_params0[4]; + }; + + union + { + struct + { + float m_shadowMapBias; + float m_shadowMapOffset; + float m_shadowMapParam0; + float m_shadowMapParam1; + }; + + float m_params1[4]; + }; + + union + { + struct + { + float m_depthValuePow; + float m_showSmCoverage; + float m_shadowMapTexelSize; + float m_unused23; + }; + + float m_params2[4]; + }; + + union + { + struct + { + float m_XNum; + float m_YNum; + float m_XOffset; + float m_YOffset; + }; + + float m_paramsBlur[4]; + }; + + float m_tetraNormalGreen[3]; + float m_tetraNormalYellow[3]; + float m_tetraNormalBlue[3]; + float m_tetraNormalRed[3]; + float m_csmFarDistances[4]; + + float* m_lightMtxPtr; + float* m_colorPtr; + Light* m_lightPtr; + float* m_shadowMapMtx0; + float* m_shadowMapMtx1; + float* m_shadowMapMtx2; + float* m_shadowMapMtx3; + Material* m_materialPtr; + +private: + bgfx::UniformHandle u_params0; + bgfx::UniformHandle u_params1; + bgfx::UniformHandle u_params2; + bgfx::UniformHandle u_color; + bgfx::UniformHandle u_smSamplingParams; + bgfx::UniformHandle u_csmFarDistances; + + bgfx::UniformHandle u_materialKa; + bgfx::UniformHandle u_materialKd; + bgfx::UniformHandle u_materialKs; + + bgfx::UniformHandle u_tetraNormalGreen; + bgfx::UniformHandle u_tetraNormalYellow; + bgfx::UniformHandle u_tetraNormalBlue; + bgfx::UniformHandle u_tetraNormalRed; + + bgfx::UniformHandle u_shadowMapMtx0; + bgfx::UniformHandle u_shadowMapMtx1; + bgfx::UniformHandle u_shadowMapMtx2; + bgfx::UniformHandle u_shadowMapMtx3; + + bgfx::UniformHandle u_lightMtx; + bgfx::UniformHandle u_lightPosition; + bgfx::UniformHandle u_lightAmbientPower; + bgfx::UniformHandle u_lightDiffusePower; + bgfx::UniformHandle u_lightSpecularPower; + bgfx::UniformHandle u_lightSpotDirectionInner; + bgfx::UniformHandle u_lightAttenuationSpotOuter; +}; +static Uniforms s_uniforms; + +struct RenderState +{ + enum Enum + { + Default = 0, + + ShadowMap_PackDepth, + ShadowMap_PackDepthHoriz, + ShadowMap_PackDepthVert, + + Custom_BlendLightTexture, + Custom_DrawPlaneBottom, + + Count + }; + + uint64_t m_state; + uint32_t m_blendFactorRgba; + uint32_t m_fstencil; + uint32_t m_bstencil; +}; + +static RenderState s_renderStates[RenderState::Count] = +{ + { // Default + 0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_CULL_CCW + | BGFX_STATE_MSAA + , UINT32_MAX + , BGFX_STENCIL_NONE + , BGFX_STENCIL_NONE + }, + { // ShadowMap_PackDepth + 0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_CULL_CCW + | BGFX_STATE_MSAA + , UINT32_MAX + , BGFX_STENCIL_NONE + , BGFX_STENCIL_NONE + }, + { // ShadowMap_PackDepthHoriz + 0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_CULL_CCW + | BGFX_STATE_MSAA + , UINT32_MAX + , BGFX_STENCIL_TEST_EQUAL + | BGFX_STENCIL_FUNC_REF(1) + | BGFX_STENCIL_FUNC_RMASK(0xff) + | BGFX_STENCIL_OP_FAIL_S_KEEP + | BGFX_STENCIL_OP_FAIL_Z_KEEP + | BGFX_STENCIL_OP_PASS_Z_KEEP + , BGFX_STENCIL_NONE + }, + { // ShadowMap_PackDepthVert + 0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_CULL_CCW + | BGFX_STATE_MSAA + , UINT32_MAX + , BGFX_STENCIL_TEST_EQUAL + | BGFX_STENCIL_FUNC_REF(0) + | BGFX_STENCIL_FUNC_RMASK(0xff) + | BGFX_STENCIL_OP_FAIL_S_KEEP + | BGFX_STENCIL_OP_FAIL_Z_KEEP + | BGFX_STENCIL_OP_PASS_Z_KEEP + , BGFX_STENCIL_NONE + }, + { // Custom_BlendLightTexture + BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_COLOR, BGFX_STATE_BLEND_INV_SRC_COLOR) + | BGFX_STATE_CULL_CCW + | BGFX_STATE_MSAA + , UINT32_MAX + , BGFX_STENCIL_NONE + , BGFX_STENCIL_NONE + }, + { // Custom_DrawPlaneBottom + BGFX_STATE_RGB_WRITE + | BGFX_STATE_CULL_CW + | BGFX_STATE_MSAA + , UINT32_MAX + , BGFX_STENCIL_NONE + , BGFX_STENCIL_NONE + }, +}; + +struct ViewState +{ + ViewState(uint32_t _width = 1280, uint32_t _height = 720) + : m_width(_width) + , m_height(_height) + { + } + + uint32_t m_width; + uint32_t m_height; + + float m_view[16]; + float m_proj[16]; +}; + +struct ClearValues +{ + ClearValues(uint32_t _clearRgba = 0x30303000 + , float _clearDepth = 1.0f + , uint8_t _clearStencil = 0 + ) + : m_clearRgba(_clearRgba) + , m_clearDepth(_clearDepth) + , m_clearStencil(_clearStencil) + { + } + + uint32_t m_clearRgba; + float m_clearDepth; + uint8_t m_clearStencil; +}; + +struct Aabb +{ + float m_min[3]; + float m_max[3]; +}; + +struct Obb +{ + float m_mtx[16]; +}; + +struct Sphere +{ + float m_center[3]; + float m_radius; +}; + +struct Primitive +{ + uint32_t m_startIndex; + uint32_t m_numIndices; + uint32_t m_startVertex; + uint32_t m_numVertices; + + Sphere m_sphere; + Aabb m_aabb; + Obb m_obb; +}; + +typedef std::vector PrimitiveArray; + +struct Group +{ + Group() + { + reset(); + } + + void reset() + { + m_vbh.idx = bgfx::invalidHandle; + m_ibh.idx = bgfx::invalidHandle; + m_prims.clear(); + } + + bgfx::VertexBufferHandle m_vbh; + bgfx::IndexBufferHandle m_ibh; + Sphere m_sphere; + Aabb m_aabb; + Obb m_obb; + PrimitiveArray m_prims; +}; + +struct Mesh +{ + void load(const void* _vertices, uint32_t _numVertices, const bgfx::VertexDecl _decl, const uint16_t* _indices, uint32_t _numIndices) + { + Group group; + const bgfx::Memory* mem; + uint32_t size; + + size = _numVertices*_decl.getStride(); + mem = bgfx::makeRef(_vertices, size); + group.m_vbh = bgfx::createVertexBuffer(mem, _decl); + + size = _numIndices*2; + mem = bgfx::makeRef(_indices, size); + group.m_ibh = bgfx::createIndexBuffer(mem); + + //TODO: + // group.m_sphere = ... + // group.m_aabb = ... + // group.m_obb = ... + // group.m_prims = ... + + m_groups.push_back(group); + } + + void load(const char* _filePath) + { +#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x0) +#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0) +#define BGFX_CHUNK_MAGIC_PRI BX_MAKEFOURCC('P', 'R', 'I', 0x0) + + bx::CrtFileReader reader; + reader.open(_filePath); + + Group group; + + uint32_t chunk; + while (4 == bx::read(&reader, chunk) ) + { + switch (chunk) + { + case BGFX_CHUNK_MAGIC_VB: + { + bx::read(&reader, group.m_sphere); + bx::read(&reader, group.m_aabb); + bx::read(&reader, group.m_obb); + + bx::read(&reader, m_decl); + uint16_t stride = m_decl.getStride(); + + uint16_t numVertices; + bx::read(&reader, numVertices); + const bgfx::Memory* mem = bgfx::alloc(numVertices*stride); + bx::read(&reader, mem->data, mem->size); + + group.m_vbh = bgfx::createVertexBuffer(mem, m_decl); + } + break; + + case BGFX_CHUNK_MAGIC_IB: + { + uint32_t numIndices; + bx::read(&reader, numIndices); + const bgfx::Memory* mem = bgfx::alloc(numIndices*2); + bx::read(&reader, mem->data, mem->size); + group.m_ibh = bgfx::createIndexBuffer(mem); + } + break; + + case BGFX_CHUNK_MAGIC_PRI: + { + uint16_t len; + bx::read(&reader, len); + + std::string material; + material.resize(len); + bx::read(&reader, const_cast(material.c_str() ), len); + + uint16_t num; + bx::read(&reader, num); + + for (uint32_t ii = 0; ii < num; ++ii) + { + bx::read(&reader, len); + + std::string name; + name.resize(len); + bx::read(&reader, const_cast(name.c_str() ), len); + + Primitive prim; + bx::read(&reader, prim.m_startIndex); + bx::read(&reader, prim.m_numIndices); + bx::read(&reader, prim.m_startVertex); + bx::read(&reader, prim.m_numVertices); + bx::read(&reader, prim.m_sphere); + bx::read(&reader, prim.m_aabb); + bx::read(&reader, prim.m_obb); + + group.m_prims.push_back(prim); + } + + m_groups.push_back(group); + group.reset(); + } + break; + + default: + DBG("%08x at %d", chunk, reader.seek() ); + break; + } + } + + reader.close(); + } + + void unload() + { + for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) + { + const Group& group = *it; + bgfx::destroyVertexBuffer(group.m_vbh); + + if (bgfx::invalidHandle != group.m_ibh.idx) + { + bgfx::destroyIndexBuffer(group.m_ibh); + } + } + m_groups.clear(); + } + + void submit(uint8_t _viewId, float* _mtx, bgfx::ProgramHandle _program, const RenderState& _renderState) + { + bgfx::TextureHandle texture = BGFX_INVALID_HANDLE; + submit(_viewId, _mtx, _program, _renderState, texture); + } + + void submit(uint8_t _viewId, float* _mtx, bgfx::ProgramHandle _program, const RenderState& _renderState, bgfx::TextureHandle _texture) + { + for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) + { + const Group& group = *it; + + // Set uniforms. + s_uniforms.submitPerDrawUniforms(); + + // Set model matrix for rendering. + bgfx::setTransform(_mtx); + bgfx::setProgram(_program); + bgfx::setIndexBuffer(group.m_ibh); + bgfx::setVertexBuffer(group.m_vbh); + + // Set textures. + if (bgfx::invalidHandle != _texture.idx) + { + bgfx::setTexture(0, u_texColor, _texture); + } + + for (uint8_t ii = 0; ii < ShadowMapRenderTargets::Count; ++ii) + { + bgfx::setTexture(4 + ii, u_shadowMap[ii], s_rtShadowMap[ii]); + } + + // Apply render state. + bgfx::setStencil(_renderState.m_fstencil, _renderState.m_bstencil); + bgfx::setState(_renderState.m_state, _renderState.m_blendFactorRgba); + + // Submit. + bgfx::submit(_viewId); + } + } + + bgfx::VertexDecl m_decl; + typedef std::vector GroupArray; + GroupArray m_groups; +}; + +struct PosColorTexCoord0Vertex +{ + float m_x; + float m_y; + float m_z; + uint32_t m_rgba; + float m_u; + float m_v; + + static void init() + { + ms_decl.begin(); + ms_decl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + ms_decl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true); + ms_decl.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float); + ms_decl.end(); + } + + static bgfx::VertexDecl ms_decl; +}; + +bgfx::VertexDecl PosColorTexCoord0Vertex::ms_decl; + +void screenSpaceQuad(float _textureWidth, float _textureHeight, bool _originBottomLeft = true, float _width = 1.0f, float _height = 1.0f) +{ + if (bgfx::checkAvailTransientVertexBuffer(3, PosColorTexCoord0Vertex::ms_decl) ) + { + bgfx::TransientVertexBuffer vb; + bgfx::allocTransientVertexBuffer(&vb, 3, PosColorTexCoord0Vertex::ms_decl); + PosColorTexCoord0Vertex* vertex = (PosColorTexCoord0Vertex*)vb.data; + + const float zz = 0.0f; + + const float minx = -_width; + const float maxx = _width; + const float miny = 0.0f; + const float maxy = _height*2.0f; + + const float texelHalfW = s_texelHalf/_textureWidth; + const float texelHalfH = s_texelHalf/_textureHeight; + const float minu = -1.0f + texelHalfW; + const float maxu = 1.0f + texelHalfW; + + float minv = texelHalfH; + float maxv = 2.0f + texelHalfH; + + if (_originBottomLeft) + { + std::swap(minv, maxv); + minv -= 1.0f; + maxv -= 1.0f; + } + + vertex[0].m_x = minx; + vertex[0].m_y = miny; + vertex[0].m_z = zz; + vertex[0].m_rgba = 0xffffffff; + vertex[0].m_u = minu; + vertex[0].m_v = minv; + + vertex[1].m_x = maxx; + vertex[1].m_y = miny; + vertex[1].m_z = zz; + vertex[1].m_rgba = 0xffffffff; + vertex[1].m_u = maxu; + vertex[1].m_v = minv; + + vertex[2].m_x = maxx; + vertex[2].m_y = maxy; + vertex[2].m_z = zz; + vertex[2].m_rgba = 0xffffffff; + vertex[2].m_u = maxu; + vertex[2].m_v = maxv; + + bgfx::setVertexBuffer(&vb); + } +} + +void worldSpaceFrustumCorners(float* _corners24f + , float _near + , float _far + , float _projWidth + , float _projHeight + , const float* __restrict _invViewMtx + ) +{ + // Define frustum corners in view space. + const float nw = _near * _projWidth; + const float nh = _near * _projHeight; + const float fw = _far * _projWidth; + const float fh = _far * _projHeight; + + const uint8_t numCorners = 8; + const float corners[numCorners][3] = + { + { -nw, nh, _near }, + { nw, nh, _near }, + { nw, -nh, _near }, + { -nw, -nh, _near }, + { -fw, fh, _far }, + { fw, fh, _far }, + { fw, -fh, _far }, + { -fw, -fh, _far }, + }; + + // Convert them to world space. + float (*out)[3] = (float(*)[3])_corners24f; + for (uint8_t ii = 0; ii < numCorners; ++ii) + { + vec3MulMtx( (float*)&out[ii], (float*)&corners[ii], _invViewMtx); + } +} + +/** + * _splits = { near0, far0, near1, far1... nearN, farN } + * N = _numSplits + */ +void splitFrustum(float* _splits, uint8_t _numSplits, float _near, float _far, float _splitWeight = 0.75f) +{ + const float l = _splitWeight; + const float ratio = _far/_near; + const int8_t numSlices = _numSplits*2; + const float numSlicesf = float(numSlices); + + // First slice. + _splits[0] = _near; + + for (uint8_t nn = 2, ff = 1; nn < numSlices; nn+=2, ff+=2) + { + float si = float(int8_t(ff) ) / numSlicesf; + + const float nearp = l*(_near*powf(ratio, si) ) + (1 - l)*(_near + (_far - _near)*si); + _splits[nn] = nearp; //near + _splits[ff] = nearp * 1.005f; //far from previous split + } + + // Last slice. + _splits[numSlices-1] = _far; +} + +struct Programs +{ + void init() + { + // Misc. + m_black = loadProgram("vs_shadowmaps_color", "fs_shadowmaps_color_black"); + m_texture = loadProgram("vs_shadowmaps_texture", "fs_shadowmaps_texture"); + m_colorTexture = loadProgram("vs_shadowmaps_color_texture", "fs_shadowmaps_color_texture"); + + // Blur. + m_vBlur[PackDepth::RGBA] = loadProgram("vs_shadowmaps_vblur", "fs_shadowmaps_vblur"); + m_hBlur[PackDepth::RGBA] = loadProgram("vs_shadowmaps_hblur", "fs_shadowmaps_hblur"); + m_vBlur[PackDepth::VSM] = loadProgram("vs_shadowmaps_vblur", "fs_shadowmaps_vblur_vsm"); + m_hBlur[PackDepth::VSM] = loadProgram("vs_shadowmaps_hblur", "fs_shadowmaps_hblur_vsm"); + + // Draw depth. + m_drawDepth[PackDepth::RGBA] = loadProgram("vs_shadowmaps_unpackdepth", "fs_shadowmaps_unpackdepth"); + m_drawDepth[PackDepth::VSM] = loadProgram("vs_shadowmaps_unpackdepth", "fs_shadowmaps_unpackdepth_vsm"); + + // Pack depth. + m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] = loadProgram("vs_shadowmaps_packdepth", "fs_shadowmaps_packdepth"); + m_packDepth[DepthImpl::InvZ][PackDepth::VSM] = loadProgram("vs_shadowmaps_packdepth", "fs_shadowmaps_packdepth_vsm"); + + m_packDepth[DepthImpl::Linear][PackDepth::RGBA] = loadProgram("vs_shadowmaps_packdepth_linear", "fs_shadowmaps_packdepth_linear"); + m_packDepth[DepthImpl::Linear][PackDepth::VSM] = loadProgram("vs_shadowmaps_packdepth_linear", "fs_shadowmaps_packdepth_vsm_linear"); + + // Color lightning. + m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_hard"); + m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_pcf"); + m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_vsm"); + m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning", "fs_shadowmaps_color_lightning_esm"); + + m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_hard_linear"); + m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_pcf_linear"); + m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_vsm_linear"); + m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_linear", "fs_shadowmaps_color_lightning_esm_linear"); + + m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_hard_omni"); + m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_pcf_omni"); + m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_vsm_omni"); + m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_omni", "fs_shadowmaps_color_lightning_esm_omni"); + + m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_hard_linear_omni"); + m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_pcf_linear_omni"); + m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_vsm_linear_omni"); + m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_linear_omni", "fs_shadowmaps_color_lightning_esm_linear_omni"); + + m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_hard_csm"); + m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_pcf_csm"); + m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_vsm_csm"); + m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_csm", "fs_shadowmaps_color_lightning_esm_csm"); + + m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::Hard] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_hard_linear_csm"); + m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::PCF] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_pcf_linear_csm"); + m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::VSM] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_vsm_linear_csm"); + m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::ESM] = loadProgram("vs_shadowmaps_color_lightning_linear_csm", "fs_shadowmaps_color_lightning_esm_linear_csm"); + } + + void destroy() + { + // Color lightning. + for (uint8_t ii = 0; ii < SmType::Count; ++ii) + { + for (uint8_t jj = 0; jj < DepthImpl::Count; ++jj) + { + for (uint8_t kk = 0; kk < SmImpl::Count; ++kk) + { + bgfx::destroyProgram(m_colorLightning[ii][jj][kk]); + } + } + } + + // Pack depth. + for (uint8_t ii = 0; ii < DepthImpl::Count; ++ii) + { + for (uint8_t jj = 0; jj < PackDepth::Count; ++jj) + { + bgfx::destroyProgram(m_packDepth[ii][jj]); + } + } + + // Draw depth. + for (uint8_t ii = 0; ii < PackDepth::Count; ++ii) + { + bgfx::destroyProgram(m_drawDepth[ii]); + } + + // Hblur. + for (uint8_t ii = 0; ii < PackDepth::Count; ++ii) + { + bgfx::destroyProgram(m_hBlur[ii]); + } + + // Vblur. + for (uint8_t ii = 0; ii < PackDepth::Count; ++ii) + { + bgfx::destroyProgram(m_vBlur[ii]); + } + + // Misc. + bgfx::destroyProgram(m_colorTexture); + bgfx::destroyProgram(m_texture); + bgfx::destroyProgram(m_black); + } + + bgfx::ProgramHandle m_black; + bgfx::ProgramHandle m_texture; + bgfx::ProgramHandle m_colorTexture; + bgfx::ProgramHandle m_vBlur[PackDepth::Count]; + bgfx::ProgramHandle m_hBlur[PackDepth::Count]; + bgfx::ProgramHandle m_drawDepth[PackDepth::Count]; + bgfx::ProgramHandle m_packDepth[DepthImpl::Count][PackDepth::Count]; + bgfx::ProgramHandle m_colorLightning[SmType::Count][DepthImpl::Count][SmImpl::Count]; +}; + +static Programs s_programs; + +struct ShadowMapSettings +{ +#define IMGUI_FLOAT_PARAM(_name) float _name, _name##Min, _name##Max, _name##Step + IMGUI_FLOAT_PARAM(m_sizePwrTwo); + IMGUI_FLOAT_PARAM(m_depthValuePow); + IMGUI_FLOAT_PARAM(m_near); + IMGUI_FLOAT_PARAM(m_far); + IMGUI_FLOAT_PARAM(m_bias); + IMGUI_FLOAT_PARAM(m_normalOffset); + IMGUI_FLOAT_PARAM(m_customParam0); + IMGUI_FLOAT_PARAM(m_customParam1); + IMGUI_FLOAT_PARAM(m_xNum); + IMGUI_FLOAT_PARAM(m_yNum); + IMGUI_FLOAT_PARAM(m_xOffset); + IMGUI_FLOAT_PARAM(m_yOffset); + bool m_doBlur; + bgfx::ProgramHandle* m_progPack; + bgfx::ProgramHandle* m_progDraw; +#undef IMGUI_FLOAT_PARAM +}; + +int _main_(int /*_argc*/, char** /*_argv*/) +{ + uint32_t debug = BGFX_DEBUG_TEXT; + uint32_t reset = BGFX_RESET_VSYNC; + + ViewState viewState(1280, 720); + ClearValues clearValues(0x00000000, 1.0f, 0); + + bgfx::init(); + bgfx::reset(viewState.m_width, viewState.m_height, reset); + + // Enable debug text. + bgfx::setDebug(debug); + + // Setup root path for binary shaders. Shader binaries are different + // for each renderer. + switch (bgfx::getRendererType() ) + { + default: + case bgfx::RendererType::Direct3D9: + s_shaderPath = "shaders/dx9/"; + s_texelHalf = 0.5f; + break; + + case bgfx::RendererType::Direct3D11: + s_shaderPath = "shaders/dx11/"; + break; + + case bgfx::RendererType::OpenGL: + s_shaderPath = "shaders/glsl/"; + s_flipV = true; + break; + + case bgfx::RendererType::OpenGLES2: + case bgfx::RendererType::OpenGLES3: + s_shaderPath = "shaders/gles/"; + s_flipV = true; + break; + } + + // Imgui. + FILE* file = fopen("font/droidsans.ttf", "rb"); + uint32_t size = (uint32_t)fsize(file); + void* data = malloc(size); + size_t ignore = fread(data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + imguiCreate(data, size); + + // Uniforms. + s_uniforms.init(); + u_texColor = bgfx::createUniform("u_texColor", bgfx::UniformType::Uniform1iv); + u_shadowMap[0] = bgfx::createUniform("u_shadowMap0", bgfx::UniformType::Uniform1iv); + u_shadowMap[1] = bgfx::createUniform("u_shadowMap1", bgfx::UniformType::Uniform1iv); + u_shadowMap[2] = bgfx::createUniform("u_shadowMap2", bgfx::UniformType::Uniform1iv); + u_shadowMap[3] = bgfx::createUniform("u_shadowMap3", bgfx::UniformType::Uniform1iv); + + // Programs. + s_programs.init(); + + // Vertex declarations. + bgfx::VertexDecl PosNormalTexcoordDecl; + PosNormalTexcoordDecl.begin(); + PosNormalTexcoordDecl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + PosNormalTexcoordDecl.add(bgfx::Attrib::Normal, 4, bgfx::AttribType::Uint8, true, true); + PosNormalTexcoordDecl.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float); + PosNormalTexcoordDecl.end(); + + bgfx::VertexDecl posDecl; + posDecl.begin(); + posDecl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + posDecl.end(); + + PosColorTexCoord0Vertex::init(); + + // Textures. + const bgfx::Memory* mem; + + mem = loadTexture("figure-rgba.dds"); + bgfx::TextureHandle texFigure = bgfx::createTexture(mem); + + mem = loadTexture("flare.dds"); + bgfx::TextureHandle texFlare = bgfx::createTexture(mem); + + mem = loadTexture("fieldstone-rgba.dds"); + bgfx::TextureHandle texFieldstone = bgfx::createTexture(mem); + + // Meshes. + Mesh bunnyMesh; + Mesh treeMesh; + Mesh cubeMesh; + Mesh hollowcubeMesh; + Mesh hplaneMesh; + Mesh vplaneMesh; + bunnyMesh.load("meshes/bunny.bin"); + treeMesh.load("meshes/tree.bin"); + cubeMesh.load("meshes/cube.bin"); + hollowcubeMesh.load("meshes/hollowcube.bin"); + hplaneMesh.load(s_hplaneVertices, s_numHPlaneVertices, PosNormalTexcoordDecl, s_planeIndices, s_numPlaneIndices); + vplaneMesh.load(s_vplaneVertices, s_numVPlaneVertices, PosNormalTexcoordDecl, s_planeIndices, s_numPlaneIndices); + + // Materials. + Material defaultMaterial = + { + {{ 1.0f, 1.0f, 1.0f, 0.0f }} //ambient + ,{{ 1.0f, 1.0f, 1.0f, 0.0f }} //diffuse + ,{{ 1.0f, 1.0f, 1.0f, 0.0f }} //specular, exponent + }; + + // Lights. + Light pointLight = + { + {{ 0.0f, 0.0f, 0.0f, 1.0f }}, //position + { 0.0f, 0.0f, 0.0f, 0.0f }, //-ignore + {{ 1.0f, 1.0f, 1.0f, 0.0f }}, //ambient + {{ 1.0f, 1.0f, 1.0f, 850.0f }}, //diffuse + {{ 1.0f, 1.0f, 1.0f, 0.0f }}, //specular + {{ 0.0f,-0.4f,-0.6f, 0.0f }}, //spotdirection, spotexponent + { 0.0f, 0.0f, 0.0f, 0.0f }, //-ignore + {{ 1.0f, 0.0f, 1.0f, 91.0f }}, //attenuation, spotcutoff + }; + + Light directionalLight = + { + {{ 0.5f,-1.0f, 0.1f, 0.0f }}, //position + { 0.0f, 0.0f, 0.0f, 0.0f }, //-ignore + {{ 1.0f, 1.0f, 1.0f, 0.02f }}, //ambient + {{ 1.0f, 1.0f, 1.0f, 0.4f }}, //diffuse + {{ 1.0f, 1.0f, 1.0f, 0.0f }}, //specular + {{ 0.0f, 0.0f, 0.0f, 1.0f }}, //spotdirection, spotexponent + { 0.0f, 0.0f, 0.0f, 0.0f }, //-ignore + {{ 0.0f, 0.0f, 0.0f, 1.0f }}, //attenuation, spotcutoff + }; + + // Setup uniforms. + float color[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + float lightMtx[16]; + float shadowMapMtx[ShadowMapRenderTargets::Count][16]; + s_uniforms.setPtrs(&defaultMaterial + , &pointLight + , color + , lightMtx + , &shadowMapMtx[ShadowMapRenderTargets::First][0] + , &shadowMapMtx[ShadowMapRenderTargets::Second][0] + , &shadowMapMtx[ShadowMapRenderTargets::Third][0] + , &shadowMapMtx[ShadowMapRenderTargets::Fourth][0] + ); + s_uniforms.submitConstUniforms(); + + // Settings. + ShadowMapSettings smSettings[LightType::Count][DepthImpl::Count][SmImpl::Count] = + { + { //LightType::Spot + + { //DepthImpl::InvZ + + { //SmImpl::Hard + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0035f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.0012f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 500.0f, 1.0f, 1000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw + }, + { //SmImpl::PCF + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 99.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.007f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 500.0f, 1.0f, 1000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 8.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 8.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw + }, + { //SmImpl::VSM + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 8.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.045f, 0.0f, 0.1f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.02f, 0.0f, 0.04f, 0.00001f // m_customParam0 + , 450.0f, 1.0f, 1000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::VSM] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw + }, + { //SmImpl::ESM + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 3.0f, 1.0f, 10.0f, 0.01f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.02f, 0.0f, 0.3f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 9000.0f, 1.0f, 15000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw + } + + }, + { //DepthImpl::Linear + + { //SmImpl::Hard + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0025f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.0012f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 500.0f, 1.0f, 1000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::Hard] //m_progDraw + }, + { //SmImpl::PCF + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 99.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0025f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 2000.0f, 1.0f, 2000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 8.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 8.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::PCF] //m_progDraw + }, + { //SmImpl::VSM + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.006f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.02f, 0.0f, 0.1f, 0.00001f // m_customParam0 + , 300.0f, 1.0f, 1500.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::VSM] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::VSM] //m_progDraw + }, + { //SmImpl::ESM + 10.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 0.01f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0055f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 2500.0f, 1.0f, 5000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Single][DepthImpl::Linear][SmImpl::ESM] //m_progDraw + } + + } + + }, + { //LightType::Point + + { //DepthImpl::InvZ + + { //SmImpl::Hard + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.006f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 50.0f, 1.0f, 300.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.25f, 0.0f, 2.0f, 0.001f // m_xOffset + , 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw + }, + { //SmImpl::PCF + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 99.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.004f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 50.0f, 1.0f, 300.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 8.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 8.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.001f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw + }, + { //SmImpl::VSM + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 8.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.055f, 0.0f, 0.1f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.02f, 0.0f, 0.04f, 0.00001f // m_customParam0 + , 450.0f, 1.0f, 900.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.25f, 0.0f, 2.0f, 0.001f // m_xOffset + , 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::VSM] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw + }, + { //SmImpl::ESM + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 10.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 3.0f, 1.0f, 10.0f, 0.01f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.035f, 0.0f, 0.1f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 9000.0f, 1.0f, 15000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.25f, 0.0f, 2.0f, 0.001f // m_xOffset + , 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw + } + + }, + { //DepthImpl::Linear + + { //SmImpl::Hard + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.003f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 120.0f, 1.0f, 300.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.25f, 0.0f, 2.0f, 0.001f // m_xOffset + , 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::Hard] //m_progDraw + }, + { //SmImpl::PCF + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 99.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0035f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 120.0f, 1.0f, 300.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 8.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 8.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.001f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::PCF] //m_progDraw + }, + { //SmImpl::VSM + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.006f, 0.0f, 0.1f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.02f, 0.0f, 0.1f, 0.00001f // m_customParam0 + , 400.0f, 1.0f, 900.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.25f, 0.0f, 2.0f, 0.001f // m_xOffset + , 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::VSM] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::VSM] //m_progDraw + }, + { //SmImpl::ESM + 12.0f, 9.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 0.01f // m_near + , 250.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.007f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.05f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 8000.0f, 1.0f, 15000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.25f, 0.0f, 2.0f, 0.001f // m_xOffset + , 0.25f, 0.0f, 2.0f, 0.001f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Omni][DepthImpl::Linear][SmImpl::ESM] //m_progDraw + } + + } + + }, + { //LightType::Directional + + { //DepthImpl::InvZ + + { //SmImpl::Hard + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0012f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 200.0f, 1.0f, 400.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.2f, 0.0f, 1.0f, 0.01f // m_xOffset + , 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::Hard] //m_progDraw + }, + { //SmImpl::PCF + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 99.0f, 1.0f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0012f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 200.0f, 1.0f, 400.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 8.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 8.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::PCF] //m_progDraw + }, + { //SmImpl::VSM + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.004f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.02f, 0.0f, 0.04f, 0.00001f // m_customParam0 + , 2500.0f, 1.0f, 5000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.2f, 0.0f, 1.0f, 0.01f // m_xOffset + , 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::VSM] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::VSM] //m_progDraw + }, + { //SmImpl::ESM + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 0.01f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.004f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 9500.0f, 1.0f, 15000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.2f, 0.0f, 1.0f, 0.01f // m_xOffset + , 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::InvZ][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::InvZ][SmImpl::ESM] //m_progDraw + } + + }, + { //DepthImpl::Linear + + { //SmImpl::Hard + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0012f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 500.0f, 1.0f, 1000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.2f, 0.0f, 1.0f, 0.01f // m_xOffset + , 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::Hard] //m_progDraw + }, + { //SmImpl::PCF + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 99.0f, 1.0f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.0012f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 200.0f, 1.0f, 400.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 8.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 8.0f, 1.0f // m_yNum + , 1.0f, 0.0f, 3.0f, 0.01f // m_xOffset + , 1.0f, 0.0f, 3.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::PCF] //m_progDraw + }, + { //SmImpl::VSM + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 1.0f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.004f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.02f, 0.0f, 0.04f, 0.00001f // m_customParam0 + , 2500.0f, 1.0f, 5000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.2f, 0.0f, 1.0f, 0.01f // m_xOffset + , 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::VSM] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::VSM] //m_progDraw + }, + { //SmImpl::ESM + 11.0f, 7.0f, 12.0f, 1.0f // m_sizePwrTwo + , 1.0f, 1.0f, 20.0f, 1.0f // m_depthValuePow + , 1.0f, 1.0f, 10.0f, 0.01f // m_near + , 550.0f, 100.0f, 2000.0f, 50.0f // m_far + , 0.004f, 0.0f, 0.01f, 0.00001f // m_bias + , 0.001f, 0.0f, 0.04f, 0.00001f // m_normalOffset + , 0.7f, 0.0f, 1.0f, 0.01f // m_customParam0 + , 9500.0f, 1.0f, 15000.0f, 1.0f // m_customParam1 + , 2.0f, 0.0f, 4.0f, 1.0f // m_xNum + , 2.0f, 0.0f, 4.0f, 1.0f // m_yNum + , 0.2f, 0.0f, 1.0f, 0.01f // m_xOffset + , 0.2f, 0.0f, 1.0f, 0.01f // m_yOffset + , true // m_doBlur + , &s_programs.m_packDepth[DepthImpl::Linear][PackDepth::RGBA] //m_progPack + , &s_programs.m_colorLightning[SmType::Cascade][DepthImpl::Linear][SmImpl::ESM] //m_progDraw + } + + } + } + }; + + struct SceneSettings + { + LightType::Enum m_lightType; + DepthImpl::Enum m_depthImpl; + SmImpl::Enum m_smImpl; + float m_spotOuterAngle; + float m_spotInnerAngle; + float m_fovXAdjust; + float m_fovYAdjust; + float m_coverageSpotL; + float m_numSplitsf; + float m_splitDistribution; + uint8_t m_numSplits; + bool m_updateLights; + bool m_updateScene; + bool m_drawDepthBuffer; + bool m_showSmCoverage; + bool m_stencilPack; + bool m_stabilize; + }; + + SceneSettings settings; + settings.m_lightType = LightType::SpotLight; + settings.m_depthImpl = DepthImpl::InvZ; + settings.m_smImpl = SmImpl::Hard; + settings.m_spotOuterAngle = 45.0f; + settings.m_spotInnerAngle = 30.0f; + settings.m_fovXAdjust = 0.0f; + settings.m_fovYAdjust = 0.0f; + settings.m_coverageSpotL = 90.0f; + settings.m_numSplitsf = 4.0f; + settings.m_splitDistribution = 0.6f; + settings.m_numSplits = uint8_t(settings.m_numSplitsf); + settings.m_updateLights = true; + settings.m_updateScene = true; + settings.m_drawDepthBuffer = false; + settings.m_showSmCoverage = false; + settings.m_stencilPack = true; + settings.m_stabilize = true; + + ShadowMapSettings* currentSmSettings = &smSettings[settings.m_lightType][settings.m_depthImpl][settings.m_smImpl]; + + // Render targets. + uint16_t shadowMapSize = 1 << uint32_t(currentSmSettings->m_sizePwrTwo); + uint16_t currentShadowMapSize = shadowMapSize; + float currentShadowMapSizef = float(int16_t(currentShadowMapSize) ); + s_uniforms.m_shadowMapTexelSize = 1.0f / currentShadowMapSizef; + for (uint8_t ii = 0; ii < ShadowMapRenderTargets::Count; ++ii) + { + s_rtShadowMap[ii] = bgfx::createRenderTarget(currentShadowMapSize, currentShadowMapSize, BGFX_RENDER_TARGET_COLOR_RGBA8 | BGFX_RENDER_TARGET_DEPTH_D24S8); + } + s_rtBlur = bgfx::createRenderTarget(currentShadowMapSize, currentShadowMapSize, BGFX_RENDER_TARGET_COLOR_RGBA8); + + // Setup camera. + float initialPos[3] = { 0.0f, 60.0f, -105.0f }; + cameraSetPosition(initialPos); + cameraSetVerticalAngle(-0.45f); + + // Set view and projection matrices. + const float camFovy = 60.0f; + const float camAspect = float(int32_t(viewState.m_width) ) / float(int32_t(viewState.m_height) ); + const float camNear = 0.1f; + const float camFar = 2000.0f; + const float projHeight = 1.0f/tanf(camFovy*( (float)M_PI/180.0f)*0.5f); + const float projWidth = projHeight * 1.0f/camAspect; + mtxProj(viewState.m_proj, camFovy, camAspect, camNear, camFar); + cameraGetViewMtx(viewState.m_view); + + float timeAccumulatorLight = 0.0f; + float timeAccumulatorScene = 0.0f; + + entry::MouseState mouseState; + while (!entry::processEvents(viewState.m_width, viewState.m_height, debug, reset, &mouseState) ) + { + // Imgui. + imguiBeginFrame(mouseState.m_mx + , mouseState.m_my + , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) + | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) + , 0 + , viewState.m_width + , viewState.m_height + ); + + static int32_t rightScrollArea = 0; + imguiBeginScrollArea("Settings", viewState.m_width - 256 - 10, 10, 256, 660, &rightScrollArea); +#define IMGUI_FLOAT_SLIDER(_name, _val) \ + imguiSlider(_name \ + , &_val \ + , *(((float*)&_val)+1) \ + , *(((float*)&_val)+2) \ + , *(((float*)&_val)+3) \ + ) + + imguiBool("Update lights", settings.m_updateLights); + imguiBool("Update scene", settings.m_updateScene); + + imguiSeparatorLine(); + imguiLabel("Shadow map depth:"); + imguiEnum(settings.m_depthImpl); + currentSmSettings = &smSettings[settings.m_lightType][settings.m_depthImpl][settings.m_smImpl]; + + imguiSeparator(); + imguiBool("Draw depth buffer.", settings.m_drawDepthBuffer); + if (settings.m_drawDepthBuffer) + { + IMGUI_FLOAT_SLIDER("Depth value pow:", currentSmSettings->m_depthValuePow); + } + + imguiSeparatorLine(); + imguiLabel("Shadow Map implementation:"); + imguiEnum(settings.m_smImpl); + currentSmSettings = &smSettings[settings.m_lightType][settings.m_depthImpl][settings.m_smImpl]; + + imguiSeparator(); + IMGUI_FLOAT_SLIDER("Bias:", currentSmSettings->m_bias); + IMGUI_FLOAT_SLIDER("Normal offset:", currentSmSettings->m_normalOffset); + imguiSeparator(); + if (LightType::DirectionalLight != settings.m_lightType) + { + IMGUI_FLOAT_SLIDER("Near plane:", currentSmSettings->m_near); + } + IMGUI_FLOAT_SLIDER("Far plane:", currentSmSettings->m_far); + + imguiSeparator(); + switch(settings.m_smImpl) + { + case SmImpl::Hard: + //imguiLabel("Hard"); + break; + case SmImpl::PCF: + imguiLabel("PCF"); + IMGUI_FLOAT_SLIDER("X Offset:", currentSmSettings->m_xOffset); + IMGUI_FLOAT_SLIDER("Y Offset:", currentSmSettings->m_yOffset); + break; + case SmImpl::VSM: + imguiLabel("VSM"); + IMGUI_FLOAT_SLIDER("Min variance", currentSmSettings->m_customParam0); + IMGUI_FLOAT_SLIDER("Depth multiplier", currentSmSettings->m_customParam1); + imguiBool("Blur shadow map", currentSmSettings->m_doBlur); + if (currentSmSettings->m_doBlur) + { + IMGUI_FLOAT_SLIDER("Blur X Offset:", currentSmSettings->m_xOffset); + IMGUI_FLOAT_SLIDER("Blur Y Offset:", currentSmSettings->m_yOffset); + } + break; + case SmImpl::ESM: + imguiLabel("ESM"); + IMGUI_FLOAT_SLIDER("ESM Hardness", currentSmSettings->m_customParam0); + IMGUI_FLOAT_SLIDER("Depth multiplier", currentSmSettings->m_customParam1); + imguiBool("Blur shadow map", currentSmSettings->m_doBlur); + if (currentSmSettings->m_doBlur) + { + IMGUI_FLOAT_SLIDER("Blur X Offset:", currentSmSettings->m_xOffset); + IMGUI_FLOAT_SLIDER("Blur Y Offset:", currentSmSettings->m_yOffset); + } + break; + + case SmImpl::Count: + default: + break; + }; + + imguiEndScrollArea(); + + static int32_t leftScrollArea = 0; + imguiBeginScrollArea("Light", 10, 70, 256, 334, &leftScrollArea); + + const LightType::Enum ltBefore = settings.m_lightType; + imguiEnum(settings.m_lightType); + const LightType::Enum ltAfter = settings.m_lightType; + const bool bLtChanged = (ltAfter != ltBefore); + + imguiSeparator(); + imguiBool("Show shadow map coverage.", settings.m_showSmCoverage); + + imguiSeparator(); + imguiLabel("Shadow map resolution: %ux%u", currentShadowMapSize, currentShadowMapSize); + IMGUI_FLOAT_SLIDER(" ", currentSmSettings->m_sizePwrTwo); + + imguiSeparatorLine(); + if (LightType::SpotLight == settings.m_lightType) + { + imguiLabel("Spot light"); + imguiSlider("Shadow map area:", &settings.m_coverageSpotL, 45.0f, 120.0f, 1.0f); + + imguiSeparator(); + imguiSlider("Spot outer cone:", &settings.m_spotOuterAngle, 0.0f, 91.0f, 0.1f); + imguiSlider("Spot inner cone:", &settings.m_spotInnerAngle, 0.0f, 90.0f, 0.1f); + } + else if (LightType::PointLight == settings.m_lightType) + { + imguiLabel("Point light"); + imguiBool("Stencil pack", settings.m_stencilPack); + + imguiSlider("Fov X adjust:", &settings.m_fovXAdjust, -20.0f, 20.0f, 0.0001f); + imguiSlider("Fov Y adjust:", &settings.m_fovYAdjust, -20.0f, 20.0f, 0.0001f); + } + else if (LightType::DirectionalLight == settings.m_lightType) + { + imguiLabel("Directional light"); + imguiBool("Stabilize cascades", settings.m_stabilize); + imguiSlider("Cascade splits:", &settings.m_numSplitsf, 1.0f, 4.0f, 1.0f); + imguiSlider("Cascade distribution:", &settings.m_splitDistribution, 0.0f, 1.0f, 0.001f); + settings.m_numSplits = uint8_t(settings.m_numSplitsf); + } + +#undef IMGUI_FLOAT_SLIDER + imguiEndScrollArea(); + imguiEndFrame(); + + // Update uniforms. + s_uniforms.m_shadowMapBias = currentSmSettings->m_bias; + s_uniforms.m_shadowMapOffset = currentSmSettings->m_normalOffset; + s_uniforms.m_shadowMapParam0 = currentSmSettings->m_customParam0; + s_uniforms.m_shadowMapParam1 = currentSmSettings->m_customParam1; + s_uniforms.m_depthValuePow = currentSmSettings->m_depthValuePow; + s_uniforms.m_XNum = currentSmSettings->m_xNum; + s_uniforms.m_YNum = currentSmSettings->m_yNum; + s_uniforms.m_XOffset = currentSmSettings->m_xOffset; + s_uniforms.m_YOffset = currentSmSettings->m_yOffset; + s_uniforms.m_showSmCoverage = float(settings.m_showSmCoverage); + s_uniforms.m_lightPtr = (LightType::DirectionalLight == settings.m_lightType) ? &directionalLight : &pointLight; + + if (LightType::SpotLight == settings.m_lightType) + { + pointLight.m_attenuationSpotOuter.m_outer = settings.m_spotOuterAngle; + pointLight.m_spotDirectionInner.m_inner = settings.m_spotInnerAngle; + } + else + { + pointLight.m_attenuationSpotOuter.m_outer = 91.0f; //above 90.0f means point light + } + + s_uniforms.submitPerFrameUniforms(); + + // Time. + int64_t now = bx::getHPCounter(); + static int64_t last = now; + const int64_t frameTime = now - last; + last = now; + const double freq = double(bx::getHPFrequency() ); + const double toMs = 1000.0/freq; + const float deltaTime = float(frameTime/freq); + + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/16-shadowmaps"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Shadow maps example."); + bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); + + // Update camera. + cameraUpdate(deltaTime); + + // Update view mtx. + cameraGetViewMtx(viewState.m_view); + + // Update lights. + pointLight.computeViewSpaceComponents(viewState.m_view); + directionalLight.computeViewSpaceComponents(viewState.m_view); + + // Update time accumulators. + if (settings.m_updateLights) { timeAccumulatorLight += deltaTime; } + if (settings.m_updateScene) { timeAccumulatorScene += deltaTime; } + + // Setup lights. + pointLight.m_position.m_x = cos(timeAccumulatorLight) * 20.0f; + pointLight.m_position.m_y = 26.0f; + pointLight.m_position.m_z = sin(timeAccumulatorLight) * 20.0f; + pointLight.m_spotDirectionInner.m_x = -pointLight.m_position.m_x; + pointLight.m_spotDirectionInner.m_y = -pointLight.m_position.m_y; + pointLight.m_spotDirectionInner.m_z = -pointLight.m_position.m_z; + + directionalLight.m_position.m_x = -cos(timeAccumulatorLight); + directionalLight.m_position.m_y = -1.0f; + directionalLight.m_position.m_z = -sin(timeAccumulatorLight); + + // Setup instance matrices. + float mtxFloor[16]; + const float floorScale = 550.0f; + mtxScaleRotateTranslate(mtxFloor + , floorScale //scaleX + , floorScale //scaleY + , floorScale //scaleZ + , 0.0f //rotX + , 0.0f //rotY + , 0.0f //rotZ + , 0.0f //translateX + , 0.0f //translateY + , 0.0f //translateZ + ); + + float mtxBunny[16]; + mtxScaleRotateTranslate(mtxBunny + , 5.0f + , 5.0f + , 5.0f + , 0.0f + , 1.56f - timeAccumulatorScene + , 0.0f + , 15.0f + , 5.0f + , 0.0f + ); + + float mtxHollowcube[16]; + mtxScaleRotateTranslate(mtxHollowcube + , 2.5f + , 2.5f + , 2.5f + , 0.0f + , 1.56f - timeAccumulatorScene + , 0.0f + , 0.0f + , 10.0f + , 0.0f + ); + + float mtxCube[16]; + mtxScaleRotateTranslate(mtxCube + , 2.5f + , 2.5f + , 2.5f + , 0.0f + , 1.56f - timeAccumulatorScene + , 0.0f + , -15.0f + , 5.0f + , 0.0f + ); + + const uint8_t numTrees = 10; + float mtxTrees[numTrees][16]; + for (uint8_t ii = 0; ii < numTrees; ++ii) + { + mtxScaleRotateTranslate(mtxTrees[ii] + , 2.0f + , 2.0f + , 2.0f + , 0.0f + , float(ii) + , 0.0f + , sin(float(ii)*2.0f*float(M_PI)/float(numTrees) ) * 60.0f + , 0.0f + , cos(float(ii)*2.0f*float(M_PI)/float(numTrees) ) * 60.0f + ); + } + + // Compute transform matrices. + const uint8_t shadowMapPasses = ShadowMapRenderTargets::Count; + float lightView[shadowMapPasses][16]; + float lightProj[shadowMapPasses][16]; + float mtxYpr[TetrahedronFaces::Count][16]; + + float screenProj[16]; + float screenView[16]; + mtxIdentity(screenView); + mtxOrtho(screenProj, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f); + + if (LightType::SpotLight == settings.m_lightType) + { + const float fovy = settings.m_coverageSpotL; + const float aspect = 1.0f; + mtxProj(lightProj[ProjType::Horizontal], fovy, aspect, currentSmSettings->m_near, currentSmSettings->m_far); + + //For linear depth, prevent depth division by variable w-component in shaders and divide here by far plane + if (DepthImpl::Linear == settings.m_depthImpl) + { + lightProj[ProjType::Horizontal][10] /= currentSmSettings->m_far; + lightProj[ProjType::Horizontal][14] /= currentSmSettings->m_far; + } + + float at[3]; + vec3Add(at, pointLight.m_position.m_v, pointLight.m_spotDirectionInner.m_v); + mtxLookAt(lightView[TetrahedronFaces::Green], pointLight.m_position.m_v, at); + } + else if (LightType::PointLight == settings.m_lightType) + { + float ypr[TetrahedronFaces::Count][3] = + { + { toRad( 0.0f), toRad( 27.36780516f), toRad(0.0f) } + ,{ toRad(180.0f), toRad( 27.36780516f), toRad(0.0f) } + ,{ toRad(-90.0f), toRad(-27.36780516f), toRad(0.0f) } + ,{ toRad( 90.0f), toRad(-27.36780516f), toRad(0.0f) } + }; + + + if (settings.m_stencilPack) + { + const float fovx = 143.98570868f + 3.51f + settings.m_fovXAdjust; + const float fovy = 125.26438968f + 9.85f + settings.m_fovYAdjust; + const float aspect = tanf(toRad(fovx*0.5f) )/tanf(toRad(fovy*0.5f) ); + + mtxProj(lightProj[ProjType::Vertical] + , fovx + , aspect + , currentSmSettings->m_near + , currentSmSettings->m_far + ); + + //For linear depth, prevent depth division by variable w-component in shaders and divide here by far plane + if (DepthImpl::Linear == settings.m_depthImpl) + { + lightProj[ProjType::Vertical][10] /= currentSmSettings->m_far; + lightProj[ProjType::Vertical][14] /= currentSmSettings->m_far; + } + + ypr[TetrahedronFaces::Green][2] = toRad(180.0f); + ypr[TetrahedronFaces::Yellow][2] = toRad( 0.0f); + ypr[TetrahedronFaces::Blue][2] = toRad( 90.0f); + ypr[TetrahedronFaces::Red][2] = toRad(-90.0f); + } + + const float fovx = 143.98570868f + 7.8f + settings.m_fovXAdjust; + const float fovy = 125.26438968f + 3.0f + settings.m_fovYAdjust; + const float aspect = tanf(toRad(fovx*0.5f) )/tanf(toRad(fovy*0.5f) ); + + mtxProj(lightProj[ProjType::Horizontal], fovy, aspect, currentSmSettings->m_near, currentSmSettings->m_far); + + //For linear depth, prevent depth division by variable w component in shaders and divide here by far plane + if (DepthImpl::Linear == settings.m_depthImpl) + { + lightProj[ProjType::Horizontal][10] /= currentSmSettings->m_far; + lightProj[ProjType::Horizontal][14] /= currentSmSettings->m_far; + } + + + for (uint8_t ii = 0; ii < TetrahedronFaces::Count; ++ii) + { + float mtxTmp[16]; + mtxYawPitchRoll(mtxTmp, ypr[ii][0], ypr[ii][1], ypr[ii][2]); + + float tmp[3] = + { + -vec3Dot(pointLight.m_position.m_v, &mtxTmp[0]) + , -vec3Dot(pointLight.m_position.m_v, &mtxTmp[4]) + , -vec3Dot(pointLight.m_position.m_v, &mtxTmp[8]) + }; + + mtxTranspose(mtxYpr[ii], mtxTmp); + + memcpy(lightView[ii], mtxYpr[ii], 12*sizeof(float) ); + lightView[ii][12] = tmp[0]; + lightView[ii][13] = tmp[1]; + lightView[ii][14] = tmp[2]; + lightView[ii][15] = 1.0f; + } + } + else // LightType::DirectionalLight == settings.m_lightType + { + // Setup light view mtx. + float eye[3] = + { + -directionalLight.m_position.m_x + , -directionalLight.m_position.m_y + , -directionalLight.m_position.m_z + }; + float at[3] = { 0.0f, 0.0f, 0.0f }; + mtxLookAt(lightView[0], eye, at); + + // Compute camera inverse view mtx. + float mtxViewInv[16]; + mtxInverse(mtxViewInv, viewState.m_view); + + // Compute split distances. + const uint8_t maxNumSplits = 4; + BX_CHECK(maxNumSplits >= settings.m_numSplits, "Error! Max num splits."); + + float splitSlices[maxNumSplits*2]; + splitFrustum(splitSlices, settings.m_numSplits, currentSmSettings->m_near, currentSmSettings->m_far, settings.m_splitDistribution); + + // Update uniforms. + for (uint8_t ii = 0, ff = 1; ii < settings.m_numSplits; ++ii, ff+=2) + { + // This lags for 1 frame, but it's not a problem. + s_uniforms.m_csmFarDistances[ii] = splitSlices[ff]; + } + + float mtxProj[16]; + mtxOrtho(mtxProj, 1.0f, -1.0f, 1.0f, -1.0f, -currentSmSettings->m_far, currentSmSettings->m_far); + + const uint8_t numCorners = 8; + float frustumCorners[maxNumSplits][numCorners][3]; + for (uint8_t ii = 0, nn = 0, ff = 1; ii < settings.m_numSplits; ++ii, nn+=2, ff+=2) + { + // Compute frustum corners for one split in world space. + worldSpaceFrustumCorners( (float*)frustumCorners[ii], splitSlices[nn], splitSlices[ff], projWidth, projHeight, mtxViewInv); + + float min[3] = { 9000.0f, 9000.0f, 9000.0f }; + float max[3] = { -9000.0f, -9000.0f, -9000.0f }; + + for (uint8_t jj = 0; jj < numCorners; ++jj) + { + // Transform to light space. + float lightSpaceFrustumCorner[3]; + vec3MulMtx(lightSpaceFrustumCorner, frustumCorners[ii][jj], lightView[0]); + + // Update bounding box. + min[0] = fminf(min[0], lightSpaceFrustumCorner[0]); + max[0] = fmaxf(max[0], lightSpaceFrustumCorner[0]); + min[1] = fminf(min[1], lightSpaceFrustumCorner[1]); + max[1] = fmaxf(max[1], lightSpaceFrustumCorner[1]); + min[2] = fminf(min[2], lightSpaceFrustumCorner[2]); + max[2] = fmaxf(max[2], lightSpaceFrustumCorner[2]); + } + + float minproj[3]; + float maxproj[3]; + vec3MulMtxH(minproj, min, mtxProj); + vec3MulMtxH(maxproj, max, mtxProj); + + float offsetx, offsety; + float scalex, scaley; + + scalex = 2.0f / (maxproj[0] - minproj[0]); + scaley = 2.0f / (maxproj[1] - minproj[1]); + + if (settings.m_stabilize) + { + const float quantizer = 64.0f; + scalex = quantizer / ceilf(quantizer / scalex); + scaley = quantizer / ceilf(quantizer / scaley); + } + + offsetx = 0.5f * (maxproj[0] + minproj[0]) * scalex; + offsety = 0.5f * (maxproj[1] + minproj[1]) * scaley; + + if (settings.m_stabilize) + { + const float halfSize = currentShadowMapSizef * 0.5f; + offsetx = ceilf(offsetx * halfSize) / halfSize; + offsety = ceilf(offsety * halfSize) / halfSize; + } + + float mtxCrop[16]; + mtxIdentity(mtxCrop); + mtxCrop[ 0] = scalex; + mtxCrop[ 5] = scaley; + mtxCrop[12] = offsetx; + mtxCrop[13] = offsety; + + mtxMul(lightProj[ii], mtxCrop, mtxProj); + } + } + + // Reset render targets. + const uint32_t viewMask = (uint32_t(1) << (RENDER_PASS_18+1) ) - 1; + const bgfx::RenderTargetHandle invalidRt = BGFX_INVALID_HANDLE; + bgfx::setViewRenderTargetMask(viewMask, invalidRt); + + // Determine on-screen rectangle size where depth buffer will be drawn. + const uint16_t depthRectHeight = uint16_t(float(viewState.m_height) / 2.5f); + const uint16_t depthRectWidth = depthRectHeight; + const uint16_t depthRectX = 0; + const uint16_t depthRectY = viewState.m_height - depthRectHeight; + + // Setup views and render targets. + bgfx::setViewRect(0, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewTransform(0, viewState.m_view, viewState.m_proj); + + if (LightType::SpotLight == settings.m_lightType) + { + /** + * RENDER_PASS_0 - Clear shadow map. (used as convenience, otherwise render_pass_1 could be cleared) + * RENDER_PASS_1 - Craft shadow map. + * RENDER_PASS_5 - Vertical blur. + * RENDER_PASS_6 - Horizontal blur. + * RENDER_PASS_13 - Draw scene. + * RENDER_PASS_14 - Draw floor bottom. + * RENDER_PASS_15 - Draw depth buffer. + */ + + bgfx::setViewRect(RENDER_PASS_0, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_1, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_5, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_6, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_13, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewRect(RENDER_PASS_14, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewRect(RENDER_PASS_15, depthRectX, depthRectY, depthRectWidth, depthRectHeight); + + bgfx::setViewTransform(RENDER_PASS_0, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_1, lightView[0], lightProj[ProjType::Horizontal]); + bgfx::setViewTransform(RENDER_PASS_5, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_6, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_13, viewState.m_view, viewState.m_proj); + bgfx::setViewTransform(RENDER_PASS_14, viewState.m_view, viewState.m_proj); + bgfx::setViewTransform(RENDER_PASS_15, screenView, screenProj); + + bgfx::setViewRenderTarget(RENDER_PASS_0, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_1, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_5, s_rtBlur); + bgfx::setViewRenderTarget(RENDER_PASS_6, s_rtShadowMap[0]); + } + else if (LightType::PointLight == settings.m_lightType) + { + /** + * RENDER_PASS_0 - Clear entire shadow map. + * RENDER_PASS_1 - Craft green tetrahedron shadow face. + * RENDER_PASS_2 - Craft yellow tetrahedron shadow face. + * RENDER_PASS_3 - Craft blue tetrahedron shadow face. + * RENDER_PASS_4 - Craft red tetrahedron shadow face. + * RENDER_PASS_5 - Vertical blur. + * RENDER_PASS_6 - Horizontal blur. + * RENDER_PASS_13 - Draw scene. + * RENDER_PASS_14 - Draw floor bottom. + * RENDER_PASS_15 - Draw depth buffer. + */ + + bgfx::setViewRect(RENDER_PASS_0, 0, 0, currentShadowMapSize, currentShadowMapSize); + if (settings.m_stencilPack) + { + const uint16_t f = currentShadowMapSize; //full size + const uint16_t h = currentShadowMapSize/2; //half size + bgfx::setViewRect(RENDER_PASS_1, 0, 0, f, h); + bgfx::setViewRect(RENDER_PASS_2, 0, h, f, h); + bgfx::setViewRect(RENDER_PASS_3, 0, 0, h, f); + bgfx::setViewRect(RENDER_PASS_4, h, 0, h, f); + } + else + { + const uint16_t h = currentShadowMapSize/2; //half size + bgfx::setViewRect(RENDER_PASS_1, 0, 0, h, h); + bgfx::setViewRect(RENDER_PASS_2, h, 0, h, h); + bgfx::setViewRect(RENDER_PASS_3, 0, h, h, h); + bgfx::setViewRect(RENDER_PASS_4, h, h, h, h); + } + bgfx::setViewRect(RENDER_PASS_5, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_6, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_13, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewRect(RENDER_PASS_14, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewRect(RENDER_PASS_15, depthRectX, depthRectY, depthRectWidth, depthRectHeight); + + bgfx::setViewTransform(RENDER_PASS_0, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_1, lightView[TetrahedronFaces::Green], lightProj[ProjType::Horizontal]); + bgfx::setViewTransform(RENDER_PASS_2, lightView[TetrahedronFaces::Yellow], lightProj[ProjType::Horizontal]); + if(settings.m_stencilPack) + { + bgfx::setViewTransform(RENDER_PASS_3, lightView[TetrahedronFaces::Blue], lightProj[ProjType::Vertical]); + bgfx::setViewTransform(RENDER_PASS_4, lightView[TetrahedronFaces::Red], lightProj[ProjType::Vertical]); + } + else + { + bgfx::setViewTransform(RENDER_PASS_3, lightView[TetrahedronFaces::Blue], lightProj[ProjType::Horizontal]); + bgfx::setViewTransform(RENDER_PASS_4, lightView[TetrahedronFaces::Red], lightProj[ProjType::Horizontal]); + } + bgfx::setViewTransform(RENDER_PASS_5, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_6, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_13, viewState.m_view, viewState.m_proj); + bgfx::setViewTransform(RENDER_PASS_14, viewState.m_view, viewState.m_proj); + bgfx::setViewTransform(RENDER_PASS_15, screenView, screenProj); + + bgfx::setViewRenderTarget(RENDER_PASS_0, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_1, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_2, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_3, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_4, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_5, s_rtBlur); + bgfx::setViewRenderTarget(RENDER_PASS_6, s_rtShadowMap[0]); + } + else // LightType::DirectionalLight == settings.m_lightType + { + /** + * RENDER_PASS_1 - Craft shadow map for first split. + * RENDER_PASS_2 - Craft shadow map for second split. + * RENDER_PASS_3 - Craft shadow map for third split. + * RENDER_PASS_4 - Craft shadow map for fourth split. + * RENDER_PASS_5 - Vertical blur for first split. + * RENDER_PASS_6 - Horizontal blur for first split. + * RENDER_PASS_7 - Vertical blur for second split. + * RENDER_PASS_8 - Horizontal blur for second split. + * RENDER_PASS_9 - Vertical blur for third split. + * RENDER_PASS_10 - Horizontal blur for third split. + * RENDER_PASS_11 - Vertical blur for fourth split. + * RENDER_PASS_12 - Horizontal blur for fourth split. + * RENDER_PASS_13 - Draw scene. + * RENDER_PASS_14 - Draw floor bottom. + * RENDER_PASS_15 - Draw depth buffer for first split. + * RENDER_PASS_16 - Draw depth buffer for second split. + * RENDER_PASS_17 - Draw depth buffer for third split. + * RENDER_PASS_18 - Draw depth buffer for fourth split. + */ + + const uint16_t depthRectHeight = viewState.m_height / 3; + const uint16_t depthRectWidth = depthRectHeight; + const uint16_t depthRectX = 0; + const uint16_t depthRectY = viewState.m_height - depthRectHeight; + + bgfx::setViewRect(RENDER_PASS_1, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_2, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_3, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_4, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_5, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_6, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_7, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_8, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_9, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_10, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_11, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_12, 0, 0, currentShadowMapSize, currentShadowMapSize); + bgfx::setViewRect(RENDER_PASS_13, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewRect(RENDER_PASS_14, 0, 0, viewState.m_width, viewState.m_height); + bgfx::setViewRect(RENDER_PASS_15, depthRectX+(0*depthRectWidth), depthRectY, depthRectWidth, depthRectHeight); + bgfx::setViewRect(RENDER_PASS_16, depthRectX+(1*depthRectWidth), depthRectY, depthRectWidth, depthRectHeight); + bgfx::setViewRect(RENDER_PASS_17, depthRectX+(2*depthRectWidth), depthRectY, depthRectWidth, depthRectHeight); + bgfx::setViewRect(RENDER_PASS_18, depthRectX+(3*depthRectWidth), depthRectY, depthRectWidth, depthRectHeight); + + bgfx::setViewTransform(RENDER_PASS_1, lightView[0], lightProj[0]); + bgfx::setViewTransform(RENDER_PASS_2, lightView[0], lightProj[1]); + bgfx::setViewTransform(RENDER_PASS_3, lightView[0], lightProj[2]); + bgfx::setViewTransform(RENDER_PASS_4, lightView[0], lightProj[3]); + bgfx::setViewTransform(RENDER_PASS_5, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_6, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_7, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_8, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_9, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_10, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_11, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_12, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_13, viewState.m_view, viewState.m_proj); + bgfx::setViewTransform(RENDER_PASS_14, viewState.m_view, viewState.m_proj); + bgfx::setViewTransform(RENDER_PASS_15, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_16, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_17, screenView, screenProj); + bgfx::setViewTransform(RENDER_PASS_18, screenView, screenProj); + + bgfx::setViewRenderTarget(RENDER_PASS_1, s_rtShadowMap[0]); + bgfx::setViewRenderTarget(RENDER_PASS_2, s_rtShadowMap[1]); + bgfx::setViewRenderTarget(RENDER_PASS_3, s_rtShadowMap[2]); + bgfx::setViewRenderTarget(RENDER_PASS_4, s_rtShadowMap[3]); + bgfx::setViewRenderTarget(RENDER_PASS_5, s_rtBlur); //vblur + bgfx::setViewRenderTarget(RENDER_PASS_6, s_rtShadowMap[0]); //hblur + bgfx::setViewRenderTarget(RENDER_PASS_7, s_rtBlur); //vblur + bgfx::setViewRenderTarget(RENDER_PASS_8, s_rtShadowMap[1]); //hblur + bgfx::setViewRenderTarget(RENDER_PASS_9, s_rtBlur); //vblur + bgfx::setViewRenderTarget(RENDER_PASS_10, s_rtShadowMap[2]); //hblur + bgfx::setViewRenderTarget(RENDER_PASS_11, s_rtBlur); //vblur + bgfx::setViewRenderTarget(RENDER_PASS_12, s_rtShadowMap[3]); //hblur + } + + // Clear backbuffer at beginning. + bgfx::setViewClear(0 + , BGFX_CLEAR_COLOR_BIT + | BGFX_CLEAR_DEPTH_BIT + , clearValues.m_clearRgba + , clearValues.m_clearDepth + , clearValues.m_clearStencil + ); + bgfx::submit(0); + + // Clear shadowmap rendertarget at beginning. + const uint8_t flags0 = (LightType::DirectionalLight == settings.m_lightType) + ? 0 + : BGFX_CLEAR_COLOR_BIT | BGFX_CLEAR_DEPTH_BIT | BGFX_CLEAR_STENCIL_BIT + ; + + bgfx::setViewClear(RENDER_PASS_0 + , flags0 + , 0xfefefefe //blur fails on completely white regions + , clearValues.m_clearDepth + , clearValues.m_clearStencil + ); + bgfx::submit(RENDER_PASS_0); + + const uint8_t flags1 = (LightType::DirectionalLight == settings.m_lightType) + ? BGFX_CLEAR_COLOR_BIT | BGFX_CLEAR_DEPTH_BIT + : 0 + ; + + for (uint8_t ii = 0; ii < 4; ++ii) + { + bgfx::setViewClear(RENDER_PASS_1+ii + , flags1 + , 0xfefefefe //blur fails on completely white regions + , clearValues.m_clearDepth + , clearValues.m_clearStencil + ); + bgfx::submit(RENDER_PASS_1+ii); + } + + // Render. + + // Craft shadow map. + { + // Craft stencil mask for point light shadow map packing. + if(LightType::PointLight == settings.m_lightType && settings.m_stencilPack) + { + if (bgfx::checkAvailTransientVertexBuffer(6, posDecl) ) + { + struct Pos + { + float m_x, m_y, m_z; + }; + + bgfx::TransientVertexBuffer vb; + bgfx::allocTransientVertexBuffer(&vb, 6, posDecl); + Pos* vertex = (Pos*)vb.data; + + const float min = 0.0f; + const float max = 1.0f; + const float center = 0.5f; + const float zz = 0.0f; + + vertex[0].m_x = min; + vertex[0].m_y = min; + vertex[0].m_z = zz; + + vertex[1].m_x = max; + vertex[1].m_y = min; + vertex[1].m_z = zz; + + vertex[2].m_x = center; + vertex[2].m_y = center; + vertex[2].m_z = zz; + + vertex[3].m_x = center; + vertex[3].m_y = center; + vertex[3].m_z = zz; + + vertex[4].m_x = max; + vertex[4].m_y = max; + vertex[4].m_z = zz; + + vertex[5].m_x = min; + vertex[5].m_y = max; + vertex[5].m_z = zz; + + bgfx::setProgram(s_programs.m_black); + bgfx::setState(0); + bgfx::setStencil(BGFX_STENCIL_TEST_ALWAYS + | BGFX_STENCIL_FUNC_REF(1) + | BGFX_STENCIL_FUNC_RMASK(0xff) + | BGFX_STENCIL_OP_FAIL_S_REPLACE + | BGFX_STENCIL_OP_FAIL_Z_REPLACE + | BGFX_STENCIL_OP_PASS_Z_REPLACE + ); + bgfx::setVertexBuffer(&vb); + bgfx::submit(RENDER_PASS_0); + } + } + + // Draw scene into shadowmap. + uint8_t drawNum; + if (LightType::SpotLight == settings.m_lightType) + { + drawNum = 1; + } + else if (LightType::PointLight == settings.m_lightType) + { + drawNum = 4; + } + else //LightType::DirectionalLight == settings.m_lightType) + { + drawNum = settings.m_numSplits; + } + + for (uint8_t ii = 0; ii < drawNum; ++ii) + { + const uint8_t viewId = RENDER_PASS_1 + ii; + + uint8_t renderStateIndex = RenderState::ShadowMap_PackDepth; + if(LightType::PointLight == settings.m_lightType && settings.m_stencilPack) + { + renderStateIndex = (ii < 2) ? RenderState::ShadowMap_PackDepthHoriz : RenderState::ShadowMap_PackDepthVert; + } + + // Floor. + hplaneMesh.submit(viewId + , mtxFloor + , *currentSmSettings->m_progPack + , s_renderStates[renderStateIndex] + ); + + // Bunny. + bunnyMesh.submit(viewId + , mtxBunny + , *currentSmSettings->m_progPack + , s_renderStates[renderStateIndex] + ); + + // Hollow cube. + hollowcubeMesh.submit(viewId + , mtxHollowcube + , *currentSmSettings->m_progPack + , s_renderStates[renderStateIndex] + ); + + // Cube. + cubeMesh.submit(viewId + , mtxCube + , *currentSmSettings->m_progPack + , s_renderStates[renderStateIndex] + ); + + // Trees. + for (uint8_t ii = 0; ii < numTrees; ++ii) + { + treeMesh.submit(viewId + , mtxTrees[ii] + , *currentSmSettings->m_progPack + , s_renderStates[renderStateIndex] + ); + } + } + } + + PackDepth::Enum depthType = (SmImpl::VSM == settings.m_smImpl) ? PackDepth::VSM : PackDepth::RGBA; + bool bVsmOrEsm = (SmImpl::VSM == settings.m_smImpl) || (SmImpl::ESM == settings.m_smImpl); + + // Blur shadow map. + if (bVsmOrEsm && currentSmSettings->m_doBlur) + { + bgfx::setTexture(4, u_shadowMap[0], s_rtShadowMap[0]); + bgfx::setProgram(s_programs.m_vBlur[depthType]); + bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); + screenSpaceQuad(currentShadowMapSizef, currentShadowMapSizef, s_flipV); + bgfx::submit(RENDER_PASS_5); + + bgfx::setTexture(4, u_shadowMap[0], s_rtBlur); + bgfx::setProgram(s_programs.m_hBlur[depthType]); + bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); + screenSpaceQuad(currentShadowMapSizef, currentShadowMapSizef, s_flipV); + bgfx::submit(RENDER_PASS_6); + + if (LightType::DirectionalLight == settings.m_lightType) + { + for (uint8_t ii = 1, jj = 2; ii < settings.m_numSplits; ++ii, jj+=2) + { + const uint8_t viewId = RENDER_PASS_5 + jj; + + bgfx::setTexture(4, u_shadowMap[0], s_rtShadowMap[ii]); + bgfx::setProgram(s_programs.m_vBlur[depthType]); + bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); + screenSpaceQuad(currentShadowMapSizef, currentShadowMapSizef, s_flipV); + bgfx::submit(viewId); + + bgfx::setTexture(4, u_shadowMap[0], s_rtBlur); + bgfx::setProgram(s_programs.m_hBlur[depthType]); + bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); + screenSpaceQuad(currentShadowMapSizef, currentShadowMapSizef, s_flipV); + bgfx::submit(viewId+1); + } + } + } + + // Draw scene. + { + // Setup shadow mtx. + float mtxShadow[16]; + + const float ymul = (s_flipV) ? 0.5f : -0.5f; + const float zadd = (DepthImpl::Linear == settings.m_depthImpl) ? 0.0f : 0.5f; + + const float mtxBias[16] = + { + 0.5f, 0.0f, 0.0f, 0.0f, + 0.0f, ymul, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.5f, 0.5f, zadd, 1.0f, + }; + + if (LightType::SpotLight == settings.m_lightType) + { + float mtxTmp[16]; + mtxMul(mtxTmp, lightProj[ProjType::Horizontal], mtxBias); + mtxMul(mtxShadow, lightView[0], mtxTmp); //lightViewProjBias + } + else if (LightType::PointLight == settings.m_lightType) + { + const float s = (s_flipV) ? 1.0f : -1.0f; //sign + const float zadd = (DepthImpl::Linear == settings.m_depthImpl) ? 0.0f : 0.5f; + + const float mtxCropBias[2][TetrahedronFaces::Count][16] = + { + { // settings.m_stencilPack == false + + { // D3D: Green, OGL: Blue + 0.25f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.25f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.25f, 0.25f, zadd, 1.0f, + }, + { // D3D: Yellow, OGL: Red + 0.25f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.25f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.75f, 0.25f, zadd, 1.0f, + }, + { // D3D: Blue, OGL: Green + 0.25f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.25f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.25f, 0.75f, zadd, 1.0f, + }, + { // D3D: Red, OGL: Yellow + 0.25f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.25f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.75f, 0.75f, zadd, 1.0f, + }, + }, + { // settings.m_stencilPack == true + + { // D3D: Red, OGL: Blue + 0.25f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.5f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.25f, 0.5f, zadd, 1.0f, + }, + { // D3D: Blue, OGL: Red + 0.25f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.5f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.75f, 0.5f, zadd, 1.0f, + }, + { // D3D: Green, OGL: Green + 0.5f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.25f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.5f, 0.75f, zadd, 1.0f, + }, + { // D3D: Yellow, OGL: Yellow + 0.5f, 0.0f, 0.0f, 0.0f, + 0.0f, s*0.25f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.5f, 0.25f, zadd, 1.0f, + }, + } + }; + + //Use as: [stencilPack][flipV][tetrahedronFace] + static const uint8_t cropBiasIndices[2][2][4] = + { + { // settings.m_stencilPack == false + { 0, 1, 2, 3 }, //flipV == false + { 2, 3, 0, 1 }, //flipV == true + }, + { // settings.m_stencilPack == true + { 3, 2, 0, 1 }, //flipV == false + { 2, 3, 0, 1 }, //flipV == true + }, + }; + + for (uint8_t ii = 0; ii < TetrahedronFaces::Count; ++ii) + { + ProjType::Enum projType = (settings.m_stencilPack) ? ProjType::Enum(ii>1) : ProjType::Horizontal; + uint8_t biasIndex = cropBiasIndices[settings.m_stencilPack][uint8_t(s_flipV)][ii]; + + float mtxTmp[16]; + mtxMul(mtxTmp, mtxYpr[ii], lightProj[projType]); + mtxMul(shadowMapMtx[ii], mtxTmp, mtxCropBias[settings.m_stencilPack][biasIndex]); //mtxYprProjBias + } + + mtxTranslate(mtxShadow //lightInvTranslate + , -pointLight.m_position.m_v[0] + , -pointLight.m_position.m_v[1] + , -pointLight.m_position.m_v[2] + ); + } + else //LightType::DirectionalLight == settings.m_lightType + { + for (uint8_t ii = 0; ii < settings.m_numSplits; ++ii) + { + float mtxTmp[16]; + + mtxMul(mtxTmp, lightProj[ii], mtxBias); + mtxMul(shadowMapMtx[ii], lightView[0], mtxTmp); //lViewProjCropBias + } + } + + // Floor. + if (LightType::DirectionalLight != settings.m_lightType) + { + mtxMul(lightMtx, mtxFloor, mtxShadow); //not needed for directional light + } + hplaneMesh.submit(RENDER_PASS_13 + , mtxFloor + , *currentSmSettings->m_progDraw + , s_renderStates[RenderState::Default] + ); + + // Bunny. + if (LightType::DirectionalLight != settings.m_lightType) + { + mtxMul(lightMtx, mtxBunny, mtxShadow); + } + bunnyMesh.submit(RENDER_PASS_13 + , mtxBunny + , *currentSmSettings->m_progDraw + , s_renderStates[RenderState::Default] + ); + + // Hollow cube. + if (LightType::DirectionalLight != settings.m_lightType) + { + mtxMul(lightMtx, mtxHollowcube, mtxShadow); + } + hollowcubeMesh.submit(RENDER_PASS_13 + , mtxHollowcube + , *currentSmSettings->m_progDraw + , s_renderStates[RenderState::Default] + ); + + // Cube. + if (LightType::DirectionalLight != settings.m_lightType) + { + mtxMul(lightMtx, mtxCube, mtxShadow); + } + cubeMesh.submit(RENDER_PASS_13 + , mtxCube + , *currentSmSettings->m_progDraw + , s_renderStates[RenderState::Default] + ); + + // Trees. + for (uint8_t ii = 0; ii < numTrees; ++ii) + { + if (LightType::DirectionalLight != settings.m_lightType) + { + mtxMul(lightMtx, mtxTrees[ii], mtxShadow); + } + treeMesh.submit(RENDER_PASS_13 + , mtxTrees[ii] + , *currentSmSettings->m_progDraw + , s_renderStates[RenderState::Default] + ); + } + + // Lights. + if (LightType::SpotLight == settings.m_lightType || LightType::PointLight == settings.m_lightType) + { + const float lightScale[3] = { 1.5f, 1.5f, 1.5f }; + float mtx[16]; + mtxBillboard(mtx, viewState.m_view, pointLight.m_position.m_v, lightScale); + vplaneMesh.submit(RENDER_PASS_13 + , mtx + , s_programs.m_colorTexture + , s_renderStates[RenderState::Custom_BlendLightTexture] + , texFlare + ); + } + + // Draw floor bottom. + float floorBottomMtx[16]; + mtxScaleRotateTranslate(floorBottomMtx + , floorScale //scaleX + , floorScale //scaleY + , floorScale //scaleZ + , 0.0f //rotX + , 0.0f //rotY + , 0.0f //rotZ + , 0.0f //translateX + , -0.1f //translateY + , 0.0f //translateZ + ); + + hplaneMesh.submit(RENDER_PASS_14 + , floorBottomMtx + , s_programs.m_texture + , s_renderStates[RenderState::Custom_DrawPlaneBottom] + , texFigure + ); + } + + // Draw depth rect. + if (settings.m_drawDepthBuffer) + { + bgfx::setTexture(4, u_shadowMap[0], s_rtShadowMap[0]); + bgfx::setProgram(s_programs.m_drawDepth[depthType]); + bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); + screenSpaceQuad(currentShadowMapSizef, currentShadowMapSizef, s_flipV); + bgfx::submit(RENDER_PASS_15); + + if (LightType::DirectionalLight == settings.m_lightType) + { + for (uint8_t ii = 1; ii < settings.m_numSplits; ++ii) + { + bgfx::setTexture(4, u_shadowMap[0], s_rtShadowMap[ii]); + bgfx::setProgram(s_programs.m_drawDepth[depthType]); + bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); + screenSpaceQuad(currentShadowMapSizef, currentShadowMapSizef, s_flipV); + bgfx::submit(RENDER_PASS_15+ii); + } + } + } + + // Update render target size. + shadowMapSize = 1 << uint32_t(currentSmSettings->m_sizePwrTwo); + if (bLtChanged || currentShadowMapSize != shadowMapSize) + { + currentShadowMapSize = shadowMapSize; + currentShadowMapSizef = float(int16_t(currentShadowMapSize) ); + s_uniforms.m_shadowMapTexelSize = 1.0f / currentShadowMapSizef; + + bgfx::destroyRenderTarget(s_rtShadowMap[0]); + s_rtShadowMap[0] = bgfx::createRenderTarget(currentShadowMapSize, currentShadowMapSize, BGFX_RENDER_TARGET_COLOR_RGBA8 | BGFX_RENDER_TARGET_DEPTH_D24S8); + + if (LightType::DirectionalLight == settings.m_lightType) + { + for (uint8_t ii = 1; ii < ShadowMapRenderTargets::Count; ++ii) + { + bgfx::destroyRenderTarget(s_rtShadowMap[ii]); + s_rtShadowMap[ii] = bgfx::createRenderTarget(currentShadowMapSize, currentShadowMapSize, BGFX_RENDER_TARGET_COLOR_RGBA8 | BGFX_RENDER_TARGET_DEPTH_D24S8); + } + } + + bgfx::destroyRenderTarget(s_rtBlur); + s_rtBlur = bgfx::createRenderTarget(currentShadowMapSize, currentShadowMapSize, BGFX_RENDER_TARGET_COLOR_RGBA8); + } + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx::frame(); + + } + + bunnyMesh.unload(); + treeMesh.unload(); + cubeMesh.unload(); + hollowcubeMesh.unload(); + hplaneMesh.unload(); + vplaneMesh.unload(); + + bgfx::destroyTexture(texFigure); + bgfx::destroyTexture(texFieldstone); + bgfx::destroyTexture(texFlare); + + for (uint8_t ii = 0; ii < ShadowMapRenderTargets::Count; ++ii) + { + bgfx::destroyRenderTarget(s_rtShadowMap[ii]); + } + bgfx::destroyRenderTarget(s_rtBlur); + + s_programs.destroy(); + + bgfx::destroyUniform(u_texColor); + bgfx::destroyUniform(u_shadowMap[3]); + bgfx::destroyUniform(u_shadowMap[2]); + bgfx::destroyUniform(u_shadowMap[1]); + bgfx::destroyUniform(u_shadowMap[0]); + + s_uniforms.destroy(); + + imguiDestroy(); + + // Shutdown bgfx. + bgfx::shutdown(); + + return 0; +} diff --git a/examples/16-shadowmaps/tree.obj b/examples/16-shadowmaps/tree.obj new file mode 100644 index 000000000..f57befcfb --- /dev/null +++ b/examples/16-shadowmaps/tree.obj @@ -0,0 +1,14156 @@ +# Blender v2.66 (sub 1) OBJ File: '' +# www.blender.org +g tree_tree.001 +v -0.528409 0.097456 -0.473664 +v -0.478109 -0.000000 0.533369 +v 0.528409 -0.097456 0.473663 +v 0.478109 0.000000 -0.533369 +v -0.462358 1.211925 -0.307472 +v -0.418346 1.126652 0.573681 +v 0.462358 1.041378 0.521439 +v 0.418346 1.126652 -0.359714 +v -0.161610 2.345739 -0.146935 +v -0.124433 2.269162 0.608021 +v 0.617872 2.115946 0.555926 +v 0.580694 2.192523 -0.199030 +v 0.138871 3.395035 0.012115 +v 0.172703 3.347843 0.642563 +v 0.799581 3.268506 0.602984 +v 0.765749 3.315698 -0.027465 +v 0.252438 4.463923 0.117709 +v 0.281878 4.461236 0.623338 +v 0.787508 4.458720 0.593885 +v 0.758068 4.461408 0.088255 +v 0.280523 5.583565 0.140432 +v 0.302545 5.595459 0.519476 +v 0.681740 5.599979 0.497304 +v 0.659719 5.588085 0.118260 +v 0.355254 6.718205 0.167615 +v 0.370780 6.750537 0.418309 +v 0.622686 6.727806 0.405640 +v 0.607160 6.695473 0.154946 +v 0.599378 7.806367 -0.038032 +v 0.607516 7.826366 0.086737 +v 0.733109 7.811326 0.080956 +v 0.724972 7.791327 -0.043812 +v 0.736643 8.933455 -0.083840 +v 0.736643 8.933455 -0.083840 +v 0.736643 8.933455 -0.083840 +v 0.736643 8.933455 -0.083840 +v -0.043875 1.245991 0.720704 +v 0.625158 1.126652 0.151676 +v 0.043874 1.007312 -0.506737 +v -0.625158 1.126652 0.062291 +v 0.040456 2.345212 0.463796 +v 0.613913 2.242920 -0.023942 +v 0.115669 2.140629 -0.588296 +v -0.457787 2.242920 -0.100557 +v -0.001515 3.470312 0.106235 +v 0.476565 3.375144 -0.297769 +v 0.062834 3.216559 -0.750002 +v -0.415246 3.311727 -0.345997 +v -0.067156 4.515477 -0.372318 +v 0.314097 4.452688 -0.699792 +v -0.013792 4.291711 -1.050663 +v -0.395045 4.354500 -0.723189 +v -0.260558 5.556573 -0.791282 +v 0.022492 5.525999 -1.042776 +v -0.218554 5.377425 -1.296004 +v -0.501603 5.408000 -1.044509 +v -0.520580 6.544024 -1.320909 +v -0.331084 6.520402 -1.487243 +v -0.487913 6.405616 -1.649609 +v -0.677409 6.429238 -1.483274 +v -0.787409 7.514112 -1.862816 +v -0.689601 7.487138 -1.938576 +v -0.768620 7.432738 -2.021221 +v -0.866427 7.459712 -1.945460 +v -0.768813 8.442052 -2.527225 +v -0.768813 8.442052 -2.527225 +v -0.768813 8.442052 -2.527225 +v -0.768813 8.442052 -2.527225 +v 0.110011 1.175972 -0.508065 +v -0.616962 1.126652 -0.003370 +v -0.110011 1.077331 0.722032 +v 0.616962 1.126652 0.217337 +v 0.071790 2.293404 -0.294377 +v -0.551330 2.251130 0.138220 +v -0.116801 2.208855 0.759993 +v 0.506319 2.251130 0.327396 +v 0.047230 3.417485 -0.157068 +v -0.472030 3.381736 0.203388 +v -0.109914 3.345987 0.721492 +v 0.409345 3.381736 0.361036 +v 0.008297 4.548745 0.060599 +v -0.406859 4.505913 0.347559 +v -0.116916 4.463082 0.760637 +v 0.298240 4.505913 0.473677 +v -0.032621 5.681410 0.289360 +v -0.343415 5.628910 0.501379 +v -0.125385 5.576409 0.807986 +v 0.185410 5.628910 0.595967 +v -0.102806 6.774024 0.676786 +v -0.306889 6.704557 0.809670 +v -0.161189 6.665717 1.013132 +v 0.042894 6.735184 0.880248 +v -0.379880 7.796240 1.099022 +v -0.480396 7.753480 1.163067 +v -0.408523 7.739197 1.266332 +v -0.308007 7.781956 1.202287 +v -0.626063 8.834417 1.481314 +v -0.626063 8.834417 1.481314 +v -0.626063 8.834417 1.481314 +v -0.626063 8.834417 1.481314 +v -0.405540 2.413642 -0.222202 +v -0.090634 2.242920 0.447793 +v 0.561666 2.072199 0.097702 +v 0.246759 2.242920 -0.572293 +v -0.002438 3.464207 -0.307356 +v 0.259984 3.321939 0.250973 +v 0.803567 3.179670 -0.040770 +v 0.541145 3.321939 -0.599099 +v 0.437213 4.495812 0.060550 +v 0.612478 4.280862 0.484359 +v 1.057593 4.196939 0.257719 +v 0.882328 4.411890 -0.166090 +v 0.910062 5.444958 0.465193 +v 1.054590 5.317750 0.792654 +v 1.377485 5.226364 0.614640 +v 1.232957 5.353572 0.287179 +v 1.402369 6.446171 0.540025 +v 1.512086 6.396442 0.762787 +v 1.723394 6.325138 0.642793 +v 1.613676 6.374866 0.420031 +v 1.833586 7.488668 0.608838 +v 1.889037 7.465502 0.720291 +v 1.995540 7.432285 0.660399 +v 1.940089 7.455451 0.548945 +v 2.281373 8.530154 0.679686 +v 2.281373 8.530154 0.679686 +v 2.281373 8.530154 0.679686 +v 2.281373 8.530154 0.679686 +v 0.045757 3.472828 0.272978 +v 0.432800 3.331770 0.753746 +v 0.892695 3.190712 0.342120 +v 0.505653 3.331770 -0.138647 +v 0.515805 4.507779 0.235422 +v 0.825438 4.394933 0.620036 +v 1.193355 4.282086 0.290736 +v 0.883721 4.394933 -0.093878 +v 0.921591 5.550832 0.344195 +v 1.151251 5.457928 0.632164 +v 1.434927 5.398242 0.386672 +v 1.205267 5.491146 0.098703 +v 1.315454 6.625363 0.448768 +v 1.462872 6.546413 0.638948 +v 1.648335 6.495693 0.474131 +v 1.500917 6.574642 0.283951 +v 1.892594 7.603518 0.611496 +v 1.961289 7.551551 0.704308 +v 2.056149 7.531493 0.622866 +v 1.987455 7.583460 0.530055 +v 2.337806 8.582873 0.960303 +v 2.337806 8.582873 0.960303 +v 2.337806 8.582873 0.960303 +v 2.337806 8.582873 0.960303 +v 0.075119 3.414347 0.119133 +v 0.700214 3.321939 0.158545 +v 0.726010 3.229530 -0.467260 +v 0.100915 3.321939 -0.506672 +v 0.368823 4.484950 -0.145467 +v 0.868899 4.411023 -0.113937 +v 0.889536 4.337096 -0.614581 +v 0.389460 4.411023 -0.646111 +v 0.549206 5.562881 -0.306934 +v 0.928361 5.548334 -0.288741 +v 0.944583 5.500314 -0.665214 +v 0.565428 5.514861 -0.683407 +v 0.597441 6.679924 -0.543151 +v 0.849305 6.657441 -0.529267 +v 0.859673 6.619125 -0.779383 +v 0.607809 6.641608 -0.793268 +v 0.897027 7.759521 -0.757094 +v 1.022450 7.743809 -0.749626 +v 1.028488 7.732147 -0.875566 +v 0.903066 7.747859 -0.883035 +v 1.018853 8.875552 -0.853471 +v 1.018853 8.875552 -0.853471 +v 1.018853 8.875552 -0.853471 +v 1.018853 8.875552 -0.853471 +v -0.099812 4.508025 -0.374087 +v 0.312258 4.403594 -0.649457 +v 0.018864 4.299163 -1.048894 +v -0.393205 4.403594 -0.773524 +v -0.017385 5.544228 -0.842778 +v 0.291667 5.465904 -1.049305 +v 0.071622 5.387581 -1.348883 +v -0.237430 5.465904 -1.142356 +v 0.042950 6.590305 -1.185851 +v 0.250028 6.565259 -1.329466 +v 0.104374 6.540214 -1.535115 +v -0.102703 6.565259 -1.391500 +v 0.066088 7.704221 -1.318290 +v 0.169526 7.689857 -1.389897 +v 0.097274 7.687843 -1.493863 +v -0.006165 7.702207 -1.422256 +v 0.263418 8.805511 -1.535754 +v 0.263418 8.805511 -1.535754 +v 0.263418 8.805511 -1.535754 +v 0.263418 8.805511 -1.535754 +v 0.586701 4.527606 0.460327 +v 1.066936 4.394933 0.551476 +v 1.122458 4.262259 0.065831 +v 0.642224 4.394933 -0.025318 +v 0.952455 5.563603 0.191010 +v 1.312631 5.464098 0.259372 +v 1.354273 5.364594 -0.104861 +v 0.994097 5.464098 -0.173223 +v 1.395377 6.562186 -0.135079 +v 1.628954 6.477534 -0.085993 +v 1.662767 6.428145 -0.332064 +v 1.429190 6.512798 -0.381150 +v 1.899929 7.566116 -0.211382 +v 2.015583 7.520914 -0.186593 +v 2.037583 7.509125 -0.310732 +v 1.921929 7.554327 -0.335521 +v 2.362276 8.598434 -0.285657 +v 2.362276 8.598434 -0.285657 +v 2.362276 8.598434 -0.285657 +v 2.362276 8.598434 -0.285657 +v 0.234590 5.599739 0.212547 +v 0.374764 5.591772 0.565518 +v 0.727674 5.583805 0.425189 +v 0.587500 5.591772 0.072218 +v 0.463122 6.717524 0.311101 +v 0.556572 6.712213 0.546415 +v 0.791845 6.706901 0.452862 +v 0.698396 6.712213 0.217548 +v 0.460257 7.836196 0.309866 +v 0.506938 7.840132 0.427504 +v 0.624532 7.844068 0.380709 +v 0.577850 7.840132 0.263071 +v 0.536183 8.971832 0.342609 +v 0.536183 8.971832 0.342609 +v 0.536183 8.971832 0.342609 +v 0.536183 8.971832 0.342609 +v 0.908358 5.459203 0.501608 +v 1.100631 5.335661 0.805038 +v 1.379189 5.212119 0.578225 +v 1.186916 5.335661 0.274795 +v 1.582771 6.375226 0.611354 +v 1.710952 6.292865 0.813640 +v 1.896658 6.210504 0.662432 +v 1.768476 6.292865 0.460145 +v 2.085047 7.370366 0.693394 +v 2.155433 7.343212 0.795090 +v 2.250140 7.306163 0.719648 +v 2.179754 7.333317 0.617953 +v 2.558996 8.397515 0.631808 +v 2.558996 8.397515 0.631808 +v 2.558996 8.397515 0.631808 +v 2.558996 8.397515 0.631808 +v 0.942113 5.539180 -0.670418 +v 0.562476 5.531597 -0.681370 +v 0.551676 5.524014 -0.301729 +v 0.931312 5.531597 -0.290778 +v 0.853708 6.667255 -0.564462 +v 0.600617 6.662200 -0.571763 +v 0.593416 6.657146 -0.318669 +v 0.846507 6.662200 -0.311368 +v 0.765387 7.798831 -0.503640 +v 0.639236 7.788551 -0.507357 +v 0.635508 7.788537 -0.380789 +v 0.761659 7.798817 -0.377072 +v 0.540220 8.913995 -0.446709 +v 0.540220 8.913995 -0.446709 +v 0.540220 8.913995 -0.446709 +v 0.540220 8.913995 -0.446709 +v 0.428081 6.744906 0.119655 +v 0.320734 6.723005 0.347977 +v 0.549859 6.701104 0.453600 +v 0.657205 6.723005 0.225278 +v 0.526116 7.835466 0.453931 +v 0.472443 7.824516 0.568092 +v 0.587005 7.813565 0.620903 +v 0.640678 7.824516 0.506743 +v 0.583237 8.955894 0.545132 +v 0.583237 8.955894 0.545132 +v 0.583237 8.955894 0.545132 +v 0.583237 8.955894 0.545132 +v -0.042385 6.759718 0.695130 +v -0.285679 6.719871 0.753041 +v -0.221611 6.680023 0.994788 +v 0.021684 6.719871 0.936876 +v -0.208110 7.846725 0.972215 +v -0.329757 7.826801 1.001170 +v -0.297723 7.806878 1.122043 +v -0.176075 7.826801 1.093088 +v -0.390498 8.926323 1.277159 +v -0.390498 8.926323 1.277159 +v -0.390498 8.926323 1.277159 +v -0.390498 8.926323 1.277159 +v 0.617951 6.663674 -0.521149 +v 0.869114 6.649524 -0.550314 +v 0.839163 6.635374 -0.801385 +v 0.588000 6.649524 -0.772220 +v 0.652161 7.787807 -0.564487 +v 0.777743 7.780732 -0.579070 +v 0.762767 7.773657 -0.704605 +v 0.637185 7.780732 -0.690022 +v 0.838714 8.892449 -0.800817 +v 0.838714 8.892449 -0.800817 +v 0.838714 8.892449 -0.800817 +v 0.838714 8.892449 -0.800817 +v 1.377453 6.589841 -0.244308 +v 1.516423 6.495166 -0.054946 +v 1.680690 6.400490 -0.222835 +v 1.541721 6.495166 -0.412197 +v 1.992822 7.525069 -0.394599 +v 2.062307 7.477731 -0.299918 +v 2.144441 7.430393 -0.383862 +v 2.074956 7.477731 -0.478543 +v 2.702756 8.384189 -0.150461 +v 2.702756 8.384189 -0.150461 +v 2.702756 8.384189 -0.150461 +v 2.702756 8.384189 -0.150461 +v 0.800229 6.671528 -0.280005 +v 0.885343 6.662200 -0.518337 +v 0.646895 6.652873 -0.603127 +v 0.561781 6.662200 -0.364794 +v 0.759049 7.798564 -0.366785 +v 0.801605 7.793900 -0.485951 +v 0.682381 7.789237 -0.528346 +v 0.639824 7.793900 -0.409180 +v 0.673068 8.920150 -0.547972 +v 0.673068 8.920150 -0.547972 +v 0.673068 8.920150 -0.547972 +v 0.673068 8.920150 -0.547972 +v -0.718623 7.521231 -1.895071 +v -0.722490 7.473425 -2.012259 +v -0.837405 7.425619 -1.988966 +v -0.833538 7.473425 -1.871777 +v -1.252052 8.430329 -2.316733 +v -1.252052 8.430329 -2.316733 +v -1.252052 8.430329 -2.316733 +v -1.252052 8.430329 -2.316733 +v 1.897282 7.612772 0.622163 +v 1.980146 7.567505 0.706531 +v 2.051461 7.522239 0.612199 +v 1.968597 7.567505 0.527831 +v 2.545339 8.543940 0.580283 +v 2.545339 8.543940 0.580283 +v 2.545339 8.543940 0.580283 +v 2.545339 8.543940 0.580283 +v 0.040961 7.718984 -1.482443 +v 0.002674 7.696032 -1.363949 +v 0.122400 7.673080 -1.329710 +v 0.160687 7.696032 -1.448204 +v 0.218177 8.789937 -1.150088 +v 0.218177 8.789937 -1.150088 +v 0.218177 8.789937 -1.150088 +v 0.218177 8.789937 -1.150088 +v 2.091922 7.383285 0.722760 +v 2.186380 7.338264 0.794064 +v 2.243265 7.293244 0.690282 +v 2.148807 7.338264 0.618978 +v 2.723973 8.316516 0.587124 +v 2.723973 8.316516 0.587124 +v 2.723973 8.316516 0.587124 +v 2.723973 8.316516 0.587124 +v 0.578359 7.844239 0.452844 +v 0.469858 7.824516 0.515070 +v 0.534762 7.804793 0.621990 +v 0.643263 7.824516 0.559765 +v 0.494338 8.928437 0.778821 +v 0.494338 8.928437 0.778821 +v 0.494338 8.928437 0.778821 +v 0.494338 8.928437 0.778821 +v 2.002199 7.511489 -0.438867 +v 2.015040 7.477731 -0.317504 +v 2.135065 7.443973 -0.339594 +v 2.122223 7.477731 -0.460957 +v 2.410454 8.525929 -0.133832 +v 2.410454 8.525929 -0.133832 +v 2.410454 8.525929 -0.133832 +v 2.410454 8.525929 -0.133832 +v 0.030978 2.218528 0.282723 +v 0.476373 1.789166 0.472171 +v 0.242779 1.359805 0.048259 +v -0.202616 1.789166 -0.141190 +v 0.445634 2.394507 -0.176301 +v 0.846490 2.008082 -0.005797 +v 0.636256 1.621656 -0.387319 +v 0.235399 2.008082 -0.557822 +v 0.849132 2.569747 -0.622973 +v 1.215357 2.232064 -0.482382 +v 1.038391 1.894381 -0.832481 +v 0.672166 2.232064 -0.973071 +v 1.187754 2.756847 -1.030606 +v 1.444959 2.420209 -0.870469 +v 1.479421 2.247960 -1.287921 +v 1.222215 2.584598 -1.448058 +v 1.658881 3.016298 -0.795178 +v 1.789981 2.672174 -0.672317 +v 1.989316 2.630133 -1.002773 +v 1.858217 2.974257 -1.125633 +v 2.183699 3.224029 -0.548596 +v 2.332776 2.964849 -0.425078 +v 2.503755 2.933187 -0.697876 +v 2.354678 3.192366 -0.821394 +v 2.562576 3.648449 -0.376433 +v 2.746550 3.516589 -0.250951 +v 2.869656 3.475306 -0.474825 +v 2.685682 3.607166 -0.600307 +v 2.875487 4.198833 -0.424820 +v 3.029747 4.129629 -0.329476 +v 3.111391 4.079177 -0.498191 +v 2.957130 4.148380 -0.593535 +v 3.196875 4.748547 -0.473247 +v 3.306449 4.717864 -0.411629 +v 3.357811 4.677191 -0.523220 +v 3.248237 4.707875 -0.584838 +v 3.401637 5.320391 -0.666617 +v 3.459148 5.313344 -0.637824 +v 3.483896 5.290167 -0.692929 +v 3.426385 5.297215 -0.721722 +v 3.600776 5.902134 -0.853176 +v 3.600776 5.902134 -0.853176 +v 3.600776 5.902134 -0.853176 +v 3.600776 5.902134 -0.853176 +v 0.564181 3.937667 0.499199 +v 0.868935 3.557681 0.135679 +v 0.394571 3.177695 0.135198 +v 0.089817 3.557681 0.498718 +v 0.346121 4.266285 0.031221 +v 0.620400 3.924297 -0.295947 +v 0.193472 3.582310 -0.296380 +v -0.080806 3.924297 0.030788 +v 0.077598 4.447006 -0.545058 +v 0.335432 4.127666 -0.805763 +v -0.030029 3.808327 -0.776037 +v -0.287863 4.127666 -0.515332 +v -0.157120 4.650384 -1.048788 +v 0.058904 4.381118 -1.297467 +v -0.270456 4.111852 -1.292019 +v -0.486479 4.381118 -1.043340 +v -0.389678 4.891850 -1.527435 +v -0.192695 4.613067 -1.655756 +v -0.494952 4.463249 -1.794259 +v -0.691935 4.742032 -1.665939 +v -0.023962 5.078492 -1.952825 +v 0.107580 4.807671 -1.994122 +v -0.092485 4.743999 -2.213832 +v -0.224027 5.014821 -2.172536 +v 0.329115 5.294895 -2.374830 +v 0.459604 5.098988 -2.435647 +v 0.305490 5.052929 -2.617947 +v 0.175001 5.248836 -2.557129 +v 0.615964 5.661395 -2.719426 +v 0.746423 5.573839 -2.811953 +v 0.625115 5.528870 -2.940441 +v 0.494655 5.616426 -2.847914 +v 0.562531 6.188720 -2.996017 +v 0.652214 6.165949 -3.074852 +v 0.570710 6.127679 -3.156516 +v 0.481028 6.150450 -3.077681 +v 0.522424 6.750989 -3.229042 +v 0.566836 6.745210 -3.270130 +v 0.525547 6.733097 -3.313056 +v 0.481135 6.738876 -3.271967 +v 0.483738 7.354445 -3.334101 +v 0.483738 7.354445 -3.334101 +v 0.483738 7.354445 -3.334101 +v 0.483738 7.354445 -3.334101 +v 0.270573 5.532626 0.407214 +v 0.588518 5.365683 0.594894 +v 0.707227 5.198740 0.245293 +v 0.389282 5.365683 0.057613 +v 0.564536 5.962564 0.298206 +v 0.850686 5.812315 0.467118 +v 0.957524 5.662066 0.152477 +v 0.671374 5.812315 -0.016434 +v 0.923466 6.397952 0.165107 +v 1.149977 6.230562 0.325576 +v 1.217099 6.063172 0.056221 +v 0.990588 6.230562 -0.104248 +v 1.394898 6.710867 -0.018780 +v 1.593808 6.564965 0.121210 +v 1.569436 6.352725 -0.065364 +v 1.370526 6.498627 -0.205354 +v 1.732361 6.817055 -0.467815 +v 1.915066 6.697523 -0.360873 +v 1.836507 6.489503 -0.459170 +v 1.653802 6.609035 -0.566112 +v 2.050285 6.840204 -0.898243 +v 2.202402 6.740556 -0.808934 +v 2.136698 6.567140 -0.890515 +v 1.984580 6.666788 -0.979824 +v 2.350442 6.927353 -1.306278 +v 2.468645 6.846192 -1.230712 +v 2.441736 6.718056 -1.326244 +v 2.323533 6.799217 -1.401809 +v 2.733628 7.136052 -1.559801 +v 2.827574 7.079269 -1.507586 +v 2.836925 7.005977 -1.604112 +v 2.742979 7.062759 -1.656327 +v 3.006976 7.523080 -1.739935 +v 3.082905 7.506373 -1.717065 +v 3.095454 7.467556 -1.787087 +v 3.019526 7.484262 -1.809956 +v 3.088130 7.967063 -2.001718 +v 3.127809 7.966621 -1.993522 +v 3.135410 7.953326 -2.031037 +v 3.095730 7.953768 -2.039232 +v 3.131412 8.486127 -2.098401 +v 3.131412 8.486127 -2.098401 +v 3.131412 8.486127 -2.098401 +v 3.131412 8.486127 -2.098401 +v 0.483662 7.268889 0.228216 +v 0.635827 7.157342 0.302031 +v 0.636097 7.045794 0.132907 +v 0.483932 7.157342 0.059092 +v 0.688479 7.508941 0.100156 +v 0.825427 7.408549 0.166590 +v 0.825670 7.308156 0.014379 +v 0.688722 7.408549 -0.052055 +v 0.954358 7.678635 -0.066081 +v 1.067884 7.582398 -0.001898 +v 1.059895 7.486161 -0.132067 +v 0.946369 7.582398 -0.196250 +v 1.191689 7.858946 -0.214469 +v 1.297306 7.780021 -0.162237 +v 1.296597 7.701096 -0.280062 +v 1.190980 7.780021 -0.332294 +v 1.421492 8.074857 -0.359087 +v 1.525034 8.020116 -0.326546 +v 1.505457 7.933648 -0.409712 +v 1.401915 7.988389 -0.442253 +v 1.534584 8.191300 -0.670799 +v 1.626938 8.152591 -0.655513 +v 1.598554 8.066798 -0.701289 +v 1.506201 8.105508 -0.716576 +v 1.643219 8.306662 -0.972986 +v 1.717352 8.276012 -0.961490 +v 1.695201 8.208086 -0.999735 +v 1.621067 8.238735 -1.011231 +v 1.747877 8.427661 -1.259939 +v 1.806696 8.413178 -1.264906 +v 1.792416 8.368400 -1.303442 +v 1.733597 8.382882 -1.298474 +v 1.713542 8.680011 -1.464676 +v 1.752693 8.678644 -1.475024 +v 1.743105 8.658057 -1.508581 +v 1.703954 8.659424 -1.498233 +v 1.693589 8.987329 -1.609271 +v 1.713202 8.984406 -1.613422 +v 1.708338 8.978333 -1.632127 +v 1.688724 8.981256 -1.627976 +v 1.776800 9.305593 -1.705940 +v 1.776800 9.305593 -1.705940 +v 1.776800 9.305593 -1.705940 +v 1.776800 9.305593 -1.705940 +v 0.215254 3.096841 -0.010823 +v 0.389574 2.683126 -0.498433 +v -0.097051 2.269412 -0.321383 +v -0.271371 2.683126 0.166227 +v -0.210909 3.358126 -0.434604 +v -0.054021 2.985784 -0.873453 +v -0.491984 2.613441 -0.714108 +v -0.648871 2.985784 -0.275259 +v -0.659801 3.645069 -0.880988 +v -0.494363 3.297059 -1.245238 +v -0.857680 2.949050 -1.077760 +v -1.023118 3.297059 -0.713510 +v -1.139512 3.784241 -1.362591 +v -0.936712 3.448618 -1.610565 +v -1.271894 3.153373 -1.485084 +v -1.474694 3.488996 -1.237110 +v -1.383661 3.907599 -1.943588 +v -1.191638 3.608573 -2.122088 +v -1.508300 3.373821 -2.069482 +v -1.700324 3.672846 -1.890982 +v -1.626861 4.072141 -2.518675 +v -1.470019 3.825666 -2.675130 +v -1.736399 3.632169 -2.637340 +v -1.893241 3.878644 -2.480885 +v -1.864952 4.234695 -3.085543 +v -1.762066 4.057687 -3.253984 +v -1.968971 3.897353 -3.211874 +v -2.071856 4.074361 -3.043433 +v -2.246600 4.507585 -3.467844 +v -2.204152 4.414534 -3.638366 +v -2.370815 4.307419 -3.621403 +v -2.413263 4.400470 -3.450882 +v -2.498368 4.990359 -3.728112 +v -2.486661 4.963476 -3.857389 +v -2.613716 4.925848 -3.861070 +v -2.625423 4.952732 -3.731792 +v -2.623986 5.599682 -3.789401 +v -2.619555 5.601023 -3.855519 +v -2.685446 5.606771 -3.859818 +v -2.689877 5.605429 -3.793700 +v -2.448132 6.219825 -3.761762 +v -2.448132 6.219825 -3.761762 +v -2.448132 6.219825 -3.761762 +v -2.448132 6.219825 -3.761762 +v 0.182796 4.498444 -0.693067 +v -0.129190 4.191563 -0.995257 +v -0.235290 3.884681 -0.574072 +v 0.076696 4.191563 -0.271882 +v -0.307591 4.780833 -0.553493 +v -0.588379 4.504640 -0.825464 +v -0.683868 4.228446 -0.446398 +v -0.403081 4.504640 -0.174427 +v -0.768359 5.106679 -0.422350 +v -1.017959 4.861182 -0.664099 +v -1.102850 4.615685 -0.327148 +v -0.853251 4.861182 -0.085399 +v -1.278765 5.402453 -0.277079 +v -1.477119 5.174305 -0.494315 +v -1.531353 4.946158 -0.205188 +v -1.332999 5.174305 0.012048 +v -1.795930 5.636257 -0.130221 +v -1.925755 5.417789 -0.323188 +v -2.006653 5.241852 -0.069573 +v -1.876828 5.460320 0.123394 +v -2.293664 5.867306 -0.207564 +v -2.397005 5.682246 -0.368129 +v -2.513417 5.565999 -0.159222 +v -2.410076 5.751059 0.001343 +v -2.731299 6.202507 -0.271831 +v -2.834881 6.071668 -0.403759 +v -2.941145 5.989480 -0.238817 +v -2.837563 6.120318 -0.106889 +v -3.143533 6.579815 -0.333081 +v -3.245724 6.509654 -0.433526 +v -3.323883 6.446256 -0.309726 +v -3.221692 6.516418 -0.209281 +v -3.439849 7.040773 -0.220347 +v -3.521527 7.018296 -0.284663 +v -3.577186 6.982401 -0.201436 +v -3.495508 7.004879 -0.137119 +v -3.621927 7.573471 -0.156214 +v -3.664697 7.569645 -0.187589 +v -3.695568 7.563377 -0.144741 +v -3.652798 7.567203 -0.113366 +v -3.654834 8.148314 -0.150027 +v -3.654834 8.148314 -0.150027 +v -3.654834 8.148314 -0.150027 +v -3.654834 8.148314 -0.150027 +v -0.504691 5.793649 -1.085307 +v -0.238655 5.668563 -0.887114 +v -0.080297 5.543478 -1.178625 +v -0.346333 5.668563 -1.376818 +v -0.319026 6.269679 -1.126132 +v -0.079594 6.157102 -0.947758 +v 0.062929 6.044524 -1.210117 +v -0.176504 6.157102 -1.388492 +v 0.064719 6.691062 -1.210511 +v 0.245086 6.548011 -1.044818 +v 0.339310 6.404961 -1.270889 +v 0.158943 6.548011 -1.436581 +v 0.474931 7.009770 -1.301599 +v 0.652955 6.904656 -1.164294 +v 0.704082 6.748398 -1.350206 +v 0.526059 6.853513 -1.487512 +v 0.784270 7.325398 -1.594241 +v 0.953355 7.250527 -1.489087 +v 0.963187 7.085212 -1.622604 +v 0.794102 7.160083 -1.727758 +v 1.142637 7.519582 -1.938004 +v 1.278548 7.453396 -1.845413 +v 1.275717 7.307259 -1.945719 +v 1.139806 7.373444 -2.038311 +v 1.474813 7.723254 -2.259379 +v 1.555735 7.649567 -2.169189 +v 1.598867 7.566514 -2.275746 +v 1.517945 7.640202 -2.365935 +v 1.834934 8.016046 -2.095647 +v 1.891590 7.956386 -2.028237 +v 1.960549 7.933952 -2.106049 +v 1.903893 7.993611 -2.173459 +v 2.034887 8.461429 -2.014464 +v 2.083082 8.445204 -1.965047 +v 2.132263 8.437495 -2.015544 +v 2.084067 8.453720 -2.064961 +v 2.116580 8.960448 -2.014332 +v 2.141433 8.962964 -1.989171 +v 2.166472 8.965432 -2.014151 +v 2.141619 8.962916 -2.039311 +v 1.983161 9.454809 -2.016325 +v 1.983161 9.454809 -2.016325 +v 1.983161 9.454809 -2.016325 +v 1.983161 9.454809 -2.016325 +v -0.675641 7.178840 -1.691000 +v -0.543834 7.073983 -1.746296 +v -0.661374 6.969126 -1.827630 +v -0.793180 7.073983 -1.772333 +v -0.648231 7.417481 -1.953491 +v -0.529606 7.323110 -2.003258 +v -0.635391 7.228738 -2.076458 +v -0.754017 7.323110 -2.026691 +v -0.610851 7.553941 -2.311472 +v -0.507690 7.459233 -2.333843 +v -0.604004 7.364525 -2.377043 +v -0.707166 7.459233 -2.354672 +v -0.574421 7.641823 -2.660360 +v -0.484426 7.558088 -2.677329 +v -0.568974 7.474352 -2.712523 +v -0.658968 7.558088 -2.695554 +v -0.542313 7.740645 -2.990953 +v -0.470950 7.661814 -2.988474 +v -0.530673 7.605619 -3.056213 +v -0.602036 7.684450 -3.058692 +v -0.275228 7.871494 -3.146321 +v -0.214629 7.806815 -3.145391 +v -0.239495 7.782346 -3.226873 +v -0.300094 7.847025 -3.227803 +v -0.088034 8.136748 -3.261612 +v -0.029864 8.096497 -3.266527 +v -0.046091 8.081269 -3.333854 +v -0.104260 8.121521 -3.328938 +v 0.099844 8.413099 -3.377527 +v 0.144845 8.385094 -3.381879 +v 0.135813 8.378662 -3.433892 +v 0.090812 8.406668 -3.429541 +v 0.277468 8.712964 -3.414500 +v 0.310975 8.702065 -3.418446 +v 0.306681 8.701608 -3.453636 +v 0.273175 8.712506 -3.449690 +v 0.322983 9.063005 -3.430531 +v 0.340589 9.062873 -3.432592 +v 0.338531 9.063192 -3.450196 +v 0.320924 9.063325 -3.448135 +v 0.298845 9.419161 -3.421915 +v 0.298845 9.419161 -3.421915 +v 0.298845 9.419161 -3.421915 +v 0.298845 9.419161 -3.421915 +v -0.001671 3.185294 0.116325 +v -0.519610 2.703372 0.164287 +v -0.050410 2.221451 0.388814 +v 0.467529 2.703372 0.340852 +v -0.126717 3.368171 0.815430 +v -0.592862 2.934442 0.858596 +v -0.170582 2.500713 1.060671 +v 0.295564 2.934442 1.017505 +v -0.267898 3.507638 1.604745 +v -0.669017 3.108096 1.569138 +v -0.280425 2.708554 1.674783 +v 0.120694 3.108096 1.710390 +v -0.426990 3.411704 2.393897 +v -0.674995 3.065660 2.138703 +v -0.379212 2.714534 2.327383 +v -0.131207 3.060579 2.582576 +v -1.151400 3.243455 2.691069 +v -1.198372 2.992833 2.350491 +v -1.007822 2.674379 2.558552 +v -0.960851 2.925001 2.899131 +v -1.770264 2.849980 2.926359 +v -1.788718 2.649581 2.634465 +v -1.603640 2.394943 2.797585 +v -1.585185 2.595342 3.089478 +v -2.380609 2.551003 3.161944 +v -2.312889 2.420087 2.919612 +v -2.272855 2.177867 3.061655 +v -2.340575 2.308782 3.303987 +v -2.959496 2.454287 2.722028 +v -2.841282 2.367758 2.567784 +v -2.881596 2.173931 2.645622 +v -2.999810 2.260460 2.799865 +v -3.529651 2.360264 2.291184 +v -3.438811 2.301606 2.199425 +v -3.499488 2.175120 2.220214 +v -3.590328 2.233779 2.311973 +v -3.799464 2.605383 1.682211 +v -3.754282 2.576247 1.635975 +v -3.803355 2.528215 1.618288 +v -3.848537 2.557351 1.664525 +v -3.998466 3.138178 1.234311 +v -3.998466 3.138178 1.234311 +v -3.998466 3.138178 1.234311 +v -3.998466 3.138178 1.234311 +v -0.256358 4.577042 0.279489 +v -0.220643 4.281078 0.719898 +v 0.156926 3.985113 0.490384 +v 0.121211 4.281078 0.049976 +v 0.155792 4.909343 0.489806 +v 0.187936 4.642975 0.886173 +v 0.527749 4.376607 0.679611 +v 0.495605 4.642975 0.283243 +v 0.576832 5.214528 0.704658 +v 0.611553 4.983334 1.060123 +v 0.919758 4.752141 0.879650 +v 0.885037 4.983334 0.524185 +v 0.952326 5.554422 0.896269 +v 1.000441 5.370520 1.216350 +v 1.287855 5.186618 1.067485 +v 1.239740 5.370520 0.747404 +v 1.319813 5.962473 1.082592 +v 1.382636 5.826939 1.364555 +v 1.592181 5.631621 1.223981 +v 1.529358 5.767155 0.942019 +v 1.827044 6.258907 1.100334 +v 1.895367 6.158826 1.337026 +v 2.032796 5.966105 1.215868 +v 1.964472 6.066185 0.979175 +v 2.282469 6.553214 1.116304 +v 2.351295 6.485343 1.305802 +v 2.488519 6.354647 1.209152 +v 2.419693 6.422518 1.019654 +v 2.605069 6.960312 1.137319 +v 2.692452 6.962200 1.270793 +v 2.810347 6.886287 1.194684 +v 2.722965 6.884399 1.061209 +v 2.733980 7.405344 0.860235 +v 2.797761 7.426516 0.942679 +v 2.882041 7.396384 0.885214 +v 2.818260 7.375213 0.802771 +v 2.794994 7.965482 0.796350 +v 2.826404 7.969051 0.839117 +v 2.869305 7.965096 0.807938 +v 2.837895 7.961527 0.765171 +v 2.831296 8.533143 0.761145 +v 2.831296 8.533143 0.761145 +v 2.831296 8.533143 0.761145 +v 2.831296 8.533143 0.761145 +v -0.251639 5.952323 0.767691 +v 0.086413 5.847103 0.786452 +v 0.072436 5.741882 0.448169 +v -0.265616 5.847103 0.429408 +v -0.152376 6.369647 0.669823 +v 0.151870 6.274948 0.686708 +v 0.139291 6.180249 0.382253 +v -0.164955 6.274948 0.365368 +v 0.070621 6.782498 0.449959 +v 0.312597 6.640930 0.493033 +v 0.272950 6.499361 0.250472 +v 0.030974 6.640930 0.207398 +v 0.361912 7.042350 0.153082 +v 0.580000 6.927280 0.181206 +v 0.501627 6.742934 0.034685 +v 0.283540 6.858004 0.006561 +v 0.416067 7.181156 -0.284645 +v 0.610962 7.096176 -0.291502 +v 0.528016 6.911130 -0.355773 +v 0.333120 6.996110 -0.348916 +v 0.465855 7.256377 -0.706594 +v 0.629086 7.188687 -0.720716 +v 0.561744 7.041291 -0.792585 +v 0.398514 7.108981 -0.778463 +v 0.506091 7.473518 -1.064455 +v 0.630839 7.406496 -1.056814 +v 0.592503 7.322838 -1.164722 +v 0.467755 7.389861 -1.172363 +v 0.802767 7.743731 -1.244311 +v 0.884152 7.677615 -1.226469 +v 0.871644 7.636019 -1.323559 +v 0.790259 7.702135 -1.341401 +v 1.081797 8.027205 -1.413946 +v 1.146934 7.999429 -1.410240 +v 1.139211 7.972620 -1.475430 +v 1.074074 8.000398 -1.479136 +v 1.144912 8.410880 -1.598435 +v 1.180199 8.408010 -1.600332 +v 1.177706 8.400151 -1.634814 +v 1.142419 8.403021 -1.632917 +v 1.168875 8.848171 -1.642228 +v 1.168875 8.848171 -1.642228 +v 1.168875 8.848171 -1.642228 +v 1.168875 8.848171 -1.642228 +v -0.203288 7.438608 1.061955 +v -0.268675 7.348580 0.923951 +v -0.375352 7.258552 1.033224 +v -0.309965 7.348580 1.171229 +v -0.403382 7.680932 1.028543 +v -0.462230 7.599907 0.904339 +v -0.558239 7.518882 1.002685 +v -0.499391 7.599907 1.126889 +v -0.688586 7.874747 0.980920 +v -0.718123 7.786000 0.874319 +v -0.780694 7.697253 0.965540 +v -0.751156 7.786000 1.072141 +v -1.007886 7.977595 0.927603 +v -1.015229 7.892677 0.837416 +v -1.051475 7.807759 0.920324 +v -1.044132 7.892677 1.010511 +v -1.325128 8.019187 0.876852 +v -1.383144 7.957044 0.812934 +v -1.352048 7.871465 0.867911 +v -1.294032 7.933609 0.931830 +v -1.351216 7.997553 1.177987 +v -1.429660 7.956294 1.178703 +v -1.389313 7.879930 1.198630 +v -1.310868 7.921190 1.197914 +v -1.382329 8.111908 1.452371 +v -1.446144 8.083068 1.463508 +v -1.415827 8.029692 1.499004 +v -1.352012 8.058532 1.487866 +v -1.411998 8.290936 1.700694 +v -1.459053 8.278932 1.722374 +v -1.436242 8.239766 1.750196 +v -1.389187 8.251771 1.728516 +v -1.281395 8.473245 1.912983 +v -1.310240 8.472101 1.933567 +v -1.293535 8.450059 1.955750 +v -1.264691 8.451202 1.935166 +v -1.210995 8.752906 2.035802 +v -1.225652 8.751491 2.045671 +v -1.215985 8.745179 2.059124 +v -1.201328 8.746594 2.049254 +v -1.200470 9.050039 2.147900 +v -1.200470 9.050039 2.147900 +v -1.200470 9.050039 2.147900 +v -1.200470 9.050039 2.147900 +v 0.888303 5.059340 0.257243 +v 0.599456 4.742090 0.411235 +v 0.923599 4.424841 0.365652 +v 1.212446 4.742090 0.211659 +v 1.098516 5.153478 0.902902 +v 0.838554 4.867954 1.041495 +v 1.130283 4.582429 1.000470 +v 1.390245 4.867954 0.861877 +v 1.318901 5.241826 1.579805 +v 1.078177 4.984366 1.673370 +v 1.327845 4.726907 1.607274 +v 1.568569 4.984366 1.513709 +v 1.534666 5.169797 2.246963 +v 1.311598 4.943348 2.274896 +v 1.535468 4.718581 2.240531 +v 1.758536 4.945030 2.212598 +v 1.508629 5.158965 2.921426 +v 1.316179 4.964624 2.920706 +v 1.510252 4.772389 2.934394 +v 1.702702 4.966730 2.935114 +v 1.484555 5.145156 3.568841 +v 1.322759 4.989028 3.606186 +v 1.483080 4.834593 3.655126 +v 1.644876 4.990720 3.617781 +v 1.455294 5.417045 4.123316 +v 1.336647 5.339576 4.238070 +v 1.467504 5.227461 4.297680 +v 1.586152 5.304929 4.182927 +v 1.783682 5.880831 4.426055 +v 1.713172 5.865119 4.542171 +v 1.816268 5.792396 4.594935 +v 1.886778 5.808107 4.478819 +v 1.996839 6.470776 4.638227 +v 1.951771 6.466588 4.717367 +v 2.029778 6.448174 4.760814 +v 2.074845 6.452362 4.681674 +v 1.996371 7.145664 4.665494 +v 1.974119 7.146146 4.705276 +v 2.013800 7.143133 4.727508 +v 2.036052 7.142652 4.687726 +v 2.099106 7.822017 4.731025 +v 2.099106 7.822017 4.731025 +v 2.099106 7.822017 4.731025 +v 2.099106 7.822017 4.731025 +v 1.318795 6.164705 0.597513 +v 1.466097 5.965657 0.773680 +v 1.471681 5.766610 0.544112 +v 1.324379 5.965657 0.367944 +v 1.749373 6.397263 0.447118 +v 1.881945 6.218120 0.605668 +v 1.886970 6.038977 0.399057 +v 1.754398 6.218120 0.240506 +v 2.253746 6.518256 0.270947 +v 2.344070 6.350080 0.421492 +v 2.321019 6.181903 0.247449 +v 2.230695 6.350080 0.096903 +v 2.767833 6.581419 0.091383 +v 2.816403 6.431002 0.233750 +v 2.765771 6.280585 0.092103 +v 2.717201 6.431002 -0.050265 +v 3.290636 6.463255 -0.079418 +v 3.225880 6.354299 0.051663 +v 3.199487 6.222178 -0.071196 +v 3.264243 6.331133 -0.202277 +v 3.638539 6.220067 0.247159 +v 3.525837 6.156766 0.327032 +v 3.533295 6.032878 0.239372 +v 3.645997 6.096179 0.159499 +v 3.964824 6.008798 0.561173 +v 3.881528 5.955002 0.631487 +v 3.900930 5.849714 0.573916 +v 3.984226 5.903510 0.503602 +v 4.328576 5.951036 0.909411 +v 4.257292 5.912837 0.951496 +v 4.286436 5.830314 0.925955 +v 4.357720 5.868513 0.883870 +v 4.479576 5.898323 1.399457 +v 4.427389 5.873000 1.417606 +v 4.452276 5.817816 1.412172 +v 4.504463 5.843139 1.394022 +v 4.628603 5.956516 1.881729 +v 4.602313 5.943697 1.889977 +v 4.616948 5.917870 1.896482 +v 4.643237 5.930689 1.888234 +v 4.606455 6.174267 2.345134 +v 4.606455 6.174267 2.345134 +v 4.606455 6.174267 2.345134 +v 4.606455 6.174267 2.345134 +v 1.807685 7.312833 0.701321 +v 1.940900 7.245513 0.672862 +v 1.880768 7.178193 0.550632 +v 1.747553 7.245513 0.579091 +v 1.890855 7.580706 0.529833 +v 2.010749 7.520118 0.504219 +v 1.956630 7.459530 0.394212 +v 1.836736 7.520118 0.419825 +v 2.000685 7.824964 0.303373 +v 2.101032 7.757078 0.293444 +v 2.046699 7.689191 0.208497 +v 1.946353 7.757078 0.218427 +v 2.131521 7.983274 0.035812 +v 2.204738 7.906878 0.046577 +v 2.165717 7.857405 -0.039114 +v 2.092499 7.933802 -0.049879 +v 2.398950 8.133719 -0.076206 +v 2.448366 8.059171 -0.058536 +v 2.431868 8.028283 -0.142711 +v 2.382452 8.102832 -0.160381 +v 2.676216 8.271239 -0.192681 +v 2.716579 8.208660 -0.177625 +v 2.702492 8.182731 -0.247634 +v 2.662129 8.245310 -0.262690 +v 2.938106 8.406287 -0.304389 +v 2.980219 8.363460 -0.295092 +v 2.982388 8.352616 -0.354856 +v 2.940274 8.395444 -0.364154 +v 3.112005 8.662230 -0.262485 +v 3.152856 8.643281 -0.255415 +v 3.161369 8.644937 -0.300167 +v 3.120517 8.663886 -0.307237 +v 3.204677 8.972840 -0.245652 +v 3.234306 8.968748 -0.240279 +v 3.239781 8.969136 -0.270169 +v 3.210151 8.973228 -0.275542 +v 3.212860 9.300582 -0.251257 +v 3.227808 9.300556 -0.248535 +v 3.230530 9.300519 -0.263484 +v 3.215581 9.300545 -0.266206 +v 3.223598 9.630102 -0.259282 +v 3.223598 9.630102 -0.259282 +v 3.223598 9.630102 -0.259282 +v 3.223598 9.630102 -0.259282 +v 1.410307 5.599770 0.314239 +v 1.120391 5.474537 0.103132 +v 0.946211 5.349304 0.416627 +v 1.236127 5.474537 0.627734 +v 1.159448 6.117548 0.369583 +v 0.898524 6.004838 0.179587 +v 0.741762 5.892128 0.461732 +v 1.002686 6.004838 0.651729 +v 0.812150 6.635890 0.446203 +v 0.605813 6.496907 0.271671 +v 0.492066 6.357924 0.516820 +v 0.698403 6.496907 0.691352 +v 0.333898 7.031605 0.551714 +v 0.186309 6.878866 0.391727 +v 0.119735 6.726127 0.598962 +v 0.267325 6.878866 0.758949 +v -0.177265 7.304986 0.665779 +v -0.334290 7.196167 0.541482 +v -0.347898 7.033782 0.700837 +v -0.190872 7.142601 0.825134 +v -0.488529 7.549577 1.060772 +v -0.653076 7.488842 0.987896 +v -0.655200 7.345329 1.112294 +v -0.490653 7.406064 1.185170 +v -0.757510 7.888221 1.394876 +v -0.897213 7.852334 1.347091 +v -0.917970 7.767537 1.471456 +v -0.778267 7.803423 1.519242 +v -0.924162 8.375962 1.594146 +v -1.034339 8.366439 1.566625 +v -1.056538 8.324195 1.670114 +v -0.946361 8.333718 1.697635 +v -0.983350 8.903073 1.799636 +v -1.057560 8.903519 1.783367 +v -1.073450 8.885119 1.855346 +v -0.999240 8.884674 1.871615 +v -1.021094 9.469335 1.891645 +v -1.058203 9.469692 1.883533 +v -1.066314 9.466308 1.920490 +v -1.029205 9.465950 1.928601 +v -1.039828 10.046574 1.930552 +v -1.039828 10.046574 1.930552 +v -1.039828 10.046574 1.930552 +v -1.039828 10.046574 1.930552 +v 1.429317 6.685497 0.344466 +v 1.318561 6.560528 0.534859 +v 1.534472 6.435558 0.578433 +v 1.645228 6.560528 0.388040 +v 1.566564 6.995203 0.649836 +v 1.466884 6.882730 0.821190 +v 1.661204 6.770257 0.860406 +v 1.760885 6.882730 0.689053 +v 1.705864 7.324919 0.959773 +v 1.611832 7.212953 1.100013 +v 1.779135 7.100987 1.122797 +v 1.873166 7.212953 0.982557 +v 1.871204 7.539141 1.321208 +v 1.791586 7.391662 1.378971 +v 1.934832 7.352199 1.475660 +v 2.014451 7.499678 1.417897 +v 1.477699 7.621879 1.475119 +v 1.444456 7.474857 1.494292 +v 1.499685 7.480813 1.635722 +v 1.532927 7.627835 1.616550 +v 1.070577 7.731249 1.643454 +v 1.039662 7.609668 1.660649 +v 1.085815 7.614593 1.778458 +v 1.116731 7.736175 1.761264 +v 0.693920 7.835646 1.806255 +v 0.638229 7.753254 1.825525 +v 0.646254 7.771077 1.924920 +v 0.701945 7.853469 1.905650 +v 0.437761 8.129720 1.645181 +v 0.372078 8.092354 1.653028 +v 0.365873 8.118207 1.724197 +v 0.431556 8.155573 1.716350 +v 0.247137 8.529601 1.537904 +v 0.199435 8.512829 1.540836 +v 0.199567 8.521188 1.590791 +v 0.247269 8.537960 1.587859 +v 0.110270 8.964600 1.531921 +v 0.085299 8.960515 1.532984 +v 0.086245 8.961311 1.558278 +v 0.111216 8.965396 1.557215 +v 0.076394 9.417916 1.541736 +v 0.076394 9.417916 1.541736 +v 0.076394 9.417916 1.541736 +v 0.076394 9.417916 1.541736 +v 1.953063 7.652110 0.597063 +v 1.912905 7.567505 0.682286 +v 1.995680 7.482901 0.637299 +v 2.035838 7.567505 0.552076 +v 2.174715 7.755487 0.806328 +v 2.138574 7.679343 0.883028 +v 2.213071 7.603199 0.842540 +v 2.249213 7.679343 0.765839 +v 2.409611 7.849170 1.028095 +v 2.367510 7.778204 1.086855 +v 2.423755 7.707239 1.041448 +v 2.465856 7.778204 0.982687 +v 2.661268 7.826357 1.265686 +v 2.607572 7.765424 1.301186 +v 2.639929 7.704490 1.245540 +v 2.693625 7.765424 1.210039 +v 2.880743 7.671767 1.485567 +v 2.812600 7.647707 1.462123 +v 2.845460 7.588950 1.426911 +v 2.913604 7.613010 1.450355 +v 2.619406 7.551706 1.655710 +v 2.584197 7.552951 1.603106 +v 2.600464 7.493016 1.590798 +v 2.635674 7.491770 1.643402 +v 2.363401 7.447348 1.816856 +v 2.335301 7.448368 1.774729 +v 2.345064 7.399269 1.767028 +v 2.373164 7.398249 1.809155 +v 2.096337 7.383096 1.985242 +v 2.081343 7.385016 1.950392 +v 2.083493 7.347209 1.947384 +v 2.098487 7.345289 1.982234 +v 1.781346 7.382764 2.050093 +v 1.775924 7.383759 2.025376 +v 1.770766 7.358966 2.025509 +v 1.776188 7.357971 2.050227 +v 1.487956 7.497610 2.110188 +v 1.487263 7.497464 2.097546 +v 1.482255 7.485841 2.097954 +v 1.482948 7.485987 2.110597 +v 1.193460 7.622901 2.066832 +v 1.193460 7.622901 2.066832 +v 1.193460 7.622901 2.066832 +v 1.193460 7.622901 2.066832 +v 0.927032 5.726316 -0.443819 +v 0.808237 5.531597 -0.747584 +v 0.566756 5.336878 -0.528329 +v 0.685552 5.531597 -0.224563 +v 0.570833 6.142032 -0.527372 +v 0.463918 5.966785 -0.800761 +v 0.246586 5.791538 -0.603431 +v 0.353501 5.966785 -0.330042 +v 0.062993 6.483123 -0.646496 +v 0.017396 6.291497 -0.877912 +v -0.126349 6.099871 -0.690911 +v -0.080752 6.291497 -0.459495 +v -0.502952 6.647663 -0.787357 +v -0.447339 6.442847 -0.947560 +v -0.590739 6.282027 -0.791736 +v -0.646353 6.486844 -0.631533 +v -0.863551 6.661548 -1.249977 +v -0.753903 6.477898 -1.328706 +v -0.899156 6.342969 -1.216258 +v -1.008804 6.526620 -1.137529 +v -1.203743 6.578241 -1.694341 +v -1.108115 6.425484 -1.754306 +v -1.226032 6.313253 -1.656454 +v -1.321661 6.466011 -1.596489 +v -1.528705 6.536723 -2.127865 +v -1.540355 6.421607 -2.226358 +v -1.571389 6.326732 -2.111799 +v -1.559739 6.441848 -2.013306 +v -1.901074 6.656070 -1.768112 +v -1.988328 6.602489 -1.818142 +v -1.980523 6.518366 -1.741659 +v -1.893270 6.571947 -1.691629 +v -2.207097 6.985665 -1.496440 +v -2.281921 6.975761 -1.505119 +v -2.282648 6.928872 -1.445345 +v -2.207824 6.938776 -1.436666 +v -2.099115 7.387449 -1.151923 +v -2.136566 7.393292 -1.149413 +v -2.136953 7.376235 -1.115473 +v -2.099502 7.370391 -1.117984 +v -2.062814 7.916117 -0.986897 +v -2.062814 7.916117 -0.986897 +v -2.062814 7.916117 -0.986897 +v -2.062814 7.916117 -0.986897 +v 0.882148 6.741593 -0.661234 +v 0.728596 6.649524 -0.840340 +v 0.574966 6.557456 -0.661301 +v 0.728518 6.649524 -0.482195 +v 0.690263 7.212148 -0.661276 +v 0.552065 7.129286 -0.822471 +v 0.413799 7.046424 -0.661335 +v 0.551996 7.129286 -0.500140 +v 0.323207 7.601523 -0.661355 +v 0.212128 7.511095 -0.804637 +v 0.100987 7.420666 -0.661403 +v 0.212066 7.511095 -0.518121 +v 0.010534 7.992572 -0.661423 +v -0.092686 7.921489 -0.786796 +v -0.195960 7.850405 -0.661467 +v -0.092740 7.921489 -0.536094 +v -0.281761 8.417666 -0.660948 +v -0.380679 8.371165 -0.766499 +v -0.452878 8.287690 -0.662061 +v -0.353961 8.334191 -0.556510 +v -0.613861 8.753545 -0.448106 +v -0.703995 8.724291 -0.532091 +v -0.750303 8.637641 -0.452210 +v -0.660168 8.666895 -0.368225 +v -0.919385 9.097373 -0.252534 +v -0.994612 9.078263 -0.317627 +v -1.040897 9.021661 -0.247519 +v -0.965670 9.040771 -0.182425 +v -1.126573 9.529469 -0.122677 +v -1.184577 9.518624 -0.170531 +v -1.227870 9.495061 -0.112716 +v -1.169866 9.505906 -0.064862 +v -1.252755 10.017161 -0.096544 +v -1.291806 10.011465 -0.128291 +v -1.322807 10.004334 -0.088877 +v -1.283756 10.010031 -0.057130 +v -1.339077 10.519033 -0.079035 +v -1.358587 10.516074 -0.094908 +v -1.374462 10.515043 -0.075204 +v -1.354953 10.518003 -0.059331 +v -1.406505 11.022470 -0.135415 +v -1.406505 11.022470 -0.135415 +v -1.406505 11.022470 -0.135415 +v -1.406505 11.022470 -0.135415 +v 0.946819 7.783953 -0.895764 +v 0.874971 7.745834 -0.798716 +v 0.978696 7.707715 -0.736897 +v 1.050544 7.745834 -0.833945 +v 0.963115 8.072925 -0.814550 +v 0.898452 8.038618 -0.727207 +v 0.991804 8.004312 -0.671570 +v 1.056467 8.038618 -0.758913 +v 1.001987 8.330740 -0.620822 +v 0.942236 8.282845 -0.554510 +v 1.022944 8.234949 -0.516381 +v 1.082695 8.282845 -0.582693 +v 1.048229 8.530135 -0.392279 +v 0.998167 8.494981 -0.328135 +v 1.064851 8.441104 -0.305619 +v 1.114912 8.476258 -0.369763 +v 1.208482 8.731099 -0.222913 +v 1.169614 8.706317 -0.162521 +v 1.217148 8.647399 -0.156106 +v 1.256016 8.672181 -0.216498 +v 1.405373 8.843890 -0.017204 +v 1.372052 8.822441 0.032172 +v 1.409448 8.771447 0.035258 +v 1.442770 8.792896 -0.014118 +v 1.576995 9.008658 0.162401 +v 1.548611 8.989715 0.199828 +v 1.583823 8.954394 0.208655 +v 1.612207 8.973338 0.171228 +v 1.671997 9.189566 0.377378 +v 1.651044 9.176027 0.406026 +v 1.681245 9.157101 0.419170 +v 1.702197 9.170639 0.390522 +v 1.725197 9.453602 0.498149 +v 1.711750 9.447270 0.518653 +v 1.733110 9.440987 0.530720 +v 1.746556 9.447318 0.510216 +v 1.723698 9.736523 0.595503 +v 1.717067 9.735612 0.606252 +v 1.727854 9.735098 0.612863 +v 1.734485 9.736009 0.602115 +v 1.727321 10.035175 0.563124 +v 1.727321 10.035175 0.563124 +v 1.727321 10.035175 0.563124 +v 1.727321 10.035175 0.563124 +v 0.029698 7.145856 -1.335827 +v 0.173249 7.017569 -1.272730 +v 0.124041 6.889281 -1.421614 +v -0.019509 7.017569 -1.484711 +v 0.358482 7.473966 -1.634795 +v 0.487677 7.358507 -1.578008 +v 0.443390 7.243048 -1.712004 +v 0.314195 7.358507 -1.768791 +v 0.790030 7.615906 -2.027210 +v 0.874791 7.501768 -1.949381 +v 0.805346 7.387630 -2.041137 +v 0.720585 7.501768 -2.118965 +v 1.215653 7.556913 -2.414236 +v 1.274499 7.457312 -2.332206 +v 1.198416 7.357710 -2.398562 +v 1.139569 7.457312 -2.480592 +v 1.637963 7.439081 -2.824273 +v 1.694598 7.346976 -2.768725 +v 1.587883 7.306709 -2.726690 +v 1.531248 7.398815 -2.782238 +v 1.143879 7.156472 -2.964077 +v 1.165209 7.059395 -2.944516 +v 1.135191 7.072125 -2.848608 +v 1.113860 7.169201 -2.868169 +v 0.623843 7.129411 -3.096046 +v 0.605196 7.050758 -3.090270 +v 0.585864 7.061071 -3.012249 +v 0.604511 7.139724 -3.018026 +v 0.141072 7.358492 -3.218096 +v 0.107268 7.307984 -3.217588 +v 0.103446 7.311150 -3.157012 +v 0.137251 7.361659 -3.157520 +v -0.281500 7.711366 -3.162776 +v -0.312181 7.684901 -3.162498 +v -0.310111 7.682925 -3.122080 +v -0.279429 7.709390 -3.122358 +v -0.583876 8.168916 -3.120630 +v -0.602268 8.160424 -3.120326 +v -0.602099 8.160783 -3.100070 +v -0.583707 8.169274 -3.100374 +v -0.755993 8.693449 -3.156226 +v -0.755993 8.693449 -3.156226 +v -0.755993 8.693449 -3.156226 +v -0.755993 8.693449 -3.156226 +v 0.094257 7.966857 -1.385411 +v 0.181835 7.917929 -1.399463 +v 0.141800 7.869000 -1.478613 +v 0.054222 7.917929 -1.464561 +v 0.203973 8.222988 -1.600493 +v 0.282793 8.178952 -1.613140 +v 0.246762 8.134916 -1.684375 +v 0.167941 8.178952 -1.671728 +v 0.319819 8.476004 -1.827593 +v 0.387587 8.432080 -1.834337 +v 0.353265 8.388157 -1.893159 +v 0.285497 8.432080 -1.886415 +v 0.454785 8.667295 -2.092062 +v 0.506842 8.619264 -2.088707 +v 0.483721 8.589992 -2.149011 +v 0.431664 8.638022 -2.152367 +v 0.719864 8.870164 -2.185085 +v 0.759488 8.824440 -2.179309 +v 0.751390 8.810035 -2.237799 +v 0.711766 8.855759 -2.243574 +v 0.977946 9.082851 -2.276656 +v 1.016552 9.050196 -2.273750 +v 1.011564 9.039907 -2.323092 +v 0.972957 9.072563 -2.325998 +v 1.162194 9.361288 -2.343512 +v 1.199976 9.346658 -2.342932 +v 1.200005 9.345127 -2.383423 +v 1.162223 9.359757 -2.384003 +v 1.225974 9.698651 -2.308956 +v 1.255983 9.693899 -2.308307 +v 1.257100 9.696826 -2.338534 +v 1.227091 9.701578 -2.339183 +v 1.278682 10.044031 -2.282729 +v 1.298890 10.045264 -2.281969 +v 1.299590 10.046249 -2.302192 +v 1.279382 10.045016 -2.302952 +v 1.193226 10.384220 -2.286871 +v 1.203143 10.386244 -2.286457 +v 1.203546 10.386343 -2.296578 +v 1.193629 10.384319 -2.296992 +v 1.148583 10.733781 -2.291321 +v 1.148583 10.733781 -2.291321 +v 1.148583 10.733781 -2.291321 +v 1.148583 10.733781 -2.291321 +v 1.689422 6.966218 -0.112815 +v 1.847219 6.912148 -0.227803 +v 1.720469 6.858077 -0.376316 +v 1.562672 6.912148 -0.261329 +v 1.715023 7.389741 -0.330098 +v 1.857041 7.341077 -0.433587 +v 1.742965 7.292414 -0.567249 +v 1.600948 7.341077 -0.463760 +v 1.734649 7.838409 -0.496665 +v 1.860702 7.791464 -0.587087 +v 1.759116 7.744520 -0.704330 +v 1.633064 7.791464 -0.613908 +v 1.764973 8.264867 -0.754035 +v 1.873975 8.204966 -0.822173 +v 1.783794 8.145064 -0.913778 +v 1.674792 8.204966 -0.845641 +v 1.804141 8.605612 -1.096833 +v 1.895765 8.569908 -1.168294 +v 1.821593 8.491507 -1.224223 +v 1.729969 8.527210 -1.152761 +v 1.550384 8.882241 -1.375201 +v 1.616406 8.871729 -1.451306 +v 1.558803 8.798558 -1.491172 +v 1.492780 8.809071 -1.415067 +v 1.337108 9.225039 -1.612843 +v 1.389184 9.217791 -1.674510 +v 1.337935 9.167332 -1.711856 +v 1.285859 9.174580 -1.650189 +v 1.148617 9.590683 -1.826086 +v 1.181483 9.596766 -1.876850 +v 1.138415 9.567541 -1.908236 +v 1.105549 9.561458 -1.857472 +v 0.926484 9.998642 -1.808439 +v 0.947114 10.005916 -1.842547 +v 0.914078 9.997292 -1.864367 +v 0.893449 9.990018 -1.830259 +v 0.890346 10.471495 -1.817919 +v 0.900807 10.474415 -1.835021 +v 0.883635 10.473310 -1.845714 +v 0.873174 10.470390 -1.828611 +v 0.804714 10.933186 -1.747385 +v 0.804714 10.933186 -1.747385 +v 0.804714 10.933186 -1.747385 +v 0.804714 10.933186 -1.747385 +v 2.047802 7.761458 -0.336647 +v 1.975832 7.749784 -0.266324 +v 2.047118 7.738110 -0.195306 +v 2.119088 7.749784 -0.265630 +v 2.047419 8.083793 -0.257494 +v 1.982646 8.073286 -0.194203 +v 2.046803 8.062779 -0.130287 +v 2.111576 8.073286 -0.193578 +v 2.047214 8.407493 -0.215221 +v 1.989635 8.402786 -0.158389 +v 2.046661 8.398080 -0.101003 +v 2.104240 8.402786 -0.157834 +v 2.047155 8.740693 -0.189114 +v 1.996760 8.736007 -0.139450 +v 2.046540 8.726703 -0.089816 +v 2.096934 8.731389 -0.139480 +v 2.078338 9.071297 -0.105906 +v 2.034596 9.061988 -0.064747 +v 2.075778 9.039640 -0.026034 +v 2.119520 9.048949 -0.067193 +v 2.147310 9.348683 0.069060 +v 2.110612 9.339578 0.102759 +v 2.144339 9.317718 0.133582 +v 2.181038 9.326823 0.099882 +v 2.194560 9.643855 0.191252 +v 2.165834 9.641214 0.219707 +v 2.194242 9.634187 0.247733 +v 2.222968 9.636827 0.219278 +v 2.195631 9.972488 0.189283 +v 2.174073 9.970064 0.210564 +v 2.195487 9.968187 0.232045 +v 2.217046 9.970612 0.210764 +v 2.185815 10.294212 0.270957 +v 2.171466 10.293852 0.285255 +v 2.185732 10.292042 0.299526 +v 2.200081 10.292402 0.285227 +v 2.228588 10.621202 0.253039 +v 2.221428 10.620213 0.260137 +v 2.228540 10.620466 0.267346 +v 2.235700 10.621456 0.260248 +v 2.129869 10.931916 0.317966 +v 2.129869 10.931916 0.317966 +v 2.129869 10.931916 0.317966 +v 2.129869 10.931916 0.317966 +v 0.529496 8.316685 0.391202 +v 0.592359 8.292812 0.355841 +v 0.550323 8.268940 0.297230 +v 0.487461 8.292812 0.332592 +v 0.560162 8.646173 0.252839 +v 0.616738 8.624688 0.221014 +v 0.578907 8.603203 0.168265 +v 0.522330 8.624688 0.200090 +v 0.601833 8.963037 0.064823 +v 0.650745 8.934495 0.042752 +v 0.615739 8.905953 0.002082 +v 0.566827 8.934495 0.024153 +v 0.665885 9.181393 -0.224174 +v 0.707440 9.151166 -0.237879 +v 0.675567 9.120939 -0.267858 +v 0.634012 9.151166 -0.254153 +v 0.730270 9.383074 -0.506154 +v 0.763189 9.373034 -0.536046 +v 0.737052 9.340174 -0.553793 +v 0.704133 9.350213 -0.523901 +v 0.441567 9.556203 -0.608087 +v 0.456325 9.560445 -0.642832 +v 0.439186 9.528443 -0.654019 +v 0.424428 9.524201 -0.619274 +v 0.159971 9.749408 -0.709650 +v 0.172390 9.752301 -0.737234 +v 0.154057 9.730477 -0.747777 +v 0.141638 9.727584 -0.720192 +v -0.038994 10.033573 -0.782975 +v -0.030844 10.037202 -0.803948 +v -0.048264 10.025434 -0.812754 +v -0.056414 10.021806 -0.791780 +v -0.220756 10.339454 -0.763543 +v -0.215386 10.342002 -0.777527 +v -0.228679 10.337609 -0.783432 +v -0.234049 10.335061 -0.769449 +v -0.274997 10.693794 -0.761475 +v -0.272054 10.693522 -0.768474 +v -0.279059 10.693478 -0.771417 +v -0.282001 10.693749 -0.764418 +v -0.218810 11.046441 -0.798456 +v -0.218810 11.046441 -0.798456 +v -0.218810 11.046441 -0.798456 +v -0.218810 11.046441 -0.798456 +v 2.302005 7.810725 0.680864 +v 2.334227 7.761965 0.729405 +v 2.346303 7.713205 0.672408 +v 2.314081 7.761965 0.623867 +v 2.597065 7.953778 0.624541 +v 2.626065 7.909894 0.668228 +v 2.636934 7.866009 0.616931 +v 2.607934 7.909894 0.573244 +v 2.900662 8.080722 0.566589 +v 2.925429 8.041254 0.605614 +v 2.934080 8.001786 0.560210 +v 2.909313 8.041254 0.521184 +v 3.202771 8.207875 0.508911 +v 3.208245 8.166563 0.541950 +v 3.232086 8.138839 0.503334 +v 3.226612 8.180151 0.470294 +v 3.432664 8.280716 0.741462 +v 3.422684 8.240501 0.760466 +v 3.454189 8.220362 0.734394 +v 3.464170 8.260576 0.715390 +v 3.664037 8.306132 0.976351 +v 3.658044 8.273344 0.994572 +v 3.685462 8.256923 0.974039 +v 3.691455 8.289711 0.955819 +v 3.871397 8.436835 1.185480 +v 3.871907 8.414977 1.206587 +v 3.899549 8.406547 1.197188 +v 3.899040 8.428405 1.176081 +v 3.925925 8.692723 1.379459 +v 3.927754 8.680120 1.398362 +v 3.950232 8.678370 1.395019 +v 3.948402 8.690973 1.376117 +v 3.973273 8.975332 1.543218 +v 3.974943 8.970798 1.557625 +v 3.990015 8.970377 1.555744 +v 3.988345 8.974911 1.541338 +v 3.974844 9.304403 1.573959 +v 3.975764 9.304647 1.581496 +v 3.983305 9.304594 1.580577 +v 3.982385 9.304350 1.573040 +v 3.983648 9.633586 1.527805 +v 3.983648 9.633586 1.527805 +v 3.983648 9.633586 1.527805 +v 3.983648 9.633586 1.527805 +v 0.659282 8.268538 -0.484583 +v 0.589586 8.241809 -0.470441 +v 0.613431 8.215080 -0.403441 +v 0.683128 8.241809 -0.417583 +v 0.601104 8.595416 -0.381626 +v 0.538377 8.571361 -0.368898 +v 0.559838 8.547305 -0.308598 +v 0.622565 8.571361 -0.321326 +v 0.485500 8.862021 -0.177043 +v 0.431328 8.835809 -0.168535 +v 0.451989 8.809596 -0.117740 +v 0.506161 8.835809 -0.126249 +v 0.386508 9.145262 -0.001860 +v 0.338843 9.123042 0.006054 +v 0.356657 9.100822 0.050967 +v 0.404322 9.123042 0.043054 +v 0.276544 9.421505 0.191593 +v 0.240607 9.393464 0.191995 +v 0.255821 9.374519 0.230564 +v 0.291758 9.402560 0.230162 +v 0.029355 9.597116 0.369884 +v 0.003494 9.569469 0.366741 +v 0.014864 9.555053 0.399996 +v 0.040725 9.582699 0.403139 +v -0.190923 9.810068 0.528775 +v -0.214202 9.790545 0.528105 +v -0.206456 9.780363 0.555671 +v -0.183178 9.799887 0.556341 +v -0.380694 10.063818 0.665707 +v -0.401078 10.053824 0.667741 +v -0.395278 10.046204 0.688424 +v -0.374894 10.056197 0.686390 +v -0.444652 10.368664 0.814281 +v -0.459326 10.365984 0.817174 +v -0.455823 10.362236 0.831476 +v -0.441149 10.364916 0.828584 +v -0.466995 10.710909 0.864362 +v -0.474407 10.710546 0.865992 +v -0.472752 10.709942 0.873383 +v -0.465340 10.710305 0.871753 +v -0.470695 11.058674 0.884086 +v -0.470695 11.058674 0.884086 +v -0.470695 11.058674 0.884086 +v -0.470695 11.058674 0.884086 +v 0.596185 8.523317 0.560098 +v 0.594314 8.503343 0.513591 +v 0.548948 8.483368 0.523994 +v 0.550818 8.503343 0.570501 +v 0.476244 8.825615 0.468427 +v 0.474561 8.807638 0.426571 +v 0.433731 8.789661 0.435934 +v 0.435414 8.807638 0.477790 +v 0.291663 9.079924 0.327352 +v 0.292980 9.059646 0.292297 +v 0.259499 9.039368 0.302770 +v 0.258183 9.059646 0.337825 +v 0.090470 9.299834 0.174807 +v 0.094585 9.275817 0.149054 +v 0.059589 9.270144 0.148752 +v 0.055473 9.294162 0.174505 +v 0.224327 9.485454 -0.068647 +v 0.226493 9.459579 -0.084438 +v 0.199047 9.464625 -0.096472 +v 0.196881 9.490499 -0.080681 +v 0.370896 9.628853 -0.336794 +v 0.373710 9.608617 -0.351758 +v 0.350642 9.612564 -0.361434 +v 0.347828 9.632800 -0.346470 +v 0.483989 9.866977 -0.544896 +v 0.488490 9.856349 -0.561547 +v 0.469081 9.857146 -0.567302 +v 0.464580 9.867774 -0.550651 +v 0.485337 10.181490 -0.664457 +v 0.489184 10.178098 -0.678760 +v 0.474485 10.177311 -0.682527 +v 0.470638 10.180703 -0.668224 +v 0.484580 10.516426 -0.703822 +v 0.487140 10.515536 -0.713582 +v 0.477340 10.515173 -0.716120 +v 0.474780 10.516063 -0.706360 +v 0.473181 10.852963 -0.734048 +v 0.474458 10.852940 -0.738949 +v 0.469557 10.852923 -0.740226 +v 0.468280 10.852947 -0.735325 +v 0.479658 11.190399 -0.713659 +v 0.479658 11.190399 -0.713659 +v 0.479658 11.190399 -0.713659 +v 0.479658 11.190399 -0.713659 +v -0.309383 8.507997 1.197018 +v -0.320630 8.486515 1.152550 +v -0.361548 8.465034 1.173277 +v -0.350301 8.486515 1.217745 +v -0.449703 8.763294 1.133155 +v -0.459825 8.743960 1.093134 +v -0.496652 8.724627 1.111788 +v -0.486530 8.743960 1.151809 +v -0.639906 8.980348 1.046590 +v -0.647598 8.961398 1.011610 +v -0.679027 8.942449 1.028786 +v -0.671335 8.961398 1.063766 +v -0.817986 9.211037 0.965543 +v -0.822107 9.191685 0.936123 +v -0.846999 9.172333 0.952339 +v -0.842877 9.191685 0.981759 +v -1.063148 9.353772 0.853112 +v -1.058425 9.331198 0.833322 +v -1.079586 9.314485 0.847336 +v -1.084310 9.337059 0.867126 +v -1.228797 9.427723 0.614403 +v -1.221423 9.407059 0.601756 +v -1.241366 9.394375 0.610853 +v -1.248739 9.415039 0.623500 +v -1.389268 9.518827 0.382983 +v -1.385029 9.503479 0.370456 +v -1.402002 9.494059 0.376254 +v -1.406241 9.509407 0.388782 +v -1.526435 9.689275 0.184265 +v -1.528674 9.682912 0.170650 +v -1.539309 9.673856 0.176631 +v -1.537070 9.680219 0.190246 +v -1.748999 9.862086 0.276701 +v -1.753703 9.861311 0.267763 +v -1.760104 9.854529 0.271720 +v -1.755399 9.855305 0.280658 +v -1.893280 10.115862 0.335334 +v -1.895284 10.114972 0.330769 +v -1.899206 10.112623 0.332948 +v -1.897202 10.113513 0.337514 +v -2.045922 10.370658 0.302226 +v -2.045922 10.370658 0.302226 +v -2.045922 10.370658 0.302226 +v -2.045922 10.370658 0.302226 +v 0.760364 8.469772 -0.722907 +v 0.800667 8.447762 -0.701540 +v 0.812064 8.425753 -0.745710 +v 0.771761 8.447762 -0.767077 +v 0.946760 8.703380 -0.805118 +v 0.983033 8.683571 -0.785887 +v 0.993291 8.663762 -0.825640 +v 0.957018 8.683571 -0.844871 +v 1.114468 8.954841 -0.879086 +v 1.145820 8.936049 -0.861599 +v 1.154048 8.917258 -0.896543 +v 1.122696 8.936049 -0.914029 +v 1.325203 9.167941 -0.971365 +v 1.343969 9.142981 -0.954577 +v 1.354892 9.130198 -0.985791 +v 1.336125 9.155159 -1.002579 +v 1.584534 9.309825 -0.865660 +v 1.589327 9.282205 -0.853927 +v 1.603063 9.273660 -0.879653 +v 1.598271 9.301280 -0.891386 +v 1.871167 9.352959 -0.747823 +v 1.871616 9.329037 -0.739526 +v 1.881966 9.321636 -0.761422 +v 1.881517 9.345558 -0.769719 +v 2.150855 9.395711 -0.634749 +v 2.149706 9.376191 -0.629447 +v 2.167442 9.372666 -0.638583 +v 2.168591 9.392186 -0.643885 +v 2.105310 9.444156 -0.339102 +v 2.104828 9.430180 -0.333159 +v 2.119864 9.430575 -0.331008 +v 2.120347 9.444551 -0.336951 +v 2.070197 9.623615 -0.092818 +v 2.069180 9.615827 -0.086422 +v 2.078715 9.617165 -0.083276 +v 2.079732 9.624953 -0.089672 +v 1.915945 9.816662 0.091619 +v 1.915205 9.813139 0.095183 +v 1.919578 9.814444 0.097381 +v 1.920318 9.817966 0.093817 +v 1.775589 10.035369 0.260129 +v 1.775589 10.035369 0.260129 +v 1.775589 10.035369 0.260129 +v 1.775589 10.035369 0.260129 +v 2.428249 8.050692 -0.247252 +v 2.446908 8.021605 -0.210222 +v 2.469964 7.992519 -0.244686 +v 2.451305 8.021605 -0.281716 +v 2.688823 8.264523 -0.231225 +v 2.705616 8.238345 -0.197898 +v 2.726366 8.212168 -0.228915 +v 2.709573 8.238345 -0.262242 +v 2.978799 8.438157 -0.213389 +v 2.993343 8.414618 -0.183789 +v 3.011405 8.391078 -0.211384 +v 2.996861 8.414618 -0.240984 +v 3.248831 8.644894 -0.196780 +v 3.259011 8.622743 -0.171037 +v 3.272268 8.600592 -0.195339 +v 3.262089 8.622743 -0.221083 +v 3.571638 8.745097 -0.177025 +v 3.594481 8.733276 -0.160838 +v 3.591310 8.706912 -0.175616 +v 3.568467 8.718733 -0.191803 +v 3.547139 8.778490 -0.507798 +v 3.571764 8.773235 -0.510510 +v 3.566148 8.748819 -0.514205 +v 3.541523 8.754074 -0.511493 +v 3.524899 8.848556 -0.833824 +v 3.544514 8.844712 -0.837127 +v 3.539631 8.826850 -0.845347 +v 3.520015 8.830693 -0.842045 +v 3.507062 9.055272 -1.097330 +v 3.521537 9.050650 -1.097410 +v 3.518380 9.040959 -1.108680 +v 3.503905 9.045582 -1.108600 +v 3.671027 9.296468 -1.266225 +v 3.680238 9.292311 -1.265514 +v 3.679100 9.288217 -1.274710 +v 3.669890 9.292374 -1.275421 +v 3.778123 9.595060 -1.376714 +v 3.783121 9.594244 -1.376790 +v 3.782887 9.593269 -1.381755 +v 3.777889 9.594086 -1.381679 +v 3.777413 9.931176 -1.400665 +v 3.777413 9.931176 -1.400665 +v 3.777413 9.931176 -1.400665 +v 3.777413 9.931176 -1.400665 +v 0.712311 8.493072 -0.525883 +v 0.668236 8.469649 -0.534491 +v 0.671942 8.446227 -0.489736 +v 0.716018 8.469649 -0.481128 +v 0.566221 8.790818 -0.395071 +v 0.526553 8.769738 -0.402818 +v 0.529889 8.748658 -0.362539 +v 0.569557 8.769738 -0.354792 +v 0.362330 9.025316 -0.212504 +v 0.328561 9.004486 -0.220726 +v 0.333018 8.983656 -0.186257 +v 0.366787 9.004486 -0.178035 +v 0.175063 9.277113 -0.044727 +v 0.146854 9.257257 -0.052909 +v 0.148211 9.242128 -0.020873 +v 0.176421 9.261985 -0.012691 +v -0.068662 9.522027 0.045824 +v -0.090819 9.502817 0.037850 +v -0.091451 9.491794 0.066162 +v -0.069294 9.511003 0.074136 +v -0.316205 9.759875 0.137763 +v -0.336056 9.745397 0.131628 +v -0.337379 9.737088 0.155514 +v -0.317528 9.751567 0.161650 +v -0.509524 10.048138 0.209925 +v -0.525928 10.037249 0.205150 +v -0.529022 10.033302 0.224780 +v -0.512618 10.044191 0.229554 +v -0.720255 10.334282 0.194644 +v -0.732770 10.326441 0.191069 +v -0.736151 10.325111 0.205823 +v -0.723636 10.332952 0.209398 +v -0.884620 10.648896 0.183413 +v -0.893502 10.644741 0.180872 +v -0.896702 10.645738 0.190432 +v -0.887821 10.649893 0.192972 +v -0.978511 10.964027 0.047634 +v -0.983148 10.962597 0.046184 +v -0.984928 10.963686 0.050799 +v -0.980291 10.965117 0.052249 +v -1.029498 11.310193 -0.023038 +v -1.029498 11.310193 -0.023038 +v -1.029498 11.310193 -0.023038 +v -1.029498 11.310193 -0.023038 +v 1.184975 2.782948 -1.117181 +v 1.420842 2.502403 -0.851126 +v 1.482200 2.221859 -1.201346 +v 1.246333 2.502403 -1.467400 +v 1.708618 3.115178 -1.265460 +v 1.910790 2.874711 -1.037413 +v 1.963382 2.634244 -1.337601 +v 1.761210 2.874711 -1.565648 +v 2.294968 3.313498 -1.431495 +v 2.469702 3.116829 -1.243228 +v 2.519787 2.920161 -1.495157 +v 2.345052 3.116829 -1.683424 +v 2.747511 3.636513 -1.559641 +v 2.935119 3.522524 -1.422569 +v 3.023008 3.408535 -1.637653 +v 2.835400 3.522524 -1.774725 +v 3.040486 4.158789 -1.642602 +v 3.196022 4.097458 -1.543997 +v 3.276767 4.036127 -1.709510 +v 3.121232 4.097458 -1.808115 +v 3.357188 4.709202 -1.732282 +v 3.461642 4.669943 -1.666762 +v 3.516236 4.630685 -1.777319 +v 3.411782 4.669943 -1.842840 +v 3.644566 5.263365 -1.813658 +v 3.700425 5.255677 -1.781926 +v 3.731354 5.247990 -1.838234 +v 3.675495 5.255677 -1.869966 +v 3.637604 5.894843 -1.811687 +v 3.637604 5.894843 -1.811687 +v 3.637604 5.894843 -1.811687 +v 3.637604 5.894843 -1.811687 +v 2.662767 3.651675 -0.575894 +v 2.543661 3.561877 -0.364402 +v 2.769465 3.472079 -0.275364 +v 2.888571 3.561877 -0.486856 +v 2.818727 4.108343 -0.136611 +v 2.729397 4.040995 0.022008 +v 2.898750 3.973646 0.088787 +v 2.988080 4.040995 -0.069832 +v 2.891797 4.670982 0.069202 +v 2.835645 4.653908 0.184529 +v 2.951949 4.636834 0.238628 +v 3.008101 4.653908 0.123302 +v 2.922423 5.291266 0.157396 +v 2.895657 5.298856 0.215810 +v 2.954220 5.295383 0.243095 +v 2.980986 5.287794 0.184681 +v 3.045599 5.906944 0.047816 +v 3.045599 5.906944 0.047816 +v 3.045599 5.906944 0.047816 +v 3.045599 5.906944 0.047816 +v 3.225182 4.749248 -0.432445 +v 3.349042 4.712869 -0.441386 +v 3.329504 4.676491 -0.564023 +v 3.205644 4.712869 -0.555081 +v 3.445533 5.290963 -0.710364 +v 3.507463 5.272774 -0.714835 +v 3.497694 5.254584 -0.776153 +v 3.435764 5.272774 -0.771682 +v 3.592556 5.883819 -0.895798 +v 3.592556 5.883819 -0.895798 +v 3.592556 5.883819 -0.895798 +v 3.592556 5.883819 -0.895798 +v 2.910038 5.304496 0.166065 +v 2.903074 5.293325 0.229412 +v 2.966606 5.282154 0.234426 +v 2.973569 5.293325 0.171079 +v 3.038156 5.915216 0.320893 +v 3.038156 5.915216 0.320893 +v 3.038156 5.915216 0.320893 +v 3.038156 5.915216 0.320893 +v -0.445736 4.886012 -1.509105 +v -0.184516 4.677549 -1.655035 +v -0.438894 4.469087 -1.812589 +v -0.700114 4.677549 -1.666659 +v -0.432942 5.145362 -2.076605 +v -0.215259 4.971643 -2.198213 +v -0.427241 4.797924 -2.329508 +v -0.644924 4.971643 -2.207900 +v -0.423100 5.502331 -2.513180 +v -0.248164 5.397474 -2.645498 +v -0.416959 5.292617 -2.785565 +v -0.591895 5.397474 -2.653247 +v -0.416029 5.985376 -2.826817 +v -0.284427 5.938011 -2.943797 +v -0.410623 5.890646 -3.066590 +v -0.542226 5.938011 -2.949609 +v -0.411823 6.544295 -3.013387 +v -0.323962 6.535885 -3.096970 +v -0.407967 6.527476 -3.184428 +v -0.495828 6.535885 -3.100845 +v -0.411605 7.150869 -3.023064 +v -0.367670 7.151961 -3.065048 +v -0.409668 7.153052 -3.108969 +v -0.453603 7.151961 -3.066986 +v -0.410601 7.768912 -3.067597 +v -0.410601 7.768912 -3.067597 +v -0.410601 7.768912 -3.067597 +v -0.410601 7.768912 -3.067597 +v 0.573046 5.714266 -2.843167 +v 0.585932 5.595132 -2.705733 +v 0.668033 5.475999 -2.816700 +v 0.655147 5.595132 -2.954134 +v 1.157891 5.852644 -2.680204 +v 1.166481 5.773222 -2.588581 +v 1.221215 5.693800 -2.662559 +v 1.212625 5.773222 -2.754182 +v 1.693610 6.102386 -2.530930 +v 1.701855 6.064631 -2.484018 +v 1.733172 6.026877 -2.519906 +v 1.724927 6.064631 -2.566818 +v 2.233703 6.362772 -2.380437 +v 2.233703 6.362772 -2.380437 +v 2.233703 6.362772 -2.380437 +v 2.233703 6.362772 -2.380437 +v 0.501580 6.762317 -3.240487 +v 0.558646 6.742043 -3.245638 +v 0.546391 6.721769 -3.301610 +v 0.489325 6.742043 -3.296459 +v 0.696062 7.286038 -3.505762 +v 0.696062 7.286038 -3.505762 +v 0.696062 7.286038 -3.505762 +v 0.696062 7.286038 -3.505762 +v 1.464608 6.718002 0.030341 +v 1.677080 6.531796 0.005191 +v 1.499726 6.345590 -0.114486 +v 1.287254 6.531796 -0.089335 +v 1.574416 6.967800 -0.422507 +v 1.756535 6.808194 -0.444065 +v 1.604517 6.648589 -0.546645 +v 1.422399 6.808194 -0.525087 +v 1.702347 7.059380 -0.950092 +v 1.851303 6.922204 -0.956471 +v 1.721812 6.785029 -1.030369 +v 1.572856 6.922204 -1.023990 +v 1.817018 7.216823 -1.422995 +v 1.940523 7.114418 -1.445995 +v 1.841270 7.012013 -1.523010 +v 1.717765 7.114418 -1.500010 +v 1.921842 7.462319 -1.855289 +v 2.018889 7.398288 -1.890760 +v 1.948868 7.334256 -1.966743 +v 1.851821 7.398288 -1.931272 +v 2.002957 7.850785 -2.189806 +v 2.069206 7.815069 -2.219852 +v 2.024077 7.779354 -2.276905 +v 1.957828 7.815069 -2.246859 +v 2.086420 8.248537 -2.534007 +v 2.119668 8.231360 -2.549541 +v 2.097228 8.214184 -2.578578 +v 2.063979 8.231360 -2.563044 +v 2.163949 8.667300 -2.853736 +v 2.163949 8.667300 -2.853736 +v 2.163949 8.667300 -2.853736 +v 2.163949 8.667300 -2.853736 +v 2.396074 6.937310 -1.315769 +v 2.510641 6.822705 -1.312716 +v 2.396104 6.708099 -1.316753 +v 2.281538 6.822705 -1.319806 +v 2.412519 6.873796 -1.847148 +v 2.498444 6.787842 -1.844858 +v 2.412542 6.701888 -1.847886 +v 2.326617 6.787842 -1.850176 +v 2.428714 6.884007 -2.370443 +v 2.486237 6.827268 -2.376681 +v 2.429209 6.770528 -2.386465 +v 2.371686 6.827268 -2.380227 +v 2.445713 6.962549 -2.887565 +v 2.473110 6.938450 -2.905186 +v 2.444462 6.910498 -2.911498 +v 2.417066 6.934597 -2.893877 +v 2.220000 7.243277 -3.272301 +v 2.220000 7.243277 -3.272301 +v 2.220000 7.243277 -3.272301 +v 2.220000 7.243277 -3.272301 +v 3.025894 7.531799 -1.727294 +v 3.098179 7.495318 -1.730677 +v 3.076536 7.458837 -1.799727 +v 3.004252 7.495318 -1.796345 +v 3.245503 7.905062 -2.041403 +v 3.281645 7.886821 -2.043094 +v 3.270824 7.868581 -2.077620 +v 3.234682 7.886821 -2.075929 +v 3.439239 8.315601 -2.318506 +v 3.439239 8.315601 -2.318506 +v 3.439239 8.315601 -2.318506 +v 3.439239 8.315601 -2.318506 +v 2.448165 6.964871 -2.902332 +v 2.464372 6.936523 -2.878341 +v 2.442011 6.908175 -2.896731 +v 2.425804 6.936523 -2.920722 +v 2.834857 6.859176 -3.254236 +v 2.834857 6.859176 -3.254236 +v 2.834857 6.859176 -3.254236 +v 2.834857 6.859176 -3.254236 +v 1.382230 8.028999 -0.371169 +v 1.477291 8.004252 -0.299563 +v 1.544719 7.979505 -0.397631 +v 1.449658 8.004252 -0.469237 +v 1.559824 8.324148 -0.400091 +v 1.639042 8.303526 -0.340419 +v 1.695232 8.282904 -0.422143 +v 1.616015 8.303526 -0.481814 +v 1.597120 8.641093 -0.406165 +v 1.662768 8.644842 -0.358798 +v 1.709994 8.648591 -0.424547 +v 1.644346 8.644842 -0.471914 +v 1.541438 8.977038 -0.397096 +v 1.590677 8.979794 -0.361572 +v 1.626100 8.982549 -0.410884 +v 1.576861 8.979794 -0.446409 +v 1.582447 9.322554 -0.403775 +v 1.615292 9.321039 -0.380095 +v 1.638926 9.319525 -0.412973 +v 1.606081 9.321039 -0.436653 +v 1.605646 9.660290 -0.407553 +v 1.621781 9.663257 -0.395666 +v 1.633312 9.666224 -0.412058 +v 1.617176 9.663257 -0.423945 +v 1.474584 9.972515 -0.386211 +v 1.474584 9.972515 -0.386211 +v 1.474584 9.972515 -0.386211 +v 1.474584 9.972515 -0.386211 +v 1.774368 8.440707 -1.278875 +v 1.793990 8.398030 -1.317447 +v 1.765925 8.355353 -1.284505 +v 1.746302 8.398030 -1.245934 +v 1.488498 8.409446 -1.469506 +v 1.501580 8.380995 -1.495220 +v 1.482869 8.352544 -1.473259 +v 1.469788 8.380995 -1.447545 +v 1.216060 8.491385 -1.651179 +v 1.220422 8.477722 -1.665489 +v 1.208888 8.464060 -1.655962 +v 1.204526 8.477722 -1.641652 +v 0.942550 8.586967 -1.833567 +v 0.942550 8.586967 -1.833567 +v 0.942550 8.586967 -1.833567 +v 0.942550 8.586967 -1.833567 +v 1.698394 8.993629 -1.611642 +v 1.714745 8.982831 -1.616790 +v 1.703532 8.972033 -1.629756 +v 1.687181 8.982831 -1.624608 +v 1.771379 9.207788 -1.868949 +v 1.771379 9.207788 -1.868949 +v 1.771379 9.207788 -1.868949 +v 1.771379 9.207788 -1.868949 +v -1.168225 3.794578 -1.433837 +v -1.290278 3.468807 -1.740820 +v -1.243181 3.143036 -1.413838 +v -1.121128 3.468807 -1.106855 +v -1.797948 3.844119 -1.265819 +v -1.902565 3.564887 -1.528948 +v -1.862196 3.285655 -1.248677 +v -1.757580 3.564887 -0.985549 +v -2.390054 3.846509 -1.107838 +v -2.519194 3.623229 -1.315917 +v -2.527513 3.399950 -1.071163 +v -2.398373 3.623229 -0.863084 +v -2.914153 4.114684 -0.968002 +v -3.052567 3.952044 -1.125100 +v -3.094324 3.789404 -0.919931 +v -2.955910 3.952044 -0.762834 +v -3.475673 4.387926 -0.818182 +v -3.590261 4.273058 -0.933130 +v -3.632357 4.158190 -0.776377 +v -3.517768 4.273058 -0.661430 +v -3.956363 4.755729 -0.689929 +v -4.054543 4.701711 -0.760747 +v -4.104394 4.647694 -0.650432 +v -4.006215 4.701711 -0.579614 +v -4.215690 5.316619 -0.620737 +v -4.272609 5.310055 -0.654057 +v -4.305364 5.303490 -0.596811 +v -4.248445 5.310055 -0.563491 +v -4.202446 5.960598 -0.624270 +v -4.202446 5.960598 -0.624270 +v -4.202446 5.960598 -0.624270 +v -4.202446 5.960598 -0.624270 +v -1.876244 4.245808 -3.114578 +v -1.796532 4.066024 -3.292381 +v -1.957679 3.886241 -3.182839 +v -2.037391 4.066024 -3.005037 +v -2.385691 4.249957 -3.541610 +v -2.325907 4.115119 -3.674962 +v -2.446767 3.980282 -3.592807 +v -2.506551 4.115119 -3.459455 +v -2.808492 4.498631 -3.896014 +v -2.795532 4.428032 -4.007460 +v -2.903002 4.357434 -3.975235 +v -2.915962 4.428032 -3.863789 +v -3.120749 4.974898 -4.156797 +v -3.120754 4.951265 -4.218721 +v -3.184263 4.933549 -4.211954 +v -3.184258 4.957182 -4.150031 +v -3.222525 5.575612 -4.373572 +v -3.222525 5.575612 -4.373572 +v -3.222525 5.575612 -4.373572 +v -3.222525 5.575612 -4.373572 +v -2.475121 5.002790 -3.779060 +v -2.538375 4.958104 -3.886645 +v -2.636963 4.913417 -3.810121 +v -2.573710 4.958104 -3.702536 +v -2.905573 5.499219 -3.861674 +v -2.937200 5.476876 -3.915467 +v -2.986494 5.454533 -3.877205 +v -2.954867 5.476876 -3.823412 +v -3.160321 6.092677 -3.910567 +v -3.160321 6.092677 -3.910567 +v -3.160321 6.092677 -3.910567 +v -3.160321 6.092677 -3.910567 +v -3.147961 4.989501 -4.153857 +v -3.106150 4.954224 -4.191279 +v -3.157050 4.918946 -4.214894 +v -3.198862 4.954224 -4.177473 +v -3.224936 5.384332 -4.670773 +v -3.224936 5.384332 -4.670773 +v -3.224936 5.384332 -4.670773 +v -3.224936 5.384332 -4.670773 +v -1.921655 5.633543 -0.212453 +v -2.123318 5.439054 -0.059728 +v -1.880928 5.244566 0.012659 +v -1.679264 5.439054 -0.140066 +v -1.825695 5.857920 0.317947 +v -1.993748 5.695846 0.445218 +v -1.791756 5.533772 0.505541 +v -1.623703 5.695846 0.378270 +v -1.741857 6.136453 0.781348 +v -1.871802 6.025455 0.908023 +v -1.705711 5.914456 0.981139 +v -1.575766 6.025455 0.854464 +v -1.674264 6.535723 1.154959 +v -1.768786 6.471326 1.266194 +v -1.641281 6.406930 1.337261 +v -1.546759 6.471326 1.226025 +v -1.619065 6.997978 1.460058 +v -1.680371 6.974212 1.543664 +v -1.593658 6.950446 1.600491 +v -1.532353 6.974212 1.516885 +v -1.600504 7.552279 1.562649 +v -1.630828 7.549822 1.606270 +v -1.587143 7.547366 1.636500 +v -1.556819 7.549822 1.592880 +v -1.592894 8.129701 1.604714 +v -1.592894 8.129701 1.604714 +v -1.592894 8.129701 1.604714 +v -1.592894 8.129701 1.604714 +v -3.237231 6.593627 -0.242536 +v -3.121005 6.513036 -0.316369 +v -3.230185 6.432445 -0.400271 +v -3.346411 6.513036 -0.326438 +v -3.213631 6.856160 -0.770855 +v -3.136147 6.802432 -0.820077 +v -3.208934 6.748704 -0.876011 +v -3.286418 6.802432 -0.826789 +v -3.199505 7.310511 -1.087107 +v -3.160341 7.298886 -1.121156 +v -3.196313 7.287261 -1.158562 +v -3.235476 7.298886 -1.124512 +v -3.195700 7.876673 -1.172270 +v -3.195700 7.876673 -1.172270 +v -3.195700 7.876673 -1.172270 +v -3.195700 7.876673 -1.172270 +v -3.639195 7.595006 -0.168512 +v -3.684244 7.568424 -0.178119 +v -3.678300 7.541842 -0.132442 +v -3.633251 7.568424 -0.122835 +v -3.960057 7.978616 0.127447 +v -3.960057 7.978616 0.127447 +v -3.960057 7.978616 0.127447 +v -3.960057 7.978616 0.127447 +v 0.580141 7.028418 -1.234203 +v 0.764090 6.879085 -1.308072 +v 0.598872 6.729751 -1.417602 +v 0.414924 6.879085 -1.343734 +v 0.625265 7.292235 -1.676012 +v 0.782935 7.164235 -1.739328 +v 0.641321 7.036234 -1.833211 +v 0.483650 7.164235 -1.769895 +v 0.671643 7.525213 -2.130098 +v 0.803520 7.421649 -2.187616 +v 0.685994 7.318084 -2.270606 +v 0.554116 7.421649 -2.213089 +v 0.713006 7.819535 -2.535080 +v 0.819555 7.744745 -2.591348 +v 0.726581 7.669954 -2.667994 +v 0.620032 7.744745 -2.611726 +v 0.751485 8.160961 -2.911833 +v 0.831843 8.109120 -2.958399 +v 0.762558 8.057280 -3.020249 +v 0.682201 8.109120 -2.973683 +v 0.787875 8.520566 -3.268128 +v 0.842026 8.493211 -3.304836 +v 0.796415 8.465856 -3.351734 +v 0.742264 8.493211 -3.315025 +v 0.811226 8.973371 -3.496754 +v 0.838559 8.964756 -3.517629 +v 0.816011 8.956141 -3.543598 +v 0.788678 8.964756 -3.522723 +v 0.828136 9.461348 -3.662321 +v 0.828136 9.461348 -3.662321 +v 0.828136 9.461348 -3.662321 +v 0.828136 9.461348 -3.662321 +v 1.531830 7.743646 -2.250914 +v 1.632867 7.644884 -2.238666 +v 1.541849 7.546122 -2.284210 +v 1.440813 7.644884 -2.296458 +v 1.681981 7.716473 -2.749892 +v 1.757758 7.642402 -2.740706 +v 1.689495 7.568330 -2.774863 +v 1.613717 7.642402 -2.784050 +v 1.819264 7.866516 -3.206111 +v 1.873455 7.821189 -3.212190 +v 1.831618 7.775862 -3.247164 +v 1.777427 7.821189 -3.241086 +v 1.949846 8.101546 -3.637728 +v 1.978631 8.085237 -3.650472 +v 1.957950 8.063464 -3.669320 +v 1.929165 8.079774 -3.656577 +v 1.849189 8.459961 -3.990544 +v 1.849189 8.459961 -3.990544 +v 1.849189 8.459961 -3.990544 +v 1.849189 8.459961 -3.990544 +v 2.061212 8.481051 -2.046879 +v 2.042529 8.449462 -1.986207 +v 2.105937 8.417872 -1.983129 +v 2.124621 8.449462 -2.043801 +v 2.285981 8.824026 -1.726501 +v 2.276639 8.808231 -1.696164 +v 2.308344 8.792437 -1.694625 +v 2.317685 8.808231 -1.724961 +v 2.454763 9.246087 -1.485923 +v 2.454763 9.246087 -1.485923 +v 2.454763 9.246087 -1.485923 +v 2.454763 9.246087 -1.485923 +v 1.954486 8.107457 -3.651166 +v 1.978222 8.082505 -3.659595 +v 1.953309 8.057553 -3.655883 +v 1.929574 8.082505 -3.647454 +v 1.829368 8.132607 -4.152524 +v 1.829368 8.132607 -4.152524 +v 1.829368 8.132607 -4.152524 +v 1.829368 8.132607 -4.152524 +v -0.524194 7.744465 -3.003163 +v -0.472067 7.673132 -3.062389 +v -0.548793 7.601799 -3.044003 +v -0.600919 7.673132 -2.984776 +v -0.701685 7.844488 -3.297831 +v -0.658246 7.785044 -3.347186 +v -0.722184 7.725600 -3.331864 +v -0.765622 7.785044 -3.282509 +v -0.874973 7.944592 -3.585521 +v -0.843893 7.900042 -3.631099 +v -0.898714 7.855492 -3.624935 +v -0.929794 7.900042 -3.579357 +v -1.023555 8.137906 -3.832193 +v -1.004273 8.109869 -3.873064 +v -1.049417 8.081832 -3.875129 +v -1.068698 8.109869 -3.834258 +v -1.150106 8.388762 -4.042292 +v -1.139316 8.374631 -4.072966 +v -1.171476 8.360499 -4.077769 +v -1.182266 8.374631 -4.047095 +v -1.236847 8.700876 -4.186297 +v -1.231948 8.695484 -4.202458 +v -1.248525 8.690092 -4.205684 +v -1.253423 8.695484 -4.189523 +v -1.319668 9.020874 -4.323794 +v -1.319668 9.020874 -4.323794 +v -1.319668 9.020874 -4.323794 +v -1.319668 9.020874 -4.323794 +v 0.122530 8.429044 -3.388614 +v 0.154087 8.395881 -3.415683 +v 0.113126 8.362718 -3.422805 +v 0.081570 8.395881 -3.395737 +v 0.034494 8.565729 -3.708693 +v 0.055532 8.543620 -3.726739 +v 0.028225 8.521511 -3.731487 +v 0.007187 8.543620 -3.713442 +v -0.047123 8.742347 -4.005433 +v -0.037161 8.732705 -4.016481 +v -0.051372 8.723063 -4.020881 +v -0.061333 8.732705 -4.009833 +v -0.113306 8.996885 -4.246061 +v -0.113306 8.996885 -4.246061 +v -0.113306 8.996885 -4.246061 +v -0.113306 8.996885 -4.246061 +v 0.320277 9.066226 -3.434238 +v 0.337082 9.063099 -3.429541 +v 0.341237 9.059972 -3.446488 +v 0.324432 9.063099 -3.451186 +v 0.407867 9.409742 -3.485430 +v 0.407867 9.409742 -3.485430 +v 0.407867 9.409742 -3.485430 +v 0.407867 9.409742 -3.485430 +v -0.438725 3.411787 2.379346 +v -0.566276 3.063119 2.049895 +v -0.367477 2.714451 2.341933 +v -0.239926 3.063119 2.671384 +v -1.081101 3.302770 2.716665 +v -1.190431 3.003911 2.434278 +v -1.020031 2.705053 2.684596 +v -0.910702 3.003911 2.966983 +v -1.709206 3.145024 3.046489 +v -1.809506 2.894995 2.815994 +v -1.676699 2.644967 3.029419 +v -1.576399 2.894995 3.259915 +v -2.321213 3.095876 3.367861 +v -2.435777 2.896765 3.201488 +v -2.363856 2.697655 3.390253 +v -2.249291 2.896765 3.556625 +v -2.941916 3.216024 3.693798 +v -3.043691 3.069967 3.577343 +v -3.005602 2.923909 3.727241 +v -2.903826 3.069967 3.843696 +v -3.567665 3.339118 4.022386 +v -3.650633 3.247625 3.952688 +v -3.640358 3.156133 4.060558 +v -3.557390 3.247625 4.130256 +v -4.110577 3.698305 4.307475 +v -4.163823 3.661280 4.278802 +v -4.170447 3.624255 4.338914 +v -4.117201 3.661280 4.367587 +v -4.553818 4.227307 4.540226 +v -4.553818 4.227307 4.540226 +v -4.553818 4.227307 4.540226 +v -4.553818 4.227307 4.540226 +v -2.268573 2.502650 3.244987 +v -2.510533 2.364435 3.192061 +v -2.384891 2.226219 2.978613 +v -2.142931 2.364435 3.031538 +v -2.082835 1.931581 3.670330 +v -2.264306 1.827919 3.630636 +v -2.170075 1.724258 3.470550 +v -1.988604 1.827919 3.510244 +v -1.901104 1.386686 4.086501 +v -2.013968 1.301175 4.078626 +v -1.943030 1.215663 3.990490 +v -1.830166 1.301175 3.998365 +v -1.632028 1.134249 4.687912 +v -1.689291 1.096134 4.670698 +v -1.650832 1.036677 4.674414 +v -1.593569 1.074792 4.691628 +v -2.189379 1.198111 5.155898 +v -2.189379 1.198111 5.155898 +v -2.189379 1.198111 5.155898 +v -2.189379 1.198111 5.155898 +v -3.528721 2.366931 2.252950 +v -3.495451 2.267692 2.157258 +v -3.500419 2.168453 2.258447 +v -3.533689 2.267692 2.354140 +v -4.206939 2.091548 2.121228 +v -4.190303 2.041929 2.073382 +v -4.192787 1.992309 2.123977 +v -4.209423 2.041929 2.171823 +v -4.919889 2.059740 1.982761 +v -4.919889 2.059740 1.982761 +v -4.919889 2.059740 1.982761 +v -4.919889 2.059740 1.982761 +v -1.649546 1.129161 4.704372 +v -1.688760 1.085463 4.664612 +v -1.633314 1.041765 4.657954 +v -1.594100 1.085463 4.697714 +v -1.852498 0.725680 5.284750 +v -1.852498 0.725680 5.284750 +v -1.852498 0.725680 5.284750 +v -1.852498 0.725680 5.284750 +v 1.437016 5.881810 0.945045 +v 1.231297 5.797047 1.173769 +v 1.474979 5.712285 1.361528 +v 1.680697 5.797047 1.132805 +v 1.468135 6.346535 1.286442 +v 1.296703 6.275900 1.477045 +v 1.499771 6.205265 1.633511 +v 1.671202 6.275900 1.442909 +v 1.480619 6.853852 1.423408 +v 1.344355 6.834030 1.585556 +v 1.507690 6.814208 1.720395 +v 1.643955 6.834030 1.558247 +v 1.487325 7.394596 1.496980 +v 1.385194 7.402137 1.619320 +v 1.507761 7.409678 1.721177 +v 1.609893 7.402137 1.598838 +v 1.480482 7.962621 1.421907 +v 1.412406 7.960189 1.503595 +v 1.494130 7.957757 1.571628 +v 1.562206 7.960189 1.489940 +v 1.497388 8.511973 1.607375 +v 1.463346 8.509785 1.648175 +v 1.504204 8.507596 1.682148 +v 1.538246 8.509785 1.641348 +v 1.493195 9.072927 1.561370 +v 1.493195 9.072927 1.561370 +v 1.493195 9.072927 1.561370 +v 1.493195 9.072927 1.561370 +v 2.647307 7.007507 1.210589 +v 2.774710 6.923299 1.256765 +v 2.768110 6.839091 1.121413 +v 2.640707 6.923299 1.075237 +v 3.069217 7.252843 0.899137 +v 3.154153 7.196704 0.929921 +v 3.149752 7.140566 0.839686 +v 3.064817 7.196704 0.808902 +v 3.347239 7.679296 0.693902 +v 3.396259 7.661576 0.704458 +v 3.400610 7.643856 0.654504 +v 3.351591 7.661576 0.643948 +v 3.537795 8.193227 0.553235 +v 3.537795 8.193227 0.553235 +v 3.537795 8.193227 0.553235 +v 3.537795 8.193227 0.553235 +v 2.844253 7.966058 0.837740 +v 2.867753 7.965289 0.790038 +v 2.820046 7.964520 0.766548 +v 2.796546 7.965289 0.814250 +v 2.828403 8.534503 0.791126 +v 2.828403 8.534503 0.791126 +v 2.828403 8.534503 0.791126 +v 2.828403 8.534503 0.791126 +v 0.425934 7.030401 0.202444 +v 0.607008 6.892642 0.103303 +v 0.437605 6.754883 -0.014677 +v 0.256532 6.892642 0.084464 +v 0.443805 7.320415 -0.130013 +v 0.599011 7.202335 -0.214991 +v 0.453809 7.084256 -0.316117 +v 0.298603 7.202335 -0.231139 +v 0.464053 7.525328 -0.506691 +v 0.594105 7.439068 -0.590783 +v 0.473817 7.352808 -0.688330 +v 0.343765 7.439068 -0.604239 +v 0.475585 7.864366 -0.721223 +v 0.580695 7.826053 -0.808379 +v 0.485534 7.787739 -0.906302 +v 0.380423 7.826053 -0.819145 +v 0.482965 8.256948 -0.858522 +v 0.562099 8.252988 -0.929483 +v 0.491028 8.249028 -1.008518 +v 0.411895 8.252988 -0.937557 +v 0.480314 8.691339 -0.809194 +v 0.533072 8.690166 -0.856557 +v 0.485695 8.688993 -0.909302 +v 0.432936 8.690166 -0.861939 +v 0.486744 9.123565 -0.928824 +v 0.513124 9.123386 -0.952511 +v 0.489436 9.123208 -0.978890 +v 0.463056 9.123386 -0.955203 +v 0.483335 9.557910 -0.865405 +v 0.483335 9.557910 -0.865405 +v 0.483335 9.557910 -0.865405 +v 0.483335 9.557910 -0.865405 +v 0.558096 7.494945 -1.089790 +v 0.643805 7.398178 -1.148121 +v 0.540498 7.301411 -1.139387 +v 0.454789 7.398178 -1.081055 +v 0.410038 7.550732 -1.507068 +v 0.474320 7.478157 -1.550817 +v 0.396840 7.405581 -1.544266 +v 0.332558 7.478157 -1.500517 +v 0.271237 7.675481 -1.898259 +v 0.311376 7.630078 -1.935076 +v 0.257008 7.584675 -1.938359 +v 0.216869 7.630078 -1.901542 +v 0.141083 7.870992 -2.262905 +v 0.160397 7.850526 -2.284473 +v 0.130781 7.835022 -2.296283 +v 0.111466 7.855487 -2.274715 +v 0.201671 8.214132 -2.528439 +v 0.201671 8.214132 -2.528439 +v 0.201671 8.214132 -2.528439 +v 0.201671 8.214132 -2.528439 +v 1.091745 8.038615 -1.418913 +v 1.151044 7.999913 -1.415183 +v 1.129262 7.961211 -1.470462 +v 1.069964 7.999913 -1.474193 +v 1.335419 8.214531 -1.753723 +v 1.365068 8.195180 -1.751857 +v 1.354177 8.175829 -1.779497 +v 1.324528 8.195180 -1.781362 +v 1.502458 8.548554 -1.983236 +v 1.502458 8.548554 -1.983236 +v 1.502458 8.548554 -1.983236 +v 1.502458 8.548554 -1.983236 +v 0.132037 7.877615 -2.276805 +v 0.150529 7.853007 -2.259212 +v 0.139826 7.828399 -2.282383 +v 0.121335 7.853007 -2.299976 +v 0.489827 7.937741 -2.533042 +v 0.489827 7.937741 -2.533042 +v 0.489827 7.937741 -2.533042 +v 0.489827 7.937741 -2.533042 +v -1.327747 8.012629 0.904154 +v -1.267407 7.945326 0.848094 +v -1.349429 7.878024 0.840609 +v -1.409769 7.945326 0.896670 +v -1.422862 8.133208 0.625400 +v -1.372579 8.077123 0.578683 +v -1.440931 8.021037 0.572446 +v -1.491214 8.077123 0.619163 +v -1.512139 8.268379 0.363755 +v -1.474570 8.228665 0.318595 +v -1.531908 8.188951 0.305819 +v -1.569478 8.228665 0.350979 +v -1.582908 8.483783 0.156353 +v -1.556713 8.459954 0.116675 +v -1.601698 8.436126 0.101286 +v -1.627893 8.459954 0.140963 +v -1.644233 8.728647 -0.023372 +v -1.627962 8.718874 -0.053317 +v -1.659144 8.709101 -0.067071 +v -1.675416 8.718874 -0.037125 +v -1.666347 9.031702 -0.088180 +v -1.658527 9.031128 -0.104079 +v -1.674434 9.030554 -0.111882 +v -1.682254 9.031128 -0.095983 +v -1.660993 9.347371 -0.072491 +v -1.660993 9.347371 -0.072491 +v -1.660993 9.347371 -0.072491 +v -1.660993 9.347371 -0.072491 +v -1.410943 8.299745 1.717854 +v -1.442892 8.265351 1.692861 +v -1.437297 8.230958 1.733036 +v -1.405347 8.265351 1.758029 +v -1.680658 8.372512 1.873241 +v -1.701958 8.349583 1.856579 +v -1.698227 8.326653 1.883363 +v -1.676928 8.349583 1.900025 +v -1.915602 8.529548 2.008595 +v -1.928234 8.519399 2.001407 +v -1.928351 8.509250 2.015941 +v -1.915719 8.519399 2.023129 +v -2.134155 8.721622 2.134507 +v -2.134155 8.721622 2.134507 +v -2.134155 8.721622 2.134507 +v -2.134155 8.721622 2.134507 +v -1.215106 8.757973 2.038816 +v -1.225812 8.749043 2.049765 +v -1.211874 8.740112 2.056109 +v -1.201168 8.749043 2.045161 +v -1.171938 8.971903 2.269866 +v -1.171938 8.971903 2.269866 +v -1.171938 8.971903 2.269866 +v -1.171938 8.971903 2.269866 +v 1.534648 5.169812 2.245611 +v 1.314924 4.944189 2.194286 +v 1.535486 4.718566 2.241882 +v 1.755210 4.944189 2.293208 +v 1.385326 5.207073 2.910216 +v 1.196991 5.013682 2.866223 +v 1.386044 4.820291 2.907020 +v 1.574379 5.013682 2.951013 +v 1.240748 5.092696 3.553707 +v 1.079338 4.932655 3.536916 +v 1.232418 4.772614 3.590783 +v 1.393828 4.932655 3.607574 +v 1.106853 5.289318 4.149652 +v 0.969988 5.170684 4.170652 +v 1.084716 5.052050 4.248179 +v 1.221581 5.170684 4.227179 +v 0.974231 5.542482 4.739928 +v 0.866221 5.468549 4.779541 +v 0.946906 5.394616 4.861549 +v 1.054915 5.468549 4.821937 +v 0.885761 6.056892 5.133695 +v 0.810446 6.026111 5.174828 +v 0.860927 5.995329 5.244224 +v 0.936242 6.026111 5.203091 +v 0.824894 6.674127 5.404601 +v 0.786790 6.663298 5.427156 +v 0.811584 6.652469 5.463843 +v 0.849688 6.663298 5.441288 +v 0.772508 7.315738 5.637762 +v 0.772508 7.315738 5.637762 +v 0.772508 7.315738 5.637762 +v 0.772508 7.315738 5.637762 +v 1.497229 5.436160 4.161867 +v 1.357597 5.322253 4.134022 +v 1.425570 5.208346 4.259130 +v 1.565202 5.322253 4.286974 +v 1.125619 5.716535 4.666256 +v 1.020896 5.631104 4.645373 +v 1.071876 5.545674 4.739204 +v 1.176599 5.631104 4.760087 +v 0.765162 6.017244 5.155509 +v 0.691743 5.963954 5.146478 +v 0.722126 5.910665 5.213923 +v 0.795545 5.963954 5.222954 +v 0.444727 6.420751 5.592375 +v 0.409487 6.392430 5.586542 +v 0.414804 6.377044 5.629120 +v 0.450043 6.405365 5.634954 +v -0.061087 6.876646 5.615006 +v -0.061087 6.876646 5.615006 +v -0.061087 6.876646 5.615006 +v -0.061087 6.876646 5.615006 +v 1.954182 6.483880 4.707542 +v 2.021975 6.459475 4.763402 +v 2.072434 6.435069 4.691499 +v 2.004642 6.459475 4.635640 +v 2.261668 7.096606 4.665825 +v 2.295564 7.084403 4.693755 +v 2.320794 7.072200 4.657804 +v 2.286898 7.084403 4.629874 +v 2.526950 7.726752 4.629835 +v 2.526950 7.726752 4.629835 +v 2.526950 7.726752 4.629835 +v 2.526950 7.726752 4.629835 +v 0.438267 6.429632 5.606050 +v 0.414175 6.398897 5.582536 +v 0.421264 6.368163 5.615446 +v 0.445356 6.398897 5.638959 +v -0.141888 6.605322 5.926658 +v -0.141888 6.605322 5.926658 +v -0.141888 6.605322 5.926658 +v -0.141888 6.605322 5.926658 +v 3.219571 6.469072 -0.078109 +v 3.230975 6.342716 0.052853 +v 3.270551 6.216360 -0.072506 +v 3.259147 6.342716 -0.203468 +v 3.733453 6.487620 -0.021628 +v 3.742956 6.382323 0.087507 +v 3.775936 6.277026 -0.016959 +v 3.766433 6.382323 -0.126094 +v 4.206037 6.624870 0.030313 +v 4.229965 6.545720 0.119416 +v 4.272674 6.466570 0.037637 +v 4.248746 6.545720 -0.051465 +v 4.662807 6.838914 0.080517 +v 4.686213 6.782190 0.147944 +v 4.723703 6.725467 0.087210 +v 4.700298 6.782190 0.019783 +v 5.117904 7.071841 0.130537 +v 5.134051 7.034326 0.175548 +v 5.159589 6.996810 0.135118 +v 5.143442 7.034326 0.090107 +v 5.574172 7.302090 0.180685 +v 5.583283 7.283955 0.203305 +v 5.597089 7.265820 0.183204 +v 5.587978 7.283955 0.160584 +v 5.999984 7.585069 0.227486 +v 5.999984 7.585069 0.227486 +v 5.999984 7.585069 0.227486 +v 5.999984 7.585069 0.227486 +v 4.334825 5.948848 0.922732 +v 4.295790 5.890675 0.981075 +v 4.280187 5.832502 0.912634 +v 4.319222 5.890675 0.854290 +v 4.770383 5.684607 1.003235 +v 4.744359 5.645825 1.042130 +v 4.733958 5.607043 0.996502 +v 4.759982 5.645825 0.957607 +v 5.222106 5.469275 1.086725 +v 5.215028 5.448030 1.107269 +v 5.215760 5.426785 1.085552 +v 5.222838 5.448030 1.065007 +v 5.722395 5.495978 1.179191 +v 5.722395 5.495978 1.179191 +v 5.722395 5.495978 1.179191 +v 5.722395 5.495978 1.179191 +v 4.622640 5.958681 1.889000 +v 4.609538 5.937193 1.906033 +v 4.622910 5.915705 1.889211 +v 4.636013 5.937193 1.872178 +v 5.027837 5.941289 2.205871 +v 5.027837 5.941289 2.205871 +v 5.027837 5.941289 2.205871 +v 5.027837 5.941289 2.205871 +v 2.150409 7.991917 0.021371 +v 2.223603 7.920340 -0.007481 +v 2.146829 7.848762 -0.024673 +v 2.073635 7.920340 0.004179 +v 2.127791 8.141006 -0.269547 +v 2.190529 8.079654 -0.294277 +v 2.124723 8.018301 -0.309014 +v 2.061985 8.079654 -0.284284 +v 2.101800 8.171410 -0.603858 +v 2.154455 8.118974 -0.619669 +v 2.099989 8.066538 -0.627152 +v 2.047335 8.118974 -0.611341 +v 2.077694 8.263039 -0.913933 +v 2.119486 8.222279 -0.930848 +v 2.075581 8.181519 -0.941101 +v 2.033789 8.222279 -0.924186 +v 2.053450 8.357422 -1.225771 +v 2.084577 8.327933 -1.241244 +v 2.051432 8.298445 -1.251721 +v 2.020305 8.327933 -1.236247 +v 2.030896 8.506101 -1.515871 +v 2.051507 8.487343 -1.527988 +v 2.029271 8.468585 -1.536774 +v 2.008659 8.487343 -1.524657 +v 2.008281 8.658614 -1.806756 +v 2.018555 8.649472 -1.813217 +v 2.007406 8.640330 -1.818012 +v 1.997131 8.649472 -1.811551 +v 1.986645 8.833367 -2.085047 +v 1.986645 8.833367 -2.085047 +v 1.986645 8.833367 -2.085047 +v 1.986645 8.833367 -2.085047 +v 2.946494 8.420134 -0.331333 +v 2.954943 8.379452 -0.286974 +v 2.974000 8.338770 -0.327913 +v 2.965551 8.379452 -0.372272 +v 3.272807 8.462414 -0.290752 +v 3.279144 8.431903 -0.257482 +v 3.293437 8.401392 -0.288186 +v 3.287100 8.431903 -0.321455 +v 3.558159 8.606430 -0.255264 +v 3.567969 8.588993 -0.232389 +v 3.583083 8.571556 -0.252164 +v 3.573273 8.588993 -0.275038 +v 3.801141 8.820479 -0.225371 +v 3.806758 8.812475 -0.213741 +v 3.818040 8.807494 -0.222618 +v 3.812422 8.815498 -0.234248 +v 3.925897 9.087750 -0.082086 +v 3.925897 9.087750 -0.082086 +v 3.925897 9.087750 -0.082086 +v 3.925897 9.087750 -0.082086 +v 3.213307 8.972035 -0.277432 +v 3.202684 8.970988 -0.248978 +v 3.231150 8.969941 -0.238389 +v 3.241773 8.970988 -0.266843 +v 3.253091 9.289930 -0.190380 +v 3.247780 9.289407 -0.176154 +v 3.262013 9.288883 -0.170859 +v 3.267324 9.289407 -0.185086 +v 3.235279 9.614585 -0.229355 +v 3.235279 9.614585 -0.229355 +v 3.235279 9.614585 -0.229355 +v 3.235279 9.614585 -0.229355 +v 3.806164 8.824103 -0.222829 +v 3.813049 8.813987 -0.213822 +v 3.813017 8.803870 -0.225159 +v 3.806132 8.813987 -0.234167 +v 4.103378 8.924999 -0.323879 +v 4.103378 8.924999 -0.323879 +v 4.103378 8.924999 -0.323879 +v 4.103378 8.924999 -0.323879 +v -0.238557 7.307096 0.603106 +v -0.416969 7.169384 0.637062 +v -0.286606 7.031672 0.763510 +v -0.108194 7.169384 0.729554 +v -0.384065 7.588102 1.088866 +v -0.532741 7.473342 1.117162 +v -0.424105 7.358582 1.222536 +v -0.275429 7.473342 1.194239 +v -0.529538 7.860610 1.574510 +v -0.649573 7.771229 1.600798 +v -0.563757 7.681849 1.688748 +v -0.443723 7.771229 1.662460 +v -0.666496 8.180132 2.031727 +v -0.757517 8.115544 2.054764 +v -0.694150 8.050957 2.124048 +v -0.603129 8.115544 2.101010 +v -0.802147 8.501809 2.484582 +v -0.864569 8.464027 2.505751 +v -0.824065 8.426246 2.557751 +v -0.761644 8.464027 2.536582 +v -0.905196 8.945080 2.828598 +v -0.937399 8.930491 2.842496 +v -0.918140 8.915903 2.871809 +v -0.885937 8.930491 2.857911 +v -0.993329 9.435052 3.122818 +v -0.993329 9.435052 3.122818 +v -0.993329 9.435052 3.122818 +v -0.993329 9.435052 3.122818 +v -0.918464 8.386487 1.632757 +v -0.989647 8.350079 1.551550 +v -1.062236 8.313670 1.631503 +v -0.991052 8.350079 1.712709 +v -1.250655 8.864816 1.629860 +v -1.298110 8.840544 1.575723 +v -1.346503 8.816272 1.629025 +v -1.299047 8.840544 1.683162 +v -1.485691 9.386496 1.627811 +v -1.511321 9.379251 1.600726 +v -1.537420 9.372007 1.627360 +v -1.511790 9.379251 1.654446 +v -1.609342 9.950221 1.626733 +v -1.609342 9.950221 1.626733 +v -1.609342 9.950221 1.626733 +v -1.609342 9.950221 1.626733 +v -1.024298 9.480569 1.892563 +v -1.059047 9.467821 1.884020 +v -1.063111 9.455073 1.919572 +v -1.028361 9.467821 1.928115 +v -1.269368 9.977707 2.063106 +v -1.269368 9.977707 2.063106 +v -1.269368 9.977707 2.063106 +v -1.269368 9.977707 2.063106 +v 1.859337 7.563104 1.402194 +v 1.913769 7.445670 1.523322 +v 1.946700 7.328237 1.394673 +v 1.892267 7.445670 1.273545 +v 2.255284 7.779741 1.368110 +v 2.301940 7.679084 1.471934 +v 2.330166 7.578427 1.361664 +v 2.283510 7.679084 1.257839 +v 2.716249 7.845561 1.328429 +v 2.747164 7.759115 1.415635 +v 2.762721 7.672670 1.324428 +v 2.731806 7.759115 1.237222 +v 3.128402 7.976531 1.292950 +v 3.171871 7.915480 1.361102 +v 3.203053 7.854429 1.286523 +v 3.159584 7.915480 1.218372 +v 3.456095 8.259929 1.264741 +v 3.502274 8.226090 1.314686 +v 3.539238 8.192252 1.257584 +v 3.493059 8.226090 1.207639 +v 3.697776 8.626657 1.243937 +v 3.734982 8.616221 1.276681 +v 3.766044 8.605786 1.238060 +v 3.728838 8.616221 1.205316 +v 3.736602 9.067736 1.240594 +v 3.755647 9.071175 1.256928 +v 3.771620 9.074614 1.237580 +v 3.752575 9.071175 1.221246 +v 3.562689 9.484170 1.255565 +v 3.562689 9.484170 1.255565 +v 3.562689 9.484170 1.255565 +v 3.562689 9.484170 1.255565 +v 0.677967 7.871062 1.843559 +v 0.602643 7.803361 1.841461 +v 0.662207 7.735661 1.887616 +v 0.737530 7.803361 1.889714 +v 0.527193 7.965059 2.265038 +v 0.470701 7.914284 2.263465 +v 0.515373 7.863508 2.298081 +v 0.571866 7.914284 2.299654 +v 0.387451 8.130353 2.655679 +v 0.347439 8.099792 2.661199 +v 0.374871 8.069232 2.690845 +v 0.414883 8.099792 2.685325 +v 0.265468 8.395876 2.993443 +v 0.244225 8.389061 3.005428 +v 0.257791 8.374807 3.021370 +v 0.279034 8.381622 3.009385 +v 0.462134 8.752385 3.187837 +v 0.462134 8.752385 3.187837 +v 0.462134 8.752385 3.187837 +v 0.462134 8.752385 3.187837 +v 0.253902 8.543679 1.568224 +v 0.227861 8.525394 1.528818 +v 0.192802 8.507110 1.560470 +v 0.218843 8.525394 1.599877 +v -0.004323 8.918598 1.535455 +v -0.017344 8.909456 1.515752 +v -0.034874 8.900314 1.531578 +v -0.021853 8.909456 1.551281 +v -0.237814 9.308322 1.505825 +v -0.237814 9.308322 1.505825 +v -0.237814 9.308322 1.505825 +v -0.237814 9.308322 1.505825 +v 0.264697 8.402979 3.006984 +v 0.259189 8.385342 2.989666 +v 0.258562 8.367704 3.007828 +v 0.264070 8.385342 3.025146 +v -0.182822 8.464095 3.068557 +v -0.182822 8.464095 3.068557 +v -0.182822 8.464095 3.068557 +v -0.182822 8.464095 3.068557 +v 2.864426 7.683589 1.463368 +v 2.810283 7.630359 1.466049 +v 2.861778 7.577128 1.449110 +v 2.915920 7.630359 1.446429 +v 2.921777 7.609552 1.772164 +v 2.876658 7.565194 1.774397 +v 2.919570 7.520835 1.760281 +v 2.964689 7.565194 1.758048 +v 2.979353 7.579463 2.082166 +v 2.944119 7.543648 2.088588 +v 2.979309 7.507834 2.081931 +v 3.014543 7.543648 2.075509 +v 3.036716 7.588958 2.391022 +v 3.011604 7.563054 2.402913 +v 3.039311 7.537149 2.404994 +v 3.064422 7.563054 2.393103 +v 3.088670 7.725881 2.670754 +v 3.072684 7.710330 2.682752 +v 3.091912 7.694778 2.688211 +v 3.107897 7.710330 2.676213 +v 3.139023 7.889030 2.941871 +v 3.131225 7.881968 2.948918 +v 3.141034 7.874906 2.952695 +v 3.148832 7.881968 2.945648 +v 3.182565 8.104200 3.176312 +v 3.182565 8.104200 3.176312 +v 3.182565 8.104200 3.176312 +v 3.182565 8.104200 3.176312 +v 2.091865 7.391906 1.967708 +v 2.074286 7.365153 1.988159 +v 2.087965 7.338399 1.964918 +v 2.105544 7.365153 1.944467 +v 2.344481 7.301280 2.148437 +v 2.332762 7.283445 2.162071 +v 2.341881 7.265609 2.146577 +v 2.353601 7.283445 2.132943 +v 2.603046 7.317315 2.333421 +v 2.599017 7.308480 2.341548 +v 2.605408 7.299645 2.335112 +v 2.609437 7.308480 2.326984 +v 2.858050 7.387529 2.515859 +v 2.858050 7.387529 2.515859 +v 2.858050 7.387529 2.515859 +v 2.858050 7.387529 2.515859 +v 1.484517 7.500579 2.102874 +v 1.477071 7.491725 2.108022 +v 1.485695 7.482872 2.105269 +v 1.493141 7.491725 2.100121 +v 1.625574 7.539714 2.389758 +v 1.625574 7.539714 2.389758 +v 1.625574 7.539714 2.389758 +v 1.625574 7.539714 2.389758 +v -0.536332 6.641325 -0.725530 +v -0.361305 6.464845 -0.820019 +v -0.557359 6.288365 -0.853563 +v -0.732386 6.464845 -0.759075 +v -0.619729 6.849983 -1.233323 +v -0.469706 6.698714 -1.314313 +v -0.637752 6.547446 -1.343065 +v -0.787775 6.698714 -1.262075 +v -0.706528 6.969654 -1.761830 +v -0.583157 6.847816 -1.839355 +v -0.724843 6.725977 -1.873349 +v -0.848214 6.847816 -1.795823 +v -0.780107 7.248173 -2.209843 +v -0.684272 7.161039 -2.289287 +v -0.800482 7.073905 -2.333906 +v -0.896318 7.161039 -2.254462 +v -0.852424 7.553954 -2.650172 +v -0.782478 7.499134 -2.721512 +v -0.871567 7.444314 -2.766734 +v -0.941513 7.499134 -2.695394 +v -0.903589 7.990397 -2.961710 +v -0.858291 7.965486 -3.017384 +v -0.919016 7.940575 -3.055645 +v -0.964314 7.965486 -2.999971 +v -0.941250 8.491078 -3.191021 +v -0.918797 8.481274 -3.220051 +v -0.949355 8.471469 -3.240375 +v -0.971808 8.481274 -3.211345 +v -0.977179 9.002198 -3.409791 +v -0.977179 9.002198 -3.409791 +v -0.977179 9.002198 -3.409791 +v -0.977179 9.002198 -3.409791 +v -1.556515 6.538976 -2.119774 +v -1.551018 6.431727 -2.227271 +v -1.543578 6.324479 -2.119890 +v -1.549075 6.431727 -2.012393 +v -2.085602 6.343698 -2.114989 +v -2.081479 6.263261 -2.195612 +v -2.075899 6.182825 -2.115077 +v -2.080022 6.263261 -2.034453 +v -2.615505 6.418998 -2.110197 +v -2.628341 6.366715 -2.163805 +v -2.640204 6.314433 -2.109973 +v -2.627369 6.366715 -2.056365 +v -3.154730 6.544433 -2.105561 +v -3.168355 6.520375 -2.131611 +v -3.172111 6.493604 -2.104923 +v -3.158486 6.517662 -2.078873 +v -3.642843 6.716395 -1.902148 +v -3.642843 6.716395 -1.902148 +v -3.642843 6.716395 -1.902148 +v -3.642843 6.716395 -1.902148 +v -2.208732 6.993960 -1.486175 +v -2.265796 6.957268 -1.520372 +v -2.281014 6.920577 -1.455610 +v -2.223949 6.957268 -1.421413 +v -2.624077 7.327752 -1.310540 +v -2.652609 7.309406 -1.327638 +v -2.660218 7.291060 -1.295257 +v -2.631686 7.309406 -1.278159 +v -2.939116 7.763378 -1.177320 +v -2.939116 7.763378 -1.177320 +v -2.939116 7.763378 -1.177320 +v -2.939116 7.763378 -1.177320 +v -3.163399 6.545879 -2.105281 +v -3.186952 6.519019 -2.118196 +v -3.163442 6.492158 -2.105203 +v -3.139890 6.519019 -2.092288 +v -3.431953 6.519944 -1.617451 +v -3.431953 6.519944 -1.617451 +v -3.431953 6.519944 -1.617451 +v -3.431953 6.519944 -1.617451 +v -0.276667 8.391029 -0.618431 +v -0.321209 8.352678 -0.758550 +v -0.457973 8.314327 -0.704578 +v -0.413430 8.352678 -0.564459 +v -0.504112 8.838584 -0.726501 +v -0.541231 8.806624 -0.843266 +v -0.655201 8.774665 -0.798289 +v -0.618082 8.806624 -0.681523 +v -0.631499 9.316195 -0.787027 +v -0.664111 9.301667 -0.881826 +v -0.758204 9.287139 -0.847230 +v -0.725592 9.301667 -0.752431 +v -0.718264 9.808708 -0.828253 +v -0.743695 9.806639 -0.899814 +v -0.815238 9.804569 -0.874329 +v -0.789806 9.806639 -0.802768 +v -0.697920 10.313466 -0.818586 +v -0.714801 10.316239 -0.866259 +v -0.762423 10.319013 -0.849235 +v -0.745541 10.316239 -0.801562 +v -0.679102 10.824779 -0.809645 +v -0.687554 10.825981 -0.833487 +v -0.711377 10.827184 -0.824981 +v -0.702925 10.825981 -0.801139 +v -0.668154 11.336308 -0.804443 +v -0.668154 11.336308 -0.804443 +v -0.668154 11.336308 -0.804443 +v -0.668154 11.336308 -0.804443 +v -1.129636 9.536407 -0.123929 +v -1.184198 9.512265 -0.170963 +v -1.224807 9.488124 -0.111464 +v -1.170245 9.512265 -0.064430 +v -1.479326 9.913040 -0.078130 +v -1.515701 9.896946 -0.109486 +v -1.542774 9.880852 -0.069820 +v -1.506399 9.896946 -0.038464 +v -1.600557 10.397405 -0.062253 +v -1.620620 10.396580 -0.077685 +v -1.636031 10.395755 -0.057607 +v -1.615969 10.396580 -0.042174 +v -1.557074 10.904044 -0.067947 +v -1.557074 10.904044 -0.067947 +v -1.557074 10.904044 -0.067947 +v -1.557074 10.904044 -0.067947 +v -1.339763 10.521996 -0.074502 +v -1.354045 10.517038 -0.094818 +v -1.373777 10.512080 -0.079737 +v -1.359494 10.517038 -0.059421 +v -1.496660 11.008261 -0.098652 +v -1.496660 11.008261 -0.098652 +v -1.496660 11.008261 -0.098652 +v -1.496660 11.008261 -0.098652 +v 1.028403 8.520985 -0.392375 +v 1.003940 8.485620 -0.314869 +v 1.084676 8.450254 -0.305523 +v 1.109140 8.485620 -0.383029 +v 1.128492 8.761071 -0.237898 +v 1.107523 8.730759 -0.171464 +v 1.176726 8.700446 -0.163453 +v 1.197694 8.730759 -0.229887 +v 1.218838 8.998705 -0.098455 +v 1.204335 8.984408 -0.038508 +v 1.264975 8.970112 -0.027247 +v 1.279478 8.984408 -0.087194 +v 1.234830 9.286645 -0.073774 +v 1.224240 9.285719 -0.024253 +v 1.273765 9.284793 -0.013680 +v 1.284355 9.285719 -0.063202 +v 1.235822 9.589663 -0.072242 +v 1.227851 9.587805 -0.035147 +v 1.264964 9.585947 -0.027264 +v 1.272936 9.587805 -0.064359 +v 1.267198 9.885398 -0.023816 +v 1.261901 9.886009 0.000941 +v 1.286662 9.886621 0.006223 +v 1.291958 9.886009 -0.018534 +v 1.234563 10.179069 -0.074185 +v 1.231879 10.180190 -0.061862 +v 1.244223 10.181312 -0.059275 +v 1.246907 10.180190 -0.071599 +v 1.235983 10.482296 -0.071993 +v 1.235983 10.482296 -0.071993 +v 1.235983 10.482296 -0.071993 +v 1.235983 10.482296 -0.071993 +v 1.590415 9.015040 0.177823 +v 1.558559 8.981526 0.157151 +v 1.570403 8.948012 0.193233 +v 1.602259 8.981526 0.213905 +v 1.359983 9.099146 0.355255 +v 1.336091 9.074010 0.339750 +v 1.344974 9.048874 0.366812 +v 1.368866 9.074010 0.382316 +v 1.140382 9.209558 0.524346 +v 1.121945 9.194366 0.515942 +v 1.125358 9.179174 0.535914 +v 1.143795 9.194366 0.544319 +v 0.956050 9.396169 0.666041 +v 0.944586 9.391234 0.663908 +v 0.945364 9.384738 0.674749 +v 0.956829 9.389672 0.676882 +v 0.885045 9.645629 0.818319 +v 0.885045 9.645629 0.818319 +v 0.885045 9.645629 0.818319 +v 0.885045 9.645629 0.818319 +v 1.718159 9.460472 0.509322 +v 1.721603 9.447294 0.530672 +v 1.740148 9.434116 0.519547 +v 1.736704 9.447294 0.498197 +v 1.942944 9.635054 0.613847 +v 1.944666 9.628465 0.624523 +v 1.953938 9.621876 0.618960 +v 1.952216 9.628465 0.608285 +v 2.130365 9.854418 0.700999 +v 2.130365 9.854418 0.700999 +v 2.130365 9.854418 0.700999 +v 2.130365 9.854418 0.700999 +v 0.956250 9.397477 0.670053 +v 0.950155 9.390453 0.661458 +v 0.945165 9.383430 0.670737 +v 0.951259 9.390453 0.679331 +v 0.714125 9.577865 0.685009 +v 0.714125 9.577865 0.685009 +v 0.714125 9.577865 0.685009 +v 0.714125 9.577865 0.685009 +v 1.613177 7.458849 -2.775551 +v 1.635639 7.372895 -2.692583 +v 1.612669 7.286941 -2.775412 +v 1.590206 7.372895 -2.858380 +v 2.148275 7.429885 -2.922183 +v 2.166993 7.358256 -2.853042 +v 2.147851 7.286628 -2.922066 +v 2.129132 7.358256 -2.991207 +v 2.678503 7.426578 -3.067481 +v 2.698423 7.369489 -3.013524 +v 2.688055 7.312400 -3.070098 +v 2.668135 7.369489 -3.124055 +v 3.199457 7.494817 -3.210237 +v 3.223725 7.453978 -3.172325 +v 3.225277 7.413138 -3.217312 +v 3.201009 7.453978 -3.255224 +v 3.671907 7.734602 -3.339701 +v 3.694605 7.710624 -3.316213 +v 3.702158 7.686646 -3.347991 +v 3.679461 7.710624 -3.371479 +v 4.095342 8.069823 -3.455735 +v 4.107818 8.058686 -3.444300 +v 4.112722 8.047549 -3.460497 +v 4.100246 8.058686 -3.471932 +v 4.519386 8.408856 -3.571935 +v 4.519386 8.408856 -3.571935 +v 4.519386 8.408856 -3.571935 +v 4.519386 8.408856 -3.571935 +v 0.137700 7.374602 -3.192664 +v 0.108756 7.334821 -3.228355 +v 0.106818 7.295040 -3.182444 +v 0.135763 7.334821 -3.146753 +v -0.353659 7.575346 -3.030046 +v -0.372955 7.548825 -3.053840 +v -0.374247 7.522304 -3.023233 +v -0.354951 7.548825 -2.999439 +v -0.845697 7.766853 -2.867203 +v -0.857733 7.754927 -2.878310 +v -0.860767 7.743001 -2.862216 +v -0.848731 7.754927 -2.851110 +v -1.222645 8.150756 -2.742451 +v -1.222645 8.150756 -2.742451 +v -1.222645 8.150756 -2.742451 +v -1.222645 8.150756 -2.742451 +v -0.582378 8.172772 -3.115818 +v -0.599550 8.164849 -3.123084 +v -0.603597 8.156926 -3.104883 +v -0.586425 8.164849 -3.097616 +v -0.865879 8.627284 -2.969716 +v -0.865879 8.627284 -2.969716 +v -0.865879 8.627284 -2.969716 +v -0.865879 8.627284 -2.969716 +v 0.469981 8.664436 -2.085432 +v 0.519382 8.628643 -2.121576 +v 0.468525 8.592850 -2.155642 +v 0.419123 8.628643 -2.119497 +v 0.464938 8.918494 -2.328645 +v 0.507282 8.887815 -2.359625 +v 0.463690 8.857135 -2.388824 +v 0.421346 8.887815 -2.357843 +v 0.459454 9.141663 -2.593099 +v 0.494654 9.121043 -2.623118 +v 0.458240 9.100424 -2.651653 +v 0.423040 9.121043 -2.621634 +v 0.456717 9.454196 -2.725099 +v 0.484783 9.447922 -2.753643 +v 0.455558 9.441648 -2.780999 +v 0.427492 9.447922 -2.752455 +v 0.456137 9.799319 -2.753071 +v 0.477175 9.799304 -2.775000 +v 0.455246 9.799289 -2.796039 +v 0.434207 9.799304 -2.774109 +v 0.456420 10.152936 -2.739405 +v 0.470450 10.150717 -2.753852 +v 0.455833 10.148498 -2.767705 +v 0.441804 10.150717 -2.753258 +v 0.453626 10.480701 -2.874160 +v 0.460644 10.478839 -2.881223 +v 0.453339 10.476976 -2.887990 +v 0.446321 10.478839 -2.880926 +v 0.452353 10.826634 -2.935567 +v 0.452353 10.826634 -2.935567 +v 0.452353 10.826634 -2.935567 +v 0.452353 10.826634 -2.935567 +v 1.157924 9.370016 -2.364596 +v 1.179706 9.353208 -2.334850 +v 1.204275 9.336399 -2.362339 +v 1.182493 9.353208 -2.392085 +v 1.388200 9.636777 -2.353385 +v 1.404537 9.624170 -2.331076 +v 1.422964 9.611564 -2.351693 +v 1.406627 9.624170 -2.374002 +v 1.579643 9.927840 -2.344065 +v 1.592087 9.922172 -2.329116 +v 1.605925 9.916503 -2.342785 +v 1.593480 9.922172 -2.357734 +v 1.673528 10.264538 -2.339423 +v 1.680401 10.263749 -2.332023 +v 1.687541 10.261608 -2.338883 +v 1.680668 10.262397 -2.346283 +v 1.737723 10.604068 -2.405368 +v 1.737723 10.604068 -2.405368 +v 1.737723 10.604068 -2.405368 +v 1.737723 10.604068 -2.405368 +v 1.275365 10.046433 -2.288728 +v 1.292883 10.045140 -2.278633 +v 1.302907 10.043847 -2.296192 +v 1.285389 10.045140 -2.306288 +v 1.337908 10.393072 -2.305678 +v 1.346666 10.392426 -2.300631 +v 1.351678 10.391779 -2.309410 +v 1.342919 10.392426 -2.314457 +v 1.350312 10.744419 -2.309040 +v 1.350312 10.744419 -2.309040 +v 1.350312 10.744419 -2.309040 +v 1.350312 10.744419 -2.309040 +v 1.678013 10.266879 -2.333633 +v 1.687050 10.263073 -2.336177 +v 1.683056 10.259267 -2.344673 +v 1.674019 10.263073 -2.342129 +v 1.758244 10.561313 -2.509291 +v 1.758244 10.561313 -2.509291 +v 1.758244 10.561313 -2.509291 +v 1.758244 10.561313 -2.509291 +v 1.755687 8.579333 -1.104210 +v 1.873183 8.548559 -1.099288 +v 1.870047 8.517785 -1.216845 +v 1.752551 8.548559 -1.221767 +v 1.933835 8.986765 -1.279671 +v 2.031748 8.961120 -1.275569 +v 2.029135 8.935474 -1.373533 +v 1.931222 8.961120 -1.377635 +v 2.011819 9.423923 -1.356479 +v 2.092825 9.426148 -1.355833 +v 2.093410 9.428374 -1.436839 +v 2.012404 9.426148 -1.437485 +v 1.925505 9.877906 -1.271466 +v 1.986141 9.882025 -1.270866 +v 1.986462 9.886144 -1.331504 +v 1.925826 9.882025 -1.332105 +v 1.968462 10.355076 -1.313776 +v 2.008979 10.355404 -1.313467 +v 2.009286 10.355732 -1.353984 +v 1.968769 10.355404 -1.354293 +v 1.938100 10.828727 -1.283871 +v 1.958328 10.827603 -1.283686 +v 1.958450 10.826480 -1.303915 +v 1.938223 10.827603 -1.304100 +v 2.040976 11.285085 -1.385196 +v 2.040976 11.285085 -1.385196 +v 2.040976 11.285085 -1.385196 +v 2.040976 11.285085 -1.385196 +v 1.140953 9.611976 -1.839585 +v 1.186309 9.579112 -1.863185 +v 1.146078 9.546248 -1.894737 +v 1.100723 9.579112 -1.871137 +v 1.175986 9.900609 -2.216606 +v 1.206223 9.878699 -2.232339 +v 1.179403 9.856790 -2.253374 +v 1.149166 9.878699 -2.237641 +v 1.209866 10.202110 -2.581217 +v 1.225069 10.191995 -2.589992 +v 1.211743 10.181879 -2.601417 +v 1.196540 10.191995 -2.592642 +v 1.239699 10.550719 -2.902284 +v 1.239699 10.550719 -2.902284 +v 1.239699 10.550719 -2.902284 +v 1.239699 10.550719 -2.902284 +v 0.876808 10.473673 -1.841813 +v 0.876954 10.472403 -1.821594 +v 0.897173 10.471132 -1.821819 +v 0.897027 10.472403 -1.842039 +v 0.917075 10.946156 -1.802280 +v 0.917075 10.946156 -1.802280 +v 0.917075 10.946156 -1.802280 +v 0.917075 10.946156 -1.802280 +v 2.090300 8.740697 -0.115445 +v 2.071105 8.733698 -0.183347 +v 2.003395 8.726699 -0.163485 +v 2.022590 8.733698 -0.095583 +v 2.027442 9.064752 -0.150191 +v 2.010990 9.058752 -0.208393 +v 1.952953 9.052752 -0.191368 +v 1.969406 9.058752 -0.133167 +v 1.997164 9.385284 -0.166929 +v 1.983318 9.389032 -0.215505 +v 1.934819 9.392780 -0.201392 +v 1.948665 9.389032 -0.152816 +v 2.073888 9.698226 -0.124517 +v 2.063696 9.706322 -0.162889 +v 2.025781 9.714417 -0.151110 +v 2.035973 9.706322 -0.112738 +v 2.148447 10.021261 -0.083301 +v 2.140305 10.024879 -0.112356 +v 2.111371 10.028498 -0.103797 +v 2.119513 10.024879 -0.074742 +v 2.159279 10.358089 -0.077314 +v 2.153840 10.355746 -0.096689 +v 2.134541 10.353403 -0.090988 +v 2.139979 10.355746 -0.071613 +v 2.043264 10.665133 -0.141445 +v 2.040850 10.662648 -0.150964 +v 2.031505 10.660164 -0.147946 +v 2.033919 10.662648 -0.138427 +v 1.945840 10.977146 -0.195300 +v 1.945840 10.977146 -0.195300 +v 1.945840 10.977146 -0.195300 +v 1.945840 10.977146 -0.195300 +v 2.177366 9.653992 0.201983 +v 2.173865 9.639021 0.239473 +v 2.211436 9.624050 0.237002 +v 2.214937 9.639021 0.199513 +v 2.329728 9.904696 0.358586 +v 2.327103 9.893467 0.386703 +v 2.355281 9.882238 0.384850 +v 2.357907 9.893467 0.356733 +v 2.423821 10.202410 0.455297 +v 2.423105 10.198214 0.475105 +v 2.442924 10.194017 0.474932 +v 2.443640 10.198214 0.455125 +v 2.472154 10.524634 0.505026 +v 2.472070 10.524086 0.515141 +v 2.482101 10.522679 0.515149 +v 2.482186 10.523228 0.505034 +v 2.524934 10.851511 0.501335 +v 2.524934 10.851511 0.501335 +v 2.524934 10.851511 0.501335 +v 2.524934 10.851511 0.501335 +v 2.182521 10.296464 0.271694 +v 2.171844 10.293127 0.288586 +v 2.189026 10.289790 0.298788 +v 2.199703 10.293127 0.281897 +v 2.207651 10.610572 0.376359 +v 2.202312 10.608904 0.384805 +v 2.210903 10.607236 0.389906 +v 2.216242 10.608904 0.381460 +v 2.221721 10.936026 0.434964 +v 2.221721 10.936026 0.434964 +v 2.221721 10.936026 0.434964 +v 2.221721 10.936026 0.434964 +v 2.479354 10.526678 0.503987 +v 2.470399 10.523657 0.507632 +v 2.474901 10.520636 0.516189 +v 2.483857 10.523657 0.512543 +v 2.429203 10.824163 0.641425 +v 2.429203 10.824163 0.641425 +v 2.429203 10.824163 0.641425 +v 2.429203 10.824163 0.641425 +v 0.737849 9.372725 -0.500004 +v 0.765584 9.361624 -0.534434 +v 0.729473 9.350523 -0.559943 +v 0.701738 9.361624 -0.525513 +v 0.710483 9.673780 -0.695844 +v 0.733595 9.664530 -0.724537 +v 0.703503 9.655279 -0.745794 +v 0.680390 9.664530 -0.717102 +v 0.703194 10.018810 -0.748005 +v 0.721508 10.020190 -0.772217 +v 0.697259 10.021570 -0.790481 +v 0.678944 10.020190 -0.766269 +v 0.715414 10.362825 -0.660557 +v 0.729208 10.366649 -0.678294 +v 0.711080 10.370472 -0.691569 +v 0.697286 10.366649 -0.673833 +v 0.725262 10.715909 -0.590081 +v 0.734432 10.717477 -0.602095 +v 0.722320 10.719045 -0.611135 +v 0.713150 10.717477 -0.599121 +v 0.728458 11.074984 -0.567209 +v 0.733037 11.075360 -0.573260 +v 0.726975 11.075737 -0.577824 +v 0.722396 11.075360 -0.571773 +v 0.730765 11.433690 -0.550699 +v 0.730765 11.433690 -0.550699 +v 0.730765 11.433690 -0.550699 +v 0.730765 11.433690 -0.550699 +v -0.030898 10.039152 -0.800005 +v -0.046301 10.029504 -0.813757 +v -0.056359 10.019855 -0.795723 +v -0.040956 10.029504 -0.781971 +v -0.271077 10.303603 -0.759616 +v -0.281346 10.297171 -0.768785 +v -0.288052 10.290738 -0.756762 +v -0.277783 10.297171 -0.747594 +v -0.461234 10.604988 -0.727640 +v -0.466785 10.602432 -0.732154 +v -0.470554 10.599876 -0.726072 +v -0.465004 10.602432 -0.721558 +v -0.615828 10.927654 -0.701643 +v -0.615828 10.927654 -0.701643 +v -0.615828 10.927654 -0.701643 +v -0.615828 10.927654 -0.701643 +v -0.274640 10.694409 -0.771196 +v -0.281828 10.693636 -0.768859 +v -0.279415 10.692863 -0.761696 +v -0.272228 10.693636 -0.764033 +v -0.300229 11.048905 -0.720289 +v -0.300229 11.048905 -0.720289 +v -0.300229 11.048905 -0.720289 +v -0.300229 11.048905 -0.720289 +v 3.219303 8.207003 0.522815 +v 3.254799 8.173357 0.501926 +v 3.215554 8.139711 0.489430 +v 3.180058 8.173357 0.510319 +v 3.186977 8.370264 0.234963 +v 3.217402 8.341425 0.217058 +v 3.183764 8.312586 0.206347 +v 3.153339 8.341425 0.224252 +v 3.152473 8.493961 -0.072288 +v 3.177806 8.470022 -0.087392 +v 3.149754 8.446083 -0.096501 +v 3.124420 8.470022 -0.081397 +v 3.120945 8.658522 -0.353035 +v 3.140702 8.642492 -0.369655 +v 3.117751 8.626463 -0.381480 +v 3.097993 8.642492 -0.364859 +v 3.098258 8.912888 -0.555061 +v 3.112655 8.905855 -0.571270 +v 3.095021 8.898823 -0.583883 +v 3.080623 8.905855 -0.567673 +v 3.088814 9.229940 -0.639147 +v 3.098301 9.228717 -0.650954 +v 3.086432 9.227493 -0.660363 +v 3.076946 9.228717 -0.648556 +v 3.088849 9.561880 -0.638838 +v 3.093590 9.561485 -0.644762 +v 3.087653 9.561090 -0.649487 +v 3.082913 9.561485 -0.643563 +v 3.082192 9.889842 -0.698120 +v 3.082192 9.889842 -0.698120 +v 3.082192 9.889842 -0.698120 +v 3.082192 9.889842 -0.698120 +v 3.890648 8.439417 1.180344 +v 3.866032 8.421691 1.182180 +v 3.880298 8.403965 1.202325 +v 3.904914 8.421691 1.200488 +v 3.758495 8.563079 1.461001 +v 3.740032 8.549785 1.462378 +v 3.750732 8.536490 1.477487 +v 3.769194 8.549785 1.476110 +v 3.659902 8.797234 1.670385 +v 3.646780 8.790044 1.673031 +v 3.653100 8.782854 1.684831 +v 3.666221 8.790044 1.682185 +v 3.566753 9.047389 1.868145 +v 3.559954 9.044630 1.870115 +v 3.563139 9.040944 1.875945 +v 3.569938 9.043703 1.873975 +v 3.555562 9.315310 2.064813 +v 3.555562 9.315310 2.064813 +v 3.555562 9.315310 2.064813 +v 3.555562 9.315310 2.064813 +v 3.983678 8.978368 1.540486 +v 3.971164 8.972855 1.547112 +v 3.979610 8.967341 1.558477 +v 3.992124 8.972855 1.551851 +v 3.945160 9.261699 1.710855 +v 3.938903 9.258943 1.714168 +v 3.943126 9.256186 1.719851 +v 3.949383 9.258943 1.716538 +v 3.906332 9.544190 1.882596 +v 3.906332 9.544190 1.882596 +v 3.906332 9.544190 1.882596 +v 3.906332 9.544190 1.882596 +v 3.568958 9.047722 1.872397 +v 3.565416 9.044167 1.866693 +v 3.560935 9.040611 1.871693 +v 3.564477 9.044167 1.877396 +v 3.345511 9.293653 1.852792 +v 3.345511 9.293653 1.852792 +v 3.345511 9.293653 1.852792 +v 3.345511 9.293653 1.852792 +v 0.293090 9.412202 0.200420 +v 0.254312 9.398012 0.181111 +v 0.239275 9.383822 0.221736 +v 0.278053 9.398012 0.241046 +v 0.120206 9.707664 0.268901 +v 0.087891 9.695839 0.252810 +v 0.075360 9.684013 0.286665 +v 0.107675 9.695839 0.302756 +v 0.001538 10.025928 0.315906 +v -0.025909 10.021418 0.303665 +v -0.037529 10.016908 0.331381 +v -0.010081 10.021418 0.343622 +v -0.021702 10.368191 0.325112 +v -0.042577 10.369421 0.316046 +v -0.051582 10.370651 0.336947 +v -0.030707 10.369421 0.346013 +v 0.041007 10.709604 0.300272 +v 0.027083 10.710316 0.294231 +v 0.021072 10.711027 0.308168 +v 0.034996 10.710316 0.314209 +v 0.010837 11.057919 0.312223 +v 0.003865 11.057842 0.309206 +v 0.000849 11.057766 0.316179 +v 0.007821 11.057842 0.319195 +v 0.021892 11.405996 0.307844 +v 0.021892 11.405996 0.307844 +v 0.021892 11.405996 0.307844 +v 0.021892 11.405996 0.307844 +v -0.379023 10.068360 0.678163 +v -0.386026 10.055011 0.661068 +v -0.396949 10.041661 0.675968 +v -0.389945 10.055011 0.693062 +v -0.694990 10.212516 0.639462 +v -0.699659 10.203616 0.628065 +v -0.706940 10.194716 0.637998 +v -0.702271 10.203616 0.649395 +v -0.949863 10.443878 0.608243 +v -0.953699 10.440978 0.602361 +v -0.958840 10.438078 0.607144 +v -0.955005 10.440978 0.613026 +v -1.062781 10.772000 0.594413 +v -1.062781 10.772000 0.594413 +v -1.062781 10.772000 0.594413 +v -1.062781 10.772000 0.594413 +v -0.465646 10.711315 0.865679 +v -0.473112 10.710425 0.864586 +v -0.474100 10.709536 0.872066 +v -0.466635 10.710425 0.873159 +v -0.515959 11.054188 0.903694 +v -0.515959 11.054188 0.903694 +v -0.515959 11.054188 0.903694 +v -0.515959 11.054188 0.903694 +v 0.082164 9.300700 0.179967 +v 0.098368 9.284989 0.152624 +v 0.067895 9.269279 0.143592 +v 0.051691 9.284989 0.170935 +v 0.000092 9.553864 -0.029254 +v 0.013981 9.540398 -0.052691 +v -0.012139 9.526932 -0.060433 +v -0.026028 9.540398 -0.036996 +v -0.074059 9.820910 -0.218280 +v -0.063058 9.811987 -0.239273 +v -0.085398 9.803064 -0.247188 +v -0.096399 9.811987 -0.226194 +v -0.123184 10.125957 -0.343513 +v -0.114975 10.123110 -0.361815 +v -0.133439 10.120262 -0.369653 +v -0.141648 10.123110 -0.351351 +v -0.123997 10.463672 -0.345585 +v -0.117836 10.461480 -0.359301 +v -0.131680 10.459289 -0.365169 +v -0.137841 10.461480 -0.351454 +v -0.175156 10.773583 -0.475991 +v -0.170952 10.771182 -0.484889 +v -0.180084 10.768781 -0.488556 +v -0.184288 10.771182 -0.479658 +v -0.209210 11.098294 -0.562797 +v -0.207140 11.097377 -0.567328 +v -0.211738 11.096459 -0.569243 +v -0.213808 11.097377 -0.564712 +v -0.240960 11.425291 -0.643731 +v -0.240960 11.425291 -0.643731 +v -0.240960 11.425291 -0.643731 +v -0.240960 11.425291 -0.643731 +v 0.469610 9.873804 -0.551696 +v 0.484222 9.862062 -0.544010 +v 0.483460 9.850319 -0.560503 +v 0.468848 9.862062 -0.568188 +v 0.737637 9.992987 -0.722120 +v 0.748595 9.984179 -0.716355 +v 0.748024 9.975372 -0.728724 +v 0.737065 9.984179 -0.734489 +v 0.926130 10.242570 -0.841972 +v 0.934975 10.238548 -0.839108 +v 0.936134 10.234527 -0.848333 +v 0.927289 10.238548 -0.851197 +v 1.058098 10.540694 -0.925881 +v 1.062963 10.539882 -0.924733 +v 1.063980 10.539054 -0.929625 +v 1.059115 10.539866 -0.930774 +v 1.057361 10.878226 -0.927126 +v 1.057361 10.878226 -0.927126 +v 1.057361 10.878226 -0.927126 +v 1.057361 10.878226 -0.927126 +v 0.475785 10.516756 -0.705112 +v 0.485863 10.515800 -0.704749 +v 0.486135 10.514843 -0.714830 +v 0.476057 10.515800 -0.715193 +v 0.530722 10.846943 -0.756691 +v 0.535761 10.846465 -0.756510 +v 0.535898 10.845987 -0.761550 +v 0.530859 10.846465 -0.761732 +v 0.546614 11.184345 -0.771611 +v 0.546614 11.184345 -0.771611 +v 0.546614 11.184345 -0.771611 +v 0.546614 11.184345 -0.771611 +v 1.060134 10.542244 -0.925225 +v 1.064411 10.539874 -0.926546 +v 1.061944 10.537504 -0.930281 +v 1.057667 10.539874 -0.928960 +v 1.136512 10.793577 -1.138549 +v 1.136512 10.793577 -1.138549 +v 1.136512 10.793577 -1.138549 +v 1.136512 10.793577 -1.138549 +v -1.060618 9.349521 0.839770 +v -1.086349 9.334128 0.834819 +v -1.082117 9.318736 0.860678 +v -1.056386 9.334128 0.865629 +v -1.225165 9.540940 0.999788 +v -1.246608 9.528113 0.995662 +v -1.243081 9.515286 1.017211 +v -1.221639 9.528113 1.021338 +v -1.369816 9.759637 1.140458 +v -1.387392 9.749984 1.137567 +v -1.384993 9.740331 1.155217 +v -1.367417 9.749984 1.158108 +v -1.516620 9.976130 1.283221 +v -1.530111 9.969394 1.281353 +v -1.528621 9.962657 1.294891 +v -1.515130 9.969394 1.296759 +v -1.640628 10.217302 1.403816 +v -1.650239 10.214167 1.403170 +v -1.649862 10.211031 1.412795 +v -1.640252 10.214167 1.413440 +v -1.705305 10.500752 1.466712 +v -1.710269 10.499761 1.466543 +v -1.710239 10.498769 1.471510 +v -1.705275 10.499761 1.471678 +v -1.763811 10.787963 1.523607 +v -1.763811 10.787963 1.523607 +v -1.763811 10.787963 1.523607 +v -1.763811 10.787963 1.523607 +v -1.535122 9.691476 0.183936 +v -1.523843 9.681565 0.186273 +v -1.530622 9.671655 0.176960 +v -1.541901 9.681565 0.174623 +v -1.374451 9.734500 -0.065118 +v -1.366932 9.727893 -0.063560 +v -1.371451 9.721286 -0.069768 +v -1.378970 9.727893 -0.071326 +v -1.244273 9.908098 -0.266905 +v -1.239858 9.905628 -0.267142 +v -1.241461 9.903158 -0.271263 +v -1.245877 9.905628 -0.271025 +v -1.152973 10.153969 -0.408428 +v -1.152973 10.153969 -0.408428 +v -1.152973 10.153969 -0.408428 +v -1.152973 10.153969 -0.408428 +v -1.895065 10.116889 0.332035 +v -1.899369 10.114243 0.332393 +v -1.897421 10.111596 0.336247 +v -1.893117 10.114243 0.335889 +v -2.003948 10.315444 0.526725 +v -2.003948 10.315444 0.526725 +v -2.003948 10.315444 0.526725 +v -2.003948 10.315444 0.526725 +v 1.330240 9.169027 -0.967000 +v 1.359177 9.149070 -0.962375 +v 1.349854 9.129112 -0.990156 +v 1.320917 9.149070 -0.994782 +v 1.479111 9.375711 -1.142759 +v 1.503914 9.358605 -1.138794 +v 1.495923 9.341499 -1.162606 +v 1.471120 9.358605 -1.166571 +v 1.649871 9.535957 -1.344359 +v 1.671115 9.522425 -1.341734 +v 1.665030 9.508892 -1.362257 +v 1.643786 9.522425 -1.364882 +v 1.778362 9.766452 -1.496058 +v 1.797347 9.759385 -1.496307 +v 1.794470 9.752318 -1.515075 +v 1.775484 9.759385 -1.514825 +v 1.844759 10.053540 -1.574447 +v 1.859853 10.052261 -1.575643 +v 1.858549 10.050982 -1.590728 +v 1.843456 10.052261 -1.589532 +v 1.828390 10.360598 -1.555121 +v 1.838485 10.360699 -1.555957 +v 1.837648 10.360800 -1.566052 +v 1.827553 10.360699 -1.565216 +v 1.843722 10.669982 -1.573222 +v 1.848767 10.669826 -1.573638 +v 1.848347 10.669669 -1.578683 +v 1.843302 10.669826 -1.578267 +v 1.850514 10.979530 -1.581241 +v 1.850514 10.979530 -1.581241 +v 1.850514 10.979530 -1.581241 +v 1.850514 10.979530 -1.581241 +v 2.159394 9.398507 -0.636294 +v 2.147189 9.384189 -0.628779 +v 2.158903 9.369870 -0.637038 +v 2.171107 9.384189 -0.644554 +v 2.328664 9.357823 -0.379648 +v 2.319511 9.347084 -0.374012 +v 2.328296 9.336345 -0.380206 +v 2.337449 9.347084 -0.385843 +v 2.498522 9.372134 -0.122111 +v 2.492775 9.364984 -0.117815 +v 2.498987 9.357833 -0.121406 +v 2.504734 9.364984 -0.125702 +v 2.668625 9.387053 0.135442 +v 2.665456 9.383324 0.136745 +v 2.669386 9.380179 0.137306 +v 2.672556 9.383909 0.136003 +v 2.540383 9.508130 0.389193 +v 2.540383 9.508130 0.389193 +v 2.540383 9.508130 0.389193 +v 2.540383 9.508130 0.389193 +v 2.072506 9.625596 -0.092564 +v 2.067879 9.620390 -0.085209 +v 2.076406 9.615184 -0.083530 +v 2.081033 9.620390 -0.090885 +v 2.171505 9.809452 0.136827 +v 2.169191 9.806849 0.140505 +v 2.173454 9.804247 0.141344 +v 2.175768 9.806849 0.137667 +v 2.251782 10.043303 0.322841 +v 2.251782 10.043303 0.322841 +v 2.251782 10.043303 0.322841 +v 2.251782 10.043303 0.322841 +v 2.670309 9.386873 0.137098 +v 2.667266 9.383616 0.139504 +v 2.667703 9.380360 0.135650 +v 2.670745 9.383616 0.133243 +v 2.915206 9.254670 0.273207 +v 2.915206 9.254670 0.273207 +v 2.915206 9.254670 0.273207 +v 2.915206 9.254670 0.273207 +v 3.572619 8.744750 -0.181974 +v 3.569911 8.726005 -0.158208 +v 3.590329 8.707259 -0.170667 +v 3.593037 8.726005 -0.194433 +v 3.843965 8.849008 -0.008740 +v 3.841708 8.833386 0.011065 +v 3.858723 8.817765 0.000682 +v 3.860980 8.833386 -0.019122 +v 4.059721 9.058984 0.129004 +v 4.061701 9.050436 0.147265 +v 4.079100 9.041888 0.141376 +v 4.077119 9.050436 0.123115 +v 4.173482 9.364929 0.201632 +v 4.176025 9.360699 0.216003 +v 4.190131 9.356468 0.212261 +v 4.187588 9.360699 0.197890 +v 4.287796 9.673479 0.274613 +v 4.289691 9.671296 0.284321 +v 4.299296 9.669113 0.281955 +v 4.297400 9.671296 0.272246 +v 4.351613 10.001936 0.315355 +v 4.352631 10.001153 0.320254 +v 4.357503 10.000370 0.319116 +v 4.356485 10.001153 0.314217 +v 4.418037 10.330354 0.357762 +v 4.418037 10.330354 0.357762 +v 4.418037 10.330354 0.357762 +v 4.418037 10.330354 0.357762 +v 3.511603 9.058545 -1.100678 +v 3.522406 9.048116 -1.098352 +v 3.513839 9.037686 -1.105332 +v 3.503036 9.048116 -1.107658 +v 3.655736 9.117075 -1.400675 +v 3.662938 9.110122 -1.399124 +v 3.657227 9.103168 -1.403777 +v 3.650025 9.110122 -1.405328 +v 3.795455 9.213279 -1.691481 +v 3.799401 9.210104 -1.691424 +v 3.796890 9.206929 -1.694470 +v 3.792944 9.210104 -1.694527 +v 3.911547 9.417629 -1.933115 +v 3.911547 9.417629 -1.933115 +v 3.911547 9.417629 -1.933115 +v 3.911547 9.417629 -1.933115 +v 3.781848 9.595761 -1.376323 +v 3.783757 9.594165 -1.380735 +v 3.779162 9.592568 -1.382146 +v 3.777253 9.594165 -1.377735 +v 3.717467 9.896475 -1.515909 +v 3.717467 9.896475 -1.515909 +v 3.717467 9.896475 -1.515909 +v 3.717467 9.896475 -1.515909 +v 0.171890 9.272048 -0.052008 +v 0.139521 9.259621 -0.044606 +v 0.151384 9.247193 -0.013592 +v 0.183754 9.259621 -0.020994 +v 0.085876 9.578842 0.109129 +v 0.058131 9.568191 0.115474 +v 0.068299 9.557539 0.142057 +v 0.096045 9.568191 0.135712 +v 0.002444 9.888045 0.265429 +v -0.020819 9.879718 0.270982 +v -0.012487 9.871390 0.293400 +v 0.010776 9.879718 0.287847 +v -0.072920 10.205236 0.406615 +v -0.091852 10.200076 0.411659 +v -0.085507 10.194916 0.430194 +v -0.066576 10.200076 0.425151 +v -0.120626 10.544279 0.495985 +v -0.135137 10.543186 0.500355 +v -0.130692 10.542093 0.514844 +v -0.116180 10.543186 0.510474 +v -0.109526 10.899957 0.475191 +v -0.119197 10.899158 0.478097 +v -0.116230 10.898358 0.487750 +v -0.106559 10.899158 0.484843 +v -0.160846 11.240652 0.571333 +v -0.165681 11.240242 0.572786 +v -0.164197 11.239832 0.577611 +v -0.159362 11.240242 0.576159 +v -0.150684 11.596360 0.552297 +v -0.150684 11.596360 0.552297 +v -0.150684 11.596360 0.552297 +v -0.150684 11.596360 0.552297 +v -0.506285 10.046764 0.217396 +v -0.519225 10.040720 0.203027 +v -0.532261 10.034676 0.217308 +v -0.519321 10.040720 0.231678 +v -0.734744 10.322257 0.216624 +v -0.744449 10.317724 0.205847 +v -0.754226 10.313191 0.216558 +v -0.744521 10.317724 0.227335 +v -0.804315 10.669603 0.216389 +v -0.811353 10.668406 0.209202 +v -0.818439 10.667208 0.216341 +v -0.811401 10.668406 0.223528 +v -0.860264 11.021862 0.216196 +v -0.863831 11.021633 0.212607 +v -0.867397 11.021210 0.216179 +v -0.863830 11.021439 0.219768 +v -0.876373 11.377794 0.235558 +v -0.876373 11.377794 0.235558 +v -0.876373 11.377794 0.235558 +v -0.876373 11.377794 0.235558 +v -0.886387 10.652804 0.185212 +v -0.893323 10.647317 0.180272 +v -0.894935 10.641829 0.188633 +v -0.888000 10.647317 0.193572 +v -1.156268 10.860498 0.293219 +v -1.159735 10.857755 0.290749 +v -1.160542 10.855011 0.294929 +v -1.157074 10.857755 0.297399 +v -1.397348 11.105169 0.389700 +v -1.397348 11.105169 0.389700 +v -1.397348 11.105169 0.389700 +v -1.397348 11.105169 0.389700 +v -0.860960 11.023273 0.217439 +v -0.862399 11.021536 0.212905 +v -0.866701 11.019798 0.214936 +v -0.865262 11.021536 0.219470 +v -1.022594 11.333711 0.146952 +v -1.022594 11.333711 0.146952 +v -1.022594 11.333711 0.146952 +v -1.022594 11.333711 0.146952 +vn -0.715323 0.144322 -0.683706 +vn -0.747398 0.209876 -0.630299 +vn 0.696432 0.145238 -0.702719 +vn -0.641804 0.006592 0.766808 +vn -0.680715 0.077944 0.728355 +vn 0.763054 0.017151 0.646077 +vn 0.721091 -0.054994 0.690603 +vn 0.647603 0.086001 -0.757073 +vn -0.708365 0.288339 -0.644246 +vn 0.668355 0.005982 -0.743797 +vn -0.640828 0.148106 0.753227 +vn 0.739341 -0.135105 0.659597 +vn -0.711783 0.224311 -0.665578 +vn 0.695791 0.036348 -0.717277 +vn -0.621815 0.110111 0.775353 +vn 0.756157 -0.068087 0.650807 +vn -0.744316 0.089022 -0.661824 +vn -0.643727 0.078951 0.761132 +vn 0.745262 0.067629 0.663320 +vn 0.681600 0.077364 -0.727592 +vn -0.749168 0.047731 -0.660604 +vn -0.669362 0.091494 0.737236 +vn 0.739769 0.110324 0.663717 +vn 0.656087 0.066286 -0.751732 +vn -0.775170 0.061434 -0.628742 +vn -0.648091 0.226386 0.727103 +vn 0.711966 0.112552 0.693106 +vn 0.669881 -0.069338 -0.739189 +vn -0.710379 0.041536 -0.702567 +vn 0.658467 -0.121036 -0.742790 +vn -0.649190 0.274636 0.709281 +vn 0.778069 0.097598 0.620502 +vn -0.991424 0.122562 0.044984 +vn -0.050050 -0.034455 -0.998138 +vn 0.062777 0.144810 0.987457 +vn 0.997925 -0.012391 -0.063082 +vn -0.094668 0.233436 0.967742 +vn -0.043580 0.265297 0.963164 +vn -0.985046 0.131474 -0.111148 +vn 0.998505 0.018097 0.051241 +vn 0.994385 0.077090 0.072329 +vn 0.047121 -0.074648 -0.996094 +vn 0.097018 -0.110752 -0.989074 +vn -0.994049 0.083407 -0.069918 +vn -0.069399 0.355174 0.932188 +vn -0.998596 0.014618 -0.050386 +vn 0.986633 0.152287 0.057466 +vn 0.073794 -0.202338 -0.976501 +vn -0.058687 0.388592 0.919523 +vn -0.995392 -0.063875 -0.071261 +vn 0.978912 0.204230 -0.003296 +vn 0.088809 -0.233955 -0.968169 +vn -0.079379 0.406140 0.910337 +vn 0.955077 0.296243 -0.002106 +vn 0.077212 -0.255287 -0.963775 +vn -0.990539 -0.136876 -0.008667 +vn -0.107364 0.455184 0.883877 +vn -0.983062 -0.182440 -0.016968 +vn 0.944762 0.325297 -0.039277 +vn 0.074160 -0.313913 -0.946532 +vn -0.163884 0.511307 0.843593 +vn -0.996124 -0.074099 -0.047304 +vn 0.970031 0.241035 0.029939 +vn 0.039125 -0.388958 -0.920408 +vn 0.621418 0.447798 0.642842 +vn -0.780847 0.373943 0.500412 +vn 0.779260 -0.280740 -0.560259 +vn -0.632221 -0.347301 -0.692557 +vn 0.172826 0.190680 -0.966308 +vn 0.173833 0.158238 -0.971954 +vn 0.982604 0.080294 0.167272 +vn -0.979675 0.080294 -0.183691 +vn -0.984985 0.077364 -0.154210 +vn -0.175939 -0.034059 0.983795 +vn -0.176061 -0.001038 0.984375 +vn 0.977355 0.077395 0.196783 +vn 0.173772 0.156590 -0.972228 +vn 0.982879 0.079653 0.166082 +vn -0.979492 0.080020 -0.184881 +vn -0.176122 0.000519 0.984344 +vn 0.172521 0.196631 -0.965148 +vn -0.982635 0.078127 -0.168279 +vn -0.175817 -0.039796 0.983612 +vn 0.979888 0.079073 0.183020 +vn 0.169836 0.268563 -0.948149 +vn 0.983734 0.083285 0.159093 +vn -0.977874 0.084048 -0.191473 +vn -0.174749 -0.113559 0.978027 +vn 0.189703 0.378002 -0.906125 +vn -0.981780 -0.000610 -0.189856 +vn -0.133580 -0.221229 0.966002 +vn 0.965941 0.161260 0.202307 +vn 0.137516 0.391003 -0.910031 +vn 0.940825 0.229408 0.249306 +vn -0.978271 -0.088137 -0.187536 +vn -0.181005 -0.245216 0.952391 +vn -0.577532 0.157964 -0.800928 +vn 0.785974 0.369030 -0.495987 +vn -0.808405 -0.263833 0.526139 +vn 0.552660 -0.053468 0.831660 +vn -0.917234 0.334391 -0.216468 +vn -0.848109 0.386273 -0.362560 +vn 0.306040 0.074587 -0.949065 +vn -0.199469 0.238197 0.950499 +vn -0.322153 0.092776 0.942106 +vn 0.912839 -0.151982 0.378948 +vn 0.944945 -0.240211 0.222083 +vn 0.314371 -0.109195 -0.942991 +vn -0.836299 0.483779 -0.257942 +vn -0.361675 -0.106693 0.926145 +vn 0.892148 -0.341990 0.295083 +vn 0.387005 0.256813 -0.885556 +vn -0.857418 0.474960 -0.197943 +vn -0.289621 -0.006653 0.957091 +vn 0.873287 -0.339335 0.349559 +vn 0.381359 0.135563 -0.914396 +vn -0.865963 0.411115 -0.284646 +vn 0.322123 0.009156 -0.946623 +vn -0.244026 0.127689 0.961303 +vn 0.920499 -0.264718 0.287301 +vn -0.876797 0.388409 -0.283425 +vn -0.262001 0.131626 0.956023 +vn 0.926511 -0.238899 0.290628 +vn 0.306375 0.019776 -0.951689 +vn -0.819910 0.320231 0.474502 +vn -0.418104 0.239357 -0.876278 +vn 0.453780 -0.133610 0.881008 +vn 0.855922 -0.214576 -0.470443 +vn -0.910123 0.411664 -0.046266 +vn -0.914823 0.389813 -0.105289 +vn 0.114170 0.069124 -0.991028 +vn -0.043733 0.140538 0.989105 +vn -0.045412 0.073733 0.996216 +vn 0.959777 -0.259346 0.107364 +vn 0.969390 -0.240425 0.049562 +vn 0.075503 0.015107 -0.997009 +vn -0.930784 0.358501 -0.071291 +vn -0.073946 0.013153 0.997162 +vn 0.974425 -0.207404 0.086428 +vn 0.126072 0.135289 -0.982727 +vn -0.899197 0.431837 -0.070376 +vn -0.116550 0.011200 0.993103 +vn 0.956389 -0.283517 0.070132 +vn 0.095462 0.165441 -0.981567 +vn -0.873287 0.479659 -0.085269 +vn 0.192999 0.237068 -0.952116 +vn -0.093631 -0.113285 0.989135 +vn 0.944853 -0.324625 0.042848 +vn -0.764000 0.121647 0.633595 +vn -0.508530 0.484634 -0.711661 +vn 0.552873 -0.385235 0.738853 +vn 0.798059 -0.020508 -0.602191 +vn -0.696951 0.346385 0.627888 +vn -0.712058 0.285745 0.641285 +vn -0.633198 0.070925 -0.770714 +vn 0.658437 0.085086 0.747795 +vn 0.700888 0.070650 0.709738 +vn 0.728690 -0.194891 -0.656484 +vn 0.736534 -0.131993 -0.663381 +vn -0.675253 0.085086 -0.732627 +vn -0.710166 0.197058 0.675832 +vn 0.684622 0.136326 0.715995 +vn 0.756005 -0.036866 -0.653493 +vn -0.661458 0.018220 -0.749718 +vn -0.745689 0.242470 0.620594 +vn -0.688833 0.035920 -0.724021 +vn 0.652242 0.131413 0.746483 +vn 0.710807 -0.090060 -0.697562 +vn -0.716514 0.233467 0.657308 +vn -0.622211 0.094272 -0.777123 +vn 0.705039 0.048494 0.707480 +vn 0.745659 -0.078036 -0.661733 +vn -0.047792 0.091098 0.994690 +vn -0.992981 0.103427 -0.057161 +vn 0.998840 0.007477 0.047182 +vn 0.061892 0.019776 -0.997864 +vn -0.157384 0.417341 0.894986 +vn -0.160741 0.368572 0.915586 +vn -0.973388 0.067812 -0.218787 +vn 0.981506 0.083743 0.172002 +vn 0.989593 0.068606 0.126286 +vn 0.166784 -0.269478 -0.948424 +vn 0.169164 -0.217566 -0.961241 +vn -0.981292 0.083743 -0.173162 +vn -0.168371 0.221992 0.960387 +vn -0.971129 0.072207 -0.227302 +vn 0.990417 0.071169 0.118076 +vn 0.173040 -0.065889 -0.982696 +vn -0.196600 0.169836 0.965636 +vn 0.980224 0.014771 0.197272 +vn 0.148350 -0.008667 -0.988891 +vn -0.975372 0.146397 -0.164830 +vn 0.573687 0.058504 0.816950 +vn -0.797082 0.251228 0.549089 +vn 0.814112 -0.142094 -0.563005 +vn -0.563402 0.052828 -0.824458 +vn -0.737480 0.401532 0.543016 +vn -0.722312 0.441389 0.532365 +vn -0.552660 0.066958 -0.830683 +vn 0.629170 0.066958 0.774346 +vn 0.599353 0.081851 0.796258 +vn 0.779107 -0.252663 -0.573687 +vn 0.769677 -0.294137 -0.566576 +vn -0.582659 0.080538 -0.808679 +vn -0.741447 0.451491 0.496323 +vn -0.516190 0.160588 -0.841273 +vn 0.600604 -0.029267 0.798975 +vn 0.745628 -0.297189 -0.596362 +vn -0.734581 0.389935 0.555223 +vn 0.556749 -0.115604 0.822565 +vn 0.797510 -0.245705 -0.550981 +vn -0.485946 0.256142 -0.835597 +vn -0.154973 0.139775 0.977966 +vn -0.900052 0.388958 -0.196448 +vn 0.938994 -0.284341 0.193396 +vn 0.195990 -0.035859 -0.979919 +vn -0.896298 0.217322 -0.386517 +vn -0.912442 0.112125 -0.393475 +vn 0.442274 0.077029 -0.893551 +vn -0.435255 0.085910 0.896176 +vn -0.346263 0.077029 0.934965 +vn 0.916471 -0.062075 0.395215 +vn 0.917325 0.044740 0.395581 +vn 0.352977 0.085879 -0.931669 +vn -0.917722 0.033601 -0.395764 +vn -0.413526 0.078005 0.907102 +vn 0.911161 0.123783 0.392926 +vn 0.375835 0.078005 -0.923368 +vn -0.928831 0.051515 0.366832 +vn -0.370708 0.051515 -0.927305 +vn 0.367321 0.060121 0.928129 +vn 0.927091 0.060121 -0.369884 +vn -0.791131 0.597888 -0.128727 +vn -0.836238 0.531144 -0.136143 +vn 0.228919 0.052431 -0.972015 +vn -0.154241 0.089480 0.983947 +vn -0.090976 0.052370 0.994446 +vn 0.873836 -0.464919 0.142186 +vn 0.908109 -0.391705 0.147801 +vn 0.165685 0.089480 -0.982086 +vn -0.893399 0.433271 -0.118748 +vn -0.097079 0.122196 0.987732 +vn 0.943358 -0.283242 0.172613 +vn 0.176214 0.016449 -0.984191 +vn -0.716514 0.366192 0.593677 +vn -0.557848 0.209235 -0.803095 +vn 0.594440 -0.104038 0.797357 +vn 0.759087 -0.262764 -0.595538 +vn 0.717551 0.120640 -0.685934 +vn 0.727287 0.107456 -0.677847 +vn 0.688070 0.064760 0.722709 +vn -0.681265 0.093356 -0.726035 +vn -0.690542 0.079348 -0.718894 +vn -0.730796 0.037080 0.681539 +vn -0.721763 0.050233 0.690268 +vn 0.678396 0.078005 0.730522 +vn 0.729545 0.135289 -0.670400 +vn 0.688894 0.135289 0.712088 +vn -0.673299 0.024201 -0.738945 +vn -0.715720 0.024171 0.697928 +vn 0.024842 0.055971 -0.998108 +vn 0.980071 0.196417 0.028871 +vn -0.995849 -0.086032 -0.029328 +vn -0.033906 0.055574 0.997864 +vn -0.319102 0.303842 -0.897671 +vn -0.344371 0.203711 -0.916440 +vn 0.922422 0.108524 -0.370556 +vn -0.949614 0.069735 0.305490 +vn -0.915983 0.071596 0.394757 +vn 0.347240 -0.150761 0.925565 +vn 0.334361 -0.047609 0.941221 +vn 0.955382 0.072848 -0.286142 +vn -0.904996 0.080142 -0.417798 +vn 0.422163 0.052126 -0.904996 +vn -0.413251 0.058901 0.908689 +vn 0.903348 0.031343 0.427717 +vn 0.492050 0.284707 -0.822687 +vn 0.489914 0.298196 -0.819147 +vn 0.849818 0.078341 0.521195 +vn -0.867641 0.075594 -0.491348 +vn -0.861202 0.078341 -0.502152 +vn -0.508896 -0.130436 0.850856 +vn -0.507889 -0.144414 0.849208 +vn 0.843349 0.075594 0.531999 +vn -0.259987 0.221534 -0.939848 +vn 0.951018 0.221534 -0.215522 +vn -0.964904 -0.112796 0.237098 +vn 0.247505 -0.112796 0.962279 +vn -0.618824 0.049043 0.783959 +vn -0.612262 0.153386 0.775628 +vn -0.748527 0.080355 -0.658162 +vn 0.813990 0.080355 0.575243 +vn 0.755120 0.082369 0.650349 +vn 0.615986 0.107669 -0.780328 +vn 0.619587 0.003479 -0.784906 +vn -0.807917 0.082369 -0.583483 +vn 0.123692 0.187567 0.974425 +vn -0.976501 0.187567 0.105899 +vn 0.990509 -0.076998 -0.113804 +vn -0.119266 -0.076998 -0.989837 +vn -0.833949 0.551530 0.017335 +vn -0.796472 0.590411 -0.130314 +vn 0.086764 0.075014 -0.993378 +vn 0.082125 0.197882 0.976775 +vn -0.053041 0.088656 0.994629 +vn 0.911283 -0.389447 0.133610 +vn 0.889492 -0.456587 -0.017273 +vn 0.048341 -0.093387 -0.994446 +vn -0.659169 0.356578 0.662038 +vn -0.419263 0.551408 -0.721183 +vn 0.486770 -0.465773 0.738945 +vn 0.712943 -0.257759 -0.652089 +vn 0.427168 0.084902 0.900174 +vn 0.425123 0.129032 0.895871 +vn -0.910550 0.078707 0.405774 +vn 0.890164 0.078707 -0.448744 +vn 0.907559 0.079806 -0.412244 +vn -0.427564 0.072634 -0.901028 +vn -0.428541 0.028413 -0.903073 +vn -0.893277 0.079806 0.442305 +vn 0.935881 0.124943 0.329325 +vn -0.336741 0.124943 0.933256 +vn 0.335459 -0.013581 -0.941923 +vn -0.941801 -0.013581 -0.335795 +vn 0.628193 0.598926 0.496567 +vn 0.882717 0.424177 -0.202155 +vn 0.007080 0.424177 0.905545 +vn 0.585131 0.066683 -0.808161 +vn -0.053865 -0.329722 -0.942534 +vn -0.694266 -0.465560 -0.548814 +vn -0.929502 -0.329722 0.165166 +vn -0.651204 0.066683 0.755913 +vn -0.818506 0.572008 0.052889 +vn -0.534135 0.405103 0.741966 +vn -0.625202 0.405103 -0.667043 +vn 0.104068 0.068026 0.992218 +vn 0.681570 -0.308725 0.663411 +vn 0.898099 -0.435926 -0.058016 +vn 0.590503 -0.308725 -0.745628 +vn -0.024476 0.068026 -0.997375 +vn -0.443831 0.331767 -0.832392 +vn -0.937315 0.234962 -0.257332 +vn 0.308603 0.234962 -0.921690 +vn -0.870113 0.076205 0.486862 +vn -0.295144 -0.126988 0.946959 +vn 0.462874 -0.179296 0.868068 +vn 0.950774 -0.126988 0.282601 +vn 0.889157 0.076205 -0.451186 +vn -0.803735 0.569414 0.172460 +vn -0.421064 0.403241 0.812433 +vn -0.717338 0.403241 -0.568133 +vn 0.247932 0.068148 0.966369 +vn 0.772271 -0.306681 0.556322 +vn 0.881283 -0.433058 -0.189093 +vn 0.475997 -0.306681 -0.824213 +vn -0.170385 0.068148 -0.983001 +vn 0.238350 0.296518 -0.924772 +vn -0.514817 0.209998 -0.831141 +vn 0.852443 0.209998 -0.478713 +vn -0.969665 0.076907 -0.231971 +vn -0.858608 -0.101016 0.502548 +vn -0.247017 -0.142644 0.958434 +vn 0.508682 -0.101016 0.854976 +vn 0.960997 0.076907 0.265633 +vn -0.715812 0.448897 -0.534837 +vn -0.929533 0.317911 0.186773 +vn -0.084384 0.317911 -0.944334 +vn -0.572832 0.073031 0.816370 +vn 0.118107 -0.214454 0.969543 +vn 0.763451 -0.302805 0.570421 +vn 0.963256 -0.214454 -0.161565 +vn 0.620502 0.073031 -0.780786 +vn -0.183416 0.961821 0.203040 +vn -0.185369 0.960906 0.205512 +vn -0.695120 0.022828 -0.718528 +vn 0.784509 0.026246 0.619526 +vn 0.785485 0.023072 0.618397 +vn 0.273080 -0.913236 -0.302286 +vn 0.275369 -0.911771 -0.304666 +vn -0.695822 0.026246 -0.717704 +vn -0.184729 0.957335 0.222083 +vn -0.676901 0.015290 -0.735893 +vn 0.815821 0.037568 0.577044 +vn 0.313089 -0.884548 -0.345683 +vn -0.471511 0.874477 0.113712 +vn -0.282540 0.230873 -0.931028 +vn 0.498276 -0.355846 0.790613 +vn 0.419477 -0.706809 -0.569597 +vn -0.552171 0.738090 0.387616 +vn -0.097629 -0.511246 0.853847 +vn 0.651814 -0.663839 -0.366619 +vn 0.149937 0.585101 -0.796960 +vn -0.640492 0.645650 0.415754 +vn 0.163121 0.484664 -0.859340 +vn 0.049532 -0.500839 0.864101 +vn 0.739341 -0.623463 -0.254250 +vn -0.778649 0.508469 0.367565 +vn 0.213538 -0.205481 0.955077 +vn 0.883206 -0.436567 -0.171209 +vn -0.102695 0.307138 -0.946104 +vn -0.826838 0.497147 0.262947 +vn -0.234718 0.133427 -0.962828 +vn 0.290933 -0.005890 0.956694 +vn 0.888241 -0.370922 -0.270943 +vn -0.828669 0.459578 0.319468 +vn 0.361003 0.106632 0.926420 +vn 0.918729 -0.322001 -0.228492 +vn -0.264962 0.004578 -0.964232 +vn -0.879452 0.394910 0.265603 +vn -0.336009 -0.111087 -0.935270 +vn 0.378124 0.239845 0.894131 +vn 0.913938 -0.264290 -0.307932 +vn -0.371685 0.396435 0.839442 +vn -0.875820 0.153020 -0.457686 +vn 0.900998 -0.059542 0.429701 +vn 0.396741 -0.302683 -0.866573 +vn 0.226783 0.843593 0.486709 +vn 0.173284 0.911222 0.373669 +vn -0.944090 -0.019318 0.329081 +vn 0.859249 -0.019318 -0.511185 +vn 0.890133 0.090365 -0.446638 +vn -0.273476 -0.761986 -0.586963 +vn -0.223945 -0.847591 -0.481063 +vn -0.914701 0.091891 0.393506 +vn 0.128330 0.951781 0.278542 +vn -0.933866 0.008301 0.357494 +vn 0.874050 0.007263 -0.485733 +vn -0.182287 -0.902097 -0.391095 +vn 0.157659 0.932524 0.324839 +vn 0.855983 0.035035 -0.515763 +vn -0.217170 -0.854213 -0.472335 +vn -0.938597 0.021210 0.344279 +vn -0.025300 0.900754 0.433515 +vn -0.964293 0.253151 -0.077548 +vn 0.959990 -0.262368 -0.097690 +vn -0.388775 -0.729759 -0.562334 +vn 0.197028 0.795007 0.573687 +vn 0.796838 -0.469253 0.380535 +vn -0.126011 -0.758965 -0.638813 +vn -0.747032 0.490036 -0.449141 +vn 0.144780 0.726768 0.671407 +vn -0.786218 0.432722 -0.441084 +vn 0.857845 -0.436354 0.271401 +vn -0.003906 -0.681204 -0.732047 +vn 0.123020 0.545885 0.828761 +vn 0.987487 -0.141850 0.068697 +vn 0.167821 -0.475112 -0.863735 +vn -0.948759 0.200018 -0.244575 +vn -0.059603 0.420118 0.905484 +vn -0.997711 -0.033570 -0.058473 +vn 0.988922 0.145573 -0.028474 +vn 0.038697 -0.293222 -0.955229 +vn -0.043764 0.279031 0.959258 +vn -0.996338 -0.015717 -0.083956 +vn 0.990509 0.130894 -0.041536 +vn 0.029389 -0.143773 -0.989166 +vn 0.681143 0.167730 0.712638 +vn -0.728874 0.071780 0.680837 +vn 0.717002 0.024628 -0.696616 +vn -0.682333 -0.070528 -0.727592 +vn -0.757561 0.589190 0.280923 +vn -0.732231 0.624561 0.271523 +vn -0.302103 0.032868 -0.952696 +vn 0.392041 0.032868 0.919340 +vn 0.362194 0.056215 0.930387 +vn 0.812403 -0.499222 -0.301248 +vn 0.793237 -0.533128 -0.294137 +vn -0.331950 0.056215 -0.941588 +vn -0.606403 0.761803 0.227821 +vn 0.339610 0.088321 0.936399 +vn 0.680563 -0.686148 -0.256905 +vn -0.348094 0.084475 -0.933622 +vn -0.330912 0.925169 0.185705 +vn 0.563372 0.228675 0.793908 +vn 0.552110 -0.833247 -0.029115 +vn -0.536424 -0.066042 -0.841334 +vn -0.266976 0.961913 -0.058382 +vn -0.737510 -0.221931 -0.637806 +vn 0.777062 0.295297 0.555803 +vn 0.338786 -0.940703 -0.016511 +vn -0.273873 0.958678 -0.076937 +vn -0.719321 -0.275185 -0.637806 +vn 0.800165 0.238929 0.550096 +vn 0.326579 -0.944945 -0.020112 +vn -0.413160 0.910398 -0.020814 +vn -0.584765 -0.219031 -0.781060 +vn 0.690451 0.181158 0.700278 +vn 0.381207 -0.907224 -0.177770 +vn -0.570666 0.791681 0.218085 +vn 0.581988 0.055116 0.811304 +vn 0.624439 -0.726371 -0.287118 +vn -0.400403 -0.133152 -0.906583 +vn -0.707938 0.545640 0.448378 +vn 0.610370 0.207099 0.764519 +vn 0.818903 -0.430128 -0.379894 +vn -0.478133 -0.179601 -0.859706 +vn -0.851009 0.278390 0.445235 +vn -0.510849 -0.189215 -0.838557 +vn 0.613819 0.260109 0.745323 +vn 0.799463 -0.203711 -0.565081 +vn -0.196265 0.195318 0.960875 +vn -0.976226 0.041780 -0.212592 +vn 0.981689 0.031098 0.187841 +vn 0.199469 -0.121433 -0.972320 +vn -0.597674 0.709311 0.373669 +vn -0.507065 0.801660 0.316538 +vn -0.460646 -0.017060 -0.887387 +vn 0.596057 -0.017060 0.802728 +vn 0.521012 0.076052 0.850124 +vn 0.645344 -0.648579 -0.403485 +vn 0.560503 -0.750450 -0.350169 +vn -0.535997 0.076968 -0.840663 +vn -0.430891 0.861385 0.268899 +vn -0.492325 0.007050 -0.870357 +vn 0.567827 0.006897 0.823084 +vn 0.488723 -0.817286 -0.305185 +vn -0.493210 0.813105 0.309153 +vn -0.484085 0.010163 -0.874935 +vn 0.569597 0.009186 0.821863 +vn 0.551286 -0.758507 -0.347392 +vn -0.371502 0.859279 0.351512 +vn 0.713614 0.234474 0.660115 +vn 0.610828 -0.761376 -0.217109 +vn -0.719504 -0.107273 -0.686148 +vn -0.433851 0.883419 0.176916 +vn -0.828700 -0.316233 -0.461715 +vn 0.854579 0.342112 0.390667 +vn 0.457045 -0.853603 -0.249886 +vn -0.442061 0.875881 0.193335 +vn -0.822840 -0.315378 -0.472671 +vn 0.855739 0.335398 0.393902 +vn 0.463027 -0.843715 -0.271493 +vn -0.482131 0.731742 0.481704 +vn -0.761315 -0.421003 -0.493057 +vn 0.913938 0.284066 0.289804 +vn 0.538469 -0.659230 -0.524766 +vn -0.552293 0.406842 0.727592 +vn 0.867061 0.355358 0.349071 +vn 0.481735 -0.361095 -0.798425 +vn -0.832636 -0.316446 -0.454482 +vn -0.573077 0.344096 0.743706 +vn 0.852138 0.155522 0.499619 +vn 0.450850 -0.281137 -0.847133 +vn -0.854244 -0.071352 -0.514908 +vn 0.233802 0.226081 0.945616 +vn -0.944304 0.292611 0.150517 +vn 0.955901 -0.238563 -0.171087 +vn -0.228065 -0.168554 -0.958922 +vn 0.282693 0.917081 0.281106 +vn 0.287545 0.914090 0.285867 +vn -0.749168 0.030549 0.661641 +vn 0.659566 0.036439 -0.750755 +vn 0.656362 0.030519 -0.753807 +vn -0.372631 -0.850765 -0.370525 +vn -0.378216 -0.845363 -0.377178 +vn -0.747032 0.036439 0.663747 +vn 0.219520 0.951537 0.215247 +vn 0.663045 0.078829 -0.744377 +vn -0.315867 -0.894528 -0.316263 +vn -0.736930 0.075045 0.671743 +vn 0.093875 0.979430 0.178472 +vn -0.852718 0.073855 0.517106 +vn 0.773461 -0.044069 -0.632252 +vn -0.308267 -0.931578 -0.192663 +vn 0.195654 0.967345 0.161077 +vn 0.873562 -0.106967 -0.474776 +vn -0.245216 -0.927244 -0.282937 +vn -0.929044 0.119785 0.349986 +vn 0.206030 0.960234 0.188299 +vn 0.874355 -0.090243 -0.476791 +vn -0.258156 -0.913419 -0.314615 +vn -0.926908 0.136448 0.349528 +vn 0.309976 0.922849 0.228492 +vn 0.781671 -0.052767 -0.621448 +vn -0.247047 -0.868709 -0.429273 +vn -0.876827 0.033753 0.479598 +vn 0.387494 0.769463 0.507675 +vn -0.818537 -0.067995 0.570360 +vn 0.655690 0.024812 -0.754570 +vn -0.475692 -0.666860 -0.573565 +vn 0.600757 0.418470 0.681143 +vn 0.657613 0.089999 -0.747917 +vn -0.624439 -0.285897 -0.726829 +vn -0.814447 -0.025452 0.579638 +vn 0.607288 0.007538 0.794427 +vn 0.682882 0.038820 -0.729453 +vn -0.686605 0.141697 -0.713065 +vn -0.796655 0.119663 0.592425 +vn 0.959685 -0.274758 0.058718 +vn -0.067263 -0.025361 0.997406 +vn 0.075747 0.128819 -0.988769 +vn -0.928190 0.368053 -0.054720 +vn 0.465987 0.874783 -0.132603 +vn 0.502853 0.852412 -0.143101 +vn 0.232521 0.054048 0.971068 +vn -0.313669 0.054048 -0.947966 +vn -0.335368 0.020539 -0.941832 +vn -0.570635 -0.804956 0.162389 +vn -0.604480 -0.777795 0.172033 +vn 0.210852 0.020539 0.977294 +vn 0.506088 0.850368 -0.144017 +vn 0.233528 0.053804 0.970855 +vn -0.312693 0.053804 -0.948302 +vn -0.607593 -0.775170 0.172918 +vn 0.424116 0.897305 -0.122227 +vn -0.319956 0.054720 -0.945830 +vn -0.535051 -0.830866 0.152715 +vn 0.228339 0.051088 0.972228 +vn 0.418195 0.907254 -0.044557 +vn -0.179388 -0.072390 -0.981079 +vn -0.510147 -0.831141 0.221168 +vn 0.053285 0.108463 0.992645 +vn 0.526078 0.837001 -0.150517 +vn -0.115482 0.179083 0.977020 +vn -0.043703 -0.182531 -0.982208 +vn -0.631794 -0.766991 0.111881 +vn 0.646840 0.752861 -0.121494 +vn -0.069277 0.192602 0.978820 +vn -0.051302 -0.131596 -0.989959 +vn -0.739769 -0.665731 0.097446 +vn 0.745811 0.641224 -0.180456 +vn 0.018555 0.054781 0.998321 +vn -0.176092 -0.009400 -0.984313 +vn -0.839259 -0.542436 0.036775 +vn 0.887417 0.449873 -0.100375 +vn -0.249245 0.126713 -0.960082 +vn -0.931639 -0.333048 0.145299 +vn 0.099429 -0.051271 0.993713 +vn 0.970122 0.202582 -0.133427 +vn 0.088229 0.022309 0.995819 +vn -0.229591 0.088473 -0.969237 +vn -0.982910 -0.075442 0.167852 +vn 0.588488 0.042360 -0.807367 +vn 0.807917 0.039918 0.587909 +vn -0.813807 0.051424 -0.578814 +vn -0.593585 0.048585 0.803278 +vn -0.907010 0.370861 0.199408 +vn -0.824915 0.535295 0.181371 +vn -0.112247 0.015259 -0.993561 +vn 0.314859 0.015259 0.949004 +vn 0.165166 0.084292 0.982635 +vn 0.937346 -0.280892 -0.206091 +vn 0.870632 -0.453108 -0.191412 +vn -0.262246 0.084292 -0.961303 +vn -0.655690 0.741050 0.144505 +vn -0.205512 0.059999 -0.976806 +vn 0.220923 0.059450 0.973449 +vn 0.718772 -0.676778 -0.159093 +vn -0.579272 0.787011 0.212165 +vn 0.396680 0.164006 0.903165 +vn 0.713553 -0.696982 -0.070833 +vn -0.308451 -0.125004 -0.942961 +vn -0.556383 0.826716 0.083224 +vn -0.532151 -0.226691 -0.815699 +vn 0.522416 0.367504 0.769402 +vn 0.638203 -0.762200 -0.108005 +vn -0.493759 0.869533 -0.007721 +vn -0.513688 -0.303781 -0.802362 +vn 0.597888 0.337230 0.727165 +vn 0.563738 -0.823237 -0.066622 +vn -0.602466 0.782159 -0.158727 +vn -0.140843 -0.042055 -0.989135 +vn 0.276925 0.029237 0.960418 +vn 0.605579 -0.744407 -0.281228 +vn -0.813501 0.567553 0.126682 +vn 0.013001 -0.267251 0.963530 +vn 0.849330 -0.527299 -0.023225 +vn 0.185217 0.222205 -0.957213 +vn -0.956969 0.284585 0.056490 +vn 0.054262 -0.053163 0.997101 +vn 0.979858 -0.197638 0.028230 +vn 0.081027 0.119480 -0.989502 +vn -0.998901 -0.046632 -0.002258 +vn 0.093326 0.056764 -0.993988 +vn 0.085543 0.057588 0.994659 +vn 0.989807 0.142125 0.004456 +vn -0.690146 -0.183416 0.700034 +vn -0.684378 -0.187536 -0.704550 +vn 0.670370 0.254189 0.697104 +vn 0.676168 0.250191 -0.692923 +vn -0.069643 0.741722 0.667043 +vn -0.054872 0.852504 0.519791 +vn -0.980651 -0.041078 -0.191229 +vn 0.999023 -0.041078 0.015442 +vn 0.988586 0.088717 0.121555 +vn 0.074770 -0.693899 -0.716147 +vn 0.060335 -0.815699 -0.575274 +vn -0.992218 0.090091 -0.085726 +vn -0.031831 0.954344 0.296945 +vn -0.991272 0.035188 -0.126835 +vn 0.996216 0.034394 0.079409 +vn 0.037843 -0.932340 -0.359508 +vn -0.024842 0.966247 0.256294 +vn -0.989166 0.001495 -0.146641 +vn 0.998321 0.004669 0.057222 +vn 0.035035 -0.940977 -0.336558 +vn -0.231269 0.926450 0.296945 +vn -0.852992 0.125095 -0.506668 +vn 0.895413 -0.208930 0.393139 +vn -0.050172 -0.847835 -0.527818 +vn -0.231056 0.712973 0.662008 +vn 0.720298 -0.367077 0.588549 +vn 0.325999 -0.707266 -0.627247 +vn -0.631550 0.264748 -0.728690 +vn -0.398297 0.579913 0.710654 +vn 0.761345 -0.224677 0.608142 +vn 0.436872 -0.527024 -0.728935 +vn -0.721641 0.273721 -0.635792 +vn -0.476394 0.496078 0.725883 +vn -0.677877 0.294412 -0.673635 +vn 0.759056 -0.278695 0.588336 +vn 0.479781 -0.423719 -0.768273 +vn -0.518021 0.247230 0.818812 +vn 0.797632 -0.190558 0.572222 +vn 0.633442 -0.206610 -0.745659 +vn -0.697043 0.226630 -0.680227 +vn -0.598346 0.028382 0.800714 +vn -0.757347 0.053896 -0.650777 +vn 0.807611 0.015992 0.589465 +vn 0.638722 0.040040 -0.768364 +vn 0.116123 -0.016144 0.993072 +vn -0.990936 -0.069918 0.114597 +vn 0.986419 0.118961 -0.113163 +vn -0.115543 0.065859 -0.991089 +vn 0.043886 0.968383 -0.245460 +vn 0.037324 0.977355 -0.208167 +vn 0.970794 0.035737 0.237159 +vn -0.994385 0.002228 -0.105655 +vn -0.992553 0.036225 -0.116245 +vn -0.066652 -0.925504 0.372753 +vn -0.059755 -0.937956 0.341533 +vn 0.969359 0.002228 0.245582 +vn 0.009522 0.999512 -0.028962 +vn 0.967528 0.075716 0.241096 +vn -0.992889 0.068422 -0.097293 +vn -0.033876 -0.985748 0.164739 +vn 0.064302 0.958281 0.278390 +vn -0.847011 0.010590 -0.531419 +vn 0.196966 -0.974853 0.104190 +vn 0.743004 0.006714 0.669240 +vn -0.293527 0.925596 0.238838 +vn 0.322611 -0.053652 0.944975 +vn -0.461531 0.158483 -0.872829 +vn 0.160527 -0.964751 -0.208472 +vn -0.387219 0.878353 0.280190 +vn 0.354900 -0.159398 0.921201 +vn -0.458449 0.056825 -0.886868 +vn 0.278085 -0.932371 -0.230873 +vn -0.355235 0.822596 0.443953 +vn -0.044740 0.243721 -0.968780 +vn 0.169683 -0.984558 -0.042634 +vn -0.125034 -0.294351 0.947478 +vn -0.305307 0.926481 0.219977 +vn 0.479019 0.351878 -0.804163 +vn 0.211219 -0.934721 -0.285745 +vn -0.566637 -0.361187 0.740532 +vn -0.312326 0.871517 0.377972 +vn -0.782647 -0.374798 0.496933 +vn 0.712851 0.273537 -0.645741 +vn 0.015442 -0.944731 -0.327403 +vn -0.014496 0.804987 0.593066 +vn 0.905271 0.146336 -0.398755 +vn -0.079073 -0.736869 -0.671346 +vn -0.958251 -0.224952 0.176305 +vn 0.736106 0.575030 0.356945 +vn -0.609912 0.363933 0.703909 +vn 0.569292 -0.299783 -0.765496 +vn -0.754509 -0.505112 -0.418989 +vn -0.519578 0.812220 -0.265114 +vn -0.502365 0.825739 -0.256355 +vn 0.505570 0.032685 -0.862148 +vn -0.401440 0.032685 0.915281 +vn -0.413251 0.049135 0.909268 +vn 0.610187 -0.728477 0.311350 +vn 0.594897 -0.744224 0.303568 +vn 0.493759 0.049135 -0.868191 +vn -0.520615 0.811396 -0.265664 +vn 0.512101 0.023988 -0.858577 +vn -0.394696 0.023988 0.918485 +vn 0.611682 -0.726920 0.312113 +vn -0.593188 0.746361 -0.301645 +vn -0.397687 0.033235 0.916898 +vn 0.678426 -0.648946 0.344310 +vn 0.512833 0.033845 -0.857784 +vn -0.580706 0.781793 -0.226936 +vn -0.306253 0.198889 0.930906 +vn 0.618824 -0.671255 0.407941 +vn 0.348216 -0.043397 -0.936399 +vn -0.493362 0.813562 -0.307718 +vn 0.242225 -0.219275 -0.945097 +vn -0.126713 0.274606 0.953154 +vn 0.599536 -0.740989 0.302408 +vn -0.620472 0.710044 -0.332835 +vn 0.320444 -0.200720 -0.925748 +vn -0.126408 0.210120 0.969451 +vn 0.731590 -0.616962 0.289956 +vn -0.886258 0.433302 -0.163610 +vn -0.023469 0.364299 0.930967 +vn 0.916501 -0.249519 0.312632 +vn 0.281594 -0.322184 -0.903806 +vn -0.956420 0.082766 -0.280007 +vn 0.155034 -0.289193 -0.944609 +vn -0.105991 0.401013 0.909909 +vn 0.997589 -0.034913 0.059816 +vn -0.982391 0.068667 -0.173681 +vn -0.143010 0.165899 0.975707 +vn 0.989196 0.058138 0.134526 +vn 0.161077 -0.036744 -0.986236 +vn -0.806330 0.087832 0.584857 +vn -0.588580 -0.012482 -0.808313 +vn 0.590960 0.105411 0.799768 +vn 0.805750 0.005127 -0.592212 +vn -0.675405 0.316813 0.665914 +vn -0.630970 0.464492 0.621357 +vn -0.631489 0.032624 -0.774651 +vn 0.765648 0.032624 0.642384 +vn 0.667623 0.081027 0.740043 +vn 0.696280 -0.209418 -0.686514 +vn 0.663381 -0.360179 -0.655873 +vn -0.729362 0.083285 -0.679006 +vn -0.480087 0.736717 0.476150 +vn -0.709708 0.095492 -0.697958 +vn 0.684744 0.101138 0.721671 +vn 0.532212 -0.657796 -0.532914 +vn -0.256264 0.896054 0.362438 +vn 0.850337 0.237800 0.469405 +vn 0.539720 -0.784417 -0.305551 +vn -0.825404 -0.134404 -0.548296 +vn -0.355907 0.915922 0.185461 +vn -0.925748 -0.294626 -0.236976 +vn 0.916623 0.371960 0.146336 +vn 0.383984 -0.876034 -0.291665 +vn -0.404157 0.873501 0.271371 +vn -0.882839 -0.354503 -0.308023 +vn 0.951537 0.275216 0.137120 +vn 0.365703 -0.840541 -0.399640 +vn -0.538896 0.761437 0.360240 +vn -0.791620 -0.058962 -0.608142 +vn 0.844264 0.111606 0.524125 +vn 0.316935 -0.719657 -0.617725 +vn -0.423017 0.750511 0.507675 +vn 0.661489 -0.136876 0.737327 +vn 0.490402 -0.681753 -0.542833 +vn -0.587573 0.187353 -0.787133 +vn -0.472060 0.591540 0.653584 +vn 0.787011 -0.008850 0.616871 +vn 0.645222 -0.499405 -0.578112 +vn -0.639454 0.007630 -0.768761 +vn -0.677664 0.268593 0.684530 +vn -0.702445 -0.061159 -0.709067 +vn 0.804621 0.137974 0.577502 +vn 0.634266 -0.167150 -0.754784 +vn 0.061220 0.096133 0.993469 +vn -0.996460 0.060427 0.058260 +vn 0.996918 0.018372 -0.076266 +vn -0.055086 -0.017579 -0.998321 +vn 0.756279 0.641896 0.126286 +vn 0.660909 0.742271 0.110355 +vn -0.148350 0.072970 0.986236 +vn 0.086642 -0.010987 -0.996155 +vn 0.180120 0.072970 -0.980926 +vn -0.803369 -0.580126 -0.134129 +vn -0.716697 -0.687033 -0.119663 +vn -0.241707 -0.010987 0.970275 +vn 0.428907 0.900479 0.071596 +vn 0.159490 0.073794 -0.984405 +vn -0.496231 -0.864223 -0.082858 +vn -0.168981 0.073794 0.982849 +vn 0.213507 0.976318 0.034242 +vn 0.131321 0.050356 -0.990051 +vn -0.287576 -0.956633 -0.046358 +vn -0.201697 0.048280 0.978240 +vn -0.102451 0.980865 -0.165410 +vn -0.626545 0.159886 -0.762780 +vn -0.416089 -0.867550 -0.272408 +vn 0.469680 -0.178137 0.864650 +vn 0.333048 0.930509 -0.152318 +vn -0.972991 0.189734 -0.131382 +vn -0.278268 -0.944548 0.174230 +vn 0.916074 -0.366131 0.163549 +vn 0.345164 0.837153 -0.424268 +vn 0.917112 -0.263222 0.299264 +vn -0.957183 0.222877 -0.184637 +vn -0.324107 -0.803461 0.499344 +vn 0.220679 0.744346 -0.630207 +vn 0.911252 -0.379467 0.160039 +vn -0.936216 0.350536 -0.023774 +vn -0.401196 -0.620075 0.674184 +vn 0.326304 0.460463 -0.825526 +vn -0.911069 0.407392 0.062777 +vn -0.173070 -0.459609 0.871059 +vn 0.900784 -0.420118 0.109745 +vn 0.247810 0.335215 -0.908933 +vn 0.974090 -0.161779 0.157903 +vn -0.964476 0.231910 -0.126408 +vn -0.149724 -0.280862 0.947966 +vn -0.551225 0.311502 -0.773980 +vn 0.836146 0.167425 -0.522294 +vn -0.831538 -0.115848 0.543199 +vn 0.556597 -0.258248 0.789605 +vn -0.042512 0.990509 -0.130558 +vn -0.040407 0.991455 -0.124027 +vn 0.964171 0.011078 -0.264931 +vn -0.935301 0.005310 0.353740 +vn -0.935636 0.011444 0.352733 +vn 0.071108 -0.973235 0.218421 +vn 0.069948 -0.974425 0.213385 +vn 0.964293 0.005310 -0.264687 +vn -0.004273 0.999939 -0.009003 +vn 0.962523 0.053224 -0.265816 +vn -0.933195 0.055971 0.354961 +vn 0.034730 -0.994079 0.102786 +vn 0.083987 0.995331 0.046968 +vn -0.981872 -0.026917 0.187506 +vn 0.083560 -0.996307 0.018494 +vn 0.994964 -0.015076 -0.098880 +vn -0.005402 0.999847 0.016541 +vn 0.996368 0.006623 0.084841 +vn -0.999908 -0.004975 0.010010 +vn 0.002319 -0.996704 0.080905 +vn 0.004181 0.977691 -0.209876 +vn -0.994720 -0.093783 0.041566 +vn -0.006714 -0.950377 0.310953 +vn 0.990081 -0.080905 0.114689 +vn -0.186224 0.781518 -0.595386 +vn 0.976287 -0.199774 -0.083254 +vn -0.949767 0.097476 0.297342 +vn -0.046571 -0.691580 0.720786 +vn -0.114261 0.484573 -0.867214 +vn -0.867458 0.304636 0.393292 +vn 0.213599 -0.431806 0.876278 +vn 0.921781 -0.281655 -0.266335 +vn -0.187292 0.217383 -0.957915 +vn -0.918912 0.143132 0.367504 +vn 0.307657 -0.138676 0.941313 +vn 0.976897 -0.080782 -0.197699 +vn -0.294259 0.086428 -0.951781 +vn 0.956481 -0.005310 -0.291635 +vn -0.962127 0.099979 0.253517 +vn 0.244209 0.009644 0.969665 +vn -0.858028 0.177038 -0.482070 +vn 0.489334 0.010132 -0.872005 +vn -0.484725 0.056368 0.872829 +vn 0.866726 -0.111423 0.486129 +vn -0.428846 0.890866 0.149785 +vn -0.322459 0.939909 0.112186 +vn -0.266274 -0.032716 -0.963317 +vn 0.391400 -0.032716 0.919614 +vn 0.344493 0.067660 0.936308 +vn 0.496963 -0.850215 -0.173589 +vn 0.393902 -0.908780 -0.137608 +vn -0.312662 0.068392 -0.947386 +vn -0.159276 0.985687 0.054964 +vn -0.296121 0.031434 -0.954619 +vn 0.364635 0.030580 0.930631 +vn 0.237098 -0.967986 -0.082095 +vn 0.053255 0.998413 -0.017701 +vn 0.386120 0.071932 0.919614 +vn 0.052339 -0.998505 -0.014466 +vn -0.277108 0.074282 -0.957945 +vn 0.399976 0.892483 -0.208441 +vn 0.190588 -0.044465 -0.980651 +vn -0.065371 0.201544 0.977264 +vn -0.278085 -0.937101 -0.210883 +vn 0.519181 0.852718 0.057222 +vn 0.581011 -0.301706 -0.755882 +vn -0.539079 0.257576 0.801874 +vn -0.462233 -0.886654 -0.011322 +vn 0.419935 0.905393 -0.062014 +vn -0.588977 0.221442 0.777184 +vn -0.331095 -0.939543 0.087039 +vn 0.601306 -0.368297 -0.709037 +vn 0.423719 0.893551 -0.148228 +vn 0.806696 -0.316904 -0.498764 +vn -0.739189 0.380139 0.555925 +vn -0.215278 -0.971129 0.102664 +vn 0.346934 0.931272 -0.110935 +vn 0.893338 -0.386944 -0.228431 +vn -0.896664 0.304819 0.321024 +vn -0.290597 -0.939543 0.181036 +vn 0.370434 0.877773 -0.303690 +vn -0.957640 0.269082 0.102451 +vn -0.181494 -0.908719 0.375835 +vn 0.945158 -0.326456 0.008820 +vn -0.499435 0.774651 -0.387860 +vn 0.875057 0.452773 -0.170934 +vn -0.870540 -0.435682 0.228614 +vn 0.501297 -0.746117 0.438124 +vn -0.355541 0.579730 0.733116 +vn -0.331400 0.650472 0.683401 +vn -0.874844 0.003204 -0.484359 +vn 0.922025 0.003204 0.387097 +vn 0.893765 0.051302 0.445540 +vn 0.371197 -0.525651 -0.765404 +vn 0.349834 -0.598865 -0.720359 +vn -0.903562 0.050966 -0.425336 +vn -0.253945 0.810266 0.528123 +vn 0.893490 0.075869 0.442579 +vn 0.281014 -0.764275 -0.580401 +vn -0.901425 0.071993 -0.426832 +vn -0.311380 0.870083 0.382031 +vn -0.723716 0.173345 -0.667959 +vn 0.775750 -0.188147 0.602283 +vn 0.144383 -0.789819 -0.596057 +vn -0.234474 0.831660 0.503311 +vn 0.531022 -0.316263 0.786096 +vn 0.275704 -0.802332 -0.529313 +vn -0.492019 0.358592 -0.793268 +vn -0.213630 0.838130 0.501846 +vn -0.477096 0.351756 -0.805353 +vn 0.535936 -0.327952 0.777917 +vn 0.273141 -0.808191 -0.521683 +vn -0.502029 0.662313 0.556108 +vn -0.364269 0.299600 -0.881771 +vn 0.562212 -0.441023 0.699545 +vn 0.523942 -0.598315 -0.606189 +vn -0.721152 0.280282 0.633534 +vn 0.545701 -0.302561 0.781426 +vn 0.802240 -0.256386 -0.539079 +vn -0.449080 0.337474 -0.827265 +vn -0.782952 0.114231 0.611469 +vn -0.521836 0.134281 -0.842372 +vn 0.595752 -0.077120 0.799432 +vn 0.844508 -0.059999 -0.532151 +vn -0.821589 0.035249 0.568957 +vn -0.570574 0.032014 -0.820582 +vn 0.566881 0.032838 0.823115 +vn 0.822260 0.029603 -0.568316 +vn -0.178991 0.029756 0.983367 +vn -0.983428 0.027680 -0.179113 +vn 0.983642 0.018403 0.179052 +vn 0.179113 0.016297 -0.983673 +vn 0.874752 0.444441 -0.192969 +vn 0.842647 0.505295 -0.185888 +vn 0.221503 0.055788 0.973540 +vn -0.263833 0.028596 -0.964110 +vn -0.208655 0.055788 -0.976379 +vn -0.911069 -0.359844 0.200995 +vn -0.885098 -0.422437 0.195257 +vn 0.166295 0.028596 0.985656 +vn 0.718650 0.677023 -0.158544 +vn 0.234840 0.078280 0.968871 +vn -0.194586 0.078280 -0.977722 +vn -0.778191 -0.604083 0.171667 +vn 0.531846 0.838954 -0.115085 +vn -0.230171 0.063173 -0.971068 +vn -0.609943 -0.781121 0.133274 +vn 0.198431 0.068392 0.977722 +vn 0.427381 0.880398 -0.205420 +vn 0.390576 -0.157353 0.907010 +vn -0.481887 0.172552 -0.859035 +vn -0.614215 -0.788995 0.014405 +vn 0.607593 0.780297 -0.148015 +vn -0.651662 0.296884 -0.697958 +vn -0.629383 -0.742271 0.229896 +vn 0.555773 -0.317179 0.768426 +vn 0.748497 0.591601 -0.299570 +vn -0.634999 0.215094 -0.741935 +vn -0.744346 -0.534440 0.400342 +vn 0.475356 -0.236518 0.847377 +vn 0.799341 0.369823 -0.473525 +vn 0.502304 -0.173803 0.847011 +vn -0.583667 0.230934 -0.778436 +vn -0.837977 -0.278298 0.469375 +vn 0.854579 0.207221 -0.476119 +vn -0.573290 0.216346 -0.790246 +vn -0.821497 -0.129215 0.555315 +vn 0.513718 -0.137120 0.846919 +vn 0.847835 0.102390 -0.520249 +vn 0.523972 -0.025178 0.851344 +vn -0.554765 0.115207 -0.823969 +vn -0.833979 -0.012238 0.551622 +vn 0.213630 0.072573 -0.974181 +vn 0.976257 0.017121 0.215827 +vn -0.976501 0.048189 -0.209906 +vn -0.213599 -0.007172 0.976867 +vn -0.278359 0.734062 -0.619373 +vn -0.282052 0.725883 -0.627277 +vn 0.921018 0.032044 -0.388165 +vn -0.901730 0.032014 0.431043 +vn -0.898434 0.024415 0.438368 +vn 0.301126 -0.678487 0.670003 +vn 0.305368 -0.668264 0.678304 +vn 0.924619 0.024445 -0.380047 +vn -0.244331 0.805109 -0.540452 +vn 0.909055 0.075198 -0.409742 +vn -0.908292 0.081301 0.410321 +vn 0.271493 -0.753105 0.599231 +vn 0.065371 0.869991 -0.488693 +vn -0.851466 -0.523911 0.021607 +vn 0.463607 -0.585955 0.664602 +vn 0.890957 0.402539 0.210089 +vn -0.140690 0.657125 -0.740501 +vn 0.385357 0.711936 0.587024 +vn -0.436476 -0.705191 -0.558702 +vn 0.069948 -0.648122 0.758293 +vn -0.126041 0.662496 -0.738365 +vn -0.467086 -0.697226 -0.543748 +vn 0.044557 -0.642415 0.765038 +vn 0.390606 0.717368 0.576861 +vn 0.285409 0.479476 -0.829798 +vn -0.536790 -0.753197 -0.380108 +vn -0.362133 -0.434309 0.824732 +vn 0.329447 0.618549 0.713309 +vn 0.614093 0.092257 -0.783776 +vn 0.526109 0.613849 0.588488 +vn -0.574816 -0.565477 -0.591388 +vn -0.717215 -0.119816 0.686453 +vn 0.612781 0.133580 -0.778863 +vn -0.669057 -0.314951 -0.673147 +vn -0.714652 -0.101169 0.692099 +vn 0.665670 0.391186 0.635456 +vn 0.629963 0.125034 -0.766472 +vn -0.747185 -0.102084 -0.656697 +vn -0.705954 -0.059877 0.705710 +vn 0.694906 0.173742 0.697775 +vn -0.045473 0.018220 -0.998779 +vn 0.996368 0.075289 -0.039613 +vn -0.999054 -0.020173 0.037996 +vn 0.036439 0.036958 0.998627 +vn -0.233528 0.947020 -0.220466 +vn -0.218696 0.953734 -0.206183 +vn 0.703726 0.017975 -0.710196 +vn -0.664693 0.000244 0.747093 +vn -0.669118 0.018494 0.742912 +vn 0.271432 -0.927702 0.256233 +vn 0.258492 -0.934843 0.243324 +vn 0.707663 0.000244 -0.706534 +vn -0.080325 0.993896 -0.075350 +vn 0.696524 0.081423 -0.712851 +vn -0.670888 0.082217 0.736961 +vn 0.122318 -0.985778 0.114994 +vn 0.191778 0.965819 0.174200 +vn -0.648213 0.071261 0.758110 +vn -0.151097 -0.979736 -0.131413 +vn 0.722953 0.082583 -0.685903 +vn 0.570360 0.640645 0.514023 +vn -0.854488 0.445387 0.267312 +vn 0.048402 -0.856533 -0.513749 +vn 0.959563 -0.276162 -0.054476 +vn 0.196509 0.641713 0.741325 +vn 0.556810 -0.690939 0.461013 +vn -0.593616 0.671010 -0.444227 +vn -0.230903 -0.664235 -0.710929 +vn 0.244453 0.648396 0.720969 +vn -0.556871 0.678060 -0.479690 +vn -0.267037 -0.691946 -0.670705 +vn 0.501206 -0.719199 0.481124 +vn 0.238990 0.601733 0.762078 +vn -0.339671 0.758660 -0.555895 +vn -0.235847 -0.734703 -0.636036 +vn 0.301309 -0.724021 0.620441 +vn 0.267678 0.620441 0.737114 +vn -0.053621 0.683035 -0.728385 +vn -0.319041 -0.697836 -0.641224 +vn -0.031617 -0.747398 0.663594 +vn 0.280648 0.632038 0.722312 +vn -0.251320 -0.602649 0.757347 +vn 0.229347 0.683645 -0.692831 +vn -0.358837 -0.683462 -0.635670 +vn 0.395276 0.917966 -0.032228 +vn -0.110691 0.082461 0.990417 +vn 0.075228 -0.067354 -0.994873 +vn -0.431471 -0.901456 0.033998 +vn 0.730827 0.660665 0.171422 +vn 0.639485 0.753990 0.149998 +vn -0.221137 0.077059 0.972167 +vn 0.147618 -0.004028 -0.989013 +vn 0.234199 0.077059 -0.969115 +vn -0.788842 -0.586047 -0.185034 +vn -0.708182 -0.686178 -0.166112 +vn -0.307566 -0.004028 0.951506 +vn 0.397839 0.912900 0.091189 +vn 0.204688 0.089755 -0.974670 +vn -0.491470 -0.863186 -0.115482 +vn -0.244514 0.084323 0.965941 +vn 0.121281 0.986816 0.106906 +vn 0.493728 -0.047487 -0.868313 +vn -0.361400 -0.926572 0.104038 +vn -0.554277 0.151128 0.818476 +vn 0.082034 0.987915 -0.131443 +vn 0.769860 -0.114597 -0.627796 +vn -0.141057 -0.987152 0.074740 +vn -0.807306 0.186865 0.559740 +vn 0.053194 0.982116 -0.180425 +vn -0.827937 0.133122 0.544755 +vn 0.760643 -0.172460 -0.625813 +vn -0.107517 -0.989074 0.100528 +vn 0.124516 0.889706 -0.439161 +vn 0.039735 -0.106204 -0.993530 +vn -0.225227 -0.940855 -0.252968 +vn -0.245430 0.030000 0.968932 +vn 0.493088 0.860073 -0.130650 +vn -0.646809 0.114048 -0.754051 +vn -0.492813 -0.849300 0.189093 +vn 0.533616 -0.260353 0.804621 +vn 0.574877 0.619556 -0.534440 +vn 0.561174 -0.375683 0.737510 +vn -0.765465 0.319681 -0.558397 +vn -0.779107 -0.455824 0.430311 +vn 0.771294 0.213538 -0.599536 +vn -0.713370 0.461226 -0.527543 +vn -0.639729 -0.200934 0.741844 +vn 0.670797 -0.394513 0.627979 +vn -0.017273 0.298990 -0.954070 +vn 0.997833 -0.062288 -0.019929 +vn -0.990966 0.123936 0.050996 +vn 0.028413 -0.235267 0.971496 +vn 0.925962 0.377575 0.000183 +vn 0.842311 0.538957 0.000153 +vn 0.054476 0.071322 0.995941 +vn -0.096133 0.001679 -0.995361 +vn 0.054903 0.071322 -0.995911 +vn -0.949736 -0.313028 -0.000183 +vn -0.875576 -0.483047 -0.000183 +vn -0.096561 0.001679 0.995300 +vn 0.753075 0.657888 0.000153 +vn -0.037324 0.014557 -0.999176 +vn -0.796411 -0.604724 -0.000153 +vn -0.037751 0.014557 0.999176 +vn 0.802118 0.597156 0.000427 +vn -0.034303 0.021088 0.999176 +vn -0.033296 0.020112 -0.999237 +vn -0.842769 -0.538224 0.000000 +vn 0.761986 0.643239 -0.074801 +vn 0.136906 -0.113376 0.984069 +vn -0.117893 0.215155 -0.969420 +vn -0.826472 -0.554399 -0.097720 +vn 0.741447 0.669668 0.042238 +vn -0.273568 0.336375 -0.901089 +vn -0.780328 -0.625324 -0.004334 +vn 0.215247 -0.303873 0.928068 +vn 0.835383 0.549577 0.007965 +vn -0.272347 0.257820 -0.927000 +vn -0.858150 -0.508377 0.071169 +vn 0.136937 -0.263924 0.954741 +vn 0.936369 0.348613 -0.040620 +vn 0.085269 -0.101474 0.991150 +vn -0.195135 0.135990 -0.971282 +vn -0.945738 -0.294290 0.137516 +vn 0.971282 0.214118 -0.103519 +vn 0.087497 0.010743 0.996094 +vn -0.136967 0.050935 -0.989257 +vn -0.983123 -0.145665 0.110477 +vn 0.985961 0.148198 -0.076479 +vn -0.117832 -0.019196 -0.992828 +vn -0.987793 -0.075259 0.136143 +vn 0.086276 0.086123 0.992523 +vn 0.631306 -0.002289 -0.775506 +vn 0.762688 0.171972 0.623463 +vn -0.769616 -0.122929 -0.626514 +vn -0.634938 0.051363 0.770806 +vn -0.189093 0.275521 -0.942473 +vn -0.176244 0.448744 -0.876095 +vn 0.963897 0.061586 -0.258980 +vn -0.957335 0.006226 0.288797 +vn -0.989135 0.062716 0.132756 +vn 0.191931 -0.219153 0.956603 +vn 0.180670 -0.396954 0.899869 +vn 0.994659 0.006226 -0.102847 +vn -0.142155 0.689352 -0.710288 +vn -0.981780 0.052919 0.182379 +vn 0.150212 -0.644215 0.749931 +vn 0.976318 0.055330 -0.209113 +vn -0.211524 0.740532 -0.637806 +vn 0.944304 -0.145207 -0.295236 +vn -0.920316 0.153844 0.359569 +vn 0.057955 -0.675619 0.734947 +vn -0.085391 0.801752 -0.591510 +vn 0.814142 -0.243049 -0.527329 +vn -0.790521 0.384869 0.476302 +vn 0.074801 -0.750084 0.657063 +vn -0.011719 0.817286 -0.576067 +vn -0.767876 0.308023 0.561632 +vn 0.075961 -0.800317 0.594684 +vn 0.808466 -0.349925 -0.473190 +vn -0.023682 0.759606 -0.649922 +vn 0.899960 -0.209784 -0.382153 +vn -0.873012 0.249428 0.419050 +vn 0.165563 -0.752220 0.637745 +vn -0.144780 0.627064 -0.765374 +vn -0.921842 0.061769 0.382580 +vn 0.191626 -0.584918 0.788079 +vn 0.970946 -0.135258 -0.197302 +vn -0.181616 0.379864 -0.907010 +vn 0.979797 0.017090 -0.199225 +vn -0.961150 0.014924 0.275491 +vn 0.256020 -0.325938 0.910031 +vn -0.261849 0.111698 -0.958586 +vn 0.990234 0.044801 -0.131901 +vn -0.947356 -0.000092 0.320170 +vn 0.209571 -0.053224 0.976318 +vn -0.848323 -0.046876 -0.527360 +vn 0.516617 -0.098453 -0.850520 +vn -0.512619 0.139500 0.847194 +vn 0.844264 0.089084 0.528428 +vn -0.439436 0.804468 0.399579 +vn -0.314432 0.905271 0.285562 +vn -0.611408 -0.059053 -0.789087 +vn 0.727592 -0.059053 0.683432 +vn 0.657063 0.090945 0.748314 +vn 0.468978 -0.773400 -0.426435 +vn 0.347728 -0.882595 -0.316324 +vn -0.682150 0.091494 -0.725455 +vn -0.051119 0.997620 0.045595 +vn -0.657521 0.078799 -0.749290 +vn 0.683950 0.078097 0.725303 +vn 0.087039 -0.993042 -0.079043 +vn 0.114963 0.988708 -0.095981 +vn -0.642842 0.003693 -0.765984 +vn 0.701407 0.018067 0.712485 +vn -0.062288 -0.996979 0.045808 +vn 0.504379 0.658895 -0.558061 +vn 0.979247 -0.201086 -0.025056 +vn 0.189459 -0.849391 0.492538 +vn -0.741844 0.554491 -0.377087 +vn 0.093936 0.511673 -0.853999 +vn -0.357646 0.717429 0.597797 +vn 0.350261 -0.793603 -0.497452 +vn -0.043794 -0.635975 0.770440 +vn 0.303720 0.525834 -0.794488 +vn -0.058016 0.734550 0.676046 +vn -0.034730 -0.804498 -0.592883 +vn -0.351848 -0.649220 0.674306 +vn 0.383892 0.506699 -0.771905 +vn 0.332072 0.647359 0.686026 +vn -0.362774 -0.605457 -0.708365 +vn -0.488968 -0.591815 0.640797 +vn 0.454787 0.495743 -0.739830 +vn -0.609302 -0.431623 -0.665120 +vn -0.536851 -0.494583 0.683493 +vn 0.526811 0.420240 0.738792 +vn 0.609210 0.301248 -0.733543 +vn -0.696463 -0.303140 -0.650380 +vn -0.658132 -0.267861 0.703635 +vn 0.592944 0.313089 0.741844 +vn 0.012848 -0.063478 -0.997894 +vn 0.950316 0.310923 -0.013398 +vn -0.960967 -0.276254 0.012879 +vn -0.028230 0.096713 0.994903 +vn -0.330638 0.685934 0.648183 +vn -0.325510 0.697775 0.638050 +vn -0.881802 0.009949 -0.471480 +vn 0.899350 0.009949 0.437086 +vn 0.894559 0.019990 0.446455 +vn 0.343028 -0.655782 -0.672475 +vn 0.338389 -0.667684 -0.663045 +vn -0.886685 0.019990 -0.461867 +vn -0.283151 0.780480 0.557329 +vn 0.883969 0.052339 0.464583 +vn 0.299783 -0.750542 -0.588885 +vn -0.895108 0.050264 -0.442915 +vn -0.378155 0.802210 0.461959 +vn -0.728294 0.169012 -0.664052 +vn 0.777795 -0.215522 0.590381 +vn 0.205420 -0.730796 -0.650929 +vn -0.350993 0.709098 0.611499 +vn 0.570757 -0.357982 0.738945 +vn 0.381634 -0.689718 -0.615284 +vn -0.539506 0.369732 -0.756432 +vn -0.433393 0.605121 0.667776 +vn -0.564043 0.290323 -0.773003 +vn 0.646962 -0.330271 0.687277 +vn 0.498764 -0.593402 -0.631703 +vn -0.640858 0.298532 0.707205 +vn -0.574175 0.214331 -0.790155 +vn 0.731925 -0.239479 0.637867 +vn 0.673391 -0.268654 -0.688711 +vn -0.714469 0.060854 0.696982 +vn 0.676962 -0.158879 0.718619 +vn 0.733787 -0.024140 -0.678915 +vn -0.667318 0.199011 -0.717673 +vn -0.673421 -0.054903 0.737175 +vn 0.712638 0.031007 0.700797 +vn 0.773705 0.097049 -0.626057 +vn -0.638325 0.017823 -0.769524 +vn -0.735649 -0.131077 0.664510 +vn -0.681753 -0.117710 -0.722007 +vn 0.645131 0.151341 0.748894 +vn 0.703726 0.165777 -0.690817 +vn -0.043184 0.007172 0.999023 +vn -0.991028 -0.127079 -0.040651 +vn 0.986969 0.155492 0.040773 +vn 0.037446 0.021027 -0.999054 +vn -0.103946 0.458937 0.882351 +vn -0.106967 0.405957 0.907590 +vn -0.988067 0.017792 -0.152898 +vn 0.990814 0.039308 0.129246 +vn 0.996551 0.017853 0.080721 +vn 0.106998 -0.404736 -0.908139 +vn 0.109684 -0.349895 -0.930326 +vn -0.993713 0.039308 -0.104556 +vn -0.105289 0.435621 0.893918 +vn 0.988708 0.045198 0.142735 +vn 0.108585 -0.379925 -0.918607 +vn -0.994873 0.044923 -0.090457 +vn -0.091311 0.619037 0.780023 +vn 0.987976 0.057405 0.143406 +vn 0.095706 -0.571306 -0.815088 +vn -0.994140 0.057466 -0.091281 +vn 0.035981 0.714469 0.698691 +vn 0.959166 0.257393 -0.116947 +vn 0.227912 -0.600482 -0.766442 +vn -0.970367 -0.236763 0.047884 +vn -0.097934 0.593310 0.798975 +vn -0.874783 -0.435499 0.212226 +vn 0.849055 0.436689 -0.297189 +vn 0.024567 -0.574053 -0.818415 +vn -0.031922 0.522904 0.851772 +vn 0.887600 0.392773 -0.240455 +vn -0.016572 -0.484695 -0.874508 +vn -0.913755 -0.361827 0.184576 +vn 0.136509 0.313883 0.939573 +vn -0.904965 -0.411664 0.107273 +vn 0.852870 0.405560 -0.328806 +vn -0.108127 -0.235633 -0.965789 +vn 0.117710 0.027131 0.992676 +vn 0.924558 0.309763 -0.221809 +vn -0.311167 -0.020325 -0.950133 +vn -0.945311 -0.250923 0.208289 +vn 0.262246 -0.028565 0.964568 +vn 0.953032 0.170537 -0.250160 +vn -0.208319 0.095798 -0.973327 +vn -0.974944 -0.108310 0.194220 +vn 0.844783 0.075747 0.529649 +vn -0.505173 -0.221137 0.834193 +vn 0.497848 0.262185 -0.826655 +vn -0.850032 -0.033479 -0.525651 +vn 0.004700 0.238472 -0.971129 +vn 0.004730 0.184790 -0.982757 +vn 0.999512 0.026704 -0.015687 +vn -0.999298 0.026704 -0.025361 +vn -0.999573 0.017243 0.023316 +vn -0.004730 -0.196356 0.980499 +vn -0.004822 -0.142308 0.989807 +vn 0.999298 0.017121 0.032929 +vn 0.004730 0.104038 -0.994537 +vn 0.999603 0.020783 0.018372 +vn -0.999725 0.020447 0.008515 +vn -0.004761 -0.060823 0.998108 +vn -0.012665 0.161168 -0.986816 +vn 0.999207 -0.018159 -0.035371 +vn -0.996826 0.072237 -0.032991 +vn -0.026795 -0.115543 0.992920 +vn 0.007111 0.390210 -0.920682 +vn 0.990661 -0.104190 -0.087588 +vn -0.980407 0.195227 -0.025880 +vn -0.057588 -0.341533 0.938078 +vn 0.061434 0.449232 -0.891263 +vn -0.979919 0.180670 0.084078 +vn -0.023133 -0.416547 0.908811 +vn 0.984558 -0.174932 0.002380 +vn 0.045595 0.189123 -0.980865 +vn -0.991211 0.083041 0.102664 +vn 0.024567 -0.151311 0.988159 +vn 0.994476 -0.069735 0.078127 +vn 0.009735 0.119816 -0.992737 +vn 0.998016 0.039125 -0.049226 +vn -0.998108 0.014069 -0.059725 +vn 0.004303 -0.077944 0.996918 +vn -0.035340 0.101016 -0.994232 +vn -0.995514 0.066713 0.066836 +vn -0.034181 -0.053713 0.997955 +vn 0.996826 -0.033235 0.072085 +vn 0.090030 0.078921 -0.992798 +vn 0.993255 0.108310 -0.041200 +vn -0.995544 -0.059755 -0.072878 +vn 0.099246 -0.019501 0.994842 +vn -0.697104 -0.072420 -0.713279 +vn 0.661000 0.348827 -0.664327 +vn -0.668569 -0.320841 0.670827 +vn 0.692953 0.103580 0.713462 +vn -0.198767 0.395093 0.896847 +vn -0.192541 0.457656 0.868007 +vn -0.968078 0.001648 -0.250618 +vn 0.983306 0.001648 0.181860 +vn 0.971221 0.027558 0.236488 +vn 0.201239 -0.367504 -0.907956 +vn 0.195654 -0.429853 -0.881436 +vn -0.980285 0.027619 -0.195502 +vn -0.160222 0.674032 0.721061 +vn 0.960418 0.069094 0.269814 +vn 0.164708 -0.651631 -0.740410 +vn -0.984497 0.069979 -0.160741 +vn -0.127415 0.812860 0.568316 +vn -0.974181 0.014618 -0.225227 +vn 0.978484 0.012329 0.205908 +vn 0.132694 -0.794488 -0.592547 +vn 0.143406 0.748619 0.647267 +vn 0.916562 0.313944 -0.247658 +vn 0.283914 -0.569811 -0.771142 +vn -0.897671 -0.436445 0.060335 +vn 0.026124 0.516526 0.855861 +vn -0.604755 -0.670705 0.429365 +vn 0.582080 0.677206 -0.450026 +vn -0.060549 -0.515061 -0.855007 +vn 0.077303 0.411206 0.908231 +vn -0.730522 -0.584094 0.353710 +vn 0.695944 0.561693 -0.447340 +vn -0.189123 -0.463576 -0.865627 +vn 0.284738 0.269143 0.920011 +vn 0.766442 0.474044 -0.433332 +vn -0.290201 -0.237800 -0.926939 +vn -0.817316 -0.479629 0.319224 +vn 0.287179 0.071688 0.955168 +vn -0.879971 -0.311899 0.358226 +vn 0.853420 0.335643 -0.398663 +vn -0.442274 -0.097995 -0.891476 +vn 0.308817 0.045839 0.949980 +vn 0.924284 -0.005158 -0.381634 +vn -0.444533 -0.013092 -0.895657 +vn -0.926725 0.034577 0.374065 +vn 0.915281 -0.105045 0.388806 +vn -0.383374 0.156529 0.910215 +vn 0.384472 -0.135563 -0.913114 +vn -0.912748 0.126011 -0.388562 +vn -0.422315 0.902829 0.080599 +vn -0.398022 0.914212 0.075961 +vn -0.167730 -0.004151 -0.985809 +vn 0.207160 -0.004151 0.978271 +vn 0.196753 0.017975 0.980285 +vn 0.450697 -0.888485 -0.086032 +vn 0.426801 -0.900662 -0.081454 +vn -0.178137 0.017975 -0.983825 +vn -0.372173 0.925504 0.069796 +vn -0.170446 0.008179 -0.985321 +vn 0.206244 0.005982 0.978454 +vn 0.406354 -0.910520 -0.076022 +vn -0.319254 0.939879 -0.121189 +vn 0.253090 0.185827 -0.949400 +vn -0.227363 -0.177587 0.957457 +vn 0.444258 -0.856563 -0.262459 +vn -0.316324 0.941771 0.113804 +vn 0.643880 0.341960 -0.684408 +vn -0.642109 -0.280557 0.713401 +vn 0.351939 -0.930143 -0.104465 +vn -0.402783 0.912107 0.075961 +vn -0.581286 -0.363231 0.728111 +vn 0.395947 -0.918119 -0.016602 +vn 0.662160 0.239265 -0.710105 +vn -0.622272 0.727378 -0.289254 +vn -0.527390 -0.397534 0.750847 +vn 0.676687 -0.688101 0.261849 +vn 0.714988 0.229835 -0.660268 +vn -0.762810 0.452864 -0.461501 +vn -0.621357 -0.333201 0.709128 +vn 0.745567 -0.437666 0.502518 +vn 0.660207 0.339854 -0.669759 +vn -0.815699 0.234962 -0.528550 +vn 0.693533 0.185766 -0.696036 +vn -0.560076 -0.194037 0.805383 +vn 0.748436 -0.225532 0.623615 +vn -0.814905 0.000000 -0.579577 +vn -0.594775 0.043397 0.802698 +vn 0.760613 0.034516 0.648274 +vn 0.639729 -0.010285 -0.768517 +vn -0.991852 0.043306 0.119724 +vn -0.120823 -0.134648 -0.983490 +vn 0.120579 0.157079 0.980163 +vn 0.992492 -0.020356 -0.120548 +vn 0.462600 0.340190 -0.818659 +vn 0.423231 0.509110 -0.749413 +vn 0.899747 0.054689 0.432936 +vn -0.910489 -0.014130 -0.413221 +vn -0.834925 0.055147 -0.547533 +vn -0.467452 -0.311563 0.827265 +vn -0.430403 -0.483535 0.762169 +vn 0.823756 -0.014130 0.566759 +vn 0.385052 0.621754 -0.681997 +vn -0.883999 -0.002747 -0.467422 +vn -0.393963 -0.598407 0.697623 +vn 0.856288 -0.003021 0.516434 +vn 0.392621 0.603351 -0.694113 +vn 0.871212 0.020936 0.490432 +vn -0.869900 0.020508 -0.492752 +vn -0.401898 -0.577654 0.710440 +vn 0.373577 0.747276 -0.549486 +vn -0.774132 -0.070620 -0.629017 +vn -0.253365 -0.700674 0.666921 +vn 0.804224 0.195166 0.561327 +vn 0.252907 0.789026 -0.559862 +vn -0.710532 -0.261910 -0.653066 +vn -0.285836 -0.777154 0.560625 +vn 0.674490 0.230384 0.701376 +vn 0.343486 0.699759 -0.626331 +vn 0.699179 0.203955 0.685171 +vn -0.742759 -0.230140 -0.628742 +vn -0.377758 -0.682882 0.625233 +vn 0.380444 0.552568 -0.741508 +vn 0.779229 0.056520 0.624165 +vn -0.836970 -0.086032 -0.540391 +vn -0.511765 -0.537950 0.669820 +vn 0.529191 0.313730 -0.788354 +vn -0.883663 0.041963 -0.466201 +vn -0.512223 -0.286355 0.809687 +vn 0.804865 -0.056734 0.590716 +vn 0.535661 0.105533 -0.837794 +vn 0.830531 -0.009247 0.556841 +vn -0.856502 0.035554 -0.514878 +vn -0.535813 -0.075076 0.840968 +vn -0.216956 0.052950 -0.974731 +vn 0.975951 0.022645 -0.216681 +vn -0.975829 -0.000946 0.218421 +vn 0.216132 -0.031220 0.975860 +vn 0.710807 0.446760 0.543260 +vn 0.655080 0.565691 0.500778 +vn -0.569506 0.043458 0.820826 +vn 0.556566 -0.018464 -0.830561 +vn 0.642506 0.043275 -0.765038 +vn -0.718070 -0.427900 -0.548814 +vn -0.664266 -0.548509 -0.507767 +vn -0.655324 -0.018464 0.755089 +vn 0.553819 0.717795 0.421918 +vn -0.601611 0.027192 0.798303 +vn 0.612842 0.029328 -0.789636 +vn -0.570208 -0.697043 -0.434675 +vn 0.401013 0.672903 0.621570 +vn -0.822016 0.329356 0.464522 +vn 0.685903 -0.435163 -0.583209 +vn -0.752098 -0.506485 -0.421644 +vn 0.572497 0.506546 0.644673 +vn 0.703818 -0.705985 -0.078555 +vn -0.605914 -0.459517 -0.649342 +vn -0.676199 0.730674 0.093936 +vn 0.618885 0.413495 0.667806 +vn 0.703665 -0.686728 -0.182165 +vn -0.516312 -0.488784 -0.703177 +vn -0.744438 0.659261 0.105625 +vn 0.610187 0.306253 0.730644 +vn 0.824580 -0.398480 -0.401563 +vn -0.431257 -0.373333 -0.821345 +vn -0.847530 0.397839 0.351268 +vn 0.531816 0.201453 0.822504 +vn -0.886624 0.122227 0.445998 +vn 0.839412 -0.119907 -0.530045 +vn -0.481002 -0.187964 -0.856319 +vn 0.513138 0.097690 0.852718 +vn 0.861721 -0.026460 -0.506638 +vn -0.497452 -0.077395 -0.864009 +vn -0.863796 0.047090 0.501572 +vn 0.512040 0.016633 0.858791 +vn -0.879910 0.011536 0.474960 +vn 0.844386 0.009186 -0.535600 +vn -0.500351 0.004486 -0.865780 +vn 0.967071 -0.033784 0.252174 +vn -0.251625 -0.053529 0.966308 +vn 0.251350 0.068453 -0.965453 +vn -0.966460 0.048769 -0.252083 +vn 0.779107 0.516923 0.354595 +vn 0.722160 0.608600 0.328654 +vn -0.383465 0.039491 0.922697 +vn 0.367687 -0.015748 -0.929807 +vn 0.443861 0.039491 -0.895199 +vn -0.790094 -0.496384 -0.359569 +vn -0.734916 -0.589892 -0.334483 +vn -0.459578 -0.015748 0.887967 +vn 0.675283 0.670431 0.307321 +vn 0.396924 -0.000671 -0.917814 +vn -0.689749 -0.652425 -0.313913 +vn -0.431349 -0.000671 0.902158 +vn 0.569842 0.779839 0.259072 +vn -0.372845 0.074740 0.924863 +vn 0.452406 0.075350 -0.888607 +vn -0.589343 -0.762108 -0.268014 +vn 0.305979 0.927671 0.213874 +vn 0.610187 -0.090152 -0.787072 +vn -0.462447 -0.885617 -0.042268 +vn -0.597217 0.168004 0.784265 +vn 0.347301 0.933561 0.088382 +vn 0.751640 -0.232917 -0.617054 +vn -0.354076 -0.928739 -0.109684 +vn -0.773370 0.212897 0.597125 +vn 0.450453 0.866634 0.214484 +vn -0.774468 0.154149 0.613483 +vn 0.703940 -0.256752 -0.662191 +vn -0.439131 -0.862209 -0.252388 +vn 0.665365 0.736290 0.122868 +vn 0.364666 0.109592 -0.924650 +vn -0.510788 -0.665426 -0.544267 +vn -0.438643 -0.157750 0.884671 +vn 0.758538 0.509384 0.406323 +vn 0.051363 0.386486 -0.920835 +vn -0.786767 -0.539354 -0.300088 +vn -0.174169 -0.443525 0.879147 +vn 0.803644 0.448927 0.390576 +vn -0.252022 -0.182531 0.950316 +vn 0.286843 0.228492 -0.930296 +vn -0.849208 -0.454207 -0.269326 +vn 0.797266 0.421461 -0.432081 +vn 0.315836 0.305918 0.898129 +vn -0.325022 -0.291879 -0.899503 +vn -0.804956 -0.406171 0.432478 +vn -0.689566 0.657247 0.304117 +vn -0.715018 0.623920 0.315348 +vn -0.382611 -0.002869 -0.923887 +vn 0.396283 0.021821 0.917844 +vn 0.424238 -0.002869 0.905515 +vn 0.703269 -0.639668 -0.310160 +vn 0.728202 -0.605396 -0.321177 +vn -0.410565 0.021821 -0.911557 +vn -0.684103 0.664357 0.301004 +vn 0.380749 0.037263 0.923887 +vn 0.698569 -0.646199 -0.307199 +vn -0.426405 0.038270 -0.903714 +vn -0.599780 0.787866 0.139470 +vn -0.157903 0.260506 -0.952452 +vn 0.154393 -0.217750 0.963683 +vn 0.569353 -0.697562 -0.434950 +vn -0.415021 0.858455 0.301218 +vn -0.226661 -0.381420 0.896146 +vn 0.449507 -0.820276 -0.353587 +vn 0.189795 0.499191 -0.845424 +vn -0.290078 0.875790 0.385754 +vn 0.288675 0.461684 -0.838710 +vn -0.263771 -0.459426 0.848109 +vn 0.313883 -0.872463 -0.374523 +vn -0.353130 0.935514 -0.007324 +vn -0.492599 -0.733757 0.467849 +vn 0.692343 -0.689322 -0.213141 +vn 0.728507 0.459487 -0.508042 +vn -0.737907 0.576495 -0.350902 +vn 0.773461 0.619068 -0.135929 +vn -0.680471 -0.702628 0.207923 +vn 0.627094 -0.670675 0.396069 +vn -0.557756 0.491714 -0.668661 +vn -0.681997 -0.668722 0.296060 +vn 0.621570 -0.416761 0.663228 +vn 0.778710 0.605335 -0.164739 +vn -0.528520 0.302225 -0.793268 +vn 0.713248 0.678518 -0.175573 +vn -0.714103 -0.669362 0.204749 +vn 0.486099 -0.316416 0.814570 +vn -0.875942 -0.239570 -0.418653 +vn 0.166326 0.666585 -0.726615 +vn -0.174078 -0.655080 0.735221 +vn 0.868313 0.250618 0.427992 +vn -0.632435 0.773614 -0.038881 +vn -0.574023 0.818049 -0.035279 +vn 0.091128 -0.019135 -0.995636 +vn -0.031556 -0.019135 0.999298 +vn -0.072085 0.033143 0.996826 +vn 0.648640 -0.760033 0.039888 +vn 0.591205 -0.805689 0.036348 +vn 0.050600 0.033143 -0.998138 +vn -0.559679 0.827967 -0.034394 +vn 0.085116 -0.014924 -0.996246 +vn -0.037599 -0.014924 0.999176 +vn 0.577837 -0.815363 0.035524 +vn -0.456832 0.889126 -0.026917 +vn -0.086245 0.077303 0.993255 +vn 0.480483 -0.876522 0.027802 +vn 0.037049 0.074709 -0.996490 +vn -0.198462 0.951933 0.233253 +vn 0.630451 0.297494 0.716941 +vn 0.621906 -0.747337 0.233772 +vn -0.519761 -0.471236 -0.712546 +vn -0.544084 0.821986 0.168096 +vn -0.834773 -0.549089 -0.040345 +vn 0.855251 0.518021 0.013733 +vn 0.519974 -0.832942 -0.189093 +vn -0.567309 0.730430 0.380261 +vn -0.812738 -0.542802 -0.211615 +vn 0.897946 0.422254 0.123905 +vn 0.471297 -0.776269 -0.418592 +vn -0.629749 0.636341 0.445479 +vn 0.812922 0.257912 0.522080 +vn 0.407849 -0.684591 -0.604114 +vn -0.824671 -0.220710 -0.520737 +vn -0.559008 0.584490 0.588061 +vn 0.762230 -0.034791 0.646352 +vn 0.567614 -0.568407 -0.595569 +vn -0.679312 -0.025758 -0.733390 +vn -0.652394 0.261452 0.711325 +vn 0.790918 0.008789 0.611835 +vn 0.674490 -0.240486 -0.697989 +vn -0.661153 -0.035707 -0.749352 +vn 0.026826 0.071108 0.997101 +vn -0.998871 0.001221 0.046999 +vn 0.998657 0.013367 -0.049837 +vn -0.024415 -0.056246 -0.998108 +vn 0.622150 0.550005 -0.557085 +vn 0.559038 0.660878 -0.500687 +vn 0.696371 0.048524 0.715995 +vn -0.710105 -0.026551 -0.703543 +vn -0.634999 0.048677 -0.770959 +vn -0.630177 -0.533311 0.564257 +vn -0.568560 -0.646046 0.509232 +vn 0.621143 -0.026551 0.783197 +vn 0.505997 0.733787 -0.453291 +vn -0.681204 -0.005982 -0.732047 +vn -0.516617 -0.720359 0.462752 +vn 0.652486 -0.006165 0.757744 +vn 0.564013 0.709372 -0.422620 +vn -0.596820 -0.087283 -0.797571 +vn -0.505020 -0.683432 0.527085 +vn 0.583270 0.100314 0.806024 +vn 0.524003 0.710501 -0.469649 +vn 0.496506 0.200568 0.844539 +vn -0.505051 -0.180212 -0.844020 +vn -0.536363 -0.696310 0.476882 +vn 0.577563 0.641621 -0.504685 +vn -0.549883 -0.193884 -0.812403 +vn -0.603046 -0.631123 0.487838 +vn 0.482253 0.149266 0.863186 +vn 0.698752 0.538560 -0.470779 +vn -0.485641 -0.245003 -0.839106 +vn -0.661489 -0.496658 0.561907 +vn 0.446028 0.240120 0.862178 +vn 0.725181 0.429182 -0.538408 +vn 0.397961 0.299203 0.867214 +vn -0.450148 -0.306101 -0.838832 +vn -0.752739 -0.424146 0.503433 +vn 0.859920 0.249794 -0.445082 +vn -0.468398 -0.366894 -0.803705 +vn -0.828639 -0.196112 0.524247 +vn 0.332133 0.351756 0.875149 +vn 0.871364 0.038423 -0.489059 +vn 0.389935 0.361248 0.847011 +vn -0.406690 -0.343181 -0.846644 +vn -0.917203 -0.056520 0.394330 +vn 0.334849 -0.140873 -0.931669 +vn 0.929075 0.200323 0.310923 +vn -0.930601 -0.186743 -0.314737 +vn -0.337962 0.154332 0.928404 +vn -0.501328 0.853511 0.141942 +vn -0.405957 0.906613 0.114933 +vn -0.183142 -0.006104 -0.983062 +vn 0.359416 -0.006104 0.933134 +vn 0.307108 0.079867 0.948302 +vn 0.612110 -0.771508 -0.173315 +vn 0.525742 -0.837489 -0.148869 +vn -0.235664 0.079867 -0.968535 +vn -0.424909 0.897183 0.120304 +vn -0.179052 -0.020936 -0.983612 +vn 0.363201 -0.020936 0.931455 +vn 0.545000 -0.824061 -0.154332 +vn -0.699271 0.686850 0.198004 +vn -0.155889 -0.005768 -0.987732 +vn 0.385113 -0.005768 0.922849 +vn 0.786401 -0.576128 -0.222663 +vn -0.828181 0.509018 0.234504 +vn 0.300699 0.064516 0.951506 +vn 0.888760 -0.383068 -0.251656 +vn -0.242805 0.064516 -0.967895 +vn -0.837001 0.493149 0.237007 +vn -0.232887 0.059603 -0.970672 +vn 0.310587 0.059603 0.948668 +vn 0.895962 -0.364483 -0.253700 +vn -0.931944 0.248604 0.263894 +vn -0.151952 0.052522 -0.986969 +vn 0.388073 0.052522 0.920103 +vn 0.956786 -0.105441 -0.270913 +vn -0.494766 -0.008148 0.868984 +vn -0.876919 -0.008148 -0.480544 +vn 0.877499 0.107974 0.467238 +vn 0.502243 0.107974 -0.857936 +vn -0.234107 0.714316 -0.659474 +vn -0.278024 0.556749 -0.782739 +vn 0.923124 0.124790 -0.363628 +vn -0.945769 0.124790 0.299875 +vn -0.896207 0.015015 0.443342 +vn 0.265023 -0.610279 0.746513 +vn 0.300729 -0.435347 0.848537 +vn 0.974914 0.013855 -0.222083 +vn -0.323069 0.259957 -0.909940 +vn 0.959624 0.061281 -0.274422 +vn -0.917905 0.058443 0.392407 +vn 0.331339 -0.122013 0.935575 +vn -0.394116 0.037843 -0.918241 +vn 0.956542 -0.043428 -0.288308 +vn -0.905057 0.189154 0.380840 +vn 0.306101 0.116306 0.944853 +vn -0.898953 0.104129 -0.425428 +vn 0.398633 -0.237403 -0.885830 +vn -0.382031 0.332408 0.862270 +vn 0.908963 -0.002686 0.416852 +vn -0.519761 0.547746 0.655568 +vn -0.550157 0.464553 0.693899 +vn -0.737541 0.047304 -0.673605 +vn 0.774865 0.086550 0.626148 +vn 0.824061 0.047273 0.564501 +vn 0.562639 -0.424085 -0.709616 +vn 0.585498 -0.334422 -0.738456 +vn -0.786340 0.086550 -0.611682 +vn 0.145848 0.262185 0.953917 +vn -0.962035 0.262185 0.075472 +vn 0.980041 -0.167943 -0.106296 +vn -0.119968 -0.167943 -0.978454 +vn -0.605579 0.312571 -0.731803 +vn -0.972808 0.221290 -0.067904 +vn 0.115329 0.221290 -0.968352 +vn -0.757378 0.069002 0.649281 +vn -0.099643 -0.123569 0.987304 +vn 0.627705 -0.174535 0.758599 +vn 0.988495 -0.123569 0.086856 +vn 0.779534 0.069002 -0.622517 +vn -0.009339 0.909543 0.415448 +vn -0.012604 0.850551 0.525712 +vn -0.993469 -0.005982 -0.113895 +vn 0.995788 0.091281 -0.006897 +vn 0.997681 -0.007355 -0.067537 +vn 0.012085 -0.843776 -0.536485 +vn 0.014008 -0.769127 -0.638905 +vn -0.994446 0.091281 -0.051790 +vn -0.018220 0.669851 0.742241 +vn 0.997101 0.013001 -0.074679 +vn 0.017701 -0.560015 -0.828272 +vn -0.992828 0.012513 -0.118778 +vn -0.021241 0.436659 0.899350 +vn 0.997436 0.043764 -0.056307 +vn 0.020600 -0.308054 -0.951140 +vn -0.993957 0.042817 -0.100803 +vn -0.022828 0.172552 0.984710 +vn 0.996643 0.062838 -0.052278 +vn 0.022034 -0.034669 -0.999146 +vn -0.993378 0.061495 -0.096896 +vn -0.022462 0.043153 0.998810 +vn 0.996918 0.069063 0.036836 +vn 0.022095 0.094852 -0.995239 +vn -0.997589 0.068545 -0.008484 +vn 0.689291 0.050935 0.722648 +vn -0.721152 0.050935 0.690848 +vn 0.722526 0.047426 -0.689688 +vn -0.690695 0.047426 -0.721549 +vn -0.214057 0.974975 -0.059633 +vn -0.302805 0.949278 -0.084353 +vn 0.317606 0.067598 -0.945799 +vn -0.217231 0.067598 0.973754 +vn -0.189428 -0.014710 0.981780 +vn 0.341594 -0.934996 0.095187 +vn 0.426191 -0.896786 0.118748 +vn 0.345561 -0.014710 -0.938261 +vn -0.400159 0.909635 -0.111484 +vn -0.207648 0.030732 0.977691 +vn 0.517716 -0.843287 0.144230 +vn 0.327830 0.030732 -0.944212 +vn -0.476791 0.641957 0.600421 +vn -0.097568 0.641957 -0.760491 +vn 0.180792 -0.594684 0.783349 +vn 0.559832 -0.594653 -0.576983 +vn -0.500687 0.531846 0.682943 +vn 0.215094 0.376507 0.901059 +vn -0.924039 0.376537 0.065920 +vn 0.823908 0.061251 0.563372 +vn 0.951476 -0.289773 -0.103336 +vn 0.539445 -0.409284 -0.735801 +vn -0.187658 -0.289773 -0.938505 +vn -0.785150 0.061251 -0.616260 +vn -0.111332 0.881344 0.459151 +vn -0.077212 0.945280 0.316904 +vn -0.946532 -0.041414 -0.319834 +vn 0.987915 -0.041414 0.149205 +vn 0.972930 0.087741 0.213660 +vn 0.132694 -0.826380 -0.547227 +vn 0.100009 -0.905789 -0.411695 +vn -0.962584 0.088473 -0.256050 +vn -0.055788 0.971831 0.228828 +vn -0.955779 -0.017182 -0.293497 +vn 0.984313 -0.017487 0.175512 +vn 0.079653 -0.941649 -0.326945 +vn -0.092593 0.918088 0.385357 +vn -0.953490 -0.014679 -0.301004 +vn 0.985412 -0.014252 0.169408 +vn 0.116550 -0.869716 -0.479568 +vn -0.145817 0.782983 0.604694 +vn -0.946074 -0.020325 -0.323252 +vn 0.988800 -0.020844 0.147771 +vn 0.165410 -0.711692 -0.682699 +vn -0.176031 0.664174 0.726524 +vn 0.978210 0.042146 0.203192 +vn 0.191351 -0.581225 -0.790918 +vn -0.962676 0.041292 -0.267403 +vn -0.180578 0.642232 0.744896 +vn -0.960112 0.034700 -0.277383 +vn 0.980529 0.034639 0.193213 +vn 0.195807 -0.556291 -0.807550 +vn 0.556047 0.436872 0.707053 +vn -0.818140 0.436872 0.373821 +vn 0.827509 -0.375347 -0.417463 +vn -0.544389 -0.375347 -0.750145 +vn 0.003662 0.992920 -0.118564 +vn 0.001495 0.998657 -0.051241 +vn -0.995911 -0.031037 -0.084811 +vn 0.999207 0.030457 -0.024873 +vn 0.999237 -0.031037 -0.022706 +vn -0.000336 -0.999908 0.011658 +vn 0.001648 -0.998413 -0.056032 +vn -0.995758 0.030457 -0.086612 +vn -0.003143 0.996490 0.083468 +vn 0.999359 -0.022187 -0.027314 +vn 0.006134 -0.981567 -0.190985 +vn -0.995849 -0.021485 -0.088382 +vn 0.131901 0.932707 0.335582 +vn 0.961486 0.008515 -0.274667 +vn 0.059023 -0.877041 -0.476760 +vn -0.984558 -0.149144 0.091617 +vn 0.695425 0.710074 0.110111 +vn -0.587237 0.449934 0.672811 +vn 0.557390 -0.407971 -0.723075 +vn -0.712729 -0.677541 -0.181494 +vn -0.399762 0.716392 0.571795 +vn -0.421125 0.678060 0.602344 +vn -0.787591 0.025666 -0.615619 +vn 0.827631 0.057619 0.558275 +vn 0.848628 0.025666 0.528336 +vn 0.441420 -0.637532 -0.631397 +vn 0.460341 -0.595386 -0.658437 +vn -0.808496 0.057619 -0.585620 +vn 0.266732 0.449507 0.852473 +vn -0.892239 0.449507 0.042146 +vn 0.917325 -0.389599 -0.081668 +vn -0.238258 -0.389599 -0.889615 +vn 0.146519 0.980163 -0.133335 +vn 0.579272 0.693564 0.428205 +vn -0.371868 0.693564 -0.616962 +vn 0.711386 -0.007782 0.702750 +vn 0.427503 -0.704611 0.566332 +vn -0.067934 -0.995758 0.061800 +vn -0.523637 -0.704611 -0.478835 +vn -0.632771 -0.007782 -0.774285 +vn -0.842738 0.520524 0.137242 +vn -0.931242 0.331248 0.151646 +vn -0.058107 0.011322 -0.998230 +vn 0.089572 0.087008 0.992157 +vn 0.261605 0.011322 0.965087 +vn 0.881863 -0.449080 -0.143590 +vn 0.954680 -0.253731 -0.155461 +vn -0.229835 0.087008 -0.969329 +vn -0.986755 -0.021088 0.160680 +vn 0.220496 0.045808 0.974303 +vn 0.981658 0.103732 -0.159856 +vn -0.100009 0.045808 -0.993927 +vn -0.986663 -0.025208 0.160680 +vn 0.094089 0.037477 0.994842 +vn 0.981170 0.108249 -0.159764 +vn -0.226417 0.037477 -0.973296 +vn -0.982604 0.094150 0.160009 +vn -0.146641 0.040559 -0.988342 +vn 0.174505 0.040559 0.983795 +vn 0.986908 -0.011872 -0.160710 +vn -0.974212 -0.160344 0.158635 +vn -0.067202 0.063326 -0.995697 +vn 0.252174 0.063326 0.965575 +vn 0.957213 0.243721 -0.155858 +vn -0.535661 -0.279305 0.796869 +vn -0.760826 -0.279336 -0.585711 +vn 0.741081 0.334941 0.581896 +vn 0.518143 0.334910 -0.786950 +vn -0.075381 0.995880 -0.050264 +vn 0.061251 0.997284 0.040803 +vn -0.594531 -0.069826 0.801019 +vn 0.514481 0.079012 -0.853816 +vn 0.511124 -0.069735 -0.856655 +vn 0.006867 -0.999939 0.004578 +vn -0.129765 -0.987762 -0.086428 +vn -0.590472 0.079012 0.803156 +vn 0.216803 0.965453 0.144475 +vn 0.519059 0.004364 -0.854701 +vn -0.282723 -0.940519 -0.188269 +vn -0.589343 0.003998 0.807855 +vn 0.556505 0.679037 -0.478683 +vn -0.227973 0.679037 0.697745 +vn 0.180883 -0.660726 -0.728477 +vn -0.602985 -0.660726 0.447005 +vn -0.170537 0.780572 0.601306 +vn 0.559282 0.552202 0.618244 +vn -0.800623 0.552202 0.232490 +vn 0.969787 0.027467 0.242317 +vn 0.812769 -0.513321 -0.275399 +vn 0.187750 -0.725639 -0.661946 +vn -0.547136 -0.513321 -0.661153 +vn -0.952605 0.027467 -0.302957 +vn 0.073214 0.997101 -0.019532 +vn 0.042299 0.999054 -0.009919 +vn 0.187750 0.023041 0.981933 +vn -0.327525 -0.003845 -0.944823 +vn -0.324809 0.021180 -0.945524 +vn -0.209937 -0.976104 0.056001 +vn -0.184545 -0.981597 0.048891 +vn 0.186651 -0.003845 0.982391 +vn 0.215705 0.974883 -0.055208 +vn -0.352489 -0.072451 -0.932981 +vn -0.351695 -0.931425 0.093417 +vn 0.161016 -0.070681 0.984405 +vn 0.419935 0.900601 -0.112033 +vn 0.200446 0.036287 0.979003 +vn -0.313883 0.036287 -0.948759 +vn -0.533952 -0.833399 0.142460 +vn 0.493301 0.859828 -0.131596 +vn -0.339152 0.005585 -0.940703 +vn -0.609638 -0.775780 0.162633 +vn 0.174505 0.005585 0.984619 +vn 0.742943 0.639271 -0.198218 +vn -0.379864 -0.003632 -0.925016 +vn -0.823145 -0.523606 0.219611 +vn 0.131382 -0.003632 0.991302 +vn 0.942595 0.219581 -0.251473 +vn 0.146031 0.055239 0.987732 +vn -0.365398 0.055239 -0.929197 +vn -0.963134 -0.079226 0.256966 +vn 0.506424 -0.015137 -0.862117 +vn 0.868587 -0.015137 0.495254 +vn -0.867794 0.115696 -0.483261 +vn -0.511704 0.115696 0.851314 +vn 0.004761 0.999969 0.003998 +vn 0.157994 0.978393 0.133213 +vn -0.711234 -0.069796 0.699454 +vn 0.588855 0.112217 -0.800378 +vn 0.565844 -0.070467 -0.821467 +vn -0.111698 -0.989288 -0.093631 +vn -0.263436 -0.939146 -0.220374 +vn -0.685232 0.112217 0.719596 +vn 0.455428 0.803613 0.383068 +vn 0.547014 -0.026643 -0.836665 +vn -0.539232 -0.711295 -0.450819 +vn -0.727287 -0.027924 0.685720 +vn 0.624683 0.511887 0.589648 +vn 0.594501 -0.032350 -0.803400 +vn -0.716361 -0.379986 -0.585131 +vn -0.744682 0.090091 0.661275 +vn 0.987518 0.147008 -0.056185 +vn 0.005280 0.340220 0.940306 +vn -0.034608 -0.245888 -0.968657 +vn -0.998291 -0.054231 0.020783 +vn 0.736167 0.661855 0.141270 +vn 0.825098 0.542283 0.158330 +vn -0.168676 0.104404 0.980102 +vn 0.206122 0.104404 -0.972930 +vn 0.093661 0.029359 -0.995148 +vn -0.820490 -0.549516 -0.157445 +vn -0.892392 -0.417463 -0.171270 +vn -0.281381 0.029359 0.959136 +vn 0.770470 0.283700 -0.570818 +vn 0.504410 0.283700 0.815516 +vn -0.546190 -0.191412 -0.815455 +vn -0.809290 -0.191412 0.555315 +vn 0.088778 0.797876 0.596210 +vn 0.761345 0.564898 0.318094 +vn -0.635609 0.564898 0.526139 +vn 0.978607 0.047090 -0.200171 +vn 0.624378 -0.498184 -0.601581 +vn -0.104648 -0.703665 -0.702750 +vn -0.772576 -0.498184 -0.393536 +vn -0.994476 0.047090 0.093631 +vn -0.068392 0.923185 -0.378155 +vn -0.078951 0.894620 -0.439711 +vn 0.988769 0.061007 -0.136204 +vn -0.973846 0.061007 0.218848 +vn -0.968627 0.004517 0.248360 +vn 0.088992 -0.865993 0.492019 +vn 0.099734 -0.828852 0.550462 +vn 0.994354 0.005493 -0.105808 +vn -0.109806 0.784143 -0.610767 +vn -0.963897 -0.000946 0.266152 +vn 0.127537 -0.696890 0.705710 +vn 0.995849 -0.002258 -0.090915 +vn -0.138554 0.626240 -0.767205 +vn 0.993469 0.032197 -0.109317 +vn -0.969085 0.029725 0.244911 +vn 0.151555 -0.520005 0.840571 +vn -0.163427 0.383587 -0.908902 +vn -0.958983 0.033784 0.281381 +vn 0.171697 -0.260598 0.950041 +vn 0.996704 0.032319 -0.074007 +vn -0.176427 0.131260 -0.975494 +vn 0.986877 0.062838 -0.148595 +vn -0.976348 0.061800 0.207068 +vn 0.177526 -0.003510 0.984100 +vn -0.821314 0.052187 -0.568041 +vn 0.570238 0.052187 -0.819788 +vn -0.567095 0.039277 0.822687 +vn 0.819391 0.039277 0.571825 +vn -0.019837 0.895688 0.444197 +vn -0.029054 0.762596 0.646199 +vn -0.985046 -0.034883 -0.168676 +vn 0.988464 0.142216 0.051973 +vn 0.996185 -0.035524 -0.079501 +vn 0.024659 -0.833003 -0.552660 +vn 0.032746 -0.673940 -0.738029 +vn -0.989166 0.142216 -0.036317 +vn -0.041810 0.376415 0.925474 +vn 0.996857 0.030122 -0.073000 +vn 0.042665 -0.255104 -0.965941 +vn -0.986511 0.028321 -0.161046 +vn 0.670125 0.105991 0.734611 +vn -0.732963 0.105991 0.671926 +vn 0.723289 -0.016785 -0.690329 +vn -0.658834 -0.016785 -0.752068 +vn 0.485214 0.751152 -0.447554 +vn -0.135441 0.531693 -0.836024 +vn 0.822382 0.531693 0.202399 +vn -0.710196 0.045747 -0.702475 +vn -0.869961 -0.466903 -0.158483 +vn -0.552446 -0.659597 0.509568 +vn 0.087832 -0.466903 0.879910 +vn 0.642933 0.045747 0.764519 +vn -0.051881 0.859737 0.508072 +vn -0.049013 0.875210 0.481216 +vn -0.988556 0.014008 -0.150029 +vn 0.998474 0.014008 0.052889 +vn 0.996979 0.037721 0.067721 +vn 0.060091 -0.806269 -0.588427 +vn 0.057527 -0.824091 -0.563494 +vn -0.990112 0.037507 -0.135075 +vn -0.052828 0.853725 0.517960 +vn -0.986938 -0.001099 -0.160985 +vn 0.999084 -0.001343 0.042543 +vn 0.060915 -0.799188 -0.597949 +vn -0.063967 0.778222 0.624683 +vn 0.998657 0.014283 0.049440 +vn 0.070833 -0.714011 -0.696524 +vn -0.988067 0.013947 -0.153233 +vn -0.069857 0.724479 0.685720 +vn 0.997864 0.027009 0.058992 +vn 0.076724 -0.653951 -0.752586 +vn -0.989257 0.026307 -0.143651 +vn -0.081698 0.588824 0.804071 +vn -0.982482 0.002747 -0.186224 +vn 0.999847 0.002380 0.017029 +vn 0.087405 -0.507523 -0.857173 +vn -0.093570 0.390088 0.915983 +vn 0.997864 0.034577 0.055208 +vn 0.096713 -0.299692 -0.949095 +vn -0.988433 0.034028 -0.147649 +vn 0.635334 0.228278 0.737693 +vn -0.771355 0.228278 0.594012 +vn 0.771111 -0.163121 -0.615406 +vn -0.630787 -0.163121 -0.758599 +vn 0.014985 0.998627 -0.049867 +vn -0.035127 0.992523 0.116703 +vn -0.935667 -0.070467 -0.345744 +vn 0.966826 0.087130 0.240059 +vn 0.970946 -0.070376 0.228675 +vn 0.012452 -0.999054 -0.041444 +vn 0.062075 -0.976318 -0.207129 +vn -0.938749 0.087130 -0.333323 +vn -0.110050 0.924619 0.364635 +vn 0.973266 -0.015198 0.229041 +vn 0.134770 -0.883602 -0.448347 +vn -0.938383 -0.015442 -0.345225 +vn -0.058473 0.799554 0.597736 +vn 0.995544 0.083468 0.043458 +vn 0.241523 -0.718772 -0.651906 +vn -0.964812 -0.143376 -0.220313 +vn 0.583728 0.646901 0.490616 +vn -0.794946 0.297281 0.528794 +vn 0.782189 -0.248329 -0.571368 +vn -0.582751 -0.602039 -0.545793 +vn -0.378521 0.752068 -0.539537 +vn -0.426984 0.668752 -0.608600 +vn 0.812616 0.076144 -0.577746 +vn -0.819819 0.076144 0.567522 +vn -0.774560 0.003143 0.632466 +vn 0.418256 -0.685232 0.596179 +vn 0.462050 -0.593890 0.658589 +vn 0.858303 0.003143 -0.513108 +vn -0.911771 0.404584 -0.070101 +vn 0.244331 0.404584 -0.881222 +vn -0.218055 -0.348918 0.911405 +vn 0.931211 -0.348888 0.105075 +vn 0.011750 0.998810 0.047151 +vn 0.693960 0.706687 -0.137730 +vn -0.677328 0.706687 0.204474 +vn 0.957396 0.004669 -0.288614 +vn 0.660787 -0.700034 -0.270699 +vn -0.035127 -0.989410 -0.140751 +vn -0.710501 -0.700034 0.071505 +vn -0.980773 0.004669 0.195044 +vn 0.144047 0.960204 0.239143 +vn 0.146153 0.959136 0.242164 +vn -0.873623 0.009125 0.486496 +vn 0.839259 0.012970 -0.543535 +vn 0.838374 0.009552 -0.544969 +vn -0.178350 -0.938322 -0.296091 +vn -0.180700 -0.936705 -0.299814 +vn -0.872860 0.012970 0.487747 +vn 0.219337 0.905362 0.363506 +vn -0.886349 -0.043550 0.460952 +vn 0.822382 -0.043397 -0.567217 +vn -0.251686 -0.873165 -0.417341 +vn 0.329264 0.769646 0.546983 +vn 0.825770 -0.011231 -0.563860 +vn -0.356456 -0.723350 -0.591296 +vn -0.884457 -0.011505 0.466445 +vn 0.414869 0.594165 0.689077 +vn 0.817469 -0.006348 -0.575884 +vn -0.435469 -0.536576 -0.722770 +vn -0.891171 -0.006531 0.453536 +vn 0.457717 0.461592 0.759850 +vn 0.845241 0.028687 -0.533586 +vn -0.473251 -0.398724 -0.785485 +vn -0.866909 0.028443 0.497604 +vn 0.931791 0.317057 0.176641 +vn -0.279489 0.317057 0.906278 +vn 0.268349 -0.272195 -0.924039 +vn -0.942289 -0.272195 -0.194800 +vn 0.100955 0.924680 0.367077 +vn 0.116550 0.898312 0.423566 +vn -0.975036 -0.009491 0.221778 +vn 0.958068 0.042787 -0.283212 +vn 0.951292 -0.009369 -0.308115 +vn -0.117832 -0.895840 -0.428419 +vn -0.132878 -0.865352 -0.483169 +vn -0.968169 0.042787 0.246559 +vn 0.161870 0.792413 0.588061 +vn -0.979339 -0.024812 0.200568 +vn 0.944243 -0.024842 -0.328227 +vn -0.176061 -0.747795 -0.640126 +vn 0.814264 0.496323 0.301035 +vn -0.545762 0.496292 0.675100 +vn 0.533036 -0.462203 -0.708670 +vn -0.820460 -0.462203 -0.336406 +vn -0.827998 0.283212 0.483902 +vn -0.228980 0.200323 0.952574 +vn -0.942351 0.200323 -0.267983 +vn 0.511795 0.033876 0.858425 +vn 0.953001 -0.152379 0.261757 +vn 0.843074 -0.215461 -0.492721 +vn 0.239631 -0.152379 -0.958800 +vn -0.496750 0.033876 -0.867214 +vn -0.131535 0.988891 0.069063 +vn -0.160680 0.983367 0.084567 +vn 0.401929 0.007538 0.915616 +vn -0.522691 -0.022401 -0.852199 +vn -0.525254 0.007416 -0.850887 +vn 0.011261 -0.999908 -0.005921 +vn 0.040437 -0.998932 -0.021210 +vn 0.404797 -0.022401 0.914121 +vn -0.128452 0.989349 0.068331 +vn -0.521378 -0.038881 -0.852412 +vn 0.007355 -0.999939 -0.003571 +vn 0.404828 -0.038484 0.913541 +vn 0.041505 0.998901 -0.020936 +vn -0.529557 -0.044862 -0.847072 +vn -0.161138 -0.983276 0.084628 +vn 0.398877 -0.044527 0.915891 +vn 0.151616 0.985229 -0.079196 +vn 0.404187 0.015473 0.914518 +vn -0.522233 0.014252 -0.852657 +vn -0.268990 -0.952788 0.140660 +vn 0.300882 0.940580 -0.157231 +vn -0.547105 -0.044465 -0.835841 +vn -0.412244 -0.884976 0.216407 +vn 0.378643 -0.044313 0.924467 +vn 0.547655 0.785577 -0.287912 +vn 0.380596 -0.001617 0.924711 +vn -0.544755 -0.001709 -0.838557 +vn -0.636311 -0.695273 0.334147 +vn 0.126988 0.486679 -0.864284 +vn 0.783593 0.486679 0.386120 +vn -0.839167 -0.416883 -0.349254 +vn -0.188879 -0.416883 0.889096 +vn 0.310526 0.630696 0.711173 +vn 0.309305 0.636433 0.706565 +vn 0.934294 -0.046571 -0.353404 +vn -0.894253 -0.046571 0.445082 +vn -0.896664 -0.052797 0.439528 +vn -0.273324 -0.730399 -0.625935 +vn -0.270608 -0.737053 -0.619251 +vn 0.932340 -0.052950 -0.357646 +vn 0.234626 0.809107 0.538743 +vn -0.908475 -0.130345 0.397076 +vn -0.187414 -0.882199 -0.431959 +vn 0.908322 -0.131901 -0.396863 +vn 0.439772 0.856227 0.271004 +vn -0.984527 0.132939 -0.113926 +vn 0.052950 -0.998566 -0.007202 +vn 0.934507 -0.248848 0.254402 +vn -0.354869 0.771569 -0.527909 +vn 0.607776 0.434675 0.664541 +vn -0.663289 -0.465651 -0.585772 +vn 0.312296 -0.738884 0.597064 +vn -0.363445 0.928922 -0.070589 +vn -0.211554 0.976501 -0.041078 +vn -0.245064 -0.084353 0.965819 +vn 0.100558 0.059389 -0.993133 +vn 0.134251 -0.084353 -0.987335 +vn 0.237831 -0.970183 0.046175 +vn 0.079928 -0.996673 0.015503 +vn -0.278481 0.059389 0.958586 +vn 0.104007 0.708213 -0.698264 +vn -0.164892 0.708213 0.686453 +vn 0.069094 -0.713920 -0.696768 +vn -0.196722 -0.713920 0.671987 +vn -0.181097 0.836024 0.517869 +vn -0.794885 0.591845 0.133488 +vn 0.538469 0.591845 0.599750 +vn -0.961364 -0.033418 -0.273202 +vn -0.566240 -0.639180 -0.520341 +vn 0.141850 -0.902890 -0.405713 +vn 0.767113 -0.639180 -0.054079 +vn 0.922117 -0.033418 0.385388 +vn -0.073031 0.593616 -0.801416 +vn -0.081515 0.440535 -0.894009 +vn 0.985473 0.105625 -0.132908 +vn -0.993255 0.105625 0.047426 +vn -0.980987 0.029633 0.191687 +vn 0.079379 -0.484573 0.871120 +vn 0.085238 -0.321421 0.943083 +vn 0.999542 0.028169 0.009796 +vn -0.088565 0.200018 -0.975768 +vn 0.996643 0.062227 -0.052614 +vn -0.989837 0.058992 0.129368 +vn 0.089602 -0.071596 0.993378 +vn -0.090243 0.004913 -0.995880 +vn -0.986816 0.070833 0.145421 +vn 0.090487 0.128666 0.987518 +vn 0.996918 0.070040 -0.035279 +vn -0.090670 0.091189 -0.991668 +vn 0.979247 0.069277 -0.190374 +vn -0.997497 0.069613 -0.011109 +vn 0.091403 0.041139 0.994934 +vn -0.090121 0.128971 -0.987518 +vn -0.980865 0.059969 0.185186 +vn 0.090823 0.000977 0.995849 +vn 0.998169 0.059999 0.004944 +vn -0.764977 -0.058321 -0.641377 +vn 0.636402 -0.058321 -0.769127 +vn -0.627216 0.151006 0.764061 +vn 0.754997 0.151006 0.638050 +vn -0.340892 0.905759 0.251656 +vn -0.490738 0.792383 0.362255 +vn -0.496597 -0.032167 -0.867367 +vn 0.590808 0.131596 0.795984 +vn 0.682607 -0.032167 0.730033 +vn 0.431532 -0.843959 -0.318552 +vn 0.569018 -0.706931 -0.420026 +vn -0.586627 0.131596 -0.799066 +vn -0.681570 0.531266 0.503128 +vn 0.656331 0.031648 0.753777 +vn 0.731651 -0.415845 -0.540086 +vn -0.527024 0.031648 -0.849239 +vn -0.097507 0.296213 0.950102 +vn -0.936674 0.296213 -0.186651 +vn 0.964324 -0.211493 0.159001 +vn 0.132054 -0.211493 -0.968383 +vn 0.320719 0.086276 0.943205 +vn 0.895749 0.061068 0.440291 +vn -0.441694 0.061068 0.895077 +vn 0.944243 0.065889 -0.322489 +vn 0.441054 0.032197 -0.896878 +vn -0.321574 0.045473 -0.945769 +vn -0.896359 0.032197 -0.442091 +vn -0.945128 0.065889 0.319926 +vn -0.035249 0.754021 0.655873 +vn -0.029878 0.818720 0.573382 +vn -0.991546 0.002472 -0.129704 +vn 0.999725 0.002472 -0.022675 +vn 0.996551 0.073885 0.037507 +vn 0.039552 -0.675649 -0.736137 +vn 0.035218 -0.746086 -0.664876 +vn -0.994964 0.072024 -0.069460 +vn -0.034669 0.734397 0.677786 +vn -0.984100 -0.035340 -0.173956 +vn 0.997345 -0.035127 -0.063692 +vn 0.039308 -0.651875 -0.757256 +vn -0.047365 0.437544 0.897916 +vn 0.999298 0.033052 -0.016511 +vn 0.049379 -0.335582 -0.940703 +vn -0.991821 0.028901 -0.124058 +vn -0.052004 0.116581 0.991791 +vn -0.986389 0.052126 -0.155736 +vn 0.997559 0.050569 -0.047884 +vn 0.053621 -0.002594 -0.998535 +vn -0.053407 0.074374 0.995788 +vn 0.988739 0.058077 0.137761 +vn 0.053438 0.037080 -0.997864 +vn -0.997833 0.057985 0.030702 +vn -0.053468 0.068392 0.996216 +vn -0.987610 0.055605 -0.146580 +vn 0.997650 0.055574 -0.039766 +vn 0.053591 0.043672 -0.997589 +vn 0.664174 -0.102878 0.740440 +vn -0.739738 -0.102878 0.664968 +vn 0.730979 0.181951 -0.657643 +vn -0.656270 0.181951 -0.732231 +vn 0.041780 0.992126 0.117801 +vn 0.068484 0.978698 0.193396 +vn -0.961821 -0.021485 0.272774 +vn 0.924039 0.050722 -0.378826 +vn 0.918821 -0.021638 -0.393994 +vn -0.078799 -0.971831 -0.222053 +vn -0.105106 -0.949370 -0.295969 +vn -0.956175 0.050722 0.288278 +vn 0.123630 0.929197 0.348247 +vn 0.917081 -0.011658 -0.398450 +vn -0.158238 -0.881252 -0.445357 +vn -0.962889 -0.012452 0.269570 +vn 0.107944 0.766533 0.633045 +vn -0.993744 0.064760 0.090884 +vn 0.936521 -0.144353 -0.319437 +vn -0.273537 -0.673849 -0.686331 +vn 0.826350 0.246040 0.506516 +vn -0.544115 0.571429 0.614307 +vn 0.535691 -0.511551 -0.671804 +vn -0.813013 -0.185827 -0.551744 +vn -0.230079 0.920377 0.316111 +vn -0.345408 0.809564 0.474593 +vn -0.738548 -0.044435 -0.672689 +vn 0.801447 0.128574 0.584063 +vn 0.867183 -0.044404 0.495956 +vn 0.288095 -0.871944 -0.395856 +vn 0.396344 -0.739097 -0.544603 +vn -0.802179 0.128574 -0.583056 +vn 0.247597 0.461501 0.851863 +vn -0.886715 0.461501 0.026276 +vn 0.911466 -0.404218 -0.076113 +vn -0.207770 -0.404218 -0.890713 +vn -0.110050 0.990783 0.078799 +vn 0.333476 0.701132 0.630177 +vn -0.489242 0.701132 -0.518632 +vn 0.626362 0.010773 0.779443 +vn 0.552995 -0.685873 0.472976 +vn 0.200110 -0.969207 -0.143315 +vn -0.269723 -0.685873 -0.675832 +vn -0.536271 0.010773 -0.843959 +vn 0.122349 0.925443 0.358562 +vn 0.132511 0.912381 0.387280 +vn -0.959258 0.003601 0.282479 +vn 0.936186 0.031465 -0.350047 +vn 0.931761 0.004181 -0.363018 +vn -0.145482 -0.892727 -0.426435 +vn -0.155370 -0.876736 -0.455123 +vn -0.954894 0.031465 0.295175 +vn 0.186377 0.817713 0.544603 +vn -0.967589 -0.032411 0.250343 +vn 0.919340 -0.032411 -0.392102 +vn -0.206519 -0.769463 -0.604327 +vn 0.241462 0.665029 0.706687 +vn 0.929411 0.011505 -0.368847 +vn -0.257698 -0.604144 -0.754021 +vn -0.960997 0.010254 0.276254 +vn 0.292062 0.430036 0.854244 +vn -0.975127 -0.001129 0.221564 +vn 0.907559 -0.001495 -0.419874 +vn -0.301828 -0.357067 -0.883938 +vn 0.321696 0.087405 0.942778 +vn 0.923399 0.036470 -0.382061 +vn -0.323130 -0.009491 -0.946287 +vn -0.964415 0.035890 0.261818 +vn 0.896176 -0.037141 0.442122 +vn -0.439009 -0.037141 0.897702 +vn 0.435774 0.092807 -0.895230 +vn -0.892117 0.092807 -0.442122 +vn 0.197241 0.973724 -0.113620 +vn 0.316904 0.930692 -0.182562 +vn 0.481002 0.078921 0.873135 +vn -0.514084 0.078921 -0.854091 +vn -0.552110 -0.044679 -0.832545 +vn -0.262398 -0.953032 0.151158 +vn -0.379192 -0.899136 0.218451 +vn 0.443281 -0.044679 0.895230 +vn 0.479690 0.832759 -0.276345 +vn 0.456679 -0.000122 0.889615 +vn -0.540513 -0.000122 -0.841304 +vn -0.534562 -0.786981 0.307962 +vn 0.018311 0.562609 -0.826472 +vn 0.724174 0.562639 0.398724 +vn -0.761498 -0.528489 -0.375164 +vn -0.057375 -0.528489 0.846980 +vn -0.123600 0.739525 -0.661641 +vn -0.782250 0.523118 -0.338206 +vn 0.607349 0.523118 -0.597858 +vn -0.977050 0.027650 0.211127 +vn -0.600055 -0.483963 0.636921 +vn 0.133915 -0.684194 0.716880 +vn 0.789544 -0.483963 0.377300 +vn 0.987365 0.027650 -0.155889 +vn 0.011963 0.998505 -0.053285 +vn -0.011383 0.998474 0.053713 +vn 0.962584 0.049654 0.266305 +vn -0.984619 -0.048280 -0.167791 +vn -0.983917 0.048616 -0.171850 +vn -0.032350 -0.989044 0.143986 +vn -0.009552 -0.999115 0.040742 +vn 0.961760 -0.048280 0.269478 +vn 0.015625 0.997894 -0.062899 +vn -0.982086 -0.100284 -0.159429 +vn -0.035798 -0.987335 0.154363 +vn 0.956603 -0.098148 0.274300 +vn 0.076968 0.938108 -0.337626 +vn 0.963012 0.000000 0.269417 +vn -0.985534 -0.002930 -0.169378 +vn -0.095767 -0.902036 0.420881 +vn 0.133274 0.798364 -0.587176 +vn -0.992279 -0.055116 -0.110965 +vn -0.148686 -0.737419 0.658834 +vn 0.945158 -0.054750 0.321940 +vn 0.187323 0.520066 -0.833308 +vn 0.957762 0.014832 0.287118 +vn -0.988586 0.013550 -0.149968 +vn -0.197516 -0.439589 0.876186 +vn 0.202704 0.380474 -0.902280 +vn 0.967925 0.039247 0.248054 +vn -0.981048 0.038881 -0.189795 +vn -0.209754 -0.292306 0.933012 +vn -0.544603 0.246803 -0.801538 +vn 0.835139 0.246803 -0.491531 +vn -0.838710 -0.183813 0.512558 +vn 0.538865 -0.183813 0.822077 +vn 0.242286 0.912748 -0.328867 +vn 0.252663 0.904782 -0.342784 +vn 0.781823 0.029725 0.622761 +vn -0.826472 0.029725 -0.562151 +vn -0.831233 0.014130 -0.555681 +vn -0.292032 -0.870357 0.396405 +vn -0.301950 -0.860683 0.409894 +vn 0.776971 0.014283 0.629353 +vn 0.308847 0.853511 -0.419599 +vn -0.840175 -0.006592 -0.542253 +vn -0.355144 -0.800531 0.482650 +vn 0.766778 -0.007202 0.641835 +vn 0.521439 0.736229 -0.431318 +vn -0.697165 -0.212531 -0.684652 +vn -0.408399 -0.614551 0.674886 +vn 0.578509 0.194403 0.792138 +vn 0.065767 0.122135 -0.990326 +vn 0.663015 0.726676 0.179785 +vn -0.712729 -0.683370 -0.157933 +vn -0.105716 -0.072695 0.991729 +vn -0.883999 0.451796 0.119907 +vn -0.898221 0.422285 0.121830 +vn -0.102756 0.037751 -0.993957 +vn 0.138676 0.049501 0.989074 +vn 0.165746 0.037751 0.985412 +vn 0.922117 -0.366070 -0.125095 +vn 0.933531 -0.335307 -0.126621 +vn -0.129856 0.049501 -0.990265 +vn -0.549852 0.276498 0.788141 +vn -0.739982 0.276498 -0.613147 +vn 0.763756 -0.214515 0.608783 +vn 0.573931 -0.214515 -0.790277 +vn 0.224219 0.966613 -0.123905 +vn -0.183172 0.683859 -0.706198 +vn 0.500473 0.683859 0.530869 +vn -0.522355 0.014161 -0.852596 +vn -0.555956 -0.663808 -0.500198 +vn -0.302683 -0.938261 0.167272 +vn 0.127659 -0.663808 0.736869 +vn 0.443892 0.014161 0.895932 +vn -0.035615 0.999329 -0.003906 +vn -0.154363 0.987854 -0.016968 +vn 0.145726 0.062258 -0.987335 +vn -0.072176 0.062258 0.995422 +vn -0.057863 -0.045656 0.997253 +vn 0.117740 -0.992950 0.012940 +vn 0.234901 -0.971648 0.025819 +vn 0.160100 -0.045656 -0.986023 +vn -0.347636 0.936827 -0.038209 +vn -0.057619 -0.015656 0.998199 +vn 0.423566 -0.904630 0.046541 +vn 0.160527 -0.015656 -0.986877 +vn -0.435041 0.899106 -0.047792 +vn -0.068941 0.012970 0.997528 +vn 0.508011 -0.859493 0.055818 +vn 0.149327 0.012970 -0.988678 +vn -0.448347 0.892483 -0.049257 +vn -0.073519 0.021455 0.997040 +vn 0.520798 -0.851741 0.057222 +vn 0.144749 0.021455 -0.989227 +vn -0.496658 0.866207 -0.054567 +vn 0.158422 -0.000122 -0.987365 +vn -0.059786 -0.000122 0.998199 +vn 0.566820 -0.821436 0.062288 +vn -0.464675 0.590014 0.660237 +vn -0.310190 0.590045 -0.745384 +vn 0.358959 -0.556902 0.748985 +vn 0.513047 -0.556902 -0.653127 +vn 0.503769 0.858760 0.093112 +vn 0.461989 0.882748 0.085360 +vn 0.229011 0.001495 -0.973418 +vn -0.134037 0.001495 0.990966 +vn -0.153600 -0.038697 0.987365 +vn -0.431654 -0.898465 -0.079775 +vn -0.386944 -0.919309 -0.071505 +vn 0.209418 -0.038697 -0.977050 +vn 0.192083 0.980712 0.035493 +vn -0.156194 -0.113620 0.981140 +vn -0.111789 -0.993500 -0.020661 +vn 0.204779 -0.113620 -0.972167 +vn -0.163976 0.713431 0.681234 +vn 0.090335 0.713431 -0.694845 +vn -0.031404 -0.714988 0.698386 +vn 0.220283 -0.714988 -0.663472 +vn 0.026612 0.999420 0.020814 +vn -0.416547 0.706992 0.571490 +vn 0.454207 0.706992 -0.542039 +vn -0.582568 0.000305 0.812738 +vn -0.407697 -0.706534 0.578417 +vn 0.039155 -0.998749 0.030610 +vn 0.463088 -0.706534 -0.535081 +vn 0.648366 0.000305 -0.761315 +vn 0.035249 0.890469 0.453597 +vn 0.021393 0.960143 0.278603 +vn -0.997864 -0.064852 0.004456 +vn 0.986572 -0.064852 -0.149785 +vn 0.992492 0.091372 -0.081057 +vn -0.039583 -0.859584 -0.509445 +vn -0.026093 -0.940489 -0.338755 +vn -0.993072 0.091922 0.073061 +vn 0.013977 0.982696 0.184637 +vn -0.998657 -0.036378 0.036714 +vn 0.992309 -0.036866 -0.118046 +vn -0.019013 -0.969054 -0.246071 +vn 0.022248 0.958281 0.284921 +vn 0.993988 0.008850 -0.108860 +vn -0.027070 -0.937712 -0.346294 +vn -0.998871 0.008484 0.046327 +vn 0.028962 0.928098 0.371197 +vn -0.999207 -0.023560 0.031343 +vn 0.992096 -0.023530 -0.123142 +vn -0.033540 -0.901822 -0.430738 +vn 0.035585 0.888394 0.457686 +vn 0.994171 0.014039 -0.106845 +vn -0.040040 -0.856685 -0.514206 +vn -0.998718 0.013886 0.048158 +vn 0.038514 0.867824 0.495346 +vn -0.999146 0.002228 0.040620 +vn 0.993439 0.002228 -0.114231 +vn -0.042787 -0.833613 -0.550645 +vn 0.734031 0.599322 0.319285 +vn -0.675863 0.599322 0.428907 +vn 0.671987 -0.574358 -0.467452 +vn -0.736137 -0.574358 -0.357952 +vn -0.126530 0.991821 -0.015717 +vn -0.286935 0.957274 -0.035676 +vn 0.177404 -0.060884 -0.982238 +vn -0.103793 0.084475 0.990997 +vn -0.068575 -0.060884 0.995758 +vn 0.189489 -0.981597 0.023560 +vn 0.347545 -0.936644 0.043214 +vn 0.142064 0.084475 -0.986236 +vn -0.551561 0.831294 -0.068422 +vn -0.063448 -0.026917 0.997620 +vn 0.604541 -0.792993 0.075167 +vn 0.182714 -0.027192 -0.982757 +vn -0.735252 0.642598 -0.215461 +vn 0.331980 0.122745 -0.935240 +vn -0.173223 -0.165868 0.970794 +vn 0.821345 -0.567400 0.058260 +vn -0.854915 0.129765 0.502243 +vn -0.342936 0.563128 -0.751823 +vn 0.370006 -0.526292 0.765557 +vn 0.870235 -0.092288 -0.483840 +vn -0.397992 0.288278 -0.870876 +vn -0.414197 0.083987 -0.906278 +vn 0.867000 0.057497 -0.494949 +vn -0.941649 0.057497 0.331614 +vn -0.864986 0.027772 0.500992 +vn 0.404828 -0.226722 0.885830 +vn 0.415571 -0.019501 0.909330 +vn 0.944884 0.027772 -0.326151 +vn -0.931608 -0.093265 -0.351238 +vn 0.344096 -0.093265 -0.934263 +vn -0.340739 0.139012 0.929807 +vn 0.926054 0.139012 0.350841 +vn -0.289682 0.952025 0.098483 +vn 0.022645 0.673360 0.738945 +vn -0.432447 0.673360 -0.599628 +vn 0.350749 0.010956 0.936369 +vn 0.473525 -0.657826 0.585650 +vn 0.347789 -0.930082 -0.118229 +vn 0.018433 -0.657826 -0.752922 +vn -0.292673 0.010956 -0.956145 +vn 0.139073 0.874660 -0.464309 +vn 0.137577 0.877621 -0.459120 +vn 0.945921 0.026521 0.323222 +vn -0.968657 0.021760 -0.247353 +vn -0.967834 0.026399 -0.250130 +vn -0.161687 -0.826044 0.539842 +vn -0.160253 -0.829432 0.535081 +vn 0.945128 0.021760 0.325877 +vn 0.147740 0.857326 -0.493057 +vn -0.971221 0.007691 -0.237953 +vn -0.169866 -0.805994 0.567003 +vn 0.942228 0.007599 0.334849 +vn 0.160741 0.828669 -0.536119 +vn 0.945799 0.026429 0.323588 +vn -0.967895 0.025941 -0.249886 +vn -0.182104 -0.773064 0.607593 +vn 0.193976 0.737846 -0.646443 +vn -0.977599 -0.012787 -0.209998 +vn -0.212592 -0.672018 0.709311 +vn 0.932310 -0.012909 0.361339 +vn 0.233222 0.582415 -0.778680 +vn 0.942778 0.024079 0.332530 +vn -0.970336 0.023621 -0.240577 +vn -0.247810 -0.505112 0.826685 +vn -0.505387 0.375561 -0.776849 +vn 0.849239 0.375561 -0.371044 +vn -0.857082 -0.319498 0.404096 +vn 0.493759 -0.319498 0.808740 +vn 0.821284 0.570421 0.007141 +vn 0.869259 0.494247 0.007569 +vn 0.004425 0.062899 0.997986 +vn 0.021821 0.062899 -0.997772 +vn -0.049165 0.022553 -0.998505 +vn -0.870357 -0.492294 -0.007569 +vn -0.911222 -0.411817 -0.007935 +vn -0.066591 0.022553 0.997497 +vn 0.948576 0.316416 0.008240 +vn -0.066073 0.031983 0.997284 +vn -0.048677 0.031983 -0.998291 +vn -0.973754 -0.227302 -0.008484 +vn 0.697378 0.151616 -0.700461 +vn 0.685049 0.151616 0.712516 +vn -0.699454 -0.087771 -0.709250 +vn -0.711692 -0.087771 0.696951 +vn 0.703635 0.514847 -0.489669 +vn 0.094119 0.364238 -0.926511 +vn 0.901486 0.364238 0.233619 +vn -0.588610 0.040773 -0.807367 +vn -0.927030 -0.306558 -0.215857 +vn -0.739738 -0.433302 0.514786 +vn -0.119663 -0.306558 0.944273 +vn 0.552538 0.040773 0.832453 +vn -0.476852 0.878018 0.041047 +vn -0.315012 0.948668 0.027100 +vn -0.007416 -0.054720 -0.998444 +vn 0.163305 -0.054720 0.985046 +vn 0.093783 0.089389 0.991546 +vn 0.542985 -0.838404 -0.046724 +vn 0.387402 -0.921293 -0.033326 +vn -0.077029 0.089389 -0.992981 +vn -0.221686 0.974914 0.019074 +vn -0.038911 -0.027589 -0.998840 +vn 0.132359 -0.027589 0.990814 +vn 0.294626 -0.955260 -0.025361 +vn -0.481643 0.875362 0.041444 +vn -0.004944 -0.055605 -0.998413 +vn 0.165716 -0.055605 0.984588 +vn 0.550249 -0.833644 -0.047365 +vn -0.746971 0.661702 0.064302 +vn 0.158361 -0.008789 0.987335 +vn 0.796167 -0.601123 -0.068514 +vn -0.012665 -0.008789 -0.999878 +vn -0.938719 0.335002 0.080782 +vn 0.031343 0.006073 -0.999481 +vn 0.201697 0.006073 0.979400 +vn 0.962523 -0.258187 -0.082827 +vn -0.985076 -0.149571 0.084780 +vn 0.183142 0.058992 0.981292 +vn 0.970550 0.225806 -0.083529 +vn 0.012726 0.058992 -0.998169 +vn -0.596454 -0.276162 0.753594 +vn -0.716483 -0.276193 -0.640584 +vn 0.698813 0.328593 0.635304 +vn 0.579943 0.328593 -0.745415 +vn 0.069216 0.978637 -0.193487 +vn 0.096744 0.957762 -0.270791 +vn 0.930601 0.049776 0.362590 +vn -0.949431 0.049776 -0.309915 +vn -0.956938 -0.023804 -0.289224 +vn -0.094760 -0.959563 0.264962 +vn -0.121921 -0.932188 0.340770 +vn 0.923368 -0.023988 0.383129 +vn 0.163244 0.874844 -0.456008 +vn 0.917356 -0.028169 0.397015 +vn -0.960875 -0.028779 -0.275460 +vn -0.186407 -0.833094 0.520737 +vn 0.053621 0.648976 -0.758873 +vn 0.932859 -0.257332 0.252022 +vn -0.984252 0.176092 -0.013642 +vn -0.322214 -0.533036 0.782281 +vn -0.528275 0.612201 -0.588275 +vn 0.741234 -0.043672 -0.669790 +vn -0.719626 0.085696 0.689016 +vn 0.535264 -0.566057 0.626911 +vn 0.814875 0.570299 0.103397 +vn 0.832148 0.544359 0.105594 +vn -0.134007 0.041261 0.990112 +vn 0.117527 0.041292 -0.992187 +vn 0.093661 0.026460 -0.995239 +vn -0.856777 -0.504074 -0.108707 +vn -0.871975 -0.476852 -0.110630 +vn -0.157872 0.026460 0.987091 +vn 0.689474 0.365551 -0.625233 +vn 0.511460 0.365551 0.777642 +vn -0.538957 -0.317301 -0.780267 +vn -0.716758 -0.317301 0.620899 +vn 0.132817 0.990966 -0.018250 +vn -0.002380 0.700980 -0.713157 +vn 0.190283 0.700980 0.687277 +vn -0.174505 0.006775 -0.984619 +vn -0.244514 -0.691366 -0.679830 +vn -0.209479 -0.977386 0.028809 +vn -0.051820 -0.691366 0.720603 +vn 0.097842 0.006775 0.995148 +vn 0.041871 0.973296 0.225562 +vn 0.029786 0.986541 0.160649 +vn 0.988433 0.025880 -0.149266 +vn -0.976135 0.025880 0.215583 +vn -0.978027 -0.034181 0.205512 +vn -0.031953 -0.984527 -0.172155 +vn -0.019807 -0.994110 -0.106540 +vn 0.986572 -0.034150 -0.159551 +vn 0.006134 0.999451 0.032075 +vn 0.987548 -0.028504 -0.154637 +vn -0.977294 -0.028871 0.209784 +vn 0.004151 -0.999695 0.023377 +vn -0.042329 0.972045 -0.230811 +vn -0.969085 -0.082308 0.232582 +vn 0.052400 -0.957457 0.283700 +vn 0.987915 -0.081729 -0.131535 +vn -0.085849 0.882015 -0.463271 +vn 0.988739 -0.003204 -0.149449 +vn -0.976501 -0.003723 0.215430 +vn 0.094455 -0.854915 0.510025 +vn -0.107944 0.806269 -0.581591 +vn -0.972747 -0.018250 0.231086 +vn 0.116031 -0.772149 0.624744 +vn 0.990844 -0.018250 -0.133702 +vn -0.780908 0.525620 -0.337382 +vn 0.607685 0.525651 -0.595294 +vn -0.600330 -0.499985 0.624165 +vn 0.784417 -0.499954 0.366985 +vn 0.227790 0.959960 0.162969 +vn 0.096622 0.992889 0.069094 +vn 0.617939 0.069521 -0.783135 +vn -0.541642 0.069521 0.837703 +vn -0.562975 -0.077029 0.822840 +vn -0.184637 -0.973876 -0.132115 +vn -0.051973 -0.997955 -0.037111 +vn 0.596912 -0.076968 -0.798578 +vn -0.108768 0.990997 -0.077853 +vn 0.608509 -0.033204 -0.792840 +vn -0.554033 -0.033357 0.831813 +vn 0.153050 -0.982086 0.109622 +vn -0.536851 0.690573 0.484603 +vn 0.285287 0.690573 -0.664571 +vn -0.253059 -0.682546 0.685598 +vn 0.567156 -0.682546 -0.460860 +vn -0.053591 0.992584 -0.109012 +vn -0.672323 0.701987 0.234809 +vn 0.596484 0.701987 -0.389050 +vn -0.884884 0.004120 0.465712 +vn -0.579333 -0.696127 0.423933 +vn 0.077853 -0.984283 0.158361 +vn 0.689474 -0.696127 -0.199896 +vn 0.909146 0.004120 -0.416395 +vn 0.060884 0.926695 0.370769 +vn 0.048952 0.953856 0.296152 +vn -0.994629 -0.015442 0.102329 +vn 0.975097 -0.015442 -0.221137 +vn 0.979553 0.051393 -0.194464 +vn -0.075014 -0.886380 -0.456801 +vn -0.063631 -0.920042 -0.386578 +vn -0.990295 0.050783 0.129276 +vn 0.060945 0.928037 0.367412 +vn -0.995086 -0.046327 0.087374 +vn 0.971129 -0.045747 -0.234016 +vn -0.075106 -0.887845 -0.453902 +vn 0.088656 0.838893 0.536973 +vn 0.977996 0.018830 -0.207709 +vn -0.101413 -0.783074 -0.613575 +vn -0.993011 0.017060 0.116520 +vn 0.113315 0.718253 0.686453 +vn -0.997162 -0.016297 0.073092 +vn 0.968535 -0.016602 -0.248268 +vn -0.123783 -0.647389 -0.752007 +vn 0.139561 0.507675 0.850154 +vn 0.974914 0.022645 -0.221381 +vn -0.147191 -0.423322 -0.893918 +vn -0.994507 0.021821 0.102084 +vn 0.147801 0.409711 0.900143 +vn 0.981903 0.042787 -0.184454 +vn -0.153630 -0.320231 -0.934782 +vn -0.989319 0.042512 0.139256 +vn 0.802698 0.281442 0.525773 +vn -0.592364 0.281442 0.754875 +vn 0.587970 -0.217811 -0.778985 +vn -0.806238 -0.217811 -0.550005 +vn -0.346202 0.938139 0.003113 +vn -0.112796 0.993591 0.001007 +vn -0.032167 -0.112613 0.993103 +vn -0.091311 0.101382 -0.990631 +vn -0.050111 -0.112613 -0.992370 +vn 0.257118 -0.966369 -0.002319 +vn 0.018097 -0.999817 -0.000153 +vn -0.073397 0.101382 0.992126 +vn 0.182714 0.983154 -0.001465 +vn -0.040834 -0.009247 0.999115 +vn -0.058870 -0.009522 -0.998199 +vn -0.272591 -0.962096 0.002350 +vn 0.260262 0.961699 -0.085665 +vn 0.125675 -0.058748 0.990326 +vn -0.231330 0.044557 -0.971831 +vn -0.380688 -0.922910 -0.057070 +vn -0.019745 0.739616 -0.672719 +vn 0.478866 0.585162 0.654378 +vn -0.536637 -0.556780 -0.634022 +vn -0.044465 -0.722190 0.690237 +vn 0.547960 0.803766 -0.231697 +vn 0.639851 0.719260 -0.270547 +vn 0.391888 0.080935 0.916410 +vn -0.384472 0.080935 -0.919553 +vn -0.459059 -0.005982 -0.888363 +vn -0.616077 -0.743339 0.260506 +vn -0.700430 -0.649342 0.296182 +vn 0.317545 -0.005982 0.948210 +vn 0.238289 0.437483 -0.867061 +vn 0.788049 0.437483 0.433027 +vn -0.825892 -0.384777 -0.412061 +vn -0.279672 -0.384777 0.879574 +vn -0.022431 0.998901 0.040742 +vn -0.634938 0.706748 -0.311960 +vn 0.603198 0.706748 0.369640 +vn -0.898221 0.000061 -0.439467 +vn -0.636067 -0.706626 -0.309915 +vn -0.024018 -0.998749 0.043641 +vn 0.602069 -0.706626 0.371685 +vn 0.851772 0.000061 0.523881 +vn 0.787164 0.490341 0.374004 +vn 0.831324 0.390973 0.394971 +vn -0.399670 0.055727 0.914945 +vn 0.456862 0.055727 -0.887783 +vn 0.374310 0.014557 -0.927152 +vn -0.816065 -0.428571 -0.387738 +vn -0.853908 -0.325846 -0.405713 +vn -0.482345 0.014557 0.875820 +vn 0.877194 0.238319 0.416791 +vn -0.454299 0.029725 0.890316 +vn 0.403272 0.029725 -0.914579 +vn -0.890042 -0.170080 -0.422895 +vn 0.900662 0.075289 0.427931 +vn 0.379345 0.032868 -0.924650 +vn -0.903195 -0.005463 -0.429151 +vn -0.477248 0.032868 0.878140 +vn 0.902402 -0.042665 0.428755 +vn -0.425825 0.034486 0.904111 +vn 0.431959 0.034486 -0.901212 +vn -0.897549 0.111728 -0.426466 +vn 0.902737 -0.032319 0.428907 +vn -0.423292 0.034669 0.905301 +vn 0.434462 0.034669 -0.899991 +vn -0.898495 0.102176 -0.426893 +vn 0.942106 -0.016755 -0.334849 +vn 0.335459 -0.016755 0.941893 +vn -0.332560 0.066164 -0.940733 +vn -0.939390 0.066164 0.336375 +vn 0.723746 0.683493 -0.094760 +vn 0.867977 0.483383 -0.113651 +vn 0.197333 0.106632 0.974487 +vn -0.060274 0.106632 -0.992462 +vn -0.244057 -0.019471 -0.969543 +vn -0.767998 -0.632466 0.100558 +vn -0.898984 -0.421827 0.117740 +vn 0.013825 -0.019471 0.999695 +vn 0.988067 0.083224 -0.129398 +vn 0.053529 0.030732 0.998077 +vn -0.205267 0.030732 -0.978210 +vn -0.991394 -0.014893 0.129826 +vn 0.610126 -0.061220 -0.789911 +vn 0.792962 -0.061220 0.606128 +vn -0.790582 0.110538 -0.602252 +vn -0.608814 0.110538 0.785546 +vn 0.939543 0.310312 0.144597 +vn 0.772088 0.219489 -0.596362 +vn 0.557024 0.219489 0.800928 +vn 0.142430 0.033631 -0.989227 +vn -0.570574 -0.171911 -0.803034 +vn -0.958708 -0.243049 -0.147557 +vn -0.785638 -0.171911 0.594256 +vn -0.161596 0.033631 0.986267 +vn -0.431501 0.608417 -0.666005 +vn -0.438429 0.590075 -0.677877 +vn 0.843043 0.030885 -0.536943 +vn -0.834559 0.030885 0.550005 +vn -0.824274 0.018494 0.565844 +vn 0.450331 -0.560381 0.695059 +vn 0.457686 -0.539079 0.707022 +vn 0.852992 0.019471 -0.521500 +vn -0.507920 0.351390 -0.786431 +vn -0.770501 -0.007233 0.637379 +vn 0.518906 -0.294656 0.802393 +vn 0.895627 -0.007477 -0.444685 +vn -0.542619 0.055177 -0.838160 +vn 0.851039 0.028443 -0.524308 +vn -0.825800 0.027741 0.563219 +vn 0.543260 0.001648 0.839534 +vn -0.541063 0.097720 -0.835261 +vn 0.816523 0.032716 -0.576342 +vn -0.859645 0.032655 0.509781 +vn 0.543321 -0.038057 0.838618 +vn -0.543535 -0.001740 -0.839381 +vn -0.788324 0.032716 0.614338 +vn 0.542589 0.061037 0.837733 +vn 0.882687 0.032624 -0.468795 +vn -0.541093 -0.097446 -0.835261 +vn 0.810480 0.023255 -0.585284 +vn -0.865291 0.023225 0.500687 +vn 0.537004 0.155644 0.829066 +vn -0.976959 0.006104 -0.213324 +vn 0.204505 0.006104 -0.978820 +vn -0.208014 0.035585 0.977447 +vn 0.977142 0.035585 0.209571 +vn 0.220099 0.960631 -0.169469 +vn 0.256691 0.946074 -0.197516 +vn 0.592944 0.031159 0.804621 +vn -0.626331 0.031159 -0.778893 +vn -0.637867 -0.010315 -0.770074 +vn -0.264718 -0.942503 0.203833 +vn -0.300760 -0.925138 0.231574 +vn 0.581378 -0.010132 0.813532 +vn 0.397870 0.864834 -0.306070 +vn -0.656514 -0.040681 -0.753197 +vn -0.437941 -0.833338 0.337199 +vn 0.560564 -0.040529 0.827113 +vn 0.535417 0.666890 -0.518204 +vn 0.617084 -0.117130 0.778100 +vn -0.735588 0.063021 -0.674459 +vn -0.643452 -0.611835 0.459944 +vn -0.058687 0.507889 -0.859401 +vn 0.969878 0.233253 0.070101 +vn -0.978698 -0.199225 -0.049104 +vn 0.040590 -0.474502 0.879299 +vn -0.522080 0.817591 -0.242775 +vn -0.593036 0.756432 -0.275765 +vn 0.468581 -0.013306 -0.883297 +vn -0.425398 0.055849 0.903256 +vn -0.373455 -0.013306 0.927549 +vn 0.564867 -0.782250 0.262642 +vn 0.632527 -0.716483 0.294137 +vn 0.416547 0.055849 -0.907376 +vn -0.765007 0.485519 0.423078 +vn -0.169469 0.485519 -0.857631 +vn 0.196936 -0.455672 0.868068 +vn 0.790704 -0.455672 -0.408795 +vn 0.595569 0.802454 -0.036775 +vn 0.377606 0.567522 -0.731620 +vn 0.464797 0.567522 0.679586 +vn -0.084811 0.018342 -0.996216 +vn -0.497604 -0.541551 -0.677541 +vn -0.641926 -0.765709 0.039644 +vn -0.410413 -0.541551 0.733634 +vn 0.038423 0.018342 0.999084 +vn 0.050264 0.998627 -0.013764 +vn 0.028199 0.999542 -0.007660 +vn -0.239326 -0.010559 -0.970855 +vn 0.289315 0.010224 0.957152 +vn 0.289102 -0.010498 0.957213 +vn -0.000519 -0.999969 0.000122 +vn 0.021638 -0.999725 -0.005921 +vn -0.239021 0.010224 -0.970946 +vn -0.057222 0.998230 0.015900 +vn -0.236579 -0.027528 -0.971191 +vn 0.291574 -0.027284 0.956145 +vn 0.107395 -0.993774 -0.029450 +vn -0.274514 0.958586 0.075442 +vn -0.217689 -0.061861 -0.974029 +vn 0.309000 -0.061647 0.949034 +vn 0.321879 -0.942656 -0.088260 +vn -0.506027 0.851283 0.138646 +vn 0.308054 -0.022950 0.951079 +vn 0.547502 -0.823206 -0.150029 +vn -0.219794 -0.022950 -0.975249 +vn -0.587024 0.793390 0.160863 +vn 0.284188 0.015351 0.958617 +vn 0.625721 -0.760949 -0.171453 +vn -0.244179 0.015351 -0.969604 +vn -0.229621 0.560015 0.795984 +vn -0.603320 0.560015 -0.567736 +vn 0.630665 -0.537034 0.560198 +vn 0.256966 -0.537034 -0.803430 +vn 0.343272 0.932310 -0.113590 +vn 0.336253 0.935148 -0.111270 +vn 0.292428 0.013092 0.956175 +vn -0.337992 0.006623 -0.941099 +vn -0.335734 0.013092 -0.941862 +vn -0.388470 -0.912412 0.128574 +vn -0.382061 -0.915433 0.126438 +vn 0.290170 0.006623 0.956938 +vn 0.503616 0.847652 -0.166662 +vn -0.381603 -0.062624 -0.922178 +vn -0.544145 -0.819391 0.180090 +vn 0.243873 -0.062624 0.967772 +vn 0.250130 0.512528 -0.821406 +vn 0.690756 0.512528 0.509995 +vn -0.716117 -0.489364 -0.497635 +vn -0.277840 -0.489364 0.826594 +vn 0.727622 0.574389 -0.374981 +vn 0.190710 0.406201 -0.893613 +vn 0.838466 0.406201 0.363231 +vn -0.470595 0.021485 -0.882046 +vn -0.856410 -0.375805 -0.353984 +vn -0.752983 -0.531388 0.388043 +vn -0.208655 -0.375805 0.902860 +vn 0.445235 0.021485 0.895138 +vn 0.014954 0.691580 0.722098 +vn 0.014527 0.728172 0.685202 +vn -0.999939 -0.001251 -0.010681 +vn 0.998627 -0.001251 -0.052126 +vn 0.999298 0.031556 -0.019257 +vn -0.015534 -0.661672 -0.749596 +vn -0.015076 -0.698691 -0.715232 +vn -0.999268 0.030976 0.021943 +vn 0.017243 0.594531 0.803858 +vn -0.996094 -0.043123 -0.076662 +vn 0.992187 -0.042817 -0.116977 +vn -0.017579 -0.560686 -0.827815 +vn 0.020234 0.239753 0.970611 +vn 0.995483 0.003784 -0.094607 +vn -0.020600 -0.201361 -0.979278 +vn -0.998535 0.003418 -0.053621 +vn 0.020692 0.021638 0.999542 +vn 0.998627 0.020447 -0.047945 +vn -0.020753 0.018952 -0.999603 +vn -0.999756 0.020173 -0.006500 +vn 0.020264 0.173009 0.984680 +vn 0.996857 0.035035 0.070925 +vn -0.020295 -0.132664 -0.990936 +vn -0.993011 0.035127 0.112552 +vn 0.019776 0.280343 0.959685 +vn -0.999481 0.006897 -0.031098 +vn 0.997314 0.006836 -0.072665 +vn -0.020051 -0.241523 -0.970183 +vn 0.720054 0.123844 0.682760 +vn -0.691122 0.123844 0.712027 +vn 0.689444 -0.095737 -0.717948 +vn -0.718619 -0.095737 -0.688742 +vn -0.755669 0.653859 -0.036775 +vn -0.796411 0.603473 -0.038759 +vn 0.084323 -0.000793 -0.996429 +vn -0.059023 0.035096 0.997620 +vn -0.012818 -0.000793 0.999908 +vn 0.781579 -0.622639 0.038026 +vn 0.820276 -0.570544 0.039918 +vn 0.038118 0.035096 -0.998627 +vn -0.908353 0.415845 -0.044252 +vn 0.120121 -0.008637 -0.992706 +vn 0.023225 -0.008637 0.999664 +vn 0.924558 -0.378307 0.045045 +vn -0.973418 0.228858 0.006165 +vn 0.004608 0.109256 0.993988 +vn 0.980346 -0.180731 0.078860 +vn 0.044710 -0.078036 -0.995941 +vn -0.693106 0.261483 0.671712 +vn -0.694143 -0.008545 -0.719748 +vn 0.698050 0.036531 0.715079 +vn 0.699850 -0.233589 -0.674978 +vn -0.948729 0.183721 0.257118 +vn -0.959197 0.111148 0.259926 +vn -0.227546 0.017212 -0.973601 +vn 0.231727 0.025697 0.972411 +vn 0.295175 0.017212 0.955260 +vn 0.955138 -0.143712 -0.258827 +vn 0.962767 -0.070681 -0.260903 +vn -0.290963 0.025697 -0.956359 +vn -0.497696 0.025849 0.866939 +vn -0.867336 0.025849 -0.497024 +vn 0.868526 0.002838 0.495590 +vn 0.499435 0.002838 -0.866329 +vn -0.347392 0.548418 0.760582 +vn 0.397443 0.387829 0.831629 +vn -0.888791 0.387829 0.244118 +vn 0.913907 0.017212 0.405530 +vn 0.895138 -0.363445 -0.258034 +vn 0.356365 -0.513962 -0.780267 +vn -0.391095 -0.363445 -0.845515 +vn -0.904904 0.017212 -0.425214 +vn -0.607196 0.523057 0.598041 +vn -0.656056 0.388806 0.646809 +vn -0.645924 0.003204 -0.763359 +vn 0.664785 0.062532 0.744377 +vn 0.753349 0.004059 0.657582 +vn 0.628285 -0.471450 -0.618824 +vn 0.672079 -0.331797 -0.661946 +vn -0.734184 0.062532 -0.676015 +vn -0.711844 -0.004486 0.702292 +vn -0.618152 0.034791 -0.785241 +vn 0.775353 0.034120 0.630573 +vn 0.710929 0.065096 -0.700217 +vn -0.710654 -0.069002 0.700125 +vn 0.635395 0.021180 0.771874 +vn 0.706595 0.127995 -0.695914 +vn -0.762047 0.021546 -0.647114 +vn -0.712302 0.019501 0.701559 +vn -0.666066 0.030274 -0.745232 +vn 0.735038 0.030274 0.677328 +vn 0.711875 0.039766 -0.701132 +vn -0.708457 0.105502 0.697775 +vn 0.637257 0.036836 0.769738 +vn 0.711692 -0.045900 -0.700949 +vn -0.759972 0.036836 -0.648885 +vn 0.003052 0.216071 0.976348 +vn -0.976196 0.216071 -0.017914 +vn 0.984527 -0.174383 0.015625 +vn -0.000671 -0.174383 -0.984649 +vn -0.056063 0.795282 0.603626 +vn -0.057405 0.783898 0.618183 +vn -0.992584 0.012909 -0.120823 +vn 0.996857 0.025849 0.074740 +vn 0.997833 0.012940 0.064089 +vn 0.060396 -0.757347 -0.650166 +vn 0.061708 -0.745109 -0.664052 +vn -0.993561 0.025849 -0.110172 +vn -0.063387 0.727775 0.682852 +vn -0.990814 -0.000153 -0.135105 +vn 0.998749 -0.000183 0.049806 +vn 0.067385 -0.685171 -0.725242 +vn 0.655751 0.480300 0.582446 +vn -0.751854 0.480300 0.451643 +vn 0.753105 -0.449171 -0.480667 +vn -0.651631 -0.449171 -0.611194 +vn -0.708518 0.118564 -0.695608 +vn -0.996368 0.083865 0.012452 +vn -0.005829 0.083865 -0.996429 +vn -0.698325 0.029969 0.715110 +vn 0.008545 -0.041444 0.999084 +vn 0.712333 -0.058596 0.699362 +vn 0.999084 -0.041444 -0.009796 +vn 0.702170 0.029969 -0.711356 +vn 0.854427 0.216376 0.472304 +vn 0.863521 0.162664 0.477340 +vn -0.464583 0.026307 0.885098 +vn 0.502396 0.026307 -0.864223 +vn 0.458876 0.018616 -0.888302 +vn -0.861812 -0.174047 -0.476394 +vn -0.869045 -0.118168 -0.480392 +vn -0.508133 0.018616 0.861049 +vn 0.872280 -0.081362 0.482162 +vn 0.410596 0.030213 -0.911283 +vn -0.868404 0.124149 -0.480026 +vn -0.553301 0.030213 0.832423 +vn 0.844478 -0.262551 0.466811 +vn -0.476058 0.019044 0.879177 +vn 0.491287 0.019044 -0.870754 +vn -0.834254 0.302164 -0.461165 +vn 0.865535 -0.147954 0.478439 +vn -0.436995 0.013123 0.899350 +vn 0.529160 0.013123 -0.848415 +vn -0.859066 0.191015 -0.474868 +vn 0.860469 0.182531 0.475631 +vn -0.398419 0.037751 0.916410 +vn 0.564104 0.037751 -0.824824 +vn -0.866604 -0.139561 -0.479049 +vn 0.814020 0.367229 0.449965 +vn 0.464858 0.015107 -0.885250 +vn -0.827113 -0.326731 -0.457228 +vn -0.502365 0.015076 0.864498 +vn 0.924955 0.237587 -0.296609 +vn 0.240791 0.237587 0.941038 +vn -0.249886 -0.208777 -0.945494 +vn -0.933561 -0.208777 0.291269 +vn -0.525681 0.657002 -0.540330 +vn -0.586047 0.541917 -0.602344 +vn 0.687979 0.060274 -0.723167 +vn -0.741783 0.060274 0.667898 +vn -0.668325 -0.015748 0.743675 +vn 0.544786 -0.624165 0.559954 +vn 0.601703 -0.505356 0.618488 +vn 0.761681 -0.015809 -0.647755 +vn -0.661946 0.314402 -0.680380 +vn 0.752098 0.006531 -0.658986 +vn -0.679342 0.006348 0.733787 +vn 0.670675 -0.273446 0.689474 +vn -0.710990 0.160009 -0.684713 +vn 0.726310 -0.041200 -0.686117 +vn -0.686819 0.077395 0.722648 +vn 0.677999 -0.113956 0.726157 +vn -0.987213 0.159398 0.000336 +vn -0.000763 -0.011139 -0.999908 +vn 0.004975 0.041292 0.999115 +vn 0.991607 -0.129093 0.001312 +vn -0.220832 0.324168 -0.919828 +vn -0.225745 0.254524 -0.940336 +vn 0.965453 0.030976 -0.258614 +vn -0.977630 0.030976 0.207892 +vn -0.962920 0.013276 0.269417 +vn 0.223884 -0.283090 0.932554 +vn 0.228095 -0.212561 0.950133 +vn 0.980285 0.013276 -0.197089 +vn -0.849513 0.128819 -0.511551 +vn 0.524644 0.128819 -0.841487 +vn -0.522172 -0.098880 0.847072 +vn 0.849818 -0.098880 0.517655 +vn 0.307596 0.441298 -0.842952 +vn -0.446638 0.312082 -0.838496 +vn 0.881710 0.312082 -0.353771 +vn -0.942289 0.019593 -0.334147 +vn -0.886135 -0.284371 0.365886 +vn -0.313852 -0.402112 0.860103 +vn 0.442213 -0.284371 0.850612 +vn 0.936064 0.019593 0.351238 +vn 0.115665 0.548967 0.827754 +vn 0.129093 0.359661 0.924100 +vn -0.998871 -0.019013 0.043428 +vn 0.995880 0.066469 -0.061647 +vn 0.972533 -0.019166 -0.231910 +vn -0.117832 -0.524308 -0.843318 +vn -0.130589 -0.331919 -0.934202 +vn -0.974609 0.066469 0.213691 +vn 0.138279 -0.048219 0.989196 +vn 0.973998 0.020386 -0.225532 +vn -0.138127 0.077273 -0.987365 +vn -0.998535 0.020295 0.049867 +vn 0.135014 -0.223090 0.965392 +vn 0.992248 0.011536 -0.123692 +vn -0.134068 0.251564 -0.958495 +vn -0.988189 0.011505 0.152776 +vn 0.137150 -0.131565 0.981750 +vn 0.994232 0.010346 -0.106449 +vn -0.136540 0.161199 -0.977416 +vn -0.985351 0.010376 0.170171 +vn 0.138157 -0.055330 0.988861 +vn -0.989563 0.014618 0.143345 +vn 0.990936 0.014618 -0.133396 +vn -0.137883 0.085147 -0.986755 +vn 0.797967 -0.032807 0.601794 +vn -0.602435 -0.032807 0.797479 +vn 0.602710 0.053926 -0.796106 +vn -0.797845 0.053926 -0.600391 +vn 0.725364 0.677419 -0.121952 +vn 0.780633 0.611011 -0.131260 +vn 0.185553 0.038087 0.981872 +vn -0.145756 0.038087 -0.988556 +vn -0.205603 -0.011567 -0.978545 +vn -0.744957 -0.655202 0.125248 +vn -0.798303 -0.587085 0.134220 +vn 0.125736 -0.011567 0.991974 +vn 0.860103 0.489151 -0.144627 +vn 0.135899 0.000580 0.990692 +vn -0.195563 0.000580 -0.980682 +vn -0.874111 -0.462905 0.146977 +vn 0.510269 0.309122 -0.802484 +vn 0.744682 0.309122 0.591449 +vn -0.753960 -0.290231 -0.589251 +vn -0.519761 -0.290231 0.803461 +vn 0.443403 0.158666 -0.882138 +vn -0.318186 0.112186 -0.941343 +vn 0.945311 0.112186 -0.306253 +vn -0.894345 0.014801 -0.447096 +vn -0.946654 -0.091250 0.308969 +vn -0.445326 -0.129063 0.885983 +vn 0.316813 -0.091250 0.944060 +vn 0.892392 0.014801 0.451003 +vn 0.054781 0.871151 0.487930 +vn 0.048280 0.901578 0.429884 +vn -0.996429 -0.018281 0.082308 +vn 0.989868 -0.018281 -0.140721 +vn 0.993042 0.033906 -0.112644 +vn -0.057894 -0.854885 -0.515549 +vn -0.051485 -0.887143 -0.458571 +vn -0.993286 0.033876 0.110416 +vn 0.049043 0.898801 0.435560 +vn -0.996368 -0.022309 0.082034 +vn 0.989746 -0.022095 -0.140965 +vn -0.052217 -0.883969 -0.464583 +vn 0.072939 0.757744 0.648427 +vn -0.997711 -0.050539 0.044374 +vn 0.982757 -0.050508 -0.177709 +vn -0.075625 -0.735923 -0.672781 +vn 0.099460 0.452101 0.886380 +vn 0.979339 -0.025788 -0.200476 +vn -0.101169 -0.423353 -0.900266 +vn -0.999420 -0.025819 0.021729 +vn 0.110660 0.130680 0.985198 +vn 0.985168 0.009186 -0.171178 +vn -0.111118 -0.099063 -0.988830 +vn -0.998627 0.009033 0.051424 +vn 0.111148 0.088778 0.989807 +vn 0.997192 0.019013 -0.072390 +vn -0.111423 -0.056703 -0.992126 +vn -0.988403 0.019013 0.150548 +vn 0.778527 0.126896 0.614612 +vn -0.622822 0.126896 0.771966 +vn 0.623554 -0.104251 -0.774773 +vn -0.779870 -0.104251 -0.617176 +vn 0.157750 0.928892 -0.335002 +vn 0.234748 0.834529 -0.498398 +vn 0.909848 0.094913 0.403882 +vn -0.890957 0.094913 -0.444044 +vn -0.928495 -0.066805 -0.365184 +vn -0.170171 -0.916745 0.361400 +vn -0.245888 -0.816675 0.522050 +vn 0.873104 -0.066775 0.482925 +vn 0.311991 0.681112 -0.662343 +vn 0.895535 0.002564 0.444929 +vn -0.913511 0.002319 -0.406781 +vn -0.321085 -0.657460 0.681600 +vn 0.284677 0.616596 -0.733970 +vn 0.916532 -0.089846 0.389691 +vn -0.939451 0.083621 -0.332255 +vn -0.383160 -0.582385 0.716910 +vn -0.426252 0.523637 -0.737602 +vn 0.906217 0.274087 -0.321848 +vn -0.907224 -0.255196 0.334330 +vn 0.423109 -0.505783 0.751732 +vn 0.187689 0.524766 -0.830256 +vn 0.187414 0.526841 -0.829005 +vn 0.973632 0.014405 0.227638 +vn -0.977264 0.013276 -0.211463 +vn -0.976867 0.014405 -0.213324 +vn -0.191321 -0.497024 0.846370 +vn -0.191076 -0.499130 0.845180 +vn 0.973205 0.013276 0.229499 +vn -0.557268 0.374065 -0.741264 +vn 0.821955 0.374065 -0.429426 +vn -0.824580 -0.354472 0.440870 +vn 0.554704 -0.354472 0.752739 +vn 0.736015 0.673849 0.064577 +vn 0.582263 0.476516 -0.658650 +vn 0.458693 0.476547 0.749992 +vn 0.076754 0.012085 -0.996948 +vn -0.473739 -0.459426 -0.751305 +vn -0.757286 -0.649678 -0.066408 +vn -0.597339 -0.459426 0.657338 +vn -0.097995 0.012085 0.995086 +vn 0.786828 0.532640 -0.311655 +vn 0.827937 0.454878 -0.327952 +vn 0.393689 0.034883 0.918546 +vn -0.342082 0.034883 -0.938994 +vn -0.408216 -0.003845 -0.912839 +vn -0.801660 -0.506424 0.317545 +vn -0.840754 -0.426832 0.333018 +vn 0.327586 -0.003845 0.944792 +vn 0.905667 0.225898 -0.358745 +vn -0.433027 0.000549 -0.901364 +vn -0.911679 -0.195868 0.361126 +vn 0.301645 0.000549 0.953398 +vn 0.928037 -0.060030 -0.367595 +vn 0.312845 0.019807 0.949583 +vn -0.422224 0.019807 -0.906247 +vn -0.925901 0.090487 0.366741 +vn 0.928434 -0.051943 -0.367748 +vn 0.428327 0.011017 0.903531 +vn -0.306558 0.011017 -0.951781 +vn -0.926542 0.082492 0.366985 +vn 0.929289 0.029969 -0.368084 +vn -0.394879 0.014985 -0.918577 +vn -0.929716 0.000793 0.368267 +vn 0.341227 0.014985 0.939848 +vn 0.397137 -0.024140 -0.917417 +vn 0.917661 -0.024140 0.396619 +vn -0.917020 0.045930 -0.396100 +vn -0.397046 0.045930 0.916623 +vn 0.409436 0.910916 0.050142 +vn 0.542558 0.837367 0.066439 +vn -0.104709 0.071352 0.991913 +vn 0.137761 0.071352 -0.987884 +vn 0.070162 -0.048647 -0.996338 +vn -0.436781 -0.897946 -0.053499 +vn -0.567797 -0.820215 -0.069521 +vn -0.172369 -0.048647 0.983825 +vn 0.826075 0.554369 0.101169 +vn -0.222694 -0.047304 0.973724 +vn 0.018891 -0.047304 -0.998688 +vn -0.842769 -0.528275 -0.103214 +vn 0.757164 0.234870 -0.609485 +vn 0.587664 0.234870 0.774224 +vn -0.597186 -0.215339 -0.772637 +vn -0.766015 -0.215339 0.605640 +vn 0.784692 0.180853 -0.592883 +vn 0.128636 0.127903 -0.983398 +vn 0.981140 0.127903 0.144841 +vn -0.604755 0.015198 -0.796228 +vn -0.984008 -0.106388 -0.142674 +vn -0.788751 -0.150487 0.595965 +vn -0.131535 -0.106418 0.985565 +vn 0.600757 0.015198 0.799280 +vn 0.273080 0.663869 0.696158 +vn 0.282113 0.635090 0.719047 +vn -0.938047 -0.002472 0.346416 +vn 0.933012 0.019440 -0.359294 +vn 0.923399 -0.002411 -0.383740 +vn -0.278146 -0.647908 -0.709098 +vn -0.286966 -0.618458 -0.731498 +vn -0.928434 0.019440 0.370891 +vn 0.314646 0.508133 0.801721 +vn -0.948271 -0.016968 0.316965 +vn 0.910947 -0.016846 -0.412152 +vn -0.318522 -0.489395 -0.811792 +vn 0.357128 0.210273 0.910062 +vn -0.960418 -0.007599 0.278420 +vn 0.893643 -0.007599 -0.448683 +vn -0.358623 -0.189276 -0.914060 +vn 0.356731 0.213141 0.909543 +vn 0.959410 0.029237 -0.280435 +vn -0.358257 -0.192785 -0.913480 +vn -0.894162 0.029298 0.446760 +vn 0.342631 0.345317 0.873684 +vn -0.942869 -0.001099 0.333079 +vn 0.917814 -0.001160 -0.396954 +vn -0.345195 -0.325724 -0.880184 +vn 0.351970 0.266518 0.897244 +vn 0.928281 0.009064 -0.371685 +vn -0.353954 -0.246101 -0.902280 +vn -0.933439 0.009033 0.358592 +vn 0.907804 0.181677 0.377941 +vn -0.408673 0.181677 0.894375 +vn 0.407239 -0.167180 -0.897855 +vn -0.909116 -0.167180 -0.381481 +vn -0.296457 0.936247 0.188482 +vn -0.475478 0.826106 0.302316 +vn -0.474471 -0.081973 -0.876400 +vn 0.507248 0.108341 0.854915 +vn 0.592364 -0.081973 0.801447 +vn 0.312632 -0.928831 -0.198767 +vn 0.489639 -0.814417 -0.311319 +vn -0.559008 0.108341 -0.822016 +vn -0.692862 0.570788 0.440565 +vn 0.579577 -0.022370 0.814600 +vn 0.702963 -0.553148 -0.446974 +vn -0.491806 -0.022370 -0.870388 +vn -0.818262 0.240303 0.522141 +vn 0.624287 -0.012299 0.781060 +vn 0.823420 -0.219916 -0.523026 +vn -0.443770 -0.016419 -0.895962 +vn -0.229255 0.003082 0.973327 +vn -0.979156 -0.002869 -0.202979 +vn 0.979492 0.017609 0.200568 +vn 0.231605 0.011658 -0.972716 +vn -0.710746 0.222480 0.667287 +vn -0.721397 0.144322 0.677267 +vn -0.656972 0.005676 -0.753868 +vn 0.659505 0.018097 0.751457 +vn 0.710959 0.005676 0.703177 +vn 0.714011 -0.201880 -0.670370 +vn 0.723472 -0.123386 -0.679220 +vn -0.708426 0.018097 -0.705527 +vn -0.031648 0.045625 0.998444 +vn -0.998444 0.045625 -0.031312 +vn 0.999054 -0.030732 0.029908 +vn 0.033082 -0.030732 -0.998962 +vn -0.250343 0.669576 0.699240 +vn 0.488662 0.473464 0.732810 +vn -0.842738 0.473464 0.256111 +vn 0.943754 0.007904 0.330454 +vn 0.846065 -0.462233 -0.265419 +vn 0.255074 -0.653706 -0.712424 +vn -0.485336 -0.462233 -0.742119 +vn -0.939055 0.007935 -0.343638 +vn 0.459151 0.767968 -0.446516 +vn 0.493881 0.724815 -0.480270 +vn 0.704215 0.030549 0.709311 +vn -0.689383 0.030549 -0.723716 +vn -0.717643 -0.012665 -0.696280 +vn -0.472182 -0.752403 0.459181 +vn -0.506180 -0.708152 0.492203 +vn 0.675985 -0.012635 0.736778 +vn 0.523911 0.682607 -0.509445 +vn 0.692770 0.010712 0.721030 +vn -0.701437 0.010651 -0.712607 +vn -0.535478 -0.664907 0.520707 +vn 0.552843 0.636647 -0.537553 +vn -0.719260 -0.009735 -0.694662 +vn -0.563707 -0.617847 0.548143 +vn 0.674337 -0.009674 0.738304 +vn 0.640492 0.449324 -0.622761 +vn -0.744469 -0.019959 -0.667318 +vn -0.648000 -0.427747 0.630146 +vn 0.646352 -0.019898 0.762749 +vn 0.686422 0.288461 -0.667501 +vn 0.689840 0.009400 0.723869 +vn -0.704367 0.009461 -0.709738 +vn -0.691122 -0.265633 0.672109 +vn -0.005341 0.193243 -0.981109 +vn 0.980590 0.193243 0.032716 +vn -0.983764 -0.176916 -0.029450 +vn 0.001953 -0.176916 0.984191 +vn -0.077853 0.989624 0.120701 +vn -0.202826 0.927335 0.314432 +vn -0.806970 -0.094333 -0.582965 +vn 0.831843 0.112918 0.543382 +vn 0.863765 -0.094333 0.494919 +vn 0.090335 -0.985992 -0.140049 +vn 0.214637 -0.918241 -0.332743 +vn -0.837977 0.112888 -0.533860 +vn -0.387707 0.698843 0.601032 +vn 0.872463 -0.044527 0.486618 +vn 0.396558 -0.681722 -0.614795 +vn -0.803003 -0.044649 -0.594256 +vn 0.272042 0.402142 0.874203 +vn -0.908597 0.402142 0.112522 +vn 0.913083 -0.388958 -0.122166 +vn -0.265084 -0.388958 -0.882260 +vn 0.324534 0.746940 -0.580279 +vn -0.387616 0.528184 -0.755455 +vn 0.846614 0.528184 -0.065188 +vn -0.877041 0.008057 -0.480331 +vn -0.852718 -0.516739 0.076113 +vn -0.333171 -0.730796 0.595752 +vn 0.381512 -0.516739 0.766411 +vn 0.868374 0.008057 0.495804 +vn -0.431654 0.744255 0.509598 +vn -0.385327 0.802759 0.455000 +vn -0.738151 -0.023591 -0.674184 +vn 0.786431 -0.023591 0.617176 +vn 0.752007 0.040315 0.657888 +vn 0.442610 -0.728690 -0.522538 +vn 0.397320 -0.788629 -0.469161 +vn -0.772637 0.040193 -0.633534 +vn -0.417066 0.763878 0.492447 +vn -0.725608 -0.045442 -0.686575 +vn 0.796533 -0.045412 0.602832 +vn 0.428510 -0.748558 -0.505966 +vn -0.558184 0.504257 0.658834 +vn 0.810419 -0.030519 0.585009 +vn 0.565539 -0.484085 -0.667684 +vn -0.710471 -0.030457 -0.703055 +vn -0.640706 0.131504 0.756401 +vn 0.821345 0.000061 0.570421 +vn 0.642445 -0.108860 -0.758538 +vn -0.697745 0.000031 -0.716300 +vn -0.646260 -0.003082 0.763085 +vn 0.739372 0.010865 0.673177 +vn 0.646046 0.025819 -0.762841 +vn -0.785546 0.010865 -0.618671 +vn -0.645314 0.055330 0.761864 +vn -0.756432 0.011109 -0.653951 +vn 0.769494 0.011109 0.638539 +vn 0.645985 -0.032258 -0.762658 +vn 0.082766 0.023988 0.996277 +vn -0.996307 0.023988 0.082247 +vn 0.996521 -0.007630 -0.082766 +vn -0.082278 -0.007630 -0.996551 +vn 0.072207 0.991333 0.109500 +vn 0.023713 0.999054 0.035951 +vn 0.843013 0.039155 -0.536424 +vn -0.825007 0.039155 0.563738 +vn -0.828394 -0.040315 0.558672 +vn -0.059633 -0.994110 -0.090426 +vn -0.011048 -0.999786 -0.016724 +vn 0.839686 -0.040284 -0.541520 +vn -0.026124 0.998871 -0.039369 +vn 0.841151 0.000000 -0.540757 +vn -0.828272 0.000275 0.560259 +vn 0.038942 -0.997497 0.058840 +vn 0.139286 0.954344 -0.264168 +vn -0.964721 -0.213355 0.154241 +vn 0.285714 -0.925718 0.247688 +vn 0.997131 0.012116 -0.074648 +vn -0.717521 0.413984 -0.560137 +vn 0.628346 0.776116 -0.052767 +vn -0.629200 -0.773980 0.070894 +vn 0.713004 -0.406171 0.571490 +vn -0.234840 0.805414 -0.544176 +vn -0.268624 0.735069 -0.622486 +vn 0.908322 0.047792 -0.415509 +vn -0.925413 0.047792 0.375866 +vn -0.899991 -0.028382 0.434919 +vn 0.242134 -0.791589 0.561022 +vn 0.275277 -0.719230 0.637898 +vn 0.933836 -0.028382 -0.356487 +vn -0.859859 0.464156 -0.212439 +vn 0.435255 0.464156 -0.771386 +vn -0.429975 -0.452315 0.781335 +vn 0.863491 -0.452315 0.223121 +vn 0.372997 0.904355 0.207282 +vn -0.079745 0.639454 0.764641 +vn 0.607227 0.639454 -0.471480 +vn -0.476547 -0.004761 0.879116 +vn -0.594256 -0.646260 0.478683 +vn -0.354595 -0.913999 -0.197089 +vn 0.092746 -0.646260 -0.757408 +vn 0.494949 -0.004761 -0.868892 +vn -0.259682 0.951353 -0.165777 +vn -0.403394 0.878018 -0.257546 +vn 0.521287 0.085452 -0.849086 +vn -0.550798 0.085452 0.830226 +vn -0.493789 -0.067721 0.866909 +vn 0.276315 -0.944700 0.176397 +vn 0.419202 -0.867519 0.267617 +vn 0.578570 -0.067721 -0.812799 +vn -0.670736 0.605579 -0.428205 +vn -0.459700 -0.053957 0.886410 +vn 0.680868 -0.589435 0.434675 +vn 0.610614 -0.053957 -0.790063 +vn -0.771233 0.403424 -0.492355 +vn -0.534104 0.009522 0.845332 +vn 0.778252 -0.383953 0.496841 +vn 0.542039 0.009522 -0.840297 +vn -0.799860 0.315317 -0.510636 +vn 0.574114 -0.002686 -0.818751 +vn -0.501053 -0.002686 0.865383 +vn 0.805322 -0.295083 0.514115 +vn -0.820429 0.228980 -0.523820 +vn -0.537797 0.010773 0.842982 +vn 0.824335 -0.208289 0.526322 +vn 0.538408 0.010773 -0.842586 +vn -0.960051 0.165014 0.225867 +vn -0.199103 0.164983 -0.965972 +vn 0.201880 -0.150365 0.967772 +vn 0.962859 -0.150365 -0.224097 +vn -0.074984 0.984863 0.156102 +vn -0.099399 0.973266 0.206977 +vn -0.893796 -0.022767 -0.447829 +vn 0.903378 0.028016 0.427869 +vn 0.908170 -0.022706 0.417920 +vn 0.083987 -0.980987 -0.174871 +vn 0.108371 -0.968169 -0.225562 +vn -0.898587 0.028047 -0.437880 +vn -0.195959 0.891690 0.407971 +vn -0.878048 -0.066744 -0.473830 +vn 0.918638 -0.066652 0.389416 +vn 0.204138 -0.881893 -0.424909 +vn 0.445692 0.566424 0.693167 +vn -0.819697 0.566393 0.085177 +vn 0.823908 -0.558306 -0.097079 +vn -0.439039 -0.558336 -0.703879 +vn 0.372906 0.455153 0.808527 +vn 0.905759 0.321848 0.275582 +vn -0.378368 0.321848 0.867885 +vn 0.906003 0.009461 -0.423109 +vn 0.375561 -0.308420 -0.873959 +vn -0.376873 -0.436140 -0.817133 +vn -0.908567 -0.308420 -0.281655 +vn -0.910001 0.009461 0.414472 +vn 0.404614 0.511551 -0.757988 +vn 0.406598 0.504410 -0.761711 +vn 0.881283 0.010559 0.472396 +vn -0.882931 0.010559 -0.469314 +vn -0.885983 0.006836 -0.463607 +vn -0.409345 -0.494217 0.766900 +vn -0.411267 -0.486953 0.770501 +vn 0.878231 0.006836 0.478133 +vn 0.414655 0.474013 -0.776727 +vn -0.889248 0.003327 -0.457350 +vn -0.419050 -0.456191 0.784997 +vn 0.874874 0.003357 0.484298 +vn 0.437513 0.370067 -0.819483 +vn -0.900662 -0.004883 -0.434462 +vn -0.440931 -0.351115 0.825983 +vn 0.862239 -0.004822 0.506424 +vn 0.467971 0.112583 -0.876522 +vn -0.917142 0.001953 -0.398480 +vn -0.468886 -0.092502 0.878384 +vn 0.841548 0.001953 0.540147 +vn 0.467452 0.120640 -0.875729 +vn 0.917814 0.019318 0.396496 +vn -0.840205 0.019318 -0.541917 +vn -0.468490 -0.100833 0.877682 +vn 0.467177 0.125095 -0.875240 +vn -0.918363 0.000458 -0.395672 +vn -0.468276 -0.105319 0.877255 +vn 0.839808 0.000458 0.542833 +vn -0.284036 -0.043123 -0.957823 +vn 0.953887 -0.043123 -0.297037 +vn -0.952849 0.057253 0.297922 +vn 0.282723 0.057253 0.957457 +vn 0.769738 0.638325 0.002594 +vn 0.901914 0.431867 0.003021 +vn 0.079653 0.080325 0.993561 +vn 0.086367 0.080325 -0.993011 +vn -0.100528 -0.037355 -0.994201 +vn -0.782006 -0.623218 -0.002625 +vn -0.910306 -0.413923 -0.003052 +vn -0.107242 -0.037355 0.993500 +vn 0.984222 0.176733 0.003296 +vn -0.014069 0.007904 0.999847 +vn -0.007324 0.007904 -0.999939 +vn -0.987426 -0.157842 -0.003327 +vn 0.994751 0.101749 -0.010132 +vn -0.026399 -0.019227 0.999451 +vn -0.025727 0.034608 -0.999054 +vn -0.996582 -0.081088 -0.013855 +vn 0.705191 0.070284 -0.705466 +vn 0.708029 -0.006348 0.706107 +vn -0.708731 0.020478 -0.705161 +vn -0.706290 -0.056124 0.705649 +vn 0.539720 0.813654 -0.215979 +vn 0.589312 0.772698 -0.235847 +vn 0.380779 0.030915 0.924131 +vn -0.361919 0.030915 -0.931669 +vn -0.396649 -0.016846 -0.917814 +vn -0.554735 -0.801843 0.221992 +vn -0.603565 -0.759819 0.241554 +vn 0.346049 -0.016846 0.938047 +vn 0.188055 0.515061 -0.836238 +vn 0.713065 0.515061 0.475600 +vn -0.722678 -0.505570 -0.471236 +vn -0.198035 -0.505570 0.839717 +vn 0.797021 0.493881 0.347575 +vn 0.846217 0.349223 -0.402356 +vn 0.280923 0.349223 0.893918 +vn 0.395245 0.008759 -0.918516 +vn -0.287240 -0.336833 -0.896664 +vn -0.805933 -0.476333 -0.351451 +vn -0.852535 -0.336833 0.399579 +vn -0.404157 0.008759 0.914609 +s 1 +f 1//1 5//2 4//3 +f 2//4 6//5 5//2 +f 3//6 7//7 2//4 +f 4//3 8//8 7//7 +f 5//2 9//9 12//10 +f 6//5 10//11 9//9 +f 7//7 11//12 10//11 +f 8//8 12//10 11//12 +f 9//9 13//13 16//14 +f 10//11 14//15 9//9 +f 11//12 15//16 14//15 +f 12//10 16//14 11//12 +f 13//13 17//17 16//14 +f 14//15 18//18 13//13 +f 15//16 19//19 14//15 +f 16//14 20//20 15//16 +f 17//17 21//21 20//20 +f 18//18 22//22 21//21 +f 19//19 23//23 18//18 +f 20//20 24//24 23//23 +f 21//21 25//25 24//24 +f 22//22 26//26 21//21 +f 23//23 27//27 22//22 +f 24//24 28//28 23//23 +f 25//25 29//29 32//30 +f 26//26 30//31 29//29 +f 27//27 31//32 30//31 +f 28//28 32//30 31//32 +f 29//29 33//33 36//34 +f 30//31 34//35 33//33 +f 31//32 35//36 34//35 +f 32//30 36//34 35//36 +f 37//37 41//38 40//39 +f 38//40 42//41 41//38 +f 39//42 43//43 38//40 +f 40//39 44//44 43//43 +f 41//38 45//45 48//46 +f 42//41 46//47 41//38 +f 43//43 47//48 46//47 +f 44//44 48//46 43//43 +f 45//45 49//49 52//50 +f 46//47 50//51 49//49 +f 47//48 51//52 50//51 +f 48//46 52//50 51//52 +f 49//49 53//53 52//50 +f 50//51 54//54 49//49 +f 51//52 55//55 50//51 +f 52//50 56//56 51//52 +f 53//53 57//57 60//58 +f 54//54 58//59 57//57 +f 55//55 59//60 58//59 +f 56//56 60//58 59//60 +f 57//57 61//61 64//62 +f 58//59 62//63 57//57 +f 59//60 63//64 62//63 +f 60//58 64//62 59//60 +f 61//61 65//65 68//66 +f 62//63 66//67 65//65 +f 63//64 67//68 66//67 +f 64//62 68//66 67//68 +f 69//69 73//70 72//71 +f 70//72 74//73 69//69 +f 71//74 75//75 70//72 +f 72//71 76//76 71//74 +f 73//70 77//77 80//78 +f 74//73 78//79 77//77 +f 75//75 79//80 78//79 +f 76//76 80//78 79//80 +f 77//77 81//81 80//78 +f 78//79 82//82 77//77 +f 79//80 83//83 78//79 +f 80//78 84//84 79//80 +f 81//81 85//85 88//86 +f 82//82 86//87 85//85 +f 83//83 87//88 86//87 +f 84//84 88//86 87//88 +f 85//85 89//89 88//86 +f 86//87 90//90 89//89 +f 87//88 91//91 86//87 +f 88//86 92//92 91//91 +f 89//89 93//93 96//94 +f 90//90 94//95 89//89 +f 91//91 95//96 94//95 +f 92//92 96//94 91//91 +f 93//93 97//97 100//98 +f 94//95 98//99 97//97 +f 95//96 99//100 98//99 +f 96//94 100//98 99//100 +f 101//101 105//102 108//103 +f 102//104 106//105 105//102 +f 103//106 107//107 106//105 +f 104//108 108//103 107//107 +f 105//102 109//109 108//103 +f 106//105 110//110 105//102 +f 107//107 111//111 106//105 +f 108//103 112//112 107//107 +f 109//109 113//113 112//112 +f 110//110 114//114 109//109 +f 111//111 115//115 110//110 +f 112//112 116//116 111//111 +f 113//113 117//117 120//118 +f 114//114 118//119 117//117 +f 115//115 119//120 118//119 +f 116//116 120//118 119//120 +f 117//117 121//121 120//118 +f 118//119 122//122 121//121 +f 119//120 123//123 118//119 +f 120//118 124//124 123//123 +f 121//121 125//125 128//126 +f 122//122 126//127 125//125 +f 123//123 127//128 126//127 +f 124//124 128//126 127//128 +f 129//129 133//130 136//131 +f 130//132 134//133 133//130 +f 131//134 135//135 134//133 +f 132//136 136//131 135//135 +f 133//130 137//137 136//131 +f 134//133 138//138 133//130 +f 135//135 139//139 134//133 +f 136//131 140//140 135//135 +f 137//137 141//141 140//140 +f 138//138 142//142 141//141 +f 139//139 143//143 138//138 +f 140//140 144//144 143//143 +f 141//141 145//145 148//146 +f 142//142 146//147 141//141 +f 143//143 147//148 146//147 +f 144//144 148//146 143//143 +f 145//145 149//149 152//150 +f 146//147 150//151 149//149 +f 147//148 151//152 150//151 +f 148//146 152//150 151//152 +f 153//153 157//154 160//155 +f 154//156 158//157 153//153 +f 155//158 159//159 158//157 +f 156//160 160//155 155//158 +f 157//154 161//161 160//155 +f 158//157 162//162 161//161 +f 159//159 163//163 158//157 +f 160//155 164//164 163//163 +f 161//161 165//165 168//166 +f 162//162 166//167 165//165 +f 163//163 167//168 166//167 +f 164//164 168//166 167//168 +f 165//165 169//169 172//170 +f 166//167 170//171 165//165 +f 167//168 171//172 170//171 +f 168//166 172//170 167//168 +f 169//169 173//173 176//174 +f 170//171 174//175 173//173 +f 171//172 175//176 174//175 +f 172//170 176//174 175//176 +f 177//177 181//178 184//179 +f 178//180 182//181 181//178 +f 179//182 183//183 182//181 +f 180//184 184//179 183//183 +f 181//178 185//185 188//186 +f 182//181 186//187 185//185 +f 183//183 187//188 186//187 +f 184//179 188//186 187//188 +f 185//185 189//189 188//186 +f 186//187 190//190 185//185 +f 187//188 191//191 186//187 +f 188//186 192//192 187//188 +f 189//189 193//193 196//194 +f 190//190 194//195 193//193 +f 191//191 195//196 194//195 +f 192//192 196//194 195//196 +f 197//197 201//198 200//199 +f 198//200 202//201 201//198 +f 199//202 203//203 198//200 +f 200//199 204//204 203//203 +f 201//198 205//205 208//206 +f 202//201 206//207 201//198 +f 203//203 207//208 206//207 +f 204//204 208//206 203//203 +f 205//205 209//209 208//206 +f 206//207 210//210 205//205 +f 207//208 211//211 206//207 +f 208//206 212//212 207//208 +f 209//209 213//213 216//214 +f 210//210 214//215 213//213 +f 211//211 215//216 214//215 +f 212//212 216//214 215//216 +f 217//217 221//218 224//219 +f 218//220 222//221 217//217 +f 219//222 223//223 222//221 +f 220//224 224//219 219//222 +f 221//218 225//225 224//219 +f 222//221 226//226 225//225 +f 223//223 227//227 222//221 +f 224//219 228//228 227//227 +f 225//225 229//229 232//230 +f 226//226 230//231 229//229 +f 227//227 231//232 230//231 +f 228//228 232//230 231//232 +f 233//233 237//234 240//235 +f 234//236 238//237 233//233 +f 235//238 239//239 238//237 +f 236//240 240//235 235//238 +f 237//234 241//241 240//235 +f 238//237 242//242 241//241 +f 239//239 243//243 238//237 +f 240//235 244//244 243//243 +f 241//241 245//245 248//246 +f 242//242 246//247 245//245 +f 243//243 247//248 246//247 +f 244//244 248//246 247//248 +f 249//249 253//250 252//251 +f 250//252 254//253 249//249 +f 251//254 255//255 250//252 +f 252//251 256//256 251//254 +f 253//250 257//257 260//258 +f 254//253 258//259 253//250 +f 255//255 259//260 258//259 +f 256//256 260//258 255//255 +f 257//257 261//261 264//262 +f 258//259 262//263 261//261 +f 259//260 263//264 262//263 +f 260//258 264//262 263//264 +f 265//265 269//266 268//267 +f 266//268 270//269 265//265 +f 267//270 271//271 266//268 +f 268//267 272//272 267//270 +f 269//266 273//273 276//274 +f 270//269 274//275 273//273 +f 271//271 275//276 274//275 +f 272//272 276//274 275//276 +f 277//277 281//278 284//279 +f 278//280 282//281 281//278 +f 279//282 283//283 282//281 +f 280//284 284//279 283//283 +f 281//278 285//285 288//286 +f 282//281 286//287 285//285 +f 283//283 287//288 286//287 +f 284//279 288//286 287//288 +f 289//289 293//290 292//291 +f 290//292 294//293 289//289 +f 291//294 295//295 290//292 +f 292//291 296//296 291//294 +f 293//290 297//297 300//298 +f 294//293 298//299 297//297 +f 295//295 299//300 298//299 +f 296//296 300//298 299//300 +f 301//301 305//302 308//303 +f 302//304 306//305 305//302 +f 303//306 307//307 306//305 +f 304//308 308//303 307//307 +f 305//302 309//309 312//310 +f 306//305 310//311 309//309 +f 307//307 311//312 310//311 +f 308//303 312//310 311//312 +f 313//313 317//314 316//315 +f 314//316 318//317 313//313 +f 315//318 319//319 314//316 +f 316//315 320//320 315//318 +f 317//314 321//321 324//322 +f 318//317 322//323 321//321 +f 319//319 323//324 322//323 +f 320//320 324//322 323//324 +f 325//325 329//326 332//327 +f 326//328 330//329 329//326 +f 327//330 331//331 330//329 +f 328//332 332//327 331//331 +f 333//333 337//334 340//335 +f 334//336 338//337 337//334 +f 335//338 339//339 338//337 +f 336//340 340//335 339//339 +f 341//341 345//342 348//343 +f 342//344 346//345 345//342 +f 343//346 347//347 346//345 +f 344//348 348//343 347//347 +f 349//349 353//350 356//351 +f 350//352 354//353 353//350 +f 351//354 355//355 354//353 +f 352//356 356//351 355//355 +f 357//357 361//358 364//359 +f 358//360 362//361 361//358 +f 359//362 363//363 362//361 +f 360//364 364//359 363//363 +f 365//365 369//366 372//367 +f 366//368 370//369 369//366 +f 367//370 371//371 370//369 +f 368//372 372//367 371//371 +f 373//373 377//374 380//375 +f 374//376 378//377 377//374 +f 375//378 379//379 378//377 +f 376//380 380//375 379//379 +f 377//374 381//381 384//382 +f 378//377 382//383 381//381 +f 379//379 383//384 382//383 +f 380//375 384//382 383//384 +f 381//381 385//385 388//386 +f 382//383 386//387 381//381 +f 383//384 387//388 386//387 +f 384//382 388//386 383//384 +f 385//385 389//389 388//386 +f 386//387 390//390 385//385 +f 387//388 391//391 386//387 +f 388//386 392//392 387//388 +f 389//389 393//393 396//394 +f 390//390 394//395 389//389 +f 391//391 395//396 394//395 +f 392//392 396//394 391//391 +f 393//393 397//397 396//394 +f 394//395 398//398 397//397 +f 395//396 399//399 394//395 +f 396//394 400//400 399//399 +f 397//397 401//401 404//402 +f 398//398 402//403 401//401 +f 399//399 403//404 402//403 +f 400//400 404//402 403//404 +f 401//401 405//405 404//402 +f 402//403 406//406 401//401 +f 403//404 407//407 402//403 +f 404//402 408//408 403//404 +f 405//405 409//409 412//410 +f 406//406 410//411 409//409 +f 407//407 411//412 410//411 +f 408//408 412//410 411//412 +f 409//409 413//413 416//414 +f 410//411 414//415 413//413 +f 411//412 415//416 414//415 +f 412//410 416//414 415//416 +f 417//417 421//418 420//419 +f 418//420 422//421 417//417 +f 419//422 423//423 418//420 +f 420//419 424//424 419//422 +f 421//418 425//425 428//426 +f 422//421 426//427 425//425 +f 423//423 427//428 426//427 +f 424//424 428//426 427//428 +f 425//425 429//429 428//426 +f 426//427 430//430 425//425 +f 427//428 431//431 426//427 +f 428//426 432//432 427//428 +f 429//429 433//433 436//434 +f 430//430 434//435 429//429 +f 431//431 435//436 434//435 +f 432//432 436//434 431//431 +f 433//433 437//437 436//434 +f 434//435 438//438 437//437 +f 435//436 439//439 434//435 +f 436//434 440//440 439//439 +f 437//437 441//441 444//442 +f 438//438 442//443 441//441 +f 439//439 443//444 442//443 +f 440//440 444//442 443//444 +f 441//441 445//445 444//442 +f 442//443 446//446 445//445 +f 443//444 447//447 442//443 +f 444//442 448//448 447//447 +f 445//445 449//449 452//450 +f 446//446 450//451 445//445 +f 447//447 451//452 450//451 +f 448//448 452//450 447//447 +f 449//449 453//453 456//454 +f 450//451 454//455 453//453 +f 451//452 455//456 454//455 +f 452//450 456//454 455//456 +f 453//453 457//457 460//458 +f 454//455 458//459 457//457 +f 455//456 459//460 458//459 +f 456//454 460//458 459//460 +f 461//461 465//462 464//463 +f 462//464 466//465 465//462 +f 463//466 467//467 462//464 +f 464//463 468//468 467//467 +f 465//462 469//469 468//468 +f 466//465 470//470 469//469 +f 467//467 471//471 466//465 +f 468//468 472//472 471//471 +f 469//469 473//473 472//472 +f 470//470 474//474 469//469 +f 471//471 475//475 470//470 +f 472//472 476//476 471//471 +f 473//473 477//477 480//478 +f 474//474 478//479 473//473 +f 475//475 479//480 478//479 +f 476//476 480//478 475//475 +f 477//477 481//481 484//482 +f 478//479 482//483 481//481 +f 479//480 483//484 482//483 +f 480//478 484//482 483//484 +f 481//481 485//485 488//486 +f 482//483 486//487 481//481 +f 483//484 487//488 486//487 +f 484//482 488//486 483//484 +f 485//485 489//489 488//486 +f 486//487 490//490 489//489 +f 487//488 491//491 486//487 +f 488//486 492//492 491//491 +f 489//489 493//493 492//492 +f 490//490 494//494 489//489 +f 491//491 495//495 490//490 +f 492//492 496//496 491//491 +f 493//493 497//497 500//498 +f 494//494 498//499 497//497 +f 495//495 499//500 498//499 +f 496//496 500//498 499//500 +f 497//497 501//501 504//502 +f 498//499 502//503 501//501 +f 499//500 503//504 502//503 +f 500//498 504//502 503//504 +f 505//505 509//506 508//507 +f 506//508 510//509 509//506 +f 507//510 511//511 506//508 +f 508//507 512//512 511//511 +f 509//506 513//513 516//514 +f 510//509 514//515 513//513 +f 511//511 515//516 514//515 +f 512//512 516//514 515//516 +f 513//513 517//517 520//518 +f 514//515 518//519 517//517 +f 515//516 519//520 518//519 +f 516//514 520//518 519//520 +f 517//517 521//521 520//518 +f 518//519 522//522 521//521 +f 519//520 523//523 518//519 +f 520//518 524//524 519//520 +f 521//521 525//525 528//526 +f 522//522 526//527 521//521 +f 523//523 527//528 526//527 +f 524//524 528//526 523//523 +f 525//525 529//529 532//530 +f 526//527 530//531 529//529 +f 527//528 531//532 530//531 +f 528//526 532//530 531//532 +f 529//529 533//533 536//534 +f 530//531 534//535 533//533 +f 531//532 535//536 534//535 +f 532//530 536//534 535//536 +f 533//533 537//537 536//534 +f 534//535 538//538 533//533 +f 535//536 539//539 534//535 +f 536//534 540//540 535//536 +f 537//537 541//541 540//540 +f 538//538 542//542 537//537 +f 539//539 543//543 538//538 +f 540//540 544//544 539//539 +f 541//541 545//545 548//546 +f 542//542 546//547 545//545 +f 543//543 547//548 546//547 +f 544//544 548//546 547//548 +f 549//549 553//550 556//551 +f 550//552 554//553 553//550 +f 551//554 555//555 554//553 +f 552//556 556//551 555//555 +f 553//550 557//557 556//551 +f 554//553 558//558 553//550 +f 555//555 559//559 554//553 +f 556//551 560//560 555//555 +f 557//557 561//561 564//562 +f 558//558 562//563 557//557 +f 559//559 563//564 562//563 +f 560//560 564//562 559//559 +f 561//561 565//565 564//562 +f 562//563 566//566 565//565 +f 563//564 567//567 562//563 +f 564//562 568//568 567//567 +f 565//565 569//569 568//568 +f 566//566 570//570 565//565 +f 567//567 571//571 566//566 +f 568//568 572//572 567//567 +f 569//569 573//573 572//572 +f 570//570 574//574 573//573 +f 571//571 575//575 570//570 +f 572//572 576//576 575//575 +f 573//573 577//577 580//578 +f 574//574 578//579 573//573 +f 575//575 579//580 578//579 +f 576//576 580//578 575//575 +f 577//577 581//581 580//578 +f 578//579 582//582 577//577 +f 579//580 583//583 578//579 +f 580//578 584//584 579//580 +f 581//581 585//585 584//584 +f 582//582 586//586 581//581 +f 583//583 587//587 582//582 +f 584//584 588//588 583//583 +f 585//585 589//589 592//590 +f 586//586 590//591 589//589 +f 587//587 591//592 590//591 +f 588//588 592//590 591//592 +f 593//593 597//594 596//595 +f 594//596 598//597 597//594 +f 595//598 599//599 594//596 +f 596//595 600//600 599//599 +f 597//594 601//601 604//602 +f 598//597 602//603 597//594 +f 599//599 603//604 602//603 +f 600//600 604//602 599//599 +f 601//601 605//605 604//602 +f 602//603 606//606 605//605 +f 603//604 607//607 602//603 +f 604//602 608//608 607//607 +f 605//605 609//609 608//608 +f 606//606 610//610 605//605 +f 607//607 611//611 606//606 +f 608//608 612//612 607//607 +f 609//609 613//613 616//614 +f 610//610 614//615 613//613 +f 611//611 615//616 614//615 +f 612//612 616//614 615//616 +f 613//613 617//617 620//618 +f 614//615 618//619 613//613 +f 615//616 619//620 618//619 +f 616//614 620//618 615//616 +f 617//617 621//621 624//622 +f 618//619 622//623 621//621 +f 619//620 623//624 622//623 +f 620//618 624//622 623//624 +f 621//621 625//625 624//622 +f 622//623 626//626 621//621 +f 623//624 627//627 622//623 +f 624//622 628//628 623//624 +f 625//625 629//629 632//630 +f 626//626 630//631 625//625 +f 627//627 631//632 630//631 +f 628//628 632//630 627//627 +f 629//629 633//633 636//634 +f 630//631 634//635 633//633 +f 631//632 635//636 634//635 +f 632//630 636//634 635//636 +f 637//637 641//638 640//639 +f 638//640 642//641 641//638 +f 639//642 643//643 638//640 +f 640//639 644//644 643//643 +f 641//638 645//645 648//646 +f 642//641 646//647 641//638 +f 643//643 647//648 646//647 +f 644//644 648//646 643//643 +f 645//645 649//649 648//646 +f 646//647 650//650 645//645 +f 647//648 651//651 646//647 +f 648//646 652//652 647//648 +f 649//649 653//653 656//654 +f 650//650 654//655 653//653 +f 651//651 655//656 654//655 +f 652//652 656//654 655//656 +f 653//653 657//657 660//658 +f 654//655 658//659 657//657 +f 655//656 659//660 658//659 +f 656//654 660//658 659//660 +f 657//657 661//661 664//662 +f 658//659 662//663 657//657 +f 659//660 663//664 662//663 +f 660//658 664//662 663//664 +f 661//661 665//665 664//662 +f 662//663 666//666 661//661 +f 663//664 667//667 662//663 +f 664//662 668//668 663//664 +f 665//665 669//669 668//668 +f 666//666 670//670 669//669 +f 667//667 671//671 666//666 +f 668//668 672//672 671//671 +f 669//669 673//673 676//674 +f 670//670 674//675 673//673 +f 671//671 675//676 674//675 +f 672//672 676//674 675//676 +f 673//673 677//677 680//678 +f 674//675 678//679 677//677 +f 675//676 679//680 678//679 +f 676//674 680//678 679//680 +f 681//681 685//682 684//683 +f 682//684 686//685 681//681 +f 683//686 687//687 682//684 +f 684//683 688//688 683//686 +f 685//682 689//689 692//690 +f 686//685 690//691 689//689 +f 687//687 691//692 690//691 +f 688//688 692//690 691//692 +f 689//689 693//693 696//694 +f 690//691 694//695 693//693 +f 691//692 695//696 694//695 +f 692//690 696//694 695//696 +f 693//693 697//697 700//698 +f 694//695 698//699 693//693 +f 695//696 699//700 698//699 +f 696//694 700//698 695//696 +f 697//697 701//701 700//698 +f 698//699 702//702 701//701 +f 699//700 703//703 698//699 +f 700//698 704//704 703//703 +f 701//701 705//705 704//704 +f 702//702 706//706 701//701 +f 703//703 707//707 702//702 +f 704//704 708//708 703//703 +f 705//705 709//709 712//710 +f 706//706 710//711 709//709 +f 707//707 711//712 710//711 +f 708//708 712//710 711//712 +f 709//709 713//713 712//710 +f 710//711 714//714 713//713 +f 711//712 715//715 710//711 +f 712//710 716//716 715//715 +f 713//713 717//717 720//718 +f 714//714 718//719 713//713 +f 715//715 719//720 718//719 +f 716//716 720//718 715//715 +f 717//717 721//721 724//722 +f 718//719 722//723 721//721 +f 719//720 723//724 722//723 +f 720//718 724//722 723//724 +f 725//725 729//726 732//727 +f 726//728 730//729 729//726 +f 727//730 731//731 730//729 +f 728//732 732//727 731//731 +f 729//726 733//733 736//734 +f 730//729 734//735 733//733 +f 731//731 735//736 734//735 +f 732//727 736//734 735//736 +f 733//733 737//737 736//734 +f 734//735 738//738 737//737 +f 735//736 739//739 734//735 +f 736//734 740//740 739//739 +f 737//737 741//741 744//742 +f 738//738 742//743 737//737 +f 739//739 743//744 742//743 +f 740//740 744//742 739//739 +f 741//741 745//745 748//746 +f 742//743 746//747 741//741 +f 743//744 747//748 742//743 +f 744//742 748//746 743//744 +f 745//745 749//749 748//746 +f 746//747 750//750 749//749 +f 747//748 751//751 746//747 +f 748//746 752//752 751//751 +f 749//749 753//753 752//752 +f 750//750 754//754 753//753 +f 751//751 755//755 750//750 +f 752//752 756//756 755//755 +f 753//753 757//757 760//758 +f 754//754 758//759 753//753 +f 755//755 759//760 758//759 +f 756//756 760//758 755//755 +f 757//757 761//761 760//758 +f 758//759 762//762 761//761 +f 759//760 763//763 758//759 +f 760//758 764//764 763//763 +f 761//761 765//765 768//766 +f 762//762 766//767 765//765 +f 763//763 767//768 766//767 +f 764//764 768//766 767//768 +f 769//769 773//770 772//771 +f 770//772 774//773 773//770 +f 771//774 775//775 770//772 +f 772//771 776//776 775//775 +f 773//770 777//777 780//778 +f 774//773 778//779 773//770 +f 775//775 779//780 778//779 +f 776//776 780//778 775//775 +f 777//777 781//781 780//778 +f 778//779 782//782 781//781 +f 779//780 783//783 778//779 +f 780//778 784//784 783//783 +f 781//781 785//785 784//784 +f 782//782 786//786 781//781 +f 783//783 787//787 782//782 +f 784//784 788//788 783//783 +f 785//785 789//789 792//790 +f 786//786 790//791 789//789 +f 787//787 791//792 790//791 +f 788//788 792//790 791//792 +f 789//789 793//793 796//794 +f 790//791 794//795 789//789 +f 791//792 795//796 794//795 +f 792//790 796//794 791//792 +f 793//793 797//797 796//794 +f 794//795 798//798 793//793 +f 795//796 799//799 794//795 +f 796//794 800//800 795//796 +f 797//797 801//801 804//802 +f 798//798 802//803 801//801 +f 799//799 803//804 802//803 +f 800//800 804//802 803//804 +f 801//801 805//805 804//802 +f 802//803 806//806 801//801 +f 803//804 807//807 802//803 +f 804//802 808//808 803//804 +f 805//805 809//809 812//810 +f 806//806 810//811 809//809 +f 807//807 811//812 810//811 +f 808//808 812//810 811//812 +f 813//813 817//814 816//815 +f 814//816 818//817 813//813 +f 815//818 819//819 814//816 +f 816//815 820//820 819//819 +f 817//814 821//821 824//822 +f 818//817 822//823 821//821 +f 819//819 823//824 822//823 +f 820//820 824//822 823//824 +f 821//821 825//825 824//822 +f 822//823 826//826 825//825 +f 823//824 827//827 822//823 +f 824//822 828//828 827//827 +f 825//825 829//829 832//830 +f 826//826 830//831 825//825 +f 827//827 831//832 830//831 +f 828//828 832//830 827//827 +f 829//829 833//833 836//834 +f 830//831 834//835 833//833 +f 831//832 835//836 834//835 +f 832//830 836//834 835//836 +f 833//833 837//837 840//838 +f 834//835 838//839 833//833 +f 835//836 839//840 838//839 +f 836//834 840//838 835//836 +f 837//837 841//841 840//838 +f 838//839 842//842 841//841 +f 839//840 843//843 838//839 +f 840//838 844//844 843//843 +f 841//841 845//845 844//844 +f 842//842 846//846 845//845 +f 843//843 847//847 842//842 +f 844//844 848//848 847//847 +f 845//845 849//849 852//850 +f 846//846 850//851 845//845 +f 847//847 851//852 850//851 +f 848//848 852//850 847//847 +f 849//849 853//853 856//854 +f 850//851 854//855 853//853 +f 851//852 855//856 854//855 +f 852//850 856//854 855//856 +f 857//857 861//858 864//859 +f 858//860 862//861 857//857 +f 859//862 863//863 862//861 +f 860//864 864//859 859//862 +f 861//858 865//865 864//859 +f 862//861 866//866 865//865 +f 863//863 867//867 862//861 +f 864//859 868//868 867//867 +f 865//865 869//869 868//868 +f 866//866 870//870 869//869 +f 867//867 871//871 866//866 +f 868//868 872//872 871//871 +f 869//869 873//873 872//872 +f 870//870 874//874 873//873 +f 871//871 875//875 870//870 +f 872//872 876//876 875//875 +f 873//873 877//877 876//876 +f 874//874 878//878 877//877 +f 875//875 879//879 874//874 +f 876//876 880//880 879//879 +f 877//877 881//881 884//882 +f 878//878 882//883 881//881 +f 879//879 883//884 882//883 +f 880//880 884//882 883//884 +f 881//881 885//885 888//886 +f 882//883 886//887 881//881 +f 883//884 887//888 886//887 +f 884//882 888//886 883//884 +f 885//885 889//889 888//886 +f 886//887 890//890 889//889 +f 887//888 891//891 886//887 +f 888//886 892//892 891//891 +f 889//889 893//893 896//894 +f 890//890 894//895 893//893 +f 891//891 895//896 894//895 +f 892//892 896//894 895//896 +f 893//893 897//897 900//898 +f 894//895 898//899 897//897 +f 895//896 899//900 898//899 +f 896//894 900//898 899//900 +f 901//901 905//902 908//903 +f 902//904 906//905 905//902 +f 903//906 907//907 906//905 +f 904//908 908//903 907//907 +f 905//902 909//909 912//910 +f 906//905 910//911 909//909 +f 907//907 911//912 910//911 +f 908//903 912//910 911//912 +f 909//909 913//913 912//910 +f 910//911 914//914 909//909 +f 911//912 915//915 910//911 +f 912//910 916//916 911//912 +f 913//913 917//917 920//918 +f 914//914 918//919 913//913 +f 915//915 919//920 918//919 +f 916//916 920//918 915//915 +f 917//917 921//921 920//918 +f 918//919 922//922 917//917 +f 919//920 923//923 918//919 +f 920//918 924//924 919//920 +f 921//921 925//925 928//926 +f 922//922 926//927 921//921 +f 923//923 927//928 926//927 +f 924//924 928//926 923//923 +f 925//925 929//929 928//926 +f 926//927 930//930 929//929 +f 927//928 931//931 926//927 +f 928//926 932//932 931//931 +f 929//929 933//933 932//932 +f 930//930 934//934 933//933 +f 931//931 935//935 930//930 +f 932//932 936//936 935//935 +f 933//933 937//937 940//938 +f 934//934 938//939 937//937 +f 935//935 939//940 938//939 +f 936//936 940//938 939//940 +f 937//937 941//941 944//942 +f 938//939 942//943 941//941 +f 939//940 943//944 942//943 +f 940//938 944//942 943//944 +f 945//945 949//946 948//947 +f 946//948 950//949 949//946 +f 947//950 951//951 946//948 +f 948//947 952//952 951//951 +f 949//946 953//953 956//954 +f 950//949 954//955 953//953 +f 951//951 955//956 954//955 +f 952//952 956//954 955//956 +f 953//953 957//957 956//954 +f 954//955 958//958 953//953 +f 955//956 959//959 954//955 +f 956//954 960//960 955//956 +f 957//957 961//961 964//962 +f 958//958 962//963 957//957 +f 959//959 963//964 962//963 +f 960//960 964//962 959//959 +f 961//961 965//965 968//966 +f 962//963 966//967 961//961 +f 963//964 967//968 966//967 +f 964//962 968//966 963//964 +f 965//965 969//969 968//966 +f 966//967 970//970 965//965 +f 967//968 971//971 966//967 +f 968//966 972//972 967//968 +f 969//969 973//973 976//974 +f 970//970 974//975 973//973 +f 971//971 975//976 974//975 +f 972//972 976//974 975//976 +f 973//973 977//977 980//978 +f 974//975 978//979 973//973 +f 975//976 979//980 978//979 +f 976//974 980//978 975//976 +f 977//977 981//981 980//978 +f 978//979 982//982 981//981 +f 979//980 983//983 978//979 +f 980//978 984//984 983//983 +f 981//981 985//985 988//986 +f 982//982 986//987 985//985 +f 983//983 987//988 986//987 +f 984//984 988//986 987//988 +f 989//989 993//990 992//991 +f 990//992 994//993 989//989 +f 991//994 995//995 990//992 +f 992//991 996//996 991//994 +f 993//990 997//997 996//996 +f 994//993 998//998 993//990 +f 995//995 999//999 994//993 +f 996//996 1000//1000 995//995 +f 997//997 1001//1001 1004//1002 +f 998//998 1002//1003 997//997 +f 999//999 1003//1004 1002//1003 +f 1000//1000 1004//1002 999//999 +f 1001//1001 1005//1005 1004//1002 +f 1002//1003 1006//1006 1005//1005 +f 1003//1004 1007//1007 1002//1003 +f 1004//1002 1008//1008 1007//1007 +f 1005//1005 1009//1009 1012//1010 +f 1006//1006 1010//1011 1009//1009 +f 1007//1007 1011//1012 1010//1011 +f 1008//1008 1012//1010 1011//1012 +f 1009//1009 1013//1013 1016//1014 +f 1010//1011 1014//1015 1013//1013 +f 1011//1012 1015//1016 1014//1015 +f 1012//1010 1016//1014 1015//1016 +f 1013//1013 1017//1017 1016//1014 +f 1014//1015 1018//1018 1017//1017 +f 1015//1016 1019//1019 1014//1015 +f 1016//1014 1020//1020 1019//1019 +f 1017//1017 1021//1021 1024//1022 +f 1018//1018 1022//1023 1021//1021 +f 1019//1019 1023//1024 1022//1023 +f 1020//1020 1024//1022 1023//1024 +f 1021//1021 1025//1025 1028//1026 +f 1022//1023 1026//1027 1025//1025 +f 1023//1024 1027//1028 1026//1027 +f 1024//1022 1028//1026 1027//1028 +f 1025//1025 1029//1029 1032//1030 +f 1026//1027 1030//1031 1029//1029 +f 1027//1028 1031//1032 1030//1031 +f 1028//1026 1032//1030 1031//1032 +f 1033//1033 1037//1034 1040//1035 +f 1034//1036 1038//1037 1033//1033 +f 1035//1038 1039//1039 1038//1037 +f 1036//1040 1040//1035 1035//1038 +f 1037//1034 1041//1041 1044//1042 +f 1038//1037 1042//1043 1037//1034 +f 1039//1039 1043//1044 1042//1043 +f 1040//1035 1044//1042 1039//1039 +f 1041//1041 1045//1045 1044//1042 +f 1042//1043 1046//1046 1045//1045 +f 1043//1044 1047//1047 1042//1043 +f 1044//1042 1048//1048 1047//1047 +f 1045//1045 1049//1049 1052//1050 +f 1046//1046 1050//1051 1049//1049 +f 1047//1047 1051//1052 1050//1051 +f 1048//1048 1052//1050 1051//1052 +f 1049//1049 1053//1053 1052//1050 +f 1050//1051 1054//1054 1053//1053 +f 1051//1052 1055//1055 1050//1051 +f 1052//1050 1056//1056 1055//1055 +f 1053//1053 1057//1057 1056//1056 +f 1054//1054 1058//1058 1057//1057 +f 1055//1055 1059//1059 1054//1054 +f 1056//1056 1060//1060 1059//1059 +f 1057//1057 1061//1061 1064//1062 +f 1058//1058 1062//1063 1057//1057 +f 1059//1059 1063//1064 1062//1063 +f 1060//1060 1064//1062 1059//1059 +f 1061//1061 1065//1065 1064//1062 +f 1062//1063 1066//1066 1061//1061 +f 1063//1064 1067//1067 1062//1063 +f 1064//1062 1068//1068 1063//1064 +f 1065//1065 1069//1069 1072//1070 +f 1066//1066 1070//1071 1069//1069 +f 1067//1067 1071//1072 1070//1071 +f 1068//1068 1072//1070 1071//1072 +f 1069//1069 1073//1073 1076//1074 +f 1070//1071 1074//1075 1073//1073 +f 1071//1072 1075//1076 1074//1075 +f 1072//1070 1076//1074 1075//1076 +f 1077//1077 1081//1078 1080//1079 +f 1078//1080 1082//1081 1077//1077 +f 1079//1082 1083//1083 1078//1080 +f 1080//1079 1084//1084 1079//1082 +f 1081//1078 1085//1085 1088//1086 +f 1082//1081 1086//1087 1085//1085 +f 1083//1083 1087//1088 1086//1087 +f 1084//1084 1088//1086 1087//1088 +f 1085//1085 1089//1089 1088//1086 +f 1086//1087 1090//1090 1089//1089 +f 1087//1088 1091//1091 1086//1087 +f 1088//1086 1092//1092 1091//1091 +f 1089//1089 1093//1093 1096//1094 +f 1090//1090 1094//1095 1089//1089 +f 1091//1091 1095//1096 1094//1095 +f 1092//1092 1096//1094 1091//1091 +f 1093//1093 1097//1097 1096//1094 +f 1094//1095 1098//1098 1097//1097 +f 1095//1096 1099//1099 1094//1095 +f 1096//1094 1100//1100 1099//1099 +f 1097//1097 1101//1101 1100//1100 +f 1098//1098 1102//1102 1097//1097 +f 1099//1099 1103//1103 1098//1098 +f 1100//1100 1104//1104 1099//1099 +f 1101//1101 1105//1105 1108//1106 +f 1102//1102 1106//1107 1101//1101 +f 1103//1103 1107//1108 1106//1107 +f 1104//1104 1108//1106 1103//1103 +f 1105//1105 1109//1109 1108//1106 +f 1106//1107 1110//1110 1105//1105 +f 1107//1108 1111//1111 1106//1107 +f 1108//1106 1112//1112 1107//1108 +f 1109//1109 1113//1113 1112//1112 +f 1110//1110 1114//1114 1113//1113 +f 1111//1111 1115//1115 1110//1110 +f 1112//1112 1116//1116 1115//1115 +f 1113//1113 1117//1117 1120//1118 +f 1114//1114 1118//1119 1117//1117 +f 1115//1115 1119//1120 1118//1119 +f 1116//1116 1120//1118 1119//1120 +f 1121//1121 1125//1122 1128//1123 +f 1122//1124 1126//1125 1125//1122 +f 1123//1126 1127//1127 1126//1125 +f 1124//1128 1128//1123 1127//1127 +f 1125//1122 1129//1129 1132//1130 +f 1126//1125 1130//1131 1129//1129 +f 1127//1127 1131//1132 1130//1131 +f 1128//1123 1132//1130 1131//1132 +f 1129//1129 1133//1133 1132//1130 +f 1130//1131 1134//1134 1129//1129 +f 1131//1132 1135//1135 1130//1131 +f 1132//1130 1136//1136 1131//1132 +f 1133//1133 1137//1137 1136//1136 +f 1134//1134 1138//1138 1137//1137 +f 1135//1135 1139//1139 1134//1134 +f 1136//1136 1140//1140 1139//1139 +f 1137//1137 1141//1141 1144//1142 +f 1138//1138 1142//1143 1137//1137 +f 1139//1139 1143//1144 1142//1143 +f 1140//1140 1144//1142 1139//1139 +f 1141//1141 1145//1145 1144//1142 +f 1142//1143 1146//1146 1145//1145 +f 1143//1144 1147//1147 1142//1143 +f 1144//1142 1148//1148 1147//1147 +f 1145//1145 1149//1149 1148//1148 +f 1146//1146 1150//1150 1149//1149 +f 1147//1147 1151//1151 1146//1146 +f 1148//1148 1152//1152 1151//1151 +f 1149//1149 1153//1153 1152//1152 +f 1150//1150 1154//1154 1153//1153 +f 1151//1151 1155//1155 1150//1150 +f 1152//1152 1156//1156 1155//1155 +f 1153//1153 1157//1157 1160//1158 +f 1154//1154 1158//1159 1153//1153 +f 1155//1155 1159//1160 1158//1159 +f 1156//1156 1160//1158 1155//1155 +f 1157//1157 1161//1161 1164//1162 +f 1158//1159 1162//1163 1161//1161 +f 1159//1160 1163//1164 1162//1163 +f 1160//1158 1164//1162 1163//1164 +f 1165//1165 1169//1166 1172//1167 +f 1166//1168 1170//1169 1165//1165 +f 1167//1170 1171//1171 1170//1169 +f 1168//1172 1172//1167 1167//1170 +f 1169//1166 1173//1173 1172//1167 +f 1170//1169 1174//1174 1173//1173 +f 1171//1171 1175//1175 1170//1169 +f 1172//1167 1176//1176 1175//1175 +f 1173//1173 1177//1177 1176//1176 +f 1174//1174 1178//1178 1173//1173 +f 1175//1175 1179//1179 1174//1174 +f 1176//1176 1180//1180 1175//1175 +f 1177//1177 1181//1181 1180//1180 +f 1178//1178 1182//1182 1181//1181 +f 1179//1179 1183//1183 1178//1178 +f 1180//1180 1184//1184 1183//1183 +f 1181//1181 1185//1185 1188//1186 +f 1182//1182 1186//1187 1185//1185 +f 1183//1183 1187//1188 1186//1187 +f 1184//1184 1188//1186 1187//1188 +f 1185//1185 1189//1189 1188//1186 +f 1186//1187 1190//1190 1189//1189 +f 1187//1188 1191//1191 1186//1187 +f 1188//1186 1192//1192 1191//1191 +f 1189//1189 1193//1193 1192//1192 +f 1190//1190 1194//1194 1193//1193 +f 1191//1191 1195//1195 1190//1190 +f 1192//1192 1196//1196 1195//1195 +f 1193//1193 1197//1197 1200//1198 +f 1194//1194 1198//1199 1197//1197 +f 1195//1195 1199//1200 1198//1199 +f 1196//1196 1200//1198 1199//1200 +f 1197//1197 1201//1201 1200//1198 +f 1198//1199 1202//1202 1197//1197 +f 1199//1200 1203//1203 1198//1199 +f 1200//1198 1204//1204 1199//1200 +f 1201//1201 1205//1205 1208//1206 +f 1202//1202 1206//1207 1205//1205 +f 1203//1203 1207//1208 1206//1207 +f 1204//1204 1208//1206 1207//1208 +f 1209//1209 1213//1210 1216//1211 +f 1210//1212 1214//1213 1209//1209 +f 1211//1214 1215//1215 1214//1213 +f 1212//1216 1216//1211 1211//1214 +f 1213//1210 1217//1217 1216//1211 +f 1214//1213 1218//1218 1217//1217 +f 1215//1215 1219//1219 1214//1213 +f 1216//1211 1220//1220 1219//1219 +f 1217//1217 1221//1221 1224//1222 +f 1218//1218 1222//1223 1217//1217 +f 1219//1219 1223//1224 1222//1223 +f 1220//1220 1224//1222 1219//1219 +f 1221//1221 1225//1225 1228//1226 +f 1222//1223 1226//1227 1225//1225 +f 1223//1224 1227//1228 1226//1227 +f 1224//1222 1228//1226 1227//1228 +f 1225//1225 1229//1229 1228//1226 +f 1226//1227 1230//1230 1225//1225 +f 1227//1228 1231//1231 1226//1227 +f 1228//1226 1232//1232 1227//1228 +f 1229//1229 1233//1233 1232//1232 +f 1230//1230 1234//1234 1233//1233 +f 1231//1231 1235//1235 1230//1230 +f 1232//1232 1236//1236 1235//1235 +f 1233//1233 1237//1237 1240//1238 +f 1234//1234 1238//1239 1233//1233 +f 1235//1235 1239//1240 1238//1239 +f 1236//1236 1240//1238 1235//1235 +f 1237//1237 1241//1241 1244//1242 +f 1238//1239 1242//1243 1241//1241 +f 1239//1240 1243//1244 1242//1243 +f 1240//1238 1244//1242 1243//1244 +f 1241//1241 1245//1245 1244//1242 +f 1242//1243 1246//1246 1241//1241 +f 1243//1244 1247//1247 1242//1243 +f 1244//1242 1248//1248 1243//1244 +f 1245//1245 1249//1249 1252//1250 +f 1246//1246 1250//1251 1249//1249 +f 1247//1247 1251//1252 1250//1251 +f 1248//1248 1252//1250 1251//1252 +f 1253//1253 1257//1254 1260//1255 +f 1254//1256 1258//1257 1257//1254 +f 1255//1258 1259//1259 1258//1257 +f 1256//1260 1260//1255 1259//1259 +f 1257//1254 1261//1261 1260//1255 +f 1258//1257 1262//1262 1257//1254 +f 1259//1259 1263//1263 1258//1257 +f 1260//1255 1264//1264 1259//1259 +f 1261//1261 1265//1265 1268//1266 +f 1262//1262 1266//1267 1261//1261 +f 1263//1263 1267//1268 1266//1267 +f 1264//1264 1268//1266 1263//1263 +f 1265//1265 1269//1269 1272//1270 +f 1266//1267 1270//1271 1269//1269 +f 1267//1268 1271//1272 1270//1271 +f 1268//1266 1272//1270 1271//1272 +f 1269//1269 1273//1273 1272//1270 +f 1270//1271 1274//1274 1269//1269 +f 1271//1272 1275//1275 1270//1271 +f 1272//1270 1276//1276 1271//1272 +f 1273//1273 1277//1277 1280//1278 +f 1274//1274 1278//1279 1277//1277 +f 1275//1275 1279//1280 1278//1279 +f 1276//1276 1280//1278 1279//1280 +f 1277//1277 1281//1281 1280//1278 +f 1278//1279 1282//1282 1277//1277 +f 1279//1280 1283//1283 1278//1279 +f 1280//1278 1284//1284 1279//1280 +f 1281//1281 1285//1285 1288//1286 +f 1282//1282 1286//1287 1285//1285 +f 1283//1283 1287//1288 1286//1287 +f 1284//1284 1288//1286 1287//1288 +f 1285//1285 1289//1289 1292//1290 +f 1286//1287 1290//1291 1285//1285 +f 1287//1288 1291//1292 1290//1291 +f 1288//1286 1292//1290 1287//1288 +f 1289//1289 1293//1293 1296//1294 +f 1290//1291 1294//1295 1293//1293 +f 1291//1292 1295//1296 1294//1295 +f 1292//1290 1296//1294 1295//1296 +f 1297//1297 1301//1298 1300//1299 +f 1298//1300 1302//1301 1297//1297 +f 1299//1302 1303//1303 1298//1300 +f 1300//1299 1304//1304 1299//1302 +f 1301//1298 1305//1305 1308//1306 +f 1302//1301 1306//1307 1305//1305 +f 1303//1303 1307//1308 1306//1307 +f 1304//1304 1308//1306 1307//1308 +f 1305//1305 1309//1309 1312//1310 +f 1306//1307 1310//1311 1309//1309 +f 1307//1308 1311//1312 1310//1311 +f 1308//1306 1312//1310 1311//1312 +f 1309//1309 1313//1313 1312//1310 +f 1310//1311 1314//1314 1313//1313 +f 1311//1312 1315//1315 1310//1311 +f 1312//1310 1316//1316 1315//1315 +f 1313//1313 1317//1317 1320//1318 +f 1314//1314 1318//1319 1317//1317 +f 1315//1315 1319//1320 1318//1319 +f 1316//1316 1320//1318 1319//1320 +f 1317//1317 1321//1321 1324//1322 +f 1318//1319 1322//1323 1317//1317 +f 1319//1320 1323//1324 1318//1319 +f 1320//1318 1324//1322 1319//1320 +f 1321//1321 1325//1325 1328//1326 +f 1322//1323 1326//1327 1321//1321 +f 1323//1324 1327//1328 1326//1327 +f 1324//1322 1328//1326 1323//1324 +f 1325//1325 1329//1329 1328//1326 +f 1326//1327 1330//1330 1329//1329 +f 1327//1328 1331//1331 1326//1327 +f 1328//1326 1332//1332 1331//1331 +f 1329//1329 1333//1333 1332//1332 +f 1330//1330 1334//1334 1333//1333 +f 1331//1331 1335//1335 1330//1330 +f 1332//1332 1336//1336 1335//1335 +f 1333//1333 1337//1337 1340//1338 +f 1334//1334 1338//1339 1337//1337 +f 1335//1335 1339//1340 1338//1339 +f 1336//1336 1340//1338 1339//1340 +f 1341//1341 1345//1342 1344//1343 +f 1342//1344 1346//1345 1341//1341 +f 1343//1346 1347//1347 1342//1344 +f 1344//1343 1348//1348 1343//1346 +f 1345//1342 1349//1349 1348//1348 +f 1346//1345 1350//1350 1345//1342 +f 1347//1347 1351//1351 1346//1345 +f 1348//1348 1352//1352 1347//1347 +f 1349//1349 1353//1353 1356//1354 +f 1350//1350 1354//1355 1349//1349 +f 1351//1351 1355//1356 1354//1355 +f 1352//1352 1356//1354 1351//1351 +f 1353//1353 1357//1357 1356//1354 +f 1354//1355 1358//1358 1357//1357 +f 1355//1356 1359//1359 1354//1355 +f 1356//1354 1360//1360 1359//1359 +f 1357//1357 1361//1361 1364//1362 +f 1358//1358 1362//1363 1361//1361 +f 1359//1359 1363//1364 1362//1363 +f 1360//1360 1364//1362 1363//1364 +f 1361//1361 1365//1365 1368//1366 +f 1362//1363 1366//1367 1365//1365 +f 1363//1364 1367//1368 1366//1367 +f 1364//1362 1368//1366 1367//1368 +f 1365//1365 1369//1369 1368//1366 +f 1366//1367 1370//1370 1369//1369 +f 1367//1368 1371//1371 1366//1367 +f 1368//1366 1372//1372 1371//1371 +f 1369//1369 1373//1373 1372//1372 +f 1370//1370 1374//1374 1369//1369 +f 1371//1371 1375//1375 1370//1370 +f 1372//1372 1376//1376 1371//1371 +f 1373//1373 1377//1377 1380//1378 +f 1374//1374 1378//1379 1377//1377 +f 1375//1375 1379//1380 1378//1379 +f 1376//1376 1380//1378 1379//1380 +f 1377//1377 1381//1381 1384//1382 +f 1378//1379 1382//1383 1381//1381 +f 1379//1380 1383//1384 1382//1383 +f 1380//1378 1384//1382 1383//1384 +f 1385//1385 1389//1386 1392//1387 +f 1386//1388 1390//1389 1389//1386 +f 1387//1390 1391//1391 1390//1389 +f 1388//1392 1392//1387 1391//1391 +f 1389//1386 1393//1393 1392//1387 +f 1390//1389 1394//1394 1389//1386 +f 1391//1391 1395//1395 1390//1389 +f 1392//1387 1396//1396 1391//1391 +f 1393//1393 1397//1397 1396//1396 +f 1394//1394 1398//1398 1393//1393 +f 1395//1395 1399//1399 1394//1394 +f 1396//1396 1400//1400 1395//1395 +f 1397//1397 1401//1401 1400//1400 +f 1398//1398 1402//1402 1401//1401 +f 1399//1399 1403//1403 1398//1398 +f 1400//1400 1404//1404 1403//1403 +f 1401//1401 1405//1405 1408//1406 +f 1402//1402 1406//1407 1401//1401 +f 1403//1403 1407//1408 1406//1407 +f 1404//1404 1408//1406 1403//1403 +f 1405//1405 1409//1409 1408//1406 +f 1406//1407 1410//1410 1405//1405 +f 1407//1408 1411//1411 1406//1407 +f 1408//1406 1412//1412 1407//1408 +f 1409//1409 1413//1413 1416//1414 +f 1410//1410 1414//1415 1413//1413 +f 1411//1411 1415//1416 1414//1415 +f 1412//1412 1416//1414 1415//1416 +f 1413//1413 1417//1417 1416//1414 +f 1414//1415 1418//1418 1413//1413 +f 1415//1416 1419//1419 1414//1415 +f 1416//1414 1420//1420 1415//1416 +f 1417//1417 1421//1421 1420//1420 +f 1418//1418 1422//1422 1421//1421 +f 1419//1419 1423//1423 1418//1418 +f 1420//1420 1424//1424 1423//1423 +f 1421//1421 1425//1425 1428//1426 +f 1422//1422 1426//1427 1425//1425 +f 1423//1423 1427//1428 1426//1427 +f 1424//1424 1428//1426 1427//1428 +f 1429//1429 1433//1430 1432//1431 +f 1430//1432 1434//1433 1429//1429 +f 1431//1434 1435//1435 1430//1432 +f 1432//1431 1436//1436 1431//1434 +f 1433//1430 1437//1437 1440//1438 +f 1434//1433 1438//1439 1437//1437 +f 1435//1435 1439//1440 1438//1439 +f 1436//1436 1440//1438 1439//1440 +f 1437//1437 1441//1441 1444//1442 +f 1438//1439 1442//1443 1441//1441 +f 1439//1440 1443//1444 1442//1443 +f 1440//1438 1444//1442 1443//1444 +f 1441//1441 1445//1445 1448//1446 +f 1442//1443 1446//1447 1445//1445 +f 1443//1444 1447//1448 1446//1447 +f 1444//1442 1448//1446 1447//1448 +f 1445//1445 1449//1449 1448//1446 +f 1446//1447 1450//1450 1445//1445 +f 1447//1448 1451//1451 1446//1447 +f 1448//1446 1452//1452 1447//1448 +f 1449//1449 1453//1453 1452//1452 +f 1450//1450 1454//1454 1449//1449 +f 1451//1451 1455//1455 1450//1450 +f 1452//1452 1456//1456 1451//1451 +f 1453//1453 1457//1457 1460//1458 +f 1454//1454 1458//1459 1457//1457 +f 1455//1455 1459//1460 1458//1459 +f 1456//1456 1460//1458 1459//1460 +f 1457//1457 1461//1461 1460//1458 +f 1458//1459 1462//1462 1457//1457 +f 1459//1460 1463//1463 1458//1459 +f 1460//1458 1464//1464 1459//1460 +f 1461//1461 1465//1465 1468//1466 +f 1462//1462 1466//1467 1465//1465 +f 1463//1463 1467//1468 1466//1467 +f 1464//1464 1468//1466 1467//1468 +f 1465//1465 1469//1469 1472//1470 +f 1466//1467 1470//1471 1469//1469 +f 1467//1468 1471//1472 1470//1471 +f 1468//1466 1472//1470 1471//1472 +f 1473//1473 1477//1474 1476//1475 +f 1474//1476 1478//1477 1473//1473 +f 1475//1478 1479//1479 1474//1476 +f 1476//1475 1480//1480 1475//1478 +f 1477//1474 1481//1481 1480//1480 +f 1478//1477 1482//1482 1477//1474 +f 1479//1479 1483//1483 1478//1477 +f 1480//1480 1484//1484 1479//1479 +f 1481//1481 1485//1485 1488//1486 +f 1482//1482 1486//1487 1485//1485 +f 1483//1483 1487//1488 1486//1487 +f 1484//1484 1488//1486 1487//1488 +f 1485//1485 1489//1489 1488//1486 +f 1486//1487 1490//1490 1489//1489 +f 1487//1488 1491//1491 1486//1487 +f 1488//1486 1492//1492 1491//1491 +f 1489//1489 1493//1493 1496//1494 +f 1490//1490 1494//1495 1489//1489 +f 1491//1491 1495//1496 1494//1495 +f 1492//1492 1496//1494 1491//1491 +f 1493//1493 1497//1497 1500//1498 +f 1494//1495 1498//1499 1493//1493 +f 1495//1496 1499//1500 1498//1499 +f 1496//1494 1500//1498 1495//1496 +f 1497//1497 1501//1501 1500//1498 +f 1498//1499 1502//1502 1501//1501 +f 1499//1500 1503//1503 1498//1499 +f 1500//1498 1504//1504 1503//1503 +f 1501//1501 1505//1505 1508//1506 +f 1502//1502 1506//1507 1501//1501 +f 1503//1503 1507//1508 1506//1507 +f 1504//1504 1508//1506 1503//1503 +f 1505//1505 1509//1509 1508//1506 +f 1506//1507 1510//1510 1509//1509 +f 1507//1508 1511//1511 1506//1507 +f 1508//1506 1512//1512 1511//1511 +f 1509//1509 1513//1513 1516//1514 +f 1510//1510 1514//1515 1513//1513 +f 1511//1511 1515//1516 1514//1515 +f 1512//1512 1516//1514 1515//1516 +f 1517//1517 1521//1518 1520//1519 +f 1518//1520 1522//1521 1521//1518 +f 1519//1522 1523//1523 1518//1520 +f 1520//1519 1524//1524 1523//1523 +f 1521//1518 1525//1525 1528//1526 +f 1522//1521 1526//1527 1521//1518 +f 1523//1523 1527//1528 1526//1527 +f 1524//1524 1528//1526 1523//1523 +f 1525//1525 1529//1529 1532//1530 +f 1526//1527 1530//1531 1529//1529 +f 1527//1528 1531//1532 1530//1531 +f 1528//1526 1532//1530 1531//1532 +f 1529//1529 1533//1533 1536//1534 +f 1530//1531 1534//1535 1529//1529 +f 1531//1532 1535//1536 1534//1535 +f 1532//1530 1536//1534 1531//1532 +f 1533//1533 1537//1537 1536//1534 +f 1534//1535 1538//1538 1533//1533 +f 1535//1536 1539//1539 1534//1535 +f 1536//1534 1540//1540 1535//1536 +f 1537//1537 1541//1541 1540//1540 +f 1538//1538 1542//1542 1541//1541 +f 1539//1539 1543//1543 1538//1538 +f 1540//1540 1544//1544 1543//1543 +f 1541//1541 1545//1545 1544//1544 +f 1542//1542 1546//1546 1545//1545 +f 1543//1543 1547//1547 1542//1542 +f 1544//1544 1548//1548 1547//1547 +f 1545//1545 1549//1549 1552//1550 +f 1546//1546 1550//1551 1545//1545 +f 1547//1547 1551//1552 1550//1551 +f 1548//1548 1552//1550 1547//1547 +f 1549//1549 1553//1553 1552//1550 +f 1550//1551 1554//1554 1553//1553 +f 1551//1552 1555//1555 1550//1551 +f 1552//1550 1556//1556 1555//1555 +f 1553//1553 1557//1557 1560//1558 +f 1554//1554 1558//1559 1557//1557 +f 1555//1555 1559//1560 1558//1559 +f 1556//1556 1560//1558 1559//1560 +f 1561//1561 1565//1562 1568//1563 +f 1562//1564 1566//1565 1565//1562 +f 1563//1566 1567//1567 1566//1565 +f 1564//1568 1568//1563 1567//1567 +f 1565//1562 1569//1569 1568//1563 +f 1566//1565 1570//1570 1565//1562 +f 1567//1567 1571//1571 1566//1565 +f 1568//1563 1572//1572 1567//1567 +f 1569//1569 1573//1573 1576//1574 +f 1570//1570 1574//1575 1573//1573 +f 1571//1571 1575//1576 1574//1575 +f 1572//1572 1576//1574 1575//1576 +f 1573//1573 1577//1577 1576//1574 +f 1574//1575 1578//1578 1577//1577 +f 1575//1576 1579//1579 1574//1575 +f 1576//1574 1580//1580 1579//1579 +f 1577//1577 1581//1581 1580//1580 +f 1578//1578 1582//1582 1577//1577 +f 1579//1579 1583//1583 1578//1578 +f 1580//1580 1584//1584 1579//1579 +f 1581//1581 1585//1585 1588//1586 +f 1582//1582 1586//1587 1585//1585 +f 1583//1583 1587//1588 1586//1587 +f 1584//1584 1588//1586 1587//1588 +f 1585//1585 1589//1589 1592//1590 +f 1586//1587 1590//1591 1585//1585 +f 1587//1588 1591//1592 1590//1591 +f 1588//1586 1592//1590 1587//1588 +f 1589//1589 1593//1593 1592//1590 +f 1590//1591 1594//1594 1593//1593 +f 1591//1592 1595//1595 1590//1591 +f 1592//1590 1596//1596 1595//1595 +f 1593//1593 1597//1597 1600//1598 +f 1594//1594 1598//1599 1597//1597 +f 1595//1595 1599//1600 1598//1599 +f 1596//1596 1600//1598 1599//1600 +f 1597//1597 1601//1601 1604//1602 +f 1598//1599 1602//1603 1601//1601 +f 1599//1600 1603//1604 1602//1603 +f 1600//1598 1604//1602 1603//1604 +f 1605//1605 1609//1606 1612//1607 +f 1606//1608 1610//1609 1605//1605 +f 1607//1610 1611//1611 1610//1609 +f 1608//1612 1612//1607 1607//1610 +f 1609//1606 1613//1613 1616//1614 +f 1610//1609 1614//1615 1613//1613 +f 1611//1611 1615//1616 1614//1615 +f 1612//1607 1616//1614 1615//1616 +f 1613//1613 1617//1617 1620//1618 +f 1614//1615 1618//1619 1613//1613 +f 1615//1616 1619//1620 1618//1619 +f 1616//1614 1620//1618 1615//1616 +f 1617//1617 1621//1621 1620//1618 +f 1618//1619 1622//1622 1621//1621 +f 1619//1620 1623//1623 1618//1619 +f 1620//1618 1624//1624 1623//1623 +f 1621//1621 1625//1625 1624//1624 +f 1622//1622 1626//1626 1625//1625 +f 1623//1623 1627//1627 1622//1622 +f 1624//1624 1628//1628 1627//1627 +f 1625//1625 1629//1629 1628//1628 +f 1626//1626 1630//1630 1625//1625 +f 1627//1627 1631//1631 1626//1626 +f 1628//1628 1632//1632 1627//1627 +f 1629//1629 1633//1633 1636//1634 +f 1630//1630 1634//1635 1629//1629 +f 1631//1631 1635//1636 1634//1635 +f 1632//1632 1636//1634 1631//1631 +f 1633//1633 1637//1637 1636//1634 +f 1634//1635 1638//1638 1633//1633 +f 1635//1636 1639//1639 1634//1635 +f 1636//1634 1640//1640 1635//1636 +f 1637//1637 1641//1641 1644//1642 +f 1638//1638 1642//1643 1641//1641 +f 1639//1639 1643//1644 1642//1643 +f 1640//1640 1644//1642 1643//1644 +f 1641//1641 1645//1645 1648//1646 +f 1642//1643 1646//1647 1645//1645 +f 1643//1644 1647//1648 1646//1647 +f 1644//1642 1648//1646 1647//1648 +f 1649//1649 1653//1650 1656//1651 +f 1650//1652 1654//1653 1649//1649 +f 1651//1654 1655//1655 1654//1653 +f 1652//1656 1656//1651 1651//1654 +f 1653//1650 1657//1657 1656//1651 +f 1654//1653 1658//1658 1657//1657 +f 1655//1655 1659//1659 1654//1653 +f 1656//1651 1660//1660 1659//1659 +f 1657//1657 1661//1661 1664//1662 +f 1658//1658 1662//1663 1657//1657 +f 1659//1659 1663//1664 1662//1663 +f 1660//1660 1664//1662 1659//1659 +f 1661//1661 1665//1665 1664//1662 +f 1662//1663 1666//1666 1661//1661 +f 1663//1664 1667//1667 1662//1663 +f 1664//1662 1668//1668 1663//1664 +f 1665//1665 1669//1669 1668//1668 +f 1666//1666 1670//1670 1669//1669 +f 1667//1667 1671//1671 1666//1666 +f 1668//1668 1672//1672 1671//1671 +f 1669//1669 1673//1673 1676//1674 +f 1670//1670 1674//1675 1673//1673 +f 1671//1671 1675//1676 1674//1675 +f 1672//1672 1676//1674 1675//1676 +f 1673//1673 1677//1677 1676//1674 +f 1674//1675 1678//1678 1677//1677 +f 1675//1676 1679//1679 1674//1675 +f 1676//1674 1680//1680 1679//1679 +f 1677//1677 1681//1681 1680//1680 +f 1678//1678 1682//1682 1677//1677 +f 1679//1679 1683//1683 1678//1678 +f 1680//1680 1684//1684 1679//1679 +f 1681//1681 1685//1685 1688//1686 +f 1682//1682 1686//1687 1681//1681 +f 1683//1683 1687//1688 1686//1687 +f 1684//1684 1688//1686 1683//1683 +f 1685//1685 1689//1689 1692//1690 +f 1686//1687 1690//1691 1689//1689 +f 1687//1688 1691//1692 1690//1691 +f 1688//1686 1692//1690 1691//1692 +f 1693//1693 1697//1694 1700//1695 +f 1694//1696 1698//1697 1693//1693 +f 1695//1698 1699//1699 1698//1697 +f 1696//1700 1700//1695 1695//1698 +f 1697//1694 1701//1701 1700//1695 +f 1698//1697 1702//1702 1701//1701 +f 1699//1699 1703//1703 1698//1697 +f 1700//1695 1704//1704 1703//1703 +f 1701//1701 1705//1705 1708//1706 +f 1702//1702 1706//1707 1705//1705 +f 1703//1703 1707//1708 1706//1707 +f 1704//1704 1708//1706 1707//1708 +f 1705//1705 1709//1709 1708//1706 +f 1706//1707 1710//1710 1705//1705 +f 1707//1708 1711//1711 1706//1707 +f 1708//1706 1712//1712 1707//1708 +f 1709//1709 1713//1713 1716//1714 +f 1710//1710 1714//1715 1709//1709 +f 1711//1711 1715//1716 1714//1715 +f 1712//1712 1716//1714 1711//1711 +f 1713//1713 1717//1717 1716//1714 +f 1714//1715 1718//1718 1717//1717 +f 1715//1716 1719//1719 1718//1718 +f 1716//1714 1720//1720 1719//1719 +f 1717//1717 1721//1721 1724//1722 +f 1718//1718 1722//1723 1717//1717 +f 1719//1719 1723//1724 1722//1723 +f 1720//1720 1724//1722 1719//1719 +f 1721//1721 1725//1725 1724//1722 +f 1722//1723 1726//1726 1725//1725 +f 1723//1724 1727//1727 1722//1723 +f 1724//1722 1728//1728 1727//1727 +f 1725//1725 1729//1729 1732//1730 +f 1726//1726 1730//1731 1729//1729 +f 1727//1727 1731//1732 1730//1731 +f 1728//1728 1732//1730 1731//1732 +f 1729//1729 1733//1733 1736//1734 +f 1730//1731 1734//1735 1733//1733 +f 1731//1732 1735//1736 1734//1735 +f 1732//1730 1736//1734 1735//1736 +f 1737//1737 1741//1738 1740//1739 +f 1738//1740 1742//1741 1741//1738 +f 1739//1742 1743//1743 1738//1740 +f 1740//1739 1744//1744 1743//1743 +f 1741//1738 1745//1745 1748//1746 +f 1742//1741 1746//1747 1741//1738 +f 1743//1743 1747//1748 1746//1747 +f 1744//1744 1748//1746 1743//1743 +f 1745//1745 1749//1749 1748//1746 +f 1746//1747 1750//1750 1749//1749 +f 1747//1748 1751//1751 1746//1747 +f 1748//1746 1752//1752 1751//1751 +f 1749//1749 1753//1753 1752//1752 +f 1750//1750 1754//1754 1749//1749 +f 1751//1751 1755//1755 1750//1750 +f 1752//1752 1756//1756 1751//1751 +f 1753//1753 1757//1757 1760//1758 +f 1754//1754 1758//1759 1753//1753 +f 1755//1755 1759//1760 1758//1759 +f 1756//1756 1760//1758 1755//1755 +f 1757//1757 1761//1761 1764//1762 +f 1758//1759 1762//1763 1761//1761 +f 1759//1760 1763//1764 1762//1763 +f 1760//1758 1764//1762 1763//1764 +f 1761//1761 1765//1765 1764//1762 +f 1762//1763 1766//1766 1761//1761 +f 1763//1764 1767//1767 1762//1763 +f 1764//1762 1768//1768 1763//1764 +f 1765//1765 1769//1769 1768//1768 +f 1766//1766 1770//1770 1769//1769 +f 1767//1767 1771//1771 1766//1766 +f 1768//1768 1772//1772 1771//1771 +f 1769//1769 1773//1773 1772//1772 +f 1770//1770 1774//1774 1769//1769 +f 1771//1771 1775//1775 1770//1770 +f 1772//1772 1776//1776 1771//1771 +f 1773//1773 1777//1777 1780//1778 +f 1774//1774 1778//1779 1777//1777 +f 1775//1775 1779//1780 1778//1779 +f 1776//1776 1780//1778 1779//1780 +f 1781//1781 1785//1782 1788//1783 +f 1782//1784 1786//1785 1785//1782 +f 1783//1786 1787//1787 1786//1785 +f 1784//1788 1788//1783 1787//1787 +f 1785//1782 1789//1789 1788//1783 +f 1786//1785 1790//1790 1785//1782 +f 1787//1787 1791//1791 1786//1785 +f 1788//1783 1792//1792 1787//1787 +f 1789//1789 1793//1793 1792//1792 +f 1790//1790 1794//1794 1793//1793 +f 1791//1791 1795//1795 1790//1790 +f 1792//1792 1796//1796 1795//1795 +f 1793//1793 1797//1797 1800//1798 +f 1794//1794 1798//1799 1797//1797 +f 1795//1795 1799//1800 1798//1799 +f 1796//1796 1800//1798 1799//1800 +f 1797//1797 1801//1801 1800//1798 +f 1798//1799 1802//1802 1801//1801 +f 1799//1800 1803//1803 1798//1799 +f 1800//1798 1804//1804 1803//1803 +f 1801//1801 1805//1805 1804//1804 +f 1802//1802 1806//1806 1801//1801 +f 1803//1803 1807//1807 1802//1802 +f 1804//1804 1808//1808 1803//1803 +f 1805//1805 1809//1809 1812//1810 +f 1806//1806 1810//1811 1809//1809 +f 1807//1807 1811//1812 1810//1811 +f 1808//1808 1812//1810 1811//1812 +f 1809//1809 1813//1813 1812//1810 +f 1810//1811 1814//1814 1809//1809 +f 1811//1812 1815//1815 1810//1811 +f 1812//1810 1816//1816 1811//1812 +f 1813//1813 1817//1817 1820//1818 +f 1814//1814 1818//1819 1817//1817 +f 1815//1815 1819//1820 1818//1819 +f 1816//1816 1820//1818 1819//1820 +f 1817//1817 1821//1821 1824//1822 +f 1818//1819 1822//1823 1821//1821 +f 1819//1820 1823//1824 1822//1823 +f 1820//1818 1824//1822 1823//1824 +f 1825//1825 1829//1826 1828//1827 +f 1826//1828 1830//1829 1829//1826 +f 1827//1830 1831//1831 1826//1828 +f 1828//1827 1832//1832 1831//1831 +f 1829//1826 1833//1833 1836//1834 +f 1830//1829 1834//1835 1829//1826 +f 1831//1831 1835//1836 1834//1835 +f 1832//1832 1836//1834 1831//1831 +f 1833//1833 1837//1837 1840//1838 +f 1834//1835 1838//1839 1833//1833 +f 1835//1836 1839//1840 1838//1839 +f 1836//1834 1840//1838 1835//1836 +f 1837//1837 1841//1841 1840//1838 +f 1838//1839 1842//1842 1841//1841 +f 1839//1840 1843//1843 1838//1839 +f 1840//1838 1844//1844 1843//1843 +f 1841//1841 1845//1845 1848//1846 +f 1842//1842 1846//1847 1841//1841 +f 1843//1843 1847//1848 1846//1847 +f 1844//1844 1848//1846 1843//1843 +f 1845//1845 1849//1849 1852//1850 +f 1846//1847 1850//1851 1845//1845 +f 1847//1848 1851//1852 1850//1851 +f 1848//1846 1852//1850 1847//1848 +f 1849//1849 1853//1853 1856//1854 +f 1850//1851 1854//1855 1853//1853 +f 1851//1852 1855//1856 1854//1855 +f 1852//1850 1856//1854 1855//1856 +f 1857//1857 1861//1858 1860//1859 +f 1858//1860 1862//1861 1857//1857 +f 1859//1862 1863//1863 1858//1860 +f 1860//1859 1864//1864 1859//1862 +f 1861//1858 1865//1865 1868//1866 +f 1862//1861 1866//1867 1865//1865 +f 1863//1863 1867//1868 1866//1867 +f 1864//1864 1868//1866 1867//1868 +f 1865//1865 1869//1869 1872//1870 +f 1866//1867 1870//1871 1865//1865 +f 1867//1868 1871//1872 1870//1871 +f 1868//1866 1872//1870 1867//1868 +f 1869//1869 1873//1873 1876//1874 +f 1870//1871 1874//1875 1873//1873 +f 1871//1872 1875//1876 1874//1875 +f 1872//1870 1876//1874 1875//1876 +f 1877//1877 1881//1878 1884//1879 +f 1878//1880 1882//1881 1881//1878 +f 1879//1882 1883//1883 1882//1881 +f 1880//1884 1884//1879 1883//1883 +f 1881//1878 1885//1885 1888//1886 +f 1882//1881 1886//1887 1885//1885 +f 1883//1883 1887//1888 1886//1887 +f 1884//1879 1888//1886 1887//1888 +f 1889//1889 1893//1890 1896//1891 +f 1890//1892 1894//1893 1893//1890 +f 1891//1894 1895//1895 1894//1893 +f 1892//1896 1896//1891 1895//1895 +f 1897//1897 1901//1898 1904//1899 +f 1898//1900 1902//1901 1901//1898 +f 1899//1902 1903//1903 1902//1901 +f 1900//1904 1904//1899 1903//1903 +f 1901//1898 1905//1905 1904//1899 +f 1902//1901 1906//1906 1901//1898 +f 1903//1903 1907//1907 1902//1901 +f 1904//1899 1908//1908 1903//1903 +f 1905//1905 1909//1909 1908//1908 +f 1906//1906 1910//1910 1905//1905 +f 1907//1907 1911//1911 1906//1906 +f 1908//1908 1912//1912 1907//1907 +f 1909//1909 1913//1913 1912//1912 +f 1910//1910 1914//1914 1909//1909 +f 1911//1911 1915//1915 1910//1910 +f 1912//1912 1916//1916 1911//1911 +f 1913//1913 1917//1917 1916//1916 +f 1914//1914 1918//1918 1913//1913 +f 1915//1915 1919//1919 1914//1914 +f 1916//1916 1920//1920 1915//1915 +f 1917//1917 1921//1921 1924//1922 +f 1918//1918 1922//1923 1921//1921 +f 1919//1919 1923//1924 1922//1923 +f 1920//1920 1924//1922 1923//1924 +f 1925//1925 1929//1926 1928//1927 +f 1926//1928 1930//1929 1925//1925 +f 1927//1930 1931//1931 1930//1929 +f 1928//1927 1932//1932 1927//1930 +f 1929//1926 1933//1933 1932//1932 +f 1930//1929 1934//1934 1933//1933 +f 1931//1931 1935//1935 1930//1929 +f 1932//1932 1936//1936 1935//1935 +f 1933//1933 1937//1937 1940//1938 +f 1934//1934 1938//1939 1937//1937 +f 1935//1935 1939//1940 1938//1939 +f 1936//1936 1940//1938 1939//1940 +f 1941//1941 1945//1942 1948//1943 +f 1942//1944 1946//1945 1945//1942 +f 1943//1946 1947//1947 1946//1945 +f 1944//1948 1948//1943 1947//1947 +f 1949//1949 1953//1950 1952//1951 +f 1950//1952 1954//1953 1949//1949 +f 1951//1954 1955//1955 1950//1952 +f 1952//1951 1956//1956 1951//1954 +f 1953//1950 1957//1957 1960//1958 +f 1954//1953 1958//1959 1957//1957 +f 1955//1955 1959//1960 1958//1959 +f 1956//1956 1960//1958 1959//1960 +f 1957//1957 1961//1961 1964//1962 +f 1958//1959 1962//1963 1961//1961 +f 1959//1960 1963//1964 1962//1963 +f 1960//1958 1964//1962 1963//1964 +f 1961//1961 1965//1965 1968//1966 +f 1962//1963 1966//1967 1965//1965 +f 1963//1964 1967//1968 1966//1967 +f 1964//1962 1968//1966 1967//1968 +f 1965//1965 1969//1969 1968//1966 +f 1966//1967 1970//1970 1965//1965 +f 1967//1968 1971//1971 1966//1967 +f 1968//1966 1972//1972 1967//1968 +f 1969//1969 1973//1973 1976//1974 +f 1970//1970 1974//1975 1973//1973 +f 1971//1971 1975//1976 1974//1975 +f 1972//1972 1976//1974 1975//1976 +f 1973//1973 1977//1977 1980//1978 +f 1974//1975 1978//1979 1977//1977 +f 1975//1976 1979//1980 1978//1979 +f 1976//1974 1980//1978 1979//1980 +f 1981//1981 1985//1982 1988//1983 +f 1982//1984 1986//1985 1985//1982 +f 1983//1986 1987//1987 1986//1985 +f 1984//1988 1988//1983 1987//1987 +f 1985//1982 1989//1989 1988//1983 +f 1986//1985 1990//1990 1985//1982 +f 1987//1987 1991//1991 1986//1985 +f 1988//1983 1992//1992 1987//1987 +f 1989//1989 1993//1993 1992//1992 +f 1990//1990 1994//1994 1993//1993 +f 1991//1991 1995//1995 1990//1990 +f 1992//1992 1996//1996 1995//1995 +f 1993//1993 1997//1997 2000//1998 +f 1994//1994 1998//1999 1997//1997 +f 1995//1995 1999//2000 1998//1999 +f 1996//1996 2000//1998 1999//2000 +f 2001//2001 2005//2002 2008//2003 +f 2002//2004 2006//2005 2005//2002 +f 2003//2006 2007//2007 2006//2005 +f 2004//2008 2008//2003 2007//2007 +f 2005//2002 2009//2009 2012//2010 +f 2006//2005 2010//2011 2009//2009 +f 2007//2007 2011//2012 2010//2011 +f 2008//2003 2012//2010 2011//2012 +f 2013//2013 2017//2014 2020//2015 +f 2014//2016 2018//2017 2017//2014 +f 2015//2018 2019//2019 2018//2017 +f 2016//2020 2020//2015 2019//2019 +f 2021//2021 2025//2022 2028//2023 +f 2022//2024 2026//2025 2021//2021 +f 2023//2026 2027//2027 2026//2025 +f 2024//2028 2028//2023 2023//2026 +f 2025//2022 2029//2029 2028//2023 +f 2026//2025 2030//2030 2029//2029 +f 2027//2027 2031//2031 2026//2025 +f 2028//2023 2032//2032 2031//2031 +f 2029//2029 2033//2033 2032//2032 +f 2030//2030 2034//2034 2033//2033 +f 2031//2031 2035//2035 2030//2030 +f 2032//2032 2036//2036 2035//2035 +f 2033//2033 2037//2037 2040//2038 +f 2034//2034 2038//2039 2033//2033 +f 2035//2035 2039//2040 2038//2039 +f 2036//2036 2040//2038 2035//2035 +f 2037//2037 2041//2041 2044//2042 +f 2038//2039 2042//2043 2037//2037 +f 2039//2040 2043//2044 2042//2043 +f 2040//2038 2044//2042 2039//2040 +f 2041//2041 2045//2045 2048//2046 +f 2042//2043 2046//2047 2045//2045 +f 2043//2044 2047//2048 2046//2047 +f 2044//2042 2048//2046 2047//2048 +f 2049//2049 2053//2050 2056//2051 +f 2050//2052 2054//2053 2053//2050 +f 2051//2054 2055//2055 2054//2053 +f 2052//2056 2056//2051 2055//2055 +f 2053//2050 2057//2057 2056//2051 +f 2054//2053 2058//2058 2053//2050 +f 2055//2055 2059//2059 2054//2053 +f 2056//2051 2060//2060 2055//2055 +f 2057//2057 2061//2061 2064//2062 +f 2058//2058 2062//2063 2061//2061 +f 2059//2059 2063//2064 2062//2063 +f 2060//2060 2064//2062 2063//2064 +f 2065//2065 2069//2066 2072//2067 +f 2066//2068 2070//2069 2069//2066 +f 2067//2070 2071//2071 2070//2069 +f 2068//2072 2072//2067 2071//2071 +f 2073//2073 2077//2074 2080//2075 +f 2074//2076 2078//2077 2077//2074 +f 2075//2078 2079//2079 2078//2077 +f 2076//2080 2080//2075 2079//2079 +f 2077//2074 2081//2081 2080//2075 +f 2078//2077 2082//2082 2077//2074 +f 2079//2079 2083//2083 2078//2077 +f 2080//2075 2084//2084 2079//2079 +f 2081//2081 2085//2085 2088//2086 +f 2082//2082 2086//2087 2081//2081 +f 2083//2083 2087//2088 2086//2087 +f 2084//2084 2088//2086 2083//2083 +f 2085//2085 2089//2089 2088//2086 +f 2086//2087 2090//2090 2089//2089 +f 2087//2088 2091//2091 2086//2087 +f 2088//2086 2092//2092 2091//2091 +f 2089//2089 2093//2093 2092//2092 +f 2090//2090 2094//2094 2093//2093 +f 2091//2091 2095//2095 2090//2090 +f 2092//2092 2096//2096 2095//2095 +f 2093//2093 2097//2097 2100//2098 +f 2094//2094 2098//2099 2093//2093 +f 2095//2095 2099//2100 2098//2099 +f 2096//2096 2100//2098 2095//2095 +f 2097//2097 2101//2101 2104//2102 +f 2098//2099 2102//2103 2101//2101 +f 2099//2100 2103//2104 2102//2103 +f 2100//2098 2104//2102 2103//2104 +f 2105//2105 2109//2106 2112//2107 +f 2106//2108 2110//2109 2109//2106 +f 2107//2110 2111//2111 2110//2109 +f 2108//2112 2112//2107 2111//2111 +f 2109//2106 2113//2113 2112//2107 +f 2110//2109 2114//2114 2109//2106 +f 2111//2111 2115//2115 2110//2109 +f 2112//2107 2116//2116 2111//2111 +f 2113//2113 2117//2117 2116//2116 +f 2114//2114 2118//2118 2113//2113 +f 2115//2115 2119//2119 2114//2114 +f 2116//2116 2120//2120 2115//2115 +f 2117//2117 2121//2121 2124//2122 +f 2118//2118 2122//2123 2121//2121 +f 2119//2119 2123//2124 2122//2123 +f 2120//2120 2124//2122 2123//2124 +f 2125//2125 2129//2126 2128//2127 +f 2126//2128 2130//2129 2129//2126 +f 2127//2130 2131//2131 2126//2128 +f 2128//2127 2132//2132 2131//2131 +f 2129//2126 2133//2133 2136//2134 +f 2130//2129 2134//2135 2133//2133 +f 2131//2131 2135//2136 2134//2135 +f 2132//2132 2136//2134 2135//2136 +f 2137//2137 2141//2138 2144//2139 +f 2138//2140 2142//2141 2141//2138 +f 2139//2142 2143//2143 2142//2141 +f 2140//2144 2144//2139 2143//2143 +f 2145//2145 2149//2146 2148//2147 +f 2146//2148 2150//2149 2145//2145 +f 2147//2150 2151//2151 2146//2148 +f 2148//2147 2152//2152 2147//2150 +f 2149//2146 2153//2153 2152//2152 +f 2150//2149 2154//2154 2149//2146 +f 2151//2151 2155//2155 2150//2149 +f 2152//2152 2156//2156 2151//2151 +f 2153//2153 2157//2157 2160//2158 +f 2154//2154 2158//2159 2157//2157 +f 2155//2155 2159//2160 2158//2159 +f 2156//2156 2160//2158 2159//2160 +f 2157//2157 2161//2161 2160//2158 +f 2158//2159 2162//2162 2157//2157 +f 2159//2160 2163//2163 2158//2159 +f 2160//2158 2164//2164 2159//2160 +f 2161//2161 2165//2165 2168//2166 +f 2162//2162 2166//2167 2165//2165 +f 2163//2163 2167//2168 2166//2167 +f 2164//2164 2168//2166 2167//2168 +f 2165//2165 2169//2169 2172//2170 +f 2166//2167 2170//2171 2169//2169 +f 2167//2168 2171//2172 2170//2171 +f 2168//2166 2172//2170 2171//2172 +f 2173//2173 2177//2174 2180//2175 +f 2174//2176 2178//2177 2177//2174 +f 2175//2178 2179//2179 2178//2177 +f 2176//2180 2180//2175 2179//2179 +f 2177//2174 2181//2181 2180//2175 +f 2178//2177 2182//2182 2177//2174 +f 2179//2179 2183//2183 2178//2177 +f 2180//2175 2184//2184 2179//2179 +f 2181//2181 2185//2185 2188//2186 +f 2182//2182 2186//2187 2185//2185 +f 2183//2183 2187//2188 2186//2187 +f 2184//2184 2188//2186 2187//2188 +f 2189//2189 2193//2190 2196//2191 +f 2190//2192 2194//2193 2193//2190 +f 2191//2194 2195//2195 2194//2193 +f 2192//2196 2196//2191 2195//2195 +f 2197//2197 2201//2198 2200//2199 +f 2198//2200 2202//2201 2197//2197 +f 2199//2202 2203//2203 2198//2200 +f 2200//2199 2204//2204 2199//2202 +f 2201//2198 2205//2205 2208//2206 +f 2202//2201 2206//2207 2205//2205 +f 2203//2203 2207//2208 2206//2207 +f 2204//2204 2208//2206 2207//2208 +f 2205//2205 2209//2209 2208//2206 +f 2206//2207 2210//2210 2205//2205 +f 2207//2208 2211//2211 2206//2207 +f 2208//2206 2212//2212 2207//2208 +f 2209//2209 2213//2213 2212//2212 +f 2210//2210 2214//2214 2209//2209 +f 2211//2211 2215//2215 2210//2210 +f 2212//2212 2216//2216 2211//2211 +f 2213//2213 2217//2217 2220//2218 +f 2214//2214 2218//2219 2217//2217 +f 2215//2215 2219//2220 2218//2219 +f 2216//2216 2220//2218 2219//2220 +f 2217//2217 2221//2221 2220//2218 +f 2218//2219 2222//2222 2217//2217 +f 2219//2220 2223//2223 2218//2219 +f 2220//2218 2224//2224 2219//2220 +f 2221//2221 2225//2225 2228//2226 +f 2222//2222 2226//2227 2225//2225 +f 2223//2223 2227//2228 2226//2227 +f 2224//2224 2228//2226 2227//2228 +f 2229//2229 2233//2230 2236//2231 +f 2230//2232 2234//2233 2233//2230 +f 2231//2234 2235//2235 2234//2233 +f 2232//2236 2236//2231 2235//2235 +f 2233//2230 2237//2237 2236//2231 +f 2234//2233 2238//2238 2233//2230 +f 2235//2235 2239//2239 2234//2233 +f 2236//2231 2240//2240 2235//2235 +f 2237//2237 2241//2241 2240//2240 +f 2238//2238 2242//2242 2241//2241 +f 2239//2239 2243//2243 2238//2238 +f 2240//2240 2244//2244 2243//2243 +f 2241//2241 2245//2245 2248//2246 +f 2242//2242 2246//2247 2245//2245 +f 2243//2243 2247//2248 2246//2247 +f 2244//2244 2248//2246 2247//2248 +f 2249//2249 2253//2250 2252//2251 +f 2250//2252 2254//2253 2249//2249 +f 2251//2254 2255//2255 2250//2252 +f 2252//2251 2256//2256 2251//2254 +f 2253//2250 2257//2257 2260//2258 +f 2254//2253 2258//2259 2257//2257 +f 2255//2255 2259//2260 2258//2259 +f 2256//2256 2260//2258 2259//2260 +f 2261//2261 2265//2262 2268//2263 +f 2262//2264 2266//2265 2265//2262 +f 2263//2266 2267//2267 2266//2265 +f 2264//2268 2268//2263 2267//2267 +f 2269//2269 2273//2270 2276//2271 +f 2270//2272 2274//2273 2273//2270 +f 2271//2274 2275//2275 2274//2273 +f 2272//2276 2276//2271 2275//2275 +f 2273//2270 2277//2277 2280//2278 +f 2274//2273 2278//2279 2277//2277 +f 2275//2275 2279//2280 2278//2279 +f 2276//2271 2280//2278 2279//2280 +f 2277//2277 2281//2281 2280//2278 +f 2278//2279 2282//2282 2277//2277 +f 2279//2280 2283//2283 2278//2279 +f 2280//2278 2284//2284 2279//2280 +f 2281//2281 2285//2285 2284//2284 +f 2282//2282 2286//2286 2281//2281 +f 2283//2283 2287//2287 2282//2282 +f 2284//2284 2288//2288 2283//2283 +f 2285//2285 2289//2289 2288//2288 +f 2286//2286 2290//2290 2285//2285 +f 2287//2287 2291//2291 2286//2286 +f 2288//2288 2292//2292 2287//2287 +f 2289//2289 2293//2293 2296//2294 +f 2290//2290 2294//2295 2293//2293 +f 2291//2291 2295//2296 2294//2295 +f 2292//2292 2296//2294 2295//2296 +f 2297//2297 2301//2298 2304//2299 +f 2298//2300 2302//2301 2301//2298 +f 2299//2302 2303//2303 2302//2301 +f 2300//2304 2304//2299 2303//2303 +f 2301//2298 2305//2305 2308//2306 +f 2302//2301 2306//2307 2305//2305 +f 2303//2303 2307//2308 2306//2307 +f 2304//2299 2308//2306 2307//2308 +f 2305//2305 2309//2309 2312//2310 +f 2306//2307 2310//2311 2309//2309 +f 2307//2308 2311//2312 2310//2311 +f 2308//2306 2312//2310 2311//2312 +f 2313//2313 2317//2314 2320//2315 +f 2314//2316 2318//2317 2317//2314 +f 2315//2318 2319//2319 2318//2317 +f 2316//2320 2320//2315 2319//2319 +f 2321//2321 2325//2322 2328//2323 +f 2322//2324 2326//2325 2325//2322 +f 2323//2326 2327//2327 2326//2325 +f 2324//2328 2328//2323 2327//2327 +f 2325//2322 2329//2329 2328//2323 +f 2326//2325 2330//2330 2325//2322 +f 2327//2327 2331//2331 2326//2325 +f 2328//2323 2332//2332 2327//2327 +f 2329//2329 2333//2333 2332//2332 +f 2330//2330 2334//2334 2329//2329 +f 2331//2331 2335//2335 2330//2330 +f 2332//2332 2336//2336 2331//2331 +f 2333//2333 2337//2337 2340//2338 +f 2334//2334 2338//2339 2337//2337 +f 2335//2335 2339//2340 2338//2339 +f 2336//2336 2340//2338 2339//2340 +f 2337//2337 2341//2341 2340//2338 +f 2338//2339 2342//2342 2337//2337 +f 2339//2340 2343//2343 2338//2339 +f 2340//2338 2344//2344 2339//2340 +f 2341//2341 2345//2345 2348//2346 +f 2342//2342 2346//2347 2345//2345 +f 2343//2343 2347//2348 2346//2347 +f 2344//2344 2348//2346 2343//2343 +f 2345//2345 2349//2349 2352//2350 +f 2346//2347 2350//2351 2349//2349 +f 2347//2348 2351//2352 2350//2351 +f 2348//2346 2352//2350 2351//2352 +f 2353//2353 2357//2354 2356//2355 +f 2354//2356 2358//2357 2353//2353 +f 2355//2358 2359//2359 2354//2356 +f 2356//2355 2360//2360 2355//2358 +f 2357//2354 2361//2361 2360//2360 +f 2358//2357 2362//2362 2357//2354 +f 2359//2359 2363//2363 2358//2357 +f 2360//2360 2364//2364 2359//2359 +f 2361//2361 2365//2365 2364//2364 +f 2362//2362 2366//2366 2365//2365 +f 2363//2363 2367//2367 2362//2362 +f 2364//2364 2368//2368 2367//2367 +f 2365//2365 2369//2369 2372//2370 +f 2366//2366 2370//2371 2369//2369 +f 2367//2367 2371//2372 2370//2371 +f 2368//2368 2372//2370 2371//2372 +f 2373//2373 2377//2374 2380//2375 +f 2374//2376 2378//2377 2373//2373 +f 2375//2378 2379//2379 2378//2377 +f 2376//2380 2380//2375 2375//2378 +f 2377//2374 2381//2381 2384//2382 +f 2378//2377 2382//2383 2381//2381 +f 2379//2379 2383//2384 2382//2383 +f 2380//2375 2384//2382 2383//2384 +f 2385//2385 2389//2386 2392//2387 +f 2386//2388 2390//2389 2389//2386 +f 2387//2390 2391//2391 2390//2389 +f 2388//2392 2392//2387 2391//2391 +f 2393//2393 2397//2394 2396//2395 +f 2394//2396 2398//2397 2393//2393 +f 2395//2398 2399//2399 2394//2396 +f 2396//2395 2400//2400 2395//2398 +f 2397//2394 2401//2401 2404//2402 +f 2398//2397 2402//2403 2401//2401 +f 2399//2399 2403//2404 2402//2403 +f 2400//2400 2404//2402 2403//2404 +f 2401//2401 2405//2405 2404//2402 +f 2402//2403 2406//2406 2401//2401 +f 2403//2404 2407//2407 2402//2403 +f 2404//2402 2408//2408 2403//2404 +f 2405//2405 2409//2409 2412//2410 +f 2406//2406 2410//2411 2409//2409 +f 2407//2407 2411//2412 2410//2411 +f 2408//2408 2412//2410 2411//2412 +f 2409//2409 2413//2413 2412//2410 +f 2410//2411 2414//2414 2409//2409 +f 2411//2412 2415//2415 2410//2411 +f 2412//2410 2416//2416 2411//2412 +f 2413//2413 2417//2417 2420//2418 +f 2414//2414 2418//2419 2417//2417 +f 2415//2415 2419//2420 2418//2419 +f 2416//2416 2420//2418 2419//2420 +f 2421//2421 2425//2422 2428//2423 +f 2422//2424 2426//2425 2425//2422 +f 2423//2426 2427//2427 2426//2425 +f 2424//2428 2428//2423 2427//2427 +f 2425//2422 2429//2429 2428//2423 +f 2426//2425 2430//2430 2429//2429 +f 2427//2427 2431//2431 2426//2425 +f 2428//2423 2432//2432 2431//2431 +f 2429//2429 2433//2433 2436//2434 +f 2430//2430 2434//2435 2433//2433 +f 2431//2431 2435//2436 2434//2435 +f 2432//2432 2436//2434 2435//2436 +f 2437//2437 2441//2438 2444//2439 +f 2438//2440 2442//2441 2441//2438 +f 2439//2442 2443//2443 2442//2441 +f 2440//2444 2444//2439 2443//2443 +f 2445//2445 2449//2446 2448//2447 +f 2446//2448 2450//2449 2445//2445 +f 2447//2450 2451//2451 2446//2448 +f 2448//2447 2452//2452 2447//2450 +f 2449//2446 2453//2453 2456//2454 +f 2450//2449 2454//2455 2453//2453 +f 2451//2451 2455//2456 2454//2455 +f 2452//2452 2456//2454 2455//2456 +f 2453//2453 2457//2457 2456//2454 +f 2454//2455 2458//2458 2453//2453 +f 2455//2456 2459//2459 2454//2455 +f 2456//2454 2460//2460 2455//2456 +f 2457//2457 2461//2461 2464//2462 +f 2458//2458 2462//2463 2461//2461 +f 2459//2459 2463//2464 2462//2463 +f 2460//2460 2464//2462 2463//2464 +f 2461//2461 2465//2465 2464//2462 +f 2462//2463 2466//2466 2461//2461 +f 2463//2464 2467//2467 2462//2463 +f 2464//2462 2468//2468 2463//2464 +f 2465//2465 2469//2469 2472//2470 +f 2466//2466 2470//2471 2469//2469 +f 2467//2467 2471//2472 2470//2471 +f 2468//2468 2472//2470 2471//2472 +f 2469//2469 2473//2473 2476//2474 +f 2470//2471 2474//2475 2473//2473 +f 2471//2472 2475//2476 2474//2475 +f 2472//2470 2476//2474 2475//2476 +f 2477//2477 2481//2478 2484//2479 +f 2478//2480 2482//2481 2481//2478 +f 2479//2482 2483//2483 2482//2481 +f 2480//2484 2484//2479 2483//2483 +f 2481//2478 2485//2485 2484//2479 +f 2482//2481 2486//2486 2481//2478 +f 2483//2483 2487//2487 2482//2481 +f 2484//2479 2488//2488 2483//2483 +f 2485//2485 2489//2489 2492//2490 +f 2486//2486 2490//2491 2485//2485 +f 2487//2487 2491//2492 2490//2491 +f 2488//2488 2492//2490 2487//2487 +f 2489//2489 2493//2493 2496//2494 +f 2490//2491 2494//2495 2493//2493 +f 2491//2492 2495//2496 2494//2495 +f 2492//2490 2496//2494 2495//2496 +f 2497//2497 2501//2498 2504//2499 +f 2498//2500 2502//2501 2501//2498 +f 2499//2502 2503//2503 2502//2501 +f 2500//2504 2504//2499 2503//2503 +f 2501//2498 2505//2505 2508//2506 +f 2502//2501 2506//2507 2505//2505 +f 2503//2503 2507//2508 2506//2507 +f 2504//2499 2508//2506 2507//2508 +f 2509//2509 2513//2510 2516//2511 +f 2510//2512 2514//2513 2513//2510 +f 2511//2514 2515//2515 2514//2513 +f 2512//2516 2516//2511 2515//2515 +f 2517//2517 2521//2518 2524//2519 +f 2518//2520 2522//2521 2521//2518 +f 2519//2522 2523//2523 2522//2521 +f 2520//2524 2524//2519 2523//2523 +f 2521//2518 2525//2525 2528//2526 +f 2522//2521 2526//2527 2525//2525 +f 2523//2523 2527//2528 2526//2527 +f 2524//2519 2528//2526 2527//2528 +f 2525//2525 2529//2529 2528//2526 +f 2526//2527 2530//2530 2525//2525 +f 2527//2528 2531//2531 2526//2527 +f 2528//2526 2532//2532 2527//2528 +f 2529//2529 2533//2533 2536//2534 +f 2530//2530 2534//2535 2533//2533 +f 2531//2531 2535//2536 2534//2535 +f 2532//2532 2536//2534 2535//2536 +f 2533//2533 2537//2537 2536//2534 +f 2534//2535 2538//2538 2533//2533 +f 2535//2536 2539//2539 2534//2535 +f 2536//2534 2540//2540 2535//2536 +f 2537//2537 2541//2541 2544//2542 +f 2538//2538 2542//2543 2541//2541 +f 2539//2539 2543//2544 2542//2543 +f 2540//2540 2544//2542 2543//2544 +f 2545//2545 2549//2546 2548//2547 +f 2546//2548 2550//2549 2545//2545 +f 2547//2550 2551//2551 2546//2548 +f 2548//2547 2552//2552 2547//2550 +f 2549//2546 2553//2553 2556//2554 +f 2550//2549 2554//2555 2553//2553 +f 2551//2551 2555//2556 2554//2555 +f 2552//2552 2556//2554 2551//2551 +f 2553//2553 2557//2557 2560//2558 +f 2554//2555 2558//2559 2557//2557 +f 2555//2556 2559//2560 2558//2559 +f 2556//2554 2560//2558 2559//2560 +f 2561//2561 2565//2562 2568//2563 +f 2562//2564 2566//2565 2565//2562 +f 2563//2566 2567//2567 2566//2565 +f 2564//2568 2568//2563 2567//2567 +f 2569//2569 2573//2570 2576//2571 +f 2570//2572 2574//2573 2573//2570 +f 2571//2574 2575//2575 2574//2573 +f 2572//2576 2576//2571 2575//2575 +f 2573//2570 2577//2577 2576//2571 +f 2574//2573 2578//2578 2573//2570 +f 2575//2575 2579//2579 2574//2573 +f 2576//2571 2580//2580 2575//2575 +f 2577//2577 2581//2581 2584//2582 +f 2578//2578 2582//2583 2581//2581 +f 2579//2579 2583//2584 2582//2583 +f 2580//2580 2584//2582 2583//2584 +f 2581//2581 2585//2585 2584//2582 +f 2582//2583 2586//2586 2581//2581 +f 2583//2584 2587//2587 2582//2583 +f 2584//2582 2588//2588 2583//2584 +f 2585//2585 2589//2589 2592//2590 +f 2586//2586 2590//2591 2589//2589 +f 2587//2587 2591//2592 2590//2591 +f 2588//2588 2592//2590 2591//2592 +f 2589//2589 2593//2593 2596//2594 +f 2590//2591 2594//2595 2593//2593 +f 2591//2592 2595//2596 2594//2595 +f 2592//2590 2596//2594 2595//2596 +f 2593//2593 2597//2597 2600//2598 +f 2594//2595 2598//2599 2597//2597 +f 2595//2596 2599//2600 2598//2599 +f 2596//2594 2600//2598 2599//2600 +f 2601//2601 2605//2602 2604//2603 +f 2602//2604 2606//2605 2601//2601 +f 2603//2606 2607//2607 2602//2604 +f 2604//2603 2608//2608 2603//2606 +f 2605//2602 2609//2609 2608//2608 +f 2606//2605 2610//2610 2605//2602 +f 2607//2607 2611//2611 2606//2605 +f 2608//2608 2612//2612 2607//2607 +f 2609//2609 2613//2613 2612//2612 +f 2610//2610 2614//2614 2613//2613 +f 2611//2611 2615//2615 2610//2610 +f 2612//2612 2616//2616 2615//2615 +f 2613//2613 2617//2617 2620//2618 +f 2614//2614 2618//2619 2617//2617 +f 2615//2615 2619//2620 2618//2619 +f 2616//2616 2620//2618 2619//2620 +f 2621//2621 2625//2622 2628//2623 +f 2622//2624 2626//2625 2621//2621 +f 2623//2626 2627//2627 2626//2625 +f 2624//2628 2628//2623 2623//2626 +f 2625//2622 2629//2629 2632//2630 +f 2626//2625 2630//2631 2629//2629 +f 2627//2627 2631//2632 2630//2631 +f 2628//2623 2632//2630 2631//2632 +f 2633//2633 2637//2634 2640//2635 +f 2634//2636 2638//2637 2637//2634 +f 2635//2638 2639//2639 2638//2637 +f 2636//2640 2640//2635 2639//2639 +f 2641//2641 2645//2642 2644//2643 +f 2642//2644 2646//2645 2641//2641 +f 2643//2646 2647//2647 2646//2645 +f 2644//2643 2648//2648 2643//2646 +f 2645//2642 2649//2649 2648//2648 +f 2646//2645 2650//2650 2649//2649 +f 2647//2647 2651//2651 2646//2645 +f 2648//2648 2652//2652 2651//2651 +f 2649//2649 2653//2653 2652//2652 +f 2650//2650 2654//2654 2653//2653 +f 2651//2651 2655//2655 2650//2650 +f 2652//2652 2656//2656 2655//2655 +f 2653//2653 2657//2657 2656//2656 +f 2654//2654 2658//2658 2657//2657 +f 2655//2655 2659//2659 2654//2654 +f 2656//2656 2660//2660 2659//2659 +f 2657//2657 2661//2661 2664//2662 +f 2658//2658 2662//2663 2657//2657 +f 2659//2659 2663//2664 2662//2663 +f 2660//2660 2664//2662 2659//2659 +f 2661//2661 2665//2665 2668//2666 +f 2662//2663 2666//2667 2665//2665 +f 2663//2664 2667//2668 2666//2667 +f 2664//2662 2668//2666 2667//2668 +f 2669//2669 2673//2670 2672//2671 +f 2670//2672 2674//2673 2673//2670 +f 2671//2674 2675//2675 2670//2672 +f 2672//2671 2676//2676 2675//2675 +f 2673//2670 2677//2677 2676//2676 +f 2674//2673 2678//2678 2677//2677 +f 2675//2675 2679//2679 2674//2673 +f 2676//2676 2680//2680 2679//2679 +f 2677//2677 2681//2681 2684//2682 +f 2678//2678 2682//2683 2681//2681 +f 2679//2679 2683//2684 2682//2683 +f 2680//2680 2684//2682 2683//2684 +f 2685//2685 2689//2686 2692//2687 +f 2686//2688 2690//2689 2689//2686 +f 2687//2690 2691//2691 2690//2689 +f 2688//2692 2692//2687 2691//2691 +f 2693//2693 2697//2694 2696//2695 +f 2694//2696 2698//2697 2693//2693 +f 2695//2698 2699//2699 2694//2696 +f 2696//2695 2700//2700 2695//2698 +f 2697//2694 2701//2701 2704//2702 +f 2698//2697 2702//2703 2701//2701 +f 2699//2699 2703//2704 2702//2703 +f 2700//2700 2704//2702 2703//2704 +f 2701//2701 2705//2705 2704//2702 +f 2702//2703 2706//2706 2701//2701 +f 2703//2704 2707//2707 2702//2703 +f 2704//2702 2708//2708 2703//2704 +f 2705//2705 2709//2709 2712//2710 +f 2706//2706 2710//2711 2709//2709 +f 2707//2707 2711//2712 2710//2711 +f 2708//2708 2712//2710 2711//2712 +f 2709//2709 2713//2713 2712//2710 +f 2710//2711 2714//2714 2709//2709 +f 2711//2712 2715//2715 2710//2711 +f 2712//2710 2716//2716 2711//2712 +f 2713//2713 2717//2717 2720//2718 +f 2714//2714 2718//2719 2717//2717 +f 2715//2715 2719//2720 2718//2719 +f 2716//2716 2720//2718 2719//2720 +f 2717//2717 2721//2721 2724//2722 +f 2718//2719 2722//2723 2721//2721 +f 2719//2720 2723//2724 2722//2723 +f 2720//2718 2724//2722 2723//2724 +f 2725//2725 2729//2726 2732//2727 +f 2726//2728 2730//2729 2725//2725 +f 2727//2730 2731//2731 2730//2729 +f 2728//2732 2732//2727 2727//2730 +f 2729//2726 2733//2733 2732//2727 +f 2730//2729 2734//2734 2733//2733 +f 2731//2731 2735//2735 2730//2729 +f 2732//2727 2736//2736 2735//2735 +f 2733//2733 2737//2737 2740//2738 +f 2734//2734 2738//2739 2737//2737 +f 2735//2735 2739//2740 2738//2739 +f 2736//2736 2740//2738 2739//2740 +f 2737//2737 2741//2741 2744//2742 +f 2738//2739 2742//2743 2741//2741 +f 2739//2740 2743//2744 2742//2743 +f 2740//2738 2744//2742 2743//2744 +f 2745//2745 2749//2746 2748//2747 +f 2746//2748 2750//2749 2745//2745 +f 2747//2750 2751//2751 2746//2748 +f 2748//2747 2752//2752 2747//2750 +f 2749//2746 2753//2753 2756//2754 +f 2750//2749 2754//2755 2753//2753 +f 2751//2751 2755//2756 2754//2755 +f 2752//2752 2756//2754 2755//2756 +f 2757//2757 2761//2758 2764//2759 +f 2758//2760 2762//2761 2761//2758 +f 2759//2762 2763//2763 2762//2761 +f 2760//2764 2764//2759 2763//2763 +f 2765//2765 2769//2766 2772//2767 +f 2766//2768 2770//2769 2769//2766 +f 2767//2770 2771//2771 2770//2769 +f 2768//2772 2772//2767 2771//2771 +f 2769//2766 2773//2773 2772//2767 +f 2770//2769 2774//2774 2769//2766 +f 2771//2771 2775//2775 2770//2769 +f 2772//2767 2776//2776 2771//2771 +f 2773//2773 2777//2777 2780//2778 +f 2774//2774 2778//2779 2777//2777 +f 2775//2775 2779//2780 2778//2779 +f 2776//2776 2780//2778 2779//2780 +f 2777//2777 2781//2781 2780//2778 +f 2778//2779 2782//2782 2777//2777 +f 2779//2780 2783//2783 2778//2779 +f 2780//2778 2784//2784 2779//2780 +f 2781//2781 2785//2785 2788//2786 +f 2782//2782 2786//2787 2785//2785 +f 2783//2783 2787//2788 2786//2787 +f 2784//2784 2788//2786 2787//2788 +f 2785//2785 2789//2789 2792//2790 +f 2786//2787 2790//2791 2789//2789 +f 2787//2788 2791//2792 2790//2791 +f 2788//2786 2792//2790 2791//2792 +f 2793//2793 2797//2794 2796//2795 +f 2794//2796 2798//2797 2797//2794 +f 2795//2798 2799//2799 2794//2796 +f 2796//2795 2800//2800 2799//2799 +f 2797//2794 2801//2801 2804//2802 +f 2798//2797 2802//2803 2797//2794 +f 2799//2799 2803//2804 2802//2803 +f 2800//2800 2804//2802 2799//2799 +f 2801//2801 2805//2805 2808//2806 +f 2802//2803 2806//2807 2805//2805 +f 2803//2804 2807//2808 2806//2807 +f 2804//2802 2808//2806 2807//2808 +f 2809//2809 2813//2810 2816//2811 +f 2810//2812 2814//2813 2813//2810 +f 2811//2814 2815//2815 2814//2813 +f 2812//2816 2816//2811 2815//2815 +f 2817//2817 2821//2818 2820//2819 +f 2818//2820 2822//2821 2821//2818 +f 2819//2822 2823//2823 2818//2820 +f 2820//2819 2824//2824 2823//2823 +f 2821//2818 2825//2825 2828//2826 +f 2822//2821 2826//2827 2821//2818 +f 2823//2823 2827//2828 2826//2827 +f 2824//2824 2828//2826 2823//2823 +f 2825//2825 2829//2829 2832//2830 +f 2826//2827 2830//2831 2825//2825 +f 2827//2828 2831//2832 2830//2831 +f 2828//2826 2832//2830 2827//2828 +f 2829//2829 2833//2833 2832//2830 +f 2830//2831 2834//2834 2833//2833 +f 2831//2832 2835//2835 2830//2831 +f 2832//2830 2836//2836 2835//2835 +f 2833//2833 2837//2837 2840//2838 +f 2834//2834 2838//2839 2833//2833 +f 2835//2835 2839//2840 2838//2839 +f 2836//2836 2840//2838 2835//2835 +f 2837//2837 2841//2841 2840//2838 +f 2838//2839 2842//2842 2841//2841 +f 2839//2840 2843//2843 2838//2839 +f 2840//2838 2844//2844 2843//2843 +f 2841//2841 2845//2845 2848//2846 +f 2842//2842 2846//2847 2845//2845 +f 2843//2843 2847//2848 2846//2847 +f 2844//2844 2848//2846 2847//2848 +f 2849//2849 2853//2850 2852//2851 +f 2850//2852 2854//2853 2849//2849 +f 2851//2854 2855//2855 2850//2852 +f 2852//2851 2856//2856 2851//2854 +f 2853//2850 2857//2857 2860//2858 +f 2854//2853 2858//2859 2857//2857 +f 2855//2855 2859//2860 2858//2859 +f 2856//2856 2860//2858 2859//2860 +f 2857//2857 2861//2861 2864//2862 +f 2858//2859 2862//2863 2857//2857 +f 2859//2860 2863//2864 2862//2863 +f 2860//2858 2864//2862 2859//2860 +f 2861//2861 2865//2865 2868//2866 +f 2862//2863 2866//2867 2865//2865 +f 2863//2864 2867//2868 2866//2867 +f 2864//2862 2868//2866 2867//2868 +f 2869//2869 2873//2870 2872//2871 +f 2870//2872 2874//2873 2873//2870 +f 2871//2874 2875//2875 2870//2872 +f 2872//2871 2876//2876 2875//2875 +f 2873//2870 2877//2877 2880//2878 +f 2874//2873 2878//2879 2877//2877 +f 2875//2875 2879//2880 2878//2879 +f 2876//2876 2880//2878 2879//2880 +f 2881//2881 2885//2882 2888//2883 +f 2882//2884 2886//2885 2885//2882 +f 2883//2886 2887//2887 2886//2885 +f 2884//2888 2888//2883 2887//2887 +f 2889//2889 2893//2890 2892//2891 +f 2890//2892 2894//2893 2889//2889 +f 2891//2894 2895//2895 2890//2892 +f 2892//2891 2896//2896 2891//2894 +f 2893//2890 2897//2897 2900//2898 +f 2894//2893 2898//2899 2897//2897 +f 2895//2895 2899//2900 2898//2899 +f 2896//2896 2900//2898 2899//2900 +f 2897//2897 2901//2901 2900//2898 +f 2898//2899 2902//2902 2897//2897 +f 2899//2900 2903//2903 2898//2899 +f 2900//2898 2904//2904 2899//2900 +f 2901//2901 2905//2905 2908//2906 +f 2902//2902 2906//2907 2905//2905 +f 2903//2903 2907//2908 2906//2907 +f 2904//2904 2908//2906 2907//2908 +f 2905//2905 2909//2909 2908//2906 +f 2906//2907 2910//2910 2905//2905 +f 2907//2908 2911//2911 2906//2907 +f 2908//2906 2912//2912 2907//2908 +f 2909//2909 2913//2913 2916//2914 +f 2910//2910 2914//2915 2913//2913 +f 2911//2911 2915//2916 2914//2915 +f 2912//2912 2916//2914 2915//2916 +f 2917//2917 2921//2918 2920//2919 +f 2918//2920 2922//2921 2917//2917 +f 2919//2922 2923//2923 2918//2920 +f 2920//2919 2924//2924 2919//2922 +f 2921//2918 2925//2925 2928//2926 +f 2922//2921 2926//2927 2925//2925 +f 2923//2923 2927//2928 2926//2927 +f 2924//2924 2928//2926 2927//2928 +f 2925//2925 2929//2929 2932//2930 +f 2926//2927 2930//2931 2929//2929 +f 2927//2928 2931//2932 2930//2931 +f 2928//2926 2932//2930 2931//2932 +f 2933//2933 2937//2934 2940//2935 +f 2934//2936 2938//2937 2937//2934 +f 2935//2938 2939//2939 2938//2937 +f 2936//2940 2940//2935 2939//2939 +f 2941//2941 2945//2942 2944//2943 +f 2942//2944 2946//2945 2941//2941 +f 2943//2946 2947//2947 2942//2944 +f 2944//2943 2948//2948 2943//2946 +f 2945//2942 2949//2949 2952//2950 +f 2946//2945 2950//2951 2949//2949 +f 2947//2947 2951//2952 2950//2951 +f 2948//2948 2952//2950 2951//2952 +f 2949//2949 2953//2953 2952//2950 +f 2950//2951 2954//2954 2949//2949 +f 2951//2952 2955//2955 2950//2951 +f 2952//2950 2956//2956 2951//2952 +f 2953//2953 2957//2957 2960//2958 +f 2954//2954 2958//2959 2957//2957 +f 2955//2955 2959//2960 2958//2959 +f 2956//2956 2960//2958 2959//2960 +f 2957//2957 2961//2961 2960//2958 +f 2958//2959 2962//2962 2957//2957 +f 2959//2960 2963//2963 2958//2959 +f 2960//2958 2964//2964 2959//2960 +f 2961//2961 2965//2965 2964//2964 +f 2962//2962 2966//2966 2961//2961 +f 2963//2963 2967//2967 2962//2962 +f 2964//2964 2968//2968 2963//2963 +f 2965//2965 2969//2969 2972//2970 +f 2966//2966 2970//2971 2969//2969 +f 2967//2967 2971//2972 2970//2971 +f 2968//2968 2972//2970 2971//2972 +f 2973//2973 2977//2974 2980//2975 +f 2974//2976 2978//2977 2973//2973 +f 2975//2978 2979//2979 2978//2977 +f 2976//2980 2980//2975 2975//2978 +f 2977//2974 2981//2981 2984//2982 +f 2978//2977 2982//2983 2977//2974 +f 2979//2979 2983//2984 2982//2983 +f 2980//2975 2984//2982 2979//2979 +f 2981//2981 2985//2985 2988//2986 +f 2982//2983 2986//2987 2985//2985 +f 2983//2984 2987//2988 2986//2987 +f 2984//2982 2988//2986 2987//2988 +f 2985//2985 2989//2989 2992//2990 +f 2986//2987 2990//2991 2989//2989 +f 2987//2988 2991//2992 2990//2991 +f 2988//2986 2992//2990 2991//2992 +f 2993//2993 2997//2994 2996//2995 +f 2994//2996 2998//2997 2997//2994 +f 2995//2998 2999//2999 2994//2996 +f 2996//2995 3000//3000 2999//2999 +f 2997//2994 3001//3001 3004//3002 +f 2998//2997 3002//3003 3001//3001 +f 2999//2999 3003//3004 3002//3003 +f 3000//3000 3004//3002 3003//3004 +f 3005//3005 3009//3006 3012//3007 +f 3006//3008 3010//3009 3009//3006 +f 3007//3010 3011//3011 3010//3009 +f 3008//3012 3012//3007 3011//3011 +f 3013//3013 3017//3014 3016//3015 +f 3014//3016 3018//3017 3017//3014 +f 3015//3018 3019//3019 3014//3016 +f 3016//3015 3020//3020 3019//3019 +f 3017//3014 3021//3021 3024//3022 +f 3018//3017 3022//3023 3017//3014 +f 3019//3019 3023//3024 3022//3023 +f 3020//3020 3024//3022 3019//3019 +f 3021//3021 3025//3025 3024//3022 +f 3022//3023 3026//3026 3025//3025 +f 3023//3024 3027//3027 3022//3023 +f 3024//3022 3028//3028 3027//3027 +f 3025//3025 3029//3029 3032//3030 +f 3026//3026 3030//3031 3025//3025 +f 3027//3027 3031//3032 3030//3031 +f 3028//3028 3032//3030 3027//3027 +f 3029//3029 3033//3033 3036//3034 +f 3030//3031 3034//3035 3029//3029 +f 3031//3032 3035//3036 3034//3035 +f 3032//3030 3036//3034 3031//3032 +f 3033//3033 3037//3037 3040//3038 +f 3034//3035 3038//3039 3037//3037 +f 3035//3036 3039//3040 3038//3039 +f 3036//3034 3040//3038 3039//3040 +f 3041//3041 3045//3042 3044//3043 +f 3042//3044 3046//3045 3045//3042 +f 3043//3046 3047//3047 3042//3044 +f 3044//3043 3048//3048 3047//3047 +f 3045//3042 3049//3049 3052//3050 +f 3046//3045 3050//3051 3045//3042 +f 3047//3047 3051//3052 3050//3051 +f 3048//3048 3052//3050 3047//3047 +f 3049//3049 3053//3053 3056//3054 +f 3050//3051 3054//3055 3053//3053 +f 3051//3052 3055//3056 3054//3055 +f 3052//3050 3056//3054 3055//3056 +f 3057//3057 3061//3058 3064//3059 +f 3058//3060 3062//3061 3061//3058 +f 3059//3062 3063//3063 3062//3061 +f 3060//3064 3064//3059 3063//3063 +f 3065//3065 3069//3066 3068//3067 +f 3066//3068 3070//3069 3065//3065 +f 3067//3070 3071//3071 3066//3068 +f 3068//3067 3072//3072 3067//3070 +f 3069//3066 3073//3073 3072//3072 +f 3070//3069 3074//3074 3069//3066 +f 3071//3071 3075//3075 3070//3069 +f 3072//3072 3076//3076 3071//3071 +f 3073//3073 3077//3077 3080//3078 +f 3074//3074 3078//3079 3077//3077 +f 3075//3075 3079//3080 3078//3079 +f 3076//3076 3080//3078 3079//3080 +f 3077//3077 3081//3081 3084//3082 +f 3078//3079 3082//3083 3081//3081 +f 3079//3080 3083//3084 3082//3083 +f 3080//3078 3084//3082 3083//3084 +f 3081//3081 3085//3085 3084//3082 +f 3082//3083 3086//3086 3081//3081 +f 3083//3084 3087//3087 3082//3083 +f 3084//3082 3088//3088 3083//3084 +f 3085//3085 3089//3089 3092//3090 +f 3086//3086 3090//3091 3089//3089 +f 3087//3087 3091//3092 3090//3091 +f 3088//3088 3092//3090 3091//3092 +f 3089//3089 3093//3093 3096//3094 +f 3090//3091 3094//3095 3093//3093 +f 3091//3092 3095//3096 3094//3095 +f 3092//3090 3096//3094 3095//3096 +f 3097//3097 3101//3098 3100//3099 +f 3098//3100 3102//3101 3097//3097 +f 3099//3102 3103//3103 3098//3100 +f 3100//3099 3104//3104 3099//3102 +f 3101//3098 3105//3105 3104//3104 +f 3102//3101 3106//3106 3101//3098 +f 3103//3103 3107//3107 3102//3101 +f 3104//3104 3108//3108 3103//3103 +f 3105//3105 3109//3109 3112//3110 +f 3106//3106 3110//3111 3105//3105 +f 3107//3107 3111//3112 3110//3111 +f 3108//3108 3112//3110 3107//3107 +f 3109//3109 3113//3113 3116//3114 +f 3110//3111 3114//3115 3113//3113 +f 3111//3112 3115//3116 3114//3115 +f 3112//3110 3116//3114 3115//3116 +f 3117//3117 3121//3118 3124//3119 +f 3118//3120 3122//3121 3117//3117 +f 3119//3122 3123//3123 3122//3121 +f 3120//3124 3124//3119 3119//3122 +f 3121//3118 3125//3125 3128//3126 +f 3122//3121 3126//3127 3125//3125 +f 3123//3123 3127//3128 3126//3127 +f 3124//3119 3128//3126 3127//3128 +f 3129//3129 3133//3130 3136//3131 +f 3130//3132 3134//3133 3133//3130 +f 3131//3134 3135//3135 3134//3133 +f 3132//3136 3136//3131 3135//3135 +f 3137//3137 3141//3138 3144//3139 +f 3138//3140 3142//3141 3141//3138 +f 3139//3142 3143//3143 3142//3141 +f 3140//3144 3144//3139 3143//3143 +f 3141//3138 3145//3145 3148//3146 +f 3142//3141 3146//3147 3145//3145 +f 3143//3143 3147//3148 3146//3147 +f 3144//3139 3148//3146 3147//3148 +f 3145//3145 3149//3149 3152//3150 +f 3146//3147 3150//3151 3149//3149 +f 3147//3148 3151//3152 3150//3151 +f 3148//3146 3152//3150 3151//3152 +f 3149//3149 3153//3153 3152//3150 +f 3150//3151 3154//3154 3153//3153 +f 3151//3152 3155//3155 3150//3151 +f 3152//3150 3156//3156 3155//3155 +f 3153//3153 3157//3157 3156//3156 +f 3154//3154 3158//3158 3157//3157 +f 3155//3155 3159//3159 3154//3154 +f 3156//3156 3160//3160 3159//3159 +f 3157//3157 3161//3161 3164//3162 +f 3158//3158 3162//3163 3161//3161 +f 3159//3159 3163//3164 3162//3163 +f 3160//3160 3164//3162 3163//3164 +f 3165//3165 3169//3166 3172//3167 +f 3166//3168 3170//3169 3165//3165 +f 3167//3170 3171//3171 3170//3169 +f 3168//3172 3172//3167 3167//3170 +f 3169//3166 3173//3173 3172//3167 +f 3170//3169 3174//3174 3173//3173 +f 3171//3171 3175//3175 3170//3169 +f 3172//3167 3176//3176 3175//3175 +f 3173//3173 3177//3177 3180//3178 +f 3174//3174 3178//3179 3177//3177 +f 3175//3175 3179//3180 3178//3179 +f 3176//3176 3180//3178 3179//3180 +f 3181//3181 3185//3182 3188//3183 +f 3182//3184 3186//3185 3185//3182 +f 3183//3186 3187//3187 3186//3185 +f 3184//3188 3188//3183 3187//3187 +f 3189//3189 3193//3190 3192//3191 +f 3190//3192 3194//3193 3189//3189 +f 3191//3194 3195//3195 3190//3192 +f 3192//3191 3196//3196 3191//3194 +f 3193//3190 3197//3197 3200//3198 +f 3194//3193 3198//3199 3197//3197 +f 3195//3195 3199//3200 3198//3199 +f 3196//3196 3200//3198 3199//3200 +f 3197//3197 3201//3201 3200//3198 +f 3198//3199 3202//3202 3197//3197 +f 3199//3200 3203//3203 3198//3199 +f 3200//3198 3204//3204 3199//3200 +f 3201//3201 3205//3205 3204//3204 +f 3202//3202 3206//3206 3201//3201 +f 3203//3203 3207//3207 3202//3202 +f 3204//3204 3208//3208 3203//3203 +f 3205//3205 3209//3209 3208//3208 +f 3206//3206 3210//3210 3205//3205 +f 3207//3207 3211//3211 3206//3206 +f 3208//3208 3212//3212 3207//3207 +f 3209//3209 3213//3213 3216//3214 +f 3210//3210 3214//3215 3213//3213 +f 3211//3211 3215//3216 3214//3215 +f 3212//3212 3216//3214 3215//3216 +f 3213//3213 3217//3217 3220//3218 +f 3214//3215 3218//3219 3217//3217 +f 3215//3216 3219//3220 3218//3219 +f 3216//3214 3220//3218 3219//3220 +f 3221//3221 3225//3222 3228//3223 +f 3222//3224 3226//3225 3221//3221 +f 3223//3226 3227//3227 3226//3225 +f 3224//3228 3228//3223 3223//3226 +f 3225//3222 3229//3229 3232//3230 +f 3226//3225 3230//3231 3225//3222 +f 3227//3227 3231//3232 3230//3231 +f 3228//3223 3232//3230 3227//3227 +f 3229//3229 3233//3233 3232//3230 +f 3230//3231 3234//3234 3233//3233 +f 3231//3232 3235//3235 3230//3231 +f 3232//3230 3236//3236 3235//3235 +f 3233//3233 3237//3237 3240//3238 +f 3234//3234 3238//3239 3237//3237 +f 3235//3235 3239//3240 3238//3239 +f 3236//3236 3240//3238 3239//3240 +f 3241//3241 3245//3242 3248//3243 +f 3242//3244 3246//3245 3241//3241 +f 3243//3246 3247//3247 3246//3245 +f 3244//3248 3248//3243 3243//3246 +f 3245//3242 3249//3249 3252//3250 +f 3246//3245 3250//3251 3249//3249 +f 3247//3247 3251//3252 3250//3251 +f 3248//3243 3252//3250 3251//3252 +f 3253//3253 3257//3254 3260//3255 +f 3254//3256 3258//3257 3257//3254 +f 3255//3258 3259//3259 3258//3257 +f 3256//3260 3260//3255 3259//3259 +f 3261//3261 3265//3262 3268//3263 +f 3262//3264 3266//3265 3265//3262 +f 3263//3266 3267//3267 3266//3265 +f 3264//3268 3268//3263 3267//3267 +f 3265//3262 3269//3269 3272//3270 +f 3266//3265 3270//3271 3269//3269 +f 3267//3267 3271//3272 3270//3271 +f 3268//3263 3272//3270 3267//3267 +f 3269//3269 3273//3273 3272//3270 +f 3270//3271 3274//3274 3269//3269 +f 3271//3272 3275//3275 3270//3271 +f 3272//3270 3276//3276 3275//3275 +f 3273//3273 3277//3277 3280//3278 +f 3274//3274 3278//3279 3273//3273 +f 3275//3275 3279//3280 3278//3279 +f 3276//3276 3280//3278 3275//3275 +f 3277//3277 3281//3281 3280//3278 +f 3278//3279 3282//3282 3281//3281 +f 3279//3280 3283//3283 3278//3279 +f 3280//3278 3284//3284 3283//3283 +f 3281//3281 3285//3285 3288//3286 +f 3282//3282 3286//3287 3285//3285 +f 3283//3283 3287//3288 3286//3287 +f 3284//3284 3288//3286 3287//3288 +f 3289//3289 3293//3290 3296//3291 +f 3290//3292 3294//3293 3293//3290 +f 3291//3294 3295//3295 3294//3293 +f 3292//3296 3296//3291 3295//3295 +f 3293//3290 3297//3297 3300//3298 +f 3294//3293 3298//3299 3297//3297 +f 3295//3295 3299//3300 3298//3299 +f 3296//3291 3300//3298 3299//3300 +f 3297//3297 3301//3301 3304//3302 +f 3298//3299 3302//3303 3301//3301 +f 3299//3300 3303//3304 3302//3303 +f 3300//3298 3304//3302 3303//3304 +f 3305//3305 3309//3306 3312//3307 +f 3306//3308 3310//3309 3309//3306 +f 3307//3310 3311//3311 3310//3309 +f 3308//3312 3312//3307 3311//3311 +f 3313//3313 3317//3314 3316//3315 +f 3314//3316 3318//3317 3317//3314 +f 3315//3318 3319//3319 3314//3316 +f 3316//3315 3320//3320 3319//3319 +f 3317//3314 3321//3321 3320//3320 +f 3318//3317 3322//3322 3321//3321 +f 3319//3319 3323//3323 3318//3317 +f 3320//3320 3324//3324 3323//3323 +f 3321//3321 3325//3325 3328//3326 +f 3322//3322 3326//3327 3321//3321 +f 3323//3323 3327//3328 3326//3327 +f 3324//3324 3328//3326 3323//3323 +f 3325//3325 3329//3329 3332//3330 +f 3326//3327 3330//3331 3325//3325 +f 3327//3328 3331//3332 3330//3331 +f 3328//3326 3332//3330 3327//3328 +f 3329//3329 3333//3333 3336//3334 +f 3330//3331 3334//3335 3329//3329 +f 3331//3332 3335//3336 3334//3335 +f 3332//3330 3336//3334 3331//3332 +f 3333//3333 3337//3337 3336//3334 +f 3334//3335 3338//3338 3337//3337 +f 3335//3336 3339//3339 3334//3335 +f 3336//3334 3340//3340 3339//3339 +f 3337//3337 3341//3341 3344//3342 +f 3338//3338 3342//3343 3341//3341 +f 3339//3339 3343//3344 3342//3343 +f 3340//3340 3344//3342 3343//3344 +f 3345//3345 3349//3346 3348//3347 +f 3346//3348 3350//3349 3345//3345 +f 3347//3350 3351//3351 3346//3348 +f 3348//3347 3352//3352 3347//3350 +f 3349//3346 3353//3353 3356//3354 +f 3350//3349 3354//3355 3353//3353 +f 3351//3351 3355//3356 3354//3355 +f 3352//3352 3356//3354 3355//3356 +f 3353//3353 3357//3357 3360//3358 +f 3354//3355 3358//3359 3357//3357 +f 3355//3356 3359//3360 3358//3359 +f 3356//3354 3360//3358 3359//3360 +f 3357//3357 3361//3361 3364//3362 +f 3358//3359 3362//3363 3361//3361 +f 3359//3360 3363//3364 3362//3363 +f 3360//3358 3364//3362 3363//3364 +f 3365//3365 3369//3366 3368//3367 +f 3366//3368 3370//3369 3365//3365 +f 3367//3370 3371//3371 3366//3368 +f 3368//3367 3372//3372 3367//3370 +f 3369//3366 3373//3373 3376//3374 +f 3370//3369 3374//3375 3373//3373 +f 3371//3371 3375//3376 3374//3375 +f 3372//3372 3376//3374 3375//3376 +f 3377//3377 3381//3378 3384//3379 +f 3378//3380 3382//3381 3381//3378 +f 3379//3382 3383//3383 3382//3381 +f 3380//3384 3384//3379 3383//3383 +f 3385//3385 3389//3386 3392//3387 +f 3386//3388 3390//3389 3389//3386 +f 3387//3390 3391//3391 3390//3389 +f 3388//3392 3392//3387 3391//3391 +f 3389//3386 3393//3393 3392//3387 +f 3390//3389 3394//3394 3389//3386 +f 3391//3391 3395//3395 3390//3389 +f 3392//3387 3396//3396 3391//3391 +f 3393//3393 3397//3397 3396//3396 +f 3394//3394 3398//3398 3393//3393 +f 3395//3395 3399//3399 3394//3394 +f 3396//3396 3400//3400 3395//3395 +f 3397//3397 3401//3401 3400//3400 +f 3398//3398 3402//3402 3397//3397 +f 3399//3399 3403//3403 3398//3398 +f 3400//3400 3404//3404 3399//3399 +f 3401//3401 3405//3405 3408//3406 +f 3402//3402 3406//3407 3405//3405 +f 3403//3403 3407//3408 3406//3407 +f 3404//3404 3408//3406 3407//3408 +f 3405//3405 3409//3409 3412//3410 +f 3406//3407 3410//3411 3409//3409 +f 3407//3408 3411//3412 3410//3411 +f 3408//3406 3412//3410 3411//3412 +f 3413//3413 3417//3414 3416//3415 +f 3414//3416 3418//3417 3417//3414 +f 3415//3418 3419//3419 3414//3416 +f 3416//3415 3420//3420 3419//3419 +f 3417//3414 3421//3421 3424//3422 +f 3418//3417 3422//3423 3417//3414 +f 3419//3419 3423//3424 3422//3423 +f 3420//3420 3424//3422 3419//3419 +f 3421//3421 3425//3425 3428//3426 +f 3422//3423 3426//3427 3425//3425 +f 3423//3424 3427//3428 3426//3427 +f 3424//3422 3428//3426 3427//3428 +f 3429//3429 3433//3430 3436//3431 +f 3430//3432 3434//3433 3433//3430 +f 3431//3434 3435//3435 3434//3433 +f 3432//3436 3436//3431 3435//3435 +f 3437//3437 3441//3438 3440//3439 +f 3438//3440 3442//3441 3437//3437 +f 3439//3442 3443//3443 3438//3440 +f 3440//3439 3444//3444 3439//3442 +f 3441//3438 3445//3445 3448//3446 +f 3442//3441 3446//3447 3445//3445 +f 3443//3443 3447//3448 3446//3447 +f 3444//3444 3448//3446 3447//3448 +f 3445//3445 3449//3449 3452//3450 +f 3446//3447 3450//3451 3449//3449 +f 3447//3448 3451//3452 3450//3451 +f 3448//3446 3452//3450 3451//3452 +f 3449//3449 3453//3453 3452//3450 +f 3450//3451 3454//3454 3449//3449 +f 3451//3452 3455//3455 3450//3451 +f 3452//3450 3456//3456 3451//3452 +f 3453//3453 3457//3457 3456//3456 +f 3454//3454 3458//3458 3453//3453 +f 3455//3455 3459//3459 3454//3454 +f 3456//3456 3460//3460 3455//3455 +f 3457//3457 3461//3461 3460//3460 +f 3458//3458 3462//3462 3457//3457 +f 3459//3459 3463//3463 3458//3458 +f 3460//3460 3464//3464 3459//3459 +f 3461//3461 3465//3465 3468//3466 +f 3462//3462 3466//3467 3465//3465 +f 3463//3463 3467//3468 3466//3467 +f 3464//3464 3468//3466 3467//3468 +f 3469//3469 3473//3470 3472//3471 +f 3470//3472 3474//3473 3469//3469 +f 3471//3474 3475//3475 3470//3472 +f 3472//3471 3476//3476 3471//3474 +f 3473//3470 3477//3477 3480//3478 +f 3474//3473 3478//3479 3477//3477 +f 3475//3475 3479//3480 3478//3479 +f 3476//3476 3480//3478 3479//3480 +f 3477//3477 3481//3481 3484//3482 +f 3478//3479 3482//3483 3477//3477 +f 3479//3480 3483//3484 3482//3483 +f 3480//3478 3484//3482 3479//3480 +f 3481//3481 3485//3485 3488//3486 +f 3482//3483 3486//3487 3485//3485 +f 3483//3484 3487//3488 3486//3487 +f 3484//3482 3488//3486 3487//3488 +f 3489//3489 3493//3490 3496//3491 +f 3490//3492 3494//3493 3493//3490 +f 3491//3494 3495//3495 3494//3493 +f 3492//3496 3496//3491 3495//3495 +f 3493//3490 3497//3497 3500//3498 +f 3494//3493 3498//3499 3497//3497 +f 3495//3495 3499//3500 3498//3499 +f 3496//3491 3500//3498 3499//3500 +f 3501//3501 3505//3502 3508//3503 +f 3502//3504 3506//3505 3505//3502 +f 3503//3506 3507//3507 3506//3505 +f 3504//3508 3508//3503 3507//3507 +f 3509//3509 3513//3510 3512//3511 +f 3510//3512 3514//3513 3513//3510 +f 3511//3514 3515//3515 3510//3512 +f 3512//3511 3516//3516 3515//3515 +f 3513//3510 3517//3517 3516//3516 +f 3514//3513 3518//3518 3517//3517 +f 3515//3515 3519//3519 3514//3513 +f 3516//3516 3520//3520 3519//3519 +f 3517//3517 3521//3521 3524//3522 +f 3518//3518 3522//3523 3517//3517 +f 3519//3519 3523//3524 3522//3523 +f 3520//3520 3524//3522 3519//3519 +f 3521//3521 3525//3525 3528//3526 +f 3522//3523 3526//3527 3521//3521 +f 3523//3524 3527//3528 3526//3527 +f 3524//3522 3528//3526 3523//3524 +f 3525//3525 3529//3529 3528//3526 +f 3526//3527 3530//3530 3529//3529 +f 3527//3528 3531//3531 3526//3527 +f 3528//3526 3532//3532 3531//3531 +f 3529//3529 3533//3533 3536//3534 +f 3530//3530 3534//3535 3533//3533 +f 3531//3531 3535//3536 3534//3535 +f 3532//3532 3536//3534 3535//3536 +f 3537//3537 3541//3538 3540//3539 +f 3538//3540 3542//3541 3541//3538 +f 3539//3542 3543//3543 3538//3540 +f 3540//3539 3544//3544 3543//3543 +f 3541//3538 3545//3545 3548//3546 +f 3542//3541 3546//3547 3541//3538 +f 3543//3543 3547//3548 3546//3547 +f 3544//3544 3548//3546 3543//3543 +f 3545//3545 3549//3549 3552//3550 +f 3546//3547 3550//3551 3549//3549 +f 3547//3548 3551//3552 3550//3551 +f 3548//3546 3552//3550 3551//3552 +f 3553//3553 3557//3554 3560//3555 +f 3554//3556 3558//3557 3557//3554 +f 3555//3558 3559//3559 3558//3557 +f 3556//3560 3560//3555 3559//3559 +f 3561//3561 3565//3562 3568//3563 +f 3562//3564 3566//3565 3565//3562 +f 3563//3566 3567//3567 3566//3565 +f 3564//3568 3568//3563 3567//3567 +f 3565//3562 3569//3569 3572//3570 +f 3566//3565 3570//3571 3569//3569 +f 3567//3567 3571//3572 3570//3571 +f 3568//3563 3572//3570 3571//3572 +f 3569//3569 3573//3573 3576//3574 +f 3570//3571 3574//3575 3573//3573 +f 3571//3572 3575//3576 3574//3575 +f 3572//3570 3576//3574 3575//3576 +f 3573//3573 3577//3577 3576//3574 +f 3574//3575 3578//3578 3573//3573 +f 3575//3576 3579//3579 3574//3575 +f 3576//3574 3580//3580 3575//3576 +f 3577//3577 3581//3581 3584//3582 +f 3578//3578 3582//3583 3581//3581 +f 3579//3579 3583//3584 3582//3583 +f 3580//3580 3584//3582 3583//3584 +f 3581//3581 3585//3585 3584//3582 +f 3582//3583 3586//3586 3581//3581 +f 3583//3584 3587//3587 3582//3583 +f 3584//3582 3588//3588 3583//3584 +f 3585//3585 3589//3589 3592//3590 +f 3586//3586 3590//3591 3589//3589 +f 3587//3587 3591//3592 3590//3591 +f 3588//3588 3592//3590 3591//3592 +f 3593//3593 3597//3594 3600//3595 +f 3594//3596 3598//3597 3597//3594 +f 3595//3598 3599//3599 3598//3597 +f 3596//3600 3600//3595 3599//3599 +f 3597//3594 3601//3601 3600//3595 +f 3598//3597 3602//3602 3601//3601 +f 3599//3599 3603//3603 3598//3597 +f 3600//3595 3604//3604 3603//3603 +f 3601//3601 3605//3605 3604//3604 +f 3602//3602 3606//3606 3605//3605 +f 3603//3603 3607//3607 3602//3602 +f 3604//3604 3608//3608 3607//3607 +f 3605//3605 3609//3609 3612//3610 +f 3606//3606 3610//3611 3609//3609 +f 3607//3607 3611//3612 3610//3611 +f 3608//3608 3612//3610 3611//3612 +f 3613//3613 3617//3614 3620//3615 +f 3614//3616 3618//3617 3613//3613 +f 3615//3618 3619//3619 3618//3617 +f 3616//3620 3620//3615 3615//3618 +f 3617//3614 3621//3621 3624//3622 +f 3618//3617 3622//3623 3621//3621 +f 3619//3619 3623//3624 3622//3623 +f 3620//3615 3624//3622 3623//3624 +f 3625//3625 3629//3626 3632//3627 +f 3626//3628 3630//3629 3629//3626 +f 3627//3630 3631//3631 3630//3629 +f 3628//3632 3632//3627 3631//3631 +f 3633//3633 3637//3634 3636//3635 +f 3634//3636 3638//3637 3633//3633 +f 3635//3638 3639//3639 3634//3636 +f 3636//3635 3640//3640 3635//3638 +f 3637//3634 3641//3641 3644//3642 +f 3638//3637 3642//3643 3641//3641 +f 3639//3639 3643//3644 3642//3643 +f 3640//3640 3644//3642 3643//3644 +f 3641//3641 3645//3645 3644//3642 +f 3642//3643 3646//3646 3641//3641 +f 3643//3644 3647//3647 3642//3643 +f 3644//3642 3648//3648 3643//3644 +f 3645//3645 3649//3649 3648//3648 +f 3646//3646 3650//3650 3645//3645 +f 3647//3647 3651//3651 3646//3646 +f 3648//3648 3652//3652 3647//3647 +f 3649//3649 3653//3653 3656//3654 +f 3650//3650 3654//3655 3653//3653 +f 3651//3651 3655//3656 3654//3655 +f 3652//3652 3656//3654 3651//3651 +f 3653//3653 3657//3657 3660//3658 +f 3654//3655 3658//3659 3657//3657 +f 3655//3656 3659//3660 3658//3659 +f 3656//3654 3660//3658 3659//3660 +f 3661//3661 3665//3662 3668//3663 +f 3662//3664 3666//3665 3665//3662 +f 3663//3666 3667//3667 3666//3665 +f 3664//3668 3668//3663 3667//3667 +f 3665//3662 3669//3669 3668//3663 +f 3666//3665 3670//3670 3665//3662 +f 3667//3667 3671//3671 3666//3665 +f 3668//3663 3672//3672 3667//3667 +f 3669//3669 3673//3673 3676//3674 +f 3670//3670 3674//3675 3673//3673 +f 3671//3671 3675//3676 3674//3675 +f 3672//3672 3676//3674 3675//3676 +f 3677//3677 3681//3678 3684//3679 +f 3678//3680 3682//3681 3681//3678 +f 3679//3682 3683//3683 3682//3681 +f 3680//3684 3684//3679 3683//3683 +f 3685//3685 3689//3686 3688//3687 +f 3686//3688 3690//3689 3685//3685 +f 3687//3690 3691//3691 3686//3688 +f 3688//3687 3692//3692 3687//3690 +f 3689//3686 3693//3693 3696//3694 +f 3690//3689 3694//3695 3693//3693 +f 3691//3691 3695//3696 3694//3695 +f 3692//3692 3696//3694 3695//3696 +f 3693//3693 3697//3697 3696//3694 +f 3694//3695 3698//3698 3693//3693 +f 3695//3696 3699//3699 3694//3695 +f 3696//3694 3700//3700 3695//3696 +f 3697//3697 3701//3701 3700//3700 +f 3698//3698 3702//3702 3697//3697 +f 3699//3699 3703//3703 3698//3698 +f 3700//3700 3704//3704 3699//3699 +f 3701//3701 3705//3705 3704//3704 +f 3702//3702 3706//3706 3701//3701 +f 3703//3703 3707//3707 3702//3702 +f 3704//3704 3708//3708 3703//3703 +f 3705//3705 3709//3709 3712//3710 +f 3706//3706 3710//3711 3709//3709 +f 3707//3707 3711//3712 3710//3711 +f 3708//3708 3712//3710 3711//3712 +f 3709//3709 3713//3713 3716//3714 +f 3710//3711 3714//3715 3713//3713 +f 3711//3712 3715//3716 3714//3715 +f 3712//3710 3716//3714 3715//3716 +f 3717//3717 3721//3718 3720//3719 +f 3718//3720 3722//3721 3717//3717 +f 3719//3722 3723//3723 3718//3720 +f 3720//3719 3724//3724 3719//3722 +f 3721//3718 3725//3725 3728//3726 +f 3722//3721 3726//3727 3725//3725 +f 3723//3723 3727//3728 3726//3727 +f 3724//3724 3728//3726 3727//3728 +f 3725//3725 3729//3729 3728//3726 +f 3726//3727 3730//3730 3729//3729 +f 3727//3728 3731//3731 3726//3727 +f 3728//3726 3732//3732 3731//3731 +f 3729//3729 3733//3733 3736//3734 +f 3730//3730 3734//3735 3733//3733 +f 3731//3731 3735//3736 3734//3735 +f 3732//3732 3736//3734 3735//3736 +f 3737//3737 3741//3738 3740//3739 +f 3738//3740 3742//3741 3737//3737 +f 3739//3742 3743//3743 3738//3740 +f 3740//3739 3744//3744 3739//3742 +f 3741//3738 3745//3745 3748//3746 +f 3742//3741 3746//3747 3745//3745 +f 3743//3743 3747//3748 3746//3747 +f 3744//3744 3748//3746 3747//3748 +f 3749//3749 3753//3750 3756//3751 +f 3750//3752 3754//3753 3753//3750 +f 3751//3754 3755//3755 3754//3753 +f 3752//3756 3756//3751 3755//3755 +f 3757//3757 3761//3758 3760//3759 +f 3758//3760 3762//3761 3757//3757 +f 3759//3762 3763//3763 3758//3760 +f 3760//3759 3764//3764 3759//3762 +f 3761//3758 3765//3765 3764//3764 +f 3762//3761 3766//3766 3765//3765 +f 3763//3763 3767//3767 3762//3761 +f 3764//3764 3768//3768 3767//3767 +f 3765//3765 3769//3769 3768//3768 +f 3766//3766 3770//3770 3769//3769 +f 3767//3767 3771//3771 3766//3766 +f 3768//3768 3772//3772 3771//3771 +f 3769//3769 3773//3773 3776//3774 +f 3770//3770 3774//3775 3769//3769 +f 3771//3771 3775//3776 3774//3775 +f 3772//3772 3776//3774 3771//3771 +f 3773//3773 3777//3777 3776//3774 +f 3774//3775 3778//3778 3777//3777 +f 3775//3776 3779//3779 3774//3775 +f 3776//3774 3780//3780 3779//3779 +f 3777//3777 3781//3781 3784//3782 +f 3778//3778 3782//3783 3781//3781 +f 3779//3779 3783//3784 3782//3783 +f 3780//3780 3784//3782 3783//3784 +f 3785//3785 3789//3786 3792//3787 +f 3786//3788 3790//3789 3789//3786 +f 3787//3790 3791//3791 3790//3789 +f 3788//3792 3792//3787 3791//3791 +f 3789//3786 3793//3793 3796//3794 +f 3790//3789 3794//3795 3793//3793 +f 3791//3791 3795//3796 3794//3795 +f 3792//3787 3796//3794 3795//3796 +f 3793//3793 3797//3797 3800//3798 +f 3794//3795 3798//3799 3797//3797 +f 3795//3796 3799//3800 3798//3799 +f 3796//3794 3800//3798 3799//3800 +f 3801//3801 3805//3802 3808//3803 +f 3802//3804 3806//3805 3805//3802 +f 3803//3806 3807//3807 3806//3805 +f 3804//3808 3808//3803 3807//3807 +f 3809//3809 3813//3810 3812//3811 +f 3810//3812 3814//3813 3809//3809 +f 3811//3814 3815//3815 3810//3812 +f 3812//3811 3816//3816 3811//3814 +f 3813//3810 3817//3817 3816//3816 +f 3814//3813 3818//3818 3813//3810 +f 3815//3815 3819//3819 3814//3813 +f 3816//3816 3820//3820 3815//3815 +f 3817//3817 3821//3821 3820//3820 +f 3818//3818 3822//3822 3817//3817 +f 3819//3819 3823//3823 3818//3818 +f 3820//3820 3824//3824 3819//3819 +f 3821//3821 3825//3825 3824//3824 +f 3822//3822 3826//3826 3821//3821 +f 3823//3823 3827//3827 3822//3822 +f 3824//3824 3828//3828 3823//3823 +f 3825//3825 3829//3829 3832//3830 +f 3826//3826 3830//3831 3829//3829 +f 3827//3827 3831//3832 3830//3831 +f 3828//3828 3832//3830 3831//3832 +f 3829//3829 3833//3833 3832//3830 +f 3830//3831 3834//3834 3829//3829 +f 3831//3832 3835//3835 3830//3831 +f 3832//3830 3836//3836 3831//3832 +f 3833//3833 3837//3837 3840//3838 +f 3834//3834 3838//3839 3837//3837 +f 3835//3835 3839//3840 3838//3839 +f 3836//3836 3840//3838 3839//3840 +f 3841//3841 3845//3842 3844//3843 +f 3842//3844 3846//3845 3845//3842 +f 3843//3846 3847//3847 3842//3844 +f 3844//3843 3848//3848 3847//3847 +f 3845//3842 3849//3849 3852//3850 +f 3846//3845 3850//3851 3845//3842 +f 3847//3847 3851//3852 3850//3851 +f 3848//3848 3852//3850 3847//3847 +f 3849//3849 3853//3853 3856//3854 +f 3850//3851 3854//3855 3853//3853 +f 3851//3852 3855//3856 3854//3855 +f 3852//3850 3856//3854 3855//3856 +f 3853//3853 3857//3857 3860//3858 +f 3854//3855 3858//3859 3857//3857 +f 3855//3856 3859//3860 3858//3859 +f 3856//3854 3860//3858 3859//3860 +f 3861//3861 3865//3862 3864//3863 +f 3862//3864 3866//3865 3865//3862 +f 3863//3866 3867//3867 3862//3864 +f 3864//3863 3868//3868 3867//3867 +f 3865//3862 3869//3869 3872//3870 +f 3866//3865 3870//3871 3869//3869 +f 3867//3867 3871//3872 3870//3871 +f 3868//3868 3872//3870 3871//3872 +f 3873//3873 3877//3874 3880//3875 +f 3874//3876 3878//3877 3877//3874 +f 3875//3878 3879//3879 3878//3877 +f 3876//3880 3880//3875 3879//3879 +f 5//2 8//8 4//3 +f 1//1 2//4 5//2 +f 7//7 6//5 2//4 +f 3//6 4//3 7//7 +f 8//8 5//2 12//10 +f 5//2 6//5 9//9 +f 6//5 7//7 10//11 +f 7//7 8//8 11//12 +f 12//10 9//9 16//14 +f 14//15 13//13 9//9 +f 10//11 11//12 14//15 +f 16//14 15//16 11//12 +f 17//17 20//20 16//14 +f 18//18 17//17 13//13 +f 19//19 18//18 14//15 +f 20//20 19//19 15//16 +f 21//21 24//24 20//20 +f 17//17 18//18 21//21 +f 23//23 22//22 18//18 +f 19//19 20//20 23//23 +f 25//25 28//28 24//24 +f 26//26 25//25 21//21 +f 27//27 26//26 22//22 +f 28//28 27//27 23//23 +f 28//28 25//25 32//30 +f 25//25 26//26 29//29 +f 26//26 27//27 30//31 +f 27//27 28//28 31//32 +f 32//30 29//29 36//34 +f 29//29 30//31 33//33 +f 30//31 31//32 34//35 +f 31//32 32//30 35//36 +f 41//38 44//44 40//39 +f 37//37 38//40 41//38 +f 43//43 42//41 38//40 +f 39//42 40//39 43//43 +f 44//44 41//38 48//46 +f 46//47 45//45 41//38 +f 42//41 43//43 46//47 +f 48//46 47//48 43//43 +f 48//46 45//45 52//50 +f 45//45 46//47 49//49 +f 46//47 47//48 50//51 +f 47//48 48//46 51//52 +f 53//53 56//56 52//50 +f 54//54 53//53 49//49 +f 55//55 54//54 50//51 +f 56//56 55//55 51//52 +f 56//56 53//53 60//58 +f 53//53 54//54 57//57 +f 54//54 55//55 58//59 +f 55//55 56//56 59//60 +f 60//58 57//57 64//62 +f 62//63 61//61 57//57 +f 58//59 59//60 62//63 +f 64//62 63//64 59//60 +f 64//62 61//61 68//66 +f 61//61 62//63 65//65 +f 62//63 63//64 66//67 +f 63//64 64//62 67//68 +f 73//70 76//76 72//71 +f 74//73 73//70 69//69 +f 75//75 74//73 70//72 +f 76//76 75//75 71//74 +f 76//76 73//70 80//78 +f 73//70 74//73 77//77 +f 74//73 75//75 78//79 +f 75//75 76//76 79//80 +f 81//81 84//84 80//78 +f 82//82 81//81 77//77 +f 83//83 82//82 78//79 +f 84//84 83//83 79//80 +f 84//84 81//81 88//86 +f 81//81 82//82 85//85 +f 82//82 83//83 86//87 +f 83//83 84//84 87//88 +f 89//89 92//92 88//86 +f 85//85 86//87 89//89 +f 91//91 90//90 86//87 +f 87//88 88//86 91//91 +f 92//92 89//89 96//94 +f 94//95 93//93 89//89 +f 90//90 91//91 94//95 +f 96//94 95//96 91//91 +f 96//94 93//93 100//98 +f 93//93 94//95 97//97 +f 94//95 95//96 98//99 +f 95//96 96//94 99//100 +f 104//108 101//101 108//103 +f 101//101 102//104 105//102 +f 102//104 103//106 106//105 +f 103//106 104//108 107//107 +f 109//109 112//112 108//103 +f 110//110 109//109 105//102 +f 111//111 110//110 106//105 +f 112//112 111//111 107//107 +f 113//113 116//116 112//112 +f 114//114 113//113 109//109 +f 115//115 114//114 110//110 +f 116//116 115//115 111//111 +f 116//116 113//113 120//118 +f 113//113 114//114 117//117 +f 114//114 115//115 118//119 +f 115//115 116//116 119//120 +f 121//121 124//124 120//118 +f 117//117 118//119 121//121 +f 123//123 122//122 118//119 +f 119//120 120//118 123//123 +f 124//124 121//121 128//126 +f 121//121 122//122 125//125 +f 122//122 123//123 126//127 +f 123//123 124//124 127//128 +f 132//136 129//129 136//131 +f 129//129 130//132 133//130 +f 130//132 131//134 134//133 +f 131//134 132//136 135//135 +f 137//137 140//140 136//131 +f 138//138 137//137 133//130 +f 139//139 138//138 134//133 +f 140//140 139//139 135//135 +f 141//141 144//144 140//140 +f 137//137 138//138 141//141 +f 143//143 142//142 138//138 +f 139//139 140//140 143//143 +f 144//144 141//141 148//146 +f 146//147 145//145 141//141 +f 142//142 143//143 146//147 +f 148//146 147//148 143//143 +f 148//146 145//145 152//150 +f 145//145 146//147 149//149 +f 146//147 147//148 150//151 +f 147//148 148//146 151//152 +f 156//160 153//153 160//155 +f 158//157 157//154 153//153 +f 154//156 155//158 158//157 +f 160//155 159//159 155//158 +f 161//161 164//164 160//155 +f 157//154 158//157 161//161 +f 163//163 162//162 158//157 +f 159//159 160//155 163//163 +f 164//164 161//161 168//166 +f 161//161 162//162 165//165 +f 162//162 163//163 166//167 +f 163//163 164//164 167//168 +f 168//166 165//165 172//170 +f 170//171 169//169 165//165 +f 166//167 167//168 170//171 +f 172//170 171//172 167//168 +f 172//170 169//169 176//174 +f 169//169 170//171 173//173 +f 170//171 171//172 174//175 +f 171//172 172//170 175//176 +f 180//184 177//177 184//179 +f 177//177 178//180 181//178 +f 178//180 179//182 182//181 +f 179//182 180//184 183//183 +f 184//179 181//178 188//186 +f 181//178 182//181 185//185 +f 182//181 183//183 186//187 +f 183//183 184//179 187//188 +f 189//189 192//192 188//186 +f 190//190 189//189 185//185 +f 191//191 190//190 186//187 +f 192//192 191//191 187//188 +f 192//192 189//189 196//194 +f 189//189 190//190 193//193 +f 190//190 191//191 194//195 +f 191//191 192//192 195//196 +f 201//198 204//204 200//199 +f 197//197 198//200 201//198 +f 203//203 202//201 198//200 +f 199//202 200//199 203//203 +f 204//204 201//198 208//206 +f 206//207 205//205 201//198 +f 202//201 203//203 206//207 +f 208//206 207//208 203//203 +f 209//209 212//212 208//206 +f 210//210 209//209 205//205 +f 211//211 210//210 206//207 +f 212//212 211//211 207//208 +f 212//212 209//209 216//214 +f 209//209 210//210 213//213 +f 210//210 211//211 214//215 +f 211//211 212//212 215//216 +f 220//224 217//217 224//219 +f 222//221 221//218 217//217 +f 218//220 219//222 222//221 +f 224//219 223//223 219//222 +f 225//225 228//228 224//219 +f 221//218 222//221 225//225 +f 227//227 226//226 222//221 +f 223//223 224//219 227//227 +f 228//228 225//225 232//230 +f 225//225 226//226 229//229 +f 226//226 227//227 230//231 +f 227//227 228//228 231//232 +f 236//240 233//233 240//235 +f 238//237 237//234 233//233 +f 234//236 235//238 238//237 +f 240//235 239//239 235//238 +f 241//241 244//244 240//235 +f 237//234 238//237 241//241 +f 243//243 242//242 238//237 +f 239//239 240//235 243//243 +f 244//244 241//241 248//246 +f 241//241 242//242 245//245 +f 242//242 243//243 246//247 +f 243//243 244//244 247//248 +f 253//250 256//256 252//251 +f 254//253 253//250 249//249 +f 255//255 254//253 250//252 +f 256//256 255//255 251//254 +f 256//256 253//250 260//258 +f 258//259 257//257 253//250 +f 254//253 255//255 258//259 +f 260//258 259//260 255//255 +f 260//258 257//257 264//262 +f 257//257 258//259 261//261 +f 258//259 259//260 262//263 +f 259//260 260//258 263//264 +f 269//266 272//272 268//267 +f 270//269 269//266 265//265 +f 271//271 270//269 266//268 +f 272//272 271//271 267//270 +f 272//272 269//266 276//274 +f 269//266 270//269 273//273 +f 270//269 271//271 274//275 +f 271//271 272//272 275//276 +f 280//284 277//277 284//279 +f 277//277 278//280 281//278 +f 278//280 279//282 282//281 +f 279//282 280//284 283//283 +f 284//279 281//278 288//286 +f 281//278 282//281 285//285 +f 282//281 283//283 286//287 +f 283//283 284//279 287//288 +f 293//290 296//296 292//291 +f 294//293 293//290 289//289 +f 295//295 294//293 290//292 +f 296//296 295//295 291//294 +f 296//296 293//290 300//298 +f 293//290 294//293 297//297 +f 294//293 295//295 298//299 +f 295//295 296//296 299//300 +f 304//308 301//301 308//303 +f 301//301 302//304 305//302 +f 302//304 303//306 306//305 +f 303//306 304//308 307//307 +f 308//303 305//302 312//310 +f 305//302 306//305 309//309 +f 306//305 307//307 310//311 +f 307//307 308//303 311//312 +f 317//314 320//320 316//315 +f 318//317 317//314 313//313 +f 319//319 318//317 314//316 +f 320//320 319//319 315//318 +f 320//320 317//314 324//322 +f 317//314 318//317 321//321 +f 318//317 319//319 322//323 +f 319//319 320//320 323//324 +f 328//332 325//325 332//327 +f 325//325 326//328 329//326 +f 326//328 327//330 330//329 +f 327//330 328//332 331//331 +f 336//340 333//333 340//335 +f 333//333 334//336 337//334 +f 334//336 335//338 338//337 +f 335//338 336//340 339//339 +f 344//348 341//341 348//343 +f 341//341 342//344 345//342 +f 342//344 343//346 346//345 +f 343//346 344//348 347//347 +f 352//356 349//349 356//351 +f 349//349 350//352 353//350 +f 350//352 351//354 354//353 +f 351//354 352//356 355//355 +f 360//364 357//357 364//359 +f 357//357 358//360 361//358 +f 358//360 359//362 362//361 +f 359//362 360//364 363//363 +f 368//372 365//365 372//367 +f 365//365 366//368 369//366 +f 366//368 367//370 370//369 +f 367//370 368//372 371//371 +f 376//380 373//373 380//375 +f 373//373 374//376 377//374 +f 374//376 375//378 378//377 +f 375//378 376//380 379//379 +f 380//375 377//374 384//382 +f 377//374 378//377 381//381 +f 378//377 379//379 382//383 +f 379//379 380//375 383//384 +f 384//382 381//381 388//386 +f 386//387 385//385 381//381 +f 382//383 383//384 386//387 +f 388//386 387//388 383//384 +f 389//389 392//392 388//386 +f 390//390 389//389 385//385 +f 391//391 390//390 386//387 +f 392//392 391//391 387//388 +f 392//392 389//389 396//394 +f 394//395 393//393 389//389 +f 390//390 391//391 394//395 +f 396//394 395//396 391//391 +f 397//397 400//400 396//394 +f 393//393 394//395 397//397 +f 399//399 398//398 394//395 +f 395//396 396//394 399//399 +f 400//400 397//397 404//402 +f 397//397 398//398 401//401 +f 398//398 399//399 402//403 +f 399//399 400//400 403//404 +f 405//405 408//408 404//402 +f 406//406 405//405 401//401 +f 407//407 406//406 402//403 +f 408//408 407//407 403//404 +f 408//408 405//405 412//410 +f 405//405 406//406 409//409 +f 406//406 407//407 410//411 +f 407//407 408//408 411//412 +f 412//410 409//409 416//414 +f 409//409 410//411 413//413 +f 410//411 411//412 414//415 +f 411//412 412//410 415//416 +f 421//418 424//424 420//419 +f 422//421 421//418 417//417 +f 423//423 422//421 418//420 +f 424//424 423//423 419//422 +f 424//424 421//418 428//426 +f 421//418 422//421 425//425 +f 422//421 423//423 426//427 +f 423//423 424//424 427//428 +f 429//429 432//432 428//426 +f 430//430 429//429 425//425 +f 431//431 430//430 426//427 +f 432//432 431//431 427//428 +f 432//432 429//429 436//434 +f 434//435 433//433 429//429 +f 430//430 431//431 434//435 +f 436//434 435//436 431//431 +f 437//437 440//440 436//434 +f 433//433 434//435 437//437 +f 439//439 438//438 434//435 +f 435//436 436//434 439//439 +f 440//440 437//437 444//442 +f 437//437 438//438 441//441 +f 438//438 439//439 442//443 +f 439//439 440//440 443//444 +f 445//445 448//448 444//442 +f 441//441 442//443 445//445 +f 447//447 446//446 442//443 +f 443//444 444//442 447//447 +f 448//448 445//445 452//450 +f 450//451 449//449 445//445 +f 446//446 447//447 450//451 +f 452//450 451//452 447//447 +f 452//450 449//449 456//454 +f 449//449 450//451 453//453 +f 450//451 451//452 454//455 +f 451//452 452//450 455//456 +f 456//454 453//453 460//458 +f 453//453 454//455 457//457 +f 454//455 455//456 458//459 +f 455//456 456//454 459//460 +f 465//462 468//468 464//463 +f 461//461 462//464 465//462 +f 467//467 466//465 462//464 +f 463//466 464//463 467//467 +f 469//469 472//472 468//468 +f 465//462 466//465 469//469 +f 471//471 470//470 466//465 +f 467//467 468//468 471//471 +f 473//473 476//476 472//472 +f 474//474 473//473 469//469 +f 475//475 474//474 470//470 +f 476//476 475//475 471//471 +f 476//476 473//473 480//478 +f 478//479 477//477 473//473 +f 474//474 475//475 478//479 +f 480//478 479//480 475//475 +f 480//478 477//477 484//482 +f 477//477 478//479 481//481 +f 478//479 479//480 482//483 +f 479//480 480//478 483//484 +f 484//482 481//481 488//486 +f 486//487 485//485 481//481 +f 482//483 483//484 486//487 +f 488//486 487//488 483//484 +f 489//489 492//492 488//486 +f 485//485 486//487 489//489 +f 491//491 490//490 486//487 +f 487//488 488//486 491//491 +f 493//493 496//496 492//492 +f 494//494 493//493 489//489 +f 495//495 494//494 490//490 +f 496//496 495//495 491//491 +f 496//496 493//493 500//498 +f 493//493 494//494 497//497 +f 494//494 495//495 498//499 +f 495//495 496//496 499//500 +f 500//498 497//497 504//502 +f 497//497 498//499 501//501 +f 498//499 499//500 502//503 +f 499//500 500//498 503//504 +f 509//506 512//512 508//507 +f 505//505 506//508 509//506 +f 511//511 510//509 506//508 +f 507//510 508//507 511//511 +f 512//512 509//506 516//514 +f 509//506 510//509 513//513 +f 510//509 511//511 514//515 +f 511//511 512//512 515//516 +f 516//514 513//513 520//518 +f 513//513 514//515 517//517 +f 514//515 515//516 518//519 +f 515//516 516//514 519//520 +f 521//521 524//524 520//518 +f 517//517 518//519 521//521 +f 523//523 522//522 518//519 +f 524//524 523//523 519//520 +f 524//524 521//521 528//526 +f 526//527 525//525 521//521 +f 522//522 523//523 526//527 +f 528//526 527//528 523//523 +f 528//526 525//525 532//530 +f 525//525 526//527 529//529 +f 526//527 527//528 530//531 +f 527//528 528//526 531//532 +f 532//530 529//529 536//534 +f 529//529 530//531 533//533 +f 530//531 531//532 534//535 +f 531//532 532//530 535//536 +f 537//537 540//540 536//534 +f 538//538 537//537 533//533 +f 539//539 538//538 534//535 +f 540//540 539//539 535//536 +f 541//541 544//544 540//540 +f 542//542 541//541 537//537 +f 543//543 542//542 538//538 +f 544//544 543//543 539//539 +f 544//544 541//541 548//546 +f 541//541 542//542 545//545 +f 542//542 543//543 546//547 +f 543//543 544//544 547//548 +f 552//556 549//549 556//551 +f 549//549 550//552 553//550 +f 550//552 551//554 554//553 +f 551//554 552//556 555//555 +f 557//557 560//560 556//551 +f 558//558 557//557 553//550 +f 559//559 558//558 554//553 +f 560//560 559//559 555//555 +f 560//560 557//557 564//562 +f 562//563 561//561 557//557 +f 558//558 559//559 562//563 +f 564//562 563//564 559//559 +f 565//565 568//568 564//562 +f 561//561 562//563 565//565 +f 567//567 566//566 562//563 +f 563//564 564//562 567//567 +f 569//569 572//572 568//568 +f 570//570 569//569 565//565 +f 571//571 570//570 566//566 +f 572//572 571//571 567//567 +f 573//573 576//576 572//572 +f 569//569 570//570 573//573 +f 575//575 574//574 570//570 +f 571//571 572//572 575//575 +f 576//576 573//573 580//578 +f 578//579 577//577 573//573 +f 574//574 575//575 578//579 +f 580//578 579//580 575//575 +f 581//581 584//584 580//578 +f 582//582 581//581 577//577 +f 583//583 582//582 578//579 +f 584//584 583//583 579//580 +f 585//585 588//588 584//584 +f 586//586 585//585 581//581 +f 587//587 586//586 582//582 +f 588//588 587//587 583//583 +f 588//588 585//585 592//590 +f 585//585 586//586 589//589 +f 586//586 587//587 590//591 +f 587//587 588//588 591//592 +f 597//594 600//600 596//595 +f 593//593 594//596 597//594 +f 599//599 598//597 594//596 +f 595//598 596//595 599//599 +f 600//600 597//594 604//602 +f 602//603 601//601 597//594 +f 598//597 599//599 602//603 +f 604//602 603//604 599//599 +f 605//605 608//608 604//602 +f 601//601 602//603 605//605 +f 607//607 606//606 602//603 +f 603//604 604//602 607//607 +f 609//609 612//612 608//608 +f 610//610 609//609 605//605 +f 611//611 610//610 606//606 +f 612//612 611//611 607//607 +f 612//612 609//609 616//614 +f 609//609 610//610 613//613 +f 610//610 611//611 614//615 +f 611//611 612//612 615//616 +f 616//614 613//613 620//618 +f 618//619 617//617 613//613 +f 614//615 615//616 618//619 +f 620//618 619//620 615//616 +f 620//618 617//617 624//622 +f 617//617 618//619 621//621 +f 618//619 619//620 622//623 +f 619//620 620//618 623//624 +f 625//625 628//628 624//622 +f 626//626 625//625 621//621 +f 627//627 626//626 622//623 +f 628//628 627//627 623//624 +f 628//628 625//625 632//630 +f 630//631 629//629 625//625 +f 626//626 627//627 630//631 +f 632//630 631//632 627//627 +f 632//630 629//629 636//634 +f 629//629 630//631 633//633 +f 630//631 631//632 634//635 +f 631//632 632//630 635//636 +f 641//638 644//644 640//639 +f 637//637 638//640 641//638 +f 643//643 642//641 638//640 +f 639//642 640//639 643//643 +f 644//644 641//638 648//646 +f 646//647 645//645 641//638 +f 642//641 643//643 646//647 +f 648//646 647//648 643//643 +f 649//649 652//652 648//646 +f 650//650 649//649 645//645 +f 651//651 650//650 646//647 +f 652//652 651//651 647//648 +f 652//652 649//649 656//654 +f 649//649 650//650 653//653 +f 650//650 651//651 654//655 +f 651//651 652//652 655//656 +f 656//654 653//653 660//658 +f 653//653 654//655 657//657 +f 654//655 655//656 658//659 +f 655//656 656//654 659//660 +f 660//658 657//657 664//662 +f 662//663 661//661 657//657 +f 658//659 659//660 662//663 +f 659//660 660//658 663//664 +f 665//665 668//668 664//662 +f 666//666 665//665 661//661 +f 667//667 666//666 662//663 +f 668//668 667//667 663//664 +f 669//669 672//672 668//668 +f 665//665 666//666 669//669 +f 671//671 670//670 666//666 +f 667//667 668//668 671//671 +f 672//672 669//669 676//674 +f 669//669 670//670 673//673 +f 670//670 671//671 674//675 +f 671//671 672//672 675//676 +f 676//674 673//673 680//678 +f 673//673 674//675 677//677 +f 674//675 675//676 678//679 +f 675//676 676//674 679//680 +f 685//682 688//688 684//683 +f 686//685 685//682 681//681 +f 687//687 686//685 682//684 +f 688//688 687//687 683//686 +f 688//688 685//682 692//690 +f 685//682 686//685 689//689 +f 686//685 687//687 690//691 +f 687//687 688//688 691//692 +f 692//690 689//689 696//694 +f 689//689 690//691 693//693 +f 690//691 691//692 694//695 +f 691//692 692//690 695//696 +f 696//694 693//693 700//698 +f 698//699 697//697 693//693 +f 694//695 695//696 698//699 +f 700//698 699//700 695//696 +f 701//701 704//704 700//698 +f 697//697 698//699 701//701 +f 703//703 702//702 698//699 +f 699//700 700//698 703//703 +f 705//705 708//708 704//704 +f 706//706 705//705 701//701 +f 707//707 706//706 702//702 +f 708//708 707//707 703//703 +f 708//708 705//705 712//710 +f 705//705 706//706 709//709 +f 706//706 707//707 710//711 +f 707//707 708//708 711//712 +f 713//713 716//716 712//710 +f 709//709 710//711 713//713 +f 715//715 714//714 710//711 +f 711//712 712//710 715//715 +f 716//716 713//713 720//718 +f 718//719 717//717 713//713 +f 714//714 715//715 718//719 +f 720//718 719//720 715//715 +f 720//718 717//717 724//722 +f 717//717 718//719 721//721 +f 718//719 719//720 722//723 +f 719//720 720//718 723//724 +f 728//732 725//725 732//727 +f 725//725 726//728 729//726 +f 726//728 727//730 730//729 +f 727//730 728//732 731//731 +f 732//727 729//726 736//734 +f 729//726 730//729 733//733 +f 730//729 731//731 734//735 +f 731//731 732//727 735//736 +f 737//737 740//740 736//734 +f 733//733 734//735 737//737 +f 739//739 738//738 734//735 +f 735//736 736//734 739//739 +f 740//740 737//737 744//742 +f 742//743 741//741 737//737 +f 738//738 739//739 742//743 +f 744//742 743//744 739//739 +f 744//742 741//741 748//746 +f 746//747 745//745 741//741 +f 747//748 746//747 742//743 +f 748//746 747//748 743//744 +f 749//749 752//752 748//746 +f 745//745 746//747 749//749 +f 751//751 750//750 746//747 +f 747//748 748//746 751//751 +f 753//753 756//756 752//752 +f 749//749 750//750 753//753 +f 755//755 754//754 750//750 +f 751//751 752//752 755//755 +f 756//756 753//753 760//758 +f 758//759 757//757 753//753 +f 754//754 755//755 758//759 +f 760//758 759//760 755//755 +f 761//761 764//764 760//758 +f 757//757 758//759 761//761 +f 763//763 762//762 758//759 +f 759//760 760//758 763//763 +f 764//764 761//761 768//766 +f 761//761 762//762 765//765 +f 762//762 763//763 766//767 +f 763//763 764//764 767//768 +f 773//770 776//776 772//771 +f 769//769 770//772 773//770 +f 775//775 774//773 770//772 +f 771//774 772//771 775//775 +f 776//776 773//770 780//778 +f 778//779 777//777 773//770 +f 774//773 775//775 778//779 +f 780//778 779//780 775//775 +f 781//781 784//784 780//778 +f 777//777 778//779 781//781 +f 783//783 782//782 778//779 +f 779//780 780//778 783//783 +f 785//785 788//788 784//784 +f 786//786 785//785 781//781 +f 787//787 786//786 782//782 +f 788//788 787//787 783//783 +f 788//788 785//785 792//790 +f 785//785 786//786 789//789 +f 786//786 787//787 790//791 +f 787//787 788//788 791//792 +f 792//790 789//789 796//794 +f 794//795 793//793 789//789 +f 790//791 791//792 794//795 +f 796//794 795//796 791//792 +f 797//797 800//800 796//794 +f 798//798 797//797 793//793 +f 799//799 798//798 794//795 +f 800//800 799//799 795//796 +f 800//800 797//797 804//802 +f 797//797 798//798 801//801 +f 798//798 799//799 802//803 +f 799//799 800//800 803//804 +f 805//805 808//808 804//802 +f 806//806 805//805 801//801 +f 807//807 806//806 802//803 +f 808//808 807//807 803//804 +f 808//808 805//805 812//810 +f 805//805 806//806 809//809 +f 806//806 807//807 810//811 +f 807//807 808//808 811//812 +f 817//814 820//820 816//815 +f 818//817 817//814 813//813 +f 819//819 818//817 814//816 +f 815//818 816//815 819//819 +f 820//820 817//814 824//822 +f 817//814 818//817 821//821 +f 818//817 819//819 822//823 +f 819//819 820//820 823//824 +f 825//825 828//828 824//822 +f 821//821 822//823 825//825 +f 827//827 826//826 822//823 +f 823//824 824//822 827//827 +f 828//828 825//825 832//830 +f 830//831 829//829 825//825 +f 826//826 827//827 830//831 +f 832//830 831//832 827//827 +f 832//830 829//829 836//834 +f 829//829 830//831 833//833 +f 830//831 831//832 834//835 +f 831//832 832//830 835//836 +f 836//834 833//833 840//838 +f 838//839 837//837 833//833 +f 834//835 835//836 838//839 +f 840//838 839//840 835//836 +f 841//841 844//844 840//838 +f 837//837 838//839 841//841 +f 843//843 842//842 838//839 +f 839//840 840//838 843//843 +f 845//845 848//848 844//844 +f 841//841 842//842 845//845 +f 847//847 846//846 842//842 +f 843//843 844//844 847//847 +f 848//848 845//845 852//850 +f 850//851 849//849 845//845 +f 846//846 847//847 850//851 +f 852//850 851//852 847//847 +f 852//850 849//849 856//854 +f 849//849 850//851 853//853 +f 850//851 851//852 854//855 +f 851//852 852//850 855//856 +f 860//864 857//857 864//859 +f 862//861 861//858 857//857 +f 858//860 859//862 862//861 +f 864//859 863//863 859//862 +f 865//865 868//868 864//859 +f 861//858 862//861 865//865 +f 867//867 866//866 862//861 +f 863//863 864//859 867//867 +f 869//869 872//872 868//868 +f 865//865 866//866 869//869 +f 871//871 870//870 866//866 +f 867//867 868//868 871//871 +f 873//873 876//876 872//872 +f 869//869 870//870 873//873 +f 875//875 874//874 870//870 +f 871//871 872//872 875//875 +f 877//877 880//880 876//876 +f 873//873 874//874 877//877 +f 879//879 878//878 874//874 +f 875//875 876//876 879//879 +f 880//880 877//877 884//882 +f 877//877 878//878 881//881 +f 878//878 879//879 882//883 +f 879//879 880//880 883//884 +f 884//882 881//881 888//886 +f 886//887 885//885 881//881 +f 882//883 883//884 886//887 +f 888//886 887//888 883//884 +f 889//889 892//892 888//886 +f 885//885 886//887 889//889 +f 891//891 890//890 886//887 +f 887//888 888//886 891//891 +f 892//892 889//889 896//894 +f 889//889 890//890 893//893 +f 890//890 891//891 894//895 +f 891//891 892//892 895//896 +f 896//894 893//893 900//898 +f 893//893 894//895 897//897 +f 894//895 895//896 898//899 +f 895//896 896//894 899//900 +f 904//908 901//901 908//903 +f 901//901 902//904 905//902 +f 902//904 903//906 906//905 +f 903//906 904//908 907//907 +f 908//903 905//902 912//910 +f 905//902 906//905 909//909 +f 906//905 907//907 910//911 +f 907//907 908//903 911//912 +f 913//913 916//916 912//910 +f 914//914 913//913 909//909 +f 915//915 914//914 910//911 +f 916//916 915//915 911//912 +f 916//916 913//913 920//918 +f 918//919 917//917 913//913 +f 914//914 915//915 918//919 +f 920//918 919//920 915//915 +f 921//921 924//924 920//918 +f 922//922 921//921 917//917 +f 923//923 922//922 918//919 +f 924//924 923//923 919//920 +f 924//924 921//921 928//926 +f 926//927 925//925 921//921 +f 922//922 923//923 926//927 +f 928//926 927//928 923//923 +f 929//929 932//932 928//926 +f 925//925 926//927 929//929 +f 931//931 930//930 926//927 +f 927//928 928//926 931//931 +f 933//933 936//936 932//932 +f 929//929 930//930 933//933 +f 935//935 934//934 930//930 +f 931//931 932//932 935//935 +f 936//936 933//933 940//938 +f 933//933 934//934 937//937 +f 934//934 935//935 938//939 +f 935//935 936//936 939//940 +f 940//938 937//937 944//942 +f 937//937 938//939 941//941 +f 938//939 939//940 942//943 +f 939//940 940//938 943//944 +f 949//946 952//952 948//947 +f 945//945 946//948 949//946 +f 951//951 950//949 946//948 +f 947//950 948//947 951//951 +f 952//952 949//946 956//954 +f 949//946 950//949 953//953 +f 950//949 951//951 954//955 +f 951//951 952//952 955//956 +f 957//957 960//960 956//954 +f 958//958 957//957 953//953 +f 959//959 958//958 954//955 +f 960//960 959//959 955//956 +f 960//960 957//957 964//962 +f 962//963 961//961 957//957 +f 958//958 959//959 962//963 +f 964//962 963//964 959//959 +f 964//962 961//961 968//966 +f 966//967 965//965 961//961 +f 962//963 963//964 966//967 +f 968//966 967//968 963//964 +f 969//969 972//972 968//966 +f 970//970 969//969 965//965 +f 971//971 970//970 966//967 +f 972//972 971//971 967//968 +f 972//972 969//969 976//974 +f 969//969 970//970 973//973 +f 970//970 971//971 974//975 +f 971//971 972//972 975//976 +f 976//974 973//973 980//978 +f 978//979 977//977 973//973 +f 974//975 975//976 978//979 +f 980//978 979//980 975//976 +f 981//981 984//984 980//978 +f 977//977 978//979 981//981 +f 983//983 982//982 978//979 +f 979//980 980//978 983//983 +f 984//984 981//981 988//986 +f 981//981 982//982 985//985 +f 982//982 983//983 986//987 +f 983//983 984//984 987//988 +f 993//990 996//996 992//991 +f 994//993 993//990 989//989 +f 995//995 994//993 990//992 +f 996//996 995//995 991//994 +f 997//997 1000//1000 996//996 +f 998//998 997//997 993//990 +f 999//999 998//998 994//993 +f 1000//1000 999//999 995//995 +f 1000//1000 997//997 1004//1002 +f 1002//1003 1001//1001 997//997 +f 998//998 999//999 1002//1003 +f 1004//1002 1003//1004 999//999 +f 1005//1005 1008//1008 1004//1002 +f 1001//1001 1002//1003 1005//1005 +f 1007//1007 1006//1006 1002//1003 +f 1003//1004 1004//1002 1007//1007 +f 1008//1008 1005//1005 1012//1010 +f 1005//1005 1006//1006 1009//1009 +f 1006//1006 1007//1007 1010//1011 +f 1007//1007 1008//1008 1011//1012 +f 1012//1010 1009//1009 1016//1014 +f 1009//1009 1010//1011 1013//1013 +f 1010//1011 1011//1012 1014//1015 +f 1011//1012 1012//1010 1015//1016 +f 1017//1017 1020//1020 1016//1014 +f 1013//1013 1014//1015 1017//1017 +f 1019//1019 1018//1018 1014//1015 +f 1015//1016 1016//1014 1019//1019 +f 1020//1020 1017//1017 1024//1022 +f 1017//1017 1018//1018 1021//1021 +f 1018//1018 1019//1019 1022//1023 +f 1019//1019 1020//1020 1023//1024 +f 1024//1022 1021//1021 1028//1026 +f 1021//1021 1022//1023 1025//1025 +f 1022//1023 1023//1024 1026//1027 +f 1023//1024 1024//1022 1027//1028 +f 1028//1026 1025//1025 1032//1030 +f 1025//1025 1026//1027 1029//1029 +f 1026//1027 1027//1028 1030//1031 +f 1027//1028 1028//1026 1031//1032 +f 1036//1040 1033//1033 1040//1035 +f 1038//1037 1037//1034 1033//1033 +f 1034//1036 1035//1038 1038//1037 +f 1040//1035 1039//1039 1035//1038 +f 1040//1035 1037//1034 1044//1042 +f 1042//1043 1041//1041 1037//1034 +f 1038//1037 1039//1039 1042//1043 +f 1044//1042 1043//1044 1039//1039 +f 1045//1045 1048//1048 1044//1042 +f 1041//1041 1042//1043 1045//1045 +f 1047//1047 1046//1046 1042//1043 +f 1043//1044 1044//1042 1047//1047 +f 1048//1048 1045//1045 1052//1050 +f 1045//1045 1046//1046 1049//1049 +f 1046//1046 1047//1047 1050//1051 +f 1047//1047 1048//1048 1051//1052 +f 1053//1053 1056//1056 1052//1050 +f 1049//1049 1050//1051 1053//1053 +f 1055//1055 1054//1054 1050//1051 +f 1051//1052 1052//1050 1055//1055 +f 1057//1057 1060//1060 1056//1056 +f 1053//1053 1054//1054 1057//1057 +f 1059//1059 1058//1058 1054//1054 +f 1055//1055 1056//1056 1059//1059 +f 1060//1060 1057//1057 1064//1062 +f 1062//1063 1061//1061 1057//1057 +f 1058//1058 1059//1059 1062//1063 +f 1064//1062 1063//1064 1059//1059 +f 1065//1065 1068//1068 1064//1062 +f 1066//1066 1065//1065 1061//1061 +f 1067//1067 1066//1066 1062//1063 +f 1068//1068 1067//1067 1063//1064 +f 1068//1068 1065//1065 1072//1070 +f 1065//1065 1066//1066 1069//1069 +f 1066//1066 1067//1067 1070//1071 +f 1067//1067 1068//1068 1071//1072 +f 1072//1070 1069//1069 1076//1074 +f 1069//1069 1070//1071 1073//1073 +f 1070//1071 1071//1072 1074//1075 +f 1071//1072 1072//1070 1075//1076 +f 1081//1078 1084//1084 1080//1079 +f 1082//1081 1081//1078 1077//1077 +f 1083//1083 1082//1081 1078//1080 +f 1084//1084 1083//1083 1079//1082 +f 1084//1084 1081//1078 1088//1086 +f 1081//1078 1082//1081 1085//1085 +f 1082//1081 1083//1083 1086//1087 +f 1083//1083 1084//1084 1087//1088 +f 1089//1089 1092//1092 1088//1086 +f 1085//1085 1086//1087 1089//1089 +f 1091//1091 1090//1090 1086//1087 +f 1087//1088 1088//1086 1091//1091 +f 1092//1092 1089//1089 1096//1094 +f 1094//1095 1093//1093 1089//1089 +f 1090//1090 1091//1091 1094//1095 +f 1096//1094 1095//1096 1091//1091 +f 1097//1097 1100//1100 1096//1094 +f 1093//1093 1094//1095 1097//1097 +f 1099//1099 1098//1098 1094//1095 +f 1095//1096 1096//1094 1099//1099 +f 1101//1101 1104//1104 1100//1100 +f 1102//1102 1101//1101 1097//1097 +f 1103//1103 1102//1102 1098//1098 +f 1104//1104 1103//1103 1099//1099 +f 1104//1104 1101//1101 1108//1106 +f 1106//1107 1105//1105 1101//1101 +f 1102//1102 1103//1103 1106//1107 +f 1108//1106 1107//1108 1103//1103 +f 1109//1109 1112//1112 1108//1106 +f 1110//1110 1109//1109 1105//1105 +f 1111//1111 1110//1110 1106//1107 +f 1112//1112 1111//1111 1107//1108 +f 1113//1113 1116//1116 1112//1112 +f 1109//1109 1110//1110 1113//1113 +f 1115//1115 1114//1114 1110//1110 +f 1111//1111 1112//1112 1115//1115 +f 1116//1116 1113//1113 1120//1118 +f 1113//1113 1114//1114 1117//1117 +f 1114//1114 1115//1115 1118//1119 +f 1115//1115 1116//1116 1119//1120 +f 1124//1128 1121//1121 1128//1123 +f 1121//1121 1122//1124 1125//1122 +f 1122//1124 1123//1126 1126//1125 +f 1123//1126 1124//1128 1127//1127 +f 1128//1123 1125//1122 1132//1130 +f 1125//1122 1126//1125 1129//1129 +f 1126//1125 1127//1127 1130//1131 +f 1127//1127 1128//1123 1131//1132 +f 1133//1133 1136//1136 1132//1130 +f 1134//1134 1133//1133 1129//1129 +f 1135//1135 1134//1134 1130//1131 +f 1136//1136 1135//1135 1131//1132 +f 1137//1137 1140//1140 1136//1136 +f 1133//1133 1134//1134 1137//1137 +f 1139//1139 1138//1138 1134//1134 +f 1135//1135 1136//1136 1139//1139 +f 1140//1140 1137//1137 1144//1142 +f 1142//1143 1141//1141 1137//1137 +f 1138//1138 1139//1139 1142//1143 +f 1144//1142 1143//1144 1139//1139 +f 1145//1145 1148//1148 1144//1142 +f 1141//1141 1142//1143 1145//1145 +f 1147//1147 1146//1146 1142//1143 +f 1143//1144 1144//1142 1147//1147 +f 1149//1149 1152//1152 1148//1148 +f 1145//1145 1146//1146 1149//1149 +f 1151//1151 1150//1150 1146//1146 +f 1147//1147 1148//1148 1151//1151 +f 1153//1153 1156//1156 1152//1152 +f 1149//1149 1150//1150 1153//1153 +f 1155//1155 1154//1154 1150//1150 +f 1151//1151 1152//1152 1155//1155 +f 1156//1156 1153//1153 1160//1158 +f 1158//1159 1157//1157 1153//1153 +f 1154//1154 1155//1155 1158//1159 +f 1160//1158 1159//1160 1155//1155 +f 1160//1158 1157//1157 1164//1162 +f 1157//1157 1158//1159 1161//1161 +f 1158//1159 1159//1160 1162//1163 +f 1159//1160 1160//1158 1163//1164 +f 1168//1172 1165//1165 1172//1167 +f 1170//1169 1169//1166 1165//1165 +f 1166//1168 1167//1170 1170//1169 +f 1172//1167 1171//1171 1167//1170 +f 1173//1173 1176//1176 1172//1167 +f 1169//1166 1170//1169 1173//1173 +f 1175//1175 1174//1174 1170//1169 +f 1171//1171 1172//1167 1175//1175 +f 1177//1177 1180//1180 1176//1176 +f 1178//1178 1177//1177 1173//1173 +f 1179//1179 1178//1178 1174//1174 +f 1180//1180 1179//1179 1175//1175 +f 1181//1181 1184//1184 1180//1180 +f 1177//1177 1178//1178 1181//1181 +f 1183//1183 1182//1182 1178//1178 +f 1179//1179 1180//1180 1183//1183 +f 1184//1184 1181//1181 1188//1186 +f 1181//1181 1182//1182 1185//1185 +f 1182//1182 1183//1183 1186//1187 +f 1183//1183 1184//1184 1187//1188 +f 1189//1189 1192//1192 1188//1186 +f 1185//1185 1186//1187 1189//1189 +f 1191//1191 1190//1190 1186//1187 +f 1187//1188 1188//1186 1191//1191 +f 1193//1193 1196//1196 1192//1192 +f 1189//1189 1190//1190 1193//1193 +f 1195//1195 1194//1194 1190//1190 +f 1191//1191 1192//1192 1195//1195 +f 1196//1196 1193//1193 1200//1198 +f 1193//1193 1194//1194 1197//1197 +f 1194//1194 1195//1195 1198//1199 +f 1195//1195 1196//1196 1199//1200 +f 1201//1201 1204//1204 1200//1198 +f 1202//1202 1201//1201 1197//1197 +f 1203//1203 1202//1202 1198//1199 +f 1204//1204 1203//1203 1199//1200 +f 1204//1204 1201//1201 1208//1206 +f 1201//1201 1202//1202 1205//1205 +f 1202//1202 1203//1203 1206//1207 +f 1203//1203 1204//1204 1207//1208 +f 1212//1216 1209//1209 1216//1211 +f 1214//1213 1213//1210 1209//1209 +f 1210//1212 1211//1214 1214//1213 +f 1216//1211 1215//1215 1211//1214 +f 1217//1217 1220//1220 1216//1211 +f 1213//1210 1214//1213 1217//1217 +f 1219//1219 1218//1218 1214//1213 +f 1215//1215 1216//1211 1219//1219 +f 1220//1220 1217//1217 1224//1222 +f 1222//1223 1221//1221 1217//1217 +f 1218//1218 1219//1219 1222//1223 +f 1224//1222 1223//1224 1219//1219 +f 1224//1222 1221//1221 1228//1226 +f 1221//1221 1222//1223 1225//1225 +f 1222//1223 1223//1224 1226//1227 +f 1223//1224 1224//1222 1227//1228 +f 1229//1229 1232//1232 1228//1226 +f 1230//1230 1229//1229 1225//1225 +f 1231//1231 1230//1230 1226//1227 +f 1232//1232 1231//1231 1227//1228 +f 1233//1233 1236//1236 1232//1232 +f 1229//1229 1230//1230 1233//1233 +f 1235//1235 1234//1234 1230//1230 +f 1231//1231 1232//1232 1235//1235 +f 1236//1236 1233//1233 1240//1238 +f 1238//1239 1237//1237 1233//1233 +f 1234//1234 1235//1235 1238//1239 +f 1240//1238 1239//1240 1235//1235 +f 1240//1238 1237//1237 1244//1242 +f 1237//1237 1238//1239 1241//1241 +f 1238//1239 1239//1240 1242//1243 +f 1239//1240 1240//1238 1243//1244 +f 1245//1245 1248//1248 1244//1242 +f 1246//1246 1245//1245 1241//1241 +f 1247//1247 1246//1246 1242//1243 +f 1248//1248 1247//1247 1243//1244 +f 1248//1248 1245//1245 1252//1250 +f 1245//1245 1246//1246 1249//1249 +f 1246//1246 1247//1247 1250//1251 +f 1247//1247 1248//1248 1251//1252 +f 1256//1260 1253//1253 1260//1255 +f 1253//1253 1254//1256 1257//1254 +f 1254//1256 1255//1258 1258//1257 +f 1255//1258 1256//1260 1259//1259 +f 1261//1261 1264//1264 1260//1255 +f 1262//1262 1261//1261 1257//1254 +f 1263//1263 1262//1262 1258//1257 +f 1264//1264 1263//1263 1259//1259 +f 1264//1264 1261//1261 1268//1266 +f 1266//1267 1265//1265 1261//1261 +f 1262//1262 1263//1263 1266//1267 +f 1268//1266 1267//1268 1263//1263 +f 1268//1266 1265//1265 1272//1270 +f 1265//1265 1266//1267 1269//1269 +f 1266//1267 1267//1268 1270//1271 +f 1267//1268 1268//1266 1271//1272 +f 1273//1273 1276//1276 1272//1270 +f 1274//1274 1273//1273 1269//1269 +f 1275//1275 1274//1274 1270//1271 +f 1276//1276 1275//1275 1271//1272 +f 1276//1276 1273//1273 1280//1278 +f 1273//1273 1274//1274 1277//1277 +f 1274//1274 1275//1275 1278//1279 +f 1275//1275 1276//1276 1279//1280 +f 1281//1281 1284//1284 1280//1278 +f 1282//1282 1281//1281 1277//1277 +f 1283//1283 1282//1282 1278//1279 +f 1284//1284 1283//1283 1279//1280 +f 1284//1284 1281//1281 1288//1286 +f 1281//1281 1282//1282 1285//1285 +f 1282//1282 1283//1283 1286//1287 +f 1283//1283 1284//1284 1287//1288 +f 1288//1286 1285//1285 1292//1290 +f 1290//1291 1289//1289 1285//1285 +f 1286//1287 1287//1288 1290//1291 +f 1292//1290 1291//1292 1287//1288 +f 1292//1290 1289//1289 1296//1294 +f 1289//1289 1290//1291 1293//1293 +f 1290//1291 1291//1292 1294//1295 +f 1291//1292 1292//1290 1295//1296 +f 1301//1298 1304//1304 1300//1299 +f 1302//1301 1301//1298 1297//1297 +f 1303//1303 1302//1301 1298//1300 +f 1304//1304 1303//1303 1299//1302 +f 1304//1304 1301//1298 1308//1306 +f 1301//1298 1302//1301 1305//1305 +f 1302//1301 1303//1303 1306//1307 +f 1303//1303 1304//1304 1307//1308 +f 1308//1306 1305//1305 1312//1310 +f 1305//1305 1306//1307 1309//1309 +f 1306//1307 1307//1308 1310//1311 +f 1307//1308 1308//1306 1311//1312 +f 1313//1313 1316//1316 1312//1310 +f 1309//1309 1310//1311 1313//1313 +f 1315//1315 1314//1314 1310//1311 +f 1311//1312 1312//1310 1315//1315 +f 1316//1316 1313//1313 1320//1318 +f 1313//1313 1314//1314 1317//1317 +f 1314//1314 1315//1315 1318//1319 +f 1315//1315 1316//1316 1319//1320 +f 1320//1318 1317//1317 1324//1322 +f 1322//1323 1321//1321 1317//1317 +f 1323//1324 1322//1323 1318//1319 +f 1324//1322 1323//1324 1319//1320 +f 1324//1322 1321//1321 1328//1326 +f 1326//1327 1325//1325 1321//1321 +f 1322//1323 1323//1324 1326//1327 +f 1328//1326 1327//1328 1323//1324 +f 1329//1329 1332//1332 1328//1326 +f 1325//1325 1326//1327 1329//1329 +f 1331//1331 1330//1330 1326//1327 +f 1327//1328 1328//1326 1331//1331 +f 1333//1333 1336//1336 1332//1332 +f 1329//1329 1330//1330 1333//1333 +f 1335//1335 1334//1334 1330//1330 +f 1331//1331 1332//1332 1335//1335 +f 1336//1336 1333//1333 1340//1338 +f 1333//1333 1334//1334 1337//1337 +f 1334//1334 1335//1335 1338//1339 +f 1335//1335 1336//1336 1339//1340 +f 1345//1342 1348//1348 1344//1343 +f 1346//1345 1345//1342 1341//1341 +f 1347//1347 1346//1345 1342//1344 +f 1348//1348 1347//1347 1343//1346 +f 1349//1349 1352//1352 1348//1348 +f 1350//1350 1349//1349 1345//1342 +f 1351//1351 1350//1350 1346//1345 +f 1352//1352 1351//1351 1347//1347 +f 1352//1352 1349//1349 1356//1354 +f 1354//1355 1353//1353 1349//1349 +f 1350//1350 1351//1351 1354//1355 +f 1356//1354 1355//1356 1351//1351 +f 1357//1357 1360//1360 1356//1354 +f 1353//1353 1354//1355 1357//1357 +f 1359//1359 1358//1358 1354//1355 +f 1355//1356 1356//1354 1359//1359 +f 1360//1360 1357//1357 1364//1362 +f 1357//1357 1358//1358 1361//1361 +f 1358//1358 1359//1359 1362//1363 +f 1359//1359 1360//1360 1363//1364 +f 1364//1362 1361//1361 1368//1366 +f 1361//1361 1362//1363 1365//1365 +f 1362//1363 1363//1364 1366//1367 +f 1363//1364 1364//1362 1367//1368 +f 1369//1369 1372//1372 1368//1366 +f 1365//1365 1366//1367 1369//1369 +f 1371//1371 1370//1370 1366//1367 +f 1367//1368 1368//1366 1371//1371 +f 1373//1373 1376//1376 1372//1372 +f 1374//1374 1373//1373 1369//1369 +f 1375//1375 1374//1374 1370//1370 +f 1376//1376 1375//1375 1371//1371 +f 1376//1376 1373//1373 1380//1378 +f 1373//1373 1374//1374 1377//1377 +f 1374//1374 1375//1375 1378//1379 +f 1375//1375 1376//1376 1379//1380 +f 1380//1378 1377//1377 1384//1382 +f 1377//1377 1378//1379 1381//1381 +f 1378//1379 1379//1380 1382//1383 +f 1379//1380 1380//1378 1383//1384 +f 1388//1392 1385//1385 1392//1387 +f 1385//1385 1386//1388 1389//1386 +f 1386//1388 1387//1390 1390//1389 +f 1387//1390 1388//1392 1391//1391 +f 1393//1393 1396//1396 1392//1387 +f 1394//1394 1393//1393 1389//1386 +f 1395//1395 1394//1394 1390//1389 +f 1396//1396 1395//1395 1391//1391 +f 1397//1397 1400//1400 1396//1396 +f 1398//1398 1397//1397 1393//1393 +f 1399//1399 1398//1398 1394//1394 +f 1400//1400 1399//1399 1395//1395 +f 1401//1401 1404//1404 1400//1400 +f 1397//1397 1398//1398 1401//1401 +f 1403//1403 1402//1402 1398//1398 +f 1399//1399 1400//1400 1403//1403 +f 1404//1404 1401//1401 1408//1406 +f 1406//1407 1405//1405 1401//1401 +f 1402//1402 1403//1403 1406//1407 +f 1408//1406 1407//1408 1403//1403 +f 1409//1409 1412//1412 1408//1406 +f 1410//1410 1409//1409 1405//1405 +f 1411//1411 1410//1410 1406//1407 +f 1412//1412 1411//1411 1407//1408 +f 1412//1412 1409//1409 1416//1414 +f 1409//1409 1410//1410 1413//1413 +f 1410//1410 1411//1411 1414//1415 +f 1411//1411 1412//1412 1415//1416 +f 1417//1417 1420//1420 1416//1414 +f 1418//1418 1417//1417 1413//1413 +f 1419//1419 1418//1418 1414//1415 +f 1420//1420 1419//1419 1415//1416 +f 1421//1421 1424//1424 1420//1420 +f 1417//1417 1418//1418 1421//1421 +f 1423//1423 1422//1422 1418//1418 +f 1419//1419 1420//1420 1423//1423 +f 1424//1424 1421//1421 1428//1426 +f 1421//1421 1422//1422 1425//1425 +f 1422//1422 1423//1423 1426//1427 +f 1423//1423 1424//1424 1427//1428 +f 1433//1430 1436//1436 1432//1431 +f 1434//1433 1433//1430 1429//1429 +f 1435//1435 1434//1433 1430//1432 +f 1436//1436 1435//1435 1431//1434 +f 1436//1436 1433//1430 1440//1438 +f 1433//1430 1434//1433 1437//1437 +f 1434//1433 1435//1435 1438//1439 +f 1435//1435 1436//1436 1439//1440 +f 1440//1438 1437//1437 1444//1442 +f 1437//1437 1438//1439 1441//1441 +f 1438//1439 1439//1440 1442//1443 +f 1439//1440 1440//1438 1443//1444 +f 1444//1442 1441//1441 1448//1446 +f 1441//1441 1442//1443 1445//1445 +f 1442//1443 1443//1444 1446//1447 +f 1443//1444 1444//1442 1447//1448 +f 1449//1449 1452//1452 1448//1446 +f 1450//1450 1449//1449 1445//1445 +f 1451//1451 1450//1450 1446//1447 +f 1452//1452 1451//1451 1447//1448 +f 1453//1453 1456//1456 1452//1452 +f 1454//1454 1453//1453 1449//1449 +f 1455//1455 1454//1454 1450//1450 +f 1456//1456 1455//1455 1451//1451 +f 1456//1456 1453//1453 1460//1458 +f 1453//1453 1454//1454 1457//1457 +f 1454//1454 1455//1455 1458//1459 +f 1455//1455 1456//1456 1459//1460 +f 1461//1461 1464//1464 1460//1458 +f 1462//1462 1461//1461 1457//1457 +f 1463//1463 1462//1462 1458//1459 +f 1464//1464 1463//1463 1459//1460 +f 1464//1464 1461//1461 1468//1466 +f 1461//1461 1462//1462 1465//1465 +f 1462//1462 1463//1463 1466//1467 +f 1463//1463 1464//1464 1467//1468 +f 1468//1466 1465//1465 1472//1470 +f 1465//1465 1466//1467 1469//1469 +f 1466//1467 1467//1468 1470//1471 +f 1467//1468 1468//1466 1471//1472 +f 1477//1474 1480//1480 1476//1475 +f 1478//1477 1477//1474 1473//1473 +f 1479//1479 1478//1477 1474//1476 +f 1480//1480 1479//1479 1475//1478 +f 1481//1481 1484//1484 1480//1480 +f 1482//1482 1481//1481 1477//1474 +f 1483//1483 1482//1482 1478//1477 +f 1484//1484 1483//1483 1479//1479 +f 1484//1484 1481//1481 1488//1486 +f 1481//1481 1482//1482 1485//1485 +f 1482//1482 1483//1483 1486//1487 +f 1483//1483 1484//1484 1487//1488 +f 1489//1489 1492//1492 1488//1486 +f 1485//1485 1486//1487 1489//1489 +f 1491//1491 1490//1490 1486//1487 +f 1487//1488 1488//1486 1491//1491 +f 1492//1492 1489//1489 1496//1494 +f 1494//1495 1493//1493 1489//1489 +f 1490//1490 1491//1491 1494//1495 +f 1496//1494 1495//1496 1491//1491 +f 1496//1494 1493//1493 1500//1498 +f 1498//1499 1497//1497 1493//1493 +f 1494//1495 1495//1496 1498//1499 +f 1500//1498 1499//1500 1495//1496 +f 1501//1501 1504//1504 1500//1498 +f 1497//1497 1498//1499 1501//1501 +f 1503//1503 1502//1502 1498//1499 +f 1499//1500 1500//1498 1503//1503 +f 1504//1504 1501//1501 1508//1506 +f 1506//1507 1505//1505 1501//1501 +f 1502//1502 1503//1503 1506//1507 +f 1508//1506 1507//1508 1503//1503 +f 1509//1509 1512//1512 1508//1506 +f 1505//1505 1506//1507 1509//1509 +f 1511//1511 1510//1510 1506//1507 +f 1507//1508 1508//1506 1511//1511 +f 1512//1512 1509//1509 1516//1514 +f 1509//1509 1510//1510 1513//1513 +f 1510//1510 1511//1511 1514//1515 +f 1511//1511 1512//1512 1515//1516 +f 1521//1518 1524//1524 1520//1519 +f 1517//1517 1518//1520 1521//1518 +f 1523//1523 1522//1521 1518//1520 +f 1519//1522 1520//1519 1523//1523 +f 1524//1524 1521//1518 1528//1526 +f 1526//1527 1525//1525 1521//1518 +f 1522//1521 1523//1523 1526//1527 +f 1528//1526 1527//1528 1523//1523 +f 1528//1526 1525//1525 1532//1530 +f 1525//1525 1526//1527 1529//1529 +f 1526//1527 1527//1528 1530//1531 +f 1527//1528 1528//1526 1531//1532 +f 1532//1530 1529//1529 1536//1534 +f 1534//1535 1533//1533 1529//1529 +f 1530//1531 1531//1532 1534//1535 +f 1536//1534 1535//1536 1531//1532 +f 1537//1537 1540//1540 1536//1534 +f 1538//1538 1537//1537 1533//1533 +f 1539//1539 1538//1538 1534//1535 +f 1540//1540 1539//1539 1535//1536 +f 1541//1541 1544//1544 1540//1540 +f 1537//1537 1538//1538 1541//1541 +f 1543//1543 1542//1542 1538//1538 +f 1539//1539 1540//1540 1543//1543 +f 1545//1545 1548//1548 1544//1544 +f 1541//1541 1542//1542 1545//1545 +f 1547//1547 1546//1546 1542//1542 +f 1543//1543 1544//1544 1547//1547 +f 1548//1548 1545//1545 1552//1550 +f 1550//1551 1549//1549 1545//1545 +f 1546//1546 1547//1547 1550//1551 +f 1552//1550 1551//1552 1547//1547 +f 1553//1553 1556//1556 1552//1550 +f 1549//1549 1550//1551 1553//1553 +f 1555//1555 1554//1554 1550//1551 +f 1551//1552 1552//1550 1555//1555 +f 1556//1556 1553//1553 1560//1558 +f 1553//1553 1554//1554 1557//1557 +f 1554//1554 1555//1555 1558//1559 +f 1555//1555 1556//1556 1559//1560 +f 1564//1568 1561//1561 1568//1563 +f 1561//1561 1562//1564 1565//1562 +f 1562//1564 1563//1566 1566//1565 +f 1563//1566 1564//1568 1567//1567 +f 1569//1569 1572//1572 1568//1563 +f 1570//1570 1569//1569 1565//1562 +f 1571//1571 1570//1570 1566//1565 +f 1572//1572 1571//1571 1567//1567 +f 1572//1572 1569//1569 1576//1574 +f 1569//1569 1570//1570 1573//1573 +f 1570//1570 1571//1571 1574//1575 +f 1571//1571 1572//1572 1575//1576 +f 1577//1577 1580//1580 1576//1574 +f 1573//1573 1574//1575 1577//1577 +f 1579//1579 1578//1578 1574//1575 +f 1575//1576 1576//1574 1579//1579 +f 1581//1581 1584//1584 1580//1580 +f 1582//1582 1581//1581 1577//1577 +f 1583//1583 1582//1582 1578//1578 +f 1584//1584 1583//1583 1579//1579 +f 1584//1584 1581//1581 1588//1586 +f 1581//1581 1582//1582 1585//1585 +f 1582//1582 1583//1583 1586//1587 +f 1583//1583 1584//1584 1587//1588 +f 1588//1586 1585//1585 1592//1590 +f 1590//1591 1589//1589 1585//1585 +f 1586//1587 1587//1588 1590//1591 +f 1592//1590 1591//1592 1587//1588 +f 1593//1593 1596//1596 1592//1590 +f 1589//1589 1590//1591 1593//1593 +f 1595//1595 1594//1594 1590//1591 +f 1591//1592 1592//1590 1595//1595 +f 1596//1596 1593//1593 1600//1598 +f 1593//1593 1594//1594 1597//1597 +f 1594//1594 1595//1595 1598//1599 +f 1595//1595 1596//1596 1599//1600 +f 1600//1598 1597//1597 1604//1602 +f 1597//1597 1598//1599 1601//1601 +f 1598//1599 1599//1600 1602//1603 +f 1599//1600 1600//1598 1603//1604 +f 1608//1612 1605//1605 1612//1607 +f 1610//1609 1609//1606 1605//1605 +f 1606//1608 1607//1610 1610//1609 +f 1612//1607 1611//1611 1607//1610 +f 1612//1607 1609//1606 1616//1614 +f 1609//1606 1610//1609 1613//1613 +f 1610//1609 1611//1611 1614//1615 +f 1611//1611 1612//1607 1615//1616 +f 1616//1614 1613//1613 1620//1618 +f 1618//1619 1617//1617 1613//1613 +f 1614//1615 1615//1616 1618//1619 +f 1620//1618 1619//1620 1615//1616 +f 1621//1621 1624//1624 1620//1618 +f 1617//1617 1618//1619 1621//1621 +f 1623//1623 1622//1622 1618//1619 +f 1619//1620 1620//1618 1623//1623 +f 1625//1625 1628//1628 1624//1624 +f 1621//1621 1622//1622 1625//1625 +f 1627//1627 1626//1626 1622//1622 +f 1623//1623 1624//1624 1627//1627 +f 1629//1629 1632//1632 1628//1628 +f 1630//1630 1629//1629 1625//1625 +f 1631//1631 1630//1630 1626//1626 +f 1632//1632 1631//1631 1627//1627 +f 1632//1632 1629//1629 1636//1634 +f 1634//1635 1633//1633 1629//1629 +f 1630//1630 1631//1631 1634//1635 +f 1636//1634 1635//1636 1631//1631 +f 1637//1637 1640//1640 1636//1634 +f 1638//1638 1637//1637 1633//1633 +f 1639//1639 1638//1638 1634//1635 +f 1640//1640 1639//1639 1635//1636 +f 1640//1640 1637//1637 1644//1642 +f 1637//1637 1638//1638 1641//1641 +f 1638//1638 1639//1639 1642//1643 +f 1639//1639 1640//1640 1643//1644 +f 1644//1642 1641//1641 1648//1646 +f 1641//1641 1642//1643 1645//1645 +f 1642//1643 1643//1644 1646//1647 +f 1643//1644 1644//1642 1647//1648 +f 1652//1656 1649//1649 1656//1651 +f 1654//1653 1653//1650 1649//1649 +f 1650//1652 1651//1654 1654//1653 +f 1656//1651 1655//1655 1651//1654 +f 1657//1657 1660//1660 1656//1651 +f 1653//1650 1654//1653 1657//1657 +f 1659//1659 1658//1658 1654//1653 +f 1655//1655 1656//1651 1659//1659 +f 1660//1660 1657//1657 1664//1662 +f 1662//1663 1661//1661 1657//1657 +f 1658//1658 1659//1659 1662//1663 +f 1664//1662 1663//1664 1659//1659 +f 1665//1665 1668//1668 1664//1662 +f 1666//1666 1665//1665 1661//1661 +f 1667//1667 1666//1666 1662//1663 +f 1668//1668 1667//1667 1663//1664 +f 1669//1669 1672//1672 1668//1668 +f 1665//1665 1666//1666 1669//1669 +f 1671//1671 1670//1670 1666//1666 +f 1667//1667 1668//1668 1671//1671 +f 1672//1672 1669//1669 1676//1674 +f 1669//1669 1670//1670 1673//1673 +f 1670//1670 1671//1671 1674//1675 +f 1671//1671 1672//1672 1675//1676 +f 1677//1677 1680//1680 1676//1674 +f 1673//1673 1674//1675 1677//1677 +f 1679//1679 1678//1678 1674//1675 +f 1675//1676 1676//1674 1679//1679 +f 1681//1681 1684//1684 1680//1680 +f 1682//1682 1681//1681 1677//1677 +f 1683//1683 1682//1682 1678//1678 +f 1684//1684 1683//1683 1679//1679 +f 1684//1684 1681//1681 1688//1686 +f 1686//1687 1685//1685 1681//1681 +f 1682//1682 1683//1683 1686//1687 +f 1688//1686 1687//1688 1683//1683 +f 1688//1686 1685//1685 1692//1690 +f 1685//1685 1686//1687 1689//1689 +f 1686//1687 1687//1688 1690//1691 +f 1687//1688 1688//1686 1691//1692 +f 1696//1700 1693//1693 1700//1695 +f 1698//1697 1697//1694 1693//1693 +f 1694//1696 1695//1698 1698//1697 +f 1700//1695 1699//1699 1695//1698 +f 1701//1701 1704//1704 1700//1695 +f 1697//1694 1698//1697 1701//1701 +f 1703//1703 1702//1702 1698//1697 +f 1699//1699 1700//1695 1703//1703 +f 1704//1704 1701//1701 1708//1706 +f 1701//1701 1702//1702 1705//1705 +f 1702//1702 1703//1703 1706//1707 +f 1703//1703 1704//1704 1707//1708 +f 1709//1709 1712//1712 1708//1706 +f 1710//1710 1709//1709 1705//1705 +f 1711//1711 1710//1710 1706//1707 +f 1712//1712 1711//1711 1707//1708 +f 1712//1712 1709//1709 1716//1714 +f 1714//1715 1713//1713 1709//1709 +f 1710//1710 1711//1711 1714//1715 +f 1716//1714 1715//1716 1711//1711 +f 1717//1717 1720//1720 1716//1714 +f 1713//1713 1714//1715 1717//1717 +f 1714//1715 1715//1716 1718//1718 +f 1715//1716 1716//1714 1719//1719 +f 1720//1720 1717//1717 1724//1722 +f 1722//1723 1721//1721 1717//1717 +f 1718//1718 1719//1719 1722//1723 +f 1724//1722 1723//1724 1719//1719 +f 1725//1725 1728//1728 1724//1722 +f 1721//1721 1722//1723 1725//1725 +f 1727//1727 1726//1726 1722//1723 +f 1723//1724 1724//1722 1727//1727 +f 1728//1728 1725//1725 1732//1730 +f 1725//1725 1726//1726 1729//1729 +f 1726//1726 1727//1727 1730//1731 +f 1727//1727 1728//1728 1731//1732 +f 1732//1730 1729//1729 1736//1734 +f 1729//1729 1730//1731 1733//1733 +f 1730//1731 1731//1732 1734//1735 +f 1731//1732 1732//1730 1735//1736 +f 1741//1738 1744//1744 1740//1739 +f 1737//1737 1738//1740 1741//1738 +f 1743//1743 1742//1741 1738//1740 +f 1739//1742 1740//1739 1743//1743 +f 1744//1744 1741//1738 1748//1746 +f 1746//1747 1745//1745 1741//1738 +f 1742//1741 1743//1743 1746//1747 +f 1748//1746 1747//1748 1743//1743 +f 1749//1749 1752//1752 1748//1746 +f 1745//1745 1746//1747 1749//1749 +f 1751//1751 1750//1750 1746//1747 +f 1747//1748 1748//1746 1751//1751 +f 1753//1753 1756//1756 1752//1752 +f 1754//1754 1753//1753 1749//1749 +f 1755//1755 1754//1754 1750//1750 +f 1756//1756 1755//1755 1751//1751 +f 1756//1756 1753//1753 1760//1758 +f 1758//1759 1757//1757 1753//1753 +f 1754//1754 1755//1755 1758//1759 +f 1760//1758 1759//1760 1755//1755 +f 1760//1758 1757//1757 1764//1762 +f 1757//1757 1758//1759 1761//1761 +f 1758//1759 1759//1760 1762//1763 +f 1759//1760 1760//1758 1763//1764 +f 1765//1765 1768//1768 1764//1762 +f 1766//1766 1765//1765 1761//1761 +f 1767//1767 1766//1766 1762//1763 +f 1768//1768 1767//1767 1763//1764 +f 1769//1769 1772//1772 1768//1768 +f 1765//1765 1766//1766 1769//1769 +f 1771//1771 1770//1770 1766//1766 +f 1767//1767 1768//1768 1771//1771 +f 1773//1773 1776//1776 1772//1772 +f 1774//1774 1773//1773 1769//1769 +f 1775//1775 1774//1774 1770//1770 +f 1776//1776 1775//1775 1771//1771 +f 1776//1776 1773//1773 1780//1778 +f 1773//1773 1774//1774 1777//1777 +f 1774//1774 1775//1775 1778//1779 +f 1775//1775 1776//1776 1779//1780 +f 1784//1788 1781//1781 1788//1783 +f 1781//1781 1782//1784 1785//1782 +f 1782//1784 1783//1786 1786//1785 +f 1783//1786 1784//1788 1787//1787 +f 1789//1789 1792//1792 1788//1783 +f 1790//1790 1789//1789 1785//1782 +f 1791//1791 1790//1790 1786//1785 +f 1792//1792 1791//1791 1787//1787 +f 1793//1793 1796//1796 1792//1792 +f 1789//1789 1790//1790 1793//1793 +f 1795//1795 1794//1794 1790//1790 +f 1791//1791 1792//1792 1795//1795 +f 1796//1796 1793//1793 1800//1798 +f 1793//1793 1794//1794 1797//1797 +f 1794//1794 1795//1795 1798//1799 +f 1795//1795 1796//1796 1799//1800 +f 1801//1801 1804//1804 1800//1798 +f 1797//1797 1798//1799 1801//1801 +f 1803//1803 1802//1802 1798//1799 +f 1799//1800 1800//1798 1803//1803 +f 1805//1805 1808//1808 1804//1804 +f 1806//1806 1805//1805 1801//1801 +f 1807//1807 1806//1806 1802//1802 +f 1808//1808 1807//1807 1803//1803 +f 1808//1808 1805//1805 1812//1810 +f 1805//1805 1806//1806 1809//1809 +f 1806//1806 1807//1807 1810//1811 +f 1807//1807 1808//1808 1811//1812 +f 1813//1813 1816//1816 1812//1810 +f 1814//1814 1813//1813 1809//1809 +f 1815//1815 1814//1814 1810//1811 +f 1816//1816 1815//1815 1811//1812 +f 1816//1816 1813//1813 1820//1818 +f 1813//1813 1814//1814 1817//1817 +f 1814//1814 1815//1815 1818//1819 +f 1815//1815 1816//1816 1819//1820 +f 1820//1818 1817//1817 1824//1822 +f 1817//1817 1818//1819 1821//1821 +f 1818//1819 1819//1820 1822//1823 +f 1819//1820 1820//1818 1823//1824 +f 1829//1826 1832//1832 1828//1827 +f 1825//1825 1826//1828 1829//1826 +f 1831//1831 1830//1829 1826//1828 +f 1827//1830 1828//1827 1831//1831 +f 1832//1832 1829//1826 1836//1834 +f 1834//1835 1833//1833 1829//1826 +f 1830//1829 1831//1831 1834//1835 +f 1836//1834 1835//1836 1831//1831 +f 1836//1834 1833//1833 1840//1838 +f 1838//1839 1837//1837 1833//1833 +f 1834//1835 1835//1836 1838//1839 +f 1840//1838 1839//1840 1835//1836 +f 1841//1841 1844//1844 1840//1838 +f 1837//1837 1838//1839 1841//1841 +f 1843//1843 1842//1842 1838//1839 +f 1839//1840 1840//1838 1843//1843 +f 1844//1844 1841//1841 1848//1846 +f 1846//1847 1845//1845 1841//1841 +f 1842//1842 1843//1843 1846//1847 +f 1848//1846 1847//1848 1843//1843 +f 1848//1846 1845//1845 1852//1850 +f 1850//1851 1849//1849 1845//1845 +f 1846//1847 1847//1848 1850//1851 +f 1852//1850 1851//1852 1847//1848 +f 1852//1850 1849//1849 1856//1854 +f 1849//1849 1850//1851 1853//1853 +f 1850//1851 1851//1852 1854//1855 +f 1851//1852 1852//1850 1855//1856 +f 1861//1858 1864//1864 1860//1859 +f 1862//1861 1861//1858 1857//1857 +f 1863//1863 1862//1861 1858//1860 +f 1864//1864 1863//1863 1859//1862 +f 1864//1864 1861//1858 1868//1866 +f 1861//1858 1862//1861 1865//1865 +f 1862//1861 1863//1863 1866//1867 +f 1863//1863 1864//1864 1867//1868 +f 1868//1866 1865//1865 1872//1870 +f 1870//1871 1869//1869 1865//1865 +f 1866//1867 1867//1868 1870//1871 +f 1872//1870 1871//1872 1867//1868 +f 1872//1870 1869//1869 1876//1874 +f 1869//1869 1870//1871 1873//1873 +f 1870//1871 1871//1872 1874//1875 +f 1871//1872 1872//1870 1875//1876 +f 1880//1884 1877//1877 1884//1879 +f 1877//1877 1878//1880 1881//1878 +f 1878//1880 1879//1882 1882//1881 +f 1879//1882 1880//1884 1883//1883 +f 1884//1879 1881//1878 1888//1886 +f 1881//1878 1882//1881 1885//1885 +f 1882//1881 1883//1883 1886//1887 +f 1883//1883 1884//1879 1887//1888 +f 1892//1896 1889//1889 1896//1891 +f 1889//1889 1890//1892 1893//1890 +f 1890//1892 1891//1894 1894//1893 +f 1891//1894 1892//1896 1895//1895 +f 1900//1904 1897//1897 1904//1899 +f 1897//1897 1898//1900 1901//1898 +f 1898//1900 1899//1902 1902//1901 +f 1899//1902 1900//1904 1903//1903 +f 1905//1905 1908//1908 1904//1899 +f 1906//1906 1905//1905 1901//1898 +f 1907//1907 1906//1906 1902//1901 +f 1908//1908 1907//1907 1903//1903 +f 1909//1909 1912//1912 1908//1908 +f 1910//1910 1909//1909 1905//1905 +f 1911//1911 1910//1910 1906//1906 +f 1912//1912 1911//1911 1907//1907 +f 1913//1913 1916//1916 1912//1912 +f 1914//1914 1913//1913 1909//1909 +f 1915//1915 1914//1914 1910//1910 +f 1916//1916 1915//1915 1911//1911 +f 1917//1917 1920//1920 1916//1916 +f 1918//1918 1917//1917 1913//1913 +f 1919//1919 1918//1918 1914//1914 +f 1920//1920 1919//1919 1915//1915 +f 1920//1920 1917//1917 1924//1922 +f 1917//1917 1918//1918 1921//1921 +f 1918//1918 1919//1919 1922//1923 +f 1919//1919 1920//1920 1923//1924 +f 1929//1926 1932//1932 1928//1927 +f 1930//1929 1929//1926 1925//1925 +f 1926//1928 1927//1930 1930//1929 +f 1932//1932 1931//1931 1927//1930 +f 1933//1933 1936//1936 1932//1932 +f 1929//1926 1930//1929 1933//1933 +f 1935//1935 1934//1934 1930//1929 +f 1931//1931 1932//1932 1935//1935 +f 1936//1936 1933//1933 1940//1938 +f 1933//1933 1934//1934 1937//1937 +f 1934//1934 1935//1935 1938//1939 +f 1935//1935 1936//1936 1939//1940 +f 1944//1948 1941//1941 1948//1943 +f 1941//1941 1942//1944 1945//1942 +f 1942//1944 1943//1946 1946//1945 +f 1943//1946 1944//1948 1947//1947 +f 1953//1950 1956//1956 1952//1951 +f 1954//1953 1953//1950 1949//1949 +f 1955//1955 1954//1953 1950//1952 +f 1956//1956 1955//1955 1951//1954 +f 1956//1956 1953//1950 1960//1958 +f 1953//1950 1954//1953 1957//1957 +f 1954//1953 1955//1955 1958//1959 +f 1955//1955 1956//1956 1959//1960 +f 1960//1958 1957//1957 1964//1962 +f 1957//1957 1958//1959 1961//1961 +f 1958//1959 1959//1960 1962//1963 +f 1959//1960 1960//1958 1963//1964 +f 1964//1962 1961//1961 1968//1966 +f 1961//1961 1962//1963 1965//1965 +f 1962//1963 1963//1964 1966//1967 +f 1963//1964 1964//1962 1967//1968 +f 1969//1969 1972//1972 1968//1966 +f 1970//1970 1969//1969 1965//1965 +f 1971//1971 1970//1970 1966//1967 +f 1972//1972 1971//1971 1967//1968 +f 1972//1972 1969//1969 1976//1974 +f 1969//1969 1970//1970 1973//1973 +f 1970//1970 1971//1971 1974//1975 +f 1971//1971 1972//1972 1975//1976 +f 1976//1974 1973//1973 1980//1978 +f 1973//1973 1974//1975 1977//1977 +f 1974//1975 1975//1976 1978//1979 +f 1975//1976 1976//1974 1979//1980 +f 1984//1988 1981//1981 1988//1983 +f 1981//1981 1982//1984 1985//1982 +f 1982//1984 1983//1986 1986//1985 +f 1983//1986 1984//1988 1987//1987 +f 1989//1989 1992//1992 1988//1983 +f 1990//1990 1989//1989 1985//1982 +f 1991//1991 1990//1990 1986//1985 +f 1992//1992 1991//1991 1987//1987 +f 1993//1993 1996//1996 1992//1992 +f 1989//1989 1990//1990 1993//1993 +f 1995//1995 1994//1994 1990//1990 +f 1991//1991 1992//1992 1995//1995 +f 1996//1996 1993//1993 2000//1998 +f 1993//1993 1994//1994 1997//1997 +f 1994//1994 1995//1995 1998//1999 +f 1995//1995 1996//1996 1999//2000 +f 2004//2008 2001//2001 2008//2003 +f 2001//2001 2002//2004 2005//2002 +f 2002//2004 2003//2006 2006//2005 +f 2003//2006 2004//2008 2007//2007 +f 2008//2003 2005//2002 2012//2010 +f 2005//2002 2006//2005 2009//2009 +f 2006//2005 2007//2007 2010//2011 +f 2007//2007 2008//2003 2011//2012 +f 2016//2020 2013//2013 2020//2015 +f 2013//2013 2014//2016 2017//2014 +f 2014//2016 2015//2018 2018//2017 +f 2015//2018 2016//2020 2019//2019 +f 2024//2028 2021//2021 2028//2023 +f 2026//2025 2025//2022 2021//2021 +f 2022//2024 2023//2026 2026//2025 +f 2028//2023 2027//2027 2023//2026 +f 2029//2029 2032//2032 2028//2023 +f 2025//2022 2026//2025 2029//2029 +f 2031//2031 2030//2030 2026//2025 +f 2027//2027 2028//2023 2031//2031 +f 2033//2033 2036//2036 2032//2032 +f 2029//2029 2030//2030 2033//2033 +f 2035//2035 2034//2034 2030//2030 +f 2031//2031 2032//2032 2035//2035 +f 2036//2036 2033//2033 2040//2038 +f 2038//2039 2037//2037 2033//2033 +f 2034//2034 2035//2035 2038//2039 +f 2040//2038 2039//2040 2035//2035 +f 2040//2038 2037//2037 2044//2042 +f 2042//2043 2041//2041 2037//2037 +f 2038//2039 2039//2040 2042//2043 +f 2044//2042 2043//2044 2039//2040 +f 2044//2042 2041//2041 2048//2046 +f 2041//2041 2042//2043 2045//2045 +f 2042//2043 2043//2044 2046//2047 +f 2043//2044 2044//2042 2047//2048 +f 2052//2056 2049//2049 2056//2051 +f 2049//2049 2050//2052 2053//2050 +f 2050//2052 2051//2054 2054//2053 +f 2051//2054 2052//2056 2055//2055 +f 2057//2057 2060//2060 2056//2051 +f 2058//2058 2057//2057 2053//2050 +f 2059//2059 2058//2058 2054//2053 +f 2060//2060 2059//2059 2055//2055 +f 2060//2060 2057//2057 2064//2062 +f 2057//2057 2058//2058 2061//2061 +f 2058//2058 2059//2059 2062//2063 +f 2059//2059 2060//2060 2063//2064 +f 2068//2072 2065//2065 2072//2067 +f 2065//2065 2066//2068 2069//2066 +f 2066//2068 2067//2070 2070//2069 +f 2067//2070 2068//2072 2071//2071 +f 2076//2080 2073//2073 2080//2075 +f 2073//2073 2074//2076 2077//2074 +f 2074//2076 2075//2078 2078//2077 +f 2075//2078 2076//2080 2079//2079 +f 2081//2081 2084//2084 2080//2075 +f 2082//2082 2081//2081 2077//2074 +f 2083//2083 2082//2082 2078//2077 +f 2084//2084 2083//2083 2079//2079 +f 2084//2084 2081//2081 2088//2086 +f 2086//2087 2085//2085 2081//2081 +f 2082//2082 2083//2083 2086//2087 +f 2088//2086 2087//2088 2083//2083 +f 2089//2089 2092//2092 2088//2086 +f 2085//2085 2086//2087 2089//2089 +f 2091//2091 2090//2090 2086//2087 +f 2087//2088 2088//2086 2091//2091 +f 2093//2093 2096//2096 2092//2092 +f 2089//2089 2090//2090 2093//2093 +f 2095//2095 2094//2094 2090//2090 +f 2091//2091 2092//2092 2095//2095 +f 2096//2096 2093//2093 2100//2098 +f 2098//2099 2097//2097 2093//2093 +f 2094//2094 2095//2095 2098//2099 +f 2100//2098 2099//2100 2095//2095 +f 2100//2098 2097//2097 2104//2102 +f 2097//2097 2098//2099 2101//2101 +f 2098//2099 2099//2100 2102//2103 +f 2099//2100 2100//2098 2103//2104 +f 2108//2112 2105//2105 2112//2107 +f 2105//2105 2106//2108 2109//2106 +f 2106//2108 2107//2110 2110//2109 +f 2107//2110 2108//2112 2111//2111 +f 2113//2113 2116//2116 2112//2107 +f 2114//2114 2113//2113 2109//2106 +f 2115//2115 2114//2114 2110//2109 +f 2116//2116 2115//2115 2111//2111 +f 2117//2117 2120//2120 2116//2116 +f 2118//2118 2117//2117 2113//2113 +f 2119//2119 2118//2118 2114//2114 +f 2120//2120 2119//2119 2115//2115 +f 2120//2120 2117//2117 2124//2122 +f 2117//2117 2118//2118 2121//2121 +f 2118//2118 2119//2119 2122//2123 +f 2119//2119 2120//2120 2123//2124 +f 2129//2126 2132//2132 2128//2127 +f 2125//2125 2126//2128 2129//2126 +f 2131//2131 2130//2129 2126//2128 +f 2127//2130 2128//2127 2131//2131 +f 2132//2132 2129//2126 2136//2134 +f 2129//2126 2130//2129 2133//2133 +f 2130//2129 2131//2131 2134//2135 +f 2131//2131 2132//2132 2135//2136 +f 2140//2144 2137//2137 2144//2139 +f 2137//2137 2138//2140 2141//2138 +f 2138//2140 2139//2142 2142//2141 +f 2139//2142 2140//2144 2143//2143 +f 2149//2146 2152//2152 2148//2147 +f 2150//2149 2149//2146 2145//2145 +f 2151//2151 2150//2149 2146//2148 +f 2152//2152 2151//2151 2147//2150 +f 2153//2153 2156//2156 2152//2152 +f 2154//2154 2153//2153 2149//2146 +f 2155//2155 2154//2154 2150//2149 +f 2156//2156 2155//2155 2151//2151 +f 2156//2156 2153//2153 2160//2158 +f 2153//2153 2154//2154 2157//2157 +f 2154//2154 2155//2155 2158//2159 +f 2155//2155 2156//2156 2159//2160 +f 2161//2161 2164//2164 2160//2158 +f 2162//2162 2161//2161 2157//2157 +f 2163//2163 2162//2162 2158//2159 +f 2164//2164 2163//2163 2159//2160 +f 2164//2164 2161//2161 2168//2166 +f 2161//2161 2162//2162 2165//2165 +f 2162//2162 2163//2163 2166//2167 +f 2163//2163 2164//2164 2167//2168 +f 2168//2166 2165//2165 2172//2170 +f 2165//2165 2166//2167 2169//2169 +f 2166//2167 2167//2168 2170//2171 +f 2167//2168 2168//2166 2171//2172 +f 2176//2180 2173//2173 2180//2175 +f 2173//2173 2174//2176 2177//2174 +f 2174//2176 2175//2178 2178//2177 +f 2175//2178 2176//2180 2179//2179 +f 2181//2181 2184//2184 2180//2175 +f 2182//2182 2181//2181 2177//2174 +f 2183//2183 2182//2182 2178//2177 +f 2184//2184 2183//2183 2179//2179 +f 2184//2184 2181//2181 2188//2186 +f 2181//2181 2182//2182 2185//2185 +f 2182//2182 2183//2183 2186//2187 +f 2183//2183 2184//2184 2187//2188 +f 2192//2196 2189//2189 2196//2191 +f 2189//2189 2190//2192 2193//2190 +f 2190//2192 2191//2194 2194//2193 +f 2191//2194 2192//2196 2195//2195 +f 2201//2198 2204//2204 2200//2199 +f 2202//2201 2201//2198 2197//2197 +f 2203//2203 2202//2201 2198//2200 +f 2204//2204 2203//2203 2199//2202 +f 2204//2204 2201//2198 2208//2206 +f 2201//2198 2202//2201 2205//2205 +f 2202//2201 2203//2203 2206//2207 +f 2203//2203 2204//2204 2207//2208 +f 2209//2209 2212//2212 2208//2206 +f 2210//2210 2209//2209 2205//2205 +f 2211//2211 2210//2210 2206//2207 +f 2212//2212 2211//2211 2207//2208 +f 2213//2213 2216//2216 2212//2212 +f 2214//2214 2213//2213 2209//2209 +f 2215//2215 2214//2214 2210//2210 +f 2216//2216 2215//2215 2211//2211 +f 2216//2216 2213//2213 2220//2218 +f 2213//2213 2214//2214 2217//2217 +f 2214//2214 2215//2215 2218//2219 +f 2215//2215 2216//2216 2219//2220 +f 2221//2221 2224//2224 2220//2218 +f 2222//2222 2221//2221 2217//2217 +f 2223//2223 2222//2222 2218//2219 +f 2224//2224 2223//2223 2219//2220 +f 2224//2224 2221//2221 2228//2226 +f 2221//2221 2222//2222 2225//2225 +f 2222//2222 2223//2223 2226//2227 +f 2223//2223 2224//2224 2227//2228 +f 2232//2236 2229//2229 2236//2231 +f 2229//2229 2230//2232 2233//2230 +f 2230//2232 2231//2234 2234//2233 +f 2231//2234 2232//2236 2235//2235 +f 2237//2237 2240//2240 2236//2231 +f 2238//2238 2237//2237 2233//2230 +f 2239//2239 2238//2238 2234//2233 +f 2240//2240 2239//2239 2235//2235 +f 2241//2241 2244//2244 2240//2240 +f 2237//2237 2238//2238 2241//2241 +f 2243//2243 2242//2242 2238//2238 +f 2239//2239 2240//2240 2243//2243 +f 2244//2244 2241//2241 2248//2246 +f 2241//2241 2242//2242 2245//2245 +f 2242//2242 2243//2243 2246//2247 +f 2243//2243 2244//2244 2247//2248 +f 2253//2250 2256//2256 2252//2251 +f 2254//2253 2253//2250 2249//2249 +f 2255//2255 2254//2253 2250//2252 +f 2256//2256 2255//2255 2251//2254 +f 2256//2256 2253//2250 2260//2258 +f 2253//2250 2254//2253 2257//2257 +f 2254//2253 2255//2255 2258//2259 +f 2255//2255 2256//2256 2259//2260 +f 2264//2268 2261//2261 2268//2263 +f 2261//2261 2262//2264 2265//2262 +f 2262//2264 2263//2266 2266//2265 +f 2263//2266 2264//2268 2267//2267 +f 2272//2276 2269//2269 2276//2271 +f 2269//2269 2270//2272 2273//2270 +f 2270//2272 2271//2274 2274//2273 +f 2271//2274 2272//2276 2275//2275 +f 2276//2271 2273//2270 2280//2278 +f 2273//2270 2274//2273 2277//2277 +f 2274//2273 2275//2275 2278//2279 +f 2275//2275 2276//2271 2279//2280 +f 2281//2281 2284//2284 2280//2278 +f 2282//2282 2281//2281 2277//2277 +f 2283//2283 2282//2282 2278//2279 +f 2284//2284 2283//2283 2279//2280 +f 2285//2285 2288//2288 2284//2284 +f 2286//2286 2285//2285 2281//2281 +f 2287//2287 2286//2286 2282//2282 +f 2288//2288 2287//2287 2283//2283 +f 2289//2289 2292//2292 2288//2288 +f 2290//2290 2289//2289 2285//2285 +f 2291//2291 2290//2290 2286//2286 +f 2292//2292 2291//2291 2287//2287 +f 2292//2292 2289//2289 2296//2294 +f 2289//2289 2290//2290 2293//2293 +f 2290//2290 2291//2291 2294//2295 +f 2291//2291 2292//2292 2295//2296 +f 2300//2304 2297//2297 2304//2299 +f 2297//2297 2298//2300 2301//2298 +f 2298//2300 2299//2302 2302//2301 +f 2299//2302 2300//2304 2303//2303 +f 2304//2299 2301//2298 2308//2306 +f 2301//2298 2302//2301 2305//2305 +f 2302//2301 2303//2303 2306//2307 +f 2303//2303 2304//2299 2307//2308 +f 2308//2306 2305//2305 2312//2310 +f 2305//2305 2306//2307 2309//2309 +f 2306//2307 2307//2308 2310//2311 +f 2307//2308 2308//2306 2311//2312 +f 2316//2320 2313//2313 2320//2315 +f 2313//2313 2314//2316 2317//2314 +f 2314//2316 2315//2318 2318//2317 +f 2315//2318 2316//2320 2319//2319 +f 2324//2328 2321//2321 2328//2323 +f 2321//2321 2322//2324 2325//2322 +f 2322//2324 2323//2326 2326//2325 +f 2323//2326 2324//2328 2327//2327 +f 2329//2329 2332//2332 2328//2323 +f 2330//2330 2329//2329 2325//2322 +f 2331//2331 2330//2330 2326//2325 +f 2332//2332 2331//2331 2327//2327 +f 2333//2333 2336//2336 2332//2332 +f 2334//2334 2333//2333 2329//2329 +f 2335//2335 2334//2334 2330//2330 +f 2336//2336 2335//2335 2331//2331 +f 2336//2336 2333//2333 2340//2338 +f 2333//2333 2334//2334 2337//2337 +f 2334//2334 2335//2335 2338//2339 +f 2335//2335 2336//2336 2339//2340 +f 2341//2341 2344//2344 2340//2338 +f 2342//2342 2341//2341 2337//2337 +f 2343//2343 2342//2342 2338//2339 +f 2344//2344 2343//2343 2339//2340 +f 2344//2344 2341//2341 2348//2346 +f 2341//2341 2342//2342 2345//2345 +f 2342//2342 2343//2343 2346//2347 +f 2348//2346 2347//2348 2343//2343 +f 2348//2346 2345//2345 2352//2350 +f 2345//2345 2346//2347 2349//2349 +f 2346//2347 2347//2348 2350//2351 +f 2347//2348 2348//2346 2351//2352 +f 2357//2354 2360//2360 2356//2355 +f 2358//2357 2357//2354 2353//2353 +f 2359//2359 2358//2357 2354//2356 +f 2360//2360 2359//2359 2355//2358 +f 2361//2361 2364//2364 2360//2360 +f 2362//2362 2361//2361 2357//2354 +f 2363//2363 2362//2362 2358//2357 +f 2364//2364 2363//2363 2359//2359 +f 2365//2365 2368//2368 2364//2364 +f 2361//2361 2362//2362 2365//2365 +f 2367//2367 2366//2366 2362//2362 +f 2363//2363 2364//2364 2367//2367 +f 2368//2368 2365//2365 2372//2370 +f 2365//2365 2366//2366 2369//2369 +f 2366//2366 2367//2367 2370//2371 +f 2367//2367 2368//2368 2371//2372 +f 2376//2380 2373//2373 2380//2375 +f 2378//2377 2377//2374 2373//2373 +f 2374//2376 2375//2378 2378//2377 +f 2380//2375 2379//2379 2375//2378 +f 2380//2375 2377//2374 2384//2382 +f 2377//2374 2378//2377 2381//2381 +f 2378//2377 2379//2379 2382//2383 +f 2379//2379 2380//2375 2383//2384 +f 2388//2392 2385//2385 2392//2387 +f 2385//2385 2386//2388 2389//2386 +f 2386//2388 2387//2390 2390//2389 +f 2387//2390 2388//2392 2391//2391 +f 2397//2394 2400//2400 2396//2395 +f 2398//2397 2397//2394 2393//2393 +f 2399//2399 2398//2397 2394//2396 +f 2400//2400 2399//2399 2395//2398 +f 2400//2400 2397//2394 2404//2402 +f 2397//2394 2398//2397 2401//2401 +f 2398//2397 2399//2399 2402//2403 +f 2399//2399 2400//2400 2403//2404 +f 2405//2405 2408//2408 2404//2402 +f 2406//2406 2405//2405 2401//2401 +f 2407//2407 2406//2406 2402//2403 +f 2408//2408 2407//2407 2403//2404 +f 2408//2408 2405//2405 2412//2410 +f 2405//2405 2406//2406 2409//2409 +f 2406//2406 2407//2407 2410//2411 +f 2407//2407 2408//2408 2411//2412 +f 2413//2413 2416//2416 2412//2410 +f 2414//2414 2413//2413 2409//2409 +f 2415//2415 2414//2414 2410//2411 +f 2416//2416 2415//2415 2411//2412 +f 2416//2416 2413//2413 2420//2418 +f 2413//2413 2414//2414 2417//2417 +f 2414//2414 2415//2415 2418//2419 +f 2415//2415 2416//2416 2419//2420 +f 2424//2428 2421//2421 2428//2423 +f 2421//2421 2422//2424 2425//2422 +f 2422//2424 2423//2426 2426//2425 +f 2423//2426 2424//2428 2427//2427 +f 2429//2429 2432//2432 2428//2423 +f 2425//2422 2426//2425 2429//2429 +f 2431//2431 2430//2430 2426//2425 +f 2427//2427 2428//2423 2431//2431 +f 2432//2432 2429//2429 2436//2434 +f 2429//2429 2430//2430 2433//2433 +f 2430//2430 2431//2431 2434//2435 +f 2431//2431 2432//2432 2435//2436 +f 2440//2444 2437//2437 2444//2439 +f 2437//2437 2438//2440 2441//2438 +f 2438//2440 2439//2442 2442//2441 +f 2439//2442 2440//2444 2443//2443 +f 2449//2446 2452//2452 2448//2447 +f 2450//2449 2449//2446 2445//2445 +f 2451//2451 2450//2449 2446//2448 +f 2452//2452 2451//2451 2447//2450 +f 2452//2452 2449//2446 2456//2454 +f 2449//2446 2450//2449 2453//2453 +f 2450//2449 2451//2451 2454//2455 +f 2451//2451 2452//2452 2455//2456 +f 2457//2457 2460//2460 2456//2454 +f 2458//2458 2457//2457 2453//2453 +f 2459//2459 2458//2458 2454//2455 +f 2460//2460 2459//2459 2455//2456 +f 2460//2460 2457//2457 2464//2462 +f 2457//2457 2458//2458 2461//2461 +f 2458//2458 2459//2459 2462//2463 +f 2459//2459 2460//2460 2463//2464 +f 2465//2465 2468//2468 2464//2462 +f 2466//2466 2465//2465 2461//2461 +f 2467//2467 2466//2466 2462//2463 +f 2468//2468 2467//2467 2463//2464 +f 2468//2468 2465//2465 2472//2470 +f 2465//2465 2466//2466 2469//2469 +f 2466//2466 2467//2467 2470//2471 +f 2467//2467 2468//2468 2471//2472 +f 2472//2470 2469//2469 2476//2474 +f 2469//2469 2470//2471 2473//2473 +f 2470//2471 2471//2472 2474//2475 +f 2471//2472 2472//2470 2475//2476 +f 2480//2484 2477//2477 2484//2479 +f 2477//2477 2478//2480 2481//2478 +f 2478//2480 2479//2482 2482//2481 +f 2479//2482 2480//2484 2483//2483 +f 2485//2485 2488//2488 2484//2479 +f 2486//2486 2485//2485 2481//2478 +f 2487//2487 2486//2486 2482//2481 +f 2488//2488 2487//2487 2483//2483 +f 2488//2488 2485//2485 2492//2490 +f 2490//2491 2489//2489 2485//2485 +f 2486//2486 2487//2487 2490//2491 +f 2492//2490 2491//2492 2487//2487 +f 2492//2490 2489//2489 2496//2494 +f 2489//2489 2490//2491 2493//2493 +f 2490//2491 2491//2492 2494//2495 +f 2491//2492 2492//2490 2495//2496 +f 2500//2504 2497//2497 2504//2499 +f 2497//2497 2498//2500 2501//2498 +f 2498//2500 2499//2502 2502//2501 +f 2499//2502 2500//2504 2503//2503 +f 2504//2499 2501//2498 2508//2506 +f 2501//2498 2502//2501 2505//2505 +f 2502//2501 2503//2503 2506//2507 +f 2503//2503 2504//2499 2507//2508 +f 2512//2516 2509//2509 2516//2511 +f 2509//2509 2510//2512 2513//2510 +f 2510//2512 2511//2514 2514//2513 +f 2511//2514 2512//2516 2515//2515 +f 2520//2524 2517//2517 2524//2519 +f 2517//2517 2518//2520 2521//2518 +f 2518//2520 2519//2522 2522//2521 +f 2519//2522 2520//2524 2523//2523 +f 2524//2519 2521//2518 2528//2526 +f 2521//2518 2522//2521 2525//2525 +f 2522//2521 2523//2523 2526//2527 +f 2523//2523 2524//2519 2527//2528 +f 2529//2529 2532//2532 2528//2526 +f 2530//2530 2529//2529 2525//2525 +f 2531//2531 2530//2530 2526//2527 +f 2532//2532 2531//2531 2527//2528 +f 2532//2532 2529//2529 2536//2534 +f 2529//2529 2530//2530 2533//2533 +f 2530//2530 2531//2531 2534//2535 +f 2531//2531 2532//2532 2535//2536 +f 2537//2537 2540//2540 2536//2534 +f 2538//2538 2537//2537 2533//2533 +f 2539//2539 2538//2538 2534//2535 +f 2540//2540 2539//2539 2535//2536 +f 2540//2540 2537//2537 2544//2542 +f 2537//2537 2538//2538 2541//2541 +f 2538//2538 2539//2539 2542//2543 +f 2539//2539 2540//2540 2543//2544 +f 2549//2546 2552//2552 2548//2547 +f 2550//2549 2549//2546 2545//2545 +f 2551//2551 2550//2549 2546//2548 +f 2552//2552 2551//2551 2547//2550 +f 2552//2552 2549//2546 2556//2554 +f 2549//2546 2550//2549 2553//2553 +f 2550//2549 2551//2551 2554//2555 +f 2556//2554 2555//2556 2551//2551 +f 2556//2554 2553//2553 2560//2558 +f 2553//2553 2554//2555 2557//2557 +f 2554//2555 2555//2556 2558//2559 +f 2555//2556 2556//2554 2559//2560 +f 2564//2568 2561//2561 2568//2563 +f 2561//2561 2562//2564 2565//2562 +f 2562//2564 2563//2566 2566//2565 +f 2563//2566 2564//2568 2567//2567 +f 2572//2576 2569//2569 2576//2571 +f 2569//2569 2570//2572 2573//2570 +f 2570//2572 2571//2574 2574//2573 +f 2571//2574 2572//2576 2575//2575 +f 2577//2577 2580//2580 2576//2571 +f 2578//2578 2577//2577 2573//2570 +f 2579//2579 2578//2578 2574//2573 +f 2580//2580 2579//2579 2575//2575 +f 2580//2580 2577//2577 2584//2582 +f 2577//2577 2578//2578 2581//2581 +f 2578//2578 2579//2579 2582//2583 +f 2579//2579 2580//2580 2583//2584 +f 2585//2585 2588//2588 2584//2582 +f 2586//2586 2585//2585 2581//2581 +f 2587//2587 2586//2586 2582//2583 +f 2588//2588 2587//2587 2583//2584 +f 2588//2588 2585//2585 2592//2590 +f 2585//2585 2586//2586 2589//2589 +f 2586//2586 2587//2587 2590//2591 +f 2587//2587 2588//2588 2591//2592 +f 2592//2590 2589//2589 2596//2594 +f 2589//2589 2590//2591 2593//2593 +f 2590//2591 2591//2592 2594//2595 +f 2591//2592 2592//2590 2595//2596 +f 2596//2594 2593//2593 2600//2598 +f 2593//2593 2594//2595 2597//2597 +f 2594//2595 2595//2596 2598//2599 +f 2595//2596 2596//2594 2599//2600 +f 2605//2602 2608//2608 2604//2603 +f 2606//2605 2605//2602 2601//2601 +f 2607//2607 2606//2605 2602//2604 +f 2608//2608 2607//2607 2603//2606 +f 2609//2609 2612//2612 2608//2608 +f 2610//2610 2609//2609 2605//2602 +f 2611//2611 2610//2610 2606//2605 +f 2612//2612 2611//2611 2607//2607 +f 2613//2613 2616//2616 2612//2612 +f 2609//2609 2610//2610 2613//2613 +f 2615//2615 2614//2614 2610//2610 +f 2611//2611 2612//2612 2615//2615 +f 2616//2616 2613//2613 2620//2618 +f 2613//2613 2614//2614 2617//2617 +f 2614//2614 2615//2615 2618//2619 +f 2615//2615 2616//2616 2619//2620 +f 2624//2628 2621//2621 2628//2623 +f 2626//2625 2625//2622 2621//2621 +f 2622//2624 2623//2626 2626//2625 +f 2628//2623 2627//2627 2623//2626 +f 2628//2623 2625//2622 2632//2630 +f 2625//2622 2626//2625 2629//2629 +f 2626//2625 2627//2627 2630//2631 +f 2627//2627 2628//2623 2631//2632 +f 2636//2640 2633//2633 2640//2635 +f 2633//2633 2634//2636 2637//2634 +f 2634//2636 2635//2638 2638//2637 +f 2635//2638 2636//2640 2639//2639 +f 2645//2642 2648//2648 2644//2643 +f 2646//2645 2645//2642 2641//2641 +f 2642//2644 2643//2646 2646//2645 +f 2648//2648 2647//2647 2643//2646 +f 2649//2649 2652//2652 2648//2648 +f 2645//2642 2646//2645 2649//2649 +f 2651//2651 2650//2650 2646//2645 +f 2647//2647 2648//2648 2651//2651 +f 2653//2653 2656//2656 2652//2652 +f 2649//2649 2650//2650 2653//2653 +f 2655//2655 2654//2654 2650//2650 +f 2651//2651 2652//2652 2655//2655 +f 2657//2657 2660//2660 2656//2656 +f 2653//2653 2654//2654 2657//2657 +f 2659//2659 2658//2658 2654//2654 +f 2655//2655 2656//2656 2659//2659 +f 2660//2660 2657//2657 2664//2662 +f 2662//2663 2661//2661 2657//2657 +f 2658//2658 2659//2659 2662//2663 +f 2664//2662 2663//2664 2659//2659 +f 2664//2662 2661//2661 2668//2666 +f 2661//2661 2662//2663 2665//2665 +f 2662//2663 2663//2664 2666//2667 +f 2663//2664 2664//2662 2667//2668 +f 2673//2670 2676//2676 2672//2671 +f 2669//2669 2670//2672 2673//2670 +f 2675//2675 2674//2673 2670//2672 +f 2671//2674 2672//2671 2675//2675 +f 2677//2677 2680//2680 2676//2676 +f 2673//2670 2674//2673 2677//2677 +f 2679//2679 2678//2678 2674//2673 +f 2675//2675 2676//2676 2679//2679 +f 2680//2680 2677//2677 2684//2682 +f 2677//2677 2678//2678 2681//2681 +f 2678//2678 2679//2679 2682//2683 +f 2679//2679 2680//2680 2683//2684 +f 2688//2692 2685//2685 2692//2687 +f 2685//2685 2686//2688 2689//2686 +f 2686//2688 2687//2690 2690//2689 +f 2687//2690 2688//2692 2691//2691 +f 2697//2694 2700//2700 2696//2695 +f 2698//2697 2697//2694 2693//2693 +f 2699//2699 2698//2697 2694//2696 +f 2700//2700 2699//2699 2695//2698 +f 2700//2700 2697//2694 2704//2702 +f 2697//2694 2698//2697 2701//2701 +f 2698//2697 2699//2699 2702//2703 +f 2699//2699 2700//2700 2703//2704 +f 2705//2705 2708//2708 2704//2702 +f 2706//2706 2705//2705 2701//2701 +f 2707//2707 2706//2706 2702//2703 +f 2708//2708 2707//2707 2703//2704 +f 2708//2708 2705//2705 2712//2710 +f 2705//2705 2706//2706 2709//2709 +f 2706//2706 2707//2707 2710//2711 +f 2707//2707 2708//2708 2711//2712 +f 2713//2713 2716//2716 2712//2710 +f 2714//2714 2713//2713 2709//2709 +f 2715//2715 2714//2714 2710//2711 +f 2716//2716 2715//2715 2711//2712 +f 2716//2716 2713//2713 2720//2718 +f 2713//2713 2714//2714 2717//2717 +f 2714//2714 2715//2715 2718//2719 +f 2715//2715 2716//2716 2719//2720 +f 2720//2718 2717//2717 2724//2722 +f 2717//2717 2718//2719 2721//2721 +f 2718//2719 2719//2720 2722//2723 +f 2719//2720 2720//2718 2723//2724 +f 2728//2732 2725//2725 2732//2727 +f 2730//2729 2729//2726 2725//2725 +f 2726//2728 2727//2730 2730//2729 +f 2732//2727 2731//2731 2727//2730 +f 2733//2733 2736//2736 2732//2727 +f 2729//2726 2730//2729 2733//2733 +f 2735//2735 2734//2734 2730//2729 +f 2731//2731 2732//2727 2735//2735 +f 2736//2736 2733//2733 2740//2738 +f 2733//2733 2734//2734 2737//2737 +f 2734//2734 2735//2735 2738//2739 +f 2735//2735 2736//2736 2739//2740 +f 2740//2738 2737//2737 2744//2742 +f 2737//2737 2738//2739 2741//2741 +f 2738//2739 2739//2740 2742//2743 +f 2739//2740 2740//2738 2743//2744 +f 2749//2746 2752//2752 2748//2747 +f 2750//2749 2749//2746 2745//2745 +f 2751//2751 2750//2749 2746//2748 +f 2752//2752 2751//2751 2747//2750 +f 2752//2752 2749//2746 2756//2754 +f 2749//2746 2750//2749 2753//2753 +f 2750//2749 2751//2751 2754//2755 +f 2751//2751 2752//2752 2755//2756 +f 2760//2764 2757//2757 2764//2759 +f 2757//2757 2758//2760 2761//2758 +f 2758//2760 2759//2762 2762//2761 +f 2759//2762 2760//2764 2763//2763 +f 2768//2772 2765//2765 2772//2767 +f 2765//2765 2766//2768 2769//2766 +f 2766//2768 2767//2770 2770//2769 +f 2767//2770 2768//2772 2771//2771 +f 2773//2773 2776//2776 2772//2767 +f 2774//2774 2773//2773 2769//2766 +f 2775//2775 2774//2774 2770//2769 +f 2776//2776 2775//2775 2771//2771 +f 2776//2776 2773//2773 2780//2778 +f 2773//2773 2774//2774 2777//2777 +f 2774//2774 2775//2775 2778//2779 +f 2775//2775 2776//2776 2779//2780 +f 2781//2781 2784//2784 2780//2778 +f 2782//2782 2781//2781 2777//2777 +f 2783//2783 2782//2782 2778//2779 +f 2784//2784 2783//2783 2779//2780 +f 2784//2784 2781//2781 2788//2786 +f 2781//2781 2782//2782 2785//2785 +f 2782//2782 2783//2783 2786//2787 +f 2783//2783 2784//2784 2787//2788 +f 2788//2786 2785//2785 2792//2790 +f 2785//2785 2786//2787 2789//2789 +f 2786//2787 2787//2788 2790//2791 +f 2787//2788 2788//2786 2791//2792 +f 2797//2794 2800//2800 2796//2795 +f 2793//2793 2794//2796 2797//2794 +f 2799//2799 2798//2797 2794//2796 +f 2795//2798 2796//2795 2799//2799 +f 2800//2800 2797//2794 2804//2802 +f 2802//2803 2801//2801 2797//2794 +f 2798//2797 2799//2799 2802//2803 +f 2804//2802 2803//2804 2799//2799 +f 2804//2802 2801//2801 2808//2806 +f 2801//2801 2802//2803 2805//2805 +f 2802//2803 2803//2804 2806//2807 +f 2803//2804 2804//2802 2807//2808 +f 2812//2816 2809//2809 2816//2811 +f 2809//2809 2810//2812 2813//2810 +f 2810//2812 2811//2814 2814//2813 +f 2811//2814 2812//2816 2815//2815 +f 2821//2818 2824//2824 2820//2819 +f 2817//2817 2818//2820 2821//2818 +f 2823//2823 2822//2821 2818//2820 +f 2819//2822 2820//2819 2823//2823 +f 2824//2824 2821//2818 2828//2826 +f 2826//2827 2825//2825 2821//2818 +f 2822//2821 2823//2823 2826//2827 +f 2828//2826 2827//2828 2823//2823 +f 2828//2826 2825//2825 2832//2830 +f 2830//2831 2829//2829 2825//2825 +f 2826//2827 2827//2828 2830//2831 +f 2832//2830 2831//2832 2827//2828 +f 2833//2833 2836//2836 2832//2830 +f 2829//2829 2830//2831 2833//2833 +f 2835//2835 2834//2834 2830//2831 +f 2831//2832 2832//2830 2835//2835 +f 2836//2836 2833//2833 2840//2838 +f 2838//2839 2837//2837 2833//2833 +f 2834//2834 2835//2835 2838//2839 +f 2840//2838 2839//2840 2835//2835 +f 2841//2841 2844//2844 2840//2838 +f 2837//2837 2838//2839 2841//2841 +f 2843//2843 2842//2842 2838//2839 +f 2839//2840 2840//2838 2843//2843 +f 2844//2844 2841//2841 2848//2846 +f 2841//2841 2842//2842 2845//2845 +f 2842//2842 2843//2843 2846//2847 +f 2843//2843 2844//2844 2847//2848 +f 2853//2850 2856//2856 2852//2851 +f 2854//2853 2853//2850 2849//2849 +f 2855//2855 2854//2853 2850//2852 +f 2856//2856 2855//2855 2851//2854 +f 2856//2856 2853//2850 2860//2858 +f 2853//2850 2854//2853 2857//2857 +f 2854//2853 2855//2855 2858//2859 +f 2855//2855 2856//2856 2859//2860 +f 2860//2858 2857//2857 2864//2862 +f 2862//2863 2861//2861 2857//2857 +f 2858//2859 2859//2860 2862//2863 +f 2864//2862 2863//2864 2859//2860 +f 2864//2862 2861//2861 2868//2866 +f 2861//2861 2862//2863 2865//2865 +f 2862//2863 2863//2864 2866//2867 +f 2863//2864 2864//2862 2867//2868 +f 2873//2870 2876//2876 2872//2871 +f 2869//2869 2870//2872 2873//2870 +f 2875//2875 2874//2873 2870//2872 +f 2871//2874 2872//2871 2875//2875 +f 2876//2876 2873//2870 2880//2878 +f 2873//2870 2874//2873 2877//2877 +f 2874//2873 2875//2875 2878//2879 +f 2875//2875 2876//2876 2879//2880 +f 2884//2888 2881//2881 2888//2883 +f 2881//2881 2882//2884 2885//2882 +f 2882//2884 2883//2886 2886//2885 +f 2883//2886 2884//2888 2887//2887 +f 2893//2890 2896//2896 2892//2891 +f 2894//2893 2893//2890 2889//2889 +f 2895//2895 2894//2893 2890//2892 +f 2896//2896 2895//2895 2891//2894 +f 2896//2896 2893//2890 2900//2898 +f 2893//2890 2894//2893 2897//2897 +f 2894//2893 2895//2895 2898//2899 +f 2895//2895 2896//2896 2899//2900 +f 2901//2901 2904//2904 2900//2898 +f 2902//2902 2901//2901 2897//2897 +f 2903//2903 2902//2902 2898//2899 +f 2904//2904 2903//2903 2899//2900 +f 2904//2904 2901//2901 2908//2906 +f 2901//2901 2902//2902 2905//2905 +f 2902//2902 2903//2903 2906//2907 +f 2903//2903 2904//2904 2907//2908 +f 2909//2909 2912//2912 2908//2906 +f 2910//2910 2909//2909 2905//2905 +f 2911//2911 2910//2910 2906//2907 +f 2912//2912 2911//2911 2907//2908 +f 2912//2912 2909//2909 2916//2914 +f 2909//2909 2910//2910 2913//2913 +f 2910//2910 2911//2911 2914//2915 +f 2911//2911 2912//2912 2915//2916 +f 2921//2918 2924//2924 2920//2919 +f 2922//2921 2921//2918 2917//2917 +f 2923//2923 2922//2921 2918//2920 +f 2924//2924 2923//2923 2919//2922 +f 2924//2924 2921//2918 2928//2926 +f 2921//2918 2922//2921 2925//2925 +f 2922//2921 2923//2923 2926//2927 +f 2923//2923 2924//2924 2927//2928 +f 2928//2926 2925//2925 2932//2930 +f 2925//2925 2926//2927 2929//2929 +f 2926//2927 2927//2928 2930//2931 +f 2927//2928 2928//2926 2931//2932 +f 2936//2940 2933//2933 2940//2935 +f 2933//2933 2934//2936 2937//2934 +f 2934//2936 2935//2938 2938//2937 +f 2935//2938 2936//2940 2939//2939 +f 2945//2942 2948//2948 2944//2943 +f 2946//2945 2945//2942 2941//2941 +f 2947//2947 2946//2945 2942//2944 +f 2948//2948 2947//2947 2943//2946 +f 2948//2948 2945//2942 2952//2950 +f 2945//2942 2946//2945 2949//2949 +f 2946//2945 2947//2947 2950//2951 +f 2947//2947 2948//2948 2951//2952 +f 2953//2953 2956//2956 2952//2950 +f 2954//2954 2953//2953 2949//2949 +f 2955//2955 2954//2954 2950//2951 +f 2956//2956 2955//2955 2951//2952 +f 2956//2956 2953//2953 2960//2958 +f 2953//2953 2954//2954 2957//2957 +f 2954//2954 2955//2955 2958//2959 +f 2955//2955 2956//2956 2959//2960 +f 2961//2961 2964//2964 2960//2958 +f 2962//2962 2961//2961 2957//2957 +f 2963//2963 2962//2962 2958//2959 +f 2964//2964 2963//2963 2959//2960 +f 2965//2965 2968//2968 2964//2964 +f 2966//2966 2965//2965 2961//2961 +f 2967//2967 2966//2966 2962//2962 +f 2968//2968 2967//2967 2963//2963 +f 2968//2968 2965//2965 2972//2970 +f 2965//2965 2966//2966 2969//2969 +f 2966//2966 2967//2967 2970//2971 +f 2967//2967 2968//2968 2971//2972 +f 2976//2980 2973//2973 2980//2975 +f 2978//2977 2977//2974 2973//2973 +f 2974//2976 2975//2978 2978//2977 +f 2980//2975 2979//2979 2975//2978 +f 2980//2975 2977//2974 2984//2982 +f 2982//2983 2981//2981 2977//2974 +f 2978//2977 2979//2979 2982//2983 +f 2984//2982 2983//2984 2979//2979 +f 2984//2982 2981//2981 2988//2986 +f 2981//2981 2982//2983 2985//2985 +f 2982//2983 2983//2984 2986//2987 +f 2983//2984 2984//2982 2987//2988 +f 2988//2986 2985//2985 2992//2990 +f 2985//2985 2986//2987 2989//2989 +f 2986//2987 2987//2988 2990//2991 +f 2987//2988 2988//2986 2991//2992 +f 2997//2994 3000//3000 2996//2995 +f 2993//2993 2994//2996 2997//2994 +f 2999//2999 2998//2997 2994//2996 +f 2995//2998 2996//2995 2999//2999 +f 3000//3000 2997//2994 3004//3002 +f 2997//2994 2998//2997 3001//3001 +f 2998//2997 2999//2999 3002//3003 +f 2999//2999 3000//3000 3003//3004 +f 3008//3012 3005//3005 3012//3007 +f 3005//3005 3006//3008 3009//3006 +f 3006//3008 3007//3010 3010//3009 +f 3007//3010 3008//3012 3011//3011 +f 3017//3014 3020//3020 3016//3015 +f 3013//3013 3014//3016 3017//3014 +f 3019//3019 3018//3017 3014//3016 +f 3015//3018 3016//3015 3019//3019 +f 3020//3020 3017//3014 3024//3022 +f 3022//3023 3021//3021 3017//3014 +f 3018//3017 3019//3019 3022//3023 +f 3024//3022 3023//3024 3019//3019 +f 3025//3025 3028//3028 3024//3022 +f 3021//3021 3022//3023 3025//3025 +f 3027//3027 3026//3026 3022//3023 +f 3023//3024 3024//3022 3027//3027 +f 3028//3028 3025//3025 3032//3030 +f 3030//3031 3029//3029 3025//3025 +f 3026//3026 3027//3027 3030//3031 +f 3032//3030 3031//3032 3027//3027 +f 3032//3030 3029//3029 3036//3034 +f 3034//3035 3033//3033 3029//3029 +f 3030//3031 3031//3032 3034//3035 +f 3036//3034 3035//3036 3031//3032 +f 3036//3034 3033//3033 3040//3038 +f 3033//3033 3034//3035 3037//3037 +f 3034//3035 3035//3036 3038//3039 +f 3035//3036 3036//3034 3039//3040 +f 3045//3042 3048//3048 3044//3043 +f 3041//3041 3042//3044 3045//3042 +f 3047//3047 3046//3045 3042//3044 +f 3043//3046 3044//3043 3047//3047 +f 3048//3048 3045//3042 3052//3050 +f 3050//3051 3049//3049 3045//3042 +f 3046//3045 3047//3047 3050//3051 +f 3052//3050 3051//3052 3047//3047 +f 3052//3050 3049//3049 3056//3054 +f 3049//3049 3050//3051 3053//3053 +f 3050//3051 3051//3052 3054//3055 +f 3051//3052 3052//3050 3055//3056 +f 3060//3064 3057//3057 3064//3059 +f 3057//3057 3058//3060 3061//3058 +f 3058//3060 3059//3062 3062//3061 +f 3059//3062 3060//3064 3063//3063 +f 3069//3066 3072//3072 3068//3067 +f 3070//3069 3069//3066 3065//3065 +f 3071//3071 3070//3069 3066//3068 +f 3072//3072 3071//3071 3067//3070 +f 3073//3073 3076//3076 3072//3072 +f 3074//3074 3073//3073 3069//3066 +f 3075//3075 3074//3074 3070//3069 +f 3076//3076 3075//3075 3071//3071 +f 3076//3076 3073//3073 3080//3078 +f 3073//3073 3074//3074 3077//3077 +f 3074//3074 3075//3075 3078//3079 +f 3075//3075 3076//3076 3079//3080 +f 3080//3078 3077//3077 3084//3082 +f 3077//3077 3078//3079 3081//3081 +f 3078//3079 3079//3080 3082//3083 +f 3079//3080 3080//3078 3083//3084 +f 3085//3085 3088//3088 3084//3082 +f 3086//3086 3085//3085 3081//3081 +f 3087//3087 3086//3086 3082//3083 +f 3088//3088 3087//3087 3083//3084 +f 3088//3088 3085//3085 3092//3090 +f 3085//3085 3086//3086 3089//3089 +f 3086//3086 3087//3087 3090//3091 +f 3087//3087 3088//3088 3091//3092 +f 3092//3090 3089//3089 3096//3094 +f 3089//3089 3090//3091 3093//3093 +f 3090//3091 3091//3092 3094//3095 +f 3091//3092 3092//3090 3095//3096 +f 3101//3098 3104//3104 3100//3099 +f 3102//3101 3101//3098 3097//3097 +f 3103//3103 3102//3101 3098//3100 +f 3104//3104 3103//3103 3099//3102 +f 3105//3105 3108//3108 3104//3104 +f 3106//3106 3105//3105 3101//3098 +f 3107//3107 3106//3106 3102//3101 +f 3108//3108 3107//3107 3103//3103 +f 3108//3108 3105//3105 3112//3110 +f 3110//3111 3109//3109 3105//3105 +f 3106//3106 3107//3107 3110//3111 +f 3112//3110 3111//3112 3107//3107 +f 3112//3110 3109//3109 3116//3114 +f 3109//3109 3110//3111 3113//3113 +f 3110//3111 3111//3112 3114//3115 +f 3111//3112 3112//3110 3115//3116 +f 3120//3124 3117//3117 3124//3119 +f 3122//3121 3121//3118 3117//3117 +f 3118//3120 3119//3122 3122//3121 +f 3124//3119 3123//3123 3119//3122 +f 3124//3119 3121//3118 3128//3126 +f 3121//3118 3122//3121 3125//3125 +f 3122//3121 3123//3123 3126//3127 +f 3123//3123 3124//3119 3127//3128 +f 3132//3136 3129//3129 3136//3131 +f 3129//3129 3130//3132 3133//3130 +f 3130//3132 3131//3134 3134//3133 +f 3131//3134 3132//3136 3135//3135 +f 3140//3144 3137//3137 3144//3139 +f 3137//3137 3138//3140 3141//3138 +f 3138//3140 3139//3142 3142//3141 +f 3139//3142 3140//3144 3143//3143 +f 3144//3139 3141//3138 3148//3146 +f 3141//3138 3142//3141 3145//3145 +f 3142//3141 3143//3143 3146//3147 +f 3143//3143 3144//3139 3147//3148 +f 3148//3146 3145//3145 3152//3150 +f 3145//3145 3146//3147 3149//3149 +f 3146//3147 3147//3148 3150//3151 +f 3147//3148 3148//3146 3151//3152 +f 3153//3153 3156//3156 3152//3150 +f 3149//3149 3150//3151 3153//3153 +f 3155//3155 3154//3154 3150//3151 +f 3151//3152 3152//3150 3155//3155 +f 3157//3157 3160//3160 3156//3156 +f 3153//3153 3154//3154 3157//3157 +f 3159//3159 3158//3158 3154//3154 +f 3155//3155 3156//3156 3159//3159 +f 3160//3160 3157//3157 3164//3162 +f 3157//3157 3158//3158 3161//3161 +f 3158//3158 3159//3159 3162//3163 +f 3159//3159 3160//3160 3163//3164 +f 3168//3172 3165//3165 3172//3167 +f 3170//3169 3169//3166 3165//3165 +f 3166//3168 3167//3170 3170//3169 +f 3172//3167 3171//3171 3167//3170 +f 3173//3173 3176//3176 3172//3167 +f 3169//3166 3170//3169 3173//3173 +f 3175//3175 3174//3174 3170//3169 +f 3171//3171 3172//3167 3175//3175 +f 3176//3176 3173//3173 3180//3178 +f 3173//3173 3174//3174 3177//3177 +f 3174//3174 3175//3175 3178//3179 +f 3175//3175 3176//3176 3179//3180 +f 3184//3188 3181//3181 3188//3183 +f 3181//3181 3182//3184 3185//3182 +f 3182//3184 3183//3186 3186//3185 +f 3183//3186 3184//3188 3187//3187 +f 3193//3190 3196//3196 3192//3191 +f 3194//3193 3193//3190 3189//3189 +f 3195//3195 3194//3193 3190//3192 +f 3196//3196 3195//3195 3191//3194 +f 3196//3196 3193//3190 3200//3198 +f 3193//3190 3194//3193 3197//3197 +f 3194//3193 3195//3195 3198//3199 +f 3195//3195 3196//3196 3199//3200 +f 3201//3201 3204//3204 3200//3198 +f 3202//3202 3201//3201 3197//3197 +f 3203//3203 3202//3202 3198//3199 +f 3204//3204 3203//3203 3199//3200 +f 3205//3205 3208//3208 3204//3204 +f 3206//3206 3205//3205 3201//3201 +f 3207//3207 3206//3206 3202//3202 +f 3208//3208 3207//3207 3203//3203 +f 3209//3209 3212//3212 3208//3208 +f 3210//3210 3209//3209 3205//3205 +f 3211//3211 3210//3210 3206//3206 +f 3212//3212 3211//3211 3207//3207 +f 3212//3212 3209//3209 3216//3214 +f 3209//3209 3210//3210 3213//3213 +f 3210//3210 3211//3211 3214//3215 +f 3211//3211 3212//3212 3215//3216 +f 3216//3214 3213//3213 3220//3218 +f 3213//3213 3214//3215 3217//3217 +f 3214//3215 3215//3216 3218//3219 +f 3215//3216 3216//3214 3219//3220 +f 3224//3228 3221//3221 3228//3223 +f 3226//3225 3225//3222 3221//3221 +f 3222//3224 3223//3226 3226//3225 +f 3228//3223 3227//3227 3223//3226 +f 3228//3223 3225//3222 3232//3230 +f 3230//3231 3229//3229 3225//3222 +f 3226//3225 3227//3227 3230//3231 +f 3232//3230 3231//3232 3227//3227 +f 3233//3233 3236//3236 3232//3230 +f 3229//3229 3230//3231 3233//3233 +f 3235//3235 3234//3234 3230//3231 +f 3231//3232 3232//3230 3235//3235 +f 3236//3236 3233//3233 3240//3238 +f 3233//3233 3234//3234 3237//3237 +f 3234//3234 3235//3235 3238//3239 +f 3235//3235 3236//3236 3239//3240 +f 3244//3248 3241//3241 3248//3243 +f 3246//3245 3245//3242 3241//3241 +f 3242//3244 3243//3246 3246//3245 +f 3248//3243 3247//3247 3243//3246 +f 3248//3243 3245//3242 3252//3250 +f 3245//3242 3246//3245 3249//3249 +f 3246//3245 3247//3247 3250//3251 +f 3247//3247 3248//3243 3251//3252 +f 3256//3260 3253//3253 3260//3255 +f 3253//3253 3254//3256 3257//3254 +f 3254//3256 3255//3258 3258//3257 +f 3255//3258 3256//3260 3259//3259 +f 3264//3268 3261//3261 3268//3263 +f 3261//3261 3262//3264 3265//3262 +f 3262//3264 3263//3266 3266//3265 +f 3263//3266 3264//3268 3267//3267 +f 3268//3263 3265//3262 3272//3270 +f 3265//3262 3266//3265 3269//3269 +f 3266//3265 3267//3267 3270//3271 +f 3272//3270 3271//3272 3267//3267 +f 3273//3273 3276//3276 3272//3270 +f 3274//3274 3273//3273 3269//3269 +f 3275//3275 3274//3274 3270//3271 +f 3271//3272 3272//3270 3275//3275 +f 3276//3276 3273//3273 3280//3278 +f 3278//3279 3277//3277 3273//3273 +f 3274//3274 3275//3275 3278//3279 +f 3280//3278 3279//3280 3275//3275 +f 3281//3281 3284//3284 3280//3278 +f 3277//3277 3278//3279 3281//3281 +f 3283//3283 3282//3282 3278//3279 +f 3279//3280 3280//3278 3283//3283 +f 3284//3284 3281//3281 3288//3286 +f 3281//3281 3282//3282 3285//3285 +f 3282//3282 3283//3283 3286//3287 +f 3283//3283 3284//3284 3287//3288 +f 3292//3296 3289//3289 3296//3291 +f 3289//3289 3290//3292 3293//3290 +f 3290//3292 3291//3294 3294//3293 +f 3291//3294 3292//3296 3295//3295 +f 3296//3291 3293//3290 3300//3298 +f 3293//3290 3294//3293 3297//3297 +f 3294//3293 3295//3295 3298//3299 +f 3295//3295 3296//3291 3299//3300 +f 3300//3298 3297//3297 3304//3302 +f 3297//3297 3298//3299 3301//3301 +f 3298//3299 3299//3300 3302//3303 +f 3299//3300 3300//3298 3303//3304 +f 3308//3312 3305//3305 3312//3307 +f 3305//3305 3306//3308 3309//3306 +f 3306//3308 3307//3310 3310//3309 +f 3307//3310 3308//3312 3311//3311 +f 3317//3314 3320//3320 3316//3315 +f 3313//3313 3314//3316 3317//3314 +f 3319//3319 3318//3317 3314//3316 +f 3315//3318 3316//3315 3319//3319 +f 3321//3321 3324//3324 3320//3320 +f 3317//3314 3318//3317 3321//3321 +f 3323//3323 3322//3322 3318//3317 +f 3319//3319 3320//3320 3323//3323 +f 3324//3324 3321//3321 3328//3326 +f 3326//3327 3325//3325 3321//3321 +f 3322//3322 3323//3323 3326//3327 +f 3328//3326 3327//3328 3323//3323 +f 3328//3326 3325//3325 3332//3330 +f 3330//3331 3329//3329 3325//3325 +f 3326//3327 3327//3328 3330//3331 +f 3332//3330 3331//3332 3327//3328 +f 3332//3330 3329//3329 3336//3334 +f 3334//3335 3333//3333 3329//3329 +f 3330//3331 3331//3332 3334//3335 +f 3336//3334 3335//3336 3331//3332 +f 3337//3337 3340//3340 3336//3334 +f 3333//3333 3334//3335 3337//3337 +f 3339//3339 3338//3338 3334//3335 +f 3335//3336 3336//3334 3339//3339 +f 3340//3340 3337//3337 3344//3342 +f 3337//3337 3338//3338 3341//3341 +f 3338//3338 3339//3339 3342//3343 +f 3339//3339 3340//3340 3343//3344 +f 3349//3346 3352//3352 3348//3347 +f 3350//3349 3349//3346 3345//3345 +f 3351//3351 3350//3349 3346//3348 +f 3352//3352 3351//3351 3347//3350 +f 3352//3352 3349//3346 3356//3354 +f 3349//3346 3350//3349 3353//3353 +f 3350//3349 3351//3351 3354//3355 +f 3351//3351 3352//3352 3355//3356 +f 3356//3354 3353//3353 3360//3358 +f 3353//3353 3354//3355 3357//3357 +f 3354//3355 3355//3356 3358//3359 +f 3355//3356 3356//3354 3359//3360 +f 3360//3358 3357//3357 3364//3362 +f 3357//3357 3358//3359 3361//3361 +f 3358//3359 3359//3360 3362//3363 +f 3359//3360 3360//3358 3363//3364 +f 3369//3366 3372//3372 3368//3367 +f 3370//3369 3369//3366 3365//3365 +f 3371//3371 3370//3369 3366//3368 +f 3372//3372 3371//3371 3367//3370 +f 3372//3372 3369//3366 3376//3374 +f 3369//3366 3370//3369 3373//3373 +f 3370//3369 3371//3371 3374//3375 +f 3371//3371 3372//3372 3375//3376 +f 3380//3384 3377//3377 3384//3379 +f 3377//3377 3378//3380 3381//3378 +f 3378//3380 3379//3382 3382//3381 +f 3379//3382 3380//3384 3383//3383 +f 3388//3392 3385//3385 3392//3387 +f 3385//3385 3386//3388 3389//3386 +f 3386//3388 3387//3390 3390//3389 +f 3387//3390 3388//3392 3391//3391 +f 3393//3393 3396//3396 3392//3387 +f 3394//3394 3393//3393 3389//3386 +f 3395//3395 3394//3394 3390//3389 +f 3396//3396 3395//3395 3391//3391 +f 3397//3397 3400//3400 3396//3396 +f 3398//3398 3397//3397 3393//3393 +f 3399//3399 3398//3398 3394//3394 +f 3400//3400 3399//3399 3395//3395 +f 3401//3401 3404//3404 3400//3400 +f 3402//3402 3401//3401 3397//3397 +f 3403//3403 3402//3402 3398//3398 +f 3404//3404 3403//3403 3399//3399 +f 3404//3404 3401//3401 3408//3406 +f 3401//3401 3402//3402 3405//3405 +f 3402//3402 3403//3403 3406//3407 +f 3403//3403 3404//3404 3407//3408 +f 3408//3406 3405//3405 3412//3410 +f 3405//3405 3406//3407 3409//3409 +f 3406//3407 3407//3408 3410//3411 +f 3407//3408 3408//3406 3411//3412 +f 3417//3414 3420//3420 3416//3415 +f 3413//3413 3414//3416 3417//3414 +f 3419//3419 3418//3417 3414//3416 +f 3415//3418 3416//3415 3419//3419 +f 3420//3420 3417//3414 3424//3422 +f 3422//3423 3421//3421 3417//3414 +f 3418//3417 3419//3419 3422//3423 +f 3424//3422 3423//3424 3419//3419 +f 3424//3422 3421//3421 3428//3426 +f 3421//3421 3422//3423 3425//3425 +f 3422//3423 3423//3424 3426//3427 +f 3423//3424 3424//3422 3427//3428 +f 3432//3436 3429//3429 3436//3431 +f 3429//3429 3430//3432 3433//3430 +f 3430//3432 3431//3434 3434//3433 +f 3431//3434 3432//3436 3435//3435 +f 3441//3438 3444//3444 3440//3439 +f 3442//3441 3441//3438 3437//3437 +f 3443//3443 3442//3441 3438//3440 +f 3444//3444 3443//3443 3439//3442 +f 3444//3444 3441//3438 3448//3446 +f 3441//3438 3442//3441 3445//3445 +f 3442//3441 3443//3443 3446//3447 +f 3443//3443 3444//3444 3447//3448 +f 3448//3446 3445//3445 3452//3450 +f 3445//3445 3446//3447 3449//3449 +f 3446//3447 3447//3448 3450//3451 +f 3447//3448 3448//3446 3451//3452 +f 3453//3453 3456//3456 3452//3450 +f 3454//3454 3453//3453 3449//3449 +f 3455//3455 3454//3454 3450//3451 +f 3456//3456 3455//3455 3451//3452 +f 3457//3457 3460//3460 3456//3456 +f 3458//3458 3457//3457 3453//3453 +f 3459//3459 3458//3458 3454//3454 +f 3460//3460 3459//3459 3455//3455 +f 3461//3461 3464//3464 3460//3460 +f 3462//3462 3461//3461 3457//3457 +f 3463//3463 3462//3462 3458//3458 +f 3464//3464 3463//3463 3459//3459 +f 3464//3464 3461//3461 3468//3466 +f 3461//3461 3462//3462 3465//3465 +f 3462//3462 3463//3463 3466//3467 +f 3463//3463 3464//3464 3467//3468 +f 3473//3470 3476//3476 3472//3471 +f 3474//3473 3473//3470 3469//3469 +f 3475//3475 3474//3473 3470//3472 +f 3476//3476 3475//3475 3471//3474 +f 3476//3476 3473//3470 3480//3478 +f 3473//3470 3474//3473 3477//3477 +f 3474//3473 3475//3475 3478//3479 +f 3475//3475 3476//3476 3479//3480 +f 3480//3478 3477//3477 3484//3482 +f 3482//3483 3481//3481 3477//3477 +f 3478//3479 3479//3480 3482//3483 +f 3484//3482 3483//3484 3479//3480 +f 3484//3482 3481//3481 3488//3486 +f 3481//3481 3482//3483 3485//3485 +f 3482//3483 3483//3484 3486//3487 +f 3483//3484 3484//3482 3487//3488 +f 3492//3496 3489//3489 3496//3491 +f 3489//3489 3490//3492 3493//3490 +f 3490//3492 3491//3494 3494//3493 +f 3491//3494 3492//3496 3495//3495 +f 3496//3491 3493//3490 3500//3498 +f 3493//3490 3494//3493 3497//3497 +f 3494//3493 3495//3495 3498//3499 +f 3495//3495 3496//3491 3499//3500 +f 3504//3508 3501//3501 3508//3503 +f 3501//3501 3502//3504 3505//3502 +f 3502//3504 3503//3506 3506//3505 +f 3503//3506 3504//3508 3507//3507 +f 3513//3510 3516//3516 3512//3511 +f 3509//3509 3510//3512 3513//3510 +f 3515//3515 3514//3513 3510//3512 +f 3511//3514 3512//3511 3515//3515 +f 3517//3517 3520//3520 3516//3516 +f 3513//3510 3514//3513 3517//3517 +f 3519//3519 3518//3518 3514//3513 +f 3515//3515 3516//3516 3519//3519 +f 3520//3520 3517//3517 3524//3522 +f 3522//3523 3521//3521 3517//3517 +f 3518//3518 3519//3519 3522//3523 +f 3524//3522 3523//3524 3519//3519 +f 3524//3522 3521//3521 3528//3526 +f 3526//3527 3525//3525 3521//3521 +f 3522//3523 3523//3524 3526//3527 +f 3528//3526 3527//3528 3523//3524 +f 3529//3529 3532//3532 3528//3526 +f 3525//3525 3526//3527 3529//3529 +f 3531//3531 3530//3530 3526//3527 +f 3527//3528 3528//3526 3531//3531 +f 3532//3532 3529//3529 3536//3534 +f 3529//3529 3530//3530 3533//3533 +f 3530//3530 3531//3531 3534//3535 +f 3531//3531 3532//3532 3535//3536 +f 3541//3538 3544//3544 3540//3539 +f 3537//3537 3538//3540 3541//3538 +f 3543//3543 3542//3541 3538//3540 +f 3539//3542 3540//3539 3543//3543 +f 3544//3544 3541//3538 3548//3546 +f 3546//3547 3545//3545 3541//3538 +f 3542//3541 3543//3543 3546//3547 +f 3548//3546 3547//3548 3543//3543 +f 3548//3546 3545//3545 3552//3550 +f 3545//3545 3546//3547 3549//3549 +f 3546//3547 3547//3548 3550//3551 +f 3547//3548 3548//3546 3551//3552 +f 3556//3560 3553//3553 3560//3555 +f 3553//3553 3554//3556 3557//3554 +f 3554//3556 3555//3558 3558//3557 +f 3555//3558 3556//3560 3559//3559 +f 3564//3568 3561//3561 3568//3563 +f 3561//3561 3562//3564 3565//3562 +f 3562//3564 3563//3566 3566//3565 +f 3563//3566 3564//3568 3567//3567 +f 3568//3563 3565//3562 3572//3570 +f 3565//3562 3566//3565 3569//3569 +f 3566//3565 3567//3567 3570//3571 +f 3567//3567 3568//3563 3571//3572 +f 3572//3570 3569//3569 3576//3574 +f 3569//3569 3570//3571 3573//3573 +f 3570//3571 3571//3572 3574//3575 +f 3571//3572 3572//3570 3575//3576 +f 3577//3577 3580//3580 3576//3574 +f 3578//3578 3577//3577 3573//3573 +f 3579//3579 3578//3578 3574//3575 +f 3580//3580 3579//3579 3575//3576 +f 3580//3580 3577//3577 3584//3582 +f 3577//3577 3578//3578 3581//3581 +f 3578//3578 3579//3579 3582//3583 +f 3579//3579 3580//3580 3583//3584 +f 3585//3585 3588//3588 3584//3582 +f 3586//3586 3585//3585 3581//3581 +f 3587//3587 3586//3586 3582//3583 +f 3588//3588 3587//3587 3583//3584 +f 3588//3588 3585//3585 3592//3590 +f 3585//3585 3586//3586 3589//3589 +f 3586//3586 3587//3587 3590//3591 +f 3587//3587 3588//3588 3591//3592 +f 3596//3600 3593//3593 3600//3595 +f 3593//3593 3594//3596 3597//3594 +f 3594//3596 3595//3598 3598//3597 +f 3595//3598 3596//3600 3599//3599 +f 3601//3601 3604//3604 3600//3595 +f 3597//3594 3598//3597 3601//3601 +f 3603//3603 3602//3602 3598//3597 +f 3599//3599 3600//3595 3603//3603 +f 3605//3605 3608//3608 3604//3604 +f 3601//3601 3602//3602 3605//3605 +f 3607//3607 3606//3606 3602//3602 +f 3603//3603 3604//3604 3607//3607 +f 3608//3608 3605//3605 3612//3610 +f 3605//3605 3606//3606 3609//3609 +f 3606//3606 3607//3607 3610//3611 +f 3607//3607 3608//3608 3611//3612 +f 3616//3620 3613//3613 3620//3615 +f 3618//3617 3617//3614 3613//3613 +f 3614//3616 3615//3618 3618//3617 +f 3620//3615 3619//3619 3615//3618 +f 3620//3615 3617//3614 3624//3622 +f 3617//3614 3618//3617 3621//3621 +f 3618//3617 3619//3619 3622//3623 +f 3619//3619 3620//3615 3623//3624 +f 3628//3632 3625//3625 3632//3627 +f 3625//3625 3626//3628 3629//3626 +f 3626//3628 3627//3630 3630//3629 +f 3627//3630 3628//3632 3631//3631 +f 3637//3634 3640//3640 3636//3635 +f 3638//3637 3637//3634 3633//3633 +f 3639//3639 3638//3637 3634//3636 +f 3640//3640 3639//3639 3635//3638 +f 3640//3640 3637//3634 3644//3642 +f 3637//3634 3638//3637 3641//3641 +f 3638//3637 3639//3639 3642//3643 +f 3639//3639 3640//3640 3643//3644 +f 3645//3645 3648//3648 3644//3642 +f 3646//3646 3645//3645 3641//3641 +f 3647//3647 3646//3646 3642//3643 +f 3648//3648 3647//3647 3643//3644 +f 3649//3649 3652//3652 3648//3648 +f 3650//3650 3649//3649 3645//3645 +f 3651//3651 3650//3650 3646//3646 +f 3652//3652 3651//3651 3647//3647 +f 3652//3652 3649//3649 3656//3654 +f 3649//3649 3650//3650 3653//3653 +f 3650//3650 3651//3651 3654//3655 +f 3656//3654 3655//3656 3651//3651 +f 3656//3654 3653//3653 3660//3658 +f 3653//3653 3654//3655 3657//3657 +f 3654//3655 3655//3656 3658//3659 +f 3655//3656 3656//3654 3659//3660 +f 3664//3668 3661//3661 3668//3663 +f 3661//3661 3662//3664 3665//3662 +f 3662//3664 3663//3666 3666//3665 +f 3663//3666 3664//3668 3667//3667 +f 3669//3669 3672//3672 3668//3663 +f 3670//3670 3669//3669 3665//3662 +f 3671//3671 3670//3670 3666//3665 +f 3672//3672 3671//3671 3667//3667 +f 3672//3672 3669//3669 3676//3674 +f 3669//3669 3670//3670 3673//3673 +f 3670//3670 3671//3671 3674//3675 +f 3671//3671 3672//3672 3675//3676 +f 3680//3684 3677//3677 3684//3679 +f 3677//3677 3678//3680 3681//3678 +f 3678//3680 3679//3682 3682//3681 +f 3679//3682 3680//3684 3683//3683 +f 3689//3686 3692//3692 3688//3687 +f 3690//3689 3689//3686 3685//3685 +f 3691//3691 3690//3689 3686//3688 +f 3692//3692 3691//3691 3687//3690 +f 3692//3692 3689//3686 3696//3694 +f 3689//3686 3690//3689 3693//3693 +f 3690//3689 3691//3691 3694//3695 +f 3691//3691 3692//3692 3695//3696 +f 3697//3697 3700//3700 3696//3694 +f 3698//3698 3697//3697 3693//3693 +f 3699//3699 3698//3698 3694//3695 +f 3700//3700 3699//3699 3695//3696 +f 3701//3701 3704//3704 3700//3700 +f 3702//3702 3701//3701 3697//3697 +f 3703//3703 3702//3702 3698//3698 +f 3704//3704 3703//3703 3699//3699 +f 3705//3705 3708//3708 3704//3704 +f 3706//3706 3705//3705 3701//3701 +f 3707//3707 3706//3706 3702//3702 +f 3708//3708 3707//3707 3703//3703 +f 3708//3708 3705//3705 3712//3710 +f 3705//3705 3706//3706 3709//3709 +f 3706//3706 3707//3707 3710//3711 +f 3707//3707 3708//3708 3711//3712 +f 3712//3710 3709//3709 3716//3714 +f 3709//3709 3710//3711 3713//3713 +f 3710//3711 3711//3712 3714//3715 +f 3711//3712 3712//3710 3715//3716 +f 3721//3718 3724//3724 3720//3719 +f 3722//3721 3721//3718 3717//3717 +f 3723//3723 3722//3721 3718//3720 +f 3724//3724 3723//3723 3719//3722 +f 3724//3724 3721//3718 3728//3726 +f 3721//3718 3722//3721 3725//3725 +f 3722//3721 3723//3723 3726//3727 +f 3723//3723 3724//3724 3727//3728 +f 3729//3729 3732//3732 3728//3726 +f 3725//3725 3726//3727 3729//3729 +f 3731//3731 3730//3730 3726//3727 +f 3727//3728 3728//3726 3731//3731 +f 3732//3732 3729//3729 3736//3734 +f 3729//3729 3730//3730 3733//3733 +f 3730//3730 3731//3731 3734//3735 +f 3731//3731 3732//3732 3735//3736 +f 3741//3738 3744//3744 3740//3739 +f 3742//3741 3741//3738 3737//3737 +f 3743//3743 3742//3741 3738//3740 +f 3744//3744 3743//3743 3739//3742 +f 3744//3744 3741//3738 3748//3746 +f 3741//3738 3742//3741 3745//3745 +f 3742//3741 3743//3743 3746//3747 +f 3743//3743 3744//3744 3747//3748 +f 3752//3756 3749//3749 3756//3751 +f 3749//3749 3750//3752 3753//3750 +f 3750//3752 3751//3754 3754//3753 +f 3751//3754 3752//3756 3755//3755 +f 3761//3758 3764//3764 3760//3759 +f 3762//3761 3761//3758 3757//3757 +f 3763//3763 3762//3761 3758//3760 +f 3764//3764 3763//3763 3759//3762 +f 3765//3765 3768//3768 3764//3764 +f 3761//3758 3762//3761 3765//3765 +f 3767//3767 3766//3766 3762//3761 +f 3763//3763 3764//3764 3767//3767 +f 3769//3769 3772//3772 3768//3768 +f 3765//3765 3766//3766 3769//3769 +f 3771//3771 3770//3770 3766//3766 +f 3767//3767 3768//3768 3771//3771 +f 3772//3772 3769//3769 3776//3774 +f 3774//3775 3773//3773 3769//3769 +f 3770//3770 3771//3771 3774//3775 +f 3776//3774 3775//3776 3771//3771 +f 3777//3777 3780//3780 3776//3774 +f 3773//3773 3774//3775 3777//3777 +f 3779//3779 3778//3778 3774//3775 +f 3775//3776 3776//3774 3779//3779 +f 3780//3780 3777//3777 3784//3782 +f 3777//3777 3778//3778 3781//3781 +f 3778//3778 3779//3779 3782//3783 +f 3779//3779 3780//3780 3783//3784 +f 3788//3792 3785//3785 3792//3787 +f 3785//3785 3786//3788 3789//3786 +f 3786//3788 3787//3790 3790//3789 +f 3787//3790 3788//3792 3791//3791 +f 3792//3787 3789//3786 3796//3794 +f 3789//3786 3790//3789 3793//3793 +f 3790//3789 3791//3791 3794//3795 +f 3791//3791 3792//3787 3795//3796 +f 3796//3794 3793//3793 3800//3798 +f 3793//3793 3794//3795 3797//3797 +f 3794//3795 3795//3796 3798//3799 +f 3795//3796 3796//3794 3799//3800 +f 3804//3808 3801//3801 3808//3803 +f 3801//3801 3802//3804 3805//3802 +f 3802//3804 3803//3806 3806//3805 +f 3803//3806 3804//3808 3807//3807 +f 3813//3810 3816//3816 3812//3811 +f 3814//3813 3813//3810 3809//3809 +f 3815//3815 3814//3813 3810//3812 +f 3816//3816 3815//3815 3811//3814 +f 3817//3817 3820//3820 3816//3816 +f 3818//3818 3817//3817 3813//3810 +f 3819//3819 3818//3818 3814//3813 +f 3820//3820 3819//3819 3815//3815 +f 3821//3821 3824//3824 3820//3820 +f 3822//3822 3821//3821 3817//3817 +f 3823//3823 3822//3822 3818//3818 +f 3824//3824 3823//3823 3819//3819 +f 3825//3825 3828//3828 3824//3824 +f 3826//3826 3825//3825 3821//3821 +f 3827//3827 3826//3826 3822//3822 +f 3828//3828 3827//3827 3823//3823 +f 3828//3828 3825//3825 3832//3830 +f 3825//3825 3826//3826 3829//3829 +f 3826//3826 3827//3827 3830//3831 +f 3827//3827 3828//3828 3831//3832 +f 3833//3833 3836//3836 3832//3830 +f 3834//3834 3833//3833 3829//3829 +f 3835//3835 3834//3834 3830//3831 +f 3836//3836 3835//3835 3831//3832 +f 3836//3836 3833//3833 3840//3838 +f 3833//3833 3834//3834 3837//3837 +f 3834//3834 3835//3835 3838//3839 +f 3835//3835 3836//3836 3839//3840 +f 3845//3842 3848//3848 3844//3843 +f 3841//3841 3842//3844 3845//3842 +f 3847//3847 3846//3845 3842//3844 +f 3843//3846 3844//3843 3847//3847 +f 3848//3848 3845//3842 3852//3850 +f 3850//3851 3849//3849 3845//3842 +f 3846//3845 3847//3847 3850//3851 +f 3852//3850 3851//3852 3847//3847 +f 3852//3850 3849//3849 3856//3854 +f 3849//3849 3850//3851 3853//3853 +f 3850//3851 3851//3852 3854//3855 +f 3851//3852 3852//3850 3855//3856 +f 3856//3854 3853//3853 3860//3858 +f 3853//3853 3854//3855 3857//3857 +f 3854//3855 3855//3856 3858//3859 +f 3855//3856 3856//3854 3859//3860 +f 3865//3862 3868//3868 3864//3863 +f 3861//3861 3862//3864 3865//3862 +f 3867//3867 3866//3865 3862//3864 +f 3863//3866 3864//3863 3867//3867 +f 3868//3868 3865//3862 3872//3870 +f 3865//3862 3866//3865 3869//3869 +f 3866//3865 3867//3867 3870//3871 +f 3867//3867 3868//3868 3871//3872 +f 3876//3880 3873//3873 3880//3875 +f 3873//3873 3874//3876 3877//3874 +f 3874//3876 3875//3878 3878//3877 +f 3875//3878 3876//3880 3879//3879 diff --git a/examples/16-shadowmaps/varying.def.sc b/examples/16-shadowmaps/varying.def.sc new file mode 100644 index 000000000..a3776d2b0 --- /dev/null +++ b/examples/16-shadowmaps/varying.def.sc @@ -0,0 +1,14 @@ +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); +vec4 v_texcoord1 : TEXCOORD1 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord2 : TEXCOORD2 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord3 : TEXCOORD3 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_texcoord4 : TEXCOORD4 = vec4(0.0, 0.0, 0.0, 0.0); +vec3 v_view : TEXCOORD5 = vec3(0.0, 0.0, 0.0); +vec4 v_shadowcoord : TEXCOORD6 = vec4(0.0, 0.0, 0.0, 0.0); +vec4 v_position : TEXCOORD7 = vec4(0.0, 0.0, 0.0, 0.0); +vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0); +float v_depth : FOG = 0.0; + +vec3 a_position : POSITION; +vec4 a_normal : NORMAL; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/examples/16-shadowmaps/vs_shadowmaps_color.sc b/examples/16-shadowmaps/vs_shadowmaps_color.sc new file mode 100644 index 000000000..8ad767cf8 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color.sc @@ -0,0 +1,13 @@ +$input a_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc new file mode 100644 index 000000000..a898c8ce2 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc @@ -0,0 +1,25 @@ +$input a_position, a_normal +$output v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform mat4 u_lightMtx; +uniform vec4 u_params1; +#define u_shadowMapOffset u_params1.y + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + vec3 posOffset = a_position + normal.xyz * u_shadowMapOffset; + v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) ); +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc new file mode 100644 index 000000000..254e1d767 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc @@ -0,0 +1,36 @@ +$input a_position, a_normal +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_params1; +#define u_shadowMapOffset u_params1.y + +uniform mat4 u_lightMtx; +uniform mat4 u_shadowMapMtx0; +uniform mat4 u_shadowMapMtx1; +uniform mat4 u_shadowMapMtx2; +uniform mat4 u_shadowMapMtx3; + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + vec4 posOffset = vec4(a_position + normal.xyz * u_shadowMapOffset, 1.0); + v_position = mul(u_modelView, posOffset); + + vec4 wpos = vec4(mul(u_model[0], posOffset).xyz, 1.0); + v_texcoord1 = mul(u_shadowMapMtx0, wpos); + v_texcoord2 = mul(u_shadowMapMtx1, wpos); + v_texcoord3 = mul(u_shadowMapMtx2, wpos); + v_texcoord4 = mul(u_shadowMapMtx3, wpos); +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc new file mode 100644 index 000000000..22a581b8e --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc @@ -0,0 +1,26 @@ +$input a_position, a_normal, a_texcoord0 +$output v_normal, v_view, v_shadowcoord + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform mat4 u_lightMtx; +uniform vec4 u_params1; +#define u_shadowMapOffset u_params1.y + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + vec3 posOffset = a_position + normal.xyz * u_shadowMapOffset; + v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) ); + v_shadowcoord.z += 0.5; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc new file mode 100644 index 000000000..74a0fce88 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc @@ -0,0 +1,41 @@ +$input a_position, a_normal +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_params1; +#define u_shadowMapOffset u_params1.y + +uniform mat4 u_lightMtx; +uniform mat4 u_shadowMapMtx0; +uniform mat4 u_shadowMapMtx1; +uniform mat4 u_shadowMapMtx2; +uniform mat4 u_shadowMapMtx3; + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + vec4 posOffset = vec4(a_position + normal.xyz * u_shadowMapOffset, 1.0); + v_position = mul(u_modelView, posOffset); + + vec4 wpos = vec4(mul(u_model[0], posOffset).xyz, 1.0); + v_texcoord1 = mul(u_shadowMapMtx0, wpos); + v_texcoord2 = mul(u_shadowMapMtx1, wpos); + v_texcoord3 = mul(u_shadowMapMtx2, wpos); + v_texcoord4 = mul(u_shadowMapMtx3, wpos); + + v_texcoord1.z += 0.5; + v_texcoord2.z += 0.5; + v_texcoord3.z += 0.5; + v_texcoord4.z += 0.5; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc new file mode 100644 index 000000000..6cdb68d77 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc @@ -0,0 +1,40 @@ +$input a_position, a_normal +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_params1; +#define u_shadowMapOffset u_params1.y + +uniform mat4 u_lightMtx; +uniform mat4 u_shadowMapMtx0; +uniform mat4 u_shadowMapMtx1; +uniform mat4 u_shadowMapMtx2; +uniform mat4 u_shadowMapMtx3; + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + vec4 posOffset = vec4(a_position + normal.xyz * u_shadowMapOffset, 1.0); + v_position = mul(u_lightMtx, posOffset); + + v_texcoord1 = mul(u_shadowMapMtx0, v_position); + v_texcoord2 = mul(u_shadowMapMtx1, v_position); + v_texcoord3 = mul(u_shadowMapMtx2, v_position); + v_texcoord4 = mul(u_shadowMapMtx3, v_position); + + v_texcoord1.z += 0.5; + v_texcoord2.z += 0.5; + v_texcoord3.z += 0.5; + v_texcoord4.z += 0.5; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc new file mode 100644 index 000000000..464bd4664 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc @@ -0,0 +1,35 @@ +$input a_position, a_normal +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_params1; +#define u_shadowMapOffset u_params1.y + +uniform mat4 u_lightMtx; +uniform mat4 u_shadowMapMtx0; +uniform mat4 u_shadowMapMtx1; +uniform mat4 u_shadowMapMtx2; +uniform mat4 u_shadowMapMtx3; + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = normalize(mul(u_modelView, vec4(normal.xyz, 0.0) ).xyz); + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + vec4 posOffset = vec4(a_position + normal.xyz * u_shadowMapOffset, 1.0); + v_position = mul(u_lightMtx, posOffset); + + v_texcoord1 = mul(u_shadowMapMtx0, v_position); + v_texcoord2 = mul(u_shadowMapMtx1, v_position); + v_texcoord3 = mul(u_shadowMapMtx2, v_position); + v_texcoord4 = mul(u_shadowMapMtx3, v_position); +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc b/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc new file mode 100644 index 000000000..1276312f3 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc @@ -0,0 +1,16 @@ +$input a_position, a_texcoord0 +$output v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + v_texcoord0 = a_texcoord0; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_depth.sc b/examples/16-shadowmaps/vs_shadowmaps_depth.sc new file mode 100644 index 000000000..25ccd241f --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_depth.sc @@ -0,0 +1,13 @@ +$input a_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0)); +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_hblur.sc b/examples/16-shadowmaps/vs_shadowmaps_hblur.sc new file mode 100644 index 000000000..42d8e2c6a --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_hblur.sc @@ -0,0 +1,32 @@ +$input a_position, a_texcoord0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2011-2013 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_smSamplingParams; +#define u_xOffset u_smSamplingParams.z + +void main() +{ + float offset = u_viewTexel.x*u_xOffset; + + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_texcoord0 = a_texcoord0; + v_texcoord1 = vec4(a_texcoord0.x - offset*1.0, a_texcoord0.y, + a_texcoord0.x + offset*1.0, a_texcoord0.y + ); + v_texcoord2 = vec4(a_texcoord0.x - offset*2.0, a_texcoord0.y, + a_texcoord0.x + offset*2.0, a_texcoord0.y + ); + v_texcoord3 = vec4(a_texcoord0.x - offset*3.0, a_texcoord0.y, + a_texcoord0.x + offset*3.0, a_texcoord0.y + ); + v_texcoord4 = vec4(a_texcoord0.x - offset*4.0, a_texcoord0.y, + a_texcoord0.x + offset*4.0, a_texcoord0.y + ); +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc b/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc new file mode 100644 index 000000000..d6e7c4613 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc @@ -0,0 +1,15 @@ +$input a_position +$output v_position + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_position = gl_Position; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc b/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc new file mode 100644 index 000000000..1286d7dca --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc @@ -0,0 +1,15 @@ +$input a_position +$output v_depth + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_depth = gl_Position.z * 0.5 + 0.5; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_texture.sc b/examples/16-shadowmaps/vs_shadowmaps_texture.sc new file mode 100644 index 000000000..1276312f3 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_texture.sc @@ -0,0 +1,16 @@ +$input a_position, a_texcoord0 +$output v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + v_texcoord0 = a_texcoord0; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc b/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc new file mode 100644 index 000000000..1925aa649 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc @@ -0,0 +1,20 @@ +$input a_position, a_normal, a_texcoord0 +$output v_normal, v_view, v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0)); + + vec4 normal = a_normal * 2.0 - 1.0; + v_normal = mul(u_modelView, vec4(normal.xyz, 0.0)).xyz; + v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; + + v_texcoord0 = a_texcoord0; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc b/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc new file mode 100644 index 000000000..1276312f3 --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc @@ -0,0 +1,16 @@ +$input a_position, a_texcoord0 +$output v_texcoord0 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + + v_texcoord0 = a_texcoord0; +} diff --git a/examples/16-shadowmaps/vs_shadowmaps_vblur.sc b/examples/16-shadowmaps/vs_shadowmaps_vblur.sc new file mode 100644 index 000000000..74915a09e --- /dev/null +++ b/examples/16-shadowmaps/vs_shadowmaps_vblur.sc @@ -0,0 +1,32 @@ +$input a_position, a_texcoord0 +$output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 + +/* + * Copyright 2013 Dario Manesku. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +uniform vec4 u_smSamplingParams; +#define u_yOffset u_smSamplingParams.w + +void main() +{ + float offset = u_viewTexel.y*u_yOffset; + + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_texcoord0 = a_texcoord0; + v_texcoord1 = vec4(a_texcoord0.x, a_texcoord0.y - offset*1.0, + a_texcoord0.x, a_texcoord0.y + offset*1.0 + ); + v_texcoord2 = vec4(a_texcoord0.x, a_texcoord0.y - offset*2.0, + a_texcoord0.x, a_texcoord0.y + offset*2.0 + ); + v_texcoord3 = vec4(a_texcoord0.x, a_texcoord0.y - offset*3.0, + a_texcoord0.x, a_texcoord0.y + offset*3.0 + ); + v_texcoord4 = vec4(a_texcoord0.x, a_texcoord0.y - offset*4.0, + a_texcoord0.x, a_texcoord0.y + offset*4.0 + ); +} diff --git a/examples/common/entry/entry.cpp b/examples/common/entry/entry.cpp index a2b60ee71..8372abf0f 100644 --- a/examples/common/entry/entry.cpp +++ b/examples/common/entry/entry.cpp @@ -104,6 +104,35 @@ namespace entry return 0; } + int cmdMove(CmdContext* /*_context*/, void* /*_userData*/, int _argc, char const* const* _argv) + { + if (_argc > 1) + { + if (0 == strcmp(_argv[1], "forward") ) + { + cameraSetKeyState(CAMERA_KEY_UP, true); + return 0; + } + else if (0 == strcmp(_argv[1], "left") ) + { + cameraSetKeyState(CAMERA_KEY_LEFT, true); + return 0; + } + else if (0 == strcmp(_argv[1], "right") ) + { + cameraSetKeyState(CAMERA_KEY_RIGHT, true); + return 0; + } + else if (0 == strcmp(_argv[1], "backward") ) + { + cameraSetKeyState(CAMERA_KEY_DOWN, true); + return 0; + } + } + + return 1; + } + static const InputBinding s_bindings[] = { { entry::Key::KeyQ, entry::Modifier::LeftCtrl, 1, cmd, "exit" }, @@ -129,7 +158,7 @@ namespace entry int main(int _argc, char** _argv) { - DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME); + //DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME); cmdAdd("mouselock", cmdMouseLock); cmdAdd("graphics", cmdGraphics ); diff --git a/examples/common/fpumath.h b/examples/common/fpumath.h index 68b1cc01b..522fd8b74 100644 --- a/examples/common/fpumath.h +++ b/examples/common/fpumath.h @@ -24,6 +24,16 @@ inline float fmaxf(float _a, float _b) } #endif // BX_COMPILER_MSVC +inline float toRad(float _deg) +{ + return _deg * float(M_PI) / 180.0f; +} + +inline float toDeg(float _rad) +{ + return _rad * 180.0f / float(M_PI); +} + inline float fclamp(float _a, float _min, float _max) { return fminf(fmaxf(_a, _min), _max); diff --git a/examples/runtime/meshes/hollowcube.bin b/examples/runtime/meshes/hollowcube.bin new file mode 100644 index 0000000000000000000000000000000000000000..81131b4864453eb24f3974731cbb66b7c346ae57 GIT binary patch literal 24175 zcma)^3A|0!`~TOl%|oWlQ;LMlO1XFMgG>o!iXu@$lcY(Ln@A<1M5Clsl;%{pdmj}| zN=a0jG%G128sz`^taJA9-0k-L{m*`_=Xu^|t-aQ>hP~FaPhEq%G*t4_OP`4IR&85^PxE4~r%p2z=sHmJ4m#Aw9BzeVKXf2|8Pwf;0H z{cj1E&+iU?3WCNzcVAfvUz9)i*AB>!n&2sw4(8Ul&(&C zj9YW%nNMat1qBCUf1;SFS)XKCp5KGB?^4a#~c)0TM_{H@}=KaNSc0O|VOQwG@$L+_=`Ihex8fwv)zO3!7jp?@jK{mJbto2x&C4Ri{uM-{(y`4 z<2ct|*58cpu6%ZV(q?b6 z#pTJ_`O5Ss%d&iS{$2ao{yTr-@reCPGW}=yINv=_;J7})s5{d?IlggzCNKLuX6h?a zKF*KZNB!KdGX7@z!{;&AKbB9jEYEx}`k0xpnBh-u{+XX-Q6Belj@+jpW2aqteDj~| zN{jq#9l7%8AM5;2K3JYL9eiFm9{-D3TIOf!Ik@JEW7&V^%kkp;7RT{;#pTJEo`Sgk zn6vA{jaU3U#O=lGT*f@b%=tt;Ic7fVV}7Ro49D%oR_ax%^E3Gy7Q_PsII?=S!B)+K1ea z{^GlX{>3cIXVzQhtj72U2iLp%&N0Um_b}o8%suZ#IFqjmn4g^=t_N3MGV70-eo4ms z1@te@Cm&j$!tA*H!?iE(&-jqg-)9fu%=~4_XWMu8$Nu0ucfVxTPtK0ND=+$AWW3_~na}%*_aF1;`kTpT zn{j{Q@#X-ry@UP9j1S9VJTUGG^=H;Xl37OhkFxRe>B>iZ{*w7|do0WRjQ5cyD$*9HV@8yfW|ONsi0Ymw3Fh{?i|~euTe{ zv;E1H&yGj7{oM1D<4ivLkr@+?7b&hk=8XTD_mS*+L4PtFmybC+Ub*}tjQV4C{Y3-h zT>a=!)|cG*Ekcg>k;SA50x5 z)(<=O&$U;Ci~5&ce+r-M`&g!a*5{tL_<70Jk$avbXUC6i#?P0txxexLxNMR|dDkAj zknM5(X76|TNsh~-9+w~2f6$*yeR2Duyz?)vFD@T5%VqCz?IS zHWP4=qpybr2{H@F9<&)>OX%h4)oRz^B$|co;`ODV0`aa%y zSg5xQ4GPyj<=TJ$<<{X2zjsjj&H1kV?!lt)u8k#v?pHk=w;!SXRcJq?fA7`Z6+Sk6 zs$b{jIuW^XN=Me=$Ek<|o4Ztm1gd_OtU{WW2E+BCLlH>!FbK zVZB6HFCo^;N;1|{k@>{zs=bw0<$;szMGM`V`K3V!lmhE$Xq<>`DK3V!lUe&N-@ZHfR{0AzmcI#)% z$o2kd`^ty=SGRWStJ&ZZ!7WX1%3m_}ewTmjyBGOg8~h$NxqZG*|C95%{pPOu^XvAD zzS}tzWRxJ?~v-Rq!{zc4oAo>rl5J+?Tf)dqc@+%b)XHz8nwE-}LEU`B#ov z9L_7-(#_wazYK_8oVh++eW|yS?I&68ckHhmPqG{j?$*%x{4C4cQ-zSBUe$$N3PEWqoAX9=Y;s z^ZYTp$^_H<_RHgX#Cj^k{t#e)aE$d-i1id;J-Pj6$dJeVepl8G)W8XjH?DlyA6503 zp!69!kNrV^S7CetjE`gNKZV$@0_<1$%%9ohG5^+CHG?YAqC^iM3+uM>IG?Dj#$N8a&E4WCj-#`&6u^EDsms~b=G zd@}#-{h|NW*dF2B&pNw&obM}fzUSe5cZ~Br#QE;ye0PlVeI??BPKXyG`j7P*BA)OO zPdG-r5hC935pOs~{7{H^q!96lV~k&j@ry8i&Oe;*5zhAz=euK^?-9=T5a;_U`iJof zF~1S!*RhO0xL)CZ2>*Tf@8Yi{C(FzA%ll>gQXD7C%l(Mu<$hHhC(Hjj;Fs`=5?A|8 zkM839O)}2g5a+Xx^EqJuW&A~!@f8{8dx-Ph$NBEc%lo-r<#>=W{~`8gAN#Y5x8(hN zeq=mDmhlc5=WU4i!bg1JlW|^$h#vyP4?gRc>z^#+C$fyM$g)1}SMqrw%lgQ&Ju=R_ z2=QVe;zbw#$o0p3xjxA_zaqqog@_kjc^QAPKQcZe%lgQ&J+iEi{gLgF<^D&O@dR1M z8)Uiu$#TEs^Cs&n?)k%c65@RIalVGk$N3xK{4K=!>vO%x_Q)-6s2jCkapS5D`!o5; z{>kT){gv?&IXQlEJUHI6KV(@SS+++`&aYh0%$MtxoLoQ2^(Esoj;E}jEbC)`WPC@K zH{|@V`~@%V5BuE}_;bp)ar;A( z<$N)Ikns;$#yezrKUqHiY)|$#xjtB4&No@cH{@jdazA6fjDNU4CRvu}e8}^N>@vOHheA9+3|na{6$|02uw$kHEj^1PJ&;rL)b&Aoq-ljpHy`XkGeWjshmJQ5;) ziV#1oA|sv&5nn}!uUvd2&qwxO`bU=U2lQXg7a8k4!2Xnn{mJcTaz5yPvVVw&BE&-> z;vpB0Ct1e3#q|g0eTaD3N4)ITn~Z;0Ugop?WPB?31Ln*7$ugh)m-`7>`pfp@eo2=5 z2g}Rnna`K}J*7BKmQS`PpKrF8j92CFFPtCvm-~H&EaT&3ezt$Pc$F;URkkPVCnw)m zH0(SI&=IZ`u7gx8IQE{bcNa0p34- zynhxZnf1y3aX*y)aD3$cmAs#f`3UfS>Er#f*x#>YeaZ4{U*6C0zfLX z{_B4Kkj(q#`v~h##%Ge*9~m!_<@3V+%lL|n=dlp)uL0g)-S26V*}i=Lq5m?UEaPjo zC-)n&e7`5l_kXf{pC`-ni7ej_ipx*lFW(nfUhaov`TUaQ^GBBZDOv8fWchrPlm5x~ z9p=mUpDdq$vWyqV@;oQY_=POv39>xD$#Q=s%l(8b$AkNm9FO8SSzgX3%ggyJj+5o( z__BPG<$N+f$#OiHpJcf|FkkK`#c{H{JP)(==YC%+j+5nOe8BSmSH9eDSw6|78y5P* zPE@JGFa0ifzkkz$mG@r}Jbc;6;PK-+rN}Rw*dgdKyHRj|+xCus9=|RBRXQtPLADe~8I+6TWhzcH9#`#6^MHEn)Ik@m=+jQHNaeqxVc z^nq?E@(-6*4I5v!JGjaI9gw@1wy9d*-{v3o(O1EM51SX9H?C*uxOz*%TP9U^{B5O< zslAt0jW%xh-DmzSBfbktZrYi*cije;f6C&$LE9s)2=89JCwQ{O#)7r&I;VcWWk_^? z?Udu5x1E-{dvUF3U9(}1n>H_>`o7dtoj%^AQ!GE`+T(+-?r)o_`g@Ov^R)>FXkh{d_)`#Qdd}6#KjCTs-?baLmA7VaIm=DLv^@8~gFuwuj*ZG6_4>12e=HIb={@7pn ze3Iq*=kq1=$+CX3T)$+w{y87AeX?wyET13pj(7J4?>_l!l=tbvkp7&#EidRYzjJzO zrGajIlI!W#H#Y@sJAEF#v9M|(%g_1sudvBPFM6$4)f9Pp?LVW%yZ zI5)oQHhv$~`RKdok9!Vxy!hj1!^*ezipniNs@VA$wX#NV$1oE-d%@{0pMUN1-pzin zVsEvG?I&68U&;O!x4+8qXTJ1@{KKm@z2sq&-f>q&*S?%zuHSL>h6X!Qodf>G5qZsb z<nCG81B_>Y@pStU#wWt~L>M2($^8ud@iD#u z#@FRzegn*}kNHire;BV2`+bD{-m$EY`LaE7RG~_0jV>S5pLuk|^@#l-zs$Twke*N^tE`P_5ZBsv+Cc%NH`$y~#`k%sh1sE^K*lz;tM*;RD z$DPk>lse-3lY<@CmOF%7E!)ifDOa8>{UJ+#$a{*a}=b%%LwOX#C-XDlAo)%*B^T7Y3UalUgGj`UKirLPUF0G zeVo^6oYw))>yZ9oywaH82=nX8%Xot87ygIvKL!8Y`c87P zyj;J$U&bTFak9MJk62#rSH*F%{Q4>lBmPC;l=01+ze&dV8REQ6;klDuGL&|eK%lgQ2e8_Tq$jSH$>m|Z|p2B|a&STjgpC{=LS)PYv8UK*w^FYRV z9U%TlA^vdBBhLE(@kI*pMX}GHjIW&kBK{)F`ndne_Q>-2B+K^5I8W1vCqu-O5m~Nh zvRv4@k!5}Ck8F=D_fxWrAIUO4AGM*VsJRR0kb-SeMhIev^6GCtz|nPgcX=PNm%$@dG)Z|;4C^C{0aGU^NX*V)*A z-F_qU+27>(i17?CUun!&#C&-_S-xLn*Hi9&%lRwbr^xdCgpB8tvzP|KWVf--pOD zo=@h}KN(+V{m;eM+5Y9~C(GZ9SYEczeC+4B-}B0`xRN%PsaI?!uxWB_holpNq>_0Y)`&VaKD!2IbQPl;r((yCd>VjEc-{s z{H5^z9O3=h{T?O9FPTq&WOQ+GW|)$uQH$gk?#v^U+!;Y`FjOf{+>aWzfX|mc}kY= zJ7oEOLzeq1Sw631`FxY*{!EtpH(5TAj(FZWxPPjas=4b^RBk)yOSkVaY6P&HCVLLLE~ zQk|hwNL_H%)+xw}(B)MH=<-O1sb;FVY600o9jlI0$E%Kz9n}fyB6YDE4>?|4qOMif zsp}!HSCiEp>P|Hma;~~dy{tZT@-DR;*Gu5#Y6^6Lx&gWX=|;6sJ){;vE>aJxN7Q2V zDCDE+F||?^st|G&^jqp}=(mvG!L1Wkdous-!c2nJP^@r76od!KX4OD|52dTlh z{(?1F{R#b?dS1N%`GR^8S7ZGgTc+<>M&hNk42f$YP1>y9<9!Uz8`t7L%y!=#dRL6d)0l=PpfCtvyjiK zCviOm>q)f?dJn#_dJocWwOefk?^eG#Z->5I4ze3*EkYB6MaeWEv zbM*!EDe8393bK`Isd_`VR1J_?!EUMgz;31LLiYvNRrSGrR0mL9RS(ob4S`)Bc3s^; zwFlLQRb5ww-9a6$>nqwFR3+Hebq!rfRZ&${4P6;rNmT~b&^19dbrn!eT@SjGDy4=) zdeELK33(zkxdiA$Sb4DK!_HF`^og+Nf$~&kT|s{gYo2NVt1|3)>NVIEK@Y;3r!GYK zim>OY2Vhs!~^Xe^m=eLRUQ1EY6GgK4hOYS8(~+6eY9?)T7#;?YN+eLZllfy(Qcz^!fvR~g08LV zsIycpa81bCutz|TfJNCv*H%r`C+btk#?ap*HC9I?_m+*ypHop(ldRRhNP%Ku&~xgr>d}dLmL&-CDQQZ6I4g zAB)sVACJ@;b}QWsc5B@cx&^qSJ`vnZHwSgpCxBA0n(F}839y^%<6!%s4zQZ*d{{p0 z=DICxUw49T5ALMff!jj1hn?qiJLvXEople@Q}t3kkWPkmD)c%K?S7zju-=9B5A4|> z+JA#)!>1JOQN_tw*3-2`hGa;74O_E0rUO@%dG4OM5tz6C`44A3pGZiUrL zpQ&yJ(eAE$>6>BAfYlTBDInTCK&R*#st>F_uzP^|=-bpxHA~%wbUUnWdY0M*qTNMz z)0<#zhIJC`5+K@LK_&ENRT5S|*dB;>Uyui@6s%IP`+`d8;rc8+0&;{tTVJHd>q{Un zhQ8CxH5Wr(tml|H<_>cwy7#&y$N!Y-mJgT-|Fumzti9A zKlNYwZ^*y(Kf0kw8OncjeN*2wFbyHM=?3Np{iEKde?a<4mo{ZgSyLLRoGEWAn2L}U z&0(goIodRZYyy3pIUf2rq>i`(SRGAs=wnPX=wpytn9in)=?dA^oMeWZv&;y{5$0?& z(OhOOhrHZeVWya=W*X#;(C3@^(B~tK#WfDrSaT-yP;&z(T^F*N6lkqv_4Od(W8;Z;!@zT`T+Do{g7Uy z7a~23YZmxneT$i8*6W+iEs(dEb$XqCPp^l37g`%*-i3TuTVqWdqaj;EKc*koOY~z% zOL4sfYpGri{jz>VuYg>kSK_+RybO7PxzN0?KhPWW`$!++nhyR@-(;qnYUXfL9kRNq zfvXm*8m1=n7^G_;uQ8)>od#>PIS=|&r2dfoO&?tSVD&M5p=+BurY>Y%QxDf-SoO>! z&}~gS(;l+D>458DSRKqF=mBP+83Z}V490a8tik3==#gfWIS29_b1tr{VV!FxL4R(( zFkeD`0{w~E>f~3@pO{b07RW8;Ggu!(ZvxT&2($^-W>}kHe+1fWZqPUCsrm*z1^Pza z%baX(gx$-WZhDz1`gEirW{9~IJj7Iio`6&ZvWlr}Dj`*YtYWH~X?nW8Sx?h9L60}n zp~ss`pdZi+^n;Kip%>_L^=ptLp-1X-oE!x`O8@KRe(0X&U%el4ziw%cH7%i!MQUX{ zQ__@zECF2-aw+6e^MpCV9BGb%Yy^EIWC3J>xxw6OZZk6>XFxANngRJB^j7_~eoJpf z`U2Niu)fe=LcfV`-iCZzzk}-&SnueE%qRL&*bkXck(QW`VSlPWM%sewb68vSXV4Fr z&!HbMcR|lay35RleLJo%!MB^<&|jgI-sUT$Q_R!m8S^aUv*t-$Pr-W9EQ4Nyv!Er(nGZeFDCt{Q~F&^OQc(yr3^OFY3J@+83FN&0c)F57zsz zw)-Vry&LHdSZ|v>x;wt3{f2qlbT@zK9_9`6 z7VPUlwBH0>2kUxR8)07yqWvN0T3C}|O@{p;XtMd*d}F?a{MLMDelkCs?U38eFXmr! z0I!JuB5?z<)`RqH30vLPur(oT+FJGmd!p?G*~#YF!S-}J1agQSYDe4i>=?)~cC5X| zUTd#|yv|;4AG5DHdA(hX>rwDxdja$~dp`6yqzmosc8X^lsZ2dbh3Q?X)}XF1s7@8|ba}Yv`>=-`XbL z(Oy%p3DPlM8?UX`4zius-aFMh&Fc@@-y7hSw-szfTOR2!+YGWfWOLgBS6x^wY)9yw zrmn3AS7yAdiN=(N49~Ag9@z?5&W`K|W`v zh(Yxy^L5yUcF$yV-@b2Ui{N9#h-av45Gr%|GTZr2V)K z2k$r4?BTYgEoDnXmbPVZm4j8rmW8fw8`y@B4eb%Qs(SSyYj{J$w}EYs)WNocrtDzb z;HnI(jcp6v)>d&cAG#7O$||<1?Q8qlQz1{ar{SvZ^@Tj#tL{y}_@?;OkoVYoaV>#$uYDYPi7n+-^p?ObkS z4*i~e-+lnO9{Nk9^^oiBSN0dX!~P2StNjgE8SfX!(q0+wAN#L8VE?iEp-XuGLYMIN z+mc>AufEp+vVqqSS0h*ry(6HH@R~c>47!Ky;2j5foY&KKw>>OnPumMuORqcRKGV|M zXO8zM_d@>xxzGH8^ryMdyU4rPyU-g8J=VL#$??!*y>Z_8kmq|Bz#0QR8bteC&}dla z!8#B2xuEmB+Fl)Rq^*rq*Q@It39jpnut$0=V2`jZkj}Ehkw!p{uxH>J2I~xaCiF1d z%IoM2gWbyOgLJ0t1N&rLr@%Vd_J&s8DbUL6ZO^smAoYgqZO_Iv3f9?nBy=zDWUsf^ z3#lir&airVDd@iVrXOTK?-X1o!8*n31Kka&4`d&2kk{35S5S9cdEo9|59onNJs|U; zJ0aym=6gP_6fEBhTnj1a&PZLnV{J>@${vf<8rJd9uYhPD2YLn83Rr)_o&=)34>SqZ z)v!i*f7**dw9oQJco)MO534J3Eb(u? z9auwPmjls09aPSH$Cih64(zfZ+M_^aVO4-t0rn_R1@F}Uz3{83#jl-X$6q*l(m9up z8r`yW>o)jKO|_Kxhst$E$8u};CMo_CI3nSHZHWH~AnN4j|M$Cspr{*d=>ij7n3izk zgg-9`_}2*h*An>Gg#61G{^be(68oQVDrmcAGXD##`y4+k-+%h3(7)^9)$Y5B8(R7e zXFTm6Rd2H&mpP~paiespj2mC$7v$R$Zv3x*0>1yGvw~5NJsg b(!UU+r&NdCg~1Ku-Ut@Xty#>d6$Jke>$fp7 literal 0 HcmV?d00001 diff --git a/examples/runtime/meshes/tree.bin b/examples/runtime/meshes/tree.bin new file mode 100644 index 0000000000000000000000000000000000000000..05631ef7dd9a55160ed658c345527e8557e9d8cd GIT binary patch literal 100745 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

_YFa`TZq7dfR3%yui` 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 z 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 z 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 WTE`k_4ZNJR#_`7S-tiWF>v#u!z~4GP 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 Dp8jyw literal 0 HcmV?d00001 diff --git a/examples/runtime/meshes/tricube.bin b/examples/runtime/meshes/tricube.bin new file mode 100644 index 0000000000000000000000000000000000000000..81131b4864453eb24f3974731cbb66b7c346ae57 GIT binary patch literal 24175 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 b(!UU+r&NdCg~1Ku-Ut@Xty#>d6$Jke>$fp7 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_black.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_black.bin new file mode 100644 index 0000000000000000000000000000000000000000..d66f79aaf13a396a4adb9af04bfd5e8dfa958726 GIT binary patch literal 70 zcmZ<@_F!ZHg0lR~6ouTx%sd4RO|EJ#1%>pSc({2~Qgg|gIS6Ac4B104kv MLerY7mWzu40CJWPeEy{n~tKnmFIE1{g18(fr&radqC4n;()YUU1)Ud4Ab1UTjiUJs0gImxpAv z+SKtCk1yG;B+i>F9?wOca3&{YGlmormVU1d(+C;&rsZW5Gfccriy|#fYf`d`WjF%G z9FZm~x2&3bGi#L=tWn=S%&gic`I-o~?R=ZWt+5%9t(0g{6cuvP0<~(wXI`HBMo+d(QAcR2ppPfuPkYP#(_{gOUHe?wa zfMYl>ikd1~=O)5w$$%hjZxV!~QCA#74A6-IIss_?r)uc3Xb4p-hl*98Af$y?m{QdE zj$Y@nBR75h&Jx{&s05ur4|reA>!7>qYa77>k|jGr7b&h2;LwcW3so2rk=3orE3}82 zBvRee>!Rx`8&XSxW1HLop4UF(jeR+?9ro62!h{iqOE8nRWH+6Q1R3L_7FPejj zBdMx+#Ayjukf|(Ma;y&Y@-e4ZWyH>Z|65}_=d ztDco7E(!_hxtzRc9JwEmH*AXROR2qrCaP&VhOIk}eR%-A7b?hy zNSWnS#=8<1hl?K}w!ClRU9+iTy#Jun{{w&-GTs^>VgAf52tMR$1~hc0V>cMbw{FCT zCG^86!bd3Nb4OEm>|@Pmi8m8Hf<9nxGw>&c<0KTsF-*c+yhHiUo z#eM<0tNPTbs?+uP^~;Yx?f&_)-)8HwDny+WyF9Ie7qMT|Z^^1W{*mnbj|07aNS6_o z@@(_gd}^9>yHA>|+`jJ0=FfeTR`2hm<(I5Vm$dh{?e_k@bh*!y>T7wtx8)^UulIHO zV8^H8?=0Om4|aSl>x_`xfGrY)kR|!=wY3x?;%;eme<`t+h^J+lm$#hkk}4_c;AVIG zU49%KlIomoHv(*j;;=Ym>CyTa;bWVfWm#50bY-wbDw7>w^;3#3diMjASBwL7VEgWaRP(Z!2n9qgueAgA^MG&w+G{p|*E)WNO(r<9$ zSm?adSv=c-y`$S2^+?EUnWOq}FisL9;V@Vy*`A$El~QK@dP@+AK4{1&9N(M8L*Smp zE`H)e8zYk}S6sRLZ`kM=j&22)nOA2bK8eH~h+QekjrdJ&_HoU}FUQ`F`MnH-#txIi-{m24& z;8FlR;^(<;{LTzG`ho~GH4`%Hh?>9^N{JPtGsJnwu!^PKZU!^8JWS!CCqN;bs0vcA z6rg%k#ugVd%i#>0mt{>Aepkr6BUgeiCs7=REjd>NOXjBwRQhmR|64WAs%*M4oeVXu ziFRUe%(edPJVtUtQ9p!w22|x#QjcQ$!~GX)zx6^b^dySx)OVv(BzWTn;lM_^1E=Vl zJ}-*PTd8l0%SFBw#+eH}KzASk1xeF=%j2+HeebeCjz-kEzGT#R(%CW(GrOC6e5fQs zAAHC4FLN=2OHvi89##XZs3gm$CSD@@%+F!blF}tU*3H^Urew|3mH|tNezTkgB)!O{ z(n8I=lmh4&9I~}5kK#H>FbUAJeO*Y(tA=JIBL+R{=!k^Sxan%hG+D8y54S7NVhVbQ z8}x1;o2imAB=}rFI=+C#mi($O<69S|07_E8|9hj@`C(1e=aNG7-PuYHt`I{`H~Hc- zuEk&J&ZeS;0XG6EQ(OOFyhV??WY$4*S4GCy!PZY&F3o`ilp=D23|k`)-o4nRuRWj6k^6tU5oU%K4`MJ{bJ)A4s{);Q#;t literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb791864a71de53a13ab1a3e70a534a62ec0a6d5 GIT binary patch literal 5957 zcmcIo+iv4F5N%)c73`bbO%#*5*g~5Eiw%MnMbQP)cSCC{i2%uRCHcD8hyF)@q5s&K z5lNA<0=pK;84l0Pnc?u^@z?Jk{`v3U%pVs;{pYey z%EK#h`aUg_DX#r(KJQj$U9dV|fQ=J4Hx8*UPzst9T-@Dk*{y*ech`ePps`zu0j!1+AC*iqASajwCbApm z&~hi9Z=L5d!NB?JB?b)Cw%2%Kfs3#4Py_hGJ~Y^nP?l8HL5U$sz&|K47|_o~1N#w% zeQ7L(hTJQ#Yz^EESbL)kQ37hMyM@_0@T9$;c_B`l2L6D~# z4R^9xIF7TNNOHJqfT8``4dBz66*T~#Z0cp1K|{z z@*7LCDv>dM9w)Y%6E-VGjcYV7Mz(WAmls0wLNQw6IPNGKqoRwrF}j!=O5!|j$Ydk! zjXL&5#E+iCL?%7DCyi`^j3pHr>!pa^+aw963}<8)KD@ve??)A`sltbE=ZXNZj&KFT z>lIw#z-PqLIY5>UUCu2cJA*JbWjGZsbd+Wd=eDc7E^R!6HXY({s&}?JaWQ!~xQP%r zzp`kNbLnFfh|7X%!T{$6%XN|ALUW;o$|EkFT7xx5lFhL0P;i)B-WAaHcfb7P;0-|EXkn0@to?nRA8fG_iX|zz_h5a zf#`j+pq2v8&qsdXc@0dR(k<*3OJHuR{w{0Tc{F{eXw$q9N{up>?hV)t-cmQyZ_Ea| z#G}@3q2p0np;N%+N7wJH_0|UjKYW|rmgD3x^j?(ysH@WDTX?|7)9&)nVaGA9m*h%(d2WK^4YUdu^zud711TiIG zxDs{k;G*oUj)et@AW}~uI(3PmBCu|Z1?6HTYSjc`X>FLQK8^&?cVWVqiMuC~JWmuC%Anh9Y@j073z%$Y(d{V-o0|AO;OfpRXQxxFF z5LN^kV5DQfcqJrhd{t;zY0j+CXak?P`KFpnkxuk8^qTLJwq9$dt9NFCGlqw)Mz5xd z@h)m>eO#DRUA0wXV;dA>7vBf)NX8K$OpHf3j0lOLAK+hfUiTL$fxOebdbBSy0{6LQ t#(nM9ftMTsNcpZ8`aHlF7b74d699-x>*b4r#q#$WyiMin+tt-~{{uGU5g7mg literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..1431106b5ca250d114a28f243daaebc2ad3ac6b5 GIT binary patch literal 3057 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..5233d5bbd0c2cf6c3770a48311e32410c5ec2d47 GIT binary patch literal 5988 zcmcIo+iv4F5N%)c73`b5>nNr!zF?68+YQndMcYNwmp&P)O(z0m%a!EoA`ktK{zCt; zGsBBWS=PqbbQf@Jab|RQ=5U7O{lgDm-~avZKbuv$$crT_ljS-SMR3P9)AA{q=ewVi z_2Au=9^Z;t2t$>qisTn?NV4C=yleQoY$LkH{}5T0@476$FN9b*1`#00(#NOjeN~Co zCaKbV^{~#XUpJK~+AVSTE-l0iZGT*?&fAIECQFKs`R<&_UAkCoO3`8Qe)(rAR#k_^ z$Gl7t$qCqH0#itn?5ENhLe9<5Dc@!&alDYHS)S#moUD@~S(d?xwS3OsU2T)%kggsX z<$F8brUG(gJ&f2EM6jRbc`=X9j)Z4N;MHfMxi81}tPNR~O9%ri5+Fp%(>Yrv>56&1 zt4~)9QAbS5mk>@NsCv3cX5v9)QV3IkLC-@*JblQwqDUUa6o50lru`#V+Xeh1+<38hl9K_=>{D}K(;134j zWH1ciJNE}Y37omILojBYkO)a`fu2T;yc%X>F#jAd>9DYqGjxIsF~}@~It~;9Fm}y6 zGWU|z!FwzOR+!(P5?CxMxiA5kYkr1_B>jo7^!pv{G1jU+h~28bSI}SB)L;08 z`s-34HBU*ptwFBppPdZu>aZ22P7yR@yXtWx^g6e}#cJgIVmTU@m+G;hNQ)k&LJso= zXEO+%rtAiAh2y6Art9qmwBL}xwMyhN_(T4A0O zood*&hN){`R04UVL^tp!w3C>`*gv~_uH~e*ALMkt?IK24f1%NXYN0mvpDNiO^5E zQiuA@ah`fi1#nqW)koWeU_Z-C4>s#(&-Wk!+*}U$D2l^S@4DTvYSHVkxZumbib|ac z$~*VnYQ# ziuLw%kiS4>JBx-mJ*{K`at xH=jNb+h@9rLTkP8fXM);jQnsI@fa_8tR#=^jKeZ?rbH{u5xCi=JYQXX^&ig>F{=Oo literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..941093347b67ab9692c0e129318f4f26ef50a268 GIT binary patch literal 5945 zcmcIo&2Hm15N@w|3ic-NI*v$5{=p&zwi|3)6m1txFFhHmO(z0m%a!EcMGk$BzCz!z zGec4$Wm$=_=`P^dcF^~b;e{b#dE7FoVzMZ8?6G8cDjGc6wDdA9pG zUi#%HN}WO#(U<` z$BC2rCw@Eh`bwcGdpwoh^~iO}f_Yw39Q=P}8j=cQYP>gAZm*a&Mv~ObY=vi39Ij2ws1C~n4PC@G$fFC{W;9;L zHkWT4dKYv?wR7$h=M4PQS&MVc&4R8&yNTv2Yn~o8@yz-T_ZVwsAJ}eX-z)GhX!0-k zLjH9zkPc7fben@**FQTL+~r{_OcNqFknO6+E27u26&JIS^NZt0K2$&J(Xf^Q3%Df9S&jO((aB+=#M7wf)Ia!U={K6V-V+T6EsI<${X2 zF@)#ewO1R`_epat1L7W)Ril9C9P~#Bm1;NSKKtg@+(Ropz@qyL8;;P2kTxcKBw)*u z(5mSjDVI1lboDeguyWS;&8Y8oP#pJZ=ClFFD?--@BZCEWmKB~s*LJ}k?5Ml*`6!Hn zz_h)tSzT3(*#OKIf90ia%GI4hK<{V-pnXH2S96<0kkOI zDSve2ogbK^Z`d+{yN}6tbqS)AfG!+WeHI-0;W|J%+NaMDifTOwy#XnDa2xR`3QN4w zo>$$$Jx0%-3Dh-RQ#j!UkS1i#YIfgF-8(~f<6%O+qGD;LI&QrBgHeQOk0 zb;(8M-d;tYkI4YAz3Nv5l_KMj$gWbtu^Lf*0*+|NMkPdegbpIM&UX5?S_cYL1mtkd zjSypNuvzf{bT!fumRsv7roa;o^vKrR)0rDK1`nZooZV6FGf?TmMt5m5qHdRHSC4Sj zX*xFS!YHsXdd`D~I(yxr9U*aJM3vGkjOC)vQ&o%LsIsbT%Wa$T0ZWxf-ZdZKD32Tu zo~~GGJ&YmoVTXpl_RJ2qZh1LYzv(QYe4!+^?AlLqu3cxQX?Je9Sin)Jih}`rzqXzN zU90X?(`=zIR?!2~2V#kSjWg4BA(8tvxk*33QH|Y9&95T@eda~O#Bcguci06|kEWB>pF literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin new file mode 100644 index 0000000000000000000000000000000000000000..162c3db65a5849872ed81c22b3467c4dcae76a0a GIT binary patch literal 2930 zcma)8$&TYT5KV4@zk<0*J+@lZ;st{aFi2xCK@ens&fQRK*{wi}BgtD2=HK(GL`tOH zHez4IrCvS0TFB2YUw-^)_s^GonQf}N5KU6-^0W?~#eUhmChO|>N3!!jj`aE=T}4>R zv+Zm9scqA8pR`$3zU->@&wZQL@9(7L=d4awwD-5NyuB}7?enDmS{-j~dCoSQeUskV z@u~PbOUw4oj;~dd5tA#jMS>$_N&b6dErmF7zqG!+lvqoo)2hm=YfW}ZofJ)QwY!^_ zA4i9zK4;}tKX6pSHeJG%Fh=4@_#T2SM79x*vtKHr-dQ|73F-N+D+ompu|TxN4t|$72Tkb_Kpcym zcRGtlo3M9uJEMUKnXPhU9~{Gzm}$^v$qt|QZ~4ZXxhYN(}h<#ni?qa1&XR*T?h!#TL-Cau^&+&1WpCW zBYu9;h2NWj$B+=AmS#p~y-+hiA(gme^oH<<2&=Pn+s(twErdA`1_2bqnaUtFqywr? zWo&7&umBg>ys8??@SBayJ8~xYau&s5*oku?uw;GugGwK;&A)Z)tgE(9)7e<_nrRS2 zW6t$Q=RT7YlKL*yGpH(1Ni~Y?clWg?$(1R$l(@>30kzm9H!Uvn^3Y?>EhPWs# zuUmbWTrT3RI4)fD15^hBP*7{SZFwB`tM6Slh|z>9*O$y1UpiW*Gqbw6#>c8fXva68 ze|ZuMKvGws?BQ-;C6(m%sfCw_KI?N>cB1rwk9D#3EmLyO)RqCa5fkSXwziHNFT0O9>pB;kT$5@ z;cRA?lp)dQ1k&dVxY-h}nwc_$t*qGrCAGkzuDYgy=5I8@ZNB`B3+-3BZ7JPgz$r{U zrORAs)%it6v0f0UkH7I?VCx6n=**`C!~kbQo}?S|70)@&b!Xt3PZb;2TDins8`{Xw zJ9YJ}$-eB2Cz6e7FI~bm9migFK%Y6h>Xo9GIS`KOVd<&e*C}3ua6dc;q2d3y;gL+x zKXPJkG4-QqI`QXJesK`b=NNPsupch`X@KwUb%CsQF0kpM&@T~5YFxi1s6^Qr1v`rA zPr<(Y!fDYNRn~IEx0LJs<(MeCc0I`g`a2m;&_zoE>BQr!O8|wwZ>1<`>5&6is K>G#p-hyMU0wVP8L<~9nPulJLxijyC<4_2^(kFH@(tNPzp`jU2?qLiEG1ua=aO}0pDnT}L zjC6+Wy%Z2^o6dw2j;9khm?T$jL_P?;FpBUHvR7Px>P|fTX7`Gp5h6?P6QZ=5sY3-; z_QF15Up|W@s}sf1>$ux>+}Y$!+CX&dP2eoUByY%`*RiKhjS9@oK+z2;I*Y%_+5BmV z*YT$gw6ZrE*c&l}M>Z3g2o84|*%00++=V!bVYl|#AW93wgVA{d5IyYZ1c<~y3!)Gf zimy$APX>%Oj#C|#4#=quq(21GH-H=-qo|tJoK34|(Rwg+Z$PVmnpOft)4Ip2O`qiQZoA&I z`3r{p1t<7ZW!>b@Kbt=ZFP>SKJCXlMpz0({yRmPBoC6yR2Kf005Dn~1Da|>@2{f!Z zn?TEMN@+z@)lEgK8DEF=tpZFVC6hr~fT}lo6ne$|1wax%d_Zqv%fXhuoAo1W!f{;d>PUhz~#P;)%02J^CZv~`E> zhvN-*v97!cLf_YMwAHGVt<_4Xt^cYT)l#-SzC=H$ZHu%T{ertC>b$R=)5dJkk)O17 z2WvY!xPd>d@X4BQJpfuf=jpa@n!m-})v#X0H&q@ulli*8XHA@tfvm%3bs zqma{$?6~L#hgppt3DgzcLR`sq6%zM*LD;abD1kW_=1lIEA6(qia*Z z)kANK>IS<=UpxEgPgnuv^v(&KP_-xuWzVr^Y4thFf)QTX(KjZ~qq_uKhlnl9jTiuvaw!Ld+MvpRMf5O@gN+ qc9QMV!=8e%KM7<=SLPlFFEkwhDy^>!44f734WiBE>-pm1yZ-=G`d3H* literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..928ad3d19dec1a3b416143a7fce663428b2f1290 GIT binary patch literal 2942 zcmaJ@$&TAb5KV4@zM^v@#~KcsixwCYz{tR`5g0ZwxeFbM(lFqnkko4U-}9>2B)cU` z(uHJoZLeNc*T>gSzy7xU_tUOO*JYK9TIJg;se%`=ThwoARUW>mt^a=1$@j@Jf+$Nj zZ_S6MNs66n(z1Bnmd)2)lT<%HN#d8ZN|to?b5Yzrmn?Ugs=k$nTSs2f^?Fw)cTRlB z|4EagxpU%MS*H}qRj|223aQHesx487jC;}Qwn$kb!f9D%e#<@?cI zRj0Jr2%sH`{bHXc2kT>mk8O39WmzGj3xxuuR2e>(=}P1(ErjEazK?`hXQgVyvfL+? z+9V6O667QjO}>SV1!5BYvv&~BLVBpa@$GoRN5^vS;oFlPk#}${tuvHtoioXYKp^*9 zPw84X&TgSG^5Bkxa9!~o8W%dwG6P|ufH1|Qa5z6l6(?s?B~;A6-xQMXvO}a}$~SO) zZyt}~avr<*iFYkBteGWseOt|EHJ{a7mrVF$0?8E*c#b&jACw!{PCE__FhcK$WQWWx z5rO;Y3_=sd&?6MDq^6(9Fc$IQmI>)OLCJ_lE?YEpV$x}Op`)D`R^kgQy7jvb0-)#C zWT%VsnlfBSz$1Qt?j}aBhB$ON%}}P~xaZmwra%N9HN7JIq0Ty&_PA+bW?7iQ!T^Ad zaLNeuUMN8=(aIJUbIafyhnHnd{Jc2<(KW;bUrwVq3|nw60G8ZReF)Nr+4{e#aaLv1 zlXW`o;+l3w42+raPtN^Fj^Op(P)`U|8%8?sUGyOG^eFnCbaI6^ZV*oF zvFpPb`evw$#`5}(XvyWG-a5v)i#dbtKml@^X}2{G<6io+TM9LLq#F5>qc*B#Iy1YQ zdwi^?MCbU1=|7&u942Y75PNtUSfr9XcRS!Es?YfB7cD4#;p47ZgAM^{4rm$hDCzBx zv+gCJ!HK!3Ct`=ZlmgLlaH!U{Jc!F8K_x)X4!n?5*Df@p7%||{-Xa==#uZs({F4@2 zdUq{(5;MR<;i7kk+{`H{Lkgb>)ThM5mh9>;6Ej-D3t`zXIliZWVEKfaaF`8c6^?HOX5X&V#n94NC?RR*m(pK zk|_Pnw%CV9>ZO?_Wi3V468kYrvqPUOqdb}yM%0wotM`c3I?8v+;z{7WFV>TF5^t=R z0bZ8zcA91REa+STZ45=G436$tu@5JiW$i3OgitNO*C>UiESZUUlq`hPyZZY|h{rUG zO0iCg27;H zK_{|yDa!d07$>lsUg;+&g(mGT&)x3Ct>Hh<-SjGf3bzu2TMZ=vDVe57PQU_0aU&ew z?nH~7^OVO#oIjr<_&^_fO%_Yqd`(96@FPA}zG0y>E{dZPeUiX0lIZpL&q{;%fY*Tn z%hXV3g%;M(-2&~62BHP@UU!Gpqeh1C@)5yS%o=HRER$C$99T#O?gqP6MC*VIC<3pI ziPp=|%qZ@wlUnSlV&crQ5`l=frjTH z5gtPJe%~MW2NHjC7{$*m?0b-5HBq@sl;jA#h&U}`#m?8Uc~`U9=JT*JwRYgp_MU7r zTGou#xu`52wG@p=(M7BtUd(DO@j6zkGNJH}TX@IJ><(kbCb8R=j%{j>R1yi%N$&b= zlinWJCZjHReVgKSjIhvV`N=pbqaa2(*brU1is%Q0@;ueOn(B<^{ago_qg)rlV*6{W z_uk;U&3KPH2Kl*hsAsd@Z?oPvSl{Bk$Bo8TCokr{2Y-SLmz4Bc~))KxH2>g{xQRbEv63)uV~&3nKw-~n0va(ZlJNqUU!xT<*1wNqXV*^38e--YLOk} z*Uj(^WcM4g6QcK%opSNmR}Ycyr2@+T@h|w#uPY7rRc+;%OIbBYB>Nbj=``w8A5f;0 zcf;j&cIpm!zX;l*>b?r3>dW$Qk6@s zjC)C26i32E%A(38mPz)MB7FdA98qgleAdror~X?hu)SiBEt2MzX;wJ+0`45y!Co3H z`ra@IeZO*3tAR>;!jM#+iofzweP~x>muyO^lv<4j%iWuXpdsePm4&Amz`)i;aqEJ%nC^40@P19gf1B zhU9M1&2_zc>}~~tx}iYzJ;rT>%sLG?89z-cJhNP@sZ*cap&N6}7=ko(5?wiUZE|sE z(PmLkVHfF}fV#%WJ}Us*>ycb?In|<8S(ld9s-S}-e6pj5SUI4vi_sxs%WNasfr5xc z4maEwP;50eGalp>g~S`vfNfmv6zHoY$GScquH1?dJVfrXtmCGjt>dYRX{6s^1|sMN zIFEJM-Zd+uq{`T2SXD*Pk&XKJluqt(i}HnTRETsCU?x+MsR+z0po2jxb{TwBbHKPH zW9bjN_L%2xhStTwObY`xY>Tkp(t4q6mll{8=nNr!zF?68+YQndMcYNwmp&P)O(z0m%a!EoA`ktK{zCt; zGsBBWS=PqbGz)lbab|RQ=5U7O{lgDm-~avZKbuv$$crT_ljS-SMR3P9)AA{q=ewVi z_2Au=9^Z;t2t$>qisTn?NV4C=yleQoY$LkH{}5T0@476$FN9b*1`#00(#NOjeN~Co zCaKbV^{~#XUpJK~+AVSTE-l0iZGT*?&fAIECQFKs`R<&_UAkCoO3`8Qe)(rAR#k_^ z$Gl7t$qCqH0#itn?5ENhLe9<5Dc@!&alDYHS)S#moUD@~S(d?xwS3OsU2T)%kggsX z<$F8brUG(gJ&f2EM6jRbc`=X9j)Z4N;MHfMxi81}tPNR~O9%ri5+Fp%(>Yrv>56&1 zt4~)9QAbS5mk>@NsCv3cX5v9)QV3IkLC-@*JblQwqDUUa6o50lru`#V+Xeh1+<38hl9K_=>{D}K(;134j zWH1ciJNE}Y37omILojBYkO)a`fu2T;yc%X>F#jAd>9DYqGjxIsF~}@~It~;9Fm}y6 zGWU|z!FwzOR+!(P5?CxMxiA5kYk5!f5xC!$oU z^`+i5ahdarUk9j_EY%Jp1n_m0OL{Nj=B(*YI;b|8~YZLucrDcMFE>at;qYKrhJzl0Z zS8p8lE=Y!%IUkVbH2l+1OLNW1g0CaHiP9@;c8^+k`u&df7;9A@#BNpJE9ft5>M#64 z{dFmjnx`b))*x5)&rSw+b=V41rwAIdUG=yTdY#+gVl{Gpu^f%dOZC`Lq(zTXA%}Sb za#PNDV1!lAEu?DrIUCfcj%pEfwlH#orlHVR5M9(1UGzVSj&>+5qO+cBULsd?tuW7t zPBm;>!_>7eDuFywq8s=V+DS}e?4R8|*K$(Z4{|!+b`c}2ztHGGwNM-T&@P6&WpcxY z>f#n<4&AEAZJYDLGiaVA*YqEK0O-horp~Q1H}Y{03;PswsUO1r4Z4uC-DNiO^5E zQiuA@ah`fi1#nqW)koWeU_Z-C4>s#(&-Wk!+*}U$D2l^S@4DTvYSHVkxZumbib|ac z$~*VnYQ# ziuLw%kiS4>JBx-mJ*{K`atcF^~b;e{b#dE7FoVzMZ8?6G8cDjGc6wDdA9pG zUi#%HN}WO#(U<` z$BC2rCw@Eh`bwcGdpwoh^~iO}f_Yw39Q=P}8j=cQYP>gAZm*a&Mv~ObY=vi39Ij2ws1C~n4PC@G$fFC{W;9;L zHkWT4dKYv?wR7$h=M4PQS&MVc&4R8&yNTv2Yn~o8@yz-T_ZVwsAJ}eX-z)GhX!0-k zLjH9zkPc7fben@**FQTL+~r{_OcNqFknO6+E27u26&JIS^NZt0K2$&J(Xf^Q3%Df9S&jO((aB+=#M7wf)Ia!U={K6V-V+T6EsI<${X2 zF@)#ewO1R`_epat1L7W)Ril9C9P~#Bm1;NSKKtg@+(Ropz@qyL8;;P2kTxcKBw)*u z(5mSjDVI1lboDeguyWS;&8Y8oP#pJZ=ClFFD?--@BZCEWmKB~s*LJ}k?5Ml*`6!Hn zz_h)tSzT3(*#OKIf90ia%GI4hK<{V-pnXH2S96<0kkOI zDSve2ogbK^Z`d+{yN}6tbqS)AfG!+WeHI-0;W|J%+NaMDifTOwy#XnDa2xR`3QN4w zo>$$$Jx0%-3Dh-RQ#j!UkS1i#YIfgF-8(~f<6%O+qGD;LI&QrBgHeQOk0 zb;(8M-d;tYkI4YAz3Nv5l_KMj$gWbtu^Lf*0*+|NMkPdegbpIM&UX5?S_cYL1mtkd zjSypNuvzf{bT!fumRsv7roa;o^vKrR)0rDK1`nZooZV6FGf?TmMt5m5qHdRHSC4Sj zX}aFEE2F^5SZA23B5=r9^|9riOiaciQq(x>G{VmpZ@;m)7N{Iq(K}B*Bf*?yC_)2$ws7dvkg_^ zJ&N5teUZyJ|5g2OOXM%mm*H<}*(Uxj+^IJCA1VyvyiMbWM5)M97y>~U ztY5NsS*D_$%n-%%HqL(CWh!abB=KXAs0Hc%6h+td)M6LPNLp5ur$rpbmpR$WL~c^|ZHMcbZMJ)v z%<;GiW0?v4>_IG(V-T$ctL^9eK%rEX!=c!N3x`DA<4iaf z-I6^f)U(oT*Q|f_^$mwvUK*emA zC=4$Yt(;yx;hb6O!bsd#XzTU?0x1DkoKb%^9t_9oZZPc$w?Fbm({l(}G;Z;ZDsVxA)nG2b4>upY+ne++}i9*3bT$dsi&Jn!`Y7}J6I4T|46#lQ_t z3VlT@p=buJ;?`93sx})B@trJv5BlgRdI?hoohH6|FdM!!!%K7Ob| z4N60r5qIcI23n|BJxnbRQ+PN>rz4v1j4Izk0cwdhwzlTXayWzXB2FCxtLetl&&4-1 zVBE=YlgHBXjPuTK{i)IcLHl?WY!L$$VX zt}g-{Cxd{Ahn_w2!lk+zXq95P$cgqkrj=W{(xx=!V8x!^TuSc66zQR~Sh4XOHb8xX z&zBT);&D01uRifEUGNMv219aTT^NgTY#-(9rQssN*+Du=B2~Tvh?)RmC{~r^gs_qf zSv>R2of*wtR`FZ?0qODF*zYeAbEAaB ph&*S|pYf$|Hlm)zKR)+yJ{-}1B3}Jh(c2bn=!(v}@3qtU;$Qbq{^kGx literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf.bin new file mode 100644 index 0000000000000000000000000000000000000000..64e30a57c29e4e21f1c92753681df44519293490 GIT binary patch literal 4282 zcmaJ^$!_CD5KV4@zM^xZ#xliC8wNHo7-KMlAcz6yPS7%CGa*HVq^!l5f6uGxh24^6 z`y#UT?N#yH!}ni*+x+u=yDnCBQ;9aKHf7#KcVe5iFWFPQ`!m}Fp9h-$nlBR~RS(2i zte@|*Cac;rhO&5m>ArMbzTReCQLi61b@$h{%bWK(iF{Wy`I2~ltk;+M^5wS7n)`Zp ziRG?Xt+s9c0mql>vB=lm2ORfxTaYJb&Q=*hD6;YoH{uv6F{CF)${}SAi4wW2%lbSg z8%}C;#x386p9im5b3pP1$`Om#^tH%$&dUTZW%-tM-N2(0fi-HKm3UnjPom0-weW_6 zw}B9=vd%iOtY7mcd(Kms5@aM2UA2LZ6g~;_TihT5<*R=@5~-I2G4RnjLKG|Ec|GGn z+}w!J4~9eW2CAz+CIMq1h7!+-#NQvp*bUC#4W*D{+gq0CP#A_KaVcSy*Wxb}J?t22Vf_o%j=iKT49%(D2!F-K~tbB3(ZmYI@_Yz1X# zW@(w8XxXMb?RscXqN7x)WxcQpkG>&dotim`nMBQ@3a#V{!X7HD zVv+22FbhY+0vh@RC=chVgVZAhsD3J8Cl?`yVtfh%urKSDdi)~n`8)1~Ae<$WIF{)- zNpZ--)~gMnw*9Z^yr;S|jXED`&*oZ*m1XYsvG=hjd$je3t{&j3QW}Ol1s^LsI{eN9 z4bdl26?*LnsQn4G>cDwpSrLAKWr71urnLqGxs1Qn zr+Q!wEQgGnIw3K`iGFgF#y-IbIz-~3&OMC5J9Z9%Z|a>mEfYi{%x&Kp5v54GW|d=# z^eEE+#F4!jTR=5Qv8JnY%2>>i9?A{ow~x(6$}l1KxrKCmz;1H9cWtIs7!V0<5DWj8$t!r_tZb^MZ1eQ7$l5eyOx3@^txto{ z->cfg%x1Zgr)3&3+&V8<===s%eUo>-8kygR^|neQ z9w#R8BX^*Tp~>5A*`*P8l-;J0UH?ed|NKx!Zjo6`5*-(G1ohd`UfDH`xTcyi#ax>K zjHaqA#v??AK_G?XxfbFQnFsKI2%tL6p6af>jMqvM%d4zhmX;kti3E><^hhq&-AhsC zSYgdJ*DIbpJfx9YuY4A;@U2iD04UxN3H?3dVEdQCQkW@NlIW{{0L5zGo7Ef#46qVH$!%rdW+0fA3}o9dpkoqUnpiFTUM%#FJIGO6$qh-s zCL_0*&_jeSs;DucvNImgLdfB?y;0+Mz->>7)w-yB-swPJ8FFaU*j?xK5Bg$OM@zo% zwoQ(&N$NQBIf*T7?9o7sjsA!>1mEI`H}MzKAerXZ0gj%~pG1@S91rr=4&p^HjqqE3 zNML#O`G|bF2Q|RZanM_XdVM#UHuAVTFperXUd)0~fwIAUsj25nJGNJEOkXVh(I#(F z#ADsr&t>`z-&SAg!;fM4M&3uLOKgfRR~quftJs8w)kRx~KN=-UEQ(%e;HJr(X zWwB!K_H`QLs}E+a^& xnum_13)) { + break; + }; + y_18 = -(ynum_12); + while (true) { + if ((y_18 > ynum_12)) { + break; + }; + vec2 tmpvar_19; + tmpvar_19.x = float(x_11); + tmpvar_19.y = float(y_18); + vec4 tmpvar_20; + tmpvar_20.zw = vec2(0.0, 0.0); + tmpvar_20.xy = ((tmpvar_19 * _pcfParams_9.zw) * _texelSize_10); + vec4 tmpvar_21; + tmpvar_21 = (_shadowCoord_7 + tmpvar_20); + result_14 = (result_14 + float((dot (texture2D (u_shadowMap0, (tmpvar_21.xy / tmpvar_21.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_21.z - _bias_8) / tmpvar_21.w)))); + y_18 = (y_18 + 1); + }; + x_11 = (x_11 + 1); + }; + visibility_1 = (result_14 / max (tmpvar_16, 1.0)); + } else { + if ((v_position.z < u_csmFarDistances.y)) { + vec2 tmpvar_22; + tmpvar_22 = (v_texcoord2.xy / v_texcoord2.w); + float tmpvar_23; + tmpvar_23 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_22, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_22, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_24; + tmpvar_24.x = tmpvar_23; + tmpvar_24.y = tmpvar_23; + tmpvar_24.z = -(tmpvar_23); + colorCoverage_2 = tmpvar_24; + vec4 _shadowCoord_25; + _shadowCoord_25 = v_texcoord2; + float _bias_26; + _bias_26 = u_params1.x; + vec4 _pcfParams_27; + _pcfParams_27 = u_smSamplingParams; + vec2 _texelSize_28; + _texelSize_28 = (u_params2.zz / 2.0); + int x_29; + int ynum_30; + int xnum_31; + float result_32; + vec2 tmpvar_33; + tmpvar_33 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_34; + tmpvar_34 = (tmpvar_33.x * tmpvar_33.y); + result_32 = 0.0; + int tmpvar_35; + tmpvar_35 = int(u_smSamplingParams.x); + xnum_31 = tmpvar_35; + ynum_30 = int(u_smSamplingParams.y); + x_29 = -(tmpvar_35); + while (true) { + int y_36; + if ((x_29 > xnum_31)) { + break; + }; + y_36 = -(ynum_30); + while (true) { + if ((y_36 > ynum_30)) { + break; + }; + vec2 tmpvar_37; + tmpvar_37.x = float(x_29); + tmpvar_37.y = float(y_36); + vec4 tmpvar_38; + tmpvar_38.zw = vec2(0.0, 0.0); + tmpvar_38.xy = ((tmpvar_37 * _pcfParams_27.zw) * _texelSize_28); + vec4 tmpvar_39; + tmpvar_39 = (_shadowCoord_25 + tmpvar_38); + result_32 = (result_32 + float((dot (texture2D (u_shadowMap1, (tmpvar_39.xy / tmpvar_39.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_39.z - _bias_26) / tmpvar_39.w)))); + y_36 = (y_36 + 1); + }; + x_29 = (x_29 + 1); + }; + visibility_1 = (result_32 / max (tmpvar_34, 1.0)); + } else { + if ((v_position.z < u_csmFarDistances.z)) { + vec2 tmpvar_40; + tmpvar_40 = (v_texcoord3.xy / v_texcoord3.w); + float tmpvar_41; + tmpvar_41 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_40, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_40, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_42; + tmpvar_42.x = -(tmpvar_41); + tmpvar_42.y = -(tmpvar_41); + tmpvar_42.z = tmpvar_41; + colorCoverage_2 = tmpvar_42; + vec4 _shadowCoord_43; + _shadowCoord_43 = v_texcoord3; + float _bias_44; + _bias_44 = u_params1.x; + vec4 _pcfParams_45; + _pcfParams_45 = u_smSamplingParams; + vec2 _texelSize_46; + _texelSize_46 = (u_params2.zz / 3.0); + int x_47; + int ynum_48; + int xnum_49; + float result_50; + vec2 tmpvar_51; + tmpvar_51 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_52; + tmpvar_52 = (tmpvar_51.x * tmpvar_51.y); + result_50 = 0.0; + int tmpvar_53; + tmpvar_53 = int(u_smSamplingParams.x); + xnum_49 = tmpvar_53; + ynum_48 = int(u_smSamplingParams.y); + x_47 = -(tmpvar_53); + while (true) { + int y_54; + if ((x_47 > xnum_49)) { + break; + }; + y_54 = -(ynum_48); + while (true) { + if ((y_54 > ynum_48)) { + break; + }; + vec2 tmpvar_55; + tmpvar_55.x = float(x_47); + tmpvar_55.y = float(y_54); + vec4 tmpvar_56; + tmpvar_56.zw = vec2(0.0, 0.0); + tmpvar_56.xy = ((tmpvar_55 * _pcfParams_45.zw) * _texelSize_46); + vec4 tmpvar_57; + tmpvar_57 = (_shadowCoord_43 + tmpvar_56); + result_50 = (result_50 + float((dot (texture2D (u_shadowMap2, (tmpvar_57.xy / tmpvar_57.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_57.z - _bias_44) / tmpvar_57.w)))); + y_54 = (y_54 + 1); + }; + x_47 = (x_47 + 1); + }; + visibility_1 = (result_50 / max (tmpvar_52, 1.0)); + } else { + vec2 tmpvar_58; + tmpvar_58 = (v_texcoord4.xy / v_texcoord4.w); + float tmpvar_59; + tmpvar_59 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_58, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_58, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_60; + tmpvar_60.x = tmpvar_59; + tmpvar_60.y = -(tmpvar_59); + tmpvar_60.z = -(tmpvar_59); + colorCoverage_2 = tmpvar_60; + vec4 _shadowCoord_61; + _shadowCoord_61 = v_texcoord4; + float _bias_62; + _bias_62 = u_params1.x; + vec4 _pcfParams_63; + _pcfParams_63 = u_smSamplingParams; + vec2 _texelSize_64; + _texelSize_64 = (u_params2.zz / 4.0); + int x_65; + int ynum_66; + int xnum_67; + float result_68; + vec2 tmpvar_69; + tmpvar_69 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_70; + tmpvar_70 = (tmpvar_69.x * tmpvar_69.y); + result_68 = 0.0; + int tmpvar_71; + tmpvar_71 = int(u_smSamplingParams.x); + xnum_67 = tmpvar_71; + ynum_66 = int(u_smSamplingParams.y); + x_65 = -(tmpvar_71); + while (true) { + int y_72; + if ((x_65 > xnum_67)) { + break; + }; + y_72 = -(ynum_66); + while (true) { + if ((y_72 > ynum_66)) { + break; + }; + vec2 tmpvar_73; + tmpvar_73.x = float(x_65); + tmpvar_73.y = float(y_72); + vec4 tmpvar_74; + tmpvar_74.zw = vec2(0.0, 0.0); + tmpvar_74.xy = ((tmpvar_73 * _pcfParams_63.zw) * _texelSize_64); + vec4 tmpvar_75; + tmpvar_75 = (_shadowCoord_61 + tmpvar_74); + result_68 = (result_68 + float((dot (texture2D (u_shadowMap3, (tmpvar_75.xy / tmpvar_75.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_75.z - _bias_62) / tmpvar_75.w)))); + y_72 = (y_72 + 1); + }; + x_65 = (x_65 + 1); + }; + visibility_1 = (result_68 / max (tmpvar_70, 1.0)); + }; + }; + }; + vec3 tmpvar_76; + tmpvar_76 = -(normalize(v_view)); + vec3 tmpvar_77; + float tmpvar_78; + tmpvar_77 = -(normalize(u_lightPosition.xyz)); + tmpvar_78 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_79; + tmpvar_79 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_80; + tmpvar_80 = normalize(tmpvar_79); + tmpvar_77 = tmpvar_80; + float tmpvar_81; + tmpvar_81 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_82; + tmpvar_82 = sqrt(dot (tmpvar_79, tmpvar_79)); + tmpvar_78 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_82)) + ((u_lightAttenuationSpotOuter.z * tmpvar_82) * tmpvar_82)))) * mix (clamp (((max (0.0, dot (-(tmpvar_80), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_81) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_81)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_83; + tmpvar_83 = dot (v_normal, tmpvar_77); + vec2 tmpvar_84; + tmpvar_84.x = tmpvar_83; + tmpvar_84.y = (((float((tmpvar_83 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_83) * v_normal) - tmpvar_77), tmpvar_76)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_85; + tmpvar_85 = (max (tmpvar_84, 0.0) * tmpvar_78); + float tmpvar_86; + tmpvar_86 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_85.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_85.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_86) * tmpvar_86)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..c85ba2e1728c4e596780d56d48593c83d6527684 GIT binary patch literal 4443 zcmaJ^$!_CD5KV4@zoK)aywGeeS}?GI!3+j72!a@J?gTB_p7G=Yu%Ua`;>J3wQ9>b(f(L2Pt%q2bzQV~ z&E^!z*XrqM-IX6ud|o_M<+A^P;;!i`vgF9vMFAJ8qW;78H~}Q~>e1u!t_tspfSfmV zbBxJ~L5+{7)w%q1_FA+%fG-e^M7-v&Rk`sFQyi-B&6}o$MF$K^#JZ?)+*FTZQB+G2 zjLzQ9gm|i(q8Ib#wQP&$GKVTbN@CG3R*;dyCSiYz8+f2?4flIZo0|K?p-sXKsAY&$ zviwQ7-Qh6sOr^7H-}-Pf^0@Y3@_CL_rw&7^)Ep-*&ONd{nHao7hl}@38gK$Rl;z|Sze^4xU!E;+uuKoQ|AT}C&0_>8*5k%oE zyM)SFHo~8{P=RC4y6n2sY!S0X%r+X4i0G2yG7{(boifrt2^LN*tvGXV%EB!SA3XQ2 zD4tiraOnmv3n_3%x2~SCBW%pXDp9L_i7cTkAF)K2XF@zGZMC&iN6O?t$~x!HWC|RB z?v+Tx3woWU97w<;ey23|*>!6NV45dygY4g zm2<6M>TY2)pOAffBW93E4Tdt6yMmutZikl%5`ZCk%@r&*_7hXIc8o~3K}&RKCx<~n!^|2eon1iVCizg^#o7VVJaj+J_Gn6a|B+CsG z$Habs2AAkehffThPFv-#0}}IVR8Dg%QwT`V*d`vUS-N?t>Jme%U6*FAGt_ya=P~aB z%zP`f1?UWK@Pz&zu&ez`Zs{f|#15RSN880H3h|B}U_lEbGu)csIdef{EiKOs~ z0#c||cxi9NcouNl6R@U4DSW|U1z*_f*otwpE*L({rmWYLa@()l63<=AIQ!nk*tPo5 zT`;bPPmBcK!P6iMXX7Xxmsio0#%dO4(d0hq_P9$sGZ|UEVwHW8l0Er_IOGs?yOBxa13jjT14TGvs^#d`8PcNzR=5*`|yq0 zh!B^=23^fC;KZ}nx`tUrV~1b0sx4!A8*V4)DcV&zRTIh~#h@MHbd6^z7B5X5Gs3)z zF!*Fhn$bTQa`+2)L#<}b*dqHJqv$!0uIr%Ou40&&hRHaU8O09_CLXCX(UO!lA?L-! R(eTjP09<}O{5(7R<$o#&T$lg= literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin new file mode 100644 index 000000000..881bf86a3 --- /dev/null +++ b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin @@ -0,0 +1,321 @@ +FSHF­œuniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_csmFarDistances; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec4 v_position; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = u_params2.zz; + visibility_1 = 1.0; + if ((v_position.z < u_csmFarDistances.x)) { + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord1.xy / v_texcoord1.w); + float tmpvar_5; + tmpvar_5 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_4, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_4, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_6; + tmpvar_6.x = -(tmpvar_5); + tmpvar_6.y = tmpvar_5; + tmpvar_6.z = -(tmpvar_5); + colorCoverage_2 = tmpvar_6; + vec4 tmpvar_7; + tmpvar_7.w = 1.0; + tmpvar_7.xy = (v_texcoord1.xy / v_texcoord1.w); + tmpvar_7.z = v_texcoord1.z; + vec4 tmpvar_8; + tmpvar_8.xy = u_smSamplingParams.xy; + tmpvar_8.zw = (u_smSamplingParams.zw / v_texcoord1.w); + vec4 _shadowCoord_9; + _shadowCoord_9 = tmpvar_7; + float _bias_10; + _bias_10 = u_params1.x; + vec4 _pcfParams_11; + _pcfParams_11 = tmpvar_8; + vec2 _texelSize_12; + _texelSize_12 = tmpvar_3; + int x_13; + int ynum_14; + int xnum_15; + float result_16; + vec2 tmpvar_17; + tmpvar_17 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_18; + tmpvar_18 = (tmpvar_17.x * tmpvar_17.y); + result_16 = 0.0; + int tmpvar_19; + tmpvar_19 = int(u_smSamplingParams.x); + xnum_15 = tmpvar_19; + ynum_14 = int(u_smSamplingParams.y); + x_13 = -(tmpvar_19); + while (true) { + int y_20; + if ((x_13 > xnum_15)) { + break; + }; + y_20 = -(ynum_14); + while (true) { + if ((y_20 > ynum_14)) { + break; + }; + vec2 tmpvar_21; + tmpvar_21.x = float(x_13); + tmpvar_21.y = float(y_20); + vec4 tmpvar_22; + tmpvar_22.zw = vec2(0.0, 0.0); + tmpvar_22.xy = ((tmpvar_21 * _pcfParams_11.zw) * _texelSize_12); + vec4 tmpvar_23; + tmpvar_23 = (_shadowCoord_9 + tmpvar_22); + result_16 = (result_16 + float((dot (texture2D (u_shadowMap0, (tmpvar_23.xy / tmpvar_23.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_23.z - _bias_10) / tmpvar_23.w)))); + y_20 = (y_20 + 1); + }; + x_13 = (x_13 + 1); + }; + visibility_1 = (result_16 / max (tmpvar_18, 1.0)); + } else { + if ((v_position.z < u_csmFarDistances.y)) { + vec2 tmpvar_24; + tmpvar_24 = (v_texcoord2.xy / v_texcoord2.w); + float tmpvar_25; + tmpvar_25 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_24, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_24, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_26; + tmpvar_26.x = tmpvar_25; + tmpvar_26.y = tmpvar_25; + tmpvar_26.z = -(tmpvar_25); + colorCoverage_2 = tmpvar_26; + vec4 tmpvar_27; + tmpvar_27.w = 1.0; + tmpvar_27.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_27.z = v_texcoord2.z; + vec4 tmpvar_28; + tmpvar_28.xy = u_smSamplingParams.xy; + tmpvar_28.zw = (u_smSamplingParams.zw / v_texcoord2.w); + vec4 _shadowCoord_29; + _shadowCoord_29 = tmpvar_27; + float _bias_30; + _bias_30 = u_params1.x; + vec4 _pcfParams_31; + _pcfParams_31 = tmpvar_28; + vec2 _texelSize_32; + _texelSize_32 = (u_params2.zz / 2.0); + int x_33; + int ynum_34; + int xnum_35; + float result_36; + vec2 tmpvar_37; + tmpvar_37 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_38; + tmpvar_38 = (tmpvar_37.x * tmpvar_37.y); + result_36 = 0.0; + int tmpvar_39; + tmpvar_39 = int(u_smSamplingParams.x); + xnum_35 = tmpvar_39; + ynum_34 = int(u_smSamplingParams.y); + x_33 = -(tmpvar_39); + while (true) { + int y_40; + if ((x_33 > xnum_35)) { + break; + }; + y_40 = -(ynum_34); + while (true) { + if ((y_40 > ynum_34)) { + break; + }; + vec2 tmpvar_41; + tmpvar_41.x = float(x_33); + tmpvar_41.y = float(y_40); + vec4 tmpvar_42; + tmpvar_42.zw = vec2(0.0, 0.0); + tmpvar_42.xy = ((tmpvar_41 * _pcfParams_31.zw) * _texelSize_32); + vec4 tmpvar_43; + tmpvar_43 = (_shadowCoord_29 + tmpvar_42); + result_36 = (result_36 + float((dot (texture2D (u_shadowMap1, (tmpvar_43.xy / tmpvar_43.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_43.z - _bias_30) / tmpvar_43.w)))); + y_40 = (y_40 + 1); + }; + x_33 = (x_33 + 1); + }; + visibility_1 = (result_36 / max (tmpvar_38, 1.0)); + } else { + if ((v_position.z < u_csmFarDistances.z)) { + vec2 tmpvar_44; + tmpvar_44 = (v_texcoord3.xy / v_texcoord3.w); + float tmpvar_45; + tmpvar_45 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_44, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_44, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_46; + tmpvar_46.x = -(tmpvar_45); + tmpvar_46.y = -(tmpvar_45); + tmpvar_46.z = tmpvar_45; + colorCoverage_2 = tmpvar_46; + vec4 tmpvar_47; + tmpvar_47.w = 1.0; + tmpvar_47.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_47.z = v_texcoord3.z; + vec4 tmpvar_48; + tmpvar_48.xy = u_smSamplingParams.xy; + tmpvar_48.zw = (u_smSamplingParams.zw / v_texcoord3.w); + vec4 _shadowCoord_49; + _shadowCoord_49 = tmpvar_47; + float _bias_50; + _bias_50 = u_params1.x; + vec4 _pcfParams_51; + _pcfParams_51 = tmpvar_48; + vec2 _texelSize_52; + _texelSize_52 = (u_params2.zz / 3.0); + int x_53; + int ynum_54; + int xnum_55; + float result_56; + vec2 tmpvar_57; + tmpvar_57 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_58; + tmpvar_58 = (tmpvar_57.x * tmpvar_57.y); + result_56 = 0.0; + int tmpvar_59; + tmpvar_59 = int(u_smSamplingParams.x); + xnum_55 = tmpvar_59; + ynum_54 = int(u_smSamplingParams.y); + x_53 = -(tmpvar_59); + while (true) { + int y_60; + if ((x_53 > xnum_55)) { + break; + }; + y_60 = -(ynum_54); + while (true) { + if ((y_60 > ynum_54)) { + break; + }; + vec2 tmpvar_61; + tmpvar_61.x = float(x_53); + tmpvar_61.y = float(y_60); + vec4 tmpvar_62; + tmpvar_62.zw = vec2(0.0, 0.0); + tmpvar_62.xy = ((tmpvar_61 * _pcfParams_51.zw) * _texelSize_52); + vec4 tmpvar_63; + tmpvar_63 = (_shadowCoord_49 + tmpvar_62); + result_56 = (result_56 + float((dot (texture2D (u_shadowMap2, (tmpvar_63.xy / tmpvar_63.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_63.z - _bias_50) / tmpvar_63.w)))); + y_60 = (y_60 + 1); + }; + x_53 = (x_53 + 1); + }; + visibility_1 = (result_56 / max (tmpvar_58, 1.0)); + } else { + vec2 tmpvar_64; + tmpvar_64 = (v_texcoord4.xy / v_texcoord4.w); + float tmpvar_65; + tmpvar_65 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_64, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_64, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_66; + tmpvar_66.x = tmpvar_65; + tmpvar_66.y = -(tmpvar_65); + tmpvar_66.z = -(tmpvar_65); + colorCoverage_2 = tmpvar_66; + vec4 tmpvar_67; + tmpvar_67.w = 1.0; + tmpvar_67.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_67.z = v_texcoord4.z; + vec4 tmpvar_68; + tmpvar_68.xy = u_smSamplingParams.xy; + tmpvar_68.zw = (u_smSamplingParams.zw / v_texcoord4.w); + vec4 _shadowCoord_69; + _shadowCoord_69 = tmpvar_67; + float _bias_70; + _bias_70 = u_params1.x; + vec4 _pcfParams_71; + _pcfParams_71 = tmpvar_68; + vec2 _texelSize_72; + _texelSize_72 = (u_params2.zz / 4.0); + int x_73; + int ynum_74; + int xnum_75; + float result_76; + vec2 tmpvar_77; + tmpvar_77 = ((u_smSamplingParams.xy * 2.0) + 1.0); + float tmpvar_78; + tmpvar_78 = (tmpvar_77.x * tmpvar_77.y); + result_76 = 0.0; + int tmpvar_79; + tmpvar_79 = int(u_smSamplingParams.x); + xnum_75 = tmpvar_79; + ynum_74 = int(u_smSamplingParams.y); + x_73 = -(tmpvar_79); + while (true) { + int y_80; + if ((x_73 > xnum_75)) { + break; + }; + y_80 = -(ynum_74); + while (true) { + if ((y_80 > ynum_74)) { + break; + }; + vec2 tmpvar_81; + tmpvar_81.x = float(x_73); + tmpvar_81.y = float(y_80); + vec4 tmpvar_82; + tmpvar_82.zw = vec2(0.0, 0.0); + tmpvar_82.xy = ((tmpvar_81 * _pcfParams_71.zw) * _texelSize_72); + vec4 tmpvar_83; + tmpvar_83 = (_shadowCoord_69 + tmpvar_82); + result_76 = (result_76 + float((dot (texture2D (u_shadowMap3, (tmpvar_83.xy / tmpvar_83.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_83.z - _bias_70) / tmpvar_83.w)))); + y_80 = (y_80 + 1); + }; + x_73 = (x_73 + 1); + }; + visibility_1 = (result_76 / max (tmpvar_78, 1.0)); + }; + }; + }; + vec3 tmpvar_84; + tmpvar_84 = -(normalize(v_view)); + vec3 tmpvar_85; + float tmpvar_86; + tmpvar_85 = -(normalize(u_lightPosition.xyz)); + tmpvar_86 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_87; + tmpvar_87 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_88; + tmpvar_88 = normalize(tmpvar_87); + tmpvar_85 = tmpvar_88; + float tmpvar_89; + tmpvar_89 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_90; + tmpvar_90 = sqrt(dot (tmpvar_87, tmpvar_87)); + tmpvar_86 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_90)) + ((u_lightAttenuationSpotOuter.z * tmpvar_90) * tmpvar_90)))) * mix (clamp (((max (0.0, dot (-(tmpvar_88), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_89) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_89)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_91; + tmpvar_91 = dot (v_normal, tmpvar_85); + vec2 tmpvar_92; + tmpvar_92.x = tmpvar_91; + tmpvar_92.y = (((float((tmpvar_91 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_91) * v_normal) - tmpvar_85), tmpvar_84)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_93; + tmpvar_93 = (max (tmpvar_92, 0.0) * tmpvar_86); + float tmpvar_94; + tmpvar_94 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_93.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_93.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_94) * tmpvar_94)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..8248ab63bd4ad6ea7dbcd8b14656c8a125f0a46d GIT binary patch literal 7385 zcmcIo*>2lL6m4Jq71K8=(Z=CW3jzm76QnJQwn5#OJ`s#OvWZfnN>SDlzhqc{j#fM*}W5&-(;m+;NBnB>+}2MVwb1oyJCNC%bRSu z+->EB9j{jJGr6uV?08pfGt{J|>?#ElvNZqEw-|$Bm)ZfbOKFSYqR5N3Pd4OK-rB9c zhcB)k(((w-X9S3cbLxM?DZ8vbML9Wci$t|WlI(W&F$d-YpX=B$3B2gjNRqQTZq|f z#5uYiv_sGa6e)mcwJRm$I|y2x@cJyM;Tr-K8##CmhoA-c1V9wT!}(+^CUP*I^;tNK zc|4oJOWbGU;dmU)#}f|E;c(njiZdT}sEj=)1VVxvH)h1>SL@jrwtq@7MX+>(Gx3;A zkjWy4>qi=S$0)db&>OObv`86HQ?D4)Mh37vIR~5aZk;Y#id6n#6u>%xK zn@)s*JS$LGgna>w@g~OjXJPCT$|$8Fs4%9+do$&Bi?kVnq()|^dWOWq+T48AVVNVN zC!r0_(G$^TC?1D4A8#QvH|Pv&c{nD_8TH$%4(6K10<8zTxyCDNR*xEZM!ttV#yZgl zygSkN1@IR&@fUq2{w^Vqil=hAi@{LmKQ|bmkHbziO^Bc%yIC)^K(AxVpNz&Zd@>v@ z$z$=@K&0ayjlvM@2F-0c3%LbWZCgay@KbvbpN6aBptFfFwAwTf`UOBInxGT^Bj~6@ z=>VPc-S|cLpzBog9O!hxb}>v<`$;J<6dH8n;hZ{&d5rb*a?N#!bo)U>=gThY2vrAhdMyopY3ZK1+^Z8-Y6OO;9LY0g%w@_oG0DG z+;=%p0~+f>(%T7{C(WI6Xxf1(78{exZrZb#*K7_vG1DVlDb@KXaC05UTt_Z4_Z)Tf zLzC-lf6v`q$7gO<=N{J?<#WJ@R@pdlit3Se5V1|M*VBC+C?Mf*hHGq0F}6lGHy$B4 z$gl-#`|j1%7CQi-BVNzjD0Zk1F0T?nC?a{avy7#tvM@*qo-Grhwv+&Bt~ zqm=;1*`7NQ>QGpXz%)QVx(+orL=+bL0()Q)aM9{26rv8w-r7ro=(ShQQ!7-UBVmut zPaTBKI>NTY#*H!MRh2nWZ7tvSlOm?KJq>RDrE&P_D4@ z&@81gGxTuvY6v++n;LOdq@1l#Z0k6U)J42;47c~aG?1bqBF0}-r1=C#6T~(LI#kSz yVn?j@rqiQdR30`QG!?^WBElFi&Yes)b84HIVT7C;WD1JsG&~|SQhdC+`s!a|1k4ox literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..9473f5f3d8275f9643b87d71a6c595cf269b349a GIT binary patch literal 7153 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 PlaT`w$SwNb>;3RQ@!*bM literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin new file mode 100644 index 000000000..ec100c779 --- /dev/null +++ b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin @@ -0,0 +1,194 @@ +FSHF­œuniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_csmFarDistances; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec4 v_position; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + visibility_1 = 1.0; + if ((v_position.z < u_csmFarDistances.x)) { + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + float tmpvar_4; + tmpvar_4 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_3, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_3, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_5; + tmpvar_5.x = -(tmpvar_4); + tmpvar_5.y = tmpvar_4; + tmpvar_5.z = -(tmpvar_4); + colorCoverage_2 = tmpvar_5; + float tmpvar_6; + float tmpvar_7; + tmpvar_7 = (((v_texcoord1.z - u_params1.x) / v_texcoord1.w) * u_params1.w); + vec2 tmpvar_8; + tmpvar_8 = (v_texcoord1.xy / v_texcoord1.w); + vec4 tmpvar_9; + tmpvar_9 = texture2D (u_shadowMap0, tmpvar_8); + vec2 tmpvar_10; + tmpvar_10.x = dot (tmpvar_9.xy, vec2(0.00390625, 1.0)); + tmpvar_10.y = dot (tmpvar_9.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_11; + tmpvar_11 = (tmpvar_10 * u_params1.w); + if ((tmpvar_7 < tmpvar_11.x)) { + tmpvar_6 = 1.0; + } else { + float tmpvar_12; + tmpvar_12 = max ((tmpvar_11.y - (tmpvar_11.x * tmpvar_11.x)), u_params1.z); + float tmpvar_13; + tmpvar_13 = (tmpvar_7 - tmpvar_11.x); + tmpvar_6 = mix ((tmpvar_12 / (tmpvar_12 + (tmpvar_13 * tmpvar_13))), 1.0, float(any(greaterThan (tmpvar_8, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_6; + } else { + if ((v_position.z < u_csmFarDistances.y)) { + vec2 tmpvar_14; + tmpvar_14 = (v_texcoord2.xy / v_texcoord2.w); + float tmpvar_15; + tmpvar_15 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_14, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_14, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_16; + tmpvar_16.x = tmpvar_15; + tmpvar_16.y = tmpvar_15; + tmpvar_16.z = -(tmpvar_15); + colorCoverage_2 = tmpvar_16; + float tmpvar_17; + float tmpvar_18; + tmpvar_18 = (((v_texcoord2.z - u_params1.x) / v_texcoord2.w) * u_params1.w); + vec2 tmpvar_19; + tmpvar_19 = (v_texcoord2.xy / v_texcoord2.w); + vec4 tmpvar_20; + tmpvar_20 = texture2D (u_shadowMap1, tmpvar_19); + vec2 tmpvar_21; + tmpvar_21.x = dot (tmpvar_20.xy, vec2(0.00390625, 1.0)); + tmpvar_21.y = dot (tmpvar_20.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_22; + tmpvar_22 = (tmpvar_21 * u_params1.w); + if ((tmpvar_18 < tmpvar_22.x)) { + tmpvar_17 = 1.0; + } else { + float tmpvar_23; + tmpvar_23 = max ((tmpvar_22.y - (tmpvar_22.x * tmpvar_22.x)), u_params1.z); + float tmpvar_24; + tmpvar_24 = (tmpvar_18 - tmpvar_22.x); + tmpvar_17 = mix ((tmpvar_23 / (tmpvar_23 + (tmpvar_24 * tmpvar_24))), 1.0, float(any(greaterThan (tmpvar_19, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_17; + } else { + if ((v_position.z < u_csmFarDistances.z)) { + vec2 tmpvar_25; + tmpvar_25 = (v_texcoord3.xy / v_texcoord3.w); + float tmpvar_26; + tmpvar_26 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_25, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_25, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_27; + tmpvar_27.x = -(tmpvar_26); + tmpvar_27.y = -(tmpvar_26); + tmpvar_27.z = tmpvar_26; + colorCoverage_2 = tmpvar_27; + float tmpvar_28; + float tmpvar_29; + tmpvar_29 = (((v_texcoord3.z - u_params1.x) / v_texcoord3.w) * u_params1.w); + vec2 tmpvar_30; + tmpvar_30 = (v_texcoord3.xy / v_texcoord3.w); + vec4 tmpvar_31; + tmpvar_31 = texture2D (u_shadowMap2, tmpvar_30); + vec2 tmpvar_32; + tmpvar_32.x = dot (tmpvar_31.xy, vec2(0.00390625, 1.0)); + tmpvar_32.y = dot (tmpvar_31.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_33; + tmpvar_33 = (tmpvar_32 * u_params1.w); + if ((tmpvar_29 < tmpvar_33.x)) { + tmpvar_28 = 1.0; + } else { + float tmpvar_34; + tmpvar_34 = max ((tmpvar_33.y - (tmpvar_33.x * tmpvar_33.x)), u_params1.z); + float tmpvar_35; + tmpvar_35 = (tmpvar_29 - tmpvar_33.x); + tmpvar_28 = mix ((tmpvar_34 / (tmpvar_34 + (tmpvar_35 * tmpvar_35))), 1.0, float(any(greaterThan (tmpvar_30, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_28; + } else { + vec2 tmpvar_36; + tmpvar_36 = (v_texcoord4.xy / v_texcoord4.w); + float tmpvar_37; + tmpvar_37 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_36, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_38; + tmpvar_38.x = tmpvar_37; + tmpvar_38.y = -(tmpvar_37); + tmpvar_38.z = -(tmpvar_37); + colorCoverage_2 = tmpvar_38; + float tmpvar_39; + float tmpvar_40; + tmpvar_40 = (((v_texcoord4.z - u_params1.x) / v_texcoord4.w) * u_params1.w); + vec2 tmpvar_41; + tmpvar_41 = (v_texcoord4.xy / v_texcoord4.w); + vec4 tmpvar_42; + tmpvar_42 = texture2D (u_shadowMap3, tmpvar_41); + vec2 tmpvar_43; + tmpvar_43.x = dot (tmpvar_42.xy, vec2(0.00390625, 1.0)); + tmpvar_43.y = dot (tmpvar_42.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_44; + tmpvar_44 = (tmpvar_43 * u_params1.w); + if ((tmpvar_40 < tmpvar_44.x)) { + tmpvar_39 = 1.0; + } else { + float tmpvar_45; + tmpvar_45 = max ((tmpvar_44.y - (tmpvar_44.x * tmpvar_44.x)), u_params1.z); + float tmpvar_46; + tmpvar_46 = (tmpvar_40 - tmpvar_44.x); + tmpvar_39 = mix ((tmpvar_45 / (tmpvar_45 + (tmpvar_46 * tmpvar_46))), 1.0, float(any(greaterThan (tmpvar_41, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_39; + }; + }; + }; + vec3 tmpvar_47; + tmpvar_47 = -(normalize(v_view)); + vec3 tmpvar_48; + float tmpvar_49; + tmpvar_48 = -(normalize(u_lightPosition.xyz)); + tmpvar_49 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_50; + tmpvar_50 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_51; + tmpvar_51 = normalize(tmpvar_50); + tmpvar_48 = tmpvar_51; + float tmpvar_52; + tmpvar_52 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_53; + tmpvar_53 = sqrt(dot (tmpvar_50, tmpvar_50)); + tmpvar_49 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_53)) + ((u_lightAttenuationSpotOuter.z * tmpvar_53) * tmpvar_53)))) * mix (clamp (((max (0.0, dot (-(tmpvar_51), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_52) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_52)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_54; + tmpvar_54 = dot (v_normal, tmpvar_48); + vec2 tmpvar_55; + tmpvar_55.x = tmpvar_54; + tmpvar_55.y = (((float((tmpvar_54 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_54) * v_normal) - tmpvar_48), tmpvar_47)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_56; + tmpvar_56 = (max (tmpvar_55, 0.0) * tmpvar_49); + float tmpvar_57; + tmpvar_57 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_56.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_56.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_57) * tmpvar_57)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..28667a5aa8849b70829be96c986a56758b69c5d6 GIT binary patch literal 3689 zcmb7H+iu%N5N+QIeZ}^TOl+CEq+|)H3j{TS6h+Yh?z_Osw9SGNRg$^}{`Z`jy>OR` z4Ag#+c6MgYoVl$&J$(N0r_H~gx9jq$ZdRhrSDUJ6)V-U%GN%K0R&Q z;*A?0SO1j7x_jfsm%1$p$r;#Hju6Vc`lAg*DI#{F$IGHT5D`zyx~k7P+2l>WYSr0o zeJ($Yc6oCw*UtiMr((C*mBl_d%y6i)v#jd|hz1I4q%yB?T$hhxm6vM~#iOqyp$&Gc z4el@CCp-Y4@F1mwr>f37v8;DRlRp=W%v{QZF*Bh9`+2+^^k}D!97Vq#m zTHcq#3JoU(!jt>a7k30|&xz|xI^jVyaiN!Oi@8{MtcFUJ_@sy_mDWl4Z*`lvA zBOP5A2JPIlG89iqPMXeP~mTaJp!!t077`W2jRLiTIKl0t-_&Q+m4hHE!3yS(0RULbe+XWyalOZ%p7zIlCYwY zcv*FS<)q(Ra>&y)jh=+D$#-k%Y6F|q{kg!d?7sEWEsuUWyFO7^+ zYoU4Rn1LSS`j)1mw_;oD0@7kj@6RPSVg`B$E=EBgn?Ew;6s%}$Havk5Dv z`z|rw6N2gpI<{?n$)1dPxO3kiHGJP<{<9^t7)XW|A3eAdYruCvt=~I%*mzH;&_gI1 zx@fskdRE}($Zo=t<2?}`@fxu7(L9U>OP;2#UCR>SnJx3kG3y=)bT0|%ZxK0%!LB%T z+or&46q)ItqpomJz#6Mx2g-kasDx`gn2vL3xt*RQ={%V#6bEf&pI@j_4-8aKm<{BO zM$@@!fP>e9;YZO@v0bF7KYC*H!-scY&*m?-N)<6@SD%&BrZzkCRTNcQnAI30NQEm% zQAP4pbvPs<#1qJ21Xr#*v|s8=o3RtKGgwF}Tu6$m(!!ke^N`Ky-D{;31kZd2K+%A< zXcTP}`z7^&VcB3_AbdMd|M%mK1390o%Ac!>=4!uM_3Ht-_ufR$)#4K##lO)bpIgqv zgDOb%>Ozt5dk=Uco|ch~NOB4A?*rX{v_7qnLN}48x@)|PE<=*%rg4@{=%1VoKcRSf zBBx&EDKt8OdGFzys5opCaAf0jn#oCVolHF9d6e6XWVD~W$1HOiFyej-ypBdcd;``s Bg;f9m literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin new file mode 100644 index 000000000..61d1a468d --- /dev/null +++ b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin @@ -0,0 +1,202 @@ +FSHF­œuniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_csmFarDistances; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec4 v_position; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + visibility_1 = 1.0; + if ((v_position.z < u_csmFarDistances.x)) { + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + float tmpvar_4; + tmpvar_4 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_3, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_3, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_5; + tmpvar_5.x = -(tmpvar_4); + tmpvar_5.y = tmpvar_4; + tmpvar_5.z = -(tmpvar_4); + colorCoverage_2 = tmpvar_5; + vec4 tmpvar_6; + tmpvar_6.w = 1.0; + tmpvar_6.xy = (v_texcoord1.xy / v_texcoord1.w); + tmpvar_6.z = v_texcoord1.z; + float tmpvar_7; + float tmpvar_8; + tmpvar_8 = ((v_texcoord1.z - u_params1.x) * u_params1.w); + vec4 tmpvar_9; + tmpvar_9 = texture2D (u_shadowMap0, tmpvar_6.xy); + vec2 tmpvar_10; + tmpvar_10.x = dot (tmpvar_9.xy, vec2(0.00390625, 1.0)); + tmpvar_10.y = dot (tmpvar_9.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_11; + tmpvar_11 = (tmpvar_10 * u_params1.w); + if ((tmpvar_8 < tmpvar_11.x)) { + tmpvar_7 = 1.0; + } else { + float tmpvar_12; + tmpvar_12 = max ((tmpvar_11.y - (tmpvar_11.x * tmpvar_11.x)), u_params1.z); + float tmpvar_13; + tmpvar_13 = (tmpvar_8 - tmpvar_11.x); + tmpvar_7 = mix ((tmpvar_12 / (tmpvar_12 + (tmpvar_13 * tmpvar_13))), 1.0, float(any(greaterThan (tmpvar_6.xy, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_7; + } else { + if ((v_position.z < u_csmFarDistances.y)) { + vec2 tmpvar_14; + tmpvar_14 = (v_texcoord2.xy / v_texcoord2.w); + float tmpvar_15; + tmpvar_15 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_14, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_14, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_16; + tmpvar_16.x = tmpvar_15; + tmpvar_16.y = tmpvar_15; + tmpvar_16.z = -(tmpvar_15); + colorCoverage_2 = tmpvar_16; + vec4 tmpvar_17; + tmpvar_17.w = 1.0; + tmpvar_17.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_17.z = v_texcoord2.z; + float tmpvar_18; + float tmpvar_19; + tmpvar_19 = ((v_texcoord2.z - u_params1.x) * u_params1.w); + vec4 tmpvar_20; + tmpvar_20 = texture2D (u_shadowMap1, tmpvar_17.xy); + vec2 tmpvar_21; + tmpvar_21.x = dot (tmpvar_20.xy, vec2(0.00390625, 1.0)); + tmpvar_21.y = dot (tmpvar_20.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_22; + tmpvar_22 = (tmpvar_21 * u_params1.w); + if ((tmpvar_19 < tmpvar_22.x)) { + tmpvar_18 = 1.0; + } else { + float tmpvar_23; + tmpvar_23 = max ((tmpvar_22.y - (tmpvar_22.x * tmpvar_22.x)), u_params1.z); + float tmpvar_24; + tmpvar_24 = (tmpvar_19 - tmpvar_22.x); + tmpvar_18 = mix ((tmpvar_23 / (tmpvar_23 + (tmpvar_24 * tmpvar_24))), 1.0, float(any(greaterThan (tmpvar_17.xy, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_18; + } else { + if ((v_position.z < u_csmFarDistances.z)) { + vec2 tmpvar_25; + tmpvar_25 = (v_texcoord3.xy / v_texcoord3.w); + float tmpvar_26; + tmpvar_26 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_25, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_25, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_27; + tmpvar_27.x = -(tmpvar_26); + tmpvar_27.y = -(tmpvar_26); + tmpvar_27.z = tmpvar_26; + colorCoverage_2 = tmpvar_27; + vec4 tmpvar_28; + tmpvar_28.w = 1.0; + tmpvar_28.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_28.z = v_texcoord3.z; + float tmpvar_29; + float tmpvar_30; + tmpvar_30 = ((v_texcoord3.z - u_params1.x) * u_params1.w); + vec4 tmpvar_31; + tmpvar_31 = texture2D (u_shadowMap2, tmpvar_28.xy); + vec2 tmpvar_32; + tmpvar_32.x = dot (tmpvar_31.xy, vec2(0.00390625, 1.0)); + tmpvar_32.y = dot (tmpvar_31.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_33; + tmpvar_33 = (tmpvar_32 * u_params1.w); + if ((tmpvar_30 < tmpvar_33.x)) { + tmpvar_29 = 1.0; + } else { + float tmpvar_34; + tmpvar_34 = max ((tmpvar_33.y - (tmpvar_33.x * tmpvar_33.x)), u_params1.z); + float tmpvar_35; + tmpvar_35 = (tmpvar_30 - tmpvar_33.x); + tmpvar_29 = mix ((tmpvar_34 / (tmpvar_34 + (tmpvar_35 * tmpvar_35))), 1.0, float(any(greaterThan (tmpvar_28.xy, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_29; + } else { + vec2 tmpvar_36; + tmpvar_36 = (v_texcoord4.xy / v_texcoord4.w); + float tmpvar_37; + tmpvar_37 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_36, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); + vec3 tmpvar_38; + tmpvar_38.x = tmpvar_37; + tmpvar_38.y = -(tmpvar_37); + tmpvar_38.z = -(tmpvar_37); + colorCoverage_2 = tmpvar_38; + vec4 tmpvar_39; + tmpvar_39.w = 1.0; + tmpvar_39.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_39.z = v_texcoord4.z; + float tmpvar_40; + float tmpvar_41; + tmpvar_41 = ((v_texcoord4.z - u_params1.x) * u_params1.w); + vec4 tmpvar_42; + tmpvar_42 = texture2D (u_shadowMap3, tmpvar_39.xy); + vec2 tmpvar_43; + tmpvar_43.x = dot (tmpvar_42.xy, vec2(0.00390625, 1.0)); + tmpvar_43.y = dot (tmpvar_42.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_44; + tmpvar_44 = (tmpvar_43 * u_params1.w); + if ((tmpvar_41 < tmpvar_44.x)) { + tmpvar_40 = 1.0; + } else { + float tmpvar_45; + tmpvar_45 = max ((tmpvar_44.y - (tmpvar_44.x * tmpvar_44.x)), u_params1.z); + float tmpvar_46; + tmpvar_46 = (tmpvar_41 - tmpvar_44.x); + tmpvar_40 = mix ((tmpvar_45 / (tmpvar_45 + (tmpvar_46 * tmpvar_46))), 1.0, float(any(greaterThan (tmpvar_39.xy, vec2(0.95, 0.95))))); + }; + visibility_1 = tmpvar_40; + }; + }; + }; + vec3 tmpvar_47; + tmpvar_47 = -(normalize(v_view)); + vec3 tmpvar_48; + float tmpvar_49; + tmpvar_48 = -(normalize(u_lightPosition.xyz)); + tmpvar_49 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_50; + tmpvar_50 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_51; + tmpvar_51 = normalize(tmpvar_50); + tmpvar_48 = tmpvar_51; + float tmpvar_52; + tmpvar_52 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_53; + tmpvar_53 = sqrt(dot (tmpvar_50, tmpvar_50)); + tmpvar_49 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_53)) + ((u_lightAttenuationSpotOuter.z * tmpvar_53) * tmpvar_53)))) * mix (clamp (((max (0.0, dot (-(tmpvar_51), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_52) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_52)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_54; + tmpvar_54 = dot (v_normal, tmpvar_48); + vec2 tmpvar_55; + tmpvar_55.x = tmpvar_54; + tmpvar_55.y = (((float((tmpvar_54 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_54) * v_normal) - tmpvar_48), tmpvar_47)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_56; + tmpvar_56 = (max (tmpvar_55, 0.0) * tmpvar_49); + float tmpvar_57; + tmpvar_57 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_56.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_56.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_57) * tmpvar_57)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..2d7695d2eb24f2972a0b3ae4cc47f946371a2a3b GIT binary patch literal 6621 zcmcIoUvJws5Z_+&DY!SebsR~Q92;E*bS<(C!?t4C%bpC)VNwCI`X`Fp$0@5*W=>TIh{$3x5ZYS+W%b@MY%gg@m;0V+9OCngCf6w-@I-b zwcch;UaoI8W%J9nQB^-BZokbdwM5z<*6U$9wcHk2^{(6vk-W|C?zXi$LGgO^N3Pb* z35s`Rouej4%C0gnA? zi(qv2;Y?_)o7D#B7a-4HfTR5d(2^Dsp%G6;Ex;#0Stxi2Gu3 z4KaIzse!Hs?GWbyMG8>eY%2v75Q5g0z_AEg#7Dp-E}RsICZGlQL@kpboy@0UGF9i{ zY%HQl8mF@ve57L$PQp;m!)Xk^qe(c@iVGihsEkc50x!WZW;15!SL@jskpGurn&Hk3 z&fF6+Ms}7< z0XYJUhd=aFOAs%>KM94>PtOS2k7IEZQdXU_Ds#ia=^jonY0Q^zC$M6yk61g2+_LMV zKMGaU%3!A#W^kfC^3uZWGXO2_0xkX|pq+vml|}S32A2I7830 zUC2fD0FG3QqMil2D0(*TEX&h?*MT0j1{Zviz-KLBOL;-M;5)Wh`uK}tgIytpA!tw@)s(Pli{AhZ7Dz_3x}Zz`N6zEL2%nR@v1>fogTT{xN3Trp3vo1X5#QOjh85n>u{!l)y- zLRv*lH+6NNd-br#xOoS4vmRv5J7v+O83vx!=A-sC{YU?R(g`aa)AV3m9fuQ~XkltW zmUa$8{|D6?SmJP-7>B|j+Wqj<5>W1z=Hz0zx+ zF%?A?gssyRWbVU!tpw!{S}HS0U@&G=>wwZDzPjRjwB-X`%$(z?V{(IqQPJ%=66Qu@ zk&cKb!xR&ift9v(1h4Y^$KPlt|26`AubAq?G*h5omURH5```lsKmbS0FuF`qDR~C> z#hRpNv6%4npH*XS2>N0fLm6j+gvIaz`kQ9yi{P{}kC3z{wcUfZEEQ)4_8k&Hd5x;z3#jLOV1L-j~Ih}fpwnX7XfC}4>phg)pSFt)6l8;=+q z#A3mdWA`bk#)b-fBvr|pW;?Ise<8+`WQpn^-Z zvM$agbp}=p1|d!oUc!Og&MKYP4}=xdB{U}J2N+#mC0v%EK;UTsz}|m2IYJ~g2Np(C zJbxrTuAmmk1hM$qs*!^0xC8P&!qv1+Z^ZQ@gf$b|3YE-&O^OHu zG)n3e#3ss{G1$(g>%4IY+mb+~(;Swh_!m#?{sQ!X?C#KtrAtRPp6t<~+mTFa8Dpee$#b literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..fbfbe8542796542034d8a5110a0eef1c0fa7c117 GIT binary patch literal 6578 zcmcIo+m72d5N%)gE7&(V@j8+y`GRx{qzTd%Mcbg;mp&P)m%9-lTdpLpcQ?pG|D(Uq zf9%YVLy@|;yGWVwwUzgQZ)Y*1ls49LV4(s}Tc2ypK z%J$*QGv2>d8wp#DYO3sKV91JJ)zzu(Z;OLEwg0;+it>1h;=4+zokx&>21S1JzIoL& zYIn$*yxd*x%jTCuqpD#_+t>~`aHYI7*E>RovpBYBfwUmt39g5uTok6i7V z6BO^tI!8@<%5F0-Az?S1u=3K6LAY5xZ9Lvb(M_n$k81*dPJIkIG(e&&T?2JZ0rbtAgRo+#5T)! zBAA?gI1^gyX1fRaHOTW9;AnpVw4{YZXvC9IYp}|!US}J1sS1sqb!yqkwXe%tRb@A7 zJ;(J9>FiEih^w*@ftNCb=&57b?C$iv2jq4kl z7Gm}qQv+QO+9A#ZiWH!_IaCTNAOx)~fm0E*h>w6vyl_$=nt>MJ6SYZ#bhes@$y}X> z%c+QFX`C*X@R3eMI159$3glBfX@+Yz zI4e)c3WaP6DE;6knaO__-2qGc*nT@P}A z56BTB<1zP+`KsyCBDvRi63@rOEG61xAiz38I3(!FYb-bV& zx{!w@)tsx}Zz`N64 z(8%y+qvtS>i~63|zhdfNEC}16E67|(`CbRWeb7>w0h=96OQtOM3= z=!QN!(ySLoizJnjhhSfXM82;@?I;A_0JQJGjPFir6Ddw@SsH)Fss?z=%J%I^GN5P;BR%0s3}<-w?KEIV?5YNs?z=v^#fzA)cy;+*CJ?P=indnfCkz_ z4*CQ}8KyY)qAJ}EBdLJ-5@-bXm#mb8AttF;u&U^|(H9LS(%^6bCaKo*J`6aVd%T2$ zww*ybuNsI}rb{Tj^uvm-+7d27PL*r#ITn9ro?~<4kAhhz|2UgvAV66_w$D?TH8gG#~1;22<^342HAa zx^g*$wq{Ez$L6pk#lLuB_ZL71WOpY~EQdO*F;o%Ik6Sto9qMi$gF4Af&XXv`_dmz` bOQ+PyB{o3kA&gw>IR;;038^2?&c65;Iho~o literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_texture.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..6eb00acedc630cc5f2cd9d50d0f67d2caab55e47 GIT binary patch literal 552 zcmZXRO>ToQ5QW>V4^hn$6l8&c6=^rEqV9VDkrCt+!0)OU=P<~9!|m?CL|fTSxoLXgnZl@0Ut@F&fwUMf=_S+p9iiBH|zoA>XJ#5 z)8L(sIeu!&Z<$8)zFv`P86h0(hy705TD@B;uG66>a*YU3S|y=%%Aqz=cV* z5jI?MV9xy#&KbNs-F|$2e=Vlj$k-g_I-gBa%O7D8&tG+7R?m7y@4Th9>ufrPWjd6w zjEl4!8e8{H70v4p73m&?Yr=mRcJ{GlBnZQhr(GKQ5GW-ALVe(BciW{EZ(CzLi3e7XAI!v9*Bq#7 fkzPHMvRrRmGwkZXh5k7C%@(L;CP7=i>CdCY5~oHWa9bAxPB2Dhh} z#!Q)&k*VMHQSPt%;rrM3zyJLEyIn6H%W9>biq&R0tMH53j-P%M({lf<*yww2S5(Kv zdaib}iBY?8Jv&UwvYMLSJ5lc)?7agQcaS}&>7ZOp)v8#ml^=LNJ#}uSUTvtgF;yyM zuhl2zQ-k%knh}T3K}I|?P#=^I5e-5dGyw#MHif$E5-~hb=CrISw|!oCI8qk<-q)el zQLYn=M+!n6oRZp~VR&>3pZB*4PycUQO@Cq6LL`I&YOLkbkmknWqKS2(#^H)&T*l#w zLOEB=T8PD5&-j^ZqJrUqOeaK#_Z zI=$rq>zOMCfgya{At04VvzXuD;~D|iBOnwBmA)PymC98D+$A8D3H58|*JFR+Isw-w zAQTFfI($Qv0^BJem5OvueW+%MSp#R)pz z3NjWRxlpj#HBPQNpGK&|yY6U$F<^TMMe;~AY1NGfZ2LJ#7 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..2e637209610fa49d7c48ede689593f62793ed243 GIT binary patch literal 234 zcmZ<@_F!Bh?O9cpSX7yrm#&bOlb=|kP!^w(T2PW<%~h74nWB)Jn3<=bp~+RvrJzuj znrxy_l3M^&A8%+46o9c6Y!%Xq5|c|bG@zOlw7`lr4E4;+&CQKcwGGU56wFLbjm`87 zbQFwC!IYt%fu^P=$ei??c({34)P8gO%U5p2DRipnaOxdtF(fP{gurGc4| NDK0kH_*yP51^^($Knnl> literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..0760f2f075435f66d0f637e4b4874b986f633287 GIT binary patch literal 459 zcmaja-D<-i7zW_=)T{UowLjLVDU{HoLfQE)AV{_ZA&J3;G;P^k>|%FVEpd@C*olhx zKHuxM{T~?-$}^eA&#Yh)rl^gw9w0yX_@VE_OC literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_texture.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..3ea416c8023d1e151a2a69dc87c2fcd0d63daef7 GIT binary patch literal 137 zcmZ<@_F&AHv$HA9%S_8J%2g;%%q_@CEi!UZD2*>kt#HoI$uF|zDoZS?%*;zyC`(N? zQYZsSB@qIn>;OEAYb9REWIgVz;&LnV1tGCMtxkm@geb$bD9TyyL_J5v;uPXS z&M1pzPQvTFbckeLlax^~#+jkHVqDB9bV3!vtt_LylW4$bpak|z6LXZiM64n$_SnSQ zL*+{73$3J(J*}e>tFt8%jfTp|o?#yrIpEtMl~Q5ho8 zhlEX>g@-_Z>Pe$TU5 z$7TYTbfsMg!JdQ)(4(8lKE0i%3q$luNm?Z)uwyW7-a?ripqT0cL?^(5VM_Z+i|m)b zMoI|nNV?hXAUCtLpA;4FqmN66>)JPJA&g+HilbVM_E~S9vPBg%m$^xXf=1)Ig>ns) zJ#mc6$e8J78DY>)An3tzR@7v87Y({LhU>l8(8>ZH1;@T1@Heo313K`x7F-AsqN^^y zpy%Pkj)sRsZCYNJ+&q~8jyNn@-P=QG#jQ$W6wx%3}BDdbagQ5CYYxwwt izFg{1Eld#p9}c|nmRHO6By6?KnuwofmDFpe^X?z;+Ka6K literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..2e237bbc97ab71d4789f55f2e0dd9fb90dae8c0c GIT binary patch literal 311 zcmYk1%}&EG5QO3Chd_I@rC_;k6QxSa1yph2!~;ZDV?v}jYdL=|h<9fr6qMWUjAr)R z%lqp+K0KYquKB>=V6xW(jHNfhxLy}*)qCT7YlD6vv;Q;|&Tq!6f=wpenyy}Q8m4lv z@roF##lfZmXPOSUVBZY>st4yOQtk>8)>+PQhMlC$MvJ#EQa#SVse8{W9Dq~(Fa}E$ ze2bB6FALh}37*PhrVg2XRCz+}sZR5pmNWq+mD(RwrfH_LLQv%YWf@}>3rXFUmtg8= PY%vhY3R|!r#_oOrWkg^0 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth_vsm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..fdc3ba0853511f5eb07fdcf552696721b536a7c7 GIT binary patch literal 288 zcmYk1%c{aK5QcS|hd9hKffCYsfkV%6qlg<=`B@!cc)0PyW#u!FLS({ zmiV*#Ypddh&On!4*U%1Bvxrr`VshRWa+d8;U9)eGzm?lld#6 zOGgEZ6pSt^;DS9Fe4-m;$&!RIf$5e#{6i?oGh=>u5VhC?r|cC^u>nr;P3tmR!RIrA wd9#pyAV7P#l1i<9)i&A$W4;g~`2Hrn_hPKf%jD>EzQ+05TD@B;uG66>a*YU3S|y=%%Aqz=cV* z5jI?MV9xy#&KbNs-F|$2e=Vlj$k-g_I-gBa%O7D8&tG+7R?m7y@4Th9>ufrPWjd6w zjEl4!8e8{H70v4p73m&?Yr=mRcJ{GlBnZQhr(GKQ5GW-ALVe(BciW{EZ(CzLi3e7XAI!v9*Bq#7 fkzPHMvRrRmGwkZXh5k7C%@(L;CP7=i>CdCY5~oHWa9bAxPB2Dhh} z#!Q)&k*VMHQSPt%;rrM3zyJLEyIn6H%W9>biq&R0tMH53j-P%M({lf<*yww2S5(Kv zdaib}iBY?8Jv&UwvYMLSJ5lc)?7agQcaS}&>7ZOp)v8#ml^=LNJ#}uSUTvtgF;yyM zuhl2zQ-k%knh}T3K}I|?P#=^I5e-5dGyw#MHif$E5-~hb=CrISw|!oCI8qk<-q)el zQLYn=M+!n6oRZp~VR&>3pZB*4PycUQO@Cq6LL`I&YOLkbkmknWqKS2(#^H)&T*l#w zLOEB=T8PD5&-j^ZqJrUqOeaK#_Z zI=$rq>zOMCfgya{At04VvzXuD;~D|iBOnwBmA)PymC98D+$A8D3H58|*JFR+Isw-w zAQTFfI($Qv0^BJem5OvueW+%MSp#R)pz z3NjWRxlpj#HBPQNpGK&|yY6U$iw~5QW>V@~^lNS``s66Y8F&Qlv^*ksBy+gfRjGAyxl-Z4AT?$p&}4``$fn z|FwO7sZQIrq(8i7&}9b}l5TYJPg$jZsJH zftI-fh0rCPlvqV9i_MXwygzVWr&do1O6igmF(N|L^t%`Bv>bTx8WG0pvxpo4~T?w22i2ye<=6HEK+E zVg$zQKxv)Xs8j`>@4~xsu+oKwE*yROme0`BK4*-29obV15~VYwm&`E@U(JTD60OMC zAmcj;;fZV~r2p|vI9C=PS))O9dXwwOKt*>@(S(wj&Ho+Vz%h50h~i)2m>NOyO>h&HBOIb z;Cjxd11gk&Ot;7pqXy`{{XN{m$PWzL;dnx;&IGVY;#ngVF}H|~Ilxty(Nn2(KI}%v z7phpd6^c=zA9!%16r9Cjf4jJ-(is>!Bfr+!lohJqio0n8Qq?`=C+6ycd$EzHg3g$6 z<{dK`=n!d`%?{NM>0fhtE>dw-0<~d`HLCFd)wrR;p0zIpuEEu7Mv87*{G(S_(|eo4 z>h+Az%AROiCIea~t(Io^i(sjzQ)pFQw>zV{8SVY3_PmdnG)mh|tKLR`ZR(?8caO~E S>HyiDiRp}&%=G|_ z1MSYN*(y*BLq14}S0u7{*wKO?*PM5S*HeNnMvuQ|IuIQKlaL& zWogFR**f>0bM8ZW`1Ca6bK><2pi&N9(IJ_0 zNbpdyakxO{dWF@>Uk*YG}>)n)J7R%3o^VCxGcEGX9C_+oxx}T%m)6g&w$EZu s6GLwvtu$5_c-)c|{#`>7>xrAF%!yiiqH-r{ekVHeFWIII{xks;%JLXXm zDKa*95{GYQ-j8>`e}4J?_Wr-E`5)0#P*F*sEhLi-{Ur~#Y_kqL*tfD}UhtlkrPzDn z9}Q#m30m^)lSI`C=-8vOv!e~IUef7&v{{J_EAKel-!$UckFJA`Hb-7>0r_(1iVj1Z zLxP8r9Ug^fHpGkMUL^A(Xxb82Iy>>gB^Q{!1t?cFHh`AvfJ)i$hgPz|F0~>YhyXP) zo!}d69_mKw zPO_O>67#{HUaiU9YzUh~u60BEaJ!!ii*GUT=?9`;a0=X(&OXlXIB$tv8RclHxE%7 ntEJSPU*O*rB(d(BE^+4ET6%8f&aIW_7IAK&r%Cc(5L|o!LQo8R literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_omni.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..a0689ae9ee145d0a45774c422f647da1ad75dc9a GIT binary patch literal 1233 zcmZ{kO-{ow5QSlzQ_L~}5w(fiP1OwxV1rbFREbq&T2qXYxJsS$2eIHDT!A|>&Yx{k z?^-{<`JQKDFP|SS@4kP3%ACK6B7=-d0%anZEa;;=JhAo6b7;3|$(-T~OH;9T%J&6h z`9Mwi=3OFH3l&?bI9poKY&X{HZOlxpS-RwGzbM3qTb+3oEsi|j0M?74N-DHiiv$-X zJFJ8#*2JmAP9<_G7}|g<&Q|QWCIgG=RwRSk3aMdIMY|>=WMn%mp6RX>B)mIEuDU*lY z=y{Ry`dv_TMd2ub8ikkvprU%{?_ca4Tx%b$WP2S1M9GHpiBcY z&b%j+GaVu=+3ryDA^mHPW|5jz2Q-E;F;J5;s7Z^$o^@XeT!U|(84>-R2#>+wG*bgH zZQ^xTOQ)MOHVv6~1Fh})K8%|R-IGvXU0r6{mg#O!J#YPhH1B|Wdu$h1Z;E>}u{Y!6 KWbgg*yo*1+eV=0h literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_texture.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..82cd381305d54b93d1f996a4667fe3a7a4c569b1 GIT binary patch literal 279 zcmZ{f%L>9U5Jh#HkC0imE{fIes;*rYglJzlGSVGIK>b3}HF#*Od}ZQqwgSOx zx}ZhUPDog~F4Pc&?8adHPQa?#HSsug;B!YEY#@$YmB;$w>ZmUSI8{7*`&}0NY=HUK Q7>+7$#M9(Wx-&L;0Azw)g#Z8m literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_depth.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_depth.bin new file mode 100644 index 0000000000000000000000000000000000000000..c08b5667c7d1d8d7b0dbbdd1da2ae9035d1221c2 GIT binary patch literal 196 zcmWFw_F!ZHg3`RqwEUu6h1|pv6NS?F-29Z(oUqK)@_?fJENiaBl9Hm#q|%a9g|gIS zV}-={g8bsllFa-(Yp$~V%oL!m%sd4RO|EJ#1&|68g_7KYvc#fzLu;S_jICF$V5?xL nXMiGBQCS5PMK(}DAw4HP0BSx^P6N#~3R-XzHLba7xwserfYLuS literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_hblur.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_hblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..21870f0dcbc75f0cc4a297cf3ecd3cbf9fa18fe8 GIT binary patch literal 1317 zcmaiyv2KGf6h+&WuXtn9s#XBQ5_RtwDOFbFCNy$|aYPJ(RQ=M9UHb=J`XGP}39vcNSTk{mc)VY+go)$QYCaH5l^+PX3!@DWPpd?J z=xKdD!@+Bqhtbl?SW+P70?q;z=36O~9UYvwgA-?PVs|DE=$ysUVoD|aEmdLJ!2#BG z=+9i79psTKE@K2rz5~H{470iQX#u=Pk||K)fJy--Li-z@VU`B1G|A!N#tzAOUS6tJ zR8!EXr8wk-9GhS(<18=Ecxv_n*hj&tu6arBJO*Yr^h=)htw_xaR5@lDTznhsq6119 zyTXH~25eX0I>jYLmrIHcsO;YZJr01%1(=Z)NWZ0x<0iC>Fw5irsVz@$m!H*lZQPJU z7IRaAj!IB+Q(_!AA>(M7s=F!U88Y6qjN6m(MrFKdnQP#LjH_j;?xu`y$oSJTv?t?_ U%J|bV*T4xGs%5bImu21k11iR^b^rhX literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..71bbbc323e43d1e20fddae9493d4194e5bfce7c5 GIT binary patch literal 286 zcmWFw_FycSQuL!VFEcH_C|4mjvBX57G(I;!B{e53GqpURC_l@Zt1PjoGBYn-p)57o zM4>FcAip@XBr`wHnk%uSq$o3~v?LWIWvq~hBvqE5nF2H}GfzQ7ldGCb0iwAiw*Y8Z zyrDHv0LIoUSFlwu)H6U4tEj93iXt0`YJw4xY9pXZ4Kzn9Xu-|b1Sw6=i4TA}8>kv; PHP{e@e^4Z9xwserssUg0 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc0cd079acdbc735d4b7defc937cf672dacdaa9a GIT binary patch literal 299 zcmZ9Hu?~VT5QcT_E4bVUnh-#o8h71DOjw&LMQdnFY5~FcHa@6@fB~nw{Q2&?yX16O zepbh}lsr>ffS@LVk_eTuJmIX4wYpWja7|qY6VNkKl7APsy zgBz}-olrcrGA_Y!(F;LGL|{Z=RV2VR7<;dVJp`UV%brbZ)2VQ72q$!CN$2lmSpWQP jhhB3M54Tx*Slvs8XF7*7=3Z;(eQ)Q&rY{)15n6l!UQS>! literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_texture.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..82cd381305d54b93d1f996a4667fe3a7a4c569b1 GIT binary patch literal 279 zcmZ{f%L>9U5Jh#HkC0imE{fIes;*rYglJzlGSVGIK>b3}HF#*Od}ZQqwgSOx zx}ZhUPDog~F4Pc&?8adHPQa?#HSsug;B!YEY#@$YmB;$w>ZmUSI8{7*`&}0NY=HUK Q7>+7$#M9(Wx-&L;0Azw)g#Z8m literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lightning.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lightning.bin new file mode 100644 index 0000000000000000000000000000000000000000..3d5205f3691494f2d5f842d79bafcb3af11c9071 GIT binary patch literal 608 zcmZ{hF>Avx5QUpnzv4!_P~%A6O!p2g1PWP=8mmFUmVzoPNkj6>JM`q(wPc!2+`D_< zJ>B~KWpRD`dF_<^)TV`&+XA|()wO8WQXE!B?@Dq{Es5jiB-Iw2*f4OF!;z>+v1r9{ zqqV8?Nb&6ok-RAhx7Nsy&I<2CfrlfJ#!%bqFKMM#v#|oD(a&jFV-%?%Ny(Xjw=KZ7 zdtA3#mRK0y*#Vwmnc-?d?RfgeYDfauHq~kXqn6CR2p<0&Q*RaWXy8qIULNsicHPMAViRh*RsUzfu`h%?`~vh{ B$!-7u literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..82cd381305d54b93d1f996a4667fe3a7a4c569b1 GIT binary patch literal 279 zcmZ{f%L>9U5Jh#HkC0imE{fIes;*rYglJzlGSVGIK>b3}HF#*Od}ZQqwgSOx zx}ZhUPDog~F4Pc&?8adHPQa?#HSsug;B!YEY#@$YmB;$w>ZmUSI8{7*`&}0NY=HUK Q7>+7$#M9(Wx-&L;0Azw)g#Z8m literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_vblur.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_vblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0d51f7bc12e519db9e81928e87c50d693be196d GIT binary patch literal 1317 zcmaiyy-ve06op~UQ{1ry)oOm1ik-1iQP;?{p)!i&Ds|EX#FH|z@&+v2{Mk<0CR^ll zea`u=v)w%3fB*dbW(j)}DTh4Td60!CzM=dWv*fU*Ddne?)eUees{tKmS5mW2wMl<;t6hvYo3F4Ze) zU64q*IOL2zHo;cLSy6uAso4wQ5QpowW|Q1|49xD_n>@{1J9RHm=a^-1@haFQMSqwS zJ+-WYjZGr*qKmcb*tUa9n*J(vU{o;=j2`<&`Ymmo?QE+yW_kRdRC#Z-yoX&cG8Zsw zoo(EoLzZ(B!W)I~>W904xN4|j91T-%ewmqXST0& literal 0 HcmV?d00001 diff --git a/premake/premake4.lua b/premake/premake4.lua index ecedc718d..94c665a14 100644 --- a/premake/premake4.lua +++ b/premake/premake4.lua @@ -146,21 +146,24 @@ end dofile "bgfx.lua" dofile "example-common.lua" -exampleProject("00-helloworld", "ff2c8450-ebf4-11e0-9572-0800200c9a66") -exampleProject("01-cubes", "fec3bc94-e1e5-11e1-9c59-c7eeec2c1c51") -exampleProject("02-metaballs", "413b2cb4-f7db-11e1-bf5f-a716de6a022f") -exampleProject("03-raymarch", "1cede802-0220-11e2-91ba-e108de6a022f") -exampleProject("04-mesh", "546bbc76-0c4a-11e2-ab09-debcdd6a022f") -exampleProject("05-instancing", "5d3da660-1105-11e2-aece-71e4dd6a022f") -exampleProject("06-bump", "ffb23e6c-167b-11e2-81df-94c4dd6a022f") -exampleProject("07-callback", "acc53bbc-52f0-11e2-9781-ad8edd4b7d02") -exampleProject("08-update", "e011e246-5862-11e2-b202-b7cb257a7926") -exampleProject("09-hdr", "969a4626-67ee-11e2-9726-9023267a7926") -exampleProject("10-font" , "ef6fd5b3-b52a-41c2-a257-9dfe709af9e1") -exampleProject("11-fontsdf", "f4e6f96f-3daa-4c68-8df8-bf2a3ecd9092") -exampleProject("12-lod", "0512e9e6-bfd8-11e2-8e34-0291bd4c8125") -exampleProject("13-stencil", "d12d6522-37bc-11e3-b89c-e46428d43830") -exampleProject("14-shadowvolumes", "d7eb4bcc-37bc-11e3-b7a4-e46428d43830") +exampleProject("00-helloworld", "ff2c8450-ebf4-11e0-9572-0800200c9a66") +exampleProject("01-cubes", "fec3bc94-e1e5-11e1-9c59-c7eeec2c1c51") +exampleProject("02-metaballs", "413b2cb4-f7db-11e1-bf5f-a716de6a022f") +exampleProject("03-raymarch", "1cede802-0220-11e2-91ba-e108de6a022f") +exampleProject("04-mesh", "546bbc76-0c4a-11e2-ab09-debcdd6a022f") +exampleProject("05-instancing", "5d3da660-1105-11e2-aece-71e4dd6a022f") +exampleProject("06-bump", "ffb23e6c-167b-11e2-81df-94c4dd6a022f") +exampleProject("07-callback", "acc53bbc-52f0-11e2-9781-ad8edd4b7d02") +exampleProject("08-update", "e011e246-5862-11e2-b202-b7cb257a7926") +exampleProject("09-hdr", "969a4626-67ee-11e2-9726-9023267a7926") +exampleProject("10-font" , "ef6fd5b3-b52a-41c2-a257-9dfe709af9e1") +exampleProject("11-fontsdf", "f4e6f96f-3daa-4c68-8df8-bf2a3ecd9092") +exampleProject("12-lod", "0512e9e6-bfd8-11e2-8e34-0291bd4c8125") +exampleProject("13-stencil", "d12d6522-37bc-11e3-b89c-e46428d43830") +exampleProject("14-shadowvolumes", "d7eb4bcc-37bc-11e3-b7a4-e46428d43830") +exampleProject("15-shadowmaps-simple", "a10f22ab-e0ee-471a-b2b6-2f6cb1c63fdc") +exampleProject("16-shadowmaps", "f9a91cb0-7b1b-11e3-981f-0800200c9a66") + dofile "makedisttex.lua" dofile "shaderc.lua" dofile "texturec.lua" From 6f5119a9330a67b19b6c08dda78d453c00c6d844 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Mon, 13 Jan 2014 21:15:22 +0100 Subject: [PATCH 5/8] Added binary shaders. --- .../dx11/fs_shadowmaps_color_black.bin | Bin 0 -> 462 bytes .../fs_shadowmaps_color_lightning_esm.bin | Bin 0 -> 5004 bytes .../fs_shadowmaps_color_lightning_esm_csm.bin | Bin 0 -> 8196 bytes ..._shadowmaps_color_lightning_esm_linear.bin | Bin 0 -> 4976 bytes ...dowmaps_color_lightning_esm_linear_csm.bin | Bin 0 -> 8084 bytes ...owmaps_color_lightning_esm_linear_omni.bin | Bin 0 -> 6806 bytes ...fs_shadowmaps_color_lightning_esm_omni.bin | Bin 0 -> 6834 bytes .../fs_shadowmaps_color_lightning_hard.bin | Bin 0 -> 4888 bytes ...fs_shadowmaps_color_lightning_hard_csm.bin | Bin 0 -> 7732 bytes ...shadowmaps_color_lightning_hard_linear.bin | Bin 0 -> 4860 bytes ...owmaps_color_lightning_hard_linear_csm.bin | Bin 0 -> 7620 bytes ...wmaps_color_lightning_hard_linear_omni.bin | Bin 0 -> 6690 bytes ...s_shadowmaps_color_lightning_hard_omni.bin | Bin 0 -> 6718 bytes .../fs_shadowmaps_color_lightning_pcf.bin | Bin 0 -> 13349 bytes .../fs_shadowmaps_color_lightning_pcf_csm.bin | Bin 0 -> 41649 bytes ..._shadowmaps_color_lightning_pcf_linear.bin | Bin 0 -> 12273 bytes ...dowmaps_color_lightning_pcf_linear_csm.bin | Bin 0 -> 37265 bytes ...owmaps_color_lightning_pcf_linear_omni.bin | Bin 0 -> 14039 bytes ...fs_shadowmaps_color_lightning_pcf_omni.bin | Bin 0 -> 15127 bytes .../fs_shadowmaps_color_lightning_vsm.bin | Bin 0 -> 5180 bytes .../fs_shadowmaps_color_lightning_vsm_csm.bin | Bin 0 -> 8900 bytes ..._shadowmaps_color_lightning_vsm_linear.bin | Bin 0 -> 5152 bytes ...dowmaps_color_lightning_vsm_linear_csm.bin | Bin 0 -> 8788 bytes ...owmaps_color_lightning_vsm_linear_omni.bin | Bin 0 -> 6982 bytes ...fs_shadowmaps_color_lightning_vsm_omni.bin | Bin 0 -> 7010 bytes .../dx11/fs_shadowmaps_color_texture.bin | Bin 0 -> 1456 bytes .../shaders/dx11/fs_shadowmaps_hblur.bin | Bin 0 -> 2142 bytes .../shaders/dx11/fs_shadowmaps_hblur_vsm.bin | Bin 0 -> 2502 bytes .../shaders/dx11/fs_shadowmaps_packdepth.bin | Bin 0 -> 662 bytes .../dx11/fs_shadowmaps_packdepth_linear.bin | Bin 0 -> 590 bytes .../dx11/fs_shadowmaps_packdepth_vsm.bin | Bin 0 -> 802 bytes .../fs_shadowmaps_packdepth_vsm_linear.bin | Bin 0 -> 730 bytes .../shaders/dx11/fs_shadowmaps_texture.bin | Bin 0 -> 642 bytes .../dx11/fs_shadowmaps_texture_lightning.bin | Bin 0 -> 3693 bytes .../dx11/fs_shadowmaps_unpackdepth.bin | Bin 0 -> 1342 bytes .../dx11/fs_shadowmaps_unpackdepth_vsm.bin | Bin 0 -> 1342 bytes .../shaders/dx11/fs_shadowmaps_vblur.bin | Bin 0 -> 2142 bytes .../shaders/dx11/fs_shadowmaps_vblur_vsm.bin | Bin 0 -> 2502 bytes .../runtime/shaders/dx11/fs_smsimple_draw.bin | Bin 0 -> 9867 bytes .../shaders/dx11/fs_smsimple_packdepth.bin | Bin 0 -> 662 bytes .../shaders/dx11/vs_shadowmaps_color.bin | Bin 0 -> 1128 bytes .../dx11/vs_shadowmaps_color_lightning.bin | Bin 0 -> 1987 bytes .../vs_shadowmaps_color_lightning_csm.bin | Bin 0 -> 3096 bytes .../vs_shadowmaps_color_lightning_linear.bin | Bin 0 -> 2063 bytes ..._shadowmaps_color_lightning_linear_csm.bin | Bin 0 -> 3256 bytes ...shadowmaps_color_lightning_linear_omni.bin | Bin 0 -> 3167 bytes .../vs_shadowmaps_color_lightning_omni.bin | Bin 0 -> 3007 bytes .../dx11/vs_shadowmaps_color_texture.bin | Bin 0 -> 1240 bytes .../shaders/dx11/vs_shadowmaps_depth.bin | Bin 0 -> 1128 bytes .../shaders/dx11/vs_shadowmaps_hblur.bin | Bin 0 -> 1911 bytes .../shaders/dx11/vs_shadowmaps_packdepth.bin | Bin 0 -> 1216 bytes .../dx11/vs_shadowmaps_packdepth_linear.bin | Bin 0 -> 1224 bytes .../shaders/dx11/vs_shadowmaps_texture.bin | Bin 0 -> 1240 bytes .../dx11/vs_shadowmaps_texture_lightning.bin | Bin 0 -> 1694 bytes .../dx11/vs_shadowmaps_unpackdepth.bin | Bin 0 -> 1240 bytes .../shaders/dx11/vs_shadowmaps_vblur.bin | Bin 0 -> 1911 bytes .../runtime/shaders/dx11/vs_smsimple_draw.bin | Bin 0 -> 1943 bytes .../shaders/dx11/vs_smsimple_packdepth.bin | Bin 0 -> 1216 bytes .../shaders/dx9/fs_shadowmaps_color_black.bin | Bin 0 -> 149 bytes .../dx9/fs_shadowmaps_color_lightning_esm.bin | Bin 0 -> 2719 bytes .../fs_shadowmaps_color_lightning_esm_csm.bin | Bin 0 -> 4443 bytes ..._shadowmaps_color_lightning_esm_linear.bin | Bin 0 -> 2715 bytes ...dowmaps_color_lightning_esm_linear_csm.bin | Bin 0 -> 4407 bytes ...owmaps_color_lightning_esm_linear_omni.bin | Bin 0 -> 3769 bytes ...fs_shadowmaps_color_lightning_esm_omni.bin | Bin 0 -> 3773 bytes .../fs_shadowmaps_color_lightning_hard.bin | Bin 0 -> 2679 bytes ...fs_shadowmaps_color_lightning_hard_csm.bin | Bin 0 -> 4311 bytes ...shadowmaps_color_lightning_hard_linear.bin | Bin 0 -> 2675 bytes ...owmaps_color_lightning_hard_linear_csm.bin | Bin 0 -> 4355 bytes ...wmaps_color_lightning_hard_linear_omni.bin | Bin 0 -> 3741 bytes ...s_shadowmaps_color_lightning_hard_omni.bin | Bin 0 -> 3725 bytes .../dx9/fs_shadowmaps_color_lightning_pcf.bin | Bin 0 -> 7584 bytes .../fs_shadowmaps_color_lightning_pcf_csm.bin | Bin 0 -> 24432 bytes ..._shadowmaps_color_lightning_pcf_linear.bin | Bin 0 -> 7260 bytes ...dowmaps_color_lightning_pcf_linear_csm.bin | Bin 0 -> 22252 bytes ...owmaps_color_lightning_pcf_linear_omni.bin | Bin 0 -> 7958 bytes ...fs_shadowmaps_color_lightning_pcf_omni.bin | Bin 0 -> 8662 bytes .../dx9/fs_shadowmaps_color_lightning_vsm.bin | Bin 0 -> 2799 bytes .../fs_shadowmaps_color_lightning_vsm_csm.bin | Bin 0 -> 4827 bytes ..._shadowmaps_color_lightning_vsm_linear.bin | Bin 0 -> 2783 bytes ...dowmaps_color_lightning_vsm_linear_csm.bin | Bin 0 -> 4763 bytes ...owmaps_color_lightning_vsm_linear_omni.bin | Bin 0 -> 3869 bytes ...fs_shadowmaps_color_lightning_vsm_omni.bin | Bin 0 -> 3885 bytes .../dx9/fs_shadowmaps_color_texture.bin | Bin 0 -> 555 bytes .../shaders/dx9/fs_shadowmaps_hblur.bin | Bin 0 -> 941 bytes .../shaders/dx9/fs_shadowmaps_hblur_vsm.bin | Bin 0 -> 1133 bytes .../shaders/dx9/fs_shadowmaps_packdepth.bin | Bin 0 -> 269 bytes .../dx9/fs_shadowmaps_packdepth_linear.bin | Bin 0 -> 221 bytes .../dx9/fs_shadowmaps_packdepth_vsm.bin | Bin 0 -> 333 bytes .../fs_shadowmaps_packdepth_vsm_linear.bin | Bin 0 -> 261 bytes .../shaders/dx9/fs_shadowmaps_texture.bin | Bin 0 -> 201 bytes .../dx9/fs_shadowmaps_texture_lightning.bin | Bin 0 -> 2228 bytes .../shaders/dx9/fs_shadowmaps_unpackdepth.bin | Bin 0 -> 361 bytes .../dx9/fs_shadowmaps_unpackdepth_vsm.bin | Bin 0 -> 365 bytes .../shaders/dx9/fs_shadowmaps_vblur.bin | Bin 0 -> 941 bytes .../shaders/dx9/fs_shadowmaps_vblur_vsm.bin | Bin 0 -> 1133 bytes .../runtime/shaders/dx9/fs_smsimple_draw.bin | Bin 0 -> 5654 bytes .../shaders/dx9/fs_smsimple_packdepth.bin | Bin 0 -> 269 bytes .../shaders/dx9/vs_shadowmaps_color.bin | Bin 0 -> 283 bytes .../dx9/vs_shadowmaps_color_lightning.bin | Bin 0 -> 802 bytes .../dx9/vs_shadowmaps_color_lightning_csm.bin | Bin 0 -> 1451 bytes .../vs_shadowmaps_color_lightning_linear.bin | Bin 0 -> 818 bytes ..._shadowmaps_color_lightning_linear_csm.bin | Bin 0 -> 1515 bytes ...shadowmaps_color_lightning_linear_omni.bin | Bin 0 -> 1462 bytes .../vs_shadowmaps_color_lightning_omni.bin | Bin 0 -> 1398 bytes .../dx9/vs_shadowmaps_color_texture.bin | Bin 0 -> 319 bytes .../shaders/dx9/vs_shadowmaps_depth.bin | Bin 0 -> 283 bytes .../shaders/dx9/vs_shadowmaps_hblur.bin | Bin 0 -> 754 bytes .../shaders/dx9/vs_shadowmaps_packdepth.bin | Bin 0 -> 319 bytes .../dx9/vs_shadowmaps_packdepth_linear.bin | Bin 0 -> 351 bytes .../shaders/dx9/vs_shadowmaps_texture.bin | Bin 0 -> 319 bytes .../dx9/vs_shadowmaps_texture_lightning.bin | Bin 0 -> 577 bytes .../shaders/dx9/vs_shadowmaps_unpackdepth.bin | Bin 0 -> 319 bytes .../shaders/dx9/vs_shadowmaps_vblur.bin | Bin 0 -> 754 bytes .../runtime/shaders/dx9/vs_smsimple_draw.bin | Bin 0 -> 738 bytes .../shaders/dx9/vs_smsimple_packdepth.bin | Bin 0 -> 319 bytes .../gles/fs_shadowmaps_color_black.bin | Bin 0 -> 123 bytes .../fs_shadowmaps_color_lightning_esm.bin | Bin 0 -> 3544 bytes .../fs_shadowmaps_color_lightning_esm_csm.bin | 251 +++ ..._shadowmaps_color_lightning_esm_linear.bin | Bin 0 -> 3588 bytes ...dowmaps_color_lightning_esm_linear_csm.bin | 259 +++ ...owmaps_color_lightning_esm_linear_omni.bin | Bin 0 -> 6685 bytes ...fs_shadowmaps_color_lightning_esm_omni.bin | Bin 0 -> 6639 bytes .../fs_shadowmaps_color_lightning_hard.bin | Bin 0 -> 3422 bytes ...fs_shadowmaps_color_lightning_hard_csm.bin | 243 +++ ...shadowmaps_color_lightning_hard_linear.bin | Bin 0 -> 3466 bytes ...owmaps_color_lightning_hard_linear_csm.bin | 251 +++ ...wmaps_color_lightning_hard_linear_omni.bin | Bin 0 -> 6564 bytes ...s_shadowmaps_color_lightning_hard_omni.bin | Bin 0 -> 6518 bytes .../fs_shadowmaps_color_lightning_pcf.bin | 401 ++++ .../fs_shadowmaps_color_lightning_pcf_csm.bin | 1492 ++++++++++++++ ..._shadowmaps_color_lightning_pcf_linear.bin | 405 ++++ ...dowmaps_color_lightning_pcf_linear_csm.bin | 1508 ++++++++++++++ ...owmaps_color_lightning_pcf_linear_omni.bin | 495 +++++ ...fs_shadowmaps_color_lightning_pcf_omni.bin | 491 +++++ .../fs_shadowmaps_color_lightning_vsm.bin | Bin 0 -> 3955 bytes .../fs_shadowmaps_color_lightning_vsm_csm.bin | 311 +++ ..._shadowmaps_color_lightning_vsm_linear.bin | Bin 0 -> 3999 bytes ...dowmaps_color_lightning_vsm_linear_csm.bin | 319 +++ ...owmaps_color_lightning_vsm_linear_omni.bin | Bin 0 -> 7098 bytes ...fs_shadowmaps_color_lightning_vsm_omni.bin | Bin 0 -> 7052 bytes .../gles/fs_shadowmaps_color_texture.bin | Bin 0 -> 605 bytes .../shaders/gles/fs_shadowmaps_hblur.bin | Bin 0 -> 1451 bytes .../shaders/gles/fs_shadowmaps_hblur_vsm.bin | Bin 0 -> 2703 bytes .../shaders/gles/fs_shadowmaps_packdepth.bin | Bin 0 -> 328 bytes .../gles/fs_shadowmaps_packdepth_linear.bin | Bin 0 -> 288 bytes .../gles/fs_shadowmaps_packdepth_vsm.bin | Bin 0 -> 512 bytes .../fs_shadowmaps_packdepth_vsm_linear.bin | Bin 0 -> 429 bytes .../shaders/gles/fs_shadowmaps_texture.bin | Bin 0 -> 190 bytes .../gles/fs_shadowmaps_texture_lightning.bin | Bin 0 -> 2169 bytes .../gles/fs_shadowmaps_unpackdepth.bin | Bin 0 -> 366 bytes .../gles/fs_shadowmaps_unpackdepth_vsm.bin | Bin 0 -> 341 bytes .../shaders/gles/fs_shadowmaps_vblur.bin | Bin 0 -> 1451 bytes .../shaders/gles/fs_shadowmaps_vblur_vsm.bin | Bin 0 -> 2703 bytes .../runtime/shaders/gles/fs_smsimple_draw.bin | 351 ++++ .../shaders/gles/fs_smsimple_packdepth.bin | Bin 0 -> 328 bytes .../shaders/gles/vs_shadowmaps_color.bin | Bin 0 -> 249 bytes .../gles/vs_shadowmaps_color_lightning.bin | Bin 0 -> 848 bytes .../vs_shadowmaps_color_lightning_csm.bin | Bin 0 -> 1335 bytes .../vs_shadowmaps_color_lightning_linear.bin | Bin 0 -> 936 bytes ..._shadowmaps_color_lightning_linear_csm.bin | Bin 0 -> 1683 bytes ...shadowmaps_color_lightning_linear_omni.bin | Bin 0 -> 1638 bytes .../vs_shadowmaps_color_lightning_omni.bin | Bin 0 -> 1290 bytes .../gles/vs_shadowmaps_color_texture.bin | Bin 0 -> 332 bytes .../shaders/gles/vs_shadowmaps_depth.bin | Bin 0 -> 249 bytes .../shaders/gles/vs_shadowmaps_hblur.bin | Bin 0 -> 1370 bytes .../shaders/gles/vs_shadowmaps_packdepth.bin | Bin 0 -> 339 bytes .../gles/vs_shadowmaps_packdepth_linear.bin | Bin 0 -> 352 bytes .../shaders/gles/vs_shadowmaps_texture.bin | Bin 0 -> 332 bytes .../gles/vs_shadowmaps_texture_lightning.bin | Bin 0 -> 661 bytes .../gles/vs_shadowmaps_unpackdepth.bin | Bin 0 -> 332 bytes .../shaders/gles/vs_shadowmaps_vblur.bin | Bin 0 -> 1370 bytes .../runtime/shaders/gles/vs_smsimple_draw.bin | Bin 0 -> 818 bytes .../shaders/gles/vs_smsimple_packdepth.bin | Bin 0 -> 339 bytes .../fs_shadowmaps_color_lightning_esm.bin | Bin 3086 -> 3491 bytes .../fs_shadowmaps_color_lightning_esm_csm.bin | Bin 5957 -> 9220 bytes ..._shadowmaps_color_lightning_esm_linear.bin | Bin 3057 -> 3535 bytes ...dowmaps_color_lightning_esm_linear_csm.bin | Bin 6163 -> 9440 bytes ...owmaps_color_lightning_esm_linear_omni.bin | Bin 5988 -> 6632 bytes ...fs_shadowmaps_color_lightning_esm_omni.bin | Bin 5945 -> 6586 bytes .../fs_shadowmaps_color_lightning_hard.bin | Bin 2930 -> 3369 bytes ...fs_shadowmaps_color_lightning_hard_csm.bin | Bin 5297 -> 8700 bytes ...shadowmaps_color_lightning_hard_linear.bin | Bin 2942 -> 3413 bytes ...owmaps_color_lightning_hard_linear_csm.bin | Bin 5700 -> 8920 bytes ...wmaps_color_lightning_hard_linear_omni.bin | Bin 5872 -> 6511 bytes ...s_shadowmaps_color_lightning_hard_omni.bin | Bin 5789 -> 6465 bytes .../fs_shadowmaps_color_lightning_pcf.bin | Bin 4282 -> 14452 bytes .../fs_shadowmaps_color_lightning_pcf_csm.bin | 1699 +++++++++++++--- ..._shadowmaps_color_lightning_pcf_linear.bin | Bin 4443 -> 14497 bytes ...dowmaps_color_lightning_pcf_linear_csm.bin | 1743 ++++++++++++++--- ...owmaps_color_lightning_pcf_linear_omni.bin | Bin 7385 -> 17797 bytes ...fs_shadowmaps_color_lightning_pcf_omni.bin | Bin 7153 -> 17748 bytes .../fs_shadowmaps_color_lightning_vsm.bin | Bin 3718 -> 3902 bytes .../fs_shadowmaps_color_lightning_vsm_csm.bin | 417 ++-- ..._shadowmaps_color_lightning_vsm_linear.bin | Bin 3689 -> 3946 bytes ...dowmaps_color_lightning_vsm_linear_csm.bin | 437 +++-- ...owmaps_color_lightning_vsm_linear_omni.bin | Bin 6621 -> 7045 bytes ...fs_shadowmaps_color_lightning_vsm_omni.bin | Bin 6578 -> 6999 bytes .../shaders/glsl/fs_shadowmaps_hblur.bin | Bin 1379 -> 1398 bytes .../shaders/glsl/fs_shadowmaps_packdepth.bin | Bin 274 -> 275 bytes .../glsl/fs_shadowmaps_packdepth_linear.bin | Bin 234 -> 235 bytes .../glsl/fs_shadowmaps_unpackdepth.bin | Bin 311 -> 313 bytes .../shaders/glsl/fs_shadowmaps_vblur.bin | Bin 1379 -> 1398 bytes .../runtime/shaders/glsl/fs_smsimple_draw.bin | 347 ++++ .../shaders/glsl/fs_smsimple_packdepth.bin | Bin 0 -> 275 bytes .../vs_shadowmaps_color_lightning_csm.bin | Bin 1278 -> 1282 bytes ..._shadowmaps_color_lightning_linear_csm.bin | Bin 1626 -> 1630 bytes ...shadowmaps_color_lightning_linear_omni.bin | Bin 1581 -> 1585 bytes .../vs_shadowmaps_color_lightning_omni.bin | Bin 1233 -> 1237 bytes .../runtime/shaders/glsl/vs_smsimple_draw.bin | Bin 0 -> 765 bytes .../shaders/glsl/vs_smsimple_packdepth.bin | Bin 0 -> 286 bytes 211 files changed, 10574 insertions(+), 846 deletions(-) create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_black.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_omni.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_hblur_vsm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm_linear.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_unpackdepth_vsm.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/dx11/fs_shadowmaps_vblur_vsm.bin create mode 100644 examples/runtime/shaders/dx11/fs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/dx11/fs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_csm.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_csm.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_omni.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_omni.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_depth.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/dx11/vs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/dx11/vs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/dx11/vs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_black.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_linear_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_csm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_omni.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.bin create mode 100644 examples/runtime/shaders/dx9/fs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/dx9/fs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_csm.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_csm.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_omni.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_omni.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_depth.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/dx9/vs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/dx9/vs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/dx9/vs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_black.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_omni.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_hblur_vsm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_packdepth_vsm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_packdepth_vsm_linear.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth_vsm.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/gles/fs_shadowmaps_vblur_vsm.bin create mode 100644 examples/runtime/shaders/gles/fs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/gles/fs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_lightning.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_csm.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_csm.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_omni.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_omni.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_color_texture.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_depth.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_hblur.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_packdepth.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_packdepth_linear.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_texture.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_texture_lightning.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_unpackdepth.bin create mode 100644 examples/runtime/shaders/gles/vs_shadowmaps_vblur.bin create mode 100644 examples/runtime/shaders/gles/vs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/gles/vs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/glsl/fs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/glsl/fs_smsimple_packdepth.bin create mode 100644 examples/runtime/shaders/glsl/vs_smsimple_draw.bin create mode 100644 examples/runtime/shaders/glsl/vs_smsimple_packdepth.bin diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_black.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_black.bin new file mode 100644 index 0000000000000000000000000000000000000000..7d1068629aecda34d2e37aa0b7a92c4f11522cf8 GIT binary patch literal 462 zcmZ<@_F!bd4mL2lL^wG!pZqlCa`esxvb_S%CCcUNL8>nK)d;o~Q0I>;B zJjlh>Eda@f z93aC|&&X2G($q-L*wE0BVfE_Op26;ZIzYW3`#FGE0f<2W#AgPx7#R40bZ}UFfPb)O zh^N0FgFg;EAmwO!LL7tKT|^tsVf_G&AP_ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm.bin new file mode 100644 index 0000000000000000000000000000000000000000..3a559524007a0a0cbf7c7b111fc384f719e7d549 GIT binary patch literal 5004 zcmai1O>9(E6h1SB(he2IYKb6*7ov#}0<;LoPvEtbp$$K6I)xycc3K7)oX$+wR&rz)Va8%$g%iH7Kgg^9!!D?*G5qb>+BUAO?h@4kEPybdpVlKakm-}$-c z=iSq3Dm@TuE1e#YhvMkrL+Oy2M0;(llqqMXD&1Xjqdg|>y{AiV;eAnUY_gaymb>IG z-a2YyQ<-YEoXh0*XO_vmCg}Jwk;HthN|z)7Ev=2^b0<$#hl`b5HCHTji3juvi}p@U zQD_Cbx8>t4H{8R_4fO5&Y**RWc!R$|El6!|@oI}1c!w>V)Xz{ZAl7qH@3JcIZ{ zkjfv!`(>;sqAjU5Rymb9UOaO!Q`(r$OqKH4@;q!b`)ajT&dRg<^2Lcvz9O@;v-G(f z>n7Gr0uM_b696RxChP3`PHUv9X5cKe^%b&DfZSD&ANUx>hKW3S}0XGU-@Wi}=)`1YY_DUjhS&F1mlQcq@EptIl+ zo#ArvG*qUF$D!(UJm<#%HlyRTQmri9yvM1n)vFXj?-3mtJMz`yB zyB_S!fCO)hM$He6Z^Wg8^LSXbf|q%dQQyNeQL*qeRBYZHY=F%ZP$j()vk$V$lo=Yi z!pULt*8tFDWh#{^_vb3rOkpxxk%PI(ap{HNFVUh7&+Opx2HH&%3-Q6-fnBI5j9P($EdDTzZTClQOnWflQElx(9@jjU4PfAftPa?im^y>6anIvJQIm%~(7vCEAl1 z3w(_Bj_lhziUFA(=pVVY7?)C;Z5WVtYbWSJZbVf`V?3x*dIPDGLe*) zax!Vo_cfXMPUzMJ`>u zxN9p)JYi*56G5zT$ViZX&&7S*$0MLR7?8FA>IWXnYlbuoxwMuydO52r^d&)%7~FY)$c>~;j3NsQ_~&~ zkx#M0`>@YY9op!V--7cQvPbN#Do@3erjFFzhB2Y%1vxeP%yU8QwBu|;jK;2o`;c$u zKW%Fc-+`{>jFmFx%5RpW`P1jz(mIWL`08zb%Ex6S#r z`J0>&CvEV1*W{pal50Kao3_kb@4)9)zWJZ?I}dVv-x6^;Ru?L5o!HZVvt6~(x^ zPR?&ItjCyHC$(2OV+xEas^oT6h zyjRpcgRwShgPGtk=q9L3(r-cMOV|c;!|BC+YU|7nxY|DRAAJ$|x(~UVo@%`0G3T#Q zd-yZ;VXah-SlxH%a?u{yy0Smahu@LLL{2}P6_oLgsZR_wGl%EhQOrK`9fA`_bxh9< zhFL;iyc?8(+}}I)i#p0#Ti(-oz8m%?KkMJ!cl8VI@<&bGT~^;g{Kz9D(|k2I-k&~3 z4_a%v+HDBUK$Y=MHS6mg`2;>VpPS{ZcQdAOz{Gs_JU{Hm#^8r-)g}~+ncu9ZV%BaK z@=E+*^J&HJ4(h~xJer99Rgd$>^Z`93L1tzsdpY;6M@T-y(wW9RbjG<{^})URppNUU^)VC3-7HrhSEy@sxK|&{lRgZ$a`pvs^S6sQ^CYPrWvgwi zR)oHRY5)DL>}Ru#_gt~KPfzpjx%%K;)Nfn!a)0A&j2d@T?jON3WBWz>sJuPs6Yq|b z0b}i3-|_Gip>3<}BfjHSr?(_of756f-wk`K8}~&vT>pI+RmizmgOEK%oSzL_oZSNK z$Xgyo@*$R*bo literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..2b17d18511f01ea40d5f02daa47e8de2e9bd1091 GIT binary patch literal 8196 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 Jq0j%0e*tr{H&_4w literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_esm_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..b621f7ee1f43c58f7969b88a66ef452390704a69 GIT binary patch literal 8084 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..64fcca9502300ceeca77ebd854da106a88b1d881 GIT binary patch literal 7732 zcmchbU2Ggz700i~u4B6)F(!^^pvoxp0SroGhkhhf^*C`hiJHWg?S{Yu&c@y}i)`;| zcTLIz)i!)6NL7G}2Oe4ow4{{`5)UAx0#((gAQdS>Adui852z~Qr9>hUyoCR6=APN{ zWRj)`|V^J=9ft_NOnn8!o0Bkh`(bT^#6Nov)W0<>lt+uzRDw z%cb9A!|sZ{H>}Pt)Rtr>d0|3C~tE(5{SRvU>XTYO~@cktADupV@k4VRfn8 z@Sc;j_8&a| z{4dYWo&W7;zr1}UHqq5Fk0X9~E?KbRzgG;qj<)x-uTU#TR`v^t}y*SW`>I4ZD4JOPj`tO!F zSRQW+4~0j1pz~h;d*Ubc9qEA#e@Xa7fIeQ%{lx448eCWuqaFRr!mk$Ke-<99Nb~xC z7k;t;{}=X!izP&1hz7-fCOjY4HsNo0JdmE{;Q`@S3huT|Sa+h>clInXEPIL=w(k7sfccZdBohT^hGfm-MJv;Y2G`4g1=;)|h zJ3M>v*x!^*mO0O5JrJ3-%xqTs4}hM)k#EqZ`xkfyXDy%)ZnJ|v&t?h0(Sg8N=Z5nQ z!Bw^?ZhHYZ=YZ*>1A*fM{>&bqpPrgMJa>5Nm^(H#b9CZ}n>%n~|J2mXq?=N#pOPMa z5o@T&$i~KZ*_fM{Ie1`B8}RI*$(gHLv_^$LssTSImrEByeL454p3gJ<$-y`dYvY%- z@z>h;c;drStta|VKH2%EPxhOB*>C#teQMBkHwFje7-(Np8{e%>uB?qsYh#Z#eX&)M z-`B!qH$9^%(N^F#DTUYk4qMui*uB0z;U*(@$QTD1++@rvGR8#)AJy(TCY$*9_CPXT z5a~Ws|H?Rz;Fx50!;sh8=J|l<*f{0eL6qnZ{OMzl@$hx&-o!38c6hxJ&&}5D>>toI zinxizd@MbaeB0cb4l$t<=RrDrqXV}*kZbY)Cl7GzPwwd-=SuyN(Lbw0ZK4B)AM`;7 zzTNe7XY+#J~kWo3q$kI0x4 z9jzVx$hqIW_15E$XerNlS+BPhB(m3~j!w+MMD6(Pxh6iY7qGqROAbanN5+^YgCm2o z{qk{a*P1Z@rP@!wZw-nh)fa+6p4QTzj`3h2H** zo^f6EQyY1Iit^f(*ccyD+8@?7Y2zC{EF77w8AfD%$d(Hty+qlyXY&JYIWj-6@utr~ z5TTKft-VW%3%l6ZcZ+=A&OWuA9qXEG+^&{wEXyl>(I@wC{KW=(eqZAm+Wsrq*p=xnvJ|a^7p3NPU3IB@A_rG z3?jWm|IhlxE`D09OxzpM}H(wjvy@E)uyHFdP)%IxDN$0*al-%`< zPwJe{u6Mk9RQe6S#xD7Lwdu=NeEy(UIv2v+kMv~QS(~;`$YvilshQMfroZkRy(TXO zgYjJm-974O{w4dn?quyyl4M-5e)@H*As^#@tih~5#D7jYkZdQqp5rSr_7iFdviPxi zeRCqSe#CG3HpV6CW!rh1*tYn4vNnDE^q1Yf)UJ;|j!AyfNB`HxF_@q5u1GHtwufW^ zJKNqwWy1pH^kk^L3`kF3{shsthwS#Zu!}^=tY#-%k^A+dDe7}Kn_JqHi#(oNe#+}_j@F-8uokJfF9Np}F>Abf*H zGIHyqJ9w%WL}=MrnQ-f?dv+R2KL7g1d7tJgzN_G`*-qvTJDuFiUR=M@_jB7Gm#=BP zSzpT$PxWj|flW>-9opWiMvM`k^*Xf8MmM)7nOc=TE{bs1Q zbM)=?^Qb!RP4zYnwx5kPV%wemUN?xGd+@b);@^*O9&(WBANS6W9pBZz9>%g4^|rC& zyoX6{ztNp=ySK%AjhB&c@~DBkX6Gj6TKf8h9{vl2IHSK1x19T=ICmqkBI+psM}%?z Heoy)@1nnm1 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..557679bf7ea878701261968f38f8ec7b582a7f0b GIT binary patch literal 4860 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..a433790161f092336cc88494b9060789fa4bd851 GIT binary patch literal 6690 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_omni.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_hard_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..6fa23f5fa13ee3f8b17542fb400388cdaa05cf64 GIT binary patch literal 6718 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 Omn7lL1phMr|MWj)_vSSK literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf.bin new file mode 100644 index 0000000000000000000000000000000000000000..55e2f87a1ee27a93395969c85ded2e7b0b1d4189 GIT binary patch literal 13349 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 H`LFOF?o9(o literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..a307a2c0f162ae8c6cbc58531f7c0ad5e20c06d8 GIT binary patch literal 41649 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 THw5%5XWawPTtlIMK9v3q$ZQ53 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..76c3f28313c0378d31e52f9ba09624cc840d3669 GIT binary patch literal 37265 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_omni.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_pcf_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..1d51517411c256b30a1454ec7c5d8d8c18d38896 GIT binary patch literal 15127 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..11d39eb42ae8729a08b592c89408587170e4ece2 GIT binary patch literal 5180 zcmai1O>9(E6h1SB{)`nS#S*C)UWf~62+$%RNZ|EvXhWfsP9c?;v_lzSaM~H?M~oUX z7Bq2#n2;C@XjMd#ZZI(>l4uAk7A}Y@R!UsCa6uZwLKE=&?z`vqF&*Mb?wotS^K;KR z_uli`L~1b7TsSo-kHpcVN75>Dv6jk2Aze&Qm%7^JW=lley1QNOVBJ)in9Aq!#df)e zRcmEpI$h2bv+3Oa^lG_Z107o}5_?>$)Gl#AD=QPZ?1_`*WWJOwXY(`d;sIS{(Vpp} z*~|=tr!&}SOGwh6J$}4W%2^dT5{CA7T*9o4xI6X_uUTMtAi(iZ>fVH0q)nqXMiW`;AenO z*1<0WFVw+*1YWf`LUr}|1^D?ocxB?vZ07VR-lfb(qycvyik1QyZfPcmdrLi;Z-CCS zB|6Ds{uETE^T(j-bUf$B2oBSMRpLBsr0a3J5oMgGbA^-X(adppVr=@d__l%;xy8-8 z+^icj(;&eYTchTOgI|nG8|SgGY6*+SI-{<`JyEf6H&pDgKDY?hc0iT%)aiYYm8MP8 z$j+Qdny&$%snT>JUF^@6%ITS@Oi2!8r;7Pf{&?AYadd+>IGh^xQfN7uqSu$7E@aVg zyq%l6cW&Cbt$WkfuC6YbA4=^zcozBdl=;+8+FG!(TA7uYmn}|4obsk7k$1q+Vhs`J zTUZGL;_Q>sV-ar(eLD7}hQ66ZXuM6O{R;ntIJli&EWV1;0Q=#a?KxHJ^w zakC%i3z##0#kpq&_6uInbx@lqb6tT{x@{*)Sepmy0^2Thiv`G-L)6EQqv~Ff>fXe% zz!&6Az1ByE)sI=OJ{XJYM}0a9d~imhkJ*q9>eB~#*#9o8(`h+nZJ0AZhxsC(UA(ww z2TFX@%C5$OSfh}UApe$E#_oZ&sftI z_b*0U=Cpcw_?*qzykZos9{o`7hm}v(<9@g7evP;r)PL}?hu>}oJRJooz{vK*pJ;gdhIl<3UOX?Al!=LjFT~}YNk8<@LuCHRMgZt&|J8bMKi}=j0 zx)*=0MYf}TXiSQ?14jj1JrZrf9ai2Cn_lZveWSijMPRI}-e=W^uNKu$%zE5hzQPF4 z!#+E$Z=M-_^6omHA$!E$sPaTKs2z28!cO-KauV5P>&$&YEwp1VMvSKB4V;I3Gk-lx z_zrX}XRMSlSFO9|PoEF$Jybj9ull;j)zE&N*ZQPy&7b|<`Lr?827b+bqps#}azdQ6 z!F@D2Xq@C)5Bg?I%v)>ot(9;4=iKfC{M_6TaXMBPD$Q+}(|@g9zU|D7tsyz@TUd`V zvrcNSa>f+ivsTVMwSKI(&BvXa%1tiz4RNmiS9nY7KtI&kZ_m=&0ukXm)x0~Zp21if zwLzbA7<654(7T{-K5T=x>hz*M&Gj1-aJ5Ardg8f=eBX=Q&6#Svhdk|OwHXyFX29X8%U-to6NUZ_eNPckf;O>U-c`?Cp%3q`rgrkw-|T`D$)_KfTtj({i=j9O{88 zx^zv|-( z=IVoU^+6qXw${g7Aa}i7eSAY*tHZhaV4n10xRvu?qzdX%w_qz=m?KKi16 zVF%B%R>pU(SQL6v^Ul==-=f}a&C9(X8>7ZuFZa*knX&z<=cv3TI48axCj-XXH-6;d zSA@2W_8f7K8=c;Yc=dgwVSF#zTivKHviZiJd#FOr!5W0@DPsRzw8h>Hzz%=lQ6!f! zbZ=94FR1N@4FNxlzx7C_*H{_r%{pS^NNTKStc=wOj7GvBp4*U_p{U@j7xS%0^>F%O IjQ>mj0sU@3?*IS* literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4d7adfbd946a79d7576895ccfad62de1b860eab GIT binary patch literal 8900 zcmeI1U2I%O701Wdu2Z`qu}mG&P?XzH39ulI9omvmHP?ybBx({{wi^Y6WN++EVq|+) zyKB-Hs%`iXNT_^>hdh*GXb4CK2??HBR8@TnQjsD=1rj_&0#)U$L?RNrg#Yi}Id{kF zn=gcT>XGg}Gyiku%$YNDX6EjWO&#eNd*K%^xtlJfn~=M?*{$~WtjttPwbD|3Xu!SE z)8X>^@PNCj`lgkcxyoXtHsG$Qws~b{snjUf7D|iHl(xC|+MxMu&h@U>st>q6L0ea5 z78lN*YfMz?3yp=!@_>tle$b;MOQ#pg%MzY1tE1h4WOU)onU#9kOA<*Q^lhf9<++u` zQq7AdBzhQHy z&aTe>^`+yl-8l2xt6M*H>0ccR+QmnlyHEVndcNB2Ty>Lkm-IX=d~)>A*b!mqy{lJ` z_``Z!m!kY#=e9}ql<-clfVxzs4bMb@oc>HcUm%y+T>e~vT<+!aZ%H1hj!pVy1z7(d zP<^#PZv7+wb%EUaM}DP1Zv7+wi{wRQ@XAd6Txq^?{&=and#bclT`bpJfDIL3!v)x$ z0&Mqm`MJhQt-Q`&0XAHK?J?}p!;6*ErNz2iTU%o+4>1@8bhWoNs#641)R!?g@9Pb5 zuy(vDJQkklfxhAOFN)8qp6G!Le?|Bz!2P_O`?=Tu4Y;r*MO*q;gkLMb|0F!tB5l|I zyYSfp{GZqtE|w7sL)0h!OX2O~+AjPJk4Mt8I6Nx+Y5~4W__YH33E}Sv-z*#08C4yc zhAZyvcu9DlaQq4TT^1e};Li)+U4Va2cv6607Cupczb1UP0DoI}wE+Kz@TSKZkHx1; z3H6-y%E{2Azpo<%?2Ts?19@*NJgJ z~M5Y(F_nGE#76NLF7;H=Kp#vlHnlDrm00G*+sOF4P;P z<+*a*9bcHMRqB;9jrik}pNNkfn>rRxX{#&O;)9i?>Vh`9c<-*^y}R~4KD=ws(9n=u zJ34jv#NQN6(wygt9*D?VWVWjO2S88Y$Tw-z{WCnk$p!SmZFbP-*(w1zIuICnZa8%a zu4S9!wikeN4wybV5I8>I&(z78iSenU(?`coxD(@($48F2=|iUuj*m}{x^a#5lhVU4 z#v1D}vcBpontc*=7V~;Xzu~nAe z*W+wAJ*O$rR^YZMgxCEJJN95^_r{Kln~c~YqaS2&lQFNz=ocA$NW15-Y~tfPy;*-z zqWets%lml*rzE?Z`n}$E&wD+`#%W)Ul1#t%j~{)ChuY-_GP~H=>GcLZH(R%}e@NFT z#?4sF$Fb+Ly3MWWFeY@;I7o*&I&g~vu_g|1;sCey#GdwPtkfPE?L!^bCOTmFK^t`7 zJ6u<17#I8|wo#&2PEEzNx&NIlt+?DSw%CBiynd8W%WP1BEPj-UDTE(TC^O7_M8=%x zXl>~y&i(GKx1N4dsXXar-QHG|$zGQ_Iw=PeHPg4}n)r0RfbCOTVle1AGWs+b92pe0 zYahoB<%Ib!)gEF74f-7GZN|-!6mjk)apv1}tld7Z`x$L9=0h%P#%XKXYM<$)Eq;%Q zv-YAyFW3C6o;)wmvo+0{xRoCLz3Kh!?#k@m_;!rJ)Yp#$F|l!5Oor9R1skjD%g1PP z;tT0}^!g`9)Vo;a@*3)<7@FTZnnet8fH3LJ9+!<-anIdBzW80->;?l zgpLyP$?yT;$ZTIhn?0mMJWBKuh5M86d_4{NzN}AdSlpw8mKoXpbXhrtU2GiiZEY-O z>vs0Z_pq<)vcZ~(61{S2<-7H@Gw>6AVgtutY@kQJ!=ps6f_yiB=^s68wA;5an2(aD z`#t%7^1f`{L`jzK3Ku{X&L+VY_z!$Z_jW zsy!Aba-7^M%5l@NcH}s^1-!T{n-D`h&=E)7j@S(+P8Y zuuYb&k$cZ^&fO@{OZ30YaqKF7>((TFnBT~3oQByri*lT~h!VYWYUQ}~W%jUxzG9zp z%klJ%p&W0GdE=RWAc!k^*l4%k?yrrrAa~O3eF5^Q_B*|4051m%Gg$ zbni8P_zsE^z3z}dx6*q*f9@@RxEI@_(>c$NvHtAa)A*?F)Zw|o3@O%|YJRW2tUC;3 z`l_XOy%f6;!`zScj0NS;rkyv;A2!LW+-A^5cl&OWk44#?2Hm~Ey^Oqq_BG>_)32z9 zcAYB7$Mi159vu3^_%BEYlI={_b9_a{xkR2pHhyg0*qX_#9pg8B>*KQY!g9M!Y}@#| zLYsd4w3prVdkkG0e>x`lNgLhe(lMBy@Qy?;5w`nf0X>V&PgO?#_`hG&k(zzK7Rf99 zUwL&;AZHH?_3({&?DV+F&GvDA#=Gj=u$SBSFMV2^Z2#)@cU9~oH=je?>~D!Tj#qlA zZ_oJez|>D+knX4H_bS--W(?$rfwj@z29#pq{Tbh&!9Z?pbf3-d*-?U)-MKPuZS_5# zkEK2S`UmWQ<|_Sd0pHAaHh0(w<|eqyo1A;M#nIYYjObss)A>QCQ)TnXWPCFtBbUr3 zck$~U%X3k8OWN}tiLRoO|At5I(+@d-OqAb^@ricEiEXXjcB_4wpWc4{y=8W7-P0Gp zao{&(wln`VjzDJPwXu;W2YkCh&#m2K!Cq%Fa;IJ2=I}@ATR#`)`(w~%Lm%dcnzVjb zX~wELhaK-jLM~Z<)+V&OQ$BY}-!R|qX^kuYZNh#NiV`Wd5%%Bo<7V$7*8FY(NtW)F zieLV%`HIT6cTpxD%pW?;OUf_AsyX*VJ!S*D_Pu&ZWwSxqY@n0Rt+%n7$@4wiZ2SaW zuS3~vbb|Z6+T_Gj^7M>C&Nv~{Lq;5-?Vfie&Rs~p|0MI-E+fwki=@|{=VpUkw6$&H z%JawjXnq%s{bgCkx8Hl8x{dc_^F;3CGGWBN`ecD mj;ZO9>4s`=>*2o%h%>sDmYn;TIQKrVBI+st2ZiC|9qB))ZfYd} literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..ce9656b22e2918f42d20573cf8550857c8f57549 GIT binary patch literal 5152 zcmai1O>9(E6h1SBmW~xB)e=DrFT@yV2((2&egdzh9f}m%bP7Q>?a)qPaN3#7kC150 z2x#I4A#sBdt%_*U4JJkdiG~mtEL;#*tPF9bi3`$@E?ii@@4kC(AHyTw z&bjxVfmFIbwyb!%UlzoTg#~GmnM8ASw3sPnrpldda=SSu?z^i^?%}(sIyzp+7fNmN z0ADTD(Wy)&Tgqkf2Qw?>VI4HFQY7)XRk=-)fL2sT^SP6!Dno^Gu97QEw}}VzIg55r zoycXUp*)ktMjatdZ*Fq3TFzRH56$z|Ctb{rSM!;YRSiM4%Bc#K-drg=&YccSPm^>E z`WJP(N+mm8%}|>z7Ak{PWYi`_SUhU&J=U|YZ|3stzi#&ba_7h^KfXS&Ykdqwd(I1wP!{mrCNBb~i8^FxOzp5)}Ee$nQ%;-my4g9e|Aw{Vrj~F}Vlv z1q{_ci|=cgQG>o5)zR{)%tYbLp-izOotY};v!%zdk?h$@wUm{Y_vZ^IGWoL1&d!o^ z73N*cnFRjW;V}V>WFTat{oV~ptRC+N?g95PIfktL7~~kfeM}C;-vmBGU>X02RIL34 z;=p`^F4|uL{vZOM0q!+FY5yJYu?YMp@&jjGIqu?{<38jK;PrX^0sOYbc{W;yzk%P2 zz~_NKh`|2^{t$QzILOmt16V_ey4T|yfG2@7p76fgfO`>m3V25ZejKmo%H*d-H1A_Gx_4F%y4!ROpHxm7T;FTB0Jow z)2+I&G7S=Pu{CObIQYf5v~f;^P0RRrtTXC&xF;$W?uLpz)(02C`VOd??ugz8U3tnh zjokFfA@gehXuLd?%9MI@xVaZ{R8O%FO8OyEqVJ2Q^gz_ zj<;h|*N#m)wsvjW(%IQ5vj@`q4_`q3JY_!hQ??eYtX5_P))k9W5U0MWN#t!vv{*BU z^DV4^19A3A4&t1&Paho}8cZJ;IWTxw4i63=>K>4hzGM3a2ZwuQ5V3589l05chpB`9 z9E=4VBi+OM`$o_p)BU}}6L_3H@KrE+1F57gdiWCg7V|i_9!r}1j=ca;4Aw`Eh@41D zLn)aw`*A&oHRD&DduHK3=LKB{wTUy=NHmB7$f(ltoH-t;_4G= z)_SI3&yjjJI72Caonq~woWS#p)+H)u@HuYSx*DpjO6BGoP(H=f26xE$uePzPF6J}4+FtyV zEVd0TLOB#~1C9!~dZb!|d#bV*K0TIGxl!My5-`?P@2uK`t6A++=R9sMUt)&WVa|5T z%`+n>@2BGo`6Kp5)u-Y??P$9Le!5?flZf6e?u*e(KlWS1XlmZTb%>k!>sf+3u(gu0 zQpa4i?wUV2=j}aIKjyFYy2tgpvHFAL38SJrQSPZDF#k6>IX>`xRQx-`Wz=^S*`c7&Ggn{;Fq8 z;XUj1+*9kvdfR;5xvAddV&4$g%D>!uvJT{-%|UyX))$Bf->K%ky5<>-wNW4RGKay| z^#;8Q`sTwvc&pAX?$cd=M*^w7=tECE7m@FKkh?ikjh8a!_(Er6>%dy6o;@X8NBU}w zxIb-qKD6OI(wJ1oUO^q-m~yhu%vsF6(dG8NK+=|PiDzo=CVC0?;oG1N!~F&`7TTy} zZAPEx&v3%B$~zd$G4OZVu%R;zu4Ko#v~#@%{8zzjiCtZ*!;zs*Z1}-d^9x z7uXyBhje{2!{0*M#C`m! z8{}6z_8->zI?j{>I@3d0U;Q2Z3Ty3eT(cfLKicqIj6CPzOXPD*{g1cvJnMCQ z=ZeK)Cw1>!IrtX!Zfjod{n!{a?x@^912bd$P0vwfb8t?4J5C3TwQu~;!(S2lHrjK< zJ#KV%%agVDjD_J|^tZNgUu5&GKljjtl9M$E`BTOIx#)|%8-N{s-=j*dV(Q+e?p{#a z4;lh_6#v%aFulg=SZ~%58^_Wk-6IuzO=30@#^Aa2n-z)*$$By0s1b#ehcW)|_z(TM BK`a0O literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..95292eb11251736e85abf014a7adf93fa787ee9b GIT binary patch literal 8788 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 DVo7Fo literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_lightning_vsm_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..b6784ceaf818cc50237af447b8ceb3ea7d55a5c4 GIT binary patch literal 6982 zcmcIoU2Ggz6+Sz5?bsB1YicVAEg4xnl&DH$m(r$0$=Go=iR#2=*R@g}YHyrLvuM}5 z+8@kAg|{;6u$4yJ+pVG zlZY3Nbobo(&dm^(j}QLx56>m2A=K0^C5Dx1Neh|Gv}vI41HL>`RCc~@xR~r z!@GAseDhES$MV5Gk%z!Pi}5c^ZuN=m?H4%;JU??X_gi4p+rsFs{DF_?2d> z9?GXrm8%zu<%Vo-Zqn!D7&kC>2k~R6%>Y2zh{?C@^A&JnN&M%)ec%BGY0K(wgD>Mb zz#u99d*B-c_V7pKrq#bi99Uq`j{a@nyD2ymBc zI|W|@zLSEtmcCpH*YfBrvYC+{)D<>vDUzWI!ZPZDda~IAo!*b=%-5@5f=Z=&5vs9{ zANw(aMLMuboV!N)eBLfZ8Rx}v?Q$_6UV~?j<+C+6nzGct!*pM)Ow#aMj|C0(1b!pFi?{?y3@B&cwDCjZz7`U&uFVk0kM z%egmvJc;}Ye;MWPv?xC^E<$~rp_6o&KZ}^887Gb z!x%%XcgK%9_GP4!7@qcwn64?3Tlay8`~o94k~O)ed^{oFOvtAb@?R$8>k0Y$jvU_x z{al}U-EZ{FiQEUi$lh!6@b9(ncl-miIUbiwY zpr>x?>y6gJdS?HWat*G}J(AN$?7z!b`?v^4MCyY!%mKN^qB3ggzFpb4qfeboAoBfp z-Z}Oxu6o|e`oKwEU}V3;lsbkJ1GUYs<)1?d-GL47Tkca)K5&gQZeF=hlIB%&$$QCM z@=h|BhJa?K^@Ig5D#9!ws)bICiSxuibxMeh1{_fK66 zb5_(_e5fm5$CyvRhLG2RY3omYWP&K4Hs%6q#f5%nT_AvIo@~5 zuG+nNL6jT4ZxD$W;0JlKgLC2iar467#k`PfUYH{iiWtB-QB~h|YnWy6T5Dt^I)Z zJgXe;iTbI-56?N)@uJ#!yFcK9t;lz9PuVv6n^Yn^oT0ryYO z+w>nBmlx2go9JWR%2|ul=XsMq$p1;3Q`S0r2`Ts0C>Q!ZK7eny3ixx*dy;z~J>T{XrySn~gY-e$G4vO%?FIOW`q$?iq^ey`LV}yKdKE zPU-jVn?7Bb{orrZxCb#eB#mbhYiQnp#c`-y`vKm+dsI)cgHBBF^D)g!TFkC*=*Brz zUFGVV_e%XKraHX8D%)@4Q5pLW^T>A;-(9MwIPWYn5a)y6HvINcJ_DO+>r;Irzx{P! z%&XR{>cf|L2XIyWW_mXLN{;QPR^*B%Zq`k(^ zeiZw3Y~a`2H@lX(mnJ6clQ#N2sQV<>e9$-d#Pia+`z6- zFa0O&sv}>!_Ov7CeRK5~C-XF7ag}pV?wUzC*VOzm-!>i-FZZu<6N{}+&ei{r-+BK# z_9pfh>{(h{1(O_e4%V>=l&tI6n0~Ni42W zydTXy1Sif~;+Yx@y@bA48B)_+{@>K8n|AMEYiH%WbG z0`thd#4?RHlC_Vsex|M6LCe+dDW?ajj5U?i*BbdTmgB#7lXB)eiRnIIV(tQW>iV&J z2wYpWarR>RH}k2OwL6Bm2Cv(A_%5W57vLvB^sjpCKRuA^w;*Juhw={Td-NxmYfs}G zI;MY9hv#DWx{oK3A7Q8u`c)tAVXi(nS0B`g&(`|bh~#lES06v6uGQgOeK1b?Fx<*{ zE|8md7jec(Qa#GXZLan^cVIpE-m^TOd0m>1Afcb%&b)}r2RjVrDnyGPx3TI@fB zXYTD!dXCER{Yrh-PAmh)-1oii<5z^XefDo1+~dAjZz$V-&1e|k9eb6Ps7u~JFf!5qoxlvwN9vya92YOuk zJT~mE>$$%*H(#&S8^i9Fo}OsUEtH#;Mzvgfr99&90rw#a0>Z%u>BM*-}QsZb=qHt+{5U*(e{aHx|mZ z1C2^$al~DeLMzQEUaQn<^|K@HvNTV2XvS-;%80uvyx4(HSH#VA!8bNf93S6z^UaTk zUcWi|$MFw8-Sn-;SI_roTW)N2?lJXWR{NI*xBHyi)bHGJ;nNfQOMeoE-DS02wa=@$ zb=t=tJNELd$vO@2p}nhCP-6~o&VcDZqvsFQx(U8WYi{{W`BeSvk@C`xnexI? ztcR5(Z-qy~ zV>RS*u)nJQgq~wH#PGiezX-6NA8{M(Z-WbqJ-TLpNBFHSI7CGQ586K|{6rW0Y2g=z ztMl?~80=JkS$ICLap6}3&fXXghlOA7f*%ups|)_R@H@hvPz>VK^o+bkFW&R`JHm^? zSxY_F zqVRmaUl)G43tka^wF`b$`1LM$Ywp|C%GqgE7Ps2tdUda~@F0m!x1dtfy}-_`_R416 z12$8Q`Zr~=P(LNp)Fw*fc*QXS1S7^-Cwo2~CPK%!Tw6L*p01o$B-Um(m%E!3`5ozK zG#!m;91g^Qzz8SSa;!?GSaYP&sWtGZ#?dTv-pC0_&cHQY3NyHs!KmKS_c zsxH1U<=r<;FyHxmjMEudvQc4fn;p6H3Z@Cq_ZLYoyMNFQGu|>1_9%w8qPC9ucMygcACNU`blwY5OCJO zdS;HzO-;@mnmsgm)E%9iKC<_)o85nW-{j=q1n#;?BW+{vQrZ4`@sJ{yxe zXliTF@0@B6UjNx@0cR=hu&xIhda{(i0<%-w~_5$2nRe76TtRptoF1 zho!AMtJ|8f$EGKC?kDHZ?|w-~eLCp+)FXx1>;9}EHogawwEb`BzoIL2S3aD#(iajw zbc}nlys}Qjcr`9LmvG6MgiCtk5?vwIPfp+x9l4SZLR>Joq&F@ZmjYIZ_27Bz^|$`kpHK zS_MzsTgws73bB52^3TB}7I|cI#GV|pT;qCa!&)9|p^~#l4Dvv1ZMN2|&M<6*dk*nq zF4Kkl{h8yuqq`K=T8I;F?7T_k3bB5~Q)rAG=O@bxwF_S8jTbm7#QMp}!+60SUW{9d z|Nr7;D9qK3myu3DfZcVO`MXHWdmEE_VRs!}A=XbS$+_dM zBQHPV{Mml{`V;ah#CUZIF;;?}yNEseP5-F)`va%kb!rJx`cA@yy^o*KyVCYi>H+o^ z0rT^;qxN2pICnukoR|%3K)5s5?##SHQ(Zg4#QW;IVGv(zM^t-QS0UCl3^omg|`2FiwS~IhvlF5WSn%o1J0XGC3*E z;}7tW(Pv}JHsyCP#JApJXZbbEY&hFC*Or_=wFw@1fAL;3JHt88$|&W7?;gI3te=q2 zc!+7S#czK@7`)njHhabL?+0eJ@2Owr#@U$S0aJfQh{>L&F;^l~4u7q^&-A52vM<=~ z(mvSwlALtz0?+tK2JrLud?@kr`DJ30zwM=BC$^zyt>}6b$auH>iOIc3XMW^w_Ll!8 z^kF{6`Iz`~W?3h-Dvg=(QCxrC!d(7b`kb^*eC%7%)=6)C5SulzU&hUEg8s#SpL_WT z^xZ2jWb~ZHtQ~p6(@?-o&ziDx=Jm{J{K0p~$LGuXP49CF z_mi>3-w>^R8)W=_?yrQs48A@X_tf&<(vCa^H~9Lv8BDfmZLqUocRuT*yPDb+VnQah z-+J>^9eU`#IQQ|ma`)%b)=Qu4ssG+v+nc}xT$!GllI79oVtW*LWq+{Y9NC)ai9@YG z*PDrH?@+Mxj_Td%&!Kv7?h?$3De+ZKBBdp=VGO~;+e+uI%ag{I?Qzj-};=P_G{ zT>M#JrP(-P4RO}jd@^hC^&3773x2zm*Wk5~5AQ;33bB52LVUBM{`5+3--*)s8p;{6 z_vo)QwwlIRHoksg!@l@_CDM~~KUcFD#I+b7XlyYUTMTT{y$vxgCi=9NTZ~_08*CU` z4Duv~?}MIwk>0<%z{wLaJ9JwES6eb?U?qO6sB&n*Ub(ayHzmENDQ zMq78c+<&IXtnF{MkJjtk7JKeasuKqHeeXp2bq?RY@OO~TabIe;q1b-gTlm;({=v2o zJNNvRPyOG0^fWlg_B3yZqIv^@csSXq_=N%Uu%M{C&snCM-%tV m%ghc--q{HMdz$kj=k)F3^C#bK!dmj8JyTuyALPH>wf9m0 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_color_texture.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..87eb1a4779f2387108b9a7c8d8be79f03ce80bf0 GIT binary patch literal 1456 zcmZuwO-vI}5T0#Ipa|NS7&S3w4<0lzXz?dtkSz8GFi6SnLW+r&0!yeV*`~BgjPYPN zcrYZM_0WU2df@D-CLZhEqc^!qJd)J!+kJ~m?WD7B=9_Qk&Aj)TwPrN;^5lg0(ow4> zt$2UEu;!NC>N(kuYqHyy&Ob;+bH?)Thn=xcUtb#THj=UFnhuABH6AlY=sC!V*ygg!AI}j{hY#3{UP7h%&rCz8x zJ1I_L6}Kv7ry4?RXQx)LI&x*Y?5-Be+tO?{8^}2Y{RVBt@ln!N1ry5uq5K1^#Jcf6 zz;)mTlyao_Ll|ZSz5%5K_<7(B0t5UY7e3`CabSk${o_vn|Jehd1Foa*ZvGSCD?RWM z@CI<6Eu{vZvWs;eIOif1%v&!!FF7wvXRRhp4L7PCXY#BW!>KxDWlJ*(PV7IM=*hJ`@#LLb0$NPGXFHUTqZE#d2k{XgV9H!rs)Odo{i1ERRZSRd?InsOeYD zYx>NbHK$vf#dW8ur`)Yd2@gac9~m7V8NV|+ax0lk@=eTI)AI|c!E@mCj6o@^&Nodt z15JCD{~_+hVOUFrg`72O&*tXE&g4_MoSA0b9O_q06|s?4AxwEAv+i8E_VD1kH27Qs(-B%ck7~p<6m<*ILuP(@)S2fECIJoN*U@zw{e=Eb# literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_hblur.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_hblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..396e70cad19ccab0acdaa54215dbd26cadd08e0c GIT binary patch literal 2142 zcmd5-O=}ZT6unK`G%3`MiYURwAczVQOzKytO(*7?wuxk>B@`h>9ZA8GkfhX&l7(x* zUH9rLD(>_Lxbz?BLJ(ZJ3hq?uIg@!hDJXRj%!Si;-hJ=hd)`gClQDB+?>~L}B7NJX zx!ee(%2$(1sr&Dq1yZfu+R?Sjk;6a6aB2iZCb6Cez5>tT{0O|A5-Fw9nK$q$^MM@a zW&(*Hi#!Cq4vf?1u?cYICK>?aSc86wQs*<+Z&g~g>h1dWO0{v$tZp{$+RXuUY}u>CzcJw`?x!CIaoIo~&;+HV~%A!qHebb|D&`i$o&Q?RN8Kw(try z`~aRQI{=Nkl;&CRr*yhTzjF>kKRJzlzGD^v^pn%*CzPL@#+C0>esUW9>;?ViTIE{N z%v z`52Z)pRcZp+|*<|s%cJs@*X(fqd03QPTh)Aw~f3#T>}%Tp$&{niv)Yp_hsC?nFsxP zO2cK5>0fsa^zZr%k(WDm+>3*_cSz;(+!N`{0hfSzU{Td%k64pB{#4VsgIrvF1|IOF z5ch&LPk3sodwXjld`f8xx%a2t)vM=oXteaOKm1Mi+n@DE-xs_XMt??05BtOa^ZoYc zV)5jH7sKe!DCuE;CjX&7FCVtRZ8OeIvIMjdIvl8~n8O0sY* zxa(dEg{bIC1##g&aP3ABy3ti|r=aJ|%+s-$QWsKl;pCm1ckg@W-6Zo;FpC54K7Rcy zZhU8Wd@G!*&SWP)eV94>^4aF*iC3>LMc;%5FuN5N31U12d;uOod=HF6ujKND7tmA$ zK#uUu5Ei~Kau@V6Fi6c8L*QJSXaKC^9@J?{&5z*y`qJ8R?Rx#ze62BI)>a!g?dETq zW#4YCH*J|;xz?<&)o--)W0m82an796O%&QqJzHOGte{L!#uCX`@^m70G9Hghr_(8! zv*oAQBLo}(HUI{FDbJ(e4=H*<-I)iWPR^jtbBv;ZIyr+np>%QvN1jvZ;S9Z;dxr*G6-naXV5LXla_RdT~3Y3OfJxX7)p zXpV>KVGIqIFD!^$)nqWCY0moOU2vX9aqgiweJf7iHrDOx8kop3+Q7QJNVqGmR`Av> z+;R6)9wtR1KXVScxq-CElMOrN2hJ5aq}K9A=83eYfb(Pw<{kCswqcj2V$EP9smFU literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..a0698a68e8ff92a0edd29ac6dff4ee9cf25be4f6 GIT binary patch literal 662 zcmb7>%}N4M6vvOFSxV{9D#FDqD?-qUvLMH1{33H??hx*x($FXra}l%=+(nz9Cur+4 zwCN$FMbM@vaMdEP{~70kt)c_JIp61=dnYFfzV=h+i+;(Ny<5es9vH*e$D7%|yT5#i zsDa^g-{)qCW}r901Na0>NPGj^%;qZarzOTtU_7QrBDRm3=bhF~>!Pcz*sEHhBubiS zoYv|c&1hY>n^!PW@nkBV+DgVZ5{U#227{u=mwB!N=D-eM;eGtBMHGcL!K~+Vob%Cn zB5{0Du|&}+T4i#wRl~AuljmBPyYAKTTn$K>o{N4bW9PFDnnc00-%+H4ZE&WN|5a7p zv+7u9q^XD!HLxz9AHhnCG>NTwb-SKU5`|m?xwWVxNCUi<$|78bS~)~f;=!l zdKte(*5x9T^Duuw?h_2Dy$rWO6dfN|dVA<~kv;o(HsNHPF7iRZcVOYSmv6$pjI;e8 H`Lpi_ZpTW+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7e0efeb0f739d502b42b3c53f4b4a05848b31d8 GIT binary patch literal 590 zcma)&Jx{_=6owB4iIS*|qng-FO$-6VL^M%qOFsfq(%Tp}KQWMKFv!Hj4{&kU&8@3W z{sm_ze}e-K4i5O9!c9mV^i7_gbMN`=wS*IUTyVSeTN%YX+%vk*<%j&&*5^{{`1|AK z?KOtPj6yU4n+Lbx9jFLA0pBcHHJrz_$cMyWKzBs!?>Eodt((?GM_ch%HK!sfnrNJy z*V~%Wy1H&&!YQP4g>+#fmtN0ivlND*E9|O+T8ySiunAbaPdxI7W?{{d&xY?g9>Yf* z9MwGG2Ci2n%d^QtzqL`E`)NRGydUZU-M32tmJp8V-y^9Amcgk?@i|qEX4EmRuc^2t zYG6&Ciyc#a8r~&Gc}fuh>Xm^F46r+o=ahNY%rHMkG%fojr_`R#Wsp+DCsJ=4wGpyr b2fr!;J?J2w0K5Z>-;9xx_wxK-`)Az`$ksx9 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..a02f344f5fd4fdd79c6a154fe1f8481af2e50d72 GIT binary patch literal 802 zcma)4%Syvg5S=D{Xz>wTiMR+|sYswv!CJ7bNgsjQlq8hmMtoFSP+DR?AS-dx#*KR(@l zSlY|G{Q9XsN5T$34D%-92Jwbi#KyG*;F!fy9na&jOo!-b1a|;b?{`l8?q&C^udX<& zYNhH{RkwX~+VWMSd(rEhW0BGHjF#EbwT*N-4THhJa?3T+MGKfhY$GUWA33Z5<}sUy z1V7U~_2*{*+{R(ub}i4cYv2`|hHX10>Ds8f&UvJ(B1DYq;=EUI%0&-{+=}V6Q8WjtE;TW*`UA%K+5w1f~=^nxHkFeyl%wUEaQ_O z^P(B@6TA}VlizTnpKuGZ@hH>Y#aHNh1+R~-B!d1=3i=M>Va0yL{n*vNO46AaKQgjR AfdBvi literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm_linear.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..a54f80cc64445d737d18977a76a69497058ececf GIT binary patch literal 730 zcmZ<@_F!Bh?ODZu3HC6#L^wGcnm+v0o^Y{xhsl)Zzy1`ZFaj0sVParl1=1!!+ylgS zfLH)1;Q$m5a&dJF0P>N642Z+>|3AY-1_lt@H#4~?zc@dwL_s4+Q^CV0*he8aBQYhl zNWnQjw;(eI$gtEivedIQHPSOSG&E#by?V80u)CiJP%qF51`Z&$0AdgTxrZ6dVqoA0 z(k@Uohysa&fE5}j2IYr4=F&*1?p{ZgeYZTa)2`6RD(4e3q&1? zeNeYR)Dvf)5nlTmtYKEd+-L_3_TUi5kP@H-D11TT0Ro`-1En1pfQiHS#L^&h@B#pc C@I<%( literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_texture.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..be71bccf11f5fe2aa6c619eeedbbcacdda301ea9 GIT binary patch literal 642 zcmaJ-%Syvg6uf;1x)8He5Xn+O3au6_NU`S86lzm)Q>h}_DXS^h47_yuY(Z@@8V$cp+5FGdn#nLg6K&mI`NgFFIL;9pQS@dBhdx+4wx z07}rCM;*3YYb4n{+u`m0pl3M~j%khDp<}VV?x|y6+Gnn~YOIM`l~+Z6-tJhADB1l% z7eitplPhEj`CMiro6R!M^D4Ytt0SN8o&~o+0__y|x>Dw;1*m#^z$JMt$`*?8R9{tk2Do=^~fj9b;0HM{k^l|9aDAe*GV1iB*jN literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_texture_lightning.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_texture_lightning.bin new file mode 100644 index 0000000000000000000000000000000000000000..01d85dd9617b4fe6fbc112631db29debae79d2da GIT binary patch literal 3693 zcmZ`*OK4nW6h4{BbDG*1n$m)mtGK9Ds!7#87R}9T(rD5QGt-btVKPZ>nvqFnn1=?` z5<&$LDF|-FsP!Qtx{r5k&H#65C&OQJA&Uaq_ z~jsaUEE$S&Rv*K^gfw^T3YE4k`wVZE^KRT1bROnvoS zv2bm*mMT@#`Q<{rI?y4BjsQ+yTbx>7_bTaujuha#2gm0}$F44Roc!?07pb4lq<+2f zxPPV%h2K3W(gFP%1)d(CNd6HQA@2?ZQ+Wm=?R$IjnaH;QKCn39@SqRn zCL{)74uq9G3@Bqm3Tf~qV$hePo~wBqV_cFeDj_86ZPe-&PhOZTmKO8Hs%&p> zH{kO$b0- zKVkW2p&vxxqri6~;=Bp`VFaFIJgj@l#xL_7V-q?R!aujTe^=7pQcbqoaKhSxPPq5H zN7!YrXy>vW2dBM-ld6>70cEYU3~In}OlHP0hB*Wa&%;i%@qOMV(s{mEUd^Yy6+~if zdMX*yzt))83$69r#^6!U*}ILIxz*6E_Zi^+n~W^}I`GbLSVC~8dCr?TGliu}sajg8 zIVaLDIv1xi(@thJzwA|+(fQ#dtJ2iCf)VbG(PMsbc9Au2C%;cpTh|jabW4j9B zV3*p(A_~cYB8vtx7su1f_6{9G@+;lap1kRhDnCHpX6gn1 zX3rl*n`M7~`Lf7jpTsMDeI_60LzuIE#hKHC|0Bou!P>++f#I#I-`pyZWWVpPdK_)5 zEnzul!LQhPXOkaeZG|xAWGrgNQrr2aSX`rj4*7K{A9;G1hdp#|I(UkF2}y1_oXRc8 zAeL5Rwz)(%hfjvM0F0gS&s+Q(%zdu7?1lcuZnd>tcmux79|u3?;?Xom#pX z`kakPKlZ71o*&%wI5FB@vi@P-apdHB^ZY6=+|L=TiQ2gzPFjxdw>iw1>`DEoHRdaJeZn@ZPf#Okpe=m=jz#;l;9nLgkl;4`CHB$<2Lh@|5PYO%tb_i#^_}`z z_;10VcT{7t7q0gaDD4NYCI)?Q@A+!J%@fG+2>#?J?e9G7>l{!{`}Vk70`lQVV>rqow-yqr{+?O zT62Z5nEU^^!aU4_-`Q|3)^nQcA+l%hUV!HCPw0mznHHmj8n$ dA?6@K^V}e|*?;C?UzDg3g&zP>{i1vV>_0i;groof literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/dx11/fs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..1fc33991d2633316be6bf4fe0475adad2c0e825d GIT binary patch literal 1342 zcmZuwJ8aWX6uoXzXo3J22?+#39y)-80!hm!0;MkbOKlU`ZWUNkw{?}E1V>InJ5(qz zF(7_o1EdaYS%L(6kr)^m*kE8_gQ-)uaIXDag^;5hzx&R+=e}<;dQP&>C2o?3zGx-d z4Taj}hUu8~X6z*OLK4a2snV@v;`^uVkIyFW{eJ)U*N2DSk`f&9I1zp{!|ni4348*+ z3KD6lbmsFI5$E;1VLHos!G51!5WU3Mw$NGj0juj_-*XUY?i{T50e}1``tQI|U@xOx zZdS~7dvn2TT-MEcqh>k(Xoj`bYC9H9Wo!1TS!+_a+vS=^z%Sr#2p@s3qNptTKSciz zTGod3edr2w6?DNH0c5l*XjRaK(9fXVVPV2mX-eobtV2^h**g%#D)gTt^dfWx>mJTG zp|6b4>(F{`dGi=f)vAe@x&h<_ z|H~;l_FbgZ?RBIcmY-x z5*swnQ(@pkh4^-rHGzwS&vdvf8!&;0LO3NqAjBK&BEvqMBh z*mKyMFp-{0XTFRPv99k=(LN_#}PVnc@AB*>oTTZ z2%7MJnu6=xhos?DAl=sptizBKt0;CbKA6OFJTA(Gg4n7ztCntWpbGCzUXoW+K5AO3 zt-DUk*=UQi`Zk3$agLRQ_&gB@`h>9ZA8GkfhX&l7(x* zUH9rLD(>_Lxbz?BLJ(ZJ3hq?uIg@!hDJXRj%!Si;-hJ=hd)`gClQDB+?>~L}B7NJX zx!ee(%2$(1sr&Dq1yZfu+R?Sjk;6a6aB2iZCb6Cez5>tT{0O|A5-Fw9nK$q$^MM@a zW&(*Hi#!Cq4vf?1u?cYICK>?aSc86wQs*<+Z&g~g>h1dWO0{v$tZp{$+RXuUY}u>CzcJw`?x!CIaoIo~&;+HV~%A!qHebb|D&`i$o&Q?RN8Kw(try z`~aRQI{=Nkl;&CRr*yhTzjF>kKRJzlzGD^v^pn%*CzPL@#+C0>esUW9>;?ViTIE{N z%v z`52Z)pRcZp+|*<|s%cJs@*X(fqd03QPTh)Aw~f3#T>}%Tp$&{niv)Yp_hsC?nFsxP zO2cK5>0fsa^zZr%k(WDm+>3*_cSz;(+!N`{0hfSzU{Td%k64pB{#4VsgIrvF1|IOF z5ch&LPk3sodwXjld`f8xx%a2t)vM=oXteaOKm1Mi+n@DE-xs_XMt??05BtOa^ZoYc zV)5jH7sKe!DCuE;CjX&7FCVtRZ8OeIvIMjdIvl8~n8O0sY* zxa(dEg{bIC1##g&aP3ABy3ti|r=aJ|%+s-$QWsKl;pCm1ckg@W-6Zo;FpC54K7Rcy zZhU8Wd@G!*&SWP)eV94>^4aF*iC3>LMc;%5FuN5N31U12d;uOod=HF6ujKND7tmA$ zK#uUu5Ei~Kau@V6Fi6c8L*QJSXaKC^9@J?{&5z*y`qJ8R?Rx#ze62BI)>a!g?dETq zW#4YCH*J|;xz?<&)o--)W0m82an796O%&QqJzHOGte{L!#uCX`@^m70G9Hghr_(8! zv*oAQBLo}(HUI{FDbJ(e4=H*<-I)iWPR^jtbBv;ZIyr+np>%QvN1jvZ;S9Z;dxr*G6-naXV5LXla_RdT~3Y3OfJxX7)p zXpV>KVGIqIFD!^$)nqWCY0moOU2vX9aqgiweJf7iHrDOx8kop3+Q7QJNVqGmR`Av> z+;R6)9wtR1KXVScxq-CElMOrN2hJ5aq}K9A=83eYfb(Pw<{kCswqcj2V$EP9smFU literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_smsimple_draw.bin b/examples/runtime/shaders/dx11/fs_smsimple_draw.bin new file mode 100644 index 0000000000000000000000000000000000000000..24df81546c6e46e1bc61a36f20b1b0496fd09298 GIT binary patch literal 9867 zcmeI2PmI(>7RRf9zzj3)%7}l~C2r{8pSZ+;pzbcHObyI5Ljnxx9tmqSFlZ}7hRkFb z*4^yJbS5P0Nwe48JrFh_n~Vp&f(K$e;>Ck{F~N)ROpGTJ{Co;yD7t~%&y!Cb{%92h)xcxL+bV+#jnPu}m|8>qOK9veNh zbJxGWc>mld14Cb)zVNsECigvjPesFCdd#_1;!mr5mpS*=3gyKkRvu)sRm;x@2E&Ep9A?-k@f#t-)B|Ih_TSA!zYhTy*m5G zzNxv!)QP#7=6o!gZ2ooO)O^!DvU_Is=+w+fw*=l@Dj%s_98eYLQUDwZ-=Bx?uf>t2 z@^2)sO72yl?}GlXw3s9M_9~Fce1ttb4<%< zw{QBD`Pq}RuPsy`um8R}zPGWr+E9)(=c~JBPs~j#MXK92ZQZtM+cR4?J+)=a7PqId zd;e)+;3L9wOa%g+oQBq@Eaa`CLQa2wzjJ>NZF-R7&ovr=+z2@Z{l>w=2PPVOCihJ2 zcl#&m`$qP<$+1JbCMN2mZbG&^Aw96MrK)1YcnDjBF*#D-JvQlo z`m>f&d%KFN`>)E2Onqc1U*Dkz#pa6k3okf#bjYok9~#Q%qkTnf>^C`cHZ}fAwb%jj zO{OJ~H~nk#>~XHPRs$t7KC10(eS<;gPtutOTf?|o(8)X+ zon-jfYUgJQ5#W9c({)Xd|Gtj~OKZ(+mT>iaOv*|)M7cW$uYTY^1|%e*Sr z8ZHWL=f092^jugkdaM)9y5V4)4efJx7y6l3M?zrW7sik~G1m3)$CLwCq>n$%p4ywm z-m(3(UVFprky=0gfi_0I8~p5l7w|>9&vb$<_h=o9K~~c`m@o6HT(rLz_q4!Ut8wUXbrDbxGZ)^irBS=?^jdt&hrAFe7nA5?(@$13+O{O9=$a7*!w_V z;n!Led-9Dw%Qs@rx5a*i+L>3C#NPCYjroPxqmQrQF^1`9UL6S;hQ&O_us(*EKP^8j z_UIdaS?q0`)Y`U|#opFo`osudSnRQn*fU?|Rh7g(#z5b&)Naq+mK7N7*xT4jkP~}B z^w(tvbg;kR>|x0A0vnUO*j|M?!{y6H*N8V~F_^j;`eea~XcG^MW;|c@g`bw|z{bwJ@H(TGpBLy=ysCooyMncl7xblhVSa^^7jTQ|Dz!7Osw6Mai{rLV z_M=Z;z+(*JhJNN%C1e zD7p*I20!r*U>#{}uf?PD9q{R@!oRWai7onNd*1XjFNK5*gYziGus(*wu|;<*yaVvH z;oq#-ZU}zjF8Cp_WgX<7*?cqhyx_0<#^avH2J#+GY~i-&y2aM?W8bH7i7`w+^8!!E zFqk*Rus(*EpWx_PY_ZYsdmUTmVc)JbKPk46Pr9DxPBL+Ih}Ao#%N= z_k2rlz=E##{$nlO-hbv-c)I7K{O)-B69@F;xDiwI@0{mFKHRFjAP${*!9Bk`FVIWx zdE!N0(3jrx^buz`c>%Y*-lulvRh8WH=%smqK6wF;F$_QR>PW~i@FTeuV^|+UZ12I* z9Se5>`i9@@^MW;UUMz+=xeJ&t^Qvx>dp>{D>u-g!w|y>??QmiXx45vj%&RJiEqbx< zZ?xyp&%COH48vl}oOW(lA49su7JXt1ey?K-W*XbbCtdFX%RjSOYwP)4Ak*@DK3{jq zZ#nTB4xKc%$TF`giLJevV&4;6^oa}H@`JYNXI>u(fx$hBUWyUpo1YAS>=wM?u!-3I z65nvFE%U09*s@R9XR+_oxWutF{mg4nLWW`cmN_kc*2fTwEgW5oE&7Jv>wU{S#5R7z zMLy}eZ?T`TX0zHo-?!c0aQR)WcU(c&d&9AoZf`jAD?Huv(b=`^4TpXlH}V2~d;+(; zpl#=E=Jk<~Vc^FU!}=IvK8B+^7VUY%?{!|VM)D%Qt65LxRo!NHb=mJN-D1mGkACJ= z<;36RP-~dK;nUdSbM%Q1oY)$M>1SRY30eGXkHi?($B;X*Eq;&NDE|iPxU0+F*gyB! z=4;Y=^L3Q`yNl(7{LwyBf68y~%$Ippx5>U`Pn7+ZcB9{0@K@$l-MOptd*DX@rpDO~ z-HN+f({%in#(9_iZJftlHo>`X;dWQviS2Fu4(s-Bu+Q`V33xj~T@uf@8 zZ|?H{Cem@}Z$AI^j^9duzFJ`Q1x(&}i$R7SXTT2qG}D+IndJYkj4GM<{~HkJ-T(8J Yb0gw<#{`rhj94*CBv5m_^RxTc_m32^ng9R* literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/fs_smsimple_packdepth.bin b/examples/runtime/shaders/dx11/fs_smsimple_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc26a370d27b4f3809728e4ca605bf8f4ebc2f79 GIT binary patch literal 662 zcmb7>O-lk%6o!vlmR35niYS<6MF?6^7UWDbj!M?Z+#%dV^kFC@iW#_^b+iduv<_Oi z={NK{TJ{Uv)FQC=jB~+V^ujae+@DsQuLWCaIxxs24V?2gb|u+pE6pechcl zXPWnx7DBuiCYprZ1P|a7EFka$95ZiKupZYEFD8aVdL&~1sBzh8-L|f~>WZ_f7R#cn ziu(Cgt)m*PX1j3%C!5M-Q`xOdY9pOaQ@`IYiNZ1W#b}xaJAlRKiTEB-64nHq!{U98 zCufPo$yvn~CAVZBlbf#^w(XeQ*GAvRsI_=M;+6rP_TnwqE4-dd2i8`um{Ovd6tPDtZw%1Mj6#s@(x8rZPLDc&I{ z00ZO}@mpk`l^D%K|2cV{XiV{RE`!1vKEAv?)cVMpeLS0Rb+?On6!0Bb{I2p%crEwY J|BwEx`vnx@N-_Wd literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color.bin new file mode 100644 index 0000000000000000000000000000000000000000..5e84b92085e16a889dfddadea4ff525ece1aefe5 GIT binary patch literal 1128 zcmb_bL2DCH5S}!vO+46Mgd!f^p$7#CB&}eeXtXg+pf+JQgbG3uldVbFx+P899Q_5g zdKE-OysU>FJa|-pL2uq9-u04`C+qiZ-b+f2HwWgunQy+CH~Zdf#mPqma>8XS5jl#_ z>{hq@rt4MO?tZD`Z^oq`vt-fAuHRjL(wP6;y!~V0>s<27w^wfltg&c`oZ}AdO^LjR z_Mso6B6jv(ZV5Jdc_{ZQP_cfW$a9exVoUTVNZ23n`4!K9RQGly2m*31Kx@#WI2J7> zO`g^ML+yLmiJirJz!mTel=4*b53$$aXP^{=zXbl8K#YsXTh0GK99Skq$NW#g`x?h5 zj_Mo(SLpjJ|2y#71pFuK1IHDI@(Vs?x4MVdvE4>jf`~*VGGdrm+3mTW=1C9*$NG!I z*99ef?J-A%C$P?F3{Kmplgx;$>w_4hUH7(Ib=%!QCHAJ9hIhZ+==eMSMps?6uc`d1 zv#Oj{z3Fz;vcI+6_F$wFsdOTJBb8W4CX;;gg0r%A9l5N+>sL@C7_m^Mr$tIdr%)~w z*O*iMM-FS4oEg|or8-J;@>%;BSOzC?mLK5Sa|a5R$O~u{sh!#3Bt1rKpoTVUwnV15 z-$aW8J#Cds!?>yO4Dl4k*TfBe0Q|hJo4Yv7nZ!E;@7-lxQ}Y1DOdlrK)Wz>5w{UGv X`A)eDoBt?#q;MvwMhtHJ|F-`DrRkHJ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning.bin new file mode 100644 index 0000000000000000000000000000000000000000..b7adfe40a4f2f5989f1558ef3edcd8af9772eed1 GIT binary patch literal 1987 zcmb_d&uddb5T2w-^TT4QPy|tU2M_I~kgCv%Xll|lg{CP<2oZ!dwrP`+l8`1^@L(x= z(OQ3;1grK`gj|YeK~G-1c<>MC!9Sq%pm?!<-+Q~SNt&Yr^LF=}Z)av_XOm1S=I~aR zV@F5QDlQTKsYY(4vQQ{zN`?DA+3~t0(1Og?D$73E2kLL+%B7`ZJzih)$)3+8zDBN^ zujN-(gKjzSIpmHflD!pP$e#QCb#7zv&(OnH?&imY1M%*7MBEs!KtDM}`g%lOL-%_{ zl97q%IxzBLP>vU%;`)0eFGb?8UFW)skW0BVS+3m8msh3PY?9jtor8*>A4}F1xnHd} z)p{Evu}=I0a07Sr4nZjz{|0=AfR`VUABz8zIIs{f9L44z0N?L|lVtc# z`ac7Ft_yw<_zrMfr74390vW})r}%_)o?$Ewfb+b>bsZYHduV`UVZJU+hxCZU_9$Z6 z(uK7`SmHEpDd`GrEw2v=6Br7|XC!y{wEV^>FpF9(A`G|p6N za)$lKn(zuop<2+YrUcN(H#LZnI5Y78pGhR+aJ@IXkw>B|VW1Clbksq+*d|2*ePge+U0I z(u!^wm{~oWgPU5v^#b&qc`ku>XjnMc1@f@gbK01f#+eJw=_H2wc@NDl6Uhu%dvwg_ zu#ez%YP-g_fcGK~`j4Kr;&$V`fPMFTI}eao=c@N=zxWwpyg*Im6FqDBc7|YJS&mhl zT*><9W3|r0z051)w)RFh3=-ujlsRg<#-9N1)$yFx-fp~2@OJ&mX9o`^i2|c!9vkNP z9$)6qTww8Rbi^Q^wg}op+pZ}N?!=?-?^mEbroOMXGpZihhCh7|wClRQ!Q4J0?u$0f z!_?-z#oRul;sG-6i@nl$U+;i1AAMhT|8%K2sM1z*-9M^sy5_Asv*x;g6c2VUYr`Ja iHP?Qh0lR^xn@W$T`CbR0%$veD+VVGJ*1$CU@6SJOOz4~d literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_csm.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..fd78bfa37a8942b48fa68f799d7c3218172c6f0d GIT binary patch literal 3096 zcmcImOKcle6ur*Ro&<1&fCWM@3l>y}sCJ4(5P~UjT}Mjd$Tn7xDmiZJHbIUY9EWy; z6e5r+KBep`!NL>>A2(33>IRV|8#buB3Moh|K}bbng&NM8d3QXXOssCW()HYT?s@l} z_f5*hTrB(6&L{i(610TKSbU?h+BjRQTXtJEWz4k7E42%jv=c*;3?K{5#%q@B0kt+N zYt?3Tbv-pKH>?<0>&w-%jSF+twYk>Cqn601+c$`&EO8E^X-hT_qLY^F0zEaBS$ui= ziJQM|-OWAz_AmLrpLyi3)33xZiBn@D!}uO!JScJZ&aj^Igz!|CNBr)_c6E( z-QAauME)EQd4cT+BbWB%$$H~-wZ1N$PKVra_!3+&uG*dvY#p(v2(M< zS-XfUS!>$Ujn%c4I)bT*^wh-Ev+0S+R4RpoJySe6&-;PpL58fTy!`ZHphqlJdaZbb;Q;){fuJLdn<~)eA z4z(|1=~x5%nYbg~SmlSkF;wG+$ft2THLv((;3LpYJ=q7mzEQj@$ZtQ|%LA04W}5cZ zx_EXuUb1QQWFPc+0}c{g#;(f%TeA6M*S)#0FLjlN%@|uYiSizt8a1Ca_`ASIbi4tt zZxru+@U}-y%@7YM$pWL5-?82A$M~gwYC$Hx6&izl<}x^XntR@GuqScu6Z8Khd&kuM z>Y1ZCQ#wcP7xTKVJ#)lhw0&46xP!L z)=$q4@=qY!oE0&IzT8NLpc@Js$S4SRlBkzaz@_(`a0EM<_wg3PC literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..289e2d9f6876a560f9a04c776ddf321f4b66389f GIT binary patch literal 2063 zcmcIk&ref95T2GoTQC+)^k6i32M?GSlpiKwj20=SBtS{qR7gxpg+d`EC8a2d7ee%+ z2zmyU6Cvq^KfpxqUOjo@z`-LS(UXeb_ukH3}|%oQhdh4f7BSx~kDJ_%JJBcM?dgKY2xN*I|U-1fGcW zMVEn*7lU%V3KieqBY7t>1m8W*YY4fN>-~k|lWbu@DwPVk=b+9)?nO4gU+qam>R|isD~^ZxIOaBl6Ag_lW}w1H(~V{sHj48aPQ-@NE1G zz{hLg*MM&UM=5P-;UQ@au? zOh3xd%tWcUP@F1TEr}aeY%n=!CG*+IT*>M!&dtvhV05>(cei%mX>aXlYimQ}3?%!9 z3wCs;gd?z3(5kkC(65ga#7LZ(_<@gOR3Xm0%y@Q z?M@U)Uvk#yp6l?p;{~f<@ipKL$b<2t=be3P@!rC}edQz%P(X9lwHg<{8txY=nS7!b zo!H(m9K4oe6)$J9{P|d&vv4i*O4mDUqbnAP@*2t<)vx#~;0?N;*I8SOw+h~NqltNn z2bV;FQPM9hd;Ewm^Jgyb_*YKtK|XyEw2Aue8V+jW*ZTbmo!nFFb>fVsM>Y{p>p;KW z>jrH1jHnlV%7f|h-otj!Xn26!{y1H)4_wUtu$=x9 z&&>U5ZK`>8ZM4q}5B>n}kiD+8(YSAb-NzG7rg~C**O#Gu3lzTPCfjm8ysQ5r{{Z^~ B@yGxG literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_csm.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..43ecb321bcc37544acc1296fcd404caad3b19eb5 GIT binary patch literal 3256 zcmcIlO=x3P6h29R@>87@K@bsn3m1x5CTabth-Pdi(?Z*nB*Y3z8fP-oN=iCu>da;! z4hX}jSh)$q*%Z2zI$F?(l=#hzyl}m-0yt% z-tYdLn^IvqlznsSY13dql1$0Aq$QA>oM5@ z8rvwZRT`Dm_2iITkA=uuU#^^}pP8$y%{9*+j)}xgUq70RNqRq;ib-ofIv$g4pt~cP z#TTdknRxo#FF!tf^`+C_9eV2Gs~?82h}{v9A$%v`uMCJ>gI^vLX#vk?j%FRS$(x4r z`w(0P|J{=hME(kkJjZr`kxP5zSgrnArM51ePKVr4_!3+&zS@o@Ge`T=ws-L*){jRq zuLC>{r;VabbMRflHw~vL{y6Y90UQ*m6a0Z?hyzO_CZzlYGhY#@LNXvBPqB!bD^|}|Yc`h7062sDIK0)Mm@4RU9O$L_uD?I_cVe-yy=W)W zxKdkNuH>sHF$%TW%VEZ}#e)vDl~c=2lng?DtsL%aC;Qr|zV^7xtsHOE*Xt*n&ZGIq zoax!ZtW!WqRvXS#eRXZ6hG23mH90oxHj?(Tn*)8ED;fT zK|y?pb0rbr^SS)oky%;D6=sSvxp~Q9yg!iRSoELZH1fUi5dTWhnl~Og{00oe8Y50! z2{>`xJ>qo5$)OSBeN~)o8ozue6xTaVeAtJRLnBTN5$GwD%HG=ST8l>)r*gS`MherJ z{0;_4L)o_w_cEr>UUJYAH3BbVsK%)K0%*)NoC5Err$wOOX=C~%}jHyRsYS(zk z7jqrNIS#ciW9v8u&NF&b+__5kyK|_<_mEGaIyJBOCE&x*O+DE|Zr>o@`^axT*vkVH zrDmG;)p7Cca=t{v>dD^c^1^8(xQ$(xFk904q3iBi*q6FWLw1hy4vF$MoEkNswfIHg z!#ZEs?Hj~<2fWR=9kY*zlw^U?N^d#l`w@PrpIVTKobQ{1eC9H^dYXIIa&RUQo)hzb zCwk}9^Xgfny;HhIo)`1FuRUwTc`>Kw<>&RR(egkw=f%6i^YZiG1x7u(r~P}*zd_D( zL)U)60b-u}?w&`xdN>YE&*mP)-kuM*IY4GU!?Sy?{Cfc&v_GF9AGGc^aPJNrus>J8 z^Yr-lNB6sLe?A2t7S|fp{R^iFduE=_gLHomYLM>FfZvYpP4MnS_ZO}-qnq!^-Ri!I zzCpUb1b#cZzXI=0ba%jq8QpyQ?pF5}`UdH~2K-jKk@D*8Ys9zGZFsmR=4%@Dn1Kv1x)4DMAukW?38Lm&qQJ$%PeXlJK!$kEzL*F>%v;LpQ c-)^CJq}W9K1f1^#Ee?OcMD7pYjsL~|1H=k(jQ{`u literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_omni.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..2039fe86fc85df3f9fef018bbe83d50a09a98857 GIT binary patch literal 3167 zcmbVOU1(cn7=DxfBqtS92D=f#bFmA5pqO-umEq28mbK6}B?+N|kj5=rGg4C1)a^#7 zLqYtRdN*)tHnsj_)!ld@L+q7^pjY0B&B)$D;m!Ac&-;Au z_k8F3X$!fTQ2Lea%X@p`x2VY2*hX=+cB))0RLbWpX-0=7?n4&qwX>G&0<|`ZYo&T= zbv-d6*R7DmHj35CnU%(T_5eMb~Bc%LAban&qW#BfpgnXLvUj)7! zfWHj92^^oZZLgzGyM*>SaITAxuJO(t4UgDUa5Y??w#6eNM-@a% zoGXa{U&v(VkIl(qCO4a(%`8X;_5MJPwdg;>Y2RQ7)a>CQC23%^!fSTBeILKnPc6tqF7(VnK65D?JA>RAsv=yc3GKl+AwZ)(6h#9>|UkiMzrE#W$~j`G^?kiMyghcZ#V7ktKKvgWnExM?_Hb4J literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_omni.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..5520c2d99c69197bafd728d4f6e8da972681945f GIT binary patch literal 3007 zcmb7G&udgy6h4z*GcN%r6}l0@w7H;LbhwJKsI` zyYJp}lYDj{l=^h(#_Fp0Eh5s@HCLFfoGO*`Q>F8kEJWHQ>O)4Wl{1#C0JY`{GsS9g zdN$TBx2=$L&K1g2rzdN}wF{OkTh6rE$>OQX`QhRWzz;2v&UI+alEiv6Zpr+5v=@1S zN>_61NdJkCmv)bRaQE3;6Hl(}dhqmGi2LXgX-BsQ?RcxmEwt;H@L8uwCV4bvV@%!v z8vC7S()Maqu8I8LB65J^0CRE!f9F`aa-vwCm3qBSZa3OE8rM}@F=WPQ|C#Yi^u(I+ z2-dZMC(vl!7}IR@puqBO#xr{IkHv z1Mo}07l7k)I`##|wCm_^1LwX7>3(lwux#=W*ZfNy;5-uO{P-OV5&`&q;PV0aBjC#c z_*~%}E^elDvL^MAv`WZREaJv;r3>bF z9kR11$x_wsuT0NOmErXD#QS>s_Qrd9W3d=6_F(qd2xm zb0=ZoBk9cW;UO7KX9shG=@CgI-($p>i|rm7jeIX3{C^1=^YUTBLtsej7;)-~q7m1x zN1RP@a%jYOUlr$=#-8tl;(DivcldB}XvC=@3_aO=!P}eJYwqY+e>$B>N_HTbd5lR3 zD7y%8pJ4gaRU0!=BWMMrs&>0Cfco6SY4D!gF3xd@JdD+6jC&$ZpL*1%cJPc;L=LYeW$-J&J9NDk zcWw~xEASROP0l7BLXrYT%YSY={df4KeriD^e7R{2@)=9w>S=7h;owZdJSWCqL>t%C z^J>_mxl`YRujjzHe%BlDy*=W*7*ifxkM{$7Z;yrt$h#lS=k+6k`=Foa$-AWSH);F{ zJYCzbaRK;78vVSR;5BP>@<9XZK==GJeDB+ty}U`+uiyvi`UUuAbS;9nkuKJx>iP}- zR&@OVevq!;fp13FpWtnzi|>Q#s>9!kt|jn;bln2J8C`#Yw~;QsRjTW6_(8h#jqu*A zfI7!iX{d93vrMg0zvfY%Q|J0-86MI^^xf1tSN_)s9>kxXZ0>Nb2LD|&)&dRxj>tC0 NbANb`w_=;-zXl)HX3hWr literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_texture.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd4354ec8dcc1425598a052b12448ae817d6caf1 GIT binary patch literal 1240 zcma)5&ubG=5S}%w-H6y;yoi)N^iU55vi_ifP}63cZXkBU?h+yhNo=-FWXqN`)!@mi z2Wu5PdGS!ZEJzRj0sa9VyolF&^CCzuiiq`_-S^TG13EBoX1@8}ym`NBuBC+2^Z6r+ zMHo_OKRvnK*a+KxQ0w{+s=e@DnhrFT_EfXJSbXvQ%aw2R^W)>T_35GU=81yYdn(as z*lW>7Ibv^*s(f26-Gw|jZ{43W7j-!m_2V$1(#(mt5&1U(|%kJ_@1#|fv`S|CcQt-@T znV2A2kRUAMylM(g)ppBX*XPJbWv6l?Pn&*hzT4P+< z$hA!87w847eiQaKuCBDB#|55aY@nsyRPq|xH{kP{>);*g3C^+4ImGOD&?Z~#TRRjl zxppDp%GytnH}ExNUgA5z&xrL(=aV_(c)Q@ez9?!69w1HjBFJa|-pL2uq9-u04`C+qiZ-b+f2HwWgunQy+CH~Zdf#mPqma>8XS5jl#_ z>{hq@rt4MO?tZD`Z^oq`vt-fAuHRjL(wP6;y!~V0>s<27w^wfltg&c`oZ}AdO^LjR z_Mso6B6jv(ZV5Jdc_{ZQP_cfW$a9exVoUTVNZ23n`4!K9RQGly2m*31Kx@#WI2J7> zO`g^ML+yLmiJirJz!mTel=4*b53$$aXP^{=zXbl8K#YsXTh0GK99Skq$NW#g`x?h5 zj_Mo(SLpjJ|2y#71pFuK1IHDI@(Vs?x4MVdvE4>jf`~*VGGdrm+3mTW=1C9*$NG!I z*99ef?J-A%C$P?F3{Kmplgx;$>w_4hUH7(Ib=%!QCHAJ9hIhZ+==eMSMps?6uc`d1 zv#Oj{z3Fz;vcI+6_F$wFsdOTJBb8W4CX;;gg0r%A9l5N+>sL@C7_m^Mr$tIdr%)~w z*O*iMM-FS4oEg|or8-J;@>%;BSOzC?mLK5Sa|a5R$O~u{sh!#3Bt1rKpoTVUwnV15 z-$aW8J#Cds!?>yO4Dl4k*TfBe0Q|hJo4Yv7nZ!E;@7-lxQ}Y1DOdlrK)Wz>5w{UGv X`A)eDoBt?#q;MvwMhtHJ|F-`DrRkHJ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_hblur.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_hblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..4323893916168a311f6c3ec6f78b2c56f8f367c9 GIT binary patch literal 1911 zcmb7EJ!n%=6h3K^Hb4CdMWGajH;AZ1p{airk=Hg&TWFh_7ebxV*rshHF(paWF^D+U zic3L3U1<1Tytzq&4pP{N>lT zeX&Iuam%(pxSG0|&D=_4Zf9~{35iR(R#W-HLME34JX0)O_sfpYBi*a1Qr=4ES8~}K zOEc+WI$!e2mfs~kZIRjGk@x2xKKbdy+$}1NV^|Xn2Vb4G}TSR_9U%Eve zw~E9gqtOMd$s32#9)pVK_r5$38Nl8puA2zCl;dN$!nJg+B-Lt_+#qxgy6wkD$+9Ac z)Vi$JcVUT9kxDea4&1=ngii#`ZvywI_#p;^7_eKw5BBA}ay&C%mZ}R6@2Z^?X_x@zOVtgI z=MabE0E#^xb&g?YW}MpGH2RH)^i0jFMBJmF&aEt`_0 zT|!d`Ukq`296t=7buNLoXE-?58SuhbYoB|pn>c;eqJ7qRRq&KP(c^`x;*Z-m2=0b~?`#Rc!M3W}KmWK_>^Xcj`>iU&qMfe0}Y3;$6lwS&5-U8Q2jhXO6=E0QRqi LJ^YXG{6EPbwS3!H literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_packdepth.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..1181d515f45bbeaf33c5bd578597ec81781583ef GIT binary patch literal 1216 zcmah|zi-n}5Iz$_69yUyu~ZCiU;u$4CHxSPswyRJnn@Fy@ZFqRdmOGTwll<(~K+)yHV()rze_uakoz4sb+RqMYE4v*+B z(P$?#x!zj!mtC*XbD!4(|7nJH(>iVHM)O|z&A~?g;QRH5d*3b&e*W61YslWziOyoZ z1s$Ft`UKTeL|NdLF;|&}&%7#>*UM1Se;?5+qBLUD?2i%VvRs+>{Kp+{jlwWw?s;e% zx|6|2O4JDKtn?qrWDhH2C-EV00lWldc_I1RSljSRP!@&11OA?YG=GRbNd9NWft4ck znEwU%uEg<+Nu9621^Pb8{{g%`2H)fQz%j~54&k$`x1Qm2EO%)@p++gv5{8O7?$Grl zkHQo<`ac{#T~MOaKIVvM2dj;XeH&Gxn|ikEraXYRm0Lj zDuFo*-UA#>WlO*!dJS#ihl6Z<+nyk{FJhbPx`?sQb{DPjioVkO@^&^Z#avbICE^8K zcNJIo7VvX&kIIEOXB=-EypL0|rsM%i_EWj4E}kRZ!BbW}tGL3rUxm$JRJJqg41n?c VIL5*=xcjeb95QGr39l%rl{EuR}@yeN5X#apWdB?jg)&xtVvprwwoaK_*>xb8Hn?TXjk&TFb>QJ(G&hx z;QJEC7Nb7jfD6oho__$m-UI*1{ej~sL-~c6Wv%uCw_`aAZ3;AskrpvjuIzLiSMn%` zfusM$;oAizyzLW?2v^`f(K9&hpDt2Qq$(HU9QzG-rP;8YC3NE1T5@*9W=e0p1yHbnV<%)T-&8&3^Ndt@-a314I zavK63(Q9Z8<^FK@l|4i5P;`Cn=O8zNnEfV3VvBj=hw@ccE_b=A-zM^DJad&-_y+I` za*fT_35GU=81yYdn(as z*lW>7Ibv^*s(f26-Gw|jZ{43W7j-!m_2V$1(#(mt5&1U(|%kJ_@1#|fv`S|CcQt-@T znV2A2kRUAMylM(g)ppBX*XPJbWv6l?Pn&*hzT4P+< z$hA!87w847eiQaKuCBDB#|55aY@nsyRPq|xH{kP{>);*g3C^+4ImGOD&?Z~#TRRjl zxppDp%GytnH}ExNUgA5z&xrL(=aV_(c)Q@ez9?!69w1HjBW-9BbBJe0&`nSUFW~ zzWM&P_mdCVN+FRhtY@JOzsOf;BOvk_U_LpX8i7w<8p`zqRD!?uL7w@f zJu&Tinbi1mx<4+sW}Za5MJ{QZ3vpKM242BxggDPB0Ao6vpBl|bE^AK~CbQF07%z=w zv-u=zW>NDFc$_l$x2)KC&_i7$dIKLGN`P6Rk?P9szhwiK0 zj-5{CXOJL)>`%eJjJ8r67A%n`&@$50`_&CMHv6C*2hQ485wmM44)+|!z&CarHhBhT zUwCIfvGW+guKt3G$5f1|{|NhWe3EA0;2Xe0sLlMTK2^69Zxj1l$N%I33Y%U{tjUXC z2J1!Zx}VfhmD``d21m57;-@F;@Ag%_3uD<=u}j6KZd)YEeJFc;X>#AS2+KWa$Y5a= zOP-mZiGKjzR*%jZQ0owWjb^qfeHNUj>AyYCLp_*%liTaT%+s%Odp(%GbiCJtnWyHV rtuTA#nWi*m@;(H10oT?pj23v8`=C5?3O*h0zwSABaAyA_|IGglj{?b3 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd4354ec8dcc1425598a052b12448ae817d6caf1 GIT binary patch literal 1240 zcma)5&ubG=5S}%w-H6y;yoi)N^iU55vi_ifP}63cZXkBU?h+yhNo=-FWXqN`)!@mi z2Wu5PdGS!ZEJzRj0sa9VyolF&^CCzuiiq`_-S^TG13EBoX1@8}ym`NBuBC+2^Z6r+ zMHo_OKRvnK*a+KxQ0w{+s=e@DnhrFT_EfXJSbXvQ%aw2R^W)>T_35GU=81yYdn(as z*lW>7Ibv^*s(f26-Gw|jZ{43W7j-!m_2V$1(#(mt5&1U(|%kJ_@1#|fv`S|CcQt-@T znV2A2kRUAMylM(g)ppBX*XPJbWv6l?Pn&*hzT4P+< z$hA!87w847eiQaKuCBDB#|55aY@nsyRPq|xH{kP{>);*g3C^+4ImGOD&?Z~#TRRjl zxppDp%GytnH}ExNUgA5z&xrL(=aV_(c)Q@ez9?!69w1HjBkl8lI{b51ZP`;K8xbLni0t;sg4#~~3tnY{`1 zAQTd;2cfs_jArY=iaj=&8Xw^*WW)6 z#1du1C0qWErPRG#=6)jcAd~k0U~e3ud~on9tq4 zJ)JJ43uTXN`W@2K7M>Xyb*?6i{YQJ>J`H|3@#4(m9}XPU(8?7D6uN+<3ltE1fS(tyUwq13C-c^5df2LB`QZH4n( zoo5HQfw~X#_kho~z&!|F2kut+155@nU^jsu?#q7VcxJ95H3uHvQI8a9ngHcX%>|D8 z2#4bUiZvb$j$xh5JoUM0_M3zBOwFi+xJN&oU(BZCnFVBGZD_il^YGNkjoe(RSS~J9 zj0^FLMs(7gG|X&zK2tJAi-pBp9?no-aHwzSa_=Nc@rTPvi6{w0w7s>lq-<-y3l=nQB#b&5VZQJ2)VOO5cKa6R9FA20Z*O zp(&&<1vovnAB4|3Z-cjM*f`f2@Pb%tpL?vEIDOWleb%Ra5Bx0JB^U4D+Z8)!@|10L zEl;o?6lvG{8eakKRrN)V+cB+ptKe<)s+@`k$ftYIu{tmQa%2$Kr+bR1zLC50tm>_| zYE*~8qpL`yg!ZMp8VbFo=`)}oV)|p$+&h2 zH0lgl^iWfMe%7aWcCMqG&LGZXJzjOL)8d5ity-Qy_-5qb>|^9pz^|X}3=wG^!#pL*kbsf)SCWaFg_$Q&9IST&+*uNHX K|3?`APx1$JD&5!s literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_smsimple_draw.bin b/examples/runtime/shaders/dx11/vs_smsimple_draw.bin new file mode 100644 index 0000000000000000000000000000000000000000..12f02c23b449e0a9c1e38cc85de730a6eb94700d GIT binary patch literal 1943 zcmcIlJxo(k6h5?t{$OlFLShWV8yqwyB%mfjj6S54Vu0d%O@oO^Tj4=VN=ix*5*LF^ z{va*};~x_-=|bXa;=<@)oE#ijOc<5H#6|qRzI)q(T|LR^J@-4`J?GqWPur9oZwV~S z#SagqQM~da*uIpWFHSp!RNh$*%2vQ9;Ra-)RGbUS9?;NIx{#mEmB-2}LD>oV#Pmle zuMb8JcDqj9c>dY?_H+3~=KIYS#5esStynKYH$5Wz(6U!#w@t)~4#jR`PhK3#wF@e~ zKZo*6um3D9I^uMD5FJzlN3AaeM=~0o;UA zHWmLJ)(rM0l%nzXz_$nl_#yH^@jnp4Ls8XZ$;28 z;69fw5hj5cSa%ekkdCvIzKe&ooT;)@TEvTf>ysj`FX^l}1!YUc3y$v}4#xnL>Y&s) z1`|UX=B3eYJjChZeo`gUcDAsP%UaG1qOdkxT1kD{WGp{bDlQgh%EnpioDmBv~+1RQ3q#Z=~>-z-xEKyV0k4Fh#$^YuL5BDjuNfyK!cYzuOyNtVj2v zHb+f*52_sLy`Cf0Ki&IAUbXjnjua360DHq(W)BoG*oZtMCUQy zfsf7+eTC~OqAYOBn6JztW?mJ};|!eiUnlg2D2?1K#}kaXY}Xe&|7pitr!WkedlBA- z?`80jR+r?gjGxHZ!^qfKd<0woFTvSfO8ySUHsTVTP2ul>e_$ZZAEHl^|BZ2Ar3gLc ze+Pabar|PU^8>iRzR&Uxfww2%KUp6*S{d0fVz!OebDWOlc83&dlp-x*sGQ@DTu<^S zOo5~S#o^NhB|7a>j)+!Zo#Yyf&&P|@6=}+aILGsjH|TXNcLhqkH@RsKx#HbI?sh((=QFR_3rn|9%PQP{0au1=7TMGk zQQfp_PR(568WS~jWVrWSb3bCm8meX*m;q-F8{@nN<94H!$T{=PvT0fd>)KVr(m^VL zIS1Zj98G0gU`F&7-hxb!jc?mCrD1OfJeV z&QB{*&Lt-*311bZE2{uNgu7|`@2E3;37`R+mQ%F#Q`#&Pdf>rMlbA|y|yl3uTI+^_eVt>c|` ztM^*JM~&GD+w0B!{eHKR*!qx^6Wd#@Zj**fP66nd1l?&jcKe6*PGV4k=!vnY)w|y8 zGHgLfH-oC8*Yy^BA5$a%iu^|E4QE5o)GBR?5- zpct9Su=f=sFB$f+Vk9KPzEF%LWZ1Wgkp+<-`G(goijjs4`&BXWklFsB7`e!>zZ4@M z8CF2ep3vVZIYUnHN=645V_Pi4|20I=HS9meCzVYOPKu=?lip7ZO9oDl2_)HoB>5RX zmfu*oH>ughB^i(LX%(mLL4B`v=VrZqLB7h#9Q+wK^wsXx)@m2zW^=dG>bCZKmGifs zt88uWY*%(*)#y~NwT{}&LmbwZSJ#)YTUl9=*G2MkQV!`uB)E*{yU*|4+aNx# zc(4ZSBA!c>6JG#+Y4pwI`s_=<1U9lsybSz7`KQeXmu& z_`?0)HW=w?jI9TUBE=!kc_{?g(BzyC+ysZ}Fz1&;8xKF2l{nN95D&I-P?q1r8H@y& zz+HkF$a5n2ci>Ng1*wJ$G73*~O%k0{PW`e-SccBCkf%N}dHlcZv4xt0}gQ-n^G^po{OgJ+Zz2Y5X0GxM;#%IxC+daN&Ct=6Y#NQ|{%=e5_Y z&2lQ@&Ky-|U^Y4EMngVDjYk{f6|<&i%9y|TGg*30b<_JI@>`hDowT!la26uQ99Tb$ z2lk_aoNYd1a1^J4rjBt;2WjsUOmimomg;e@B7Im3XN2$+%Yb|`PjZJIgydd*`Zkl?Z|aNh KYh7_HBL4t>2MNOf literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_csm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..6a8e9797592e49c12982bfa6cf1d530ca561f2b2 GIT binary patch literal 4443 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_omni.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_esm_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b9ad368364a8bc8995b17775911d8fd7ac71738 GIT binary patch literal 3773 zcmaJ@ONg6Q6h8kWlgu-jClv(;RA?1yXG$%l&`zgAZL!tbF`{mUIFs5yW-{bKUH(xJ zpB0mG$M};o_;Y+^cAAG)5jOUSI_Y~s^ zWY`16$bE+Wp%|IZus;&54=VkA1lPAEpEGv9T^$aaQZ zR*Z~i*vG&;VZ1rn!JePC+VKRk9N#EL@-ytNVq`wU`ihbB42y>y7<;kWp_XL0hsHj| z{$t=1-SDUe!q*x_av9sS~S5kFTt($o=~tisVXC3|Wsza2D&)_jm7}AwH{ka2(i4 ztkcvJp9B7+`1{(E;-z02b6-Cc`RP~U^T1E{ADpdBz5`o9ELkJIVDZmD~+cbngebbe{{xVqb*r`GsOw;0TKo%*Y^g zWY9C&4T`Zm2|Z2%`B_6bNc2-9_I@xuV(+T0NI#&zNC7pMu_QPmE~dN;eS}(YMa4xA zQ7@-?JoR%?$0s5_W*$C+Zb>98NjWqdCynK+%^3V2_ZYJz{m}fz=m$CTV;%?funxwd zOdr-{aZN5s6aqt$MZ_KSxOXH+zwVm?L48?g)D?Le_uzx?sKSsLo>_z=3`_NnM zQE2)p^d6zM4UH)>1^tULhhta{&PyMDtjkGbl22bb>UX)f8l}r~^CS;DxefkUcgn37 z&j-zs1Y+&l=#)6@ssy$4Clg?AM$-o_dez_3R$x& zGuZb+tncVYeq4F3i++^t?(h!q-R8MIhtH@EznN5*oDuydwXX=@qCHvcGUPt`wYM{g z|2pFNh(CdIXB~`(Iq32p!5_2Bvm{p%THSne1$xdB?KxKw_!xu}kjW+IZX)HA=YEh+ z!;DYc5A(^K^kIC9XZhGWW$JROI~3a`XUp7t_sU^n(#ec?R~jNVpv9 zSts7|c-DC*Me9xO5o1^$>xX>I$1|02liV@dX796yv!(9>&XW0g=RDcavo$`alt0`r z<(EB;Blb8rqMkDA$2*kDc1~u`IW54x5bG(EKlB?W98qQs7AK1dS!0S!L(kc|gFL3s zBW8XmCw&n|W73|sSRv~!>RCFBam)7FbG-L~N4Kn3^IO23;2U9gSnykhd*jLW>VqBx t|EDoScd*JKbJ{%8cJz0_L3si8_70it3w{O8$=@1>vnU0d(I^s;e*xNj=E(p6 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard.bin new file mode 100644 index 0000000000000000000000000000000000000000..549d2f4b3d3f8953e45f0ee9258547f479283843 GIT binary patch literal 2679 zcmb7FOKclu5T0E>cAb|)+f+gz5s4rbA%!LplnAL!A3~`}MIl&12+5elAx25o@9%BdVcoZ!Y0snUt3RBSjd8ar9b(fqHph~~qZgd*Q-L)l0CeQ0j zj)U`i6)7aitPm9P4E)2|4z?Vq`(&XMW)MO)=7tW4|j#9&+116(bip_P1i> zBge|fxghj+M$VBFJZb9y&lQ%_5b5f1yLnOR{^}|>9?p-E6 zuXwlt>=M?iloMY7-k5zEXSwpA`pedX>dhaCSAhp-KD{sU-A|BhVX2=*;Gb-Lap}eT ze_RHp&ogM-0vw8XL+(pb4l$wWz7)DC4&`CduSV7$emE;hq%9x?*d}3B;%Ejf0VZ&k za0c?C2;L6-Nw^>qEl4do%P~oHGCB1ZWCVEydnWqc&z z9P+n#eE1Z|MSY1p0bhcZgzuz$iPWH9i-;QsE`0GkqR)siFg~8SG98nTBHCMAF61@6 zryxG|yr&kfXg(fv;%8tYElSv}YbG4C8$J&Xs| zV;M19e9l`PO+2 z=P?VGzs@IP#*8K*F^gF_LEIztO^h*5=1Lx2_(g0XbLZJ|w;8l}`CE|nn(~gb^_tBY zG0qwFj6yVTnc`TK5 zI`!>tt9ZS&RIe#aYwHugLI7}TD13VqvgRIO{lAe_atTN&ZZ(%gHy7pLkqEzIE{r*bKh7mY&EBVDCWR#UH+8ga7d9 z7>wDv_xdI$wcPYJ8mM^*#OUo@?j}%%4j+YoDS#eqaG`H&CP`Hub*~Y?_)^N6n zS^Gk5qj~XMt#weY`cj5H&8ylPN*Cnn)%(d8|3SWVH+ieQwzPIo&NbF|n(gNK&fK$a zJU4gx?CROMRd`k3nLF9sYBe@7IXu63c>eGUi}Onh3k&kPNTDp1X!6GcuZV<4f4F(` z2>d-pd>3$FOBjbRUZ$M*H1Ou0kFJS)`3?3S`S94Mhlp2z*QQ>?J~?{3^8K;fl`}Vp z&j7#D`rtbBG5AqCyMaG{?H8Um{5*+L_OL;u)aM)(7vfg2a~CC-&b`nZ&i&9I&I@6| z>cVK>4=NGua9+sGi@A9T^P<_~z)sTl(MBRg%y0Ff*PD?fddp%WaX2G`h}hc(bK&c+ zW)RnX#H!HKeFe6Ylz|CsF88?yy@2&^Beqa2h&47NwWSz+P+O+G#Ms9^K|aLe9@xI@ z%b6$t`i)-s|SRUrffh>WIB+B9rfK_|cBcAf(S$-I!hg?G5E6a-U zg&1QW`0g6+?_auHiypFE-q`;L4TdF+0ppW=DCRgpXNX$py*?81riE zW6e0^vS+zL&B9I`7A-eC8|x8n@X`QN|HuvA9{M)Ijh-Pr?jtv}Yx4oWH6My)`C#m> z6tV9P#?PU~@b}z%#^)^es594r9=>~;Kk5vOkGf`Ga;^Eq+W~pi@Jn3}F(Uq+p2ymh z9&3g%kyqA(o8uL^@AItt@#-Kac|Pa|-WFh^yuuE!d-Lib*1R3<%}LhukQ4IC^BnNX zy4JPwinvYBrMwm%f>-*YXN>Y{^YK8u>b)`AQ{)x?Blp@u3^keH+-r5>`Z_3f_jjwy(J-m2+Of9bAFVGmxh?GI{bq z`uL@0d{F=Nd|bG_^iJV8o8Sbz=(^QtPo}M*8-6hd< zZf{;s`CvZd5cg0|`Ox1l@hWc8oI@f-p|MY(@cc` literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..1d7615dfe6557774599f58731d39d77a70c5c8ed GIT binary patch literal 2675 zcmb7FOKcle6umS4%p`H*&^DD2NLV6BMM$AZ1SLXh(~nRpT2Tm=DmKO>4lznHmOtu- z#Tb@lVI&rm)gZAlTUKQOVg);vNZk$+n{E)BN~ps*_r2$F4I3tT_PghP-o5AEH-2Mx z#|t|j?NlTfH1?vSsJr6%;>qbjCA0NOL@kLpNBCEh^@b~eDFFD5#Jg+H6wsP!-V&o^s z4izIaIrgz)1YgdF=`F|r`?Ge7YBrWk3+vELOV54rE3ijj*P`&%*c zkz-}lToA@PC1=P99y>a~c(ysq;QtyT*c$9V#>eTV2ghM|6~r^#FjlA6*le7ao9(@B)Qb-KwR7*h zSlhX=d!x1suU5BqH9GFJkFeQV+t^y$dSzp6bA5eX-WDlUq?#~>NPG$Fhp+D4yGVRd z@pu#11+3SpC%y!{x$r7vx%8m=%l3on^&g2>fk&r4y)W|JPta{+X`E%?pKO0|;pO{( zTm+`ia~RtK0*VA9?n_dRaYOCC6#Ev3@u(P96EhxRydYVkBOnF%W^q;0WF8{{CLl{Z z4}DPt{~qE=yd;t=Nj*8uYhrDjp7u*JhCWMPfZoN(_1XXO$1T(xOn&Bk?1$y4vsd+; z0C}cbhc8QUSw`58J`XwCQjC3hq$^OrB4Uo?5_AO#bWgpBX>`Ufj0=(uJxRfl<0FeJ zsNduhBBnqu8cXCU#1gD5zHRvusl&dW5H}q7h(&qKm}42@3_w&{o~(DUeHc*U&go;v1l;u)RWJ6k6&gAdHs#CF=x^nhv9+! zs3B)FpBXsHY@NQ=z`AK;xMmE)9csf_q1u~%(w_4_p0cg0J$*f44+Q!w;raN7eTx3N z*ahe_tQ0Y6zYx#Cc22(0c$8^hva(=K*+Wl$o!E!44`=L)knJFcQ?;NPqU%xy~Q+VV(+OP?^UXcwQxo_58wxWlF-i7Gmo<};O}dEKaY=i zWA!73{!HT2k2(3M6UoJlZTuciY?uS@IsKfku_Kn}z#iGWG}aZ!zHpWw#>FtTdC#+s znY>M3J$rwckEz4mCr{;y_R8g(#*6lSV*8Gt=P_p8=&k?I+$R&y&6&fct-wWU?VLvoxXy%M}mi7{cT342d$Uh?(|K9)r literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_csm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_hard_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..5eebd44c91e35157df5c861a320a5dea807c7f13 GIT binary patch literal 4355 zcmc&%O=w(I6h80Go6IDccG8~|{6QmC&`oR-v=*g5X(%nW7>xrWLL8IS4kVc&GecLx zjBbQ(MsVq33R%4(xNsrew75~BLU%62-3WE#N)R`W-*?Wv@4X47MO2*dX72sYJwNw+ z=iK{pZsmM%uKW3CB`LI5*Xo<~o#`NyKn}H6H*4=-X`R`6uePz>TCQK+fTRG)V_wo~ zZEUxzty+D1rBQFa)^2gdWJY(XcKLFDSQL{x7r)pj=4sC8j`o317xFSS>qmlU57e9v@_@$MtBvYT zb*niy9Y}UQKOF>^-z!UQIQ(;XOU}M|X7ONUVIMYHx#BJ#hy}( zc}R6<6=N<^>?OsRj}%)3mQ#BNWf^0B-c^kDj!45{9mTkhN2TYmzGBSF6Y_<_T-gC* z+!iNo`ZCKDV1nJJ^t>!vbRP5N=I0}YmV$dr43f0CTzr;Wi!TwbXIC~caix`v<}qqs zsjkA z^A}ex&a5D+jh&gZ^{qy26N3}8^CxCcyf8nzFgG_RuZ!eMQtnUuaP$?C&Z+P3+&PJO zPZQq<9M}S$<9J@CocMm=^@AVX6#4RNtUdYR=}(UnF9WYmzKC^l>c{eTr++M8xJ`Tt z_-^BaThPbDkJ&i@{P~;r=r8#^iBisCfk>gpF)FTuQ^k!#l$;;uI=N&Vb)saP@8q2> zjP{~pxlcPB=QHE6%(#H@n63$6XV{C-Mj~Sv-|a!KJ0-*ZTMiQ$bfzTk6MI{+5V8KE z4{=*ZtO7k-muEXk37Eju^?mL^tk^D9_i3F*NFT&5(BDC^}MdF zBgWV*25n2xxYX7nVnSZkR-rg>aWlq2qGSFeU_(4H^2&V#7?U5H<5bjn34X?%oN?@v zLEn5vlwXe|<`Loa<1R4WkGIEs`uv4bgib}*5ck~V95;+RhdjbYw>H; zK(6=@_xs7_6SS)@ug5i(V}Xx>a)mnc{$R)a8J5<9*&fHbpYiNEu1fH|q`rN<;QZ5g zd`!j_u{g=Q<;imucNP&7{V}g&jw@FyiH^mc){4c$JPx5J8SY|WHfJo9r`$!{bA~(W z%k^BsovsHjvEz>O82d}P3li=Ohwm^%FJVtzjxFxEYkk7{lWqu~x;K>vSZh6qUdMQ; z2fc)6!_vHy=Kvgr;Fyo+nR^S-H}LDY2;pP2CqwNw!J3q3=kI|$IM%}b7rSr7XL!W}itmk%zJs3#=_G6WqO_P~k5&IhGIX9W)W2ona#Z!bH&q3e6 z2Q*gZFultwzRz5aLgc&Br%%{KjLf_FBxZSHZBQO#UB&gFoi`RUdsy&PbngN7FowMw zpWM%&d(`EA%=I{VX1`lpJfC^458!Xm;a=^1V1T|JP= z=<#7*-8rdw%^@bPr;K^c%KX^m-dBve8}|2S)@JpL57xo}IUjV556c7Zjv2&k^*Mx3 zzfayTd{47`&T?(_#N07oJP%8dbI*1knSQ#~-r+dM|B}=}oN=H2c_;FWOz*B7I&Nyt3%WmJ#^^S1!0CmbZLb;o)FJgUh&-w`Sl!Mq(E$OMd%|9wZ&Fz;}vxi#$;*-CYdk~>hg|) z2<>8oZYo_|w^Q7?kS?qUE(90Z*X1lKbmLApUcc}E?`u+V+LN5~{jcwQ=Raq1apRJ6 zvG?8m87Xx)x0;P+Ytbo)BlF$OM*Y*9o%1`N)N8w)Yt36VSW2)wpIADb+HSYnsW*2w z_L`k{yB&H=wK%p6OC^rI)@;`qxaf=lU5L?*z1mi{QEkNm<1js!nwp*U zdaJg@sLQ*%EOiL>$?oP(6@}~7#@p2;$2|aTFFD=;sJ-YE0gZPz_o}VxPJ3n1k^Fjf z(Q&Yz?QV8zomTaoW^1R~SZj1^OU^X#xe@%WR;{+X(oS%;R@dUCOUn)lNGwhyXR6fH7ic#|ni<=!7_hQ^(mZZ6J zZJ%QQ(eQ~a-|7jLG~ZWckc}GS;d1B zz)oSjNjvd5;LW)&9*TVbGlI@xsQ*0h>ckuHle3R2zn*(sx%?CT7l40$?(V7AA3iw) zn|@wI8@os-QtESFlv3cNb0;WBCB_SZo6g<9OXprtOy|X5ERIF;zE`eo`4-Ef%@d&2Z?=h#NP|1M*IuvD>4WeFH#0)A47tpQb3pcut(s6D=G!- zA?g>kj;nD6@c2-~L(d~-*qadvXT%T9$4PT}>NAG;{XTQf$RM=1F~(t?#j%b9KIFkX zTr-B8EU&F+Bnp9nWCeMLea;;zGOqWkV4<<(8TCY-#C!0dchn~z7o0uBaqkHqV(v41 z%D{XK(HssmD&}$&wRZHsIdI$39NdE|W8gJF{e9JsYt$Xl4-|n7G|qJJxEGD%+JoJ= zN1@p#vG)kv)-|WdB<#=T%;&Hg?3V%J$jeD{Qcq7c8uU0fj?&|~xl)3k+<|`NooegG z{lPfqgiX0vo`YP<*uRe<93Fk>Z+o)-h~uDbzCXM)&i3tTE$)l!q;}FD)CqNzH|`^R z{gk)us{*_6#Jz-F?r={$SMHVl#TarU{u&(YKJZRQ${h&i`;5gI`r6yXpnuB!W8{L2 z!2Zy|Jz0->h#dfvZ*4#0oCDhq*03L||1|K*!*CpH_86iAL<)WWp_;D`s<^Ax(EKYrJr+AP3_zt?kJoxY&xyK3IP2>YlAGly@ zcQ&yzb{=oQJp5jP5r2tj&E(A*gVr3STfx81ISiBG&`O^EqAyFAsfn2>T}w=0l(KcsCFao_x>v zKG=EN`ALu3u>T71kM)8t`zQ+LWIsHFSo{@%wU6A9@?b7#NKK)gkHL7p%X*K{t2WPT zo8;j6QfK@IH+#$Cbx>5^hm|MKjs0Of?dm32L5^PdDi`tvQJ z_N8DPzT?m+S(88BnRLybGmKi7pjCvPGCSAQ54whlMqHCa62lstV`xs1DcE@r@1l-z zC?RJlSCjt8qdDnMUyP8vE81TUbKJJM?m3=&z@yvDo5U@k7pAiq{H5YAHe=X{ar>8XHH{O&F7@9hhXoJgCb% z3L>!n({6_cu?q`kqUU#E)vkprEmKS47w_D%q)w+$= z-sXO*`+l!WkEu-TdgJ=_UZ)<#7GWtxu^X*UgMo|A1ki;D-Q2Hl_nNhK6fgg7ZOL&DKs!s0cL3@vI(a~oy{-LPySCd|S#%`3 zUR`t?tmk@L-FmlOd#}~rtu@!0z50?f3%oLhztgVQ_m-S#7|LUYYjtd00t_89c|NH( zo2{Em&I|))#0|rL!iRF}V3@-{{E{#D1D|gc<9Vdm zJ;iteDfW|M)IP=jP>jl_*q@3~@)Y|^G0L1`Q{a;m>MU}YeDOJ=7==!;lZsL4GiL#iC{h##)R!%n~!^Wm`SQ;wF#RW9^-S2OArfw520{rnm7+j5}G+4i-^EC$m+|IyY)Nt(#YC z`^V+JC)CQcwp^LkWQ)T;gJ^S)Lul)9z#3ZiJ6k8Vj?2}?cDvPSUGFX*xps8<(v{6C z%bVE0-d?`Y+TCw7F*$u~_4KjRCs&W1SXo(-`}aQ($(N-RkdKIe7USV}ckiAdKBu^U z0@x{xw`nI{0p6;7^+4puUlDW;L;dH0*QVZrpPYSM`u*JF(&b<1zX1Hpb9YX?`QXVJ z*!1%<+So-xk-~uUycB#VnLBV2D6)mc@n>Ze zI5Ha8I_H<7^%U$l3G7b}RX?^*kNJE4%$R>peMN>o<3)<#T*VOosN~S)RoFvt!4;Jp zY6u5;-N)6q9C&;z;-TjeGwPQ`g0fTt^Kp_~p88B6{?ULr%Q6fsZh~=Gr*YiJ0Uz>U z9bm@K}q+aqYow z+{3`^)2KZJw{^`aG7bClIkP!z5BAFtapdJBIjN_o8V&oL8%OE$+*~QZPi{j$@=mmM zqyAtVbHb)vEYCqMMbux#5Dt$%^tYOW6KEZR5BGHuKT?c$%D5O7>+z|^lE+8~ar%kOB98aU z3(B$)n4bsisgBeyPrsz^tQPA55%Db-*Zk(dds_{t8M)18xKH6OA{HE~zy(vQCtKS* z?)*IbUekEyOy8&pXv@CL?YLiD6W_$pugIg|5Pb2i0qZJqhsuMwz=xVbyDA2?=R2(T20dc)thR9u?u~DF zx;JyMhG^~QmDgeA2|qn&XB_KjT5%n7r#;pHX9i#9Er91p@0i_}A?h7zk5eOi zS4IQtQ^9@lU=tnShB^v36W$;7>60HdW{PZ3;LKCs^u2YVHDfFA=l*T}jsLIm4(?0e`bY^px4T<{JTBgIFW3$svy69-L!nPLUbdc@OVkALCF! z&O&BS`Xi6#q(6Nz0`e|JJ%Sv!Y_2s&bI%9gTUM*ZEua@>(-?d=vHm1Sn`;be5d5FP s`P{*%2Hex`6!VY&ojmPldA)M&di~VK`<1oL`sM14HE8nCJmoa?`r2lr zT(49&m$s_)Hyd?YjCT2+tz5m@sI5i51!#(q@8xQ(LdRJz2XrPvm$uec8tdil$YBJk zCt_8#ezvl`wnDG-o15HfAM|65<&82nu9Vj=ln;36K4|rTm+6CQvtAa^NMm`cyj|X? z&Chz$EicS^9^|RUa&2R&ys@=j*}QgHEoZ$kDAo^3y3_f$^SPXP`_$=!B61~#Z@?z- zgR(S5E&zKGfm8U0AMzT%;d4_f#!S%S3`BVh>^C`P6d>^sHCPJ;cY z80iuDiQn+~RWb6DV0(&@pu{(aT3BK?HmMkiO6;BlmKMgFl0$UB=M}XhZ;4&hXTX?` z?N3|RS6v+!V~^-Hr|a%Ahq?Z8a!+R^V1G|RlXO#*pK)gS#md!g%Nm5Jm*Uj|R<-Np z)#{B)<*g%fCnMy*__A32-6dPK<)h0-hmJn!dd+tni zW2>@`#qq-n#}6NWY2onE`T2Rd^Oi_WLT4 z9=7*!iI1<>iBAGAkG>2$Ir*UY!{USD`TNB81Fuefd{^Y#@1a}7rSYeLf3*1Nu@~-zmNeEO<>t7Qf_EY;4QyN_Aoi|eo=?o-W=BlmXLigfrSUpZOv)Lo+sIRHn@BA-?uyk0 zXQe*QO0enWY(~BahMYP6ACI$X`EAHq+_R6%*&jpB2Ig#U$k~9L&B#|n&IaUcT7DmL zHZW&@4mlf`vww!14aiw>`1{%a_?`Clu+IkUvl;n%$k~9L6~+3D@1Qm_3H=%Qa>(Oj z@W^*`!TYVm@8~(KcPPiR4o^7$=zmA&yYsGIZr0L2N8o!qzBIN(@9jtla`N8J_kWSz z_jb;)Xz%7hg4qV&2$C3O#s)?u+q8r#h} zTztN_TV2dS{GxOMV9Mbr)>xosa@g_r%TBNlGUqVZ)87ZZ^(gZae^Mlv#4Kf6{WUM& z>1jWSIp8FGo`c@SNc5e7{5daUOv}&q$GU0fZ+kzh`{a>lsCA?;H_S;3>((a)t&4Mz zJ-zZ#&8#yEU0U*5GxZkJdWwF`9dj4VK|+5NGUsHhpMAr8sAn#mH8GaRl;%pCM=yfTR0)_v02_a&8G?K#xW^Yl;;@@+n&b*A8J z=ge6Ud%|W#>{HIfLe}TAR^vIupEN?&gjzWNN@ipNPFVv+zOZRE9Y5&r7O%YSZF4op zD|w)fypk)*)VX!PJS7s~Z#J=Qx1XIO&wGzKH+desZ_d*sm8~+)t!Og^s zYx5zO*dHYp)ZS{&ARhbQ&9Q0Ad*05M=g;+i#OMCJU))UCV)J>^flY{*%x}UUf$a!- z(aGdD+a+5bW{E%;yJY%7OL81mu?HU~!lO&m|gA^Rb{E&CS?ww8tUjG3;m!Yr# literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_csm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..e05b72a437dd0c87ed3bcc95a3e7c3cf3b50c763 GIT binary patch literal 24432 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..fdc5222a843a19ac1e207bab0985ac6dbdce27b6 GIT binary patch literal 7260 zcmeHMJ!~6g7=G{U_?)(}QzxkeMIsU)m8CQ(P%5BJe}r1K6{W!vVlgIlTB9VkVq0Ap z&cN2iNDLG)9E|Q-mM*POkzfG^2Bb1D98x18_ADIF^S$5QIi|=(>S(v;-1ofy&-b3= z@68*_XPkWVgELd&bt)^3wZ`V0Q7YyItGp zRNM8&#&WaKezVi2#_j>z)AiNWPOD~Z^Nfp# z_|%R2YM|p1>><4t%LcnF#^U~p*E>2Z1&4bIlC+y_e#)8Vmk2KpYPPVjy_DQ7;;wbI zdbx4!LbZ8FZf1oXC|~MpxVxm;svNEyk_+{f%|@%S+MYjf>G}CH=a+yaX zg-$=1V9SZ;i}d|H@|Rh|7VA}iMwWt{(al3Q>QUE~3}g}3VJ{0O8LW9vYzqF~u~>l*L3tZUIuY;T%`7yzea3+gb@Y|(N#^E|U5a(TE zmp539Q_m5TKkPK0*mf{S+PcuA-JmToSE9t0d02nM{gWoIBJ=XI`4IV&Bi7mnPx93y z)_4Mp&w`|K`Xm?3#l}FbW$-1Ywm4_TAWpxQ>!g0JA65gg7$5MT)IiMof^X%7^)t_5 zTg4=?jq77x%%AmV&@bqLq<%c5Sf}+n;u^nk{VJEPgMMHxc0E+TV|YieB=yI7=tb~J zy8<}=9DVvb_~}7E=4k6NakoPAtU%AokM|rH=gjkTJS&Lf@*Jq&!!oEVot)AX9 zyPx4Vof9}X&pWbZu9!FLFX2sN(x0BQPU5>DYex>r85k2$tkXFG#zH&Jz$%xn*g1h+ zn;PS|#84x2(m6q_$Ntb>VI1*`=nd#1wYqkZXUkR`I7% z|1|n~#@M^CDf_XU_tThtO~d9n$oZXjr#$*!_MExUo*a@B#>Y)pXK@<)Srf-Yo;+)i z+k&6d-(jETjU8uD+vf62&icGeK$aEH)J(bhR2l7B3g`nKLxzp?%EW<2(iZhl{l;&msOS5GGusAl7Gd;(UoQd(i21V}9`2 z)Z^uu*rxw%j?9D4Ti7G7oY-8T&Yky_okNqFdf~m`Al0M0i+U|va#^>{rv7ZO( zo3m!lu|lKIncO6FC((;qcL8$B(zWKH`Wf-C7g3PMUTQoK{>>f*+7|_^dnOA6O6+Z9Huk9pG98bibAW}gpo6saGRRlC?8da@GMZgR~Y>Y{q){^6~{G+l# zdIMP?m4%VAV3EZjWi<&Bi!7>cTA^$zm8y$MU6ch?C!|JkDkL^+7{2eEd*5GX{1TdW z^<2H?-E;3f_nhyYduPt)^ZeZ0^TBi7KV97`jm`P^1_;%FoCWw#$BC_GfQiW=Q-;%5xE!Qe~=x(KWs}^^=M& z3NcUCa4`xQeKFg)j*rPyw8pX#aq9ch5$a_=Hhnu2m5DGPkLXDv(b;Esn|*QTh4jdE zG+Z3UcgJwI{_?_w&MPl2tUe*vtBQePZMx##qjLTFZvDp!`j3z4&qcnhuFoHze?ned zI=|Lg?_AtC{P>T)dHDIWb7v3F!O+FE!_Rgutu8I&=ERX>CytzW^4O8%M~}j~ABxoW z%5-n?{l~uh*SFt(TI9_);KLh~?}J<dI5! zdi`VQwjb)5h1}V964D6wYEMh$LLIUEYY5GXj%jT19uXelcysq*6vp?Js1n~-qiTF# zi)vzXp?9m=obFK%?`x_1dg{J`d+Y^_sbZ~uug2{rQ;|qNnwD*C2hu=$810dJ+J+ry zpNreD1#>S(d*z?Ky6OsG({PKrs#3vNL3^-O#Uc>tJ!Lb}?)}usLPAr2%@MAKn$BszT03Bv?Q}xk@WL>V&?s6TaUy~0yx(`@1RNGQPT+n{#C$gnsitv23KX$^MGtslfeeAN<)O-vk~Qea1JDTMFeJ#Npq2#K4~CB>EqoTYB&qD(03vw^C1W zOP@Z5vN(D!#rz-K@cuhL;yuK+=asmxe0=0NBOk{;jy@~C$z$?)@=Xq-I7Uj0?&q5f zqq`+WyL?wLjCRVsR*2E<5~Bi)$TyW|_ITcsdyRZkiP7#D&B})*MumH=#Avtt&OX;} zmvK}ON93Ez^Qh=N`l!UHAdbj4m2p%QM|Tt>=DDmZu`}uum0A6P@*XjlLmt8SigpB^ zK)C>N2kF`iwu!sXajkxWwLF7ZZo2E3_ik=nh%wuGc}~UYi)|qPfXXe5F&j>!%{miu zF-hJVqMhbcs#?3^Ih6pl0GN*&ioUC}&~}DXu{8u^+A25RL-_&BO?*d=AM*eY<9qE9 z`A$BGJVV;|Y>f@MoPD?cn-Yp9gh?u-V5D$AsXdLU4#7o|(-Fus)xIZ`-pW&&YmqShSD4CpoRE)Far5 z=ShBxG1~819I~EEx~y+tjB+k*4CPFwrVDFlYPw*ba%HT|f(@TbZ5DBOYAOCK9XG_A^CQqQqz%MoDc}iP1QWlG>~iqtO_pYqLs>#$i;RN5!9ON!?KyN8{qC#Hcuq zZX>T4;Cn5<`)h7deuqRp!(7XLC(rLkNo`h%(dfN4o2ol1F&d3gx;CrCXf#H%a!1c2 z<2uNdasSynSj-2DYO{EbaZH*kb8~X}EbF-jdU+0vxhV3^IG^?Fk=OD0G4tpO#^vWy zhB}{kuAQf>|AfV$1RJ8)u$Q%li-0jj$voQC*mDs z)$8%Fe(8n|57*A&K^;Sk8HI-^??hkIoSO3~!>RFEft#WX`i)bgjL*mWWc(Ow1$S^6 zrRszHAlc9{+_^gzAlRx=j*b3 zta|(yV@_9$so!7uxev0x$TjJ{bX=S5(GqfIVc3#zZQf??VZXn4 zo}~BFsPo0vCWaO-wtur{1Z7TF#(&zWex&A_Ofu(-vmaw^KUvITP3Qlp{Y1Uq{|DVq zJlE3u$?rR!FBT*F5L17^IlYCr+0qy>zqaET`SciVKSGSQQyB4`XRVplx=`-5EJo~a z!++yrc_#7v$;JrJDPolT4#P0gde|IBe=ad{zf&BK(ajrW9NF&_$76J*#Hb*STIG2Z ze`bw~qn4ECk^fvDhtaHDF3;@3y;fpW97k8mI4X#vS-DwaREW{wD+L-5CzUq0jRL`f_=%)t!-3ISm^u@BJ)tI_7<&b2|DS!dH=Z;~bZ5V3G03^2Ke)Eq|r& zxQR#e^GU&&c zG>2xK75oN=Lf^@uNnDo(k#b6Wf7I8d@wo)bp^-b;jYHcLRpmWgmz_-&=uU9tdS++x zo~5^&yqEPGpX@m`;*_pS3#Fz$na@^><~cO0Rcl65?o6?|wPADs@3l;-udIWVXcGP0 zE38>04*NxV`%(9H5FoocM)+X;9KRp2z8`bGfqs6sq%7$lKGb~fJI=?tT9?W7;cK^^ zTKns|P6Kw@-}$P@zNn5Is3u##Z|b}%=KM#mhR&-(r{PELkN501oz`dbl<&q~7yu(a zd)mTh+V7b?%YydwD3!B#`ptLhlqXum@w#)B>5YWfUwe@}fJ>)VK@ z-oDh>^gMeW#D4(H2VHv}h6A6+Vd$~=B$w>{BxhxNnPa$?k5^(xyo|3k&VjY70_B*UUsKTp#!kpJT|1O19ba?p0C7q?Le%P-{wX|* zVXv7RUq##Eg3sXJYD0i{wKW;P1M1Z^{NEF#%{GCMIbFbRH z#+|#@z45AFm!EeB5zBmLexKUC#j4%gexm*Uvlc%0IG1{)*A6O6+Z9H8_zg)Jh9^$8v&{%ibMg0CJ|H-(59(X8nuN`GYHt2A(^yOjXl=< zC@i0W1yZ{hq_8M-F-WkPs1gfS-85oX38AoI(QZIY|DHl(HHuVq$r)-Ea20jjwjP zJB{{*_Mlk{D#nn(ztU|scWc3MOq|FuJkx|tCjcYB8TxNG+wIP^TCjwf_~TNTPX9f9 zT^{?!qZd9VBJYRz2iOXJaV+~HZvp!eOb_t~zvM;!gP)fbW1>9vYsHuvkNr+DCdFfa zQj96_*xwanE<9F*?ob$ikKLyj6CmCu>|k>avcMk4XUv=hG{L3@q( z3h#^VUx=f$AH~JAUySDxUg#J`<;tkcB_lyxk;y2K$;e9jkL2K zyZPfe`Y2w?(T7SaGLFeFQijcSG+_%VZ&_qiOk^8A9z7r-R#zRoQ`jk7Y4C44G`cyJ z8Op8Uw?v{q<{)dbzby69vWyd1A+Rx89sZMM5&WA&%3PM|$oLk?hq33Qo&Y+@OI;k3 zhjKW^9;##PuOr%zI79Aa$bKkA^y~Yd77UcP0NUxk$h)!m5W$w|(CnE*{}${SXY5fw zX6#|S%n!;4pud>PSVVsly6@~0_94jdK1D*i#?U{}_;HMWE`A6ZFpZu1%`tO9KE@%^ z@i=B2EKZCiW3;I<1@V?cWM*YhCVg`;2yB?f zwvg0^^RIA6|H`R<%m;Z$pUp=SmzjJV78m+3rG1Et#n$_v^lEn~CD7Gj_XK`_fF>c< zW+o4n#IFftS#DTgUKbPdi|b-D_GeD$9;B)&4$% zH>^nN~y*>Z_{<+JqX^da!scK<@qEc^*8!)EXiWbK!VG zoDw}KO@=j|b$)(1KGFfvX zZ=(kPk;=Ti=JNG(dwp0v{eS9%dnW7SE!4*wM^qpDwp+}zF}6JE_dl~QQ2#ri|0DFj zm*{6ry{C<}>~fBp0-c>%KCFgj&qSuvpNUKsYrW3z>!EgLYhgwHmFDfJYGFOI_ui|8 zTX#(@tjp2w3v2S{w7%}u!rfF0K5s|0FRWn?cIVW4wQ%>;!kYXw&D+t{!e3IE_iEwp zsfBg%dHY{$p&)j4T$6XwTA)ns5$^7Rt90%>iX$iH{oR7|xZC4iRM)#lVdieZG38~? zRVL#AxW8KvqZ~(P=cxbw?3l>IIn3QvO+N2){_Ln2^xFNye6jO9?Xa_*zF%a{5Vzl- zc?RVf*Uq_io=ncAGybToTrBL)kmq&xAQubTkv-=!HfAgD-v0jK?B`pH@z`4eX?R~1 z-17zTSQQx|E+8q#3wX2Rc{GuSx%y}oXX}$X&)nKOpOak$ZxuA31VB4E@7^ot@Rq_> z%J6xP_enLLpMeNPygP45D9W$oAtWVDIe(2ul*yo(xgY5m#&eI`$ zsl%^2evA6VH$CQi0satoGT6T#x_EawhO;v5pgh#+KJQ-OPwZl?xH{ndPtrR!?~<&W zD&B&Qfu6C19gyeZX>S<$cp64~T|Tq%ENVRM4$pb&gRg40qo?m8>#95ZHo-SV)-`Ri z*ts_py^kVSWu13^BTtA4b6A4iljQx6?-_g-oG=!e*Mi!_ci2f%QxWDw8~q?Z>kaQ< zq@lfdUm(VKySHw}ZlZb^TdNz3?FPmWLtkOHy&uz8>YzW2zxfDW7>~5m~?D*7(MH>4El01 z&#~^I7`qs8OdCv&mx(uSl__!@^L)F%4m~zsg3MAzCwU=9Ws;t>pA2`^VRrji0zW+!T&AT8#ryWzVgJhpSqw2`nbNXC-q4AZeOwf?6?Mc%EDiz Xoy+vqmNM()pE{>GEnAIFry}wni1lRb literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_omni.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_pcf_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..ee9d803d83f99055c87c1c26ce8f1e70009cd060 GIT binary patch literal 8662 zcmeHMON<;>6}?qm{h5!aJ>%*2AdoT=L?VDpYzra_NE~MrVv!J&p%G*=Y3z2=sAqcA zADLw}us}){jbs*qEGhzo)W*PqRW`BMMPd=w*|2D&EJ(zP1Qs;s+*_|+^=Pm>`?jY% z@11x5pJ&yrr+1$To*vzOV_nL_z3bghw^s{73FORhuhV|{mBEwy-*2}L2G_c`S~w}= z)cz!q_#Y&EMr+xG0u-{5~D>$j9yw|$@HW_O{3Fu~u?jE+T z4?E3X%CLl^Ph>~k!A`r^x=yaE2M1KOjPupu-hLB`+s)25n)RS?1iDcVq9ahh78C(3 z4fhV4z2<)Zd@Ydt{z5GXu-_Q&_4jw1`-h$O!OPc_vKFl3V12kZXbpPJZ+3h8&CZq1 zuvHJL#*o9m-fOiE>cJ@-oStKNp#_^x14e*z^xtcBI^A3KU=1gix1}(f{de|`JoW7- zuY5{G{t@CIU>o?wy^KWu4(ul|J;Y!9lGpeT{=A_W6Xmf#D#p}!>@SKjDIWWqVoZt0 z{;3#q;jtoghr;-K>>KukNp5xK`3uS zeuy>y{8Z_f8Bh01#h4YZ_pV}0h{x_J#%y@(uZl4b9!om|82vMUa4fD9ay^n^$8?7~ z%lC!DTt~S5TrYU=Xcyqb*MDlC<-qLA4sYZs``Dz_pRF!n)qkaVqkHSQ=Ha7qClbcg z;%~B!_5&Dl70gbUN3;j#Ayof7V0ABt{k@BOkIHlH>%DHjdvmb;*%uz!e&*TTXSa7@ zQmeQ9RCoWd-NEA0xeJ%hUHa06a~IE_KQDLg-1(MBab2p3Nc=eM#P28YyiI%q_%B|6 z9r(Ssalj`ge#Yo8V*41Lui$xt_@?1sYp#45m_UwPCSC*nUiF>J?^Unf>u&t`Es;O{ znRs34ZFVq`c?jx(bJ9$e+aEqP@3|X>!Ot7K-@ZrL#d{C z7#Fg2A&#b&;f)$~JtGJR%{ws{!5_>=bqy{F{x9uB0+Ud3XF> zktmQ7WKBow(n!{2lFAB!P4G0}KWSFMzcZ%Hb(tl`w@N1^$v93-zVHdkl}rbgmz7!f2#509_zXIA!NWbcIr3x%mw)vhe-F6m~pT; zF_w(cj>;6oTaJ;LmqD5I&B??~uWJ`uvuiS9Y>QHYY#CYJ)<7q(MKT69&SG0g>%;k1 zxUYYe%s=LXJfzR(BaO?Ed>j`S`Y@w?h>OM6`=In{cPM4hHDLD?e*YVfgy_v&9;&Hd zQ^>O1u)fGc+sOBM!KIy=2xJM|T{OEo1jKB|CZ!59;*>84u`>lT1Q{=P0_r8Ca<(j_Z ze{blT=QWHmGhT~_%A;K|WjT9k7wPgk>4&?cn0t|1=%Jq{^vU87;rzucj+BLdr|hVN zoG~ttk@-xl1kBlEc87{NoHiDPcfZd;5qz|T@|c4XY~kAHprSJJIUqlE(;kai2)i0t zEQnDq<>c*QUlVh<(Gi=EVFm-c|Yfqm8Uh=Jt5s zqdDIlKX~9f?@eES#O_yr$Jfv@e0*sxM&|nmko|$;7T@`MnRzsMb}#!J@c$5BYpzCl ze-kI4t4Y|N+V6Vy*IBJCVkV;pi`nlMG1DI4{rF%p+mL@PVs_$~{bv!g6UJ;y7WbL` zzwqF_xh0GH?4&U}D{n4(^TfTmh}p^O>^F-#J7JxjmAi|Woj7K{TEy%DV`ej%kK!%y zF~cY)=KO{4TAXnfa_`y&orN`k*}Q}A{e|4T!@VQAcWv_9oUDQO5qn=N;GLCo9L$2U z_f3c8-?hz-snWXHgGdQ{e!j;$$av@H9rzlceAMH34V!;Yrw-0U;i$f+JA3o*peYSz zpEmEXxELSb-QAvZAj;xg2;WSw7M)97!JcvEjLOXpX+Be)j93FD)ot`VD@YmGG{N&Tek0(_nl;6THgoUh z>7?bFXP?1Yg#9vjjgNgaMGs67Kbv8&URayvBl9mh3o7DVWJ~P>menQegZZP~w3D%P zy3G#OoAnsaRv?>u=t~#}N529Y#JvoOsk4ywD$nphens^;Ul<3&%Q5^&=hvLQaIS4J zp|2KOen*(5@r~fS=wo)2$%98}I0wZnh*$$QxoV-I&|BkZ>C zAJ$L4zAc84@-SYsn>3qgO>s?}{GQf-6DT0B)K?ctsGr{ec;_)+MsIUp&ZW7>x2t#w zvX&4dx2OG>6J~p}!{}Kn70_4GbM9F;h->0v#64{=Ii|y6YBEJm;hed;o!L-^%yLdA z=^;mDlAg4o+)ikBHLW4Yc-7YGbGnXV*!!yaYJ7Fn&6?-Iw=t`K+GuO#fe(V8Q`7@} rtijt_YaoYAyC2>9=)Mkm%5vwdQMXoGDy)-_RgUJgVl_IOiOBx|HA3+_ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..1437722de2698ca3492b44ce874822f101c5db67 GIT binary patch literal 2799 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_lightning_vsm_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..d99caa7a86677b2e656b5a19a6af65f8a62a9d2d GIT binary patch literal 4763 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..c3d406b54d06e2fff2e539f1ee588cda61a00e04 GIT binary patch literal 555 zcmah_!A`-i-FB2T>p%NDL8b42OEqO5(wU7{ow=DFIBlS^t1f*mL~@ z6XOrSUvTg%TxWNCciYL%&f7OTyH`m^r2EZtfvwkGKOLvjT>%K}IB=EvRmX_#TJ1dm zZ-mwyPI`@ZV8Q8<&>Gti6M8%lE+JSMYJsD$r{)r#*>CmvU=it)@!_FNU4M2=X1#jv z6xXBvG@Yf-^YHNYDD1>Z945oZr@=Ig(wE6-Owy>-8kNRbtx~U6tGEG50)bqw$`|X^ z>Wgj}|8K23)K5Ntn#B=jI^Y#bW{7q6i~9oXVaSPb6D#Z+#}D82Uuq&4fZgv f?~|({$N%|Iy5S%2RP(di@RWKleUP^yZDcY(nXu;OMDvFmR?X%(;W1*Auh5l>q5 z>ce<6NAU#|<7^Y_C5M0sOJ?_*ogvArR!iFJ+vhvr7%)8V+nYpjccm~6V4o#3jSuN@ z4Q%m|WEoJRjId<==FLEBRrSezgnGIrj|sddDON#*2#rAy)$E$ z%GI)2ob4N~N$33;}WH`L>Za?lH($BA&8eKsHO>J$ z!m%ges+Gc&(=W|?=rnAM)1-(G}h0nR@0LJ_83aj z_)#@3fdW4fh7Ji0<5*#?o{Mtpq;gbm=PQi}y4|kC7{}G?JdIX4UXCDNJ8afl_2YA6 zc6-jq=88F^$aU4Gk*S|GYNt#R;aDP^n2&|y(P$J~zz7hs9iX?Q zs&w_9T-cmR?%zKyDP2(Kyv$&(nm+{yf=oK^IJstWy_*Y@YusEnbuX8ubaNs)ax`S6 z)zJ|mr^mWykvXWT!72d~(9}5N#R6>2jJsOk}m(Y{f=VA}vb0sYndT>t<8 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..039944ea0428faa3c3e8a8b015f4f0fdf35458df GIT binary patch literal 269 zcmZ<@_FycSQuKp?fq{{M`Tzfa|HT-bLmZuCfC9=u3=#uTV9?0G01_`KjyH}sVDQaM zF3K;?Pb*Q-2+~yW@Co)&2+l}MNi9-v&d)8#%mFei^^7d_EKQB{j13J983Gv?SQ!}j z7XXd02b;&xU=5-{;*4PN25$z226rHK24Z`81_mZp2KEL92A&CQKsL~cK=%I$Ktq@z zYz82I)dUs>1|R~-f%psyKp3KiAH;89WO%Yb7_1+}f6@R}&jDgj0OFMkL1JKE0s!Zp BG`Ii& literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..d4679476973661648fc6e77f20a9fedb0419e2f5 GIT binary patch literal 221 zcmZ<@_F!Bh?ODaZaDjn=`Tzfa|HT-bLmZuC7#J9offytPqQIb$fdM35P#kX@Z@}Q2 znOu}#oS#;rpb@00;NcVOqY#{tn37tg;GCaZkeLHySn3&B>RFl^=@}au8ZrbjFt9Q( z@GoFsXz&JNcOZ5KVtbG{BUl_{OM^9t1Oa&l1}1Kx00RT#1fWJ{pk5&R$pWC%1Yw{Y al;6O@z`(-50g{{0z{n7?5U8dB>}mjGlPzZe literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..f4690fab5db463d6bd4be037f1f08a45cff8bea2 GIT binary patch literal 333 zcmX|-yGq1B6o$Vs?ykaugZD3cRo-Q|UpnkEKjb{g3 z&hN^6kw3nMd)NEnWSULG?CJLYp$yafrI(r|BdzedY6CJo33AV eV_o0c&}D}65BRn|55)WFa^+YRFl^=@}au8ZrbjFt9Q( z@GoFsXmAE%dx)V8*76JtOx!>L1_s6nKn2V|1Y|z}s$-ZS43vZN8(0_^SQt1!av-(u k76R2YK-4pW#3q0+LO)2&lLeUic|dAGazOnq4Pf5^02w1RbpQYW literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..72f0349edfd55adb34ed47e65ad5705427e3a366 GIT binary patch literal 201 zcmZ<@_F&AHv$J7f*u%iU{Qv*I|4IzbA&yQm3=9mxKnxON1X3VALn8x&50EkdVrC#_ zWME$BL=lq=fB8Js03_L(N5QKn&;&|hD0|wvBx=ltA)%p4%YQqRaz&(hRL&)Cq=kU^e-fr*uYp#f;y1P~i&+5`p;{sm4T T>pA#=;!lA5Cky`n2g(2d6OvY4WJBEsp(3RcB(=l_S#IJqBPDiZXK1@Y zll?5*9n0wsISck|=nnviAHdQJ76^60rV?WKzH{%`F78+ppYxr^{m#QTpYPvuzPta= zZYV2pr+fM^>h;eXPE{N!$DM=0$zWJ_u0ezKFgiMlN4K@OZudVsrS)ncmi8HVPc`1|KsQI4@5G;Cb)K z4wrzjzN~@=KLr;~N-jNc_wgz4vr*?}XH)J+2gAW=aCF}MXz%0Zz1{uY=KgW_us3Y( z3{KCY6A0TIH?}vnZ{66qxwW+=Utt8-rJ9K(KjVZKA}zeh3*t3{-v-{o`zc=auPffX z^Xo6GtxtaXV}>^rr&nTQTCGhTarGr%-*MZH^vtDU#SM?kiea!hTWYo-<3&zlg`O)W#tI$2@^kJ`?*6u;){MaMf znXe)3j6USS9E_n~p>yWMioS9lfz~cF48AG)kg@*4FOYUxUcx46xP;~Dip6+lfPRzL znw@W<2gpsHte+S;t;2^n7G>Nujk~%p2AOaux4VcmpqFe6n+9f<|mKR z!mOCLWcRNjQ_ag9@JTUCa?|<^*2YfeSsWwueTx;dc&pu zZkT3O^u!ehx+F$+A-ApUL!Ky4-T~N0aA{|ig%~577$eVPcrNY&jbm=y#L&$-_+JCr zoa2ZO*_^`|{$A?1i7cGf>N;+=^_O+?ql$Q1xrF=aT`}|`w6qpZ{<52 z&rQG^4s#xJGv_v$tNd_ssW4inMOJ33D%e+mLaZ<_=GUBJ_IN!#0PsVIx5Yy=zJZ#@ z4Iv)aa7V~I5d&EC_E3ny`F{XS!=E#gyq|Siy=O1^*CH#%j2jC(%;f8*sM0VUW3hZL z^D2M)bdMiS+`zK?rgsNiTe4T*E&g19d{7>a-GFE413_?utguectUkwceG?-tIE?Cbzj`v@uNo0Hmct AQ2+n{ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..05cf3a9372f9b934d9a023d3053129898f50754b GIT binary patch literal 365 zcmX|5O-sW-5PfS?j35RCZ=yNsB{nG@f}+@p^w2^zdhrs2A6T$#NGx9C$!mYYp3UFN z?{Iz7h_gIq=DnHOca@Bk-a9*0*jS`_R%G)s+EIYQRH0+-k3GWh_F}LL;END$jY)cZ z0u|FGAsp8*B_tk*4jgjZ$c141e}KB?acZKsu}I6;>`8x2vb;yRcCblJUK@Ft_R}6F zv&TZ0`sLj}xHoI&0I literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin b/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..a11a12d33634eb6e6ca06f2506555510bb07e765 GIT binary patch literal 941 zcmbtS%}T>y5S%2RP(di@RWKleUP^yZDcY(nXu;OMDvFmR?X%(;W1*Auh5l>q5 z>ce<6NAU#|<7^Y_C5M0sOJ?_*ogvArR!iFJ+vhvr7%)8V+nYpjccm~6V4o#3jSuN@ z4Q%m|WEoJRjId<==FLEBRrSezgnGIrj|sddDON#*2#rAy)$E$ z%GI)2ob4N~N$33;}WH`L>Za?lH($BA&8eKsHO>J$ z!m%ges+Gc&(=W|?=rnAM)1-(G}h0nR@0LJ_83aj z_)#@3fdW4fh7Ji0<5*#?o{Mtpq;gbm=PQi}y4|kC7{}G?JdIX4UXCDNJ8afl_2YA6 zc6-jq=88F^$aU4Gk*S|GYNt#R;aDP^n2&|y(P$J~zz7hs9iX?Q zs&w_9T-cmR?%zKyDP2(Kyv$&(nm+{yf=oK^IJstWy_*Y@YusEnbuX8ubaNs)ax`S6 z)zJ|mr^mWykvXWT!72d~(9}5N#R6>2jJsOk}m(Y{f=VA}vb0sYndT>t<8 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_smsimple_draw.bin b/examples/runtime/shaders/dx9/fs_smsimple_draw.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ac0f0d6d79244196885ad9fcdba5cc7354daad5 GIT binary patch literal 5654 zcmeHLO-mI~7=GvLI+-X0?t<>3MQv`WM3|VS5-t=h8;CY0eQ6l?;x*c|m`i_Pe!_uv z(?8HnKfs_}%ZO&tB3ebHi>Bu}@15&K31X<-j2`Ye&w0PjGiSb@o2!dX*m}C?$l&v} zt<5JJJ1fohs3YRY&r$L6{8!$P`8zk}&Wgw@G-57(IF^pcOZ+UL5rdnopz*km=7|sN zjBF9Wag;&cIGACtMhO{`s(<;@4%&35zgPW{5|i}l5& z)us9>d>(Dr=bO)3n_K8iHpV9#lUK$Y6Jujza!Vv|WW3fzR#{_kj<7c)iClV(b?7fwi~THT9XDqJ2%{z%K6L=RlJOKx80c zKM*HIecisqZWl+K#1BV|FM|I8*yM>PAB`j5lbWU4M~pP)Ja|MuDyEy~`Pd1JpX66*eILoNh`gP;DC*p_<(g*cuKI{$n zxxgZ{9R3`KtRHJi6J4ic=eQ0LiCGVGvCo=|8WoGI4RPf_Ir8NI@d}PuSHaN``U{8^ z^*B=ABH)?Lw;~6EOHrH{?vwi@*GIq&s!jwsdy{H+t-S>68p`U9~Ez< zcss0kE5Tc>y1&I`o(nap?r&vy3*=LEotC;zE8fcNH(w6%JypH;>Nf-5q5tl^7w;hz zZzZnNKt5OZw-UV7D&9)Hhv2)ux=u^%H)uxxoj27@7J9nLztldc5gpe)1Uk)0ZOI2l zEhX*KQU3f4P>oErCFmmNJj5wS2B^;@>_dlR4iiGBf=bDLg1L@rC@%FB+f>IH#ymBZ z1U5-bAJw`JPq|neb2j{6Xre>IPA=fFqCeaTOS4^G*`3;$M3+w;@ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/fs_smsimple_packdepth.bin b/examples/runtime/shaders/dx9/fs_smsimple_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..c65824916c4feb2357e69d295c6e9c1abe998b5f GIT binary patch literal 269 zcmZ<@_FycSQuKp?fq{{M`Tzfa|HT-bLmZuCfC9=u3=#uTV9?0G01_`KjyH}sVDQaM zF3K;?Pb*Q-2+~yW@Co)&2+l}MNi9-v&d)8#%mFei^^7d_EKQB{j13J983Gv?SQ!}j z7XXd02b;&xU=5-{;*4PN25$z226rHK24Z`81_mZp2BroE2A&CQKsL~cK=%I$Ktq@z zYz82I)dUs>1|R~-f%psyKp3KiAH;89WO%Yb7_1+}f6@R}&jDgj0OFMkL1JKE0s!TQ BG_wEz literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_color.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_color.bin new file mode 100644 index 0000000000000000000000000000000000000000..2402ba962d832aacf2234d98ba767fd9a460d3cb GIT binary patch literal 283 zcmWFw_F!ZH0!9Y@()ir`l+>KC%+&ILqWmmQpg0S|4+aM2fB*meS7vYyadeUastgAy z2a18Tf%puK3=9E4$^eL&fS3h{9e@}F(2QhY20|7f1X~G|FDs5WjyGWN%}g%JFV0UZ zQP2p|RPgW#_E8AVNK8pBQgF`CEy&CPGA#9sEcGl+jr5ES4GkIOAyzdoFz`=6Vn1L7 zx(q1Rz{v1q0Ruzm1fW}hh##m9#AlcQq#IyjOklB9U@@S(LHZtm=;S&VFr<;N~zlMzn90VW`_ z6K((*35Rgtb1?kXjUO$SruwVLU)8><*HqBEuX$J>#hv!wyW#2ZAyff8Y>eV=a?|Qu zwOju~1(Ilmob{9YP`G*GEuBk zD|P<{@j<+Y)An^g86>yE($2+hsdiF7Db??qH?4l@IO+D<9Xi$WezjcvwO>A{R4OnP-qRwG7179~H?_$coXzIg`z!-wUfWxk!#FTr zFqpcT-ee!6|L0V4WZt>1!q_m`N!~=_ lE^BR{h#CzYF6NJPU}jy;FYmQ(n4Mqx$UDp1Y>?+UfNwqTp|Ah| literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_csm.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..3abd90a13fcf2954473561458493215f7c0cbf6b GIT binary patch literal 1451 zcmZva&u$V?6vn>`Oko6_s#U8(WT}ZE{D}(^7itsJ1tcocl?fp&jhK=l&{~(bZ!izw zf<;#}zJZAwAHfG;!2`H(UHs0SVVF+242Mr2P)Pv4;ExVTXCR@7PfMoV3$Z**OWt*fzh4PVEdTBnR=e}CkT-NWPJ z(+|&zyNy<(*y6+XM#UX>Fzg@EsF$ksQvF4>RI5}fc+WQ~z?m@MSAhOy0_W!mOPVAA z98YW_%{~cj^4ZcyA#H36X`KkT1*MarozU#Wz$dA#&`#-%(6)4%Iu^Tw+SoE^}Jm%lG%<_bN;clboa` zzWzLj-{Bq6_?M(0jUNBT;1?#6WPMRc~-=-iL# fNKcB+gP6|4h|YFQNBZ(nOh@`z>hqXkNNN;4>J literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..00051eee0a217dea7a3bda464784d2d81b4add4e GIT binary patch literal 818 zcmYk3yG|QX5QhJ=7rYBt`vOR~Od1P=C|m)daRE|-W7?GkPB5~ymM?_z&{1xY2iPK& z-B70q9WO!QVxNP}Kj-*%;AkOUydI`6~M#JBL>IFC)sReG2G*(gV-QKF4zjfG8E4Osfr>e7?+4C>h(wmUb50hp%07pBrVa_K{}_ zt(3drFVddzkpekw%eD-g8b(2>n@hYzZgWbSep&{yGFq9uO>MFkd$T##&oe;!wQmb^ z7zd^+22+>oUB1J-G%$LBiA!C{%pCCTg1sA^x!4k0>e6PdooT7d|2dT$>36BCFf~kO wlATE0WvzWDqDD)HtNtS$m|oZY%f7Y^v;8l2!@6AWkc%&S7r%_ZSy2G^5AchnUH||9 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_csm.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..09360224230b73753988cedf88b828299198847f GIT binary patch literal 1515 zcmZ{j&rVZ86vn@4dugwr7Znw?ja_PD8rsGMiHRtQVF8JXurg^H{sau9O$*|3c!NHG zi!NA|_yWenjgR01bkPTJ;hOq=b8p*ADMP26^P4l@oO5QnxxQlFo__z9LHf9ISliw? z@bf?l(~-BizjNZ76iE;x?;5qwzR8gK$CY}uQ9W!HJ(Gn|RCBMoT{~H;*4K`{F8F39 z+#9Dw-^^a6CEv_lrDfmDlP-BkUi2^eyIB7C`b`$Vmf;s!hX3T_6!=8;lV*Z5#rd04 z;}2(oM6AoH@s~3J)i7c#fJ}7&Gy3AlI;JW{anBu74I}o_F;y^PtBxuE5sTW0B>$9A zo@*Mh_72y$-Hq6qTF=<1={P?(j5gF6#l~B`z}UE79P>+Kei>hym2zbPYx`S`TC=u$ zlz;l+S$<`8eKo(%i`{ADmurXh{R0|{h0?~*k3Mj;MEhh zG)VviE!pIj?__9`cLy;BX=i&#+eE}Y7@Hj03Coul#U!mav{QC!XnQtI9gnYr+SW&} zZLrbe9q<#_jPua~dejQp4aYi;F+uI?YJHkKj7eMitsKzKVWTZ==1R7~9Ksm+DcXSQ z3$?|j9P11j+`gX8QipLZzF(e~aqHTbc0I~ayH9O*PFJ?p2IuO`K}~~mdH=2Pa}7F< zsV4O#)bB<42RtL5e=s5c;8On5(Y;*O3Hv}6^=g{BXKlDXoKX|}=swk(4%hzCR?XVi zvq|!>t}vgQkq+O8opF2O{S54_NJlwHM{%+Pa`}2I@^kocN%wY4cXopAoojUOM!I@; wlXUOJbmu1M-oHloL8PlUJW2OqOm}`vSMT`In68-m`8d+m??Jx$(C-8I52)rgt^fc4 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_omni.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_color_lightning_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..945f5f716745b820aa24a05e2526e85e0f9536c1 GIT binary patch literal 1462 zcmZva%}x_h6vzK}rbA}{9aL0Q8oSg@(~r35N|eN~pb1)w%ckK&YG_JYDlRW?&}m%?w3GiNP|K1q}6M6`Xx`TLrGNssI}ictF=xjRt(f~ zlxx#cpjK|va-ddk(@LP$NPQ3P_2hc8hs}>~-mU}q#IA(-e2I^9V2A7%O$Raq@JBeG zzx+A;*=%f>%n--@Gfd{-WBvgvd^?aS;<&tFGDFOYhRFmm+b~S}k6FBFT)J?1mYJ1; zwPM?rb<>|N8kd)fdFn=(pV~kaw2#d~+^&S+gUb+7tF}>RgE}XS2GrnH$YCt1B}}jPyIJt8ihM%p^OJbC7Tgh4ka-xAVIOXY#KnQp=r}U;_~taeE=6- z)A$A^Zg~WkEankhQ@?Yk?OX?#bUNq$?m6E*=iIZux24{n|NN1~;-G%oJU;2~^uGrx ziwu?q^;Y}v=ybn%bQUO(gcjNDw!a1{LmCX~okq9O>XkgT1|?p-lg45DY^TwoSTRt` zajZ>Cfy&*a^ z^M|j)*JhDnQbXeR*D$GrkNE>~{5p^-62H7*QbWRuhDikp+b~S>Pgv4vj9s|g%gl~~ z)neP0c5^*#G{$4aIQ3tg-QFU7?R6=&E~nNNeCyRK^&)nf2igG4wtxoflMzv6`7OHQ`g-WSZ!Uw=xM>t}68-V`JuX$dwWi9~_4#g(aoQ=6n zel_z^@Qv-k*UprCP}-f_j^^}DeO&F$?TlWS+n)BR<8dOWO`m9_P#d!E{Dq8{HHJV$ zJ7x=pT^Pm$CGJZ0ee&4H*IW`R<)dX%O1gt?n@uEdtT*}1eC8`m^DS85U;$#-_H!i8Z{lk`OPUB<>b zAzSpsdW+Wcl$Olo3rmZ4KC%+&ILqWmmQpg0S|4+aM2fB*meS7vYyadeUastgAy z2a18Tf%puK3=9E4$^eL&fS3h{9e@}F(2QhY20|7f1X~G|FDs5WjyGWN%}g%JFV0UZ zQP2p|RPgW#_E8AVNK8pBQgF`CEy&CPGA#9sEcGl+jr5ES4GkIOAyzdoFz`=6Vn1L7 zx(q1Rz{v1q0Ruzm1fW}hh##m9#AlcQq#IyjOklB9U@@S(LHZtmqxaFPV18|OZUn$RA)3P=-#7zq z7&Zw_xWpbI>y*%t&cL|{T$hBV>!y|K8_CS4U$S}vQnx{PnM?2TpEob-=h5$y> zUo(K82=|y!8E0Db?ziq_Tp69~+VCq_3C&Y4nD;_ZlELoo;LaeKv_?aSGJY2r`Py_Ly)wvLmvo&u29@kYKh zTPJ(*4!S&ZB3xsDeBE*<<8lUiZ0`bIZC&~wxn}!IJ`Pc+Dm2yJXl>}h`lZ> Mm$@lCnO+aTCxt4Dw*UYD literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..bf0821debd1e53c957bc683f9f2b625c75fd5a88 GIT binary patch literal 319 zcmZ8cy^6wM5S*BZSmgzT3)pBAjB-UfPa6vbF`kw|&Kws}K8b&Ae1jA|fVEGR!iTUj z&gKxr-EY|0S$4nOiPzKCr|71^-1#dt50;ZKI1D4TC~JU$iU$3j-LopX#!X*aUZ`VW^G>Ioy*57XD|$gPB5R& zqQvQ&V@yw6rR26H$G??((znRVjOYPdnU^}}zc{AJ?bD*5+Ap%y7k@sYbX>xyQ8SrA9e=)S>6I1_!-igMDKaaAw5>G zH|Zw5K<)A7_5{F;Axv?SHRiyW(;Y*Y!)P&NJTVkWmSv8C%}1&rwV zeokq}CII|caw2W*a+kTvaQ3YB{T4ivZ+q-r?rNKyjFP@~u}&o^A_IkXee=GkOz`rP*vxLzcHcwZQ8@uye^mKyk_7t!|2 go`WZ&O^;bm9`7u^51!;s;>k7~ia&s8$7u@SA5?X6hX4Qo literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..ab2fc818dd15bfeb8077236a4718295ef10289da GIT binary patch literal 319 zcmWFw_F&AHv$J7j;4h8O%}+_q3Cm0^4=Bpd;$&oCU}2D9WMKaH|KERQ2Imk*Cm99? zhHxMTi2JkA9QvU!c=GR*LQynf@zdygLrtD#9#Ku*{2l+ zcvzc8leF7UPlw6q<9>hKPba?ep|CoQ&ZsGAP5IYCkZ`J|)W(a4P z|M^m?svq{v6 zHt{w&8fTO2_;cgc`;Er#UU#q2J?RhPabqV-Pm>`**ldT*@O8V{X|-B-2lz_}X54a% zAHy<$m*vqc5afb=E~pA~S@`)QZz`;;u6b>F85M7=S7Xom#Ps7h1A5-ffL_iS@(buI z|HzqHQ*zpIKOM(;OWj=74SCL#l%}>f6TOD!T911aKUC$bvHZYM-^Nn>X`v5*@!fYOL#~TpvxT9H+-awBg--2e*(o7pBy|;N= zb@;MjGnN5GnJ*;^DPJVwdETvdkI@=F%>23kxbP0IkGw{+-Span`(A(M)&0qIIHpr8 zRcfW$Nu^XRm&>>UvPHNd2b=-=+uwUXm0<^z%XewO4a6tXD&>=}H#rJ9<7c6?^~bZ! zx5;_3jjOYWLWNGixAN!ejJeCYBKis2F>GZR2TI*q;yLmpC#QK2ia=OICzRftP1d2d zBqzB?As~8_-oh-#fz>~Qsf%%?^9V)Nbai#h2J-E`8P}Z`#b| ze-%iM=-td!SQ#d7lATE0W^K~P<&2Kb|Lb?PW3+Dd%f5CEOY}=0*|Y4XKpw{cegR_=Fc zJrfbcnR}QsXPCJ&Q-7fCzvG(*>lEzNGTct1@G_3ormO)bDjJM?e$Q*@e|38m05d`~ zmLWN=z?h*y=!8jh2(h=3Fz6;-dd1F%pcOPQiWadtsMXP~e}345p+B_!^?Vt|c3nx5men@-DhT~r@mC4iN_@Jx6Kdcte661QZX{O<>tq}+?oVvpoV8Iz}`7us*3 Y@rI&L>IQZ0O3BJ37cR4f=Q*eR0}kdxs{jB1 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_black.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_black.bin new file mode 100644 index 0000000000000000000000000000000000000000..6432488d8d0a9e6a88351b2604b97cb5cbab58ab GIT binary patch literal 123 zcmZ<@_F!ZH0_DuKl+-i@cb|CIV6K9q)a1pSc({2~Qgg|gIS6Ac4B104kvLerY7 ImWzu40E<{5E&u=k literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm.bin new file mode 100644 index 0000000000000000000000000000000000000000..9267b9ff465e14f158fff11f0a00fa51fe29bf59 GIT binary patch literal 3544 zcma)8+iu%N5N+QIeZ>|50y2?hlA>-fTp*~Erf7o(aNh}9TG=cpk|inY66D`|W_Fj{ zm1LtfAdsBdGiUDm>HhPNKUM#Hev_?NaxH%QGx>NwsA{>)nyf6uQ}*~&iFID4?akng zELPcCTwiOo!M4cOWxWwix~XzmM|WbIG*9WO+-)}ikJ1|a+|01*K+rg%3ZczZyWiF#)r*ACX4nJjjv^s5tB2r zn-nf&Y5qs!h{o`^6RlnrrH+W=v@G-TJSJ6Ir<*1^(^lWZo56EhAF|?6AlhT`oIGc8 z=X{LuQDtXYmNgii94L^=G{@&MTZv7Y6~gle-v)vJBayUn&*u`D685XO6`q4U+8@NV zYizXh>C^*5wVMj26SyLTc?QU1Eh&3Ifi zv=?vR8gVo__`diCof85vo$DyXppeU^dC7iA_VJ_acgM!$zP1}Xc4OEj3*Uvz8>tCs zO*-`e7ra2JkRErLAw8ilT6sbySZWN7een*l81rGyw^p56$EIL&+hI6@0|ZwFY{Do8 zV01i}DQ3w^R_)W5ZQf>8p2<3y5$5?^p$gh-rZn}3 zIgEl6sa+}@5-)SiTj9xl<#`vv|4w+TvPDtKeY>qCrZUpekL95$iG|N0h`q^ZF%9CW zyb6LjmG~r@%;)qr;f4#wi(neznTuasq0iim9PzDB@!r4C{Jsxk90~$q=jg{S-H_*s z2}=k+uRJx9vZI7WnrEu_oKrkSoPr8@9vGnL1W2zTGtDupjtbQrpw`q0;F$u};^$j9 z$m^>+2QIp$9Xjqz32CSx`tDJfM8vd56o!*PaPN2BA5#1GfiN^9?%SRMjB>gH!SL2dU5 z(%C-0y{J<2k$OXNO0D8?7B;kQUp~4UcG8Qk?|=$wLCCzVlsVSy9^`f&s-^RKn0Dfq zTd@Epg3`CHTLnDCjaxLMI7H8h3QM2;hymvsu7uWZ};D`SJ#%Ww_ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin new file mode 100644 index 000000000..bde58d44b --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_csm.bin @@ -0,0 +1,251 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); + } else { + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); + } else { + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + float _depthMultiplier_21; + _depthMultiplier_21 = (u_params1.w * u_params1.z); + float tmpvar_22; + vec2 tmpvar_23; + tmpvar_23 = (v_texcoord1.xy / v_texcoord1.w); + bool tmpvar_24; + if (any(greaterThan (tmpvar_23, vec2(1.0, 1.0)))) { + tmpvar_24 = bool(1); + } else { + tmpvar_24 = any(lessThan (tmpvar_23, vec2(0.0, 0.0))); + }; + if (tmpvar_24) { + tmpvar_22 = 1.0; + } else { + tmpvar_22 = clamp (exp((_depthMultiplier_21 * (dot (texture2D (u_shadowMap0, tmpvar_23), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) - ((v_texcoord1.z - u_params1.x) / v_texcoord1.w)))), 0.0, 1.0); + }; + visibility_1 = tmpvar_22; + } else { + if (tmpvar_10) { + vec2 _texcoord_25; + _texcoord_25 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_26; + tmpvar_26 = greaterThan (_texcoord_25, vec2(0.0, 0.0)); + bool tmpvar_27; + if ((tmpvar_26.x && tmpvar_26.y)) { + bvec2 tmpvar_28; + tmpvar_28 = lessThan (_texcoord_25, vec2(1.0, 1.0)); + tmpvar_27 = (tmpvar_28.x && tmpvar_28.y); + } else { + tmpvar_27 = bool(0); + }; + float tmpvar_29; + tmpvar_29 = (float(tmpvar_27) * 0.4); + vec3 tmpvar_30; + tmpvar_30.x = tmpvar_29; + tmpvar_30.y = tmpvar_29; + tmpvar_30.z = -(tmpvar_29); + colorCoverage_2 = tmpvar_30; + float _depthMultiplier_31; + _depthMultiplier_31 = (u_params1.w * u_params1.z); + float tmpvar_32; + vec2 tmpvar_33; + tmpvar_33 = (v_texcoord2.xy / v_texcoord2.w); + bool tmpvar_34; + if (any(greaterThan (tmpvar_33, vec2(1.0, 1.0)))) { + tmpvar_34 = bool(1); + } else { + tmpvar_34 = any(lessThan (tmpvar_33, vec2(0.0, 0.0))); + }; + if (tmpvar_34) { + tmpvar_32 = 1.0; + } else { + tmpvar_32 = clamp (exp((_depthMultiplier_31 * (dot (texture2D (u_shadowMap1, tmpvar_33), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) - ((v_texcoord2.z - u_params1.x) / v_texcoord2.w)))), 0.0, 1.0); + }; + visibility_1 = tmpvar_32; + } else { + if (tmpvar_13) { + vec2 _texcoord_35; + _texcoord_35 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_36; + tmpvar_36 = greaterThan (_texcoord_35, vec2(0.0, 0.0)); + bool tmpvar_37; + if ((tmpvar_36.x && tmpvar_36.y)) { + bvec2 tmpvar_38; + tmpvar_38 = lessThan (_texcoord_35, vec2(1.0, 1.0)); + tmpvar_37 = (tmpvar_38.x && tmpvar_38.y); + } else { + tmpvar_37 = bool(0); + }; + float tmpvar_39; + tmpvar_39 = (float(tmpvar_37) * 0.4); + vec3 tmpvar_40; + tmpvar_40.x = -(tmpvar_39); + tmpvar_40.y = -(tmpvar_39); + tmpvar_40.z = tmpvar_39; + colorCoverage_2 = tmpvar_40; + float _depthMultiplier_41; + _depthMultiplier_41 = (u_params1.w * u_params1.z); + float tmpvar_42; + vec2 tmpvar_43; + tmpvar_43 = (v_texcoord3.xy / v_texcoord3.w); + bool tmpvar_44; + if (any(greaterThan (tmpvar_43, vec2(1.0, 1.0)))) { + tmpvar_44 = bool(1); + } else { + tmpvar_44 = any(lessThan (tmpvar_43, vec2(0.0, 0.0))); + }; + if (tmpvar_44) { + tmpvar_42 = 1.0; + } else { + tmpvar_42 = clamp (exp((_depthMultiplier_41 * (dot (texture2D (u_shadowMap2, tmpvar_43), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) - ((v_texcoord3.z - u_params1.x) / v_texcoord3.w)))), 0.0, 1.0); + }; + visibility_1 = tmpvar_42; + } else { + vec2 _texcoord_45; + _texcoord_45 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_46; + tmpvar_46 = greaterThan (_texcoord_45, vec2(0.0, 0.0)); + bool tmpvar_47; + if ((tmpvar_46.x && tmpvar_46.y)) { + bvec2 tmpvar_48; + tmpvar_48 = lessThan (_texcoord_45, vec2(1.0, 1.0)); + tmpvar_47 = (tmpvar_48.x && tmpvar_48.y); + } else { + tmpvar_47 = bool(0); + }; + float tmpvar_49; + tmpvar_49 = (float(tmpvar_47) * 0.4); + vec3 tmpvar_50; + tmpvar_50.x = tmpvar_49; + tmpvar_50.y = -(tmpvar_49); + tmpvar_50.z = -(tmpvar_49); + colorCoverage_2 = tmpvar_50; + float _depthMultiplier_51; + _depthMultiplier_51 = (u_params1.w * u_params1.z); + float tmpvar_52; + vec2 tmpvar_53; + tmpvar_53 = (v_texcoord4.xy / v_texcoord4.w); + bool tmpvar_54; + if (any(greaterThan (tmpvar_53, vec2(1.0, 1.0)))) { + tmpvar_54 = bool(1); + } else { + tmpvar_54 = any(lessThan (tmpvar_53, vec2(0.0, 0.0))); + }; + if (tmpvar_54) { + tmpvar_52 = 1.0; + } else { + tmpvar_52 = clamp (exp((_depthMultiplier_51 * (dot (texture2D (u_shadowMap3, tmpvar_53), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) - ((v_texcoord4.z - u_params1.x) / v_texcoord4.w)))), 0.0, 1.0); + }; + visibility_1 = tmpvar_52; + }; + }; + }; + vec3 tmpvar_55; + tmpvar_55 = -(normalize(v_view)); + vec3 tmpvar_56; + float tmpvar_57; + tmpvar_56 = -(normalize(u_lightPosition.xyz)); + tmpvar_57 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_58; + tmpvar_58 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_59; + tmpvar_59 = normalize(tmpvar_58); + tmpvar_56 = tmpvar_59; + float tmpvar_60; + tmpvar_60 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_61; + tmpvar_61 = sqrt(dot (tmpvar_58, tmpvar_58)); + tmpvar_57 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_61)) + ((u_lightAttenuationSpotOuter.z * tmpvar_61) * tmpvar_61)))) * mix (clamp (((max (0.0, dot (-(tmpvar_59), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_60) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_60)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_62; + tmpvar_62 = dot (v_normal, tmpvar_56); + vec2 tmpvar_63; + tmpvar_63.x = tmpvar_62; + tmpvar_63.y = (((float((tmpvar_62 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_62) * v_normal) - tmpvar_56), tmpvar_55)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_64; + tmpvar_64 = (max (tmpvar_63, 0.0) * tmpvar_57); + float tmpvar_65; + tmpvar_65 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_64.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_64.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_65) * tmpvar_65)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..a0c619875db2ef1fd81facff6f164712fa99090e GIT binary patch literal 3588 zcma)9Yir|16m7p1|B5LKi=1^FNtR!P6qaVUTiT@y>35;n<3vT4R7rj=`R_gV&Wto; zJD~{}OZVP$-)F|3AHMwfQ~A%Acj;;=SK_xn<4+I0vXYCmPK#VTr%%tNSY<`h-1gqd ze3`Dq&5c&;ZSr(gRBKTu>oSv7crP|_{hTa|-Pfe_Z(I3RE+U9BfHfbRM&_HO0s2E( zG=FUxSzXp7@qLO=NcZ3{_*T>@MRFGG zIzb9)lKoLTq7gD~Ma$Pki6f#qEsCr-uSuCy$+`~DwAK6Iwzo~HLz+JcRC^@0@ivt^ z=VgSKsymCKs1VVKL5@}?8D1CZQmm6S7hb>jy(b7T6mcW>Y!}0ouph;p@Eqjf{vd8# zXTx2etR5MvS(k7fBNZXccYr)qk}CQ4a{|wny8#E_`9pso@X=RDMUfff5dmQ^JL1+bO$sr|3wiswnYNmd*3mP1dAkmdYxgk?i~} zIo`y2BM{sbw#hslIZda?b3&munB)S^ghnaJ51uoSZJ_&u9>{JW+VRp#fsa7Ay@6`) zg$ZCC^3u)Rxr=V*6%NHq(Y1ceTL-$WGy_oFFo%<0k4F&EE;%_`({%~ zP&x|Qar(eiYKkTAb0H#cJe*JbXd9`k@X$W$RfTGyVUukDu zJ}OjWKx?eWpZN#<5b-wDU%pMVGm#db~M66MhuQ5jAO!93A2ML<;1 z6~crW@$__Bl&6tt0JkbkBc1*P`ir9WOmvsdaNaiLA55e1Xk1zIqwhRmUh%w6_rlZ5 z<$3D_PrSXnO)b|3W6XBfAl>crn~oZ_K3Z>rob+*~dfbII9nG(s?gp*&V(L4fA~ZkX zxUH5s-s~OZO&lmLe!EON@ynf<1CzG6U0rtyn7d6{Gt2;&XdA1tblndb02>pwMPR}< zrgQsz3mnw>kk24bpPDUS&L}*N4jn6toj7e2#wx@Pce630-kR9#euOBHi3F7#VCmc2 zUXAMx*)i6KbIFaEp+cI}+U!F67!BzNQPCMMb9Mc(f>Y7&wSVA zY3CKRaP2$0i|a^EahHUvOBVXWy;|*VU98^= 90.0)))); + }; + float tmpvar_62; + tmpvar_62 = dot (v_normal, tmpvar_56); + vec2 tmpvar_63; + tmpvar_63.x = tmpvar_62; + tmpvar_63.y = (((float((tmpvar_62 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_62) * v_normal) - tmpvar_56), tmpvar_55)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_64; + tmpvar_64 = (max (tmpvar_63, 0.0) * tmpvar_57); + float tmpvar_65; + tmpvar_65 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_64.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_64.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_65) * tmpvar_65)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..8bed16a7696843f8692f716d0217225656296120 GIT binary patch literal 6685 zcma)A+iu%N5N%)e6{+AbIXiRaEO+1D|M>OWzyJN`S-xCkOY!cP*$?-f%{H6oyS!YB$Nb@O zBbG&(R}R{jbWtAOr<=hmGyas#V+>VU zwM~D8L0bHtEv^lJSM0NE<9}vFQ68?%c(={6wKpLFf&$B_URPDN-lrATcfTpC-}Y6u zZJtTPZ*nAq=Ki!^x6jMw`y$WewSUD@p|ah8j69 z6Y&HR9Oq@ZT_mj|aq9>|w|Mh|Q=E-SmSYlQV9f-Cr!rrNRhq9w(CvKc2tu6*Nnb`d zgH!c(na;EOtdK;Q0S3R11?TDe@+sS<57`XBg{V#KAH|(ml$8iP{xdy$4$S`XbnZ6U zpBn9D1ALK#bE5<5urD${G@7G-o2^MHM77!==`)mAn7`p>l^#XFzb=y0yU5$A+miB#?`0nzP>PrxMnG6S0BB^RB`8wo?!*^rhZ+!rtk94pjM+`4Z1 z2gW4CNAN1r2u9M6O3(;S9<~{E?;npTi0A}FdSMp~`h%XpFS$Z^E6YMV8%t-rZ0!+z zd;VNc81+wP#Wf%kX=~~;0hA)!?b>jJgaf}c4r4f`M5yQ!FZu-0Wt7h%D|VSmy=O_w z2?lzaoXxw9UcywqQvs$FjK_7zaaX)Req!Z(=j%p>>WjkcUB6FW?;rUTVY zsf#X5Ywd5%WoU2NjpRf`6Ebm1<*5+dTB5P`(5jeKmM@{=t;^9cgsDT)s7}(zkhI2* z(1g+1iQuY*s$tl|RiCXP%OgQ|2^#{G!&p4Jl&!;JMIjfqstJHK5!ax)WUe)iDM5OP ziH{^P^cBLZq#K$$L2T?H#rC)y#y*+VCZq8w?XVt3OlUoP5dhtf z5LbphPKQI)52C)SIZhOWS~?o34d*7fOYLjgYZ!7#Z>4pVdx!KaKDIgHI>BRy;B_t; z1+)nz5o{y*xRvBJnk&U3q#n_IaSTZv^=?FSYw#i^UUEnkF&Y41BiS{&CbHZ0v3wd| z9^IpXL-z*4`%Y? z4gZJQmogNQQdmkhgn@Qog5~wtS)PV6>3i}XxpUg7ZP2J)jQ`_bU~OWG#Tut0P5X34 zKzS&~_9gg=4bJY(Lr&oMVX)n2b4X3Zf5PuHiwYaI*rcv7un$!SDg&5G&EiAg0D%F_&Y z4u!D|&=A8O1-RT?6~bqn=c@trz@JGxHz&AO@d*6IvOOS>}D{S(5Yb<4JQ+N8uD3Y5KjlA2!8_{(sfg3 z$r-O~wT@lau;ZHO;>8%bXb2lPKI%;&yBuY z|8y7A_sQ%>@?iSa)t$Zh z-UIlG=T(l|4%J?Py!PM@=5{jL9go3nTOd{K%Zo=zHEI?Oa?-_xL%>y7(Ir;9>7i#v z8<&27S3nztjN2)h7tQTK?nK90`5ma*Fg#ovnVt z4#0MEoszI@tBfR}yKnklL*6mL5d~SB3&65vNM(7niJ5488n zn|J4m8yNv`Cr7D#=5G^bJGY?Y*S$jb{dyyHzY8Zp2~G{NwKdrLjdOMHd-aFvZg&!+ zC5F7Ypd~p=FvBsL3!G3{OosH2vRMC1Do_0b&3?Ubl%C$UrSf6(j*zFYKOT)^-exT& Z624Q=i~%pby_6~ERor~aeeQI=`VX%3@_zsT literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_esm_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..fdc1cd30d7849708793dc565c0d2049dcb783836 GIT binary patch literal 6639 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 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin new file mode 100644 index 000000000..9bd06bc44 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_csm.bin @@ -0,0 +1,243 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); + } else { + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); + } else { + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + float tmpvar_21; + vec2 tmpvar_22; + tmpvar_22 = (v_texcoord1.xy / v_texcoord1.w); + bool tmpvar_23; + if (any(greaterThan (tmpvar_22, vec2(1.0, 1.0)))) { + tmpvar_23 = bool(1); + } else { + tmpvar_23 = any(lessThan (tmpvar_22, vec2(0.0, 0.0))); + }; + if (tmpvar_23) { + tmpvar_21 = 1.0; + } else { + tmpvar_21 = float((dot (texture2D (u_shadowMap0, tmpvar_22), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((v_texcoord1.z - u_params1.x) / v_texcoord1.w))); + }; + visibility_1 = tmpvar_21; + } else { + if (tmpvar_10) { + vec2 _texcoord_24; + _texcoord_24 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_25; + tmpvar_25 = greaterThan (_texcoord_24, vec2(0.0, 0.0)); + bool tmpvar_26; + if ((tmpvar_25.x && tmpvar_25.y)) { + bvec2 tmpvar_27; + tmpvar_27 = lessThan (_texcoord_24, vec2(1.0, 1.0)); + tmpvar_26 = (tmpvar_27.x && tmpvar_27.y); + } else { + tmpvar_26 = bool(0); + }; + float tmpvar_28; + tmpvar_28 = (float(tmpvar_26) * 0.4); + vec3 tmpvar_29; + tmpvar_29.x = tmpvar_28; + tmpvar_29.y = tmpvar_28; + tmpvar_29.z = -(tmpvar_28); + colorCoverage_2 = tmpvar_29; + float tmpvar_30; + vec2 tmpvar_31; + tmpvar_31 = (v_texcoord2.xy / v_texcoord2.w); + bool tmpvar_32; + if (any(greaterThan (tmpvar_31, vec2(1.0, 1.0)))) { + tmpvar_32 = bool(1); + } else { + tmpvar_32 = any(lessThan (tmpvar_31, vec2(0.0, 0.0))); + }; + if (tmpvar_32) { + tmpvar_30 = 1.0; + } else { + tmpvar_30 = float((dot (texture2D (u_shadowMap1, tmpvar_31), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((v_texcoord2.z - u_params1.x) / v_texcoord2.w))); + }; + visibility_1 = tmpvar_30; + } else { + if (tmpvar_13) { + vec2 _texcoord_33; + _texcoord_33 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_34; + tmpvar_34 = greaterThan (_texcoord_33, vec2(0.0, 0.0)); + bool tmpvar_35; + if ((tmpvar_34.x && tmpvar_34.y)) { + bvec2 tmpvar_36; + tmpvar_36 = lessThan (_texcoord_33, vec2(1.0, 1.0)); + tmpvar_35 = (tmpvar_36.x && tmpvar_36.y); + } else { + tmpvar_35 = bool(0); + }; + float tmpvar_37; + tmpvar_37 = (float(tmpvar_35) * 0.4); + vec3 tmpvar_38; + tmpvar_38.x = -(tmpvar_37); + tmpvar_38.y = -(tmpvar_37); + tmpvar_38.z = tmpvar_37; + colorCoverage_2 = tmpvar_38; + float tmpvar_39; + vec2 tmpvar_40; + tmpvar_40 = (v_texcoord3.xy / v_texcoord3.w); + bool tmpvar_41; + if (any(greaterThan (tmpvar_40, vec2(1.0, 1.0)))) { + tmpvar_41 = bool(1); + } else { + tmpvar_41 = any(lessThan (tmpvar_40, vec2(0.0, 0.0))); + }; + if (tmpvar_41) { + tmpvar_39 = 1.0; + } else { + tmpvar_39 = float((dot (texture2D (u_shadowMap2, tmpvar_40), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((v_texcoord3.z - u_params1.x) / v_texcoord3.w))); + }; + visibility_1 = tmpvar_39; + } else { + vec2 _texcoord_42; + _texcoord_42 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_43; + tmpvar_43 = greaterThan (_texcoord_42, vec2(0.0, 0.0)); + bool tmpvar_44; + if ((tmpvar_43.x && tmpvar_43.y)) { + bvec2 tmpvar_45; + tmpvar_45 = lessThan (_texcoord_42, vec2(1.0, 1.0)); + tmpvar_44 = (tmpvar_45.x && tmpvar_45.y); + } else { + tmpvar_44 = bool(0); + }; + float tmpvar_46; + tmpvar_46 = (float(tmpvar_44) * 0.4); + vec3 tmpvar_47; + tmpvar_47.x = tmpvar_46; + tmpvar_47.y = -(tmpvar_46); + tmpvar_47.z = -(tmpvar_46); + colorCoverage_2 = tmpvar_47; + float tmpvar_48; + vec2 tmpvar_49; + tmpvar_49 = (v_texcoord4.xy / v_texcoord4.w); + bool tmpvar_50; + if (any(greaterThan (tmpvar_49, vec2(1.0, 1.0)))) { + tmpvar_50 = bool(1); + } else { + tmpvar_50 = any(lessThan (tmpvar_49, vec2(0.0, 0.0))); + }; + if (tmpvar_50) { + tmpvar_48 = 1.0; + } else { + tmpvar_48 = float((dot (texture2D (u_shadowMap3, tmpvar_49), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((v_texcoord4.z - u_params1.x) / v_texcoord4.w))); + }; + visibility_1 = tmpvar_48; + }; + }; + }; + vec3 tmpvar_51; + tmpvar_51 = -(normalize(v_view)); + vec3 tmpvar_52; + float tmpvar_53; + tmpvar_52 = -(normalize(u_lightPosition.xyz)); + tmpvar_53 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_54; + tmpvar_54 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_55; + tmpvar_55 = normalize(tmpvar_54); + tmpvar_52 = tmpvar_55; + float tmpvar_56; + tmpvar_56 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_57; + tmpvar_57 = sqrt(dot (tmpvar_54, tmpvar_54)); + tmpvar_53 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_57)) + ((u_lightAttenuationSpotOuter.z * tmpvar_57) * tmpvar_57)))) * mix (clamp (((max (0.0, dot (-(tmpvar_55), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_56) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_56)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_58; + tmpvar_58 = dot (v_normal, tmpvar_52); + vec2 tmpvar_59; + tmpvar_59.x = tmpvar_58; + tmpvar_59.y = (((float((tmpvar_58 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_58) * v_normal) - tmpvar_52), tmpvar_51)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_60; + tmpvar_60 = (max (tmpvar_59, 0.0) * tmpvar_53); + float tmpvar_61; + tmpvar_61 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_60.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_60.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_61) * tmpvar_61)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb4e48733c43d595e4436864aa361a166ec343c3 GIT binary patch literal 3466 zcma)8Yj4{&6y3fJ{uLYw6msh*dijMQ1Bzu`hizDa?7N}ZbfQ6)G)ayhMgIHFy(A^l zj)S#8VDVm_dw3s*{CxlA`yZ-*zP!uUE4dcG{;~Mweo)nNnKfBih^OrFsS@kFOxv5m zJ6Wu2Nnsig;vX1V=cF{bgt8({eS_L`Axrb$8^;vm#GPq%*_1ja%G0vU%k!L6X`ODG=*(NKhc|=gv_53Tqd>M}@w|A> zlg%BRJ_bNZ*l z-5+%S^!4kyK|9UCmx~cztQWaZjJ`q61N05r*Oa)KD5eMX_pDFdYaK#nRda7uwm^~l zc3VqmtY?et$fRP5sT=Z96L0L#CqXiiS3xkNo*hTy*^Iu%JV8M`4<-?Qb2p2h&Z>13 zSCAnsEdG9|TKb#}3SICTweDG0+8AboKd{lz(t z3RNdEjQUKn3ZM|;$6IsZbo;5vAcI5w4PiBqe_cocm_(nusl{;}-D3mV34EMb;rP>;9c0EF5#W2BXNA{bm!J~ur zG1kX(%e9yxLt51O)A5~RFiH0nJF@~oCF&Nrh%ub(Mz%6Wq>TN9DHVZITl)BzFFx1l zwDi|4biP?^j0nVD!&^*&-t#ZoNxW_02C%?sgtQ z3)g-*ySR?!6nAAOXpSpH;dbL= (v_texcoord1.z - u_params1.x))); + }; + visibility_1 = tmpvar_22; + } else { + if (tmpvar_10) { + vec2 _texcoord_24; + _texcoord_24 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_25; + tmpvar_25 = greaterThan (_texcoord_24, vec2(0.0, 0.0)); + bool tmpvar_26; + if ((tmpvar_25.x && tmpvar_25.y)) { + bvec2 tmpvar_27; + tmpvar_27 = lessThan (_texcoord_24, vec2(1.0, 1.0)); + tmpvar_26 = (tmpvar_27.x && tmpvar_27.y); + } else { + tmpvar_26 = bool(0); + }; + float tmpvar_28; + tmpvar_28 = (float(tmpvar_26) * 0.4); + vec3 tmpvar_29; + tmpvar_29.x = tmpvar_28; + tmpvar_29.y = tmpvar_28; + tmpvar_29.z = -(tmpvar_28); + colorCoverage_2 = tmpvar_29; + vec4 tmpvar_30; + tmpvar_30.w = 1.0; + tmpvar_30.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_30.z = v_texcoord2.z; + float tmpvar_31; + bool tmpvar_32; + if (any(greaterThan (tmpvar_30.xy, vec2(1.0, 1.0)))) { + tmpvar_32 = bool(1); + } else { + tmpvar_32 = any(lessThan (tmpvar_30.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_32) { + tmpvar_31 = 1.0; + } else { + tmpvar_31 = float((dot (texture2D (u_shadowMap1, tmpvar_30.xy), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= (v_texcoord2.z - u_params1.x))); + }; + visibility_1 = tmpvar_31; + } else { + if (tmpvar_13) { + vec2 _texcoord_33; + _texcoord_33 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_34; + tmpvar_34 = greaterThan (_texcoord_33, vec2(0.0, 0.0)); + bool tmpvar_35; + if ((tmpvar_34.x && tmpvar_34.y)) { + bvec2 tmpvar_36; + tmpvar_36 = lessThan (_texcoord_33, vec2(1.0, 1.0)); + tmpvar_35 = (tmpvar_36.x && tmpvar_36.y); + } else { + tmpvar_35 = bool(0); + }; + float tmpvar_37; + tmpvar_37 = (float(tmpvar_35) * 0.4); + vec3 tmpvar_38; + tmpvar_38.x = -(tmpvar_37); + tmpvar_38.y = -(tmpvar_37); + tmpvar_38.z = tmpvar_37; + colorCoverage_2 = tmpvar_38; + vec4 tmpvar_39; + tmpvar_39.w = 1.0; + tmpvar_39.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_39.z = v_texcoord3.z; + float tmpvar_40; + bool tmpvar_41; + if (any(greaterThan (tmpvar_39.xy, vec2(1.0, 1.0)))) { + tmpvar_41 = bool(1); + } else { + tmpvar_41 = any(lessThan (tmpvar_39.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_41) { + tmpvar_40 = 1.0; + } else { + tmpvar_40 = float((dot (texture2D (u_shadowMap2, tmpvar_39.xy), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= (v_texcoord3.z - u_params1.x))); + }; + visibility_1 = tmpvar_40; + } else { + vec2 _texcoord_42; + _texcoord_42 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_43; + tmpvar_43 = greaterThan (_texcoord_42, vec2(0.0, 0.0)); + bool tmpvar_44; + if ((tmpvar_43.x && tmpvar_43.y)) { + bvec2 tmpvar_45; + tmpvar_45 = lessThan (_texcoord_42, vec2(1.0, 1.0)); + tmpvar_44 = (tmpvar_45.x && tmpvar_45.y); + } else { + tmpvar_44 = bool(0); + }; + float tmpvar_46; + tmpvar_46 = (float(tmpvar_44) * 0.4); + vec3 tmpvar_47; + tmpvar_47.x = tmpvar_46; + tmpvar_47.y = -(tmpvar_46); + tmpvar_47.z = -(tmpvar_46); + colorCoverage_2 = tmpvar_47; + vec4 tmpvar_48; + tmpvar_48.w = 1.0; + tmpvar_48.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_48.z = v_texcoord4.z; + float tmpvar_49; + bool tmpvar_50; + if (any(greaterThan (tmpvar_48.xy, vec2(1.0, 1.0)))) { + tmpvar_50 = bool(1); + } else { + tmpvar_50 = any(lessThan (tmpvar_48.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_50) { + tmpvar_49 = 1.0; + } else { + tmpvar_49 = float((dot (texture2D (u_shadowMap3, tmpvar_48.xy), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= (v_texcoord4.z - u_params1.x))); + }; + visibility_1 = tmpvar_49; + }; + }; + }; + vec3 tmpvar_51; + tmpvar_51 = -(normalize(v_view)); + vec3 tmpvar_52; + float tmpvar_53; + tmpvar_52 = -(normalize(u_lightPosition.xyz)); + tmpvar_53 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_54; + tmpvar_54 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_55; + tmpvar_55 = normalize(tmpvar_54); + tmpvar_52 = tmpvar_55; + float tmpvar_56; + tmpvar_56 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_57; + tmpvar_57 = sqrt(dot (tmpvar_54, tmpvar_54)); + tmpvar_53 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_57)) + ((u_lightAttenuationSpotOuter.z * tmpvar_57) * tmpvar_57)))) * mix (clamp (((max (0.0, dot (-(tmpvar_55), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_56) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_56)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_58; + tmpvar_58 = dot (v_normal, tmpvar_52); + vec2 tmpvar_59; + tmpvar_59.x = tmpvar_58; + tmpvar_59.y = (((float((tmpvar_58 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_58) * v_normal) - tmpvar_52), tmpvar_51)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_60; + tmpvar_60 = (max (tmpvar_59, 0.0) * tmpvar_53); + float tmpvar_61; + tmpvar_61 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_60.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_60.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_61) * tmpvar_61)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_hard_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..8e9871ddec04d1dbcaa0193a5168044867a6f438 GIT binary patch literal 6564 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 Y2QSIn^)b^WSn(s)n?GP*dcCjy1O0HlKL7v# literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin new file mode 100644 index 000000000..59fac09c4 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf.bin @@ -0,0 +1,401 @@ +FSHpjH#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap0; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_shadowcoord; +varying vec3 v_normal; +void main () +{ + vec2 _texcoord_1; + _texcoord_1 = (v_shadowcoord.xy / v_shadowcoord.w); + bvec2 tmpvar_2; + tmpvar_2 = greaterThan (_texcoord_1, vec2(0.0, 0.0)); + bool tmpvar_3; + if ((tmpvar_2.x && tmpvar_2.y)) { + bvec2 tmpvar_4; + tmpvar_4 = lessThan (_texcoord_1, vec2(1.0, 1.0)); + tmpvar_3 = (tmpvar_4.x && tmpvar_4.y); + } else { + tmpvar_3 = bool(0); + }; + float tmpvar_5; + tmpvar_5 = (float(tmpvar_3) * 0.3); + vec3 tmpvar_6; + tmpvar_6.x = tmpvar_5; + tmpvar_6.y = -(tmpvar_5); + tmpvar_6.z = -(tmpvar_5); + float tmpvar_7; + float result_8; + result_8 = 0.0; + vec2 tmpvar_9; + tmpvar_9 = ((u_smSamplingParams.zw * u_params2.zz) * v_shadowcoord.w); + vec4 tmpvar_10; + tmpvar_10.zw = vec2(0.0, 0.0); + tmpvar_10.xy = (vec2(-1.5, -1.5) * tmpvar_9); + vec4 _shadowCoord_11; + _shadowCoord_11 = (v_shadowcoord + tmpvar_10); + float tmpvar_12; + vec2 tmpvar_13; + tmpvar_13 = (_shadowCoord_11.xy / _shadowCoord_11.w); + bool tmpvar_14; + if (any(greaterThan (tmpvar_13, vec2(1.0, 1.0)))) { + tmpvar_14 = bool(1); + } else { + tmpvar_14 = any(lessThan (tmpvar_13, vec2(0.0, 0.0))); + }; + if (tmpvar_14) { + tmpvar_12 = 1.0; + } else { + tmpvar_12 = float((dot (texture2D (u_shadowMap0, tmpvar_13), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_11.z - u_params1.x) / _shadowCoord_11.w))); + }; + result_8 = tmpvar_12; + vec4 tmpvar_15; + tmpvar_15.zw = vec2(0.0, 0.0); + tmpvar_15.xy = (vec2(-1.5, -0.5) * tmpvar_9); + vec4 _shadowCoord_16; + _shadowCoord_16 = (v_shadowcoord + tmpvar_15); + float tmpvar_17; + vec2 tmpvar_18; + tmpvar_18 = (_shadowCoord_16.xy / _shadowCoord_16.w); + bool tmpvar_19; + if (any(greaterThan (tmpvar_18, vec2(1.0, 1.0)))) { + tmpvar_19 = bool(1); + } else { + tmpvar_19 = any(lessThan (tmpvar_18, vec2(0.0, 0.0))); + }; + if (tmpvar_19) { + tmpvar_17 = 1.0; + } else { + tmpvar_17 = float((dot (texture2D (u_shadowMap0, tmpvar_18), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_16.z - u_params1.x) / _shadowCoord_16.w))); + }; + result_8 = (tmpvar_12 + tmpvar_17); + vec4 tmpvar_20; + tmpvar_20.zw = vec2(0.0, 0.0); + tmpvar_20.xy = (vec2(-1.5, 0.5) * tmpvar_9); + vec4 _shadowCoord_21; + _shadowCoord_21 = (v_shadowcoord + tmpvar_20); + float tmpvar_22; + vec2 tmpvar_23; + tmpvar_23 = (_shadowCoord_21.xy / _shadowCoord_21.w); + bool tmpvar_24; + if (any(greaterThan (tmpvar_23, vec2(1.0, 1.0)))) { + tmpvar_24 = bool(1); + } else { + tmpvar_24 = any(lessThan (tmpvar_23, vec2(0.0, 0.0))); + }; + if (tmpvar_24) { + tmpvar_22 = 1.0; + } else { + tmpvar_22 = float((dot (texture2D (u_shadowMap0, tmpvar_23), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_21.z - u_params1.x) / _shadowCoord_21.w))); + }; + result_8 = (result_8 + tmpvar_22); + vec4 tmpvar_25; + tmpvar_25.zw = vec2(0.0, 0.0); + tmpvar_25.xy = (vec2(-1.5, 1.5) * tmpvar_9); + vec4 _shadowCoord_26; + _shadowCoord_26 = (v_shadowcoord + tmpvar_25); + float tmpvar_27; + vec2 tmpvar_28; + tmpvar_28 = (_shadowCoord_26.xy / _shadowCoord_26.w); + bool tmpvar_29; + if (any(greaterThan (tmpvar_28, vec2(1.0, 1.0)))) { + tmpvar_29 = bool(1); + } else { + tmpvar_29 = any(lessThan (tmpvar_28, vec2(0.0, 0.0))); + }; + if (tmpvar_29) { + tmpvar_27 = 1.0; + } else { + tmpvar_27 = float((dot (texture2D (u_shadowMap0, tmpvar_28), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_26.z - u_params1.x) / _shadowCoord_26.w))); + }; + result_8 = (result_8 + tmpvar_27); + vec4 tmpvar_30; + tmpvar_30.zw = vec2(0.0, 0.0); + tmpvar_30.xy = (vec2(-0.5, -1.5) * tmpvar_9); + vec4 _shadowCoord_31; + _shadowCoord_31 = (v_shadowcoord + tmpvar_30); + float tmpvar_32; + vec2 tmpvar_33; + tmpvar_33 = (_shadowCoord_31.xy / _shadowCoord_31.w); + bool tmpvar_34; + if (any(greaterThan (tmpvar_33, vec2(1.0, 1.0)))) { + tmpvar_34 = bool(1); + } else { + tmpvar_34 = any(lessThan (tmpvar_33, vec2(0.0, 0.0))); + }; + if (tmpvar_34) { + tmpvar_32 = 1.0; + } else { + tmpvar_32 = float((dot (texture2D (u_shadowMap0, tmpvar_33), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_31.z - u_params1.x) / _shadowCoord_31.w))); + }; + result_8 = (result_8 + tmpvar_32); + vec4 tmpvar_35; + tmpvar_35.zw = vec2(0.0, 0.0); + tmpvar_35.xy = (vec2(-0.5, -0.5) * tmpvar_9); + vec4 _shadowCoord_36; + _shadowCoord_36 = (v_shadowcoord + tmpvar_35); + float tmpvar_37; + vec2 tmpvar_38; + tmpvar_38 = (_shadowCoord_36.xy / _shadowCoord_36.w); + bool tmpvar_39; + if (any(greaterThan (tmpvar_38, vec2(1.0, 1.0)))) { + tmpvar_39 = bool(1); + } else { + tmpvar_39 = any(lessThan (tmpvar_38, vec2(0.0, 0.0))); + }; + if (tmpvar_39) { + tmpvar_37 = 1.0; + } else { + tmpvar_37 = float((dot (texture2D (u_shadowMap0, tmpvar_38), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_36.z - u_params1.x) / _shadowCoord_36.w))); + }; + result_8 = (result_8 + tmpvar_37); + vec4 tmpvar_40; + tmpvar_40.zw = vec2(0.0, 0.0); + tmpvar_40.xy = (vec2(-0.5, 0.5) * tmpvar_9); + vec4 _shadowCoord_41; + _shadowCoord_41 = (v_shadowcoord + tmpvar_40); + float tmpvar_42; + vec2 tmpvar_43; + tmpvar_43 = (_shadowCoord_41.xy / _shadowCoord_41.w); + bool tmpvar_44; + if (any(greaterThan (tmpvar_43, vec2(1.0, 1.0)))) { + tmpvar_44 = bool(1); + } else { + tmpvar_44 = any(lessThan (tmpvar_43, vec2(0.0, 0.0))); + }; + if (tmpvar_44) { + tmpvar_42 = 1.0; + } else { + tmpvar_42 = float((dot (texture2D (u_shadowMap0, tmpvar_43), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_41.z - u_params1.x) / _shadowCoord_41.w))); + }; + result_8 = (result_8 + tmpvar_42); + vec4 tmpvar_45; + tmpvar_45.zw = vec2(0.0, 0.0); + tmpvar_45.xy = (vec2(-0.5, 1.5) * tmpvar_9); + vec4 _shadowCoord_46; + _shadowCoord_46 = (v_shadowcoord + tmpvar_45); + float tmpvar_47; + vec2 tmpvar_48; + tmpvar_48 = (_shadowCoord_46.xy / _shadowCoord_46.w); + bool tmpvar_49; + if (any(greaterThan (tmpvar_48, vec2(1.0, 1.0)))) { + tmpvar_49 = bool(1); + } else { + tmpvar_49 = any(lessThan (tmpvar_48, vec2(0.0, 0.0))); + }; + if (tmpvar_49) { + tmpvar_47 = 1.0; + } else { + tmpvar_47 = float((dot (texture2D (u_shadowMap0, tmpvar_48), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_46.z - u_params1.x) / _shadowCoord_46.w))); + }; + result_8 = (result_8 + tmpvar_47); + vec4 tmpvar_50; + tmpvar_50.zw = vec2(0.0, 0.0); + tmpvar_50.xy = (vec2(0.5, -1.5) * tmpvar_9); + vec4 _shadowCoord_51; + _shadowCoord_51 = (v_shadowcoord + tmpvar_50); + float tmpvar_52; + vec2 tmpvar_53; + tmpvar_53 = (_shadowCoord_51.xy / _shadowCoord_51.w); + bool tmpvar_54; + if (any(greaterThan (tmpvar_53, vec2(1.0, 1.0)))) { + tmpvar_54 = bool(1); + } else { + tmpvar_54 = any(lessThan (tmpvar_53, vec2(0.0, 0.0))); + }; + if (tmpvar_54) { + tmpvar_52 = 1.0; + } else { + tmpvar_52 = float((dot (texture2D (u_shadowMap0, tmpvar_53), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_51.z - u_params1.x) / _shadowCoord_51.w))); + }; + result_8 = (result_8 + tmpvar_52); + vec4 tmpvar_55; + tmpvar_55.zw = vec2(0.0, 0.0); + tmpvar_55.xy = (vec2(0.5, -0.5) * tmpvar_9); + vec4 _shadowCoord_56; + _shadowCoord_56 = (v_shadowcoord + tmpvar_55); + float tmpvar_57; + vec2 tmpvar_58; + tmpvar_58 = (_shadowCoord_56.xy / _shadowCoord_56.w); + bool tmpvar_59; + if (any(greaterThan (tmpvar_58, vec2(1.0, 1.0)))) { + tmpvar_59 = bool(1); + } else { + tmpvar_59 = any(lessThan (tmpvar_58, vec2(0.0, 0.0))); + }; + if (tmpvar_59) { + tmpvar_57 = 1.0; + } else { + tmpvar_57 = float((dot (texture2D (u_shadowMap0, tmpvar_58), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_56.z - u_params1.x) / _shadowCoord_56.w))); + }; + result_8 = (result_8 + tmpvar_57); + vec4 tmpvar_60; + tmpvar_60.zw = vec2(0.0, 0.0); + tmpvar_60.xy = (vec2(0.5, 0.5) * tmpvar_9); + vec4 _shadowCoord_61; + _shadowCoord_61 = (v_shadowcoord + tmpvar_60); + float tmpvar_62; + vec2 tmpvar_63; + tmpvar_63 = (_shadowCoord_61.xy / _shadowCoord_61.w); + bool tmpvar_64; + if (any(greaterThan (tmpvar_63, vec2(1.0, 1.0)))) { + tmpvar_64 = bool(1); + } else { + tmpvar_64 = any(lessThan (tmpvar_63, vec2(0.0, 0.0))); + }; + if (tmpvar_64) { + tmpvar_62 = 1.0; + } else { + tmpvar_62 = float((dot (texture2D (u_shadowMap0, tmpvar_63), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_61.z - u_params1.x) / _shadowCoord_61.w))); + }; + result_8 = (result_8 + tmpvar_62); + vec4 tmpvar_65; + tmpvar_65.zw = vec2(0.0, 0.0); + tmpvar_65.xy = (vec2(0.5, 1.5) * tmpvar_9); + vec4 _shadowCoord_66; + _shadowCoord_66 = (v_shadowcoord + tmpvar_65); + float tmpvar_67; + vec2 tmpvar_68; + tmpvar_68 = (_shadowCoord_66.xy / _shadowCoord_66.w); + bool tmpvar_69; + if (any(greaterThan (tmpvar_68, vec2(1.0, 1.0)))) { + tmpvar_69 = bool(1); + } else { + tmpvar_69 = any(lessThan (tmpvar_68, vec2(0.0, 0.0))); + }; + if (tmpvar_69) { + tmpvar_67 = 1.0; + } else { + tmpvar_67 = float((dot (texture2D (u_shadowMap0, tmpvar_68), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_66.z - u_params1.x) / _shadowCoord_66.w))); + }; + result_8 = (result_8 + tmpvar_67); + vec4 tmpvar_70; + tmpvar_70.zw = vec2(0.0, 0.0); + tmpvar_70.xy = (vec2(1.5, -1.5) * tmpvar_9); + vec4 _shadowCoord_71; + _shadowCoord_71 = (v_shadowcoord + tmpvar_70); + float tmpvar_72; + vec2 tmpvar_73; + tmpvar_73 = (_shadowCoord_71.xy / _shadowCoord_71.w); + bool tmpvar_74; + if (any(greaterThan (tmpvar_73, vec2(1.0, 1.0)))) { + tmpvar_74 = bool(1); + } else { + tmpvar_74 = any(lessThan (tmpvar_73, vec2(0.0, 0.0))); + }; + if (tmpvar_74) { + tmpvar_72 = 1.0; + } else { + tmpvar_72 = float((dot (texture2D (u_shadowMap0, tmpvar_73), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_71.z - u_params1.x) / _shadowCoord_71.w))); + }; + result_8 = (result_8 + tmpvar_72); + vec4 tmpvar_75; + tmpvar_75.zw = vec2(0.0, 0.0); + tmpvar_75.xy = (vec2(1.5, -0.5) * tmpvar_9); + vec4 _shadowCoord_76; + _shadowCoord_76 = (v_shadowcoord + tmpvar_75); + float tmpvar_77; + vec2 tmpvar_78; + tmpvar_78 = (_shadowCoord_76.xy / _shadowCoord_76.w); + bool tmpvar_79; + if (any(greaterThan (tmpvar_78, vec2(1.0, 1.0)))) { + tmpvar_79 = bool(1); + } else { + tmpvar_79 = any(lessThan (tmpvar_78, vec2(0.0, 0.0))); + }; + if (tmpvar_79) { + tmpvar_77 = 1.0; + } else { + tmpvar_77 = float((dot (texture2D (u_shadowMap0, tmpvar_78), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_76.z - u_params1.x) / _shadowCoord_76.w))); + }; + result_8 = (result_8 + tmpvar_77); + vec4 tmpvar_80; + tmpvar_80.zw = vec2(0.0, 0.0); + tmpvar_80.xy = (vec2(1.5, 0.5) * tmpvar_9); + vec4 _shadowCoord_81; + _shadowCoord_81 = (v_shadowcoord + tmpvar_80); + float tmpvar_82; + vec2 tmpvar_83; + tmpvar_83 = (_shadowCoord_81.xy / _shadowCoord_81.w); + bool tmpvar_84; + if (any(greaterThan (tmpvar_83, vec2(1.0, 1.0)))) { + tmpvar_84 = bool(1); + } else { + tmpvar_84 = any(lessThan (tmpvar_83, vec2(0.0, 0.0))); + }; + if (tmpvar_84) { + tmpvar_82 = 1.0; + } else { + tmpvar_82 = float((dot (texture2D (u_shadowMap0, tmpvar_83), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_81.z - u_params1.x) / _shadowCoord_81.w))); + }; + result_8 = (result_8 + tmpvar_82); + vec4 tmpvar_85; + tmpvar_85.zw = vec2(0.0, 0.0); + tmpvar_85.xy = (vec2(1.5, 1.5) * tmpvar_9); + vec4 _shadowCoord_86; + _shadowCoord_86 = (v_shadowcoord + tmpvar_85); + float tmpvar_87; + vec2 tmpvar_88; + tmpvar_88 = (_shadowCoord_86.xy / _shadowCoord_86.w); + bool tmpvar_89; + if (any(greaterThan (tmpvar_88, vec2(1.0, 1.0)))) { + tmpvar_89 = bool(1); + } else { + tmpvar_89 = any(lessThan (tmpvar_88, vec2(0.0, 0.0))); + }; + if (tmpvar_89) { + tmpvar_87 = 1.0; + } else { + tmpvar_87 = float((dot (texture2D (u_shadowMap0, tmpvar_88), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_86.z - u_params1.x) / _shadowCoord_86.w))); + }; + float tmpvar_90; + tmpvar_90 = (result_8 + tmpvar_87); + result_8 = tmpvar_90; + tmpvar_7 = (tmpvar_90 / 16.0); + vec3 tmpvar_91; + tmpvar_91 = -(normalize(v_view)); + vec3 tmpvar_92; + float tmpvar_93; + tmpvar_92 = -(normalize(u_lightPosition.xyz)); + tmpvar_93 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_94; + tmpvar_94 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_95; + tmpvar_95 = normalize(tmpvar_94); + tmpvar_92 = tmpvar_95; + float tmpvar_96; + tmpvar_96 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_97; + tmpvar_97 = sqrt(dot (tmpvar_94, tmpvar_94)); + tmpvar_93 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_97)) + ((u_lightAttenuationSpotOuter.z * tmpvar_97) * tmpvar_97)))) * mix (clamp (((max (0.0, dot (-(tmpvar_95), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_96) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_96)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_98; + tmpvar_98 = dot (v_normal, tmpvar_92); + vec2 tmpvar_99; + tmpvar_99.x = tmpvar_98; + tmpvar_99.y = (((float((tmpvar_98 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_98) * v_normal) - tmpvar_92), tmpvar_91)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_100; + tmpvar_100 = (max (tmpvar_99, 0.0) * tmpvar_93); + float tmpvar_101; + tmpvar_101 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_100.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_100.y)) * u_color.xyz) * tmpvar_7))), vec3(0.454545, 0.454545, 0.454545)) + (tmpvar_6 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_101) * tmpvar_101)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin new file mode 100644 index 000000000..1f4b87582 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_csm.bin @@ -0,0 +1,1492 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); + } else { + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); + } else { + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + float result_21; + result_21 = 0.0; + vec2 tmpvar_22; + tmpvar_22 = ((u_smSamplingParams.zw * u_params2.zz) * v_texcoord1.w); + vec4 tmpvar_23; + tmpvar_23.zw = vec2(0.0, 0.0); + tmpvar_23.xy = (vec2(-1.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_24; + _shadowCoord_24 = (v_texcoord1 + tmpvar_23); + float tmpvar_25; + vec2 tmpvar_26; + tmpvar_26 = (_shadowCoord_24.xy / _shadowCoord_24.w); + bool tmpvar_27; + if (any(greaterThan (tmpvar_26, vec2(1.0, 1.0)))) { + tmpvar_27 = bool(1); + } else { + tmpvar_27 = any(lessThan (tmpvar_26, vec2(0.0, 0.0))); + }; + if (tmpvar_27) { + tmpvar_25 = 1.0; + } else { + tmpvar_25 = float((dot (texture2D (u_shadowMap0, tmpvar_26), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_24.z - u_params1.x) / _shadowCoord_24.w))); + }; + result_21 = tmpvar_25; + vec4 tmpvar_28; + tmpvar_28.zw = vec2(0.0, 0.0); + tmpvar_28.xy = (vec2(-1.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_29; + _shadowCoord_29 = (v_texcoord1 + tmpvar_28); + float tmpvar_30; + vec2 tmpvar_31; + tmpvar_31 = (_shadowCoord_29.xy / _shadowCoord_29.w); + bool tmpvar_32; + if (any(greaterThan (tmpvar_31, vec2(1.0, 1.0)))) { + tmpvar_32 = bool(1); + } else { + tmpvar_32 = any(lessThan (tmpvar_31, vec2(0.0, 0.0))); + }; + if (tmpvar_32) { + tmpvar_30 = 1.0; + } else { + tmpvar_30 = float((dot (texture2D (u_shadowMap0, tmpvar_31), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_29.z - u_params1.x) / _shadowCoord_29.w))); + }; + result_21 = (tmpvar_25 + tmpvar_30); + vec4 tmpvar_33; + tmpvar_33.zw = vec2(0.0, 0.0); + tmpvar_33.xy = (vec2(-1.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_34; + _shadowCoord_34 = (v_texcoord1 + tmpvar_33); + float tmpvar_35; + vec2 tmpvar_36; + tmpvar_36 = (_shadowCoord_34.xy / _shadowCoord_34.w); + bool tmpvar_37; + if (any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) { + tmpvar_37 = bool(1); + } else { + tmpvar_37 = any(lessThan (tmpvar_36, vec2(0.0, 0.0))); + }; + if (tmpvar_37) { + tmpvar_35 = 1.0; + } else { + tmpvar_35 = float((dot (texture2D (u_shadowMap0, tmpvar_36), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_34.z - u_params1.x) / _shadowCoord_34.w))); + }; + result_21 = (result_21 + tmpvar_35); + vec4 tmpvar_38; + tmpvar_38.zw = vec2(0.0, 0.0); + tmpvar_38.xy = (vec2(-1.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_39; + _shadowCoord_39 = (v_texcoord1 + tmpvar_38); + float tmpvar_40; + vec2 tmpvar_41; + tmpvar_41 = (_shadowCoord_39.xy / _shadowCoord_39.w); + bool tmpvar_42; + if (any(greaterThan (tmpvar_41, vec2(1.0, 1.0)))) { + tmpvar_42 = bool(1); + } else { + tmpvar_42 = any(lessThan (tmpvar_41, vec2(0.0, 0.0))); + }; + if (tmpvar_42) { + tmpvar_40 = 1.0; + } else { + tmpvar_40 = float((dot (texture2D (u_shadowMap0, tmpvar_41), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_39.z - u_params1.x) / _shadowCoord_39.w))); + }; + result_21 = (result_21 + tmpvar_40); + vec4 tmpvar_43; + tmpvar_43.zw = vec2(0.0, 0.0); + tmpvar_43.xy = (vec2(-0.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_44; + _shadowCoord_44 = (v_texcoord1 + tmpvar_43); + float tmpvar_45; + vec2 tmpvar_46; + tmpvar_46 = (_shadowCoord_44.xy / _shadowCoord_44.w); + bool tmpvar_47; + if (any(greaterThan (tmpvar_46, vec2(1.0, 1.0)))) { + tmpvar_47 = bool(1); + } else { + tmpvar_47 = any(lessThan (tmpvar_46, vec2(0.0, 0.0))); + }; + if (tmpvar_47) { + tmpvar_45 = 1.0; + } else { + tmpvar_45 = float((dot (texture2D (u_shadowMap0, tmpvar_46), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_44.z - u_params1.x) / _shadowCoord_44.w))); + }; + result_21 = (result_21 + tmpvar_45); + vec4 tmpvar_48; + tmpvar_48.zw = vec2(0.0, 0.0); + tmpvar_48.xy = (vec2(-0.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_49; + _shadowCoord_49 = (v_texcoord1 + tmpvar_48); + float tmpvar_50; + vec2 tmpvar_51; + tmpvar_51 = (_shadowCoord_49.xy / _shadowCoord_49.w); + bool tmpvar_52; + if (any(greaterThan (tmpvar_51, vec2(1.0, 1.0)))) { + tmpvar_52 = bool(1); + } else { + tmpvar_52 = any(lessThan (tmpvar_51, vec2(0.0, 0.0))); + }; + if (tmpvar_52) { + tmpvar_50 = 1.0; + } else { + tmpvar_50 = float((dot (texture2D (u_shadowMap0, tmpvar_51), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_49.z - u_params1.x) / _shadowCoord_49.w))); + }; + result_21 = (result_21 + tmpvar_50); + vec4 tmpvar_53; + tmpvar_53.zw = vec2(0.0, 0.0); + tmpvar_53.xy = (vec2(-0.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_54; + _shadowCoord_54 = (v_texcoord1 + tmpvar_53); + float tmpvar_55; + vec2 tmpvar_56; + tmpvar_56 = (_shadowCoord_54.xy / _shadowCoord_54.w); + bool tmpvar_57; + if (any(greaterThan (tmpvar_56, vec2(1.0, 1.0)))) { + tmpvar_57 = bool(1); + } else { + tmpvar_57 = any(lessThan (tmpvar_56, vec2(0.0, 0.0))); + }; + if (tmpvar_57) { + tmpvar_55 = 1.0; + } else { + tmpvar_55 = float((dot (texture2D (u_shadowMap0, tmpvar_56), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_54.z - u_params1.x) / _shadowCoord_54.w))); + }; + result_21 = (result_21 + tmpvar_55); + vec4 tmpvar_58; + tmpvar_58.zw = vec2(0.0, 0.0); + tmpvar_58.xy = (vec2(-0.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_59; + _shadowCoord_59 = (v_texcoord1 + tmpvar_58); + float tmpvar_60; + vec2 tmpvar_61; + tmpvar_61 = (_shadowCoord_59.xy / _shadowCoord_59.w); + bool tmpvar_62; + if (any(greaterThan (tmpvar_61, vec2(1.0, 1.0)))) { + tmpvar_62 = bool(1); + } else { + tmpvar_62 = any(lessThan (tmpvar_61, vec2(0.0, 0.0))); + }; + if (tmpvar_62) { + tmpvar_60 = 1.0; + } else { + tmpvar_60 = float((dot (texture2D (u_shadowMap0, tmpvar_61), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_59.z - u_params1.x) / _shadowCoord_59.w))); + }; + result_21 = (result_21 + tmpvar_60); + vec4 tmpvar_63; + tmpvar_63.zw = vec2(0.0, 0.0); + tmpvar_63.xy = (vec2(0.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_64; + _shadowCoord_64 = (v_texcoord1 + tmpvar_63); + float tmpvar_65; + vec2 tmpvar_66; + tmpvar_66 = (_shadowCoord_64.xy / _shadowCoord_64.w); + bool tmpvar_67; + if (any(greaterThan (tmpvar_66, vec2(1.0, 1.0)))) { + tmpvar_67 = bool(1); + } else { + tmpvar_67 = any(lessThan (tmpvar_66, vec2(0.0, 0.0))); + }; + if (tmpvar_67) { + tmpvar_65 = 1.0; + } else { + tmpvar_65 = float((dot (texture2D (u_shadowMap0, tmpvar_66), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_64.z - u_params1.x) / _shadowCoord_64.w))); + }; + result_21 = (result_21 + tmpvar_65); + vec4 tmpvar_68; + tmpvar_68.zw = vec2(0.0, 0.0); + tmpvar_68.xy = (vec2(0.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_69; + _shadowCoord_69 = (v_texcoord1 + tmpvar_68); + float tmpvar_70; + vec2 tmpvar_71; + tmpvar_71 = (_shadowCoord_69.xy / _shadowCoord_69.w); + bool tmpvar_72; + if (any(greaterThan (tmpvar_71, vec2(1.0, 1.0)))) { + tmpvar_72 = bool(1); + } else { + tmpvar_72 = any(lessThan (tmpvar_71, vec2(0.0, 0.0))); + }; + if (tmpvar_72) { + tmpvar_70 = 1.0; + } else { + tmpvar_70 = float((dot (texture2D (u_shadowMap0, tmpvar_71), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_69.z - u_params1.x) / _shadowCoord_69.w))); + }; + result_21 = (result_21 + tmpvar_70); + vec4 tmpvar_73; + tmpvar_73.zw = vec2(0.0, 0.0); + tmpvar_73.xy = (vec2(0.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_74; + _shadowCoord_74 = (v_texcoord1 + tmpvar_73); + float tmpvar_75; + vec2 tmpvar_76; + tmpvar_76 = (_shadowCoord_74.xy / _shadowCoord_74.w); + bool tmpvar_77; + if (any(greaterThan (tmpvar_76, vec2(1.0, 1.0)))) { + tmpvar_77 = bool(1); + } else { + tmpvar_77 = any(lessThan (tmpvar_76, vec2(0.0, 0.0))); + }; + if (tmpvar_77) { + tmpvar_75 = 1.0; + } else { + tmpvar_75 = float((dot (texture2D (u_shadowMap0, tmpvar_76), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_74.z - u_params1.x) / _shadowCoord_74.w))); + }; + result_21 = (result_21 + tmpvar_75); + vec4 tmpvar_78; + tmpvar_78.zw = vec2(0.0, 0.0); + tmpvar_78.xy = (vec2(0.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_79; + _shadowCoord_79 = (v_texcoord1 + tmpvar_78); + float tmpvar_80; + vec2 tmpvar_81; + tmpvar_81 = (_shadowCoord_79.xy / _shadowCoord_79.w); + bool tmpvar_82; + if (any(greaterThan (tmpvar_81, vec2(1.0, 1.0)))) { + tmpvar_82 = bool(1); + } else { + tmpvar_82 = any(lessThan (tmpvar_81, vec2(0.0, 0.0))); + }; + if (tmpvar_82) { + tmpvar_80 = 1.0; + } else { + tmpvar_80 = float((dot (texture2D (u_shadowMap0, tmpvar_81), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_79.z - u_params1.x) / _shadowCoord_79.w))); + }; + result_21 = (result_21 + tmpvar_80); + vec4 tmpvar_83; + tmpvar_83.zw = vec2(0.0, 0.0); + tmpvar_83.xy = (vec2(1.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_84; + _shadowCoord_84 = (v_texcoord1 + tmpvar_83); + float tmpvar_85; + vec2 tmpvar_86; + tmpvar_86 = (_shadowCoord_84.xy / _shadowCoord_84.w); + bool tmpvar_87; + if (any(greaterThan (tmpvar_86, vec2(1.0, 1.0)))) { + tmpvar_87 = bool(1); + } else { + tmpvar_87 = any(lessThan (tmpvar_86, vec2(0.0, 0.0))); + }; + if (tmpvar_87) { + tmpvar_85 = 1.0; + } else { + tmpvar_85 = float((dot (texture2D (u_shadowMap0, tmpvar_86), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_84.z - u_params1.x) / _shadowCoord_84.w))); + }; + result_21 = (result_21 + tmpvar_85); + vec4 tmpvar_88; + tmpvar_88.zw = vec2(0.0, 0.0); + tmpvar_88.xy = (vec2(1.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_89; + _shadowCoord_89 = (v_texcoord1 + tmpvar_88); + float tmpvar_90; + vec2 tmpvar_91; + tmpvar_91 = (_shadowCoord_89.xy / _shadowCoord_89.w); + bool tmpvar_92; + if (any(greaterThan (tmpvar_91, vec2(1.0, 1.0)))) { + tmpvar_92 = bool(1); + } else { + tmpvar_92 = any(lessThan (tmpvar_91, vec2(0.0, 0.0))); + }; + if (tmpvar_92) { + tmpvar_90 = 1.0; + } else { + tmpvar_90 = float((dot (texture2D (u_shadowMap0, tmpvar_91), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_89.z - u_params1.x) / _shadowCoord_89.w))); + }; + result_21 = (result_21 + tmpvar_90); + vec4 tmpvar_93; + tmpvar_93.zw = vec2(0.0, 0.0); + tmpvar_93.xy = (vec2(1.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_94; + _shadowCoord_94 = (v_texcoord1 + tmpvar_93); + float tmpvar_95; + vec2 tmpvar_96; + tmpvar_96 = (_shadowCoord_94.xy / _shadowCoord_94.w); + bool tmpvar_97; + if (any(greaterThan (tmpvar_96, vec2(1.0, 1.0)))) { + tmpvar_97 = bool(1); + } else { + tmpvar_97 = any(lessThan (tmpvar_96, vec2(0.0, 0.0))); + }; + if (tmpvar_97) { + tmpvar_95 = 1.0; + } else { + tmpvar_95 = float((dot (texture2D (u_shadowMap0, tmpvar_96), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_94.z - u_params1.x) / _shadowCoord_94.w))); + }; + result_21 = (result_21 + tmpvar_95); + vec4 tmpvar_98; + tmpvar_98.zw = vec2(0.0, 0.0); + tmpvar_98.xy = (vec2(1.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_99; + _shadowCoord_99 = (v_texcoord1 + tmpvar_98); + float tmpvar_100; + vec2 tmpvar_101; + tmpvar_101 = (_shadowCoord_99.xy / _shadowCoord_99.w); + bool tmpvar_102; + if (any(greaterThan (tmpvar_101, vec2(1.0, 1.0)))) { + tmpvar_102 = bool(1); + } else { + tmpvar_102 = any(lessThan (tmpvar_101, vec2(0.0, 0.0))); + }; + if (tmpvar_102) { + tmpvar_100 = 1.0; + } else { + tmpvar_100 = float((dot (texture2D (u_shadowMap0, tmpvar_101), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_99.z - u_params1.x) / _shadowCoord_99.w))); + }; + float tmpvar_103; + tmpvar_103 = (result_21 + tmpvar_100); + result_21 = tmpvar_103; + visibility_1 = (tmpvar_103 / 16.0); + } else { + if (tmpvar_10) { + vec2 _texcoord_104; + _texcoord_104 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_105; + tmpvar_105 = greaterThan (_texcoord_104, vec2(0.0, 0.0)); + bool tmpvar_106; + if ((tmpvar_105.x && tmpvar_105.y)) { + bvec2 tmpvar_107; + tmpvar_107 = lessThan (_texcoord_104, vec2(1.0, 1.0)); + tmpvar_106 = (tmpvar_107.x && tmpvar_107.y); + } else { + tmpvar_106 = bool(0); + }; + float tmpvar_108; + tmpvar_108 = (float(tmpvar_106) * 0.4); + vec3 tmpvar_109; + tmpvar_109.x = tmpvar_108; + tmpvar_109.y = tmpvar_108; + tmpvar_109.z = -(tmpvar_108); + colorCoverage_2 = tmpvar_109; + float result_110; + result_110 = 0.0; + vec2 tmpvar_111; + tmpvar_111 = ((u_smSamplingParams.zw * (u_params2.zz / 2.0)) * v_texcoord2.w); + vec4 tmpvar_112; + tmpvar_112.zw = vec2(0.0, 0.0); + tmpvar_112.xy = (vec2(-1.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_113; + _shadowCoord_113 = (v_texcoord2 + tmpvar_112); + float tmpvar_114; + vec2 tmpvar_115; + tmpvar_115 = (_shadowCoord_113.xy / _shadowCoord_113.w); + bool tmpvar_116; + if (any(greaterThan (tmpvar_115, vec2(1.0, 1.0)))) { + tmpvar_116 = bool(1); + } else { + tmpvar_116 = any(lessThan (tmpvar_115, vec2(0.0, 0.0))); + }; + if (tmpvar_116) { + tmpvar_114 = 1.0; + } else { + tmpvar_114 = float((dot (texture2D (u_shadowMap1, tmpvar_115), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_113.z - u_params1.x) / _shadowCoord_113.w))); + }; + result_110 = tmpvar_114; + vec4 tmpvar_117; + tmpvar_117.zw = vec2(0.0, 0.0); + tmpvar_117.xy = (vec2(-1.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_118; + _shadowCoord_118 = (v_texcoord2 + tmpvar_117); + float tmpvar_119; + vec2 tmpvar_120; + tmpvar_120 = (_shadowCoord_118.xy / _shadowCoord_118.w); + bool tmpvar_121; + if (any(greaterThan (tmpvar_120, vec2(1.0, 1.0)))) { + tmpvar_121 = bool(1); + } else { + tmpvar_121 = any(lessThan (tmpvar_120, vec2(0.0, 0.0))); + }; + if (tmpvar_121) { + tmpvar_119 = 1.0; + } else { + tmpvar_119 = float((dot (texture2D (u_shadowMap1, tmpvar_120), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_118.z - u_params1.x) / _shadowCoord_118.w))); + }; + result_110 = (tmpvar_114 + tmpvar_119); + vec4 tmpvar_122; + tmpvar_122.zw = vec2(0.0, 0.0); + tmpvar_122.xy = (vec2(-1.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_123; + _shadowCoord_123 = (v_texcoord2 + tmpvar_122); + float tmpvar_124; + vec2 tmpvar_125; + tmpvar_125 = (_shadowCoord_123.xy / _shadowCoord_123.w); + bool tmpvar_126; + if (any(greaterThan (tmpvar_125, vec2(1.0, 1.0)))) { + tmpvar_126 = bool(1); + } else { + tmpvar_126 = any(lessThan (tmpvar_125, vec2(0.0, 0.0))); + }; + if (tmpvar_126) { + tmpvar_124 = 1.0; + } else { + tmpvar_124 = float((dot (texture2D (u_shadowMap1, tmpvar_125), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_123.z - u_params1.x) / _shadowCoord_123.w))); + }; + result_110 = (result_110 + tmpvar_124); + vec4 tmpvar_127; + tmpvar_127.zw = vec2(0.0, 0.0); + tmpvar_127.xy = (vec2(-1.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_128; + _shadowCoord_128 = (v_texcoord2 + tmpvar_127); + float tmpvar_129; + vec2 tmpvar_130; + tmpvar_130 = (_shadowCoord_128.xy / _shadowCoord_128.w); + bool tmpvar_131; + if (any(greaterThan (tmpvar_130, vec2(1.0, 1.0)))) { + tmpvar_131 = bool(1); + } else { + tmpvar_131 = any(lessThan (tmpvar_130, vec2(0.0, 0.0))); + }; + if (tmpvar_131) { + tmpvar_129 = 1.0; + } else { + tmpvar_129 = float((dot (texture2D (u_shadowMap1, tmpvar_130), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_128.z - u_params1.x) / _shadowCoord_128.w))); + }; + result_110 = (result_110 + tmpvar_129); + vec4 tmpvar_132; + tmpvar_132.zw = vec2(0.0, 0.0); + tmpvar_132.xy = (vec2(-0.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_133; + _shadowCoord_133 = (v_texcoord2 + tmpvar_132); + float tmpvar_134; + vec2 tmpvar_135; + tmpvar_135 = (_shadowCoord_133.xy / _shadowCoord_133.w); + bool tmpvar_136; + if (any(greaterThan (tmpvar_135, vec2(1.0, 1.0)))) { + tmpvar_136 = bool(1); + } else { + tmpvar_136 = any(lessThan (tmpvar_135, vec2(0.0, 0.0))); + }; + if (tmpvar_136) { + tmpvar_134 = 1.0; + } else { + tmpvar_134 = float((dot (texture2D (u_shadowMap1, tmpvar_135), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_133.z - u_params1.x) / _shadowCoord_133.w))); + }; + result_110 = (result_110 + tmpvar_134); + vec4 tmpvar_137; + tmpvar_137.zw = vec2(0.0, 0.0); + tmpvar_137.xy = (vec2(-0.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_138; + _shadowCoord_138 = (v_texcoord2 + tmpvar_137); + float tmpvar_139; + vec2 tmpvar_140; + tmpvar_140 = (_shadowCoord_138.xy / _shadowCoord_138.w); + bool tmpvar_141; + if (any(greaterThan (tmpvar_140, vec2(1.0, 1.0)))) { + tmpvar_141 = bool(1); + } else { + tmpvar_141 = any(lessThan (tmpvar_140, vec2(0.0, 0.0))); + }; + if (tmpvar_141) { + tmpvar_139 = 1.0; + } else { + tmpvar_139 = float((dot (texture2D (u_shadowMap1, tmpvar_140), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_138.z - u_params1.x) / _shadowCoord_138.w))); + }; + result_110 = (result_110 + tmpvar_139); + vec4 tmpvar_142; + tmpvar_142.zw = vec2(0.0, 0.0); + tmpvar_142.xy = (vec2(-0.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_143; + _shadowCoord_143 = (v_texcoord2 + tmpvar_142); + float tmpvar_144; + vec2 tmpvar_145; + tmpvar_145 = (_shadowCoord_143.xy / _shadowCoord_143.w); + bool tmpvar_146; + if (any(greaterThan (tmpvar_145, vec2(1.0, 1.0)))) { + tmpvar_146 = bool(1); + } else { + tmpvar_146 = any(lessThan (tmpvar_145, vec2(0.0, 0.0))); + }; + if (tmpvar_146) { + tmpvar_144 = 1.0; + } else { + tmpvar_144 = float((dot (texture2D (u_shadowMap1, tmpvar_145), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_143.z - u_params1.x) / _shadowCoord_143.w))); + }; + result_110 = (result_110 + tmpvar_144); + vec4 tmpvar_147; + tmpvar_147.zw = vec2(0.0, 0.0); + tmpvar_147.xy = (vec2(-0.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_148; + _shadowCoord_148 = (v_texcoord2 + tmpvar_147); + float tmpvar_149; + vec2 tmpvar_150; + tmpvar_150 = (_shadowCoord_148.xy / _shadowCoord_148.w); + bool tmpvar_151; + if (any(greaterThan (tmpvar_150, vec2(1.0, 1.0)))) { + tmpvar_151 = bool(1); + } else { + tmpvar_151 = any(lessThan (tmpvar_150, vec2(0.0, 0.0))); + }; + if (tmpvar_151) { + tmpvar_149 = 1.0; + } else { + tmpvar_149 = float((dot (texture2D (u_shadowMap1, tmpvar_150), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_148.z - u_params1.x) / _shadowCoord_148.w))); + }; + result_110 = (result_110 + tmpvar_149); + vec4 tmpvar_152; + tmpvar_152.zw = vec2(0.0, 0.0); + tmpvar_152.xy = (vec2(0.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_153; + _shadowCoord_153 = (v_texcoord2 + tmpvar_152); + float tmpvar_154; + vec2 tmpvar_155; + tmpvar_155 = (_shadowCoord_153.xy / _shadowCoord_153.w); + bool tmpvar_156; + if (any(greaterThan (tmpvar_155, vec2(1.0, 1.0)))) { + tmpvar_156 = bool(1); + } else { + tmpvar_156 = any(lessThan (tmpvar_155, vec2(0.0, 0.0))); + }; + if (tmpvar_156) { + tmpvar_154 = 1.0; + } else { + tmpvar_154 = float((dot (texture2D (u_shadowMap1, tmpvar_155), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_153.z - u_params1.x) / _shadowCoord_153.w))); + }; + result_110 = (result_110 + tmpvar_154); + vec4 tmpvar_157; + tmpvar_157.zw = vec2(0.0, 0.0); + tmpvar_157.xy = (vec2(0.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_158; + _shadowCoord_158 = (v_texcoord2 + tmpvar_157); + float tmpvar_159; + vec2 tmpvar_160; + tmpvar_160 = (_shadowCoord_158.xy / _shadowCoord_158.w); + bool tmpvar_161; + if (any(greaterThan (tmpvar_160, vec2(1.0, 1.0)))) { + tmpvar_161 = bool(1); + } else { + tmpvar_161 = any(lessThan (tmpvar_160, vec2(0.0, 0.0))); + }; + if (tmpvar_161) { + tmpvar_159 = 1.0; + } else { + tmpvar_159 = float((dot (texture2D (u_shadowMap1, tmpvar_160), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_158.z - u_params1.x) / _shadowCoord_158.w))); + }; + result_110 = (result_110 + tmpvar_159); + vec4 tmpvar_162; + tmpvar_162.zw = vec2(0.0, 0.0); + tmpvar_162.xy = (vec2(0.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_163; + _shadowCoord_163 = (v_texcoord2 + tmpvar_162); + float tmpvar_164; + vec2 tmpvar_165; + tmpvar_165 = (_shadowCoord_163.xy / _shadowCoord_163.w); + bool tmpvar_166; + if (any(greaterThan (tmpvar_165, vec2(1.0, 1.0)))) { + tmpvar_166 = bool(1); + } else { + tmpvar_166 = any(lessThan (tmpvar_165, vec2(0.0, 0.0))); + }; + if (tmpvar_166) { + tmpvar_164 = 1.0; + } else { + tmpvar_164 = float((dot (texture2D (u_shadowMap1, tmpvar_165), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_163.z - u_params1.x) / _shadowCoord_163.w))); + }; + result_110 = (result_110 + tmpvar_164); + vec4 tmpvar_167; + tmpvar_167.zw = vec2(0.0, 0.0); + tmpvar_167.xy = (vec2(0.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_168; + _shadowCoord_168 = (v_texcoord2 + tmpvar_167); + float tmpvar_169; + vec2 tmpvar_170; + tmpvar_170 = (_shadowCoord_168.xy / _shadowCoord_168.w); + bool tmpvar_171; + if (any(greaterThan (tmpvar_170, vec2(1.0, 1.0)))) { + tmpvar_171 = bool(1); + } else { + tmpvar_171 = any(lessThan (tmpvar_170, vec2(0.0, 0.0))); + }; + if (tmpvar_171) { + tmpvar_169 = 1.0; + } else { + tmpvar_169 = float((dot (texture2D (u_shadowMap1, tmpvar_170), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_168.z - u_params1.x) / _shadowCoord_168.w))); + }; + result_110 = (result_110 + tmpvar_169); + vec4 tmpvar_172; + tmpvar_172.zw = vec2(0.0, 0.0); + tmpvar_172.xy = (vec2(1.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_173; + _shadowCoord_173 = (v_texcoord2 + tmpvar_172); + float tmpvar_174; + vec2 tmpvar_175; + tmpvar_175 = (_shadowCoord_173.xy / _shadowCoord_173.w); + bool tmpvar_176; + if (any(greaterThan (tmpvar_175, vec2(1.0, 1.0)))) { + tmpvar_176 = bool(1); + } else { + tmpvar_176 = any(lessThan (tmpvar_175, vec2(0.0, 0.0))); + }; + if (tmpvar_176) { + tmpvar_174 = 1.0; + } else { + tmpvar_174 = float((dot (texture2D (u_shadowMap1, tmpvar_175), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_173.z - u_params1.x) / _shadowCoord_173.w))); + }; + result_110 = (result_110 + tmpvar_174); + vec4 tmpvar_177; + tmpvar_177.zw = vec2(0.0, 0.0); + tmpvar_177.xy = (vec2(1.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_178; + _shadowCoord_178 = (v_texcoord2 + tmpvar_177); + float tmpvar_179; + vec2 tmpvar_180; + tmpvar_180 = (_shadowCoord_178.xy / _shadowCoord_178.w); + bool tmpvar_181; + if (any(greaterThan (tmpvar_180, vec2(1.0, 1.0)))) { + tmpvar_181 = bool(1); + } else { + tmpvar_181 = any(lessThan (tmpvar_180, vec2(0.0, 0.0))); + }; + if (tmpvar_181) { + tmpvar_179 = 1.0; + } else { + tmpvar_179 = float((dot (texture2D (u_shadowMap1, tmpvar_180), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_178.z - u_params1.x) / _shadowCoord_178.w))); + }; + result_110 = (result_110 + tmpvar_179); + vec4 tmpvar_182; + tmpvar_182.zw = vec2(0.0, 0.0); + tmpvar_182.xy = (vec2(1.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_183; + _shadowCoord_183 = (v_texcoord2 + tmpvar_182); + float tmpvar_184; + vec2 tmpvar_185; + tmpvar_185 = (_shadowCoord_183.xy / _shadowCoord_183.w); + bool tmpvar_186; + if (any(greaterThan (tmpvar_185, vec2(1.0, 1.0)))) { + tmpvar_186 = bool(1); + } else { + tmpvar_186 = any(lessThan (tmpvar_185, vec2(0.0, 0.0))); + }; + if (tmpvar_186) { + tmpvar_184 = 1.0; + } else { + tmpvar_184 = float((dot (texture2D (u_shadowMap1, tmpvar_185), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_183.z - u_params1.x) / _shadowCoord_183.w))); + }; + result_110 = (result_110 + tmpvar_184); + vec4 tmpvar_187; + tmpvar_187.zw = vec2(0.0, 0.0); + tmpvar_187.xy = (vec2(1.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_188; + _shadowCoord_188 = (v_texcoord2 + tmpvar_187); + float tmpvar_189; + vec2 tmpvar_190; + tmpvar_190 = (_shadowCoord_188.xy / _shadowCoord_188.w); + bool tmpvar_191; + if (any(greaterThan (tmpvar_190, vec2(1.0, 1.0)))) { + tmpvar_191 = bool(1); + } else { + tmpvar_191 = any(lessThan (tmpvar_190, vec2(0.0, 0.0))); + }; + if (tmpvar_191) { + tmpvar_189 = 1.0; + } else { + tmpvar_189 = float((dot (texture2D (u_shadowMap1, tmpvar_190), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_188.z - u_params1.x) / _shadowCoord_188.w))); + }; + float tmpvar_192; + tmpvar_192 = (result_110 + tmpvar_189); + result_110 = tmpvar_192; + visibility_1 = (tmpvar_192 / 16.0); + } else { + if (tmpvar_13) { + vec2 _texcoord_193; + _texcoord_193 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_194; + tmpvar_194 = greaterThan (_texcoord_193, vec2(0.0, 0.0)); + bool tmpvar_195; + if ((tmpvar_194.x && tmpvar_194.y)) { + bvec2 tmpvar_196; + tmpvar_196 = lessThan (_texcoord_193, vec2(1.0, 1.0)); + tmpvar_195 = (tmpvar_196.x && tmpvar_196.y); + } else { + tmpvar_195 = bool(0); + }; + float tmpvar_197; + tmpvar_197 = (float(tmpvar_195) * 0.4); + vec3 tmpvar_198; + tmpvar_198.x = -(tmpvar_197); + tmpvar_198.y = -(tmpvar_197); + tmpvar_198.z = tmpvar_197; + colorCoverage_2 = tmpvar_198; + float result_199; + result_199 = 0.0; + vec2 tmpvar_200; + tmpvar_200 = ((u_smSamplingParams.zw * (u_params2.zz / 3.0)) * v_texcoord3.w); + vec4 tmpvar_201; + tmpvar_201.zw = vec2(0.0, 0.0); + tmpvar_201.xy = (vec2(-1.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_202; + _shadowCoord_202 = (v_texcoord3 + tmpvar_201); + float tmpvar_203; + vec2 tmpvar_204; + tmpvar_204 = (_shadowCoord_202.xy / _shadowCoord_202.w); + bool tmpvar_205; + if (any(greaterThan (tmpvar_204, vec2(1.0, 1.0)))) { + tmpvar_205 = bool(1); + } else { + tmpvar_205 = any(lessThan (tmpvar_204, vec2(0.0, 0.0))); + }; + if (tmpvar_205) { + tmpvar_203 = 1.0; + } else { + tmpvar_203 = float((dot (texture2D (u_shadowMap2, tmpvar_204), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_202.z - u_params1.x) / _shadowCoord_202.w))); + }; + result_199 = tmpvar_203; + vec4 tmpvar_206; + tmpvar_206.zw = vec2(0.0, 0.0); + tmpvar_206.xy = (vec2(-1.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_207; + _shadowCoord_207 = (v_texcoord3 + tmpvar_206); + float tmpvar_208; + vec2 tmpvar_209; + tmpvar_209 = (_shadowCoord_207.xy / _shadowCoord_207.w); + bool tmpvar_210; + if (any(greaterThan (tmpvar_209, vec2(1.0, 1.0)))) { + tmpvar_210 = bool(1); + } else { + tmpvar_210 = any(lessThan (tmpvar_209, vec2(0.0, 0.0))); + }; + if (tmpvar_210) { + tmpvar_208 = 1.0; + } else { + tmpvar_208 = float((dot (texture2D (u_shadowMap2, tmpvar_209), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_207.z - u_params1.x) / _shadowCoord_207.w))); + }; + result_199 = (tmpvar_203 + tmpvar_208); + vec4 tmpvar_211; + tmpvar_211.zw = vec2(0.0, 0.0); + tmpvar_211.xy = (vec2(-1.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_212; + _shadowCoord_212 = (v_texcoord3 + tmpvar_211); + float tmpvar_213; + vec2 tmpvar_214; + tmpvar_214 = (_shadowCoord_212.xy / _shadowCoord_212.w); + bool tmpvar_215; + if (any(greaterThan (tmpvar_214, vec2(1.0, 1.0)))) { + tmpvar_215 = bool(1); + } else { + tmpvar_215 = any(lessThan (tmpvar_214, vec2(0.0, 0.0))); + }; + if (tmpvar_215) { + tmpvar_213 = 1.0; + } else { + tmpvar_213 = float((dot (texture2D (u_shadowMap2, tmpvar_214), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_212.z - u_params1.x) / _shadowCoord_212.w))); + }; + result_199 = (result_199 + tmpvar_213); + vec4 tmpvar_216; + tmpvar_216.zw = vec2(0.0, 0.0); + tmpvar_216.xy = (vec2(-1.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_217; + _shadowCoord_217 = (v_texcoord3 + tmpvar_216); + float tmpvar_218; + vec2 tmpvar_219; + tmpvar_219 = (_shadowCoord_217.xy / _shadowCoord_217.w); + bool tmpvar_220; + if (any(greaterThan (tmpvar_219, vec2(1.0, 1.0)))) { + tmpvar_220 = bool(1); + } else { + tmpvar_220 = any(lessThan (tmpvar_219, vec2(0.0, 0.0))); + }; + if (tmpvar_220) { + tmpvar_218 = 1.0; + } else { + tmpvar_218 = float((dot (texture2D (u_shadowMap2, tmpvar_219), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_217.z - u_params1.x) / _shadowCoord_217.w))); + }; + result_199 = (result_199 + tmpvar_218); + vec4 tmpvar_221; + tmpvar_221.zw = vec2(0.0, 0.0); + tmpvar_221.xy = (vec2(-0.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_222; + _shadowCoord_222 = (v_texcoord3 + tmpvar_221); + float tmpvar_223; + vec2 tmpvar_224; + tmpvar_224 = (_shadowCoord_222.xy / _shadowCoord_222.w); + bool tmpvar_225; + if (any(greaterThan (tmpvar_224, vec2(1.0, 1.0)))) { + tmpvar_225 = bool(1); + } else { + tmpvar_225 = any(lessThan (tmpvar_224, vec2(0.0, 0.0))); + }; + if (tmpvar_225) { + tmpvar_223 = 1.0; + } else { + tmpvar_223 = float((dot (texture2D (u_shadowMap2, tmpvar_224), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_222.z - u_params1.x) / _shadowCoord_222.w))); + }; + result_199 = (result_199 + tmpvar_223); + vec4 tmpvar_226; + tmpvar_226.zw = vec2(0.0, 0.0); + tmpvar_226.xy = (vec2(-0.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_227; + _shadowCoord_227 = (v_texcoord3 + tmpvar_226); + float tmpvar_228; + vec2 tmpvar_229; + tmpvar_229 = (_shadowCoord_227.xy / _shadowCoord_227.w); + bool tmpvar_230; + if (any(greaterThan (tmpvar_229, vec2(1.0, 1.0)))) { + tmpvar_230 = bool(1); + } else { + tmpvar_230 = any(lessThan (tmpvar_229, vec2(0.0, 0.0))); + }; + if (tmpvar_230) { + tmpvar_228 = 1.0; + } else { + tmpvar_228 = float((dot (texture2D (u_shadowMap2, tmpvar_229), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_227.z - u_params1.x) / _shadowCoord_227.w))); + }; + result_199 = (result_199 + tmpvar_228); + vec4 tmpvar_231; + tmpvar_231.zw = vec2(0.0, 0.0); + tmpvar_231.xy = (vec2(-0.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_232; + _shadowCoord_232 = (v_texcoord3 + tmpvar_231); + float tmpvar_233; + vec2 tmpvar_234; + tmpvar_234 = (_shadowCoord_232.xy / _shadowCoord_232.w); + bool tmpvar_235; + if (any(greaterThan (tmpvar_234, vec2(1.0, 1.0)))) { + tmpvar_235 = bool(1); + } else { + tmpvar_235 = any(lessThan (tmpvar_234, vec2(0.0, 0.0))); + }; + if (tmpvar_235) { + tmpvar_233 = 1.0; + } else { + tmpvar_233 = float((dot (texture2D (u_shadowMap2, tmpvar_234), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_232.z - u_params1.x) / _shadowCoord_232.w))); + }; + result_199 = (result_199 + tmpvar_233); + vec4 tmpvar_236; + tmpvar_236.zw = vec2(0.0, 0.0); + tmpvar_236.xy = (vec2(-0.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_237; + _shadowCoord_237 = (v_texcoord3 + tmpvar_236); + float tmpvar_238; + vec2 tmpvar_239; + tmpvar_239 = (_shadowCoord_237.xy / _shadowCoord_237.w); + bool tmpvar_240; + if (any(greaterThan (tmpvar_239, vec2(1.0, 1.0)))) { + tmpvar_240 = bool(1); + } else { + tmpvar_240 = any(lessThan (tmpvar_239, vec2(0.0, 0.0))); + }; + if (tmpvar_240) { + tmpvar_238 = 1.0; + } else { + tmpvar_238 = float((dot (texture2D (u_shadowMap2, tmpvar_239), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_237.z - u_params1.x) / _shadowCoord_237.w))); + }; + result_199 = (result_199 + tmpvar_238); + vec4 tmpvar_241; + tmpvar_241.zw = vec2(0.0, 0.0); + tmpvar_241.xy = (vec2(0.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_242; + _shadowCoord_242 = (v_texcoord3 + tmpvar_241); + float tmpvar_243; + vec2 tmpvar_244; + tmpvar_244 = (_shadowCoord_242.xy / _shadowCoord_242.w); + bool tmpvar_245; + if (any(greaterThan (tmpvar_244, vec2(1.0, 1.0)))) { + tmpvar_245 = bool(1); + } else { + tmpvar_245 = any(lessThan (tmpvar_244, vec2(0.0, 0.0))); + }; + if (tmpvar_245) { + tmpvar_243 = 1.0; + } else { + tmpvar_243 = float((dot (texture2D (u_shadowMap2, tmpvar_244), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_242.z - u_params1.x) / _shadowCoord_242.w))); + }; + result_199 = (result_199 + tmpvar_243); + vec4 tmpvar_246; + tmpvar_246.zw = vec2(0.0, 0.0); + tmpvar_246.xy = (vec2(0.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_247; + _shadowCoord_247 = (v_texcoord3 + tmpvar_246); + float tmpvar_248; + vec2 tmpvar_249; + tmpvar_249 = (_shadowCoord_247.xy / _shadowCoord_247.w); + bool tmpvar_250; + if (any(greaterThan (tmpvar_249, vec2(1.0, 1.0)))) { + tmpvar_250 = bool(1); + } else { + tmpvar_250 = any(lessThan (tmpvar_249, vec2(0.0, 0.0))); + }; + if (tmpvar_250) { + tmpvar_248 = 1.0; + } else { + tmpvar_248 = float((dot (texture2D (u_shadowMap2, tmpvar_249), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_247.z - u_params1.x) / _shadowCoord_247.w))); + }; + result_199 = (result_199 + tmpvar_248); + vec4 tmpvar_251; + tmpvar_251.zw = vec2(0.0, 0.0); + tmpvar_251.xy = (vec2(0.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_252; + _shadowCoord_252 = (v_texcoord3 + tmpvar_251); + float tmpvar_253; + vec2 tmpvar_254; + tmpvar_254 = (_shadowCoord_252.xy / _shadowCoord_252.w); + bool tmpvar_255; + if (any(greaterThan (tmpvar_254, vec2(1.0, 1.0)))) { + tmpvar_255 = bool(1); + } else { + tmpvar_255 = any(lessThan (tmpvar_254, vec2(0.0, 0.0))); + }; + if (tmpvar_255) { + tmpvar_253 = 1.0; + } else { + tmpvar_253 = float((dot (texture2D (u_shadowMap2, tmpvar_254), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_252.z - u_params1.x) / _shadowCoord_252.w))); + }; + result_199 = (result_199 + tmpvar_253); + vec4 tmpvar_256; + tmpvar_256.zw = vec2(0.0, 0.0); + tmpvar_256.xy = (vec2(0.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_257; + _shadowCoord_257 = (v_texcoord3 + tmpvar_256); + float tmpvar_258; + vec2 tmpvar_259; + tmpvar_259 = (_shadowCoord_257.xy / _shadowCoord_257.w); + bool tmpvar_260; + if (any(greaterThan (tmpvar_259, vec2(1.0, 1.0)))) { + tmpvar_260 = bool(1); + } else { + tmpvar_260 = any(lessThan (tmpvar_259, vec2(0.0, 0.0))); + }; + if (tmpvar_260) { + tmpvar_258 = 1.0; + } else { + tmpvar_258 = float((dot (texture2D (u_shadowMap2, tmpvar_259), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_257.z - u_params1.x) / _shadowCoord_257.w))); + }; + result_199 = (result_199 + tmpvar_258); + vec4 tmpvar_261; + tmpvar_261.zw = vec2(0.0, 0.0); + tmpvar_261.xy = (vec2(1.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_262; + _shadowCoord_262 = (v_texcoord3 + tmpvar_261); + float tmpvar_263; + vec2 tmpvar_264; + tmpvar_264 = (_shadowCoord_262.xy / _shadowCoord_262.w); + bool tmpvar_265; + if (any(greaterThan (tmpvar_264, vec2(1.0, 1.0)))) { + tmpvar_265 = bool(1); + } else { + tmpvar_265 = any(lessThan (tmpvar_264, vec2(0.0, 0.0))); + }; + if (tmpvar_265) { + tmpvar_263 = 1.0; + } else { + tmpvar_263 = float((dot (texture2D (u_shadowMap2, tmpvar_264), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_262.z - u_params1.x) / _shadowCoord_262.w))); + }; + result_199 = (result_199 + tmpvar_263); + vec4 tmpvar_266; + tmpvar_266.zw = vec2(0.0, 0.0); + tmpvar_266.xy = (vec2(1.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_267; + _shadowCoord_267 = (v_texcoord3 + tmpvar_266); + float tmpvar_268; + vec2 tmpvar_269; + tmpvar_269 = (_shadowCoord_267.xy / _shadowCoord_267.w); + bool tmpvar_270; + if (any(greaterThan (tmpvar_269, vec2(1.0, 1.0)))) { + tmpvar_270 = bool(1); + } else { + tmpvar_270 = any(lessThan (tmpvar_269, vec2(0.0, 0.0))); + }; + if (tmpvar_270) { + tmpvar_268 = 1.0; + } else { + tmpvar_268 = float((dot (texture2D (u_shadowMap2, tmpvar_269), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_267.z - u_params1.x) / _shadowCoord_267.w))); + }; + result_199 = (result_199 + tmpvar_268); + vec4 tmpvar_271; + tmpvar_271.zw = vec2(0.0, 0.0); + tmpvar_271.xy = (vec2(1.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_272; + _shadowCoord_272 = (v_texcoord3 + tmpvar_271); + float tmpvar_273; + vec2 tmpvar_274; + tmpvar_274 = (_shadowCoord_272.xy / _shadowCoord_272.w); + bool tmpvar_275; + if (any(greaterThan (tmpvar_274, vec2(1.0, 1.0)))) { + tmpvar_275 = bool(1); + } else { + tmpvar_275 = any(lessThan (tmpvar_274, vec2(0.0, 0.0))); + }; + if (tmpvar_275) { + tmpvar_273 = 1.0; + } else { + tmpvar_273 = float((dot (texture2D (u_shadowMap2, tmpvar_274), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_272.z - u_params1.x) / _shadowCoord_272.w))); + }; + result_199 = (result_199 + tmpvar_273); + vec4 tmpvar_276; + tmpvar_276.zw = vec2(0.0, 0.0); + tmpvar_276.xy = (vec2(1.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_277; + _shadowCoord_277 = (v_texcoord3 + tmpvar_276); + float tmpvar_278; + vec2 tmpvar_279; + tmpvar_279 = (_shadowCoord_277.xy / _shadowCoord_277.w); + bool tmpvar_280; + if (any(greaterThan (tmpvar_279, vec2(1.0, 1.0)))) { + tmpvar_280 = bool(1); + } else { + tmpvar_280 = any(lessThan (tmpvar_279, vec2(0.0, 0.0))); + }; + if (tmpvar_280) { + tmpvar_278 = 1.0; + } else { + tmpvar_278 = float((dot (texture2D (u_shadowMap2, tmpvar_279), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_277.z - u_params1.x) / _shadowCoord_277.w))); + }; + float tmpvar_281; + tmpvar_281 = (result_199 + tmpvar_278); + result_199 = tmpvar_281; + visibility_1 = (tmpvar_281 / 16.0); + } else { + vec2 _texcoord_282; + _texcoord_282 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_283; + tmpvar_283 = greaterThan (_texcoord_282, vec2(0.0, 0.0)); + bool tmpvar_284; + if ((tmpvar_283.x && tmpvar_283.y)) { + bvec2 tmpvar_285; + tmpvar_285 = lessThan (_texcoord_282, vec2(1.0, 1.0)); + tmpvar_284 = (tmpvar_285.x && tmpvar_285.y); + } else { + tmpvar_284 = bool(0); + }; + float tmpvar_286; + tmpvar_286 = (float(tmpvar_284) * 0.4); + vec3 tmpvar_287; + tmpvar_287.x = tmpvar_286; + tmpvar_287.y = -(tmpvar_286); + tmpvar_287.z = -(tmpvar_286); + colorCoverage_2 = tmpvar_287; + float result_288; + result_288 = 0.0; + vec2 tmpvar_289; + tmpvar_289 = ((u_smSamplingParams.zw * (u_params2.zz / 4.0)) * v_texcoord4.w); + vec4 tmpvar_290; + tmpvar_290.zw = vec2(0.0, 0.0); + tmpvar_290.xy = (vec2(-1.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_291; + _shadowCoord_291 = (v_texcoord4 + tmpvar_290); + float tmpvar_292; + vec2 tmpvar_293; + tmpvar_293 = (_shadowCoord_291.xy / _shadowCoord_291.w); + bool tmpvar_294; + if (any(greaterThan (tmpvar_293, vec2(1.0, 1.0)))) { + tmpvar_294 = bool(1); + } else { + tmpvar_294 = any(lessThan (tmpvar_293, vec2(0.0, 0.0))); + }; + if (tmpvar_294) { + tmpvar_292 = 1.0; + } else { + tmpvar_292 = float((dot (texture2D (u_shadowMap3, tmpvar_293), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_291.z - u_params1.x) / _shadowCoord_291.w))); + }; + result_288 = tmpvar_292; + vec4 tmpvar_295; + tmpvar_295.zw = vec2(0.0, 0.0); + tmpvar_295.xy = (vec2(-1.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_296; + _shadowCoord_296 = (v_texcoord4 + tmpvar_295); + float tmpvar_297; + vec2 tmpvar_298; + tmpvar_298 = (_shadowCoord_296.xy / _shadowCoord_296.w); + bool tmpvar_299; + if (any(greaterThan (tmpvar_298, vec2(1.0, 1.0)))) { + tmpvar_299 = bool(1); + } else { + tmpvar_299 = any(lessThan (tmpvar_298, vec2(0.0, 0.0))); + }; + if (tmpvar_299) { + tmpvar_297 = 1.0; + } else { + tmpvar_297 = float((dot (texture2D (u_shadowMap3, tmpvar_298), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_296.z - u_params1.x) / _shadowCoord_296.w))); + }; + result_288 = (tmpvar_292 + tmpvar_297); + vec4 tmpvar_300; + tmpvar_300.zw = vec2(0.0, 0.0); + tmpvar_300.xy = (vec2(-1.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_301; + _shadowCoord_301 = (v_texcoord4 + tmpvar_300); + float tmpvar_302; + vec2 tmpvar_303; + tmpvar_303 = (_shadowCoord_301.xy / _shadowCoord_301.w); + bool tmpvar_304; + if (any(greaterThan (tmpvar_303, vec2(1.0, 1.0)))) { + tmpvar_304 = bool(1); + } else { + tmpvar_304 = any(lessThan (tmpvar_303, vec2(0.0, 0.0))); + }; + if (tmpvar_304) { + tmpvar_302 = 1.0; + } else { + tmpvar_302 = float((dot (texture2D (u_shadowMap3, tmpvar_303), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_301.z - u_params1.x) / _shadowCoord_301.w))); + }; + result_288 = (result_288 + tmpvar_302); + vec4 tmpvar_305; + tmpvar_305.zw = vec2(0.0, 0.0); + tmpvar_305.xy = (vec2(-1.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_306; + _shadowCoord_306 = (v_texcoord4 + tmpvar_305); + float tmpvar_307; + vec2 tmpvar_308; + tmpvar_308 = (_shadowCoord_306.xy / _shadowCoord_306.w); + bool tmpvar_309; + if (any(greaterThan (tmpvar_308, vec2(1.0, 1.0)))) { + tmpvar_309 = bool(1); + } else { + tmpvar_309 = any(lessThan (tmpvar_308, vec2(0.0, 0.0))); + }; + if (tmpvar_309) { + tmpvar_307 = 1.0; + } else { + tmpvar_307 = float((dot (texture2D (u_shadowMap3, tmpvar_308), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_306.z - u_params1.x) / _shadowCoord_306.w))); + }; + result_288 = (result_288 + tmpvar_307); + vec4 tmpvar_310; + tmpvar_310.zw = vec2(0.0, 0.0); + tmpvar_310.xy = (vec2(-0.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_311; + _shadowCoord_311 = (v_texcoord4 + tmpvar_310); + float tmpvar_312; + vec2 tmpvar_313; + tmpvar_313 = (_shadowCoord_311.xy / _shadowCoord_311.w); + bool tmpvar_314; + if (any(greaterThan (tmpvar_313, vec2(1.0, 1.0)))) { + tmpvar_314 = bool(1); + } else { + tmpvar_314 = any(lessThan (tmpvar_313, vec2(0.0, 0.0))); + }; + if (tmpvar_314) { + tmpvar_312 = 1.0; + } else { + tmpvar_312 = float((dot (texture2D (u_shadowMap3, tmpvar_313), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_311.z - u_params1.x) / _shadowCoord_311.w))); + }; + result_288 = (result_288 + tmpvar_312); + vec4 tmpvar_315; + tmpvar_315.zw = vec2(0.0, 0.0); + tmpvar_315.xy = (vec2(-0.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_316; + _shadowCoord_316 = (v_texcoord4 + tmpvar_315); + float tmpvar_317; + vec2 tmpvar_318; + tmpvar_318 = (_shadowCoord_316.xy / _shadowCoord_316.w); + bool tmpvar_319; + if (any(greaterThan (tmpvar_318, vec2(1.0, 1.0)))) { + tmpvar_319 = bool(1); + } else { + tmpvar_319 = any(lessThan (tmpvar_318, vec2(0.0, 0.0))); + }; + if (tmpvar_319) { + tmpvar_317 = 1.0; + } else { + tmpvar_317 = float((dot (texture2D (u_shadowMap3, tmpvar_318), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_316.z - u_params1.x) / _shadowCoord_316.w))); + }; + result_288 = (result_288 + tmpvar_317); + vec4 tmpvar_320; + tmpvar_320.zw = vec2(0.0, 0.0); + tmpvar_320.xy = (vec2(-0.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_321; + _shadowCoord_321 = (v_texcoord4 + tmpvar_320); + float tmpvar_322; + vec2 tmpvar_323; + tmpvar_323 = (_shadowCoord_321.xy / _shadowCoord_321.w); + bool tmpvar_324; + if (any(greaterThan (tmpvar_323, vec2(1.0, 1.0)))) { + tmpvar_324 = bool(1); + } else { + tmpvar_324 = any(lessThan (tmpvar_323, vec2(0.0, 0.0))); + }; + if (tmpvar_324) { + tmpvar_322 = 1.0; + } else { + tmpvar_322 = float((dot (texture2D (u_shadowMap3, tmpvar_323), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_321.z - u_params1.x) / _shadowCoord_321.w))); + }; + result_288 = (result_288 + tmpvar_322); + vec4 tmpvar_325; + tmpvar_325.zw = vec2(0.0, 0.0); + tmpvar_325.xy = (vec2(-0.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_326; + _shadowCoord_326 = (v_texcoord4 + tmpvar_325); + float tmpvar_327; + vec2 tmpvar_328; + tmpvar_328 = (_shadowCoord_326.xy / _shadowCoord_326.w); + bool tmpvar_329; + if (any(greaterThan (tmpvar_328, vec2(1.0, 1.0)))) { + tmpvar_329 = bool(1); + } else { + tmpvar_329 = any(lessThan (tmpvar_328, vec2(0.0, 0.0))); + }; + if (tmpvar_329) { + tmpvar_327 = 1.0; + } else { + tmpvar_327 = float((dot (texture2D (u_shadowMap3, tmpvar_328), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_326.z - u_params1.x) / _shadowCoord_326.w))); + }; + result_288 = (result_288 + tmpvar_327); + vec4 tmpvar_330; + tmpvar_330.zw = vec2(0.0, 0.0); + tmpvar_330.xy = (vec2(0.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_331; + _shadowCoord_331 = (v_texcoord4 + tmpvar_330); + float tmpvar_332; + vec2 tmpvar_333; + tmpvar_333 = (_shadowCoord_331.xy / _shadowCoord_331.w); + bool tmpvar_334; + if (any(greaterThan (tmpvar_333, vec2(1.0, 1.0)))) { + tmpvar_334 = bool(1); + } else { + tmpvar_334 = any(lessThan (tmpvar_333, vec2(0.0, 0.0))); + }; + if (tmpvar_334) { + tmpvar_332 = 1.0; + } else { + tmpvar_332 = float((dot (texture2D (u_shadowMap3, tmpvar_333), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_331.z - u_params1.x) / _shadowCoord_331.w))); + }; + result_288 = (result_288 + tmpvar_332); + vec4 tmpvar_335; + tmpvar_335.zw = vec2(0.0, 0.0); + tmpvar_335.xy = (vec2(0.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_336; + _shadowCoord_336 = (v_texcoord4 + tmpvar_335); + float tmpvar_337; + vec2 tmpvar_338; + tmpvar_338 = (_shadowCoord_336.xy / _shadowCoord_336.w); + bool tmpvar_339; + if (any(greaterThan (tmpvar_338, vec2(1.0, 1.0)))) { + tmpvar_339 = bool(1); + } else { + tmpvar_339 = any(lessThan (tmpvar_338, vec2(0.0, 0.0))); + }; + if (tmpvar_339) { + tmpvar_337 = 1.0; + } else { + tmpvar_337 = float((dot (texture2D (u_shadowMap3, tmpvar_338), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_336.z - u_params1.x) / _shadowCoord_336.w))); + }; + result_288 = (result_288 + tmpvar_337); + vec4 tmpvar_340; + tmpvar_340.zw = vec2(0.0, 0.0); + tmpvar_340.xy = (vec2(0.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_341; + _shadowCoord_341 = (v_texcoord4 + tmpvar_340); + float tmpvar_342; + vec2 tmpvar_343; + tmpvar_343 = (_shadowCoord_341.xy / _shadowCoord_341.w); + bool tmpvar_344; + if (any(greaterThan (tmpvar_343, vec2(1.0, 1.0)))) { + tmpvar_344 = bool(1); + } else { + tmpvar_344 = any(lessThan (tmpvar_343, vec2(0.0, 0.0))); + }; + if (tmpvar_344) { + tmpvar_342 = 1.0; + } else { + tmpvar_342 = float((dot (texture2D (u_shadowMap3, tmpvar_343), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_341.z - u_params1.x) / _shadowCoord_341.w))); + }; + result_288 = (result_288 + tmpvar_342); + vec4 tmpvar_345; + tmpvar_345.zw = vec2(0.0, 0.0); + tmpvar_345.xy = (vec2(0.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_346; + _shadowCoord_346 = (v_texcoord4 + tmpvar_345); + float tmpvar_347; + vec2 tmpvar_348; + tmpvar_348 = (_shadowCoord_346.xy / _shadowCoord_346.w); + bool tmpvar_349; + if (any(greaterThan (tmpvar_348, vec2(1.0, 1.0)))) { + tmpvar_349 = bool(1); + } else { + tmpvar_349 = any(lessThan (tmpvar_348, vec2(0.0, 0.0))); + }; + if (tmpvar_349) { + tmpvar_347 = 1.0; + } else { + tmpvar_347 = float((dot (texture2D (u_shadowMap3, tmpvar_348), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_346.z - u_params1.x) / _shadowCoord_346.w))); + }; + result_288 = (result_288 + tmpvar_347); + vec4 tmpvar_350; + tmpvar_350.zw = vec2(0.0, 0.0); + tmpvar_350.xy = (vec2(1.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_351; + _shadowCoord_351 = (v_texcoord4 + tmpvar_350); + float tmpvar_352; + vec2 tmpvar_353; + tmpvar_353 = (_shadowCoord_351.xy / _shadowCoord_351.w); + bool tmpvar_354; + if (any(greaterThan (tmpvar_353, vec2(1.0, 1.0)))) { + tmpvar_354 = bool(1); + } else { + tmpvar_354 = any(lessThan (tmpvar_353, vec2(0.0, 0.0))); + }; + if (tmpvar_354) { + tmpvar_352 = 1.0; + } else { + tmpvar_352 = float((dot (texture2D (u_shadowMap3, tmpvar_353), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_351.z - u_params1.x) / _shadowCoord_351.w))); + }; + result_288 = (result_288 + tmpvar_352); + vec4 tmpvar_355; + tmpvar_355.zw = vec2(0.0, 0.0); + tmpvar_355.xy = (vec2(1.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_356; + _shadowCoord_356 = (v_texcoord4 + tmpvar_355); + float tmpvar_357; + vec2 tmpvar_358; + tmpvar_358 = (_shadowCoord_356.xy / _shadowCoord_356.w); + bool tmpvar_359; + if (any(greaterThan (tmpvar_358, vec2(1.0, 1.0)))) { + tmpvar_359 = bool(1); + } else { + tmpvar_359 = any(lessThan (tmpvar_358, vec2(0.0, 0.0))); + }; + if (tmpvar_359) { + tmpvar_357 = 1.0; + } else { + tmpvar_357 = float((dot (texture2D (u_shadowMap3, tmpvar_358), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_356.z - u_params1.x) / _shadowCoord_356.w))); + }; + result_288 = (result_288 + tmpvar_357); + vec4 tmpvar_360; + tmpvar_360.zw = vec2(0.0, 0.0); + tmpvar_360.xy = (vec2(1.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_361; + _shadowCoord_361 = (v_texcoord4 + tmpvar_360); + float tmpvar_362; + vec2 tmpvar_363; + tmpvar_363 = (_shadowCoord_361.xy / _shadowCoord_361.w); + bool tmpvar_364; + if (any(greaterThan (tmpvar_363, vec2(1.0, 1.0)))) { + tmpvar_364 = bool(1); + } else { + tmpvar_364 = any(lessThan (tmpvar_363, vec2(0.0, 0.0))); + }; + if (tmpvar_364) { + tmpvar_362 = 1.0; + } else { + tmpvar_362 = float((dot (texture2D (u_shadowMap3, tmpvar_363), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_361.z - u_params1.x) / _shadowCoord_361.w))); + }; + result_288 = (result_288 + tmpvar_362); + vec4 tmpvar_365; + tmpvar_365.zw = vec2(0.0, 0.0); + tmpvar_365.xy = (vec2(1.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_366; + _shadowCoord_366 = (v_texcoord4 + tmpvar_365); + float tmpvar_367; + vec2 tmpvar_368; + tmpvar_368 = (_shadowCoord_366.xy / _shadowCoord_366.w); + bool tmpvar_369; + if (any(greaterThan (tmpvar_368, vec2(1.0, 1.0)))) { + tmpvar_369 = bool(1); + } else { + tmpvar_369 = any(lessThan (tmpvar_368, vec2(0.0, 0.0))); + }; + if (tmpvar_369) { + tmpvar_367 = 1.0; + } else { + tmpvar_367 = float((dot (texture2D (u_shadowMap3, tmpvar_368), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_366.z - u_params1.x) / _shadowCoord_366.w))); + }; + float tmpvar_370; + tmpvar_370 = (result_288 + tmpvar_367); + result_288 = tmpvar_370; + visibility_1 = (tmpvar_370 / 16.0); + }; + }; + }; + vec3 tmpvar_371; + tmpvar_371 = -(normalize(v_view)); + vec3 tmpvar_372; + float tmpvar_373; + tmpvar_372 = -(normalize(u_lightPosition.xyz)); + tmpvar_373 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_374; + tmpvar_374 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_375; + tmpvar_375 = normalize(tmpvar_374); + tmpvar_372 = tmpvar_375; + float tmpvar_376; + tmpvar_376 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_377; + tmpvar_377 = sqrt(dot (tmpvar_374, tmpvar_374)); + tmpvar_373 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_377)) + ((u_lightAttenuationSpotOuter.z * tmpvar_377) * tmpvar_377)))) * mix (clamp (((max (0.0, dot (-(tmpvar_375), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_376) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_376)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_378; + tmpvar_378 = dot (v_normal, tmpvar_372); + vec2 tmpvar_379; + tmpvar_379.x = tmpvar_378; + tmpvar_379.y = (((float((tmpvar_378 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_378) * v_normal) - tmpvar_372), tmpvar_371)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_380; + tmpvar_380 = (max (tmpvar_379, 0.0) * tmpvar_373); + float tmpvar_381; + tmpvar_381 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_380.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_380.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_381) * tmpvar_381)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin new file mode 100644 index 000000000..28b431e90 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear.bin @@ -0,0 +1,405 @@ +FSHpjH#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap0; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_shadowcoord; +varying vec3 v_normal; +void main () +{ + vec2 _texcoord_1; + _texcoord_1 = (v_shadowcoord.xy / v_shadowcoord.w); + bvec2 tmpvar_2; + tmpvar_2 = greaterThan (_texcoord_1, vec2(0.0, 0.0)); + bool tmpvar_3; + if ((tmpvar_2.x && tmpvar_2.y)) { + bvec2 tmpvar_4; + tmpvar_4 = lessThan (_texcoord_1, vec2(1.0, 1.0)); + tmpvar_3 = (tmpvar_4.x && tmpvar_4.y); + } else { + tmpvar_3 = bool(0); + }; + float tmpvar_5; + tmpvar_5 = (float(tmpvar_3) * 0.3); + vec3 tmpvar_6; + tmpvar_6.x = tmpvar_5; + tmpvar_6.y = -(tmpvar_5); + tmpvar_6.z = -(tmpvar_5); + vec4 tmpvar_7; + tmpvar_7.w = 1.0; + tmpvar_7.xy = (v_shadowcoord.xy / v_shadowcoord.w); + tmpvar_7.z = v_shadowcoord.z; + float tmpvar_8; + float result_9; + result_9 = 0.0; + vec2 tmpvar_10; + tmpvar_10 = (u_smSamplingParams.zw * u_params2.zz); + vec4 tmpvar_11; + tmpvar_11.zw = vec2(0.0, 0.0); + tmpvar_11.xy = (vec2(-1.5, -1.5) * tmpvar_10); + vec4 _shadowCoord_12; + _shadowCoord_12 = (tmpvar_7 + tmpvar_11); + float tmpvar_13; + vec2 tmpvar_14; + tmpvar_14 = (_shadowCoord_12.xy / _shadowCoord_12.w); + bool tmpvar_15; + if (any(greaterThan (tmpvar_14, vec2(1.0, 1.0)))) { + tmpvar_15 = bool(1); + } else { + tmpvar_15 = any(lessThan (tmpvar_14, vec2(0.0, 0.0))); + }; + if (tmpvar_15) { + tmpvar_13 = 1.0; + } else { + tmpvar_13 = float((dot (texture2D (u_shadowMap0, tmpvar_14), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_12.z - u_params1.x) / _shadowCoord_12.w))); + }; + result_9 = tmpvar_13; + vec4 tmpvar_16; + tmpvar_16.zw = vec2(0.0, 0.0); + tmpvar_16.xy = (vec2(-1.5, -0.5) * tmpvar_10); + vec4 _shadowCoord_17; + _shadowCoord_17 = (tmpvar_7 + tmpvar_16); + float tmpvar_18; + vec2 tmpvar_19; + tmpvar_19 = (_shadowCoord_17.xy / _shadowCoord_17.w); + bool tmpvar_20; + if (any(greaterThan (tmpvar_19, vec2(1.0, 1.0)))) { + tmpvar_20 = bool(1); + } else { + tmpvar_20 = any(lessThan (tmpvar_19, vec2(0.0, 0.0))); + }; + if (tmpvar_20) { + tmpvar_18 = 1.0; + } else { + tmpvar_18 = float((dot (texture2D (u_shadowMap0, tmpvar_19), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_17.z - u_params1.x) / _shadowCoord_17.w))); + }; + result_9 = (tmpvar_13 + tmpvar_18); + vec4 tmpvar_21; + tmpvar_21.zw = vec2(0.0, 0.0); + tmpvar_21.xy = (vec2(-1.5, 0.5) * tmpvar_10); + vec4 _shadowCoord_22; + _shadowCoord_22 = (tmpvar_7 + tmpvar_21); + float tmpvar_23; + vec2 tmpvar_24; + tmpvar_24 = (_shadowCoord_22.xy / _shadowCoord_22.w); + bool tmpvar_25; + if (any(greaterThan (tmpvar_24, vec2(1.0, 1.0)))) { + tmpvar_25 = bool(1); + } else { + tmpvar_25 = any(lessThan (tmpvar_24, vec2(0.0, 0.0))); + }; + if (tmpvar_25) { + tmpvar_23 = 1.0; + } else { + tmpvar_23 = float((dot (texture2D (u_shadowMap0, tmpvar_24), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_22.z - u_params1.x) / _shadowCoord_22.w))); + }; + result_9 = (result_9 + tmpvar_23); + vec4 tmpvar_26; + tmpvar_26.zw = vec2(0.0, 0.0); + tmpvar_26.xy = (vec2(-1.5, 1.5) * tmpvar_10); + vec4 _shadowCoord_27; + _shadowCoord_27 = (tmpvar_7 + tmpvar_26); + float tmpvar_28; + vec2 tmpvar_29; + tmpvar_29 = (_shadowCoord_27.xy / _shadowCoord_27.w); + bool tmpvar_30; + if (any(greaterThan (tmpvar_29, vec2(1.0, 1.0)))) { + tmpvar_30 = bool(1); + } else { + tmpvar_30 = any(lessThan (tmpvar_29, vec2(0.0, 0.0))); + }; + if (tmpvar_30) { + tmpvar_28 = 1.0; + } else { + tmpvar_28 = float((dot (texture2D (u_shadowMap0, tmpvar_29), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_27.z - u_params1.x) / _shadowCoord_27.w))); + }; + result_9 = (result_9 + tmpvar_28); + vec4 tmpvar_31; + tmpvar_31.zw = vec2(0.0, 0.0); + tmpvar_31.xy = (vec2(-0.5, -1.5) * tmpvar_10); + vec4 _shadowCoord_32; + _shadowCoord_32 = (tmpvar_7 + tmpvar_31); + float tmpvar_33; + vec2 tmpvar_34; + tmpvar_34 = (_shadowCoord_32.xy / _shadowCoord_32.w); + bool tmpvar_35; + if (any(greaterThan (tmpvar_34, vec2(1.0, 1.0)))) { + tmpvar_35 = bool(1); + } else { + tmpvar_35 = any(lessThan (tmpvar_34, vec2(0.0, 0.0))); + }; + if (tmpvar_35) { + tmpvar_33 = 1.0; + } else { + tmpvar_33 = float((dot (texture2D (u_shadowMap0, tmpvar_34), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_32.z - u_params1.x) / _shadowCoord_32.w))); + }; + result_9 = (result_9 + tmpvar_33); + vec4 tmpvar_36; + tmpvar_36.zw = vec2(0.0, 0.0); + tmpvar_36.xy = (vec2(-0.5, -0.5) * tmpvar_10); + vec4 _shadowCoord_37; + _shadowCoord_37 = (tmpvar_7 + tmpvar_36); + float tmpvar_38; + vec2 tmpvar_39; + tmpvar_39 = (_shadowCoord_37.xy / _shadowCoord_37.w); + bool tmpvar_40; + if (any(greaterThan (tmpvar_39, vec2(1.0, 1.0)))) { + tmpvar_40 = bool(1); + } else { + tmpvar_40 = any(lessThan (tmpvar_39, vec2(0.0, 0.0))); + }; + if (tmpvar_40) { + tmpvar_38 = 1.0; + } else { + tmpvar_38 = float((dot (texture2D (u_shadowMap0, tmpvar_39), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_37.z - u_params1.x) / _shadowCoord_37.w))); + }; + result_9 = (result_9 + tmpvar_38); + vec4 tmpvar_41; + tmpvar_41.zw = vec2(0.0, 0.0); + tmpvar_41.xy = (vec2(-0.5, 0.5) * tmpvar_10); + vec4 _shadowCoord_42; + _shadowCoord_42 = (tmpvar_7 + tmpvar_41); + float tmpvar_43; + vec2 tmpvar_44; + tmpvar_44 = (_shadowCoord_42.xy / _shadowCoord_42.w); + bool tmpvar_45; + if (any(greaterThan (tmpvar_44, vec2(1.0, 1.0)))) { + tmpvar_45 = bool(1); + } else { + tmpvar_45 = any(lessThan (tmpvar_44, vec2(0.0, 0.0))); + }; + if (tmpvar_45) { + tmpvar_43 = 1.0; + } else { + tmpvar_43 = float((dot (texture2D (u_shadowMap0, tmpvar_44), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_42.z - u_params1.x) / _shadowCoord_42.w))); + }; + result_9 = (result_9 + tmpvar_43); + vec4 tmpvar_46; + tmpvar_46.zw = vec2(0.0, 0.0); + tmpvar_46.xy = (vec2(-0.5, 1.5) * tmpvar_10); + vec4 _shadowCoord_47; + _shadowCoord_47 = (tmpvar_7 + tmpvar_46); + float tmpvar_48; + vec2 tmpvar_49; + tmpvar_49 = (_shadowCoord_47.xy / _shadowCoord_47.w); + bool tmpvar_50; + if (any(greaterThan (tmpvar_49, vec2(1.0, 1.0)))) { + tmpvar_50 = bool(1); + } else { + tmpvar_50 = any(lessThan (tmpvar_49, vec2(0.0, 0.0))); + }; + if (tmpvar_50) { + tmpvar_48 = 1.0; + } else { + tmpvar_48 = float((dot (texture2D (u_shadowMap0, tmpvar_49), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_47.z - u_params1.x) / _shadowCoord_47.w))); + }; + result_9 = (result_9 + tmpvar_48); + vec4 tmpvar_51; + tmpvar_51.zw = vec2(0.0, 0.0); + tmpvar_51.xy = (vec2(0.5, -1.5) * tmpvar_10); + vec4 _shadowCoord_52; + _shadowCoord_52 = (tmpvar_7 + tmpvar_51); + float tmpvar_53; + vec2 tmpvar_54; + tmpvar_54 = (_shadowCoord_52.xy / _shadowCoord_52.w); + bool tmpvar_55; + if (any(greaterThan (tmpvar_54, vec2(1.0, 1.0)))) { + tmpvar_55 = bool(1); + } else { + tmpvar_55 = any(lessThan (tmpvar_54, vec2(0.0, 0.0))); + }; + if (tmpvar_55) { + tmpvar_53 = 1.0; + } else { + tmpvar_53 = float((dot (texture2D (u_shadowMap0, tmpvar_54), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_52.z - u_params1.x) / _shadowCoord_52.w))); + }; + result_9 = (result_9 + tmpvar_53); + vec4 tmpvar_56; + tmpvar_56.zw = vec2(0.0, 0.0); + tmpvar_56.xy = (vec2(0.5, -0.5) * tmpvar_10); + vec4 _shadowCoord_57; + _shadowCoord_57 = (tmpvar_7 + tmpvar_56); + float tmpvar_58; + vec2 tmpvar_59; + tmpvar_59 = (_shadowCoord_57.xy / _shadowCoord_57.w); + bool tmpvar_60; + if (any(greaterThan (tmpvar_59, vec2(1.0, 1.0)))) { + tmpvar_60 = bool(1); + } else { + tmpvar_60 = any(lessThan (tmpvar_59, vec2(0.0, 0.0))); + }; + if (tmpvar_60) { + tmpvar_58 = 1.0; + } else { + tmpvar_58 = float((dot (texture2D (u_shadowMap0, tmpvar_59), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_57.z - u_params1.x) / _shadowCoord_57.w))); + }; + result_9 = (result_9 + tmpvar_58); + vec4 tmpvar_61; + tmpvar_61.zw = vec2(0.0, 0.0); + tmpvar_61.xy = (vec2(0.5, 0.5) * tmpvar_10); + vec4 _shadowCoord_62; + _shadowCoord_62 = (tmpvar_7 + tmpvar_61); + float tmpvar_63; + vec2 tmpvar_64; + tmpvar_64 = (_shadowCoord_62.xy / _shadowCoord_62.w); + bool tmpvar_65; + if (any(greaterThan (tmpvar_64, vec2(1.0, 1.0)))) { + tmpvar_65 = bool(1); + } else { + tmpvar_65 = any(lessThan (tmpvar_64, vec2(0.0, 0.0))); + }; + if (tmpvar_65) { + tmpvar_63 = 1.0; + } else { + tmpvar_63 = float((dot (texture2D (u_shadowMap0, tmpvar_64), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_62.z - u_params1.x) / _shadowCoord_62.w))); + }; + result_9 = (result_9 + tmpvar_63); + vec4 tmpvar_66; + tmpvar_66.zw = vec2(0.0, 0.0); + tmpvar_66.xy = (vec2(0.5, 1.5) * tmpvar_10); + vec4 _shadowCoord_67; + _shadowCoord_67 = (tmpvar_7 + tmpvar_66); + float tmpvar_68; + vec2 tmpvar_69; + tmpvar_69 = (_shadowCoord_67.xy / _shadowCoord_67.w); + bool tmpvar_70; + if (any(greaterThan (tmpvar_69, vec2(1.0, 1.0)))) { + tmpvar_70 = bool(1); + } else { + tmpvar_70 = any(lessThan (tmpvar_69, vec2(0.0, 0.0))); + }; + if (tmpvar_70) { + tmpvar_68 = 1.0; + } else { + tmpvar_68 = float((dot (texture2D (u_shadowMap0, tmpvar_69), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_67.z - u_params1.x) / _shadowCoord_67.w))); + }; + result_9 = (result_9 + tmpvar_68); + vec4 tmpvar_71; + tmpvar_71.zw = vec2(0.0, 0.0); + tmpvar_71.xy = (vec2(1.5, -1.5) * tmpvar_10); + vec4 _shadowCoord_72; + _shadowCoord_72 = (tmpvar_7 + tmpvar_71); + float tmpvar_73; + vec2 tmpvar_74; + tmpvar_74 = (_shadowCoord_72.xy / _shadowCoord_72.w); + bool tmpvar_75; + if (any(greaterThan (tmpvar_74, vec2(1.0, 1.0)))) { + tmpvar_75 = bool(1); + } else { + tmpvar_75 = any(lessThan (tmpvar_74, vec2(0.0, 0.0))); + }; + if (tmpvar_75) { + tmpvar_73 = 1.0; + } else { + tmpvar_73 = float((dot (texture2D (u_shadowMap0, tmpvar_74), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_72.z - u_params1.x) / _shadowCoord_72.w))); + }; + result_9 = (result_9 + tmpvar_73); + vec4 tmpvar_76; + tmpvar_76.zw = vec2(0.0, 0.0); + tmpvar_76.xy = (vec2(1.5, -0.5) * tmpvar_10); + vec4 _shadowCoord_77; + _shadowCoord_77 = (tmpvar_7 + tmpvar_76); + float tmpvar_78; + vec2 tmpvar_79; + tmpvar_79 = (_shadowCoord_77.xy / _shadowCoord_77.w); + bool tmpvar_80; + if (any(greaterThan (tmpvar_79, vec2(1.0, 1.0)))) { + tmpvar_80 = bool(1); + } else { + tmpvar_80 = any(lessThan (tmpvar_79, vec2(0.0, 0.0))); + }; + if (tmpvar_80) { + tmpvar_78 = 1.0; + } else { + tmpvar_78 = float((dot (texture2D (u_shadowMap0, tmpvar_79), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_77.z - u_params1.x) / _shadowCoord_77.w))); + }; + result_9 = (result_9 + tmpvar_78); + vec4 tmpvar_81; + tmpvar_81.zw = vec2(0.0, 0.0); + tmpvar_81.xy = (vec2(1.5, 0.5) * tmpvar_10); + vec4 _shadowCoord_82; + _shadowCoord_82 = (tmpvar_7 + tmpvar_81); + float tmpvar_83; + vec2 tmpvar_84; + tmpvar_84 = (_shadowCoord_82.xy / _shadowCoord_82.w); + bool tmpvar_85; + if (any(greaterThan (tmpvar_84, vec2(1.0, 1.0)))) { + tmpvar_85 = bool(1); + } else { + tmpvar_85 = any(lessThan (tmpvar_84, vec2(0.0, 0.0))); + }; + if (tmpvar_85) { + tmpvar_83 = 1.0; + } else { + tmpvar_83 = float((dot (texture2D (u_shadowMap0, tmpvar_84), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_82.z - u_params1.x) / _shadowCoord_82.w))); + }; + result_9 = (result_9 + tmpvar_83); + vec4 tmpvar_86; + tmpvar_86.zw = vec2(0.0, 0.0); + tmpvar_86.xy = (vec2(1.5, 1.5) * tmpvar_10); + vec4 _shadowCoord_87; + _shadowCoord_87 = (tmpvar_7 + tmpvar_86); + float tmpvar_88; + vec2 tmpvar_89; + tmpvar_89 = (_shadowCoord_87.xy / _shadowCoord_87.w); + bool tmpvar_90; + if (any(greaterThan (tmpvar_89, vec2(1.0, 1.0)))) { + tmpvar_90 = bool(1); + } else { + tmpvar_90 = any(lessThan (tmpvar_89, vec2(0.0, 0.0))); + }; + if (tmpvar_90) { + tmpvar_88 = 1.0; + } else { + tmpvar_88 = float((dot (texture2D (u_shadowMap0, tmpvar_89), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_87.z - u_params1.x) / _shadowCoord_87.w))); + }; + float tmpvar_91; + tmpvar_91 = (result_9 + tmpvar_88); + result_9 = tmpvar_91; + tmpvar_8 = (tmpvar_91 / 16.0); + vec3 tmpvar_92; + tmpvar_92 = -(normalize(v_view)); + vec3 tmpvar_93; + float tmpvar_94; + tmpvar_93 = -(normalize(u_lightPosition.xyz)); + tmpvar_94 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_95; + tmpvar_95 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_96; + tmpvar_96 = normalize(tmpvar_95); + tmpvar_93 = tmpvar_96; + float tmpvar_97; + tmpvar_97 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_98; + tmpvar_98 = sqrt(dot (tmpvar_95, tmpvar_95)); + tmpvar_94 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_98)) + ((u_lightAttenuationSpotOuter.z * tmpvar_98) * tmpvar_98)))) * mix (clamp (((max (0.0, dot (-(tmpvar_96), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_97) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_97)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_99; + tmpvar_99 = dot (v_normal, tmpvar_93); + vec2 tmpvar_100; + tmpvar_100.x = tmpvar_99; + tmpvar_100.y = (((float((tmpvar_99 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_99) * v_normal) - tmpvar_93), tmpvar_92)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_101; + tmpvar_101 = (max (tmpvar_100, 0.0) * tmpvar_94); + float tmpvar_102; + tmpvar_102 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_101.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_101.y)) * u_color.xyz) * tmpvar_8))), vec3(0.454545, 0.454545, 0.454545)) + (tmpvar_6 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_102) * tmpvar_102)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin new file mode 100644 index 000000000..f00fc32f5 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_csm.bin @@ -0,0 +1,1508 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); + } else { + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); + } else { + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + vec4 tmpvar_21; + tmpvar_21.w = 1.0; + tmpvar_21.xy = (v_texcoord1.xy / v_texcoord1.w); + tmpvar_21.z = v_texcoord1.z; + float result_22; + result_22 = 0.0; + vec2 tmpvar_23; + tmpvar_23 = (u_smSamplingParams.zw * u_params2.zz); + vec4 tmpvar_24; + tmpvar_24.zw = vec2(0.0, 0.0); + tmpvar_24.xy = (vec2(-1.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_25; + _shadowCoord_25 = (tmpvar_21 + tmpvar_24); + float tmpvar_26; + vec2 tmpvar_27; + tmpvar_27 = (_shadowCoord_25.xy / _shadowCoord_25.w); + bool tmpvar_28; + if (any(greaterThan (tmpvar_27, vec2(1.0, 1.0)))) { + tmpvar_28 = bool(1); + } else { + tmpvar_28 = any(lessThan (tmpvar_27, vec2(0.0, 0.0))); + }; + if (tmpvar_28) { + tmpvar_26 = 1.0; + } else { + tmpvar_26 = float((dot (texture2D (u_shadowMap0, tmpvar_27), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_25.z - u_params1.x) / _shadowCoord_25.w))); + }; + result_22 = tmpvar_26; + vec4 tmpvar_29; + tmpvar_29.zw = vec2(0.0, 0.0); + tmpvar_29.xy = (vec2(-1.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_30; + _shadowCoord_30 = (tmpvar_21 + tmpvar_29); + float tmpvar_31; + vec2 tmpvar_32; + tmpvar_32 = (_shadowCoord_30.xy / _shadowCoord_30.w); + bool tmpvar_33; + if (any(greaterThan (tmpvar_32, vec2(1.0, 1.0)))) { + tmpvar_33 = bool(1); + } else { + tmpvar_33 = any(lessThan (tmpvar_32, vec2(0.0, 0.0))); + }; + if (tmpvar_33) { + tmpvar_31 = 1.0; + } else { + tmpvar_31 = float((dot (texture2D (u_shadowMap0, tmpvar_32), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_30.z - u_params1.x) / _shadowCoord_30.w))); + }; + result_22 = (tmpvar_26 + tmpvar_31); + vec4 tmpvar_34; + tmpvar_34.zw = vec2(0.0, 0.0); + tmpvar_34.xy = (vec2(-1.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_35; + _shadowCoord_35 = (tmpvar_21 + tmpvar_34); + float tmpvar_36; + vec2 tmpvar_37; + tmpvar_37 = (_shadowCoord_35.xy / _shadowCoord_35.w); + bool tmpvar_38; + if (any(greaterThan (tmpvar_37, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_37, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_36 = 1.0; + } else { + tmpvar_36 = float((dot (texture2D (u_shadowMap0, tmpvar_37), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_35.z - u_params1.x) / _shadowCoord_35.w))); + }; + result_22 = (result_22 + tmpvar_36); + vec4 tmpvar_39; + tmpvar_39.zw = vec2(0.0, 0.0); + tmpvar_39.xy = (vec2(-1.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_40; + _shadowCoord_40 = (tmpvar_21 + tmpvar_39); + float tmpvar_41; + vec2 tmpvar_42; + tmpvar_42 = (_shadowCoord_40.xy / _shadowCoord_40.w); + bool tmpvar_43; + if (any(greaterThan (tmpvar_42, vec2(1.0, 1.0)))) { + tmpvar_43 = bool(1); + } else { + tmpvar_43 = any(lessThan (tmpvar_42, vec2(0.0, 0.0))); + }; + if (tmpvar_43) { + tmpvar_41 = 1.0; + } else { + tmpvar_41 = float((dot (texture2D (u_shadowMap0, tmpvar_42), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_40.z - u_params1.x) / _shadowCoord_40.w))); + }; + result_22 = (result_22 + tmpvar_41); + vec4 tmpvar_44; + tmpvar_44.zw = vec2(0.0, 0.0); + tmpvar_44.xy = (vec2(-0.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_45; + _shadowCoord_45 = (tmpvar_21 + tmpvar_44); + float tmpvar_46; + vec2 tmpvar_47; + tmpvar_47 = (_shadowCoord_45.xy / _shadowCoord_45.w); + bool tmpvar_48; + if (any(greaterThan (tmpvar_47, vec2(1.0, 1.0)))) { + tmpvar_48 = bool(1); + } else { + tmpvar_48 = any(lessThan (tmpvar_47, vec2(0.0, 0.0))); + }; + if (tmpvar_48) { + tmpvar_46 = 1.0; + } else { + tmpvar_46 = float((dot (texture2D (u_shadowMap0, tmpvar_47), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_45.z - u_params1.x) / _shadowCoord_45.w))); + }; + result_22 = (result_22 + tmpvar_46); + vec4 tmpvar_49; + tmpvar_49.zw = vec2(0.0, 0.0); + tmpvar_49.xy = (vec2(-0.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_50; + _shadowCoord_50 = (tmpvar_21 + tmpvar_49); + float tmpvar_51; + vec2 tmpvar_52; + tmpvar_52 = (_shadowCoord_50.xy / _shadowCoord_50.w); + bool tmpvar_53; + if (any(greaterThan (tmpvar_52, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_52, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_51 = 1.0; + } else { + tmpvar_51 = float((dot (texture2D (u_shadowMap0, tmpvar_52), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_50.z - u_params1.x) / _shadowCoord_50.w))); + }; + result_22 = (result_22 + tmpvar_51); + vec4 tmpvar_54; + tmpvar_54.zw = vec2(0.0, 0.0); + tmpvar_54.xy = (vec2(-0.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_55; + _shadowCoord_55 = (tmpvar_21 + tmpvar_54); + float tmpvar_56; + vec2 tmpvar_57; + tmpvar_57 = (_shadowCoord_55.xy / _shadowCoord_55.w); + bool tmpvar_58; + if (any(greaterThan (tmpvar_57, vec2(1.0, 1.0)))) { + tmpvar_58 = bool(1); + } else { + tmpvar_58 = any(lessThan (tmpvar_57, vec2(0.0, 0.0))); + }; + if (tmpvar_58) { + tmpvar_56 = 1.0; + } else { + tmpvar_56 = float((dot (texture2D (u_shadowMap0, tmpvar_57), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_55.z - u_params1.x) / _shadowCoord_55.w))); + }; + result_22 = (result_22 + tmpvar_56); + vec4 tmpvar_59; + tmpvar_59.zw = vec2(0.0, 0.0); + tmpvar_59.xy = (vec2(-0.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_60; + _shadowCoord_60 = (tmpvar_21 + tmpvar_59); + float tmpvar_61; + vec2 tmpvar_62; + tmpvar_62 = (_shadowCoord_60.xy / _shadowCoord_60.w); + bool tmpvar_63; + if (any(greaterThan (tmpvar_62, vec2(1.0, 1.0)))) { + tmpvar_63 = bool(1); + } else { + tmpvar_63 = any(lessThan (tmpvar_62, vec2(0.0, 0.0))); + }; + if (tmpvar_63) { + tmpvar_61 = 1.0; + } else { + tmpvar_61 = float((dot (texture2D (u_shadowMap0, tmpvar_62), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_60.z - u_params1.x) / _shadowCoord_60.w))); + }; + result_22 = (result_22 + tmpvar_61); + vec4 tmpvar_64; + tmpvar_64.zw = vec2(0.0, 0.0); + tmpvar_64.xy = (vec2(0.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_65; + _shadowCoord_65 = (tmpvar_21 + tmpvar_64); + float tmpvar_66; + vec2 tmpvar_67; + tmpvar_67 = (_shadowCoord_65.xy / _shadowCoord_65.w); + bool tmpvar_68; + if (any(greaterThan (tmpvar_67, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_67, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_66 = 1.0; + } else { + tmpvar_66 = float((dot (texture2D (u_shadowMap0, tmpvar_67), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_65.z - u_params1.x) / _shadowCoord_65.w))); + }; + result_22 = (result_22 + tmpvar_66); + vec4 tmpvar_69; + tmpvar_69.zw = vec2(0.0, 0.0); + tmpvar_69.xy = (vec2(0.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_70; + _shadowCoord_70 = (tmpvar_21 + tmpvar_69); + float tmpvar_71; + vec2 tmpvar_72; + tmpvar_72 = (_shadowCoord_70.xy / _shadowCoord_70.w); + bool tmpvar_73; + if (any(greaterThan (tmpvar_72, vec2(1.0, 1.0)))) { + tmpvar_73 = bool(1); + } else { + tmpvar_73 = any(lessThan (tmpvar_72, vec2(0.0, 0.0))); + }; + if (tmpvar_73) { + tmpvar_71 = 1.0; + } else { + tmpvar_71 = float((dot (texture2D (u_shadowMap0, tmpvar_72), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_70.z - u_params1.x) / _shadowCoord_70.w))); + }; + result_22 = (result_22 + tmpvar_71); + vec4 tmpvar_74; + tmpvar_74.zw = vec2(0.0, 0.0); + tmpvar_74.xy = (vec2(0.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_75; + _shadowCoord_75 = (tmpvar_21 + tmpvar_74); + float tmpvar_76; + vec2 tmpvar_77; + tmpvar_77 = (_shadowCoord_75.xy / _shadowCoord_75.w); + bool tmpvar_78; + if (any(greaterThan (tmpvar_77, vec2(1.0, 1.0)))) { + tmpvar_78 = bool(1); + } else { + tmpvar_78 = any(lessThan (tmpvar_77, vec2(0.0, 0.0))); + }; + if (tmpvar_78) { + tmpvar_76 = 1.0; + } else { + tmpvar_76 = float((dot (texture2D (u_shadowMap0, tmpvar_77), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_75.z - u_params1.x) / _shadowCoord_75.w))); + }; + result_22 = (result_22 + tmpvar_76); + vec4 tmpvar_79; + tmpvar_79.zw = vec2(0.0, 0.0); + tmpvar_79.xy = (vec2(0.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_80; + _shadowCoord_80 = (tmpvar_21 + tmpvar_79); + float tmpvar_81; + vec2 tmpvar_82; + tmpvar_82 = (_shadowCoord_80.xy / _shadowCoord_80.w); + bool tmpvar_83; + if (any(greaterThan (tmpvar_82, vec2(1.0, 1.0)))) { + tmpvar_83 = bool(1); + } else { + tmpvar_83 = any(lessThan (tmpvar_82, vec2(0.0, 0.0))); + }; + if (tmpvar_83) { + tmpvar_81 = 1.0; + } else { + tmpvar_81 = float((dot (texture2D (u_shadowMap0, tmpvar_82), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_80.z - u_params1.x) / _shadowCoord_80.w))); + }; + result_22 = (result_22 + tmpvar_81); + vec4 tmpvar_84; + tmpvar_84.zw = vec2(0.0, 0.0); + tmpvar_84.xy = (vec2(1.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_85; + _shadowCoord_85 = (tmpvar_21 + tmpvar_84); + float tmpvar_86; + vec2 tmpvar_87; + tmpvar_87 = (_shadowCoord_85.xy / _shadowCoord_85.w); + bool tmpvar_88; + if (any(greaterThan (tmpvar_87, vec2(1.0, 1.0)))) { + tmpvar_88 = bool(1); + } else { + tmpvar_88 = any(lessThan (tmpvar_87, vec2(0.0, 0.0))); + }; + if (tmpvar_88) { + tmpvar_86 = 1.0; + } else { + tmpvar_86 = float((dot (texture2D (u_shadowMap0, tmpvar_87), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_85.z - u_params1.x) / _shadowCoord_85.w))); + }; + result_22 = (result_22 + tmpvar_86); + vec4 tmpvar_89; + tmpvar_89.zw = vec2(0.0, 0.0); + tmpvar_89.xy = (vec2(1.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_90; + _shadowCoord_90 = (tmpvar_21 + tmpvar_89); + float tmpvar_91; + vec2 tmpvar_92; + tmpvar_92 = (_shadowCoord_90.xy / _shadowCoord_90.w); + bool tmpvar_93; + if (any(greaterThan (tmpvar_92, vec2(1.0, 1.0)))) { + tmpvar_93 = bool(1); + } else { + tmpvar_93 = any(lessThan (tmpvar_92, vec2(0.0, 0.0))); + }; + if (tmpvar_93) { + tmpvar_91 = 1.0; + } else { + tmpvar_91 = float((dot (texture2D (u_shadowMap0, tmpvar_92), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_90.z - u_params1.x) / _shadowCoord_90.w))); + }; + result_22 = (result_22 + tmpvar_91); + vec4 tmpvar_94; + tmpvar_94.zw = vec2(0.0, 0.0); + tmpvar_94.xy = (vec2(1.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_95; + _shadowCoord_95 = (tmpvar_21 + tmpvar_94); + float tmpvar_96; + vec2 tmpvar_97; + tmpvar_97 = (_shadowCoord_95.xy / _shadowCoord_95.w); + bool tmpvar_98; + if (any(greaterThan (tmpvar_97, vec2(1.0, 1.0)))) { + tmpvar_98 = bool(1); + } else { + tmpvar_98 = any(lessThan (tmpvar_97, vec2(0.0, 0.0))); + }; + if (tmpvar_98) { + tmpvar_96 = 1.0; + } else { + tmpvar_96 = float((dot (texture2D (u_shadowMap0, tmpvar_97), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_95.z - u_params1.x) / _shadowCoord_95.w))); + }; + result_22 = (result_22 + tmpvar_96); + vec4 tmpvar_99; + tmpvar_99.zw = vec2(0.0, 0.0); + tmpvar_99.xy = (vec2(1.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_100; + _shadowCoord_100 = (tmpvar_21 + tmpvar_99); + float tmpvar_101; + vec2 tmpvar_102; + tmpvar_102 = (_shadowCoord_100.xy / _shadowCoord_100.w); + bool tmpvar_103; + if (any(greaterThan (tmpvar_102, vec2(1.0, 1.0)))) { + tmpvar_103 = bool(1); + } else { + tmpvar_103 = any(lessThan (tmpvar_102, vec2(0.0, 0.0))); + }; + if (tmpvar_103) { + tmpvar_101 = 1.0; + } else { + tmpvar_101 = float((dot (texture2D (u_shadowMap0, tmpvar_102), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_100.z - u_params1.x) / _shadowCoord_100.w))); + }; + float tmpvar_104; + tmpvar_104 = (result_22 + tmpvar_101); + result_22 = tmpvar_104; + visibility_1 = (tmpvar_104 / 16.0); + } else { + if (tmpvar_10) { + vec2 _texcoord_105; + _texcoord_105 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_106; + tmpvar_106 = greaterThan (_texcoord_105, vec2(0.0, 0.0)); + bool tmpvar_107; + if ((tmpvar_106.x && tmpvar_106.y)) { + bvec2 tmpvar_108; + tmpvar_108 = lessThan (_texcoord_105, vec2(1.0, 1.0)); + tmpvar_107 = (tmpvar_108.x && tmpvar_108.y); + } else { + tmpvar_107 = bool(0); + }; + float tmpvar_109; + tmpvar_109 = (float(tmpvar_107) * 0.4); + vec3 tmpvar_110; + tmpvar_110.x = tmpvar_109; + tmpvar_110.y = tmpvar_109; + tmpvar_110.z = -(tmpvar_109); + colorCoverage_2 = tmpvar_110; + vec4 tmpvar_111; + tmpvar_111.w = 1.0; + tmpvar_111.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_111.z = v_texcoord2.z; + float result_112; + result_112 = 0.0; + vec2 tmpvar_113; + tmpvar_113 = (u_smSamplingParams.zw * (u_params2.zz / 2.0)); + vec4 tmpvar_114; + tmpvar_114.zw = vec2(0.0, 0.0); + tmpvar_114.xy = (vec2(-1.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_115; + _shadowCoord_115 = (tmpvar_111 + tmpvar_114); + float tmpvar_116; + vec2 tmpvar_117; + tmpvar_117 = (_shadowCoord_115.xy / _shadowCoord_115.w); + bool tmpvar_118; + if (any(greaterThan (tmpvar_117, vec2(1.0, 1.0)))) { + tmpvar_118 = bool(1); + } else { + tmpvar_118 = any(lessThan (tmpvar_117, vec2(0.0, 0.0))); + }; + if (tmpvar_118) { + tmpvar_116 = 1.0; + } else { + tmpvar_116 = float((dot (texture2D (u_shadowMap1, tmpvar_117), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_115.z - u_params1.x) / _shadowCoord_115.w))); + }; + result_112 = tmpvar_116; + vec4 tmpvar_119; + tmpvar_119.zw = vec2(0.0, 0.0); + tmpvar_119.xy = (vec2(-1.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_120; + _shadowCoord_120 = (tmpvar_111 + tmpvar_119); + float tmpvar_121; + vec2 tmpvar_122; + tmpvar_122 = (_shadowCoord_120.xy / _shadowCoord_120.w); + bool tmpvar_123; + if (any(greaterThan (tmpvar_122, vec2(1.0, 1.0)))) { + tmpvar_123 = bool(1); + } else { + tmpvar_123 = any(lessThan (tmpvar_122, vec2(0.0, 0.0))); + }; + if (tmpvar_123) { + tmpvar_121 = 1.0; + } else { + tmpvar_121 = float((dot (texture2D (u_shadowMap1, tmpvar_122), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_120.z - u_params1.x) / _shadowCoord_120.w))); + }; + result_112 = (tmpvar_116 + tmpvar_121); + vec4 tmpvar_124; + tmpvar_124.zw = vec2(0.0, 0.0); + tmpvar_124.xy = (vec2(-1.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_125; + _shadowCoord_125 = (tmpvar_111 + tmpvar_124); + float tmpvar_126; + vec2 tmpvar_127; + tmpvar_127 = (_shadowCoord_125.xy / _shadowCoord_125.w); + bool tmpvar_128; + if (any(greaterThan (tmpvar_127, vec2(1.0, 1.0)))) { + tmpvar_128 = bool(1); + } else { + tmpvar_128 = any(lessThan (tmpvar_127, vec2(0.0, 0.0))); + }; + if (tmpvar_128) { + tmpvar_126 = 1.0; + } else { + tmpvar_126 = float((dot (texture2D (u_shadowMap1, tmpvar_127), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_125.z - u_params1.x) / _shadowCoord_125.w))); + }; + result_112 = (result_112 + tmpvar_126); + vec4 tmpvar_129; + tmpvar_129.zw = vec2(0.0, 0.0); + tmpvar_129.xy = (vec2(-1.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_130; + _shadowCoord_130 = (tmpvar_111 + tmpvar_129); + float tmpvar_131; + vec2 tmpvar_132; + tmpvar_132 = (_shadowCoord_130.xy / _shadowCoord_130.w); + bool tmpvar_133; + if (any(greaterThan (tmpvar_132, vec2(1.0, 1.0)))) { + tmpvar_133 = bool(1); + } else { + tmpvar_133 = any(lessThan (tmpvar_132, vec2(0.0, 0.0))); + }; + if (tmpvar_133) { + tmpvar_131 = 1.0; + } else { + tmpvar_131 = float((dot (texture2D (u_shadowMap1, tmpvar_132), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_130.z - u_params1.x) / _shadowCoord_130.w))); + }; + result_112 = (result_112 + tmpvar_131); + vec4 tmpvar_134; + tmpvar_134.zw = vec2(0.0, 0.0); + tmpvar_134.xy = (vec2(-0.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_135; + _shadowCoord_135 = (tmpvar_111 + tmpvar_134); + float tmpvar_136; + vec2 tmpvar_137; + tmpvar_137 = (_shadowCoord_135.xy / _shadowCoord_135.w); + bool tmpvar_138; + if (any(greaterThan (tmpvar_137, vec2(1.0, 1.0)))) { + tmpvar_138 = bool(1); + } else { + tmpvar_138 = any(lessThan (tmpvar_137, vec2(0.0, 0.0))); + }; + if (tmpvar_138) { + tmpvar_136 = 1.0; + } else { + tmpvar_136 = float((dot (texture2D (u_shadowMap1, tmpvar_137), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_135.z - u_params1.x) / _shadowCoord_135.w))); + }; + result_112 = (result_112 + tmpvar_136); + vec4 tmpvar_139; + tmpvar_139.zw = vec2(0.0, 0.0); + tmpvar_139.xy = (vec2(-0.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_140; + _shadowCoord_140 = (tmpvar_111 + tmpvar_139); + float tmpvar_141; + vec2 tmpvar_142; + tmpvar_142 = (_shadowCoord_140.xy / _shadowCoord_140.w); + bool tmpvar_143; + if (any(greaterThan (tmpvar_142, vec2(1.0, 1.0)))) { + tmpvar_143 = bool(1); + } else { + tmpvar_143 = any(lessThan (tmpvar_142, vec2(0.0, 0.0))); + }; + if (tmpvar_143) { + tmpvar_141 = 1.0; + } else { + tmpvar_141 = float((dot (texture2D (u_shadowMap1, tmpvar_142), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_140.z - u_params1.x) / _shadowCoord_140.w))); + }; + result_112 = (result_112 + tmpvar_141); + vec4 tmpvar_144; + tmpvar_144.zw = vec2(0.0, 0.0); + tmpvar_144.xy = (vec2(-0.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_145; + _shadowCoord_145 = (tmpvar_111 + tmpvar_144); + float tmpvar_146; + vec2 tmpvar_147; + tmpvar_147 = (_shadowCoord_145.xy / _shadowCoord_145.w); + bool tmpvar_148; + if (any(greaterThan (tmpvar_147, vec2(1.0, 1.0)))) { + tmpvar_148 = bool(1); + } else { + tmpvar_148 = any(lessThan (tmpvar_147, vec2(0.0, 0.0))); + }; + if (tmpvar_148) { + tmpvar_146 = 1.0; + } else { + tmpvar_146 = float((dot (texture2D (u_shadowMap1, tmpvar_147), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_145.z - u_params1.x) / _shadowCoord_145.w))); + }; + result_112 = (result_112 + tmpvar_146); + vec4 tmpvar_149; + tmpvar_149.zw = vec2(0.0, 0.0); + tmpvar_149.xy = (vec2(-0.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_150; + _shadowCoord_150 = (tmpvar_111 + tmpvar_149); + float tmpvar_151; + vec2 tmpvar_152; + tmpvar_152 = (_shadowCoord_150.xy / _shadowCoord_150.w); + bool tmpvar_153; + if (any(greaterThan (tmpvar_152, vec2(1.0, 1.0)))) { + tmpvar_153 = bool(1); + } else { + tmpvar_153 = any(lessThan (tmpvar_152, vec2(0.0, 0.0))); + }; + if (tmpvar_153) { + tmpvar_151 = 1.0; + } else { + tmpvar_151 = float((dot (texture2D (u_shadowMap1, tmpvar_152), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_150.z - u_params1.x) / _shadowCoord_150.w))); + }; + result_112 = (result_112 + tmpvar_151); + vec4 tmpvar_154; + tmpvar_154.zw = vec2(0.0, 0.0); + tmpvar_154.xy = (vec2(0.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_155; + _shadowCoord_155 = (tmpvar_111 + tmpvar_154); + float tmpvar_156; + vec2 tmpvar_157; + tmpvar_157 = (_shadowCoord_155.xy / _shadowCoord_155.w); + bool tmpvar_158; + if (any(greaterThan (tmpvar_157, vec2(1.0, 1.0)))) { + tmpvar_158 = bool(1); + } else { + tmpvar_158 = any(lessThan (tmpvar_157, vec2(0.0, 0.0))); + }; + if (tmpvar_158) { + tmpvar_156 = 1.0; + } else { + tmpvar_156 = float((dot (texture2D (u_shadowMap1, tmpvar_157), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_155.z - u_params1.x) / _shadowCoord_155.w))); + }; + result_112 = (result_112 + tmpvar_156); + vec4 tmpvar_159; + tmpvar_159.zw = vec2(0.0, 0.0); + tmpvar_159.xy = (vec2(0.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_160; + _shadowCoord_160 = (tmpvar_111 + tmpvar_159); + float tmpvar_161; + vec2 tmpvar_162; + tmpvar_162 = (_shadowCoord_160.xy / _shadowCoord_160.w); + bool tmpvar_163; + if (any(greaterThan (tmpvar_162, vec2(1.0, 1.0)))) { + tmpvar_163 = bool(1); + } else { + tmpvar_163 = any(lessThan (tmpvar_162, vec2(0.0, 0.0))); + }; + if (tmpvar_163) { + tmpvar_161 = 1.0; + } else { + tmpvar_161 = float((dot (texture2D (u_shadowMap1, tmpvar_162), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_160.z - u_params1.x) / _shadowCoord_160.w))); + }; + result_112 = (result_112 + tmpvar_161); + vec4 tmpvar_164; + tmpvar_164.zw = vec2(0.0, 0.0); + tmpvar_164.xy = (vec2(0.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_165; + _shadowCoord_165 = (tmpvar_111 + tmpvar_164); + float tmpvar_166; + vec2 tmpvar_167; + tmpvar_167 = (_shadowCoord_165.xy / _shadowCoord_165.w); + bool tmpvar_168; + if (any(greaterThan (tmpvar_167, vec2(1.0, 1.0)))) { + tmpvar_168 = bool(1); + } else { + tmpvar_168 = any(lessThan (tmpvar_167, vec2(0.0, 0.0))); + }; + if (tmpvar_168) { + tmpvar_166 = 1.0; + } else { + tmpvar_166 = float((dot (texture2D (u_shadowMap1, tmpvar_167), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_165.z - u_params1.x) / _shadowCoord_165.w))); + }; + result_112 = (result_112 + tmpvar_166); + vec4 tmpvar_169; + tmpvar_169.zw = vec2(0.0, 0.0); + tmpvar_169.xy = (vec2(0.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_170; + _shadowCoord_170 = (tmpvar_111 + tmpvar_169); + float tmpvar_171; + vec2 tmpvar_172; + tmpvar_172 = (_shadowCoord_170.xy / _shadowCoord_170.w); + bool tmpvar_173; + if (any(greaterThan (tmpvar_172, vec2(1.0, 1.0)))) { + tmpvar_173 = bool(1); + } else { + tmpvar_173 = any(lessThan (tmpvar_172, vec2(0.0, 0.0))); + }; + if (tmpvar_173) { + tmpvar_171 = 1.0; + } else { + tmpvar_171 = float((dot (texture2D (u_shadowMap1, tmpvar_172), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_170.z - u_params1.x) / _shadowCoord_170.w))); + }; + result_112 = (result_112 + tmpvar_171); + vec4 tmpvar_174; + tmpvar_174.zw = vec2(0.0, 0.0); + tmpvar_174.xy = (vec2(1.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_175; + _shadowCoord_175 = (tmpvar_111 + tmpvar_174); + float tmpvar_176; + vec2 tmpvar_177; + tmpvar_177 = (_shadowCoord_175.xy / _shadowCoord_175.w); + bool tmpvar_178; + if (any(greaterThan (tmpvar_177, vec2(1.0, 1.0)))) { + tmpvar_178 = bool(1); + } else { + tmpvar_178 = any(lessThan (tmpvar_177, vec2(0.0, 0.0))); + }; + if (tmpvar_178) { + tmpvar_176 = 1.0; + } else { + tmpvar_176 = float((dot (texture2D (u_shadowMap1, tmpvar_177), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_175.z - u_params1.x) / _shadowCoord_175.w))); + }; + result_112 = (result_112 + tmpvar_176); + vec4 tmpvar_179; + tmpvar_179.zw = vec2(0.0, 0.0); + tmpvar_179.xy = (vec2(1.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_180; + _shadowCoord_180 = (tmpvar_111 + tmpvar_179); + float tmpvar_181; + vec2 tmpvar_182; + tmpvar_182 = (_shadowCoord_180.xy / _shadowCoord_180.w); + bool tmpvar_183; + if (any(greaterThan (tmpvar_182, vec2(1.0, 1.0)))) { + tmpvar_183 = bool(1); + } else { + tmpvar_183 = any(lessThan (tmpvar_182, vec2(0.0, 0.0))); + }; + if (tmpvar_183) { + tmpvar_181 = 1.0; + } else { + tmpvar_181 = float((dot (texture2D (u_shadowMap1, tmpvar_182), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_180.z - u_params1.x) / _shadowCoord_180.w))); + }; + result_112 = (result_112 + tmpvar_181); + vec4 tmpvar_184; + tmpvar_184.zw = vec2(0.0, 0.0); + tmpvar_184.xy = (vec2(1.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_185; + _shadowCoord_185 = (tmpvar_111 + tmpvar_184); + float tmpvar_186; + vec2 tmpvar_187; + tmpvar_187 = (_shadowCoord_185.xy / _shadowCoord_185.w); + bool tmpvar_188; + if (any(greaterThan (tmpvar_187, vec2(1.0, 1.0)))) { + tmpvar_188 = bool(1); + } else { + tmpvar_188 = any(lessThan (tmpvar_187, vec2(0.0, 0.0))); + }; + if (tmpvar_188) { + tmpvar_186 = 1.0; + } else { + tmpvar_186 = float((dot (texture2D (u_shadowMap1, tmpvar_187), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_185.z - u_params1.x) / _shadowCoord_185.w))); + }; + result_112 = (result_112 + tmpvar_186); + vec4 tmpvar_189; + tmpvar_189.zw = vec2(0.0, 0.0); + tmpvar_189.xy = (vec2(1.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_190; + _shadowCoord_190 = (tmpvar_111 + tmpvar_189); + float tmpvar_191; + vec2 tmpvar_192; + tmpvar_192 = (_shadowCoord_190.xy / _shadowCoord_190.w); + bool tmpvar_193; + if (any(greaterThan (tmpvar_192, vec2(1.0, 1.0)))) { + tmpvar_193 = bool(1); + } else { + tmpvar_193 = any(lessThan (tmpvar_192, vec2(0.0, 0.0))); + }; + if (tmpvar_193) { + tmpvar_191 = 1.0; + } else { + tmpvar_191 = float((dot (texture2D (u_shadowMap1, tmpvar_192), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_190.z - u_params1.x) / _shadowCoord_190.w))); + }; + float tmpvar_194; + tmpvar_194 = (result_112 + tmpvar_191); + result_112 = tmpvar_194; + visibility_1 = (tmpvar_194 / 16.0); + } else { + if (tmpvar_13) { + vec2 _texcoord_195; + _texcoord_195 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_196; + tmpvar_196 = greaterThan (_texcoord_195, vec2(0.0, 0.0)); + bool tmpvar_197; + if ((tmpvar_196.x && tmpvar_196.y)) { + bvec2 tmpvar_198; + tmpvar_198 = lessThan (_texcoord_195, vec2(1.0, 1.0)); + tmpvar_197 = (tmpvar_198.x && tmpvar_198.y); + } else { + tmpvar_197 = bool(0); + }; + float tmpvar_199; + tmpvar_199 = (float(tmpvar_197) * 0.4); + vec3 tmpvar_200; + tmpvar_200.x = -(tmpvar_199); + tmpvar_200.y = -(tmpvar_199); + tmpvar_200.z = tmpvar_199; + colorCoverage_2 = tmpvar_200; + vec4 tmpvar_201; + tmpvar_201.w = 1.0; + tmpvar_201.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_201.z = v_texcoord3.z; + float result_202; + result_202 = 0.0; + vec2 tmpvar_203; + tmpvar_203 = (u_smSamplingParams.zw * (u_params2.zz / 3.0)); + vec4 tmpvar_204; + tmpvar_204.zw = vec2(0.0, 0.0); + tmpvar_204.xy = (vec2(-1.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_205; + _shadowCoord_205 = (tmpvar_201 + tmpvar_204); + float tmpvar_206; + vec2 tmpvar_207; + tmpvar_207 = (_shadowCoord_205.xy / _shadowCoord_205.w); + bool tmpvar_208; + if (any(greaterThan (tmpvar_207, vec2(1.0, 1.0)))) { + tmpvar_208 = bool(1); + } else { + tmpvar_208 = any(lessThan (tmpvar_207, vec2(0.0, 0.0))); + }; + if (tmpvar_208) { + tmpvar_206 = 1.0; + } else { + tmpvar_206 = float((dot (texture2D (u_shadowMap2, tmpvar_207), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_205.z - u_params1.x) / _shadowCoord_205.w))); + }; + result_202 = tmpvar_206; + vec4 tmpvar_209; + tmpvar_209.zw = vec2(0.0, 0.0); + tmpvar_209.xy = (vec2(-1.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_210; + _shadowCoord_210 = (tmpvar_201 + tmpvar_209); + float tmpvar_211; + vec2 tmpvar_212; + tmpvar_212 = (_shadowCoord_210.xy / _shadowCoord_210.w); + bool tmpvar_213; + if (any(greaterThan (tmpvar_212, vec2(1.0, 1.0)))) { + tmpvar_213 = bool(1); + } else { + tmpvar_213 = any(lessThan (tmpvar_212, vec2(0.0, 0.0))); + }; + if (tmpvar_213) { + tmpvar_211 = 1.0; + } else { + tmpvar_211 = float((dot (texture2D (u_shadowMap2, tmpvar_212), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_210.z - u_params1.x) / _shadowCoord_210.w))); + }; + result_202 = (tmpvar_206 + tmpvar_211); + vec4 tmpvar_214; + tmpvar_214.zw = vec2(0.0, 0.0); + tmpvar_214.xy = (vec2(-1.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_215; + _shadowCoord_215 = (tmpvar_201 + tmpvar_214); + float tmpvar_216; + vec2 tmpvar_217; + tmpvar_217 = (_shadowCoord_215.xy / _shadowCoord_215.w); + bool tmpvar_218; + if (any(greaterThan (tmpvar_217, vec2(1.0, 1.0)))) { + tmpvar_218 = bool(1); + } else { + tmpvar_218 = any(lessThan (tmpvar_217, vec2(0.0, 0.0))); + }; + if (tmpvar_218) { + tmpvar_216 = 1.0; + } else { + tmpvar_216 = float((dot (texture2D (u_shadowMap2, tmpvar_217), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_215.z - u_params1.x) / _shadowCoord_215.w))); + }; + result_202 = (result_202 + tmpvar_216); + vec4 tmpvar_219; + tmpvar_219.zw = vec2(0.0, 0.0); + tmpvar_219.xy = (vec2(-1.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_220; + _shadowCoord_220 = (tmpvar_201 + tmpvar_219); + float tmpvar_221; + vec2 tmpvar_222; + tmpvar_222 = (_shadowCoord_220.xy / _shadowCoord_220.w); + bool tmpvar_223; + if (any(greaterThan (tmpvar_222, vec2(1.0, 1.0)))) { + tmpvar_223 = bool(1); + } else { + tmpvar_223 = any(lessThan (tmpvar_222, vec2(0.0, 0.0))); + }; + if (tmpvar_223) { + tmpvar_221 = 1.0; + } else { + tmpvar_221 = float((dot (texture2D (u_shadowMap2, tmpvar_222), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_220.z - u_params1.x) / _shadowCoord_220.w))); + }; + result_202 = (result_202 + tmpvar_221); + vec4 tmpvar_224; + tmpvar_224.zw = vec2(0.0, 0.0); + tmpvar_224.xy = (vec2(-0.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_225; + _shadowCoord_225 = (tmpvar_201 + tmpvar_224); + float tmpvar_226; + vec2 tmpvar_227; + tmpvar_227 = (_shadowCoord_225.xy / _shadowCoord_225.w); + bool tmpvar_228; + if (any(greaterThan (tmpvar_227, vec2(1.0, 1.0)))) { + tmpvar_228 = bool(1); + } else { + tmpvar_228 = any(lessThan (tmpvar_227, vec2(0.0, 0.0))); + }; + if (tmpvar_228) { + tmpvar_226 = 1.0; + } else { + tmpvar_226 = float((dot (texture2D (u_shadowMap2, tmpvar_227), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_225.z - u_params1.x) / _shadowCoord_225.w))); + }; + result_202 = (result_202 + tmpvar_226); + vec4 tmpvar_229; + tmpvar_229.zw = vec2(0.0, 0.0); + tmpvar_229.xy = (vec2(-0.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_230; + _shadowCoord_230 = (tmpvar_201 + tmpvar_229); + float tmpvar_231; + vec2 tmpvar_232; + tmpvar_232 = (_shadowCoord_230.xy / _shadowCoord_230.w); + bool tmpvar_233; + if (any(greaterThan (tmpvar_232, vec2(1.0, 1.0)))) { + tmpvar_233 = bool(1); + } else { + tmpvar_233 = any(lessThan (tmpvar_232, vec2(0.0, 0.0))); + }; + if (tmpvar_233) { + tmpvar_231 = 1.0; + } else { + tmpvar_231 = float((dot (texture2D (u_shadowMap2, tmpvar_232), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_230.z - u_params1.x) / _shadowCoord_230.w))); + }; + result_202 = (result_202 + tmpvar_231); + vec4 tmpvar_234; + tmpvar_234.zw = vec2(0.0, 0.0); + tmpvar_234.xy = (vec2(-0.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_235; + _shadowCoord_235 = (tmpvar_201 + tmpvar_234); + float tmpvar_236; + vec2 tmpvar_237; + tmpvar_237 = (_shadowCoord_235.xy / _shadowCoord_235.w); + bool tmpvar_238; + if (any(greaterThan (tmpvar_237, vec2(1.0, 1.0)))) { + tmpvar_238 = bool(1); + } else { + tmpvar_238 = any(lessThan (tmpvar_237, vec2(0.0, 0.0))); + }; + if (tmpvar_238) { + tmpvar_236 = 1.0; + } else { + tmpvar_236 = float((dot (texture2D (u_shadowMap2, tmpvar_237), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_235.z - u_params1.x) / _shadowCoord_235.w))); + }; + result_202 = (result_202 + tmpvar_236); + vec4 tmpvar_239; + tmpvar_239.zw = vec2(0.0, 0.0); + tmpvar_239.xy = (vec2(-0.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_240; + _shadowCoord_240 = (tmpvar_201 + tmpvar_239); + float tmpvar_241; + vec2 tmpvar_242; + tmpvar_242 = (_shadowCoord_240.xy / _shadowCoord_240.w); + bool tmpvar_243; + if (any(greaterThan (tmpvar_242, vec2(1.0, 1.0)))) { + tmpvar_243 = bool(1); + } else { + tmpvar_243 = any(lessThan (tmpvar_242, vec2(0.0, 0.0))); + }; + if (tmpvar_243) { + tmpvar_241 = 1.0; + } else { + tmpvar_241 = float((dot (texture2D (u_shadowMap2, tmpvar_242), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_240.z - u_params1.x) / _shadowCoord_240.w))); + }; + result_202 = (result_202 + tmpvar_241); + vec4 tmpvar_244; + tmpvar_244.zw = vec2(0.0, 0.0); + tmpvar_244.xy = (vec2(0.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_245; + _shadowCoord_245 = (tmpvar_201 + tmpvar_244); + float tmpvar_246; + vec2 tmpvar_247; + tmpvar_247 = (_shadowCoord_245.xy / _shadowCoord_245.w); + bool tmpvar_248; + if (any(greaterThan (tmpvar_247, vec2(1.0, 1.0)))) { + tmpvar_248 = bool(1); + } else { + tmpvar_248 = any(lessThan (tmpvar_247, vec2(0.0, 0.0))); + }; + if (tmpvar_248) { + tmpvar_246 = 1.0; + } else { + tmpvar_246 = float((dot (texture2D (u_shadowMap2, tmpvar_247), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_245.z - u_params1.x) / _shadowCoord_245.w))); + }; + result_202 = (result_202 + tmpvar_246); + vec4 tmpvar_249; + tmpvar_249.zw = vec2(0.0, 0.0); + tmpvar_249.xy = (vec2(0.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_250; + _shadowCoord_250 = (tmpvar_201 + tmpvar_249); + float tmpvar_251; + vec2 tmpvar_252; + tmpvar_252 = (_shadowCoord_250.xy / _shadowCoord_250.w); + bool tmpvar_253; + if (any(greaterThan (tmpvar_252, vec2(1.0, 1.0)))) { + tmpvar_253 = bool(1); + } else { + tmpvar_253 = any(lessThan (tmpvar_252, vec2(0.0, 0.0))); + }; + if (tmpvar_253) { + tmpvar_251 = 1.0; + } else { + tmpvar_251 = float((dot (texture2D (u_shadowMap2, tmpvar_252), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_250.z - u_params1.x) / _shadowCoord_250.w))); + }; + result_202 = (result_202 + tmpvar_251); + vec4 tmpvar_254; + tmpvar_254.zw = vec2(0.0, 0.0); + tmpvar_254.xy = (vec2(0.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_255; + _shadowCoord_255 = (tmpvar_201 + tmpvar_254); + float tmpvar_256; + vec2 tmpvar_257; + tmpvar_257 = (_shadowCoord_255.xy / _shadowCoord_255.w); + bool tmpvar_258; + if (any(greaterThan (tmpvar_257, vec2(1.0, 1.0)))) { + tmpvar_258 = bool(1); + } else { + tmpvar_258 = any(lessThan (tmpvar_257, vec2(0.0, 0.0))); + }; + if (tmpvar_258) { + tmpvar_256 = 1.0; + } else { + tmpvar_256 = float((dot (texture2D (u_shadowMap2, tmpvar_257), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_255.z - u_params1.x) / _shadowCoord_255.w))); + }; + result_202 = (result_202 + tmpvar_256); + vec4 tmpvar_259; + tmpvar_259.zw = vec2(0.0, 0.0); + tmpvar_259.xy = (vec2(0.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_260; + _shadowCoord_260 = (tmpvar_201 + tmpvar_259); + float tmpvar_261; + vec2 tmpvar_262; + tmpvar_262 = (_shadowCoord_260.xy / _shadowCoord_260.w); + bool tmpvar_263; + if (any(greaterThan (tmpvar_262, vec2(1.0, 1.0)))) { + tmpvar_263 = bool(1); + } else { + tmpvar_263 = any(lessThan (tmpvar_262, vec2(0.0, 0.0))); + }; + if (tmpvar_263) { + tmpvar_261 = 1.0; + } else { + tmpvar_261 = float((dot (texture2D (u_shadowMap2, tmpvar_262), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_260.z - u_params1.x) / _shadowCoord_260.w))); + }; + result_202 = (result_202 + tmpvar_261); + vec4 tmpvar_264; + tmpvar_264.zw = vec2(0.0, 0.0); + tmpvar_264.xy = (vec2(1.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_265; + _shadowCoord_265 = (tmpvar_201 + tmpvar_264); + float tmpvar_266; + vec2 tmpvar_267; + tmpvar_267 = (_shadowCoord_265.xy / _shadowCoord_265.w); + bool tmpvar_268; + if (any(greaterThan (tmpvar_267, vec2(1.0, 1.0)))) { + tmpvar_268 = bool(1); + } else { + tmpvar_268 = any(lessThan (tmpvar_267, vec2(0.0, 0.0))); + }; + if (tmpvar_268) { + tmpvar_266 = 1.0; + } else { + tmpvar_266 = float((dot (texture2D (u_shadowMap2, tmpvar_267), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_265.z - u_params1.x) / _shadowCoord_265.w))); + }; + result_202 = (result_202 + tmpvar_266); + vec4 tmpvar_269; + tmpvar_269.zw = vec2(0.0, 0.0); + tmpvar_269.xy = (vec2(1.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_270; + _shadowCoord_270 = (tmpvar_201 + tmpvar_269); + float tmpvar_271; + vec2 tmpvar_272; + tmpvar_272 = (_shadowCoord_270.xy / _shadowCoord_270.w); + bool tmpvar_273; + if (any(greaterThan (tmpvar_272, vec2(1.0, 1.0)))) { + tmpvar_273 = bool(1); + } else { + tmpvar_273 = any(lessThan (tmpvar_272, vec2(0.0, 0.0))); + }; + if (tmpvar_273) { + tmpvar_271 = 1.0; + } else { + tmpvar_271 = float((dot (texture2D (u_shadowMap2, tmpvar_272), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_270.z - u_params1.x) / _shadowCoord_270.w))); + }; + result_202 = (result_202 + tmpvar_271); + vec4 tmpvar_274; + tmpvar_274.zw = vec2(0.0, 0.0); + tmpvar_274.xy = (vec2(1.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_275; + _shadowCoord_275 = (tmpvar_201 + tmpvar_274); + float tmpvar_276; + vec2 tmpvar_277; + tmpvar_277 = (_shadowCoord_275.xy / _shadowCoord_275.w); + bool tmpvar_278; + if (any(greaterThan (tmpvar_277, vec2(1.0, 1.0)))) { + tmpvar_278 = bool(1); + } else { + tmpvar_278 = any(lessThan (tmpvar_277, vec2(0.0, 0.0))); + }; + if (tmpvar_278) { + tmpvar_276 = 1.0; + } else { + tmpvar_276 = float((dot (texture2D (u_shadowMap2, tmpvar_277), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_275.z - u_params1.x) / _shadowCoord_275.w))); + }; + result_202 = (result_202 + tmpvar_276); + vec4 tmpvar_279; + tmpvar_279.zw = vec2(0.0, 0.0); + tmpvar_279.xy = (vec2(1.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_280; + _shadowCoord_280 = (tmpvar_201 + tmpvar_279); + float tmpvar_281; + vec2 tmpvar_282; + tmpvar_282 = (_shadowCoord_280.xy / _shadowCoord_280.w); + bool tmpvar_283; + if (any(greaterThan (tmpvar_282, vec2(1.0, 1.0)))) { + tmpvar_283 = bool(1); + } else { + tmpvar_283 = any(lessThan (tmpvar_282, vec2(0.0, 0.0))); + }; + if (tmpvar_283) { + tmpvar_281 = 1.0; + } else { + tmpvar_281 = float((dot (texture2D (u_shadowMap2, tmpvar_282), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_280.z - u_params1.x) / _shadowCoord_280.w))); + }; + float tmpvar_284; + tmpvar_284 = (result_202 + tmpvar_281); + result_202 = tmpvar_284; + visibility_1 = (tmpvar_284 / 16.0); + } else { + vec2 _texcoord_285; + _texcoord_285 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_286; + tmpvar_286 = greaterThan (_texcoord_285, vec2(0.0, 0.0)); + bool tmpvar_287; + if ((tmpvar_286.x && tmpvar_286.y)) { + bvec2 tmpvar_288; + tmpvar_288 = lessThan (_texcoord_285, vec2(1.0, 1.0)); + tmpvar_287 = (tmpvar_288.x && tmpvar_288.y); + } else { + tmpvar_287 = bool(0); + }; + float tmpvar_289; + tmpvar_289 = (float(tmpvar_287) * 0.4); + vec3 tmpvar_290; + tmpvar_290.x = tmpvar_289; + tmpvar_290.y = -(tmpvar_289); + tmpvar_290.z = -(tmpvar_289); + colorCoverage_2 = tmpvar_290; + vec4 tmpvar_291; + tmpvar_291.w = 1.0; + tmpvar_291.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_291.z = v_texcoord4.z; + float result_292; + result_292 = 0.0; + vec2 tmpvar_293; + tmpvar_293 = (u_smSamplingParams.zw * (u_params2.zz / 4.0)); + vec4 tmpvar_294; + tmpvar_294.zw = vec2(0.0, 0.0); + tmpvar_294.xy = (vec2(-1.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_295; + _shadowCoord_295 = (tmpvar_291 + tmpvar_294); + float tmpvar_296; + vec2 tmpvar_297; + tmpvar_297 = (_shadowCoord_295.xy / _shadowCoord_295.w); + bool tmpvar_298; + if (any(greaterThan (tmpvar_297, vec2(1.0, 1.0)))) { + tmpvar_298 = bool(1); + } else { + tmpvar_298 = any(lessThan (tmpvar_297, vec2(0.0, 0.0))); + }; + if (tmpvar_298) { + tmpvar_296 = 1.0; + } else { + tmpvar_296 = float((dot (texture2D (u_shadowMap3, tmpvar_297), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_295.z - u_params1.x) / _shadowCoord_295.w))); + }; + result_292 = tmpvar_296; + vec4 tmpvar_299; + tmpvar_299.zw = vec2(0.0, 0.0); + tmpvar_299.xy = (vec2(-1.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_300; + _shadowCoord_300 = (tmpvar_291 + tmpvar_299); + float tmpvar_301; + vec2 tmpvar_302; + tmpvar_302 = (_shadowCoord_300.xy / _shadowCoord_300.w); + bool tmpvar_303; + if (any(greaterThan (tmpvar_302, vec2(1.0, 1.0)))) { + tmpvar_303 = bool(1); + } else { + tmpvar_303 = any(lessThan (tmpvar_302, vec2(0.0, 0.0))); + }; + if (tmpvar_303) { + tmpvar_301 = 1.0; + } else { + tmpvar_301 = float((dot (texture2D (u_shadowMap3, tmpvar_302), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_300.z - u_params1.x) / _shadowCoord_300.w))); + }; + result_292 = (tmpvar_296 + tmpvar_301); + vec4 tmpvar_304; + tmpvar_304.zw = vec2(0.0, 0.0); + tmpvar_304.xy = (vec2(-1.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_305; + _shadowCoord_305 = (tmpvar_291 + tmpvar_304); + float tmpvar_306; + vec2 tmpvar_307; + tmpvar_307 = (_shadowCoord_305.xy / _shadowCoord_305.w); + bool tmpvar_308; + if (any(greaterThan (tmpvar_307, vec2(1.0, 1.0)))) { + tmpvar_308 = bool(1); + } else { + tmpvar_308 = any(lessThan (tmpvar_307, vec2(0.0, 0.0))); + }; + if (tmpvar_308) { + tmpvar_306 = 1.0; + } else { + tmpvar_306 = float((dot (texture2D (u_shadowMap3, tmpvar_307), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_305.z - u_params1.x) / _shadowCoord_305.w))); + }; + result_292 = (result_292 + tmpvar_306); + vec4 tmpvar_309; + tmpvar_309.zw = vec2(0.0, 0.0); + tmpvar_309.xy = (vec2(-1.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_310; + _shadowCoord_310 = (tmpvar_291 + tmpvar_309); + float tmpvar_311; + vec2 tmpvar_312; + tmpvar_312 = (_shadowCoord_310.xy / _shadowCoord_310.w); + bool tmpvar_313; + if (any(greaterThan (tmpvar_312, vec2(1.0, 1.0)))) { + tmpvar_313 = bool(1); + } else { + tmpvar_313 = any(lessThan (tmpvar_312, vec2(0.0, 0.0))); + }; + if (tmpvar_313) { + tmpvar_311 = 1.0; + } else { + tmpvar_311 = float((dot (texture2D (u_shadowMap3, tmpvar_312), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_310.z - u_params1.x) / _shadowCoord_310.w))); + }; + result_292 = (result_292 + tmpvar_311); + vec4 tmpvar_314; + tmpvar_314.zw = vec2(0.0, 0.0); + tmpvar_314.xy = (vec2(-0.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_315; + _shadowCoord_315 = (tmpvar_291 + tmpvar_314); + float tmpvar_316; + vec2 tmpvar_317; + tmpvar_317 = (_shadowCoord_315.xy / _shadowCoord_315.w); + bool tmpvar_318; + if (any(greaterThan (tmpvar_317, vec2(1.0, 1.0)))) { + tmpvar_318 = bool(1); + } else { + tmpvar_318 = any(lessThan (tmpvar_317, vec2(0.0, 0.0))); + }; + if (tmpvar_318) { + tmpvar_316 = 1.0; + } else { + tmpvar_316 = float((dot (texture2D (u_shadowMap3, tmpvar_317), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_315.z - u_params1.x) / _shadowCoord_315.w))); + }; + result_292 = (result_292 + tmpvar_316); + vec4 tmpvar_319; + tmpvar_319.zw = vec2(0.0, 0.0); + tmpvar_319.xy = (vec2(-0.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_320; + _shadowCoord_320 = (tmpvar_291 + tmpvar_319); + float tmpvar_321; + vec2 tmpvar_322; + tmpvar_322 = (_shadowCoord_320.xy / _shadowCoord_320.w); + bool tmpvar_323; + if (any(greaterThan (tmpvar_322, vec2(1.0, 1.0)))) { + tmpvar_323 = bool(1); + } else { + tmpvar_323 = any(lessThan (tmpvar_322, vec2(0.0, 0.0))); + }; + if (tmpvar_323) { + tmpvar_321 = 1.0; + } else { + tmpvar_321 = float((dot (texture2D (u_shadowMap3, tmpvar_322), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_320.z - u_params1.x) / _shadowCoord_320.w))); + }; + result_292 = (result_292 + tmpvar_321); + vec4 tmpvar_324; + tmpvar_324.zw = vec2(0.0, 0.0); + tmpvar_324.xy = (vec2(-0.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_325; + _shadowCoord_325 = (tmpvar_291 + tmpvar_324); + float tmpvar_326; + vec2 tmpvar_327; + tmpvar_327 = (_shadowCoord_325.xy / _shadowCoord_325.w); + bool tmpvar_328; + if (any(greaterThan (tmpvar_327, vec2(1.0, 1.0)))) { + tmpvar_328 = bool(1); + } else { + tmpvar_328 = any(lessThan (tmpvar_327, vec2(0.0, 0.0))); + }; + if (tmpvar_328) { + tmpvar_326 = 1.0; + } else { + tmpvar_326 = float((dot (texture2D (u_shadowMap3, tmpvar_327), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_325.z - u_params1.x) / _shadowCoord_325.w))); + }; + result_292 = (result_292 + tmpvar_326); + vec4 tmpvar_329; + tmpvar_329.zw = vec2(0.0, 0.0); + tmpvar_329.xy = (vec2(-0.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_330; + _shadowCoord_330 = (tmpvar_291 + tmpvar_329); + float tmpvar_331; + vec2 tmpvar_332; + tmpvar_332 = (_shadowCoord_330.xy / _shadowCoord_330.w); + bool tmpvar_333; + if (any(greaterThan (tmpvar_332, vec2(1.0, 1.0)))) { + tmpvar_333 = bool(1); + } else { + tmpvar_333 = any(lessThan (tmpvar_332, vec2(0.0, 0.0))); + }; + if (tmpvar_333) { + tmpvar_331 = 1.0; + } else { + tmpvar_331 = float((dot (texture2D (u_shadowMap3, tmpvar_332), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_330.z - u_params1.x) / _shadowCoord_330.w))); + }; + result_292 = (result_292 + tmpvar_331); + vec4 tmpvar_334; + tmpvar_334.zw = vec2(0.0, 0.0); + tmpvar_334.xy = (vec2(0.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_335; + _shadowCoord_335 = (tmpvar_291 + tmpvar_334); + float tmpvar_336; + vec2 tmpvar_337; + tmpvar_337 = (_shadowCoord_335.xy / _shadowCoord_335.w); + bool tmpvar_338; + if (any(greaterThan (tmpvar_337, vec2(1.0, 1.0)))) { + tmpvar_338 = bool(1); + } else { + tmpvar_338 = any(lessThan (tmpvar_337, vec2(0.0, 0.0))); + }; + if (tmpvar_338) { + tmpvar_336 = 1.0; + } else { + tmpvar_336 = float((dot (texture2D (u_shadowMap3, tmpvar_337), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_335.z - u_params1.x) / _shadowCoord_335.w))); + }; + result_292 = (result_292 + tmpvar_336); + vec4 tmpvar_339; + tmpvar_339.zw = vec2(0.0, 0.0); + tmpvar_339.xy = (vec2(0.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_340; + _shadowCoord_340 = (tmpvar_291 + tmpvar_339); + float tmpvar_341; + vec2 tmpvar_342; + tmpvar_342 = (_shadowCoord_340.xy / _shadowCoord_340.w); + bool tmpvar_343; + if (any(greaterThan (tmpvar_342, vec2(1.0, 1.0)))) { + tmpvar_343 = bool(1); + } else { + tmpvar_343 = any(lessThan (tmpvar_342, vec2(0.0, 0.0))); + }; + if (tmpvar_343) { + tmpvar_341 = 1.0; + } else { + tmpvar_341 = float((dot (texture2D (u_shadowMap3, tmpvar_342), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_340.z - u_params1.x) / _shadowCoord_340.w))); + }; + result_292 = (result_292 + tmpvar_341); + vec4 tmpvar_344; + tmpvar_344.zw = vec2(0.0, 0.0); + tmpvar_344.xy = (vec2(0.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_345; + _shadowCoord_345 = (tmpvar_291 + tmpvar_344); + float tmpvar_346; + vec2 tmpvar_347; + tmpvar_347 = (_shadowCoord_345.xy / _shadowCoord_345.w); + bool tmpvar_348; + if (any(greaterThan (tmpvar_347, vec2(1.0, 1.0)))) { + tmpvar_348 = bool(1); + } else { + tmpvar_348 = any(lessThan (tmpvar_347, vec2(0.0, 0.0))); + }; + if (tmpvar_348) { + tmpvar_346 = 1.0; + } else { + tmpvar_346 = float((dot (texture2D (u_shadowMap3, tmpvar_347), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_345.z - u_params1.x) / _shadowCoord_345.w))); + }; + result_292 = (result_292 + tmpvar_346); + vec4 tmpvar_349; + tmpvar_349.zw = vec2(0.0, 0.0); + tmpvar_349.xy = (vec2(0.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_350; + _shadowCoord_350 = (tmpvar_291 + tmpvar_349); + float tmpvar_351; + vec2 tmpvar_352; + tmpvar_352 = (_shadowCoord_350.xy / _shadowCoord_350.w); + bool tmpvar_353; + if (any(greaterThan (tmpvar_352, vec2(1.0, 1.0)))) { + tmpvar_353 = bool(1); + } else { + tmpvar_353 = any(lessThan (tmpvar_352, vec2(0.0, 0.0))); + }; + if (tmpvar_353) { + tmpvar_351 = 1.0; + } else { + tmpvar_351 = float((dot (texture2D (u_shadowMap3, tmpvar_352), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_350.z - u_params1.x) / _shadowCoord_350.w))); + }; + result_292 = (result_292 + tmpvar_351); + vec4 tmpvar_354; + tmpvar_354.zw = vec2(0.0, 0.0); + tmpvar_354.xy = (vec2(1.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_355; + _shadowCoord_355 = (tmpvar_291 + tmpvar_354); + float tmpvar_356; + vec2 tmpvar_357; + tmpvar_357 = (_shadowCoord_355.xy / _shadowCoord_355.w); + bool tmpvar_358; + if (any(greaterThan (tmpvar_357, vec2(1.0, 1.0)))) { + tmpvar_358 = bool(1); + } else { + tmpvar_358 = any(lessThan (tmpvar_357, vec2(0.0, 0.0))); + }; + if (tmpvar_358) { + tmpvar_356 = 1.0; + } else { + tmpvar_356 = float((dot (texture2D (u_shadowMap3, tmpvar_357), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_355.z - u_params1.x) / _shadowCoord_355.w))); + }; + result_292 = (result_292 + tmpvar_356); + vec4 tmpvar_359; + tmpvar_359.zw = vec2(0.0, 0.0); + tmpvar_359.xy = (vec2(1.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_360; + _shadowCoord_360 = (tmpvar_291 + tmpvar_359); + float tmpvar_361; + vec2 tmpvar_362; + tmpvar_362 = (_shadowCoord_360.xy / _shadowCoord_360.w); + bool tmpvar_363; + if (any(greaterThan (tmpvar_362, vec2(1.0, 1.0)))) { + tmpvar_363 = bool(1); + } else { + tmpvar_363 = any(lessThan (tmpvar_362, vec2(0.0, 0.0))); + }; + if (tmpvar_363) { + tmpvar_361 = 1.0; + } else { + tmpvar_361 = float((dot (texture2D (u_shadowMap3, tmpvar_362), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_360.z - u_params1.x) / _shadowCoord_360.w))); + }; + result_292 = (result_292 + tmpvar_361); + vec4 tmpvar_364; + tmpvar_364.zw = vec2(0.0, 0.0); + tmpvar_364.xy = (vec2(1.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_365; + _shadowCoord_365 = (tmpvar_291 + tmpvar_364); + float tmpvar_366; + vec2 tmpvar_367; + tmpvar_367 = (_shadowCoord_365.xy / _shadowCoord_365.w); + bool tmpvar_368; + if (any(greaterThan (tmpvar_367, vec2(1.0, 1.0)))) { + tmpvar_368 = bool(1); + } else { + tmpvar_368 = any(lessThan (tmpvar_367, vec2(0.0, 0.0))); + }; + if (tmpvar_368) { + tmpvar_366 = 1.0; + } else { + tmpvar_366 = float((dot (texture2D (u_shadowMap3, tmpvar_367), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_365.z - u_params1.x) / _shadowCoord_365.w))); + }; + result_292 = (result_292 + tmpvar_366); + vec4 tmpvar_369; + tmpvar_369.zw = vec2(0.0, 0.0); + tmpvar_369.xy = (vec2(1.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_370; + _shadowCoord_370 = (tmpvar_291 + tmpvar_369); + float tmpvar_371; + vec2 tmpvar_372; + tmpvar_372 = (_shadowCoord_370.xy / _shadowCoord_370.w); + bool tmpvar_373; + if (any(greaterThan (tmpvar_372, vec2(1.0, 1.0)))) { + tmpvar_373 = bool(1); + } else { + tmpvar_373 = any(lessThan (tmpvar_372, vec2(0.0, 0.0))); + }; + if (tmpvar_373) { + tmpvar_371 = 1.0; + } else { + tmpvar_371 = float((dot (texture2D (u_shadowMap3, tmpvar_372), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_370.z - u_params1.x) / _shadowCoord_370.w))); + }; + float tmpvar_374; + tmpvar_374 = (result_292 + tmpvar_371); + result_292 = tmpvar_374; + visibility_1 = (tmpvar_374 / 16.0); + }; + }; + }; + vec3 tmpvar_375; + tmpvar_375 = -(normalize(v_view)); + vec3 tmpvar_376; + float tmpvar_377; + tmpvar_376 = -(normalize(u_lightPosition.xyz)); + tmpvar_377 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_378; + tmpvar_378 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_379; + tmpvar_379 = normalize(tmpvar_378); + tmpvar_376 = tmpvar_379; + float tmpvar_380; + tmpvar_380 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_381; + tmpvar_381 = sqrt(dot (tmpvar_378, tmpvar_378)); + tmpvar_377 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_381)) + ((u_lightAttenuationSpotOuter.z * tmpvar_381) * tmpvar_381)))) * mix (clamp (((max (0.0, dot (-(tmpvar_379), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_380) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_380)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_382; + tmpvar_382 = dot (v_normal, tmpvar_376); + vec2 tmpvar_383; + tmpvar_383.x = tmpvar_382; + tmpvar_383.y = (((float((tmpvar_382 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_382) * v_normal) - tmpvar_376), tmpvar_375)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_384; + tmpvar_384 = (max (tmpvar_383, 0.0) * tmpvar_377); + float tmpvar_385; + tmpvar_385 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_384.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_384.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_385) * tmpvar_385)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin new file mode 100644 index 000000000..451e928b5 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_linear_omni.bin @@ -0,0 +1,495 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap0; +uniform vec3 u_tetraNormalRed; +uniform vec3 u_tetraNormalBlue; +uniform vec3 u_tetraNormalYellow; +uniform vec3 u_tetraNormalGreen; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec4 v_position; +varying vec3 v_normal; +void main () +{ + vec4 shadowcoord_1; + vec4 faceSelection_2; + vec3 colorCoverage_3; + vec2 tmpvar_4; + tmpvar_4 = vec2((u_params2.z / 4.0)); + faceSelection_2.x = dot (u_tetraNormalGreen, v_position.xyz); + faceSelection_2.y = dot (u_tetraNormalYellow, v_position.xyz); + faceSelection_2.z = dot (u_tetraNormalBlue, v_position.xyz); + faceSelection_2.w = dot (u_tetraNormalRed, v_position.xyz); + float tmpvar_5; + tmpvar_5 = max (max (faceSelection_2.x, faceSelection_2.y), max (faceSelection_2.z, faceSelection_2.w)); + if ((faceSelection_2.x == tmpvar_5)) { + shadowcoord_1 = v_texcoord1; + vec2 _texcoord_6; + _texcoord_6 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_7; + tmpvar_7 = greaterThan (_texcoord_6, vec2(0.0, 0.0)); + bool tmpvar_8; + if ((tmpvar_7.x && tmpvar_7.y)) { + bvec2 tmpvar_9; + tmpvar_9 = lessThan (_texcoord_6, vec2(1.0, 1.0)); + tmpvar_8 = (tmpvar_9.x && tmpvar_9.y); + } else { + tmpvar_8 = bool(0); + }; + float tmpvar_10; + tmpvar_10 = (float(tmpvar_8) * 0.3); + vec3 tmpvar_11; + tmpvar_11.x = -(tmpvar_10); + tmpvar_11.y = tmpvar_10; + tmpvar_11.z = -(tmpvar_10); + colorCoverage_3 = tmpvar_11; + } else { + if ((faceSelection_2.y == tmpvar_5)) { + shadowcoord_1 = v_texcoord2; + vec2 _texcoord_12; + _texcoord_12 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_13; + tmpvar_13 = greaterThan (_texcoord_12, vec2(0.0, 0.0)); + bool tmpvar_14; + if ((tmpvar_13.x && tmpvar_13.y)) { + bvec2 tmpvar_15; + tmpvar_15 = lessThan (_texcoord_12, vec2(1.0, 1.0)); + tmpvar_14 = (tmpvar_15.x && tmpvar_15.y); + } else { + tmpvar_14 = bool(0); + }; + float tmpvar_16; + tmpvar_16 = (float(tmpvar_14) * 0.3); + vec3 tmpvar_17; + tmpvar_17.x = tmpvar_16; + tmpvar_17.y = tmpvar_16; + tmpvar_17.z = -(tmpvar_16); + colorCoverage_3 = tmpvar_17; + } else { + if ((faceSelection_2.z == tmpvar_5)) { + shadowcoord_1 = v_texcoord3; + vec2 _texcoord_18; + _texcoord_18 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_19; + tmpvar_19 = greaterThan (_texcoord_18, vec2(0.0, 0.0)); + bool tmpvar_20; + if ((tmpvar_19.x && tmpvar_19.y)) { + bvec2 tmpvar_21; + tmpvar_21 = lessThan (_texcoord_18, vec2(1.0, 1.0)); + tmpvar_20 = (tmpvar_21.x && tmpvar_21.y); + } else { + tmpvar_20 = bool(0); + }; + float tmpvar_22; + tmpvar_22 = (float(tmpvar_20) * 0.3); + vec3 tmpvar_23; + tmpvar_23.x = -(tmpvar_22); + tmpvar_23.y = -(tmpvar_22); + tmpvar_23.z = tmpvar_22; + colorCoverage_3 = tmpvar_23; + } else { + shadowcoord_1 = v_texcoord4; + vec2 _texcoord_24; + _texcoord_24 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_25; + tmpvar_25 = greaterThan (_texcoord_24, vec2(0.0, 0.0)); + bool tmpvar_26; + if ((tmpvar_25.x && tmpvar_25.y)) { + bvec2 tmpvar_27; + tmpvar_27 = lessThan (_texcoord_24, vec2(1.0, 1.0)); + tmpvar_26 = (tmpvar_27.x && tmpvar_27.y); + } else { + tmpvar_26 = bool(0); + }; + float tmpvar_28; + tmpvar_28 = (float(tmpvar_26) * 0.3); + vec3 tmpvar_29; + tmpvar_29.x = tmpvar_28; + tmpvar_29.y = -(tmpvar_28); + tmpvar_29.z = -(tmpvar_28); + colorCoverage_3 = tmpvar_29; + }; + }; + }; + vec4 tmpvar_30; + tmpvar_30.w = 1.0; + tmpvar_30.xy = (shadowcoord_1.xy / shadowcoord_1.w); + tmpvar_30.z = shadowcoord_1.z; + float tmpvar_31; + float result_32; + result_32 = 0.0; + vec2 tmpvar_33; + tmpvar_33 = (u_smSamplingParams.zw * tmpvar_4); + vec4 tmpvar_34; + tmpvar_34.zw = vec2(0.0, 0.0); + tmpvar_34.xy = (vec2(-1.5, -1.5) * tmpvar_33); + vec4 _shadowCoord_35; + _shadowCoord_35 = (tmpvar_30 + tmpvar_34); + float tmpvar_36; + vec2 tmpvar_37; + tmpvar_37 = (_shadowCoord_35.xy / _shadowCoord_35.w); + bool tmpvar_38; + if (any(greaterThan (tmpvar_37, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_37, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_36 = 1.0; + } else { + tmpvar_36 = float((dot (texture2D (u_shadowMap0, tmpvar_37), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_35.z - u_params1.x) / _shadowCoord_35.w))); + }; + result_32 = tmpvar_36; + vec4 tmpvar_39; + tmpvar_39.zw = vec2(0.0, 0.0); + tmpvar_39.xy = (vec2(-1.5, -0.5) * tmpvar_33); + vec4 _shadowCoord_40; + _shadowCoord_40 = (tmpvar_30 + tmpvar_39); + float tmpvar_41; + vec2 tmpvar_42; + tmpvar_42 = (_shadowCoord_40.xy / _shadowCoord_40.w); + bool tmpvar_43; + if (any(greaterThan (tmpvar_42, vec2(1.0, 1.0)))) { + tmpvar_43 = bool(1); + } else { + tmpvar_43 = any(lessThan (tmpvar_42, vec2(0.0, 0.0))); + }; + if (tmpvar_43) { + tmpvar_41 = 1.0; + } else { + tmpvar_41 = float((dot (texture2D (u_shadowMap0, tmpvar_42), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_40.z - u_params1.x) / _shadowCoord_40.w))); + }; + result_32 = (tmpvar_36 + tmpvar_41); + vec4 tmpvar_44; + tmpvar_44.zw = vec2(0.0, 0.0); + tmpvar_44.xy = (vec2(-1.5, 0.5) * tmpvar_33); + vec4 _shadowCoord_45; + _shadowCoord_45 = (tmpvar_30 + tmpvar_44); + float tmpvar_46; + vec2 tmpvar_47; + tmpvar_47 = (_shadowCoord_45.xy / _shadowCoord_45.w); + bool tmpvar_48; + if (any(greaterThan (tmpvar_47, vec2(1.0, 1.0)))) { + tmpvar_48 = bool(1); + } else { + tmpvar_48 = any(lessThan (tmpvar_47, vec2(0.0, 0.0))); + }; + if (tmpvar_48) { + tmpvar_46 = 1.0; + } else { + tmpvar_46 = float((dot (texture2D (u_shadowMap0, tmpvar_47), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_45.z - u_params1.x) / _shadowCoord_45.w))); + }; + result_32 = (result_32 + tmpvar_46); + vec4 tmpvar_49; + tmpvar_49.zw = vec2(0.0, 0.0); + tmpvar_49.xy = (vec2(-1.5, 1.5) * tmpvar_33); + vec4 _shadowCoord_50; + _shadowCoord_50 = (tmpvar_30 + tmpvar_49); + float tmpvar_51; + vec2 tmpvar_52; + tmpvar_52 = (_shadowCoord_50.xy / _shadowCoord_50.w); + bool tmpvar_53; + if (any(greaterThan (tmpvar_52, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_52, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_51 = 1.0; + } else { + tmpvar_51 = float((dot (texture2D (u_shadowMap0, tmpvar_52), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_50.z - u_params1.x) / _shadowCoord_50.w))); + }; + result_32 = (result_32 + tmpvar_51); + vec4 tmpvar_54; + tmpvar_54.zw = vec2(0.0, 0.0); + tmpvar_54.xy = (vec2(-0.5, -1.5) * tmpvar_33); + vec4 _shadowCoord_55; + _shadowCoord_55 = (tmpvar_30 + tmpvar_54); + float tmpvar_56; + vec2 tmpvar_57; + tmpvar_57 = (_shadowCoord_55.xy / _shadowCoord_55.w); + bool tmpvar_58; + if (any(greaterThan (tmpvar_57, vec2(1.0, 1.0)))) { + tmpvar_58 = bool(1); + } else { + tmpvar_58 = any(lessThan (tmpvar_57, vec2(0.0, 0.0))); + }; + if (tmpvar_58) { + tmpvar_56 = 1.0; + } else { + tmpvar_56 = float((dot (texture2D (u_shadowMap0, tmpvar_57), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_55.z - u_params1.x) / _shadowCoord_55.w))); + }; + result_32 = (result_32 + tmpvar_56); + vec4 tmpvar_59; + tmpvar_59.zw = vec2(0.0, 0.0); + tmpvar_59.xy = (vec2(-0.5, -0.5) * tmpvar_33); + vec4 _shadowCoord_60; + _shadowCoord_60 = (tmpvar_30 + tmpvar_59); + float tmpvar_61; + vec2 tmpvar_62; + tmpvar_62 = (_shadowCoord_60.xy / _shadowCoord_60.w); + bool tmpvar_63; + if (any(greaterThan (tmpvar_62, vec2(1.0, 1.0)))) { + tmpvar_63 = bool(1); + } else { + tmpvar_63 = any(lessThan (tmpvar_62, vec2(0.0, 0.0))); + }; + if (tmpvar_63) { + tmpvar_61 = 1.0; + } else { + tmpvar_61 = float((dot (texture2D (u_shadowMap0, tmpvar_62), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_60.z - u_params1.x) / _shadowCoord_60.w))); + }; + result_32 = (result_32 + tmpvar_61); + vec4 tmpvar_64; + tmpvar_64.zw = vec2(0.0, 0.0); + tmpvar_64.xy = (vec2(-0.5, 0.5) * tmpvar_33); + vec4 _shadowCoord_65; + _shadowCoord_65 = (tmpvar_30 + tmpvar_64); + float tmpvar_66; + vec2 tmpvar_67; + tmpvar_67 = (_shadowCoord_65.xy / _shadowCoord_65.w); + bool tmpvar_68; + if (any(greaterThan (tmpvar_67, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_67, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_66 = 1.0; + } else { + tmpvar_66 = float((dot (texture2D (u_shadowMap0, tmpvar_67), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_65.z - u_params1.x) / _shadowCoord_65.w))); + }; + result_32 = (result_32 + tmpvar_66); + vec4 tmpvar_69; + tmpvar_69.zw = vec2(0.0, 0.0); + tmpvar_69.xy = (vec2(-0.5, 1.5) * tmpvar_33); + vec4 _shadowCoord_70; + _shadowCoord_70 = (tmpvar_30 + tmpvar_69); + float tmpvar_71; + vec2 tmpvar_72; + tmpvar_72 = (_shadowCoord_70.xy / _shadowCoord_70.w); + bool tmpvar_73; + if (any(greaterThan (tmpvar_72, vec2(1.0, 1.0)))) { + tmpvar_73 = bool(1); + } else { + tmpvar_73 = any(lessThan (tmpvar_72, vec2(0.0, 0.0))); + }; + if (tmpvar_73) { + tmpvar_71 = 1.0; + } else { + tmpvar_71 = float((dot (texture2D (u_shadowMap0, tmpvar_72), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_70.z - u_params1.x) / _shadowCoord_70.w))); + }; + result_32 = (result_32 + tmpvar_71); + vec4 tmpvar_74; + tmpvar_74.zw = vec2(0.0, 0.0); + tmpvar_74.xy = (vec2(0.5, -1.5) * tmpvar_33); + vec4 _shadowCoord_75; + _shadowCoord_75 = (tmpvar_30 + tmpvar_74); + float tmpvar_76; + vec2 tmpvar_77; + tmpvar_77 = (_shadowCoord_75.xy / _shadowCoord_75.w); + bool tmpvar_78; + if (any(greaterThan (tmpvar_77, vec2(1.0, 1.0)))) { + tmpvar_78 = bool(1); + } else { + tmpvar_78 = any(lessThan (tmpvar_77, vec2(0.0, 0.0))); + }; + if (tmpvar_78) { + tmpvar_76 = 1.0; + } else { + tmpvar_76 = float((dot (texture2D (u_shadowMap0, tmpvar_77), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_75.z - u_params1.x) / _shadowCoord_75.w))); + }; + result_32 = (result_32 + tmpvar_76); + vec4 tmpvar_79; + tmpvar_79.zw = vec2(0.0, 0.0); + tmpvar_79.xy = (vec2(0.5, -0.5) * tmpvar_33); + vec4 _shadowCoord_80; + _shadowCoord_80 = (tmpvar_30 + tmpvar_79); + float tmpvar_81; + vec2 tmpvar_82; + tmpvar_82 = (_shadowCoord_80.xy / _shadowCoord_80.w); + bool tmpvar_83; + if (any(greaterThan (tmpvar_82, vec2(1.0, 1.0)))) { + tmpvar_83 = bool(1); + } else { + tmpvar_83 = any(lessThan (tmpvar_82, vec2(0.0, 0.0))); + }; + if (tmpvar_83) { + tmpvar_81 = 1.0; + } else { + tmpvar_81 = float((dot (texture2D (u_shadowMap0, tmpvar_82), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_80.z - u_params1.x) / _shadowCoord_80.w))); + }; + result_32 = (result_32 + tmpvar_81); + vec4 tmpvar_84; + tmpvar_84.zw = vec2(0.0, 0.0); + tmpvar_84.xy = (vec2(0.5, 0.5) * tmpvar_33); + vec4 _shadowCoord_85; + _shadowCoord_85 = (tmpvar_30 + tmpvar_84); + float tmpvar_86; + vec2 tmpvar_87; + tmpvar_87 = (_shadowCoord_85.xy / _shadowCoord_85.w); + bool tmpvar_88; + if (any(greaterThan (tmpvar_87, vec2(1.0, 1.0)))) { + tmpvar_88 = bool(1); + } else { + tmpvar_88 = any(lessThan (tmpvar_87, vec2(0.0, 0.0))); + }; + if (tmpvar_88) { + tmpvar_86 = 1.0; + } else { + tmpvar_86 = float((dot (texture2D (u_shadowMap0, tmpvar_87), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_85.z - u_params1.x) / _shadowCoord_85.w))); + }; + result_32 = (result_32 + tmpvar_86); + vec4 tmpvar_89; + tmpvar_89.zw = vec2(0.0, 0.0); + tmpvar_89.xy = (vec2(0.5, 1.5) * tmpvar_33); + vec4 _shadowCoord_90; + _shadowCoord_90 = (tmpvar_30 + tmpvar_89); + float tmpvar_91; + vec2 tmpvar_92; + tmpvar_92 = (_shadowCoord_90.xy / _shadowCoord_90.w); + bool tmpvar_93; + if (any(greaterThan (tmpvar_92, vec2(1.0, 1.0)))) { + tmpvar_93 = bool(1); + } else { + tmpvar_93 = any(lessThan (tmpvar_92, vec2(0.0, 0.0))); + }; + if (tmpvar_93) { + tmpvar_91 = 1.0; + } else { + tmpvar_91 = float((dot (texture2D (u_shadowMap0, tmpvar_92), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_90.z - u_params1.x) / _shadowCoord_90.w))); + }; + result_32 = (result_32 + tmpvar_91); + vec4 tmpvar_94; + tmpvar_94.zw = vec2(0.0, 0.0); + tmpvar_94.xy = (vec2(1.5, -1.5) * tmpvar_33); + vec4 _shadowCoord_95; + _shadowCoord_95 = (tmpvar_30 + tmpvar_94); + float tmpvar_96; + vec2 tmpvar_97; + tmpvar_97 = (_shadowCoord_95.xy / _shadowCoord_95.w); + bool tmpvar_98; + if (any(greaterThan (tmpvar_97, vec2(1.0, 1.0)))) { + tmpvar_98 = bool(1); + } else { + tmpvar_98 = any(lessThan (tmpvar_97, vec2(0.0, 0.0))); + }; + if (tmpvar_98) { + tmpvar_96 = 1.0; + } else { + tmpvar_96 = float((dot (texture2D (u_shadowMap0, tmpvar_97), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_95.z - u_params1.x) / _shadowCoord_95.w))); + }; + result_32 = (result_32 + tmpvar_96); + vec4 tmpvar_99; + tmpvar_99.zw = vec2(0.0, 0.0); + tmpvar_99.xy = (vec2(1.5, -0.5) * tmpvar_33); + vec4 _shadowCoord_100; + _shadowCoord_100 = (tmpvar_30 + tmpvar_99); + float tmpvar_101; + vec2 tmpvar_102; + tmpvar_102 = (_shadowCoord_100.xy / _shadowCoord_100.w); + bool tmpvar_103; + if (any(greaterThan (tmpvar_102, vec2(1.0, 1.0)))) { + tmpvar_103 = bool(1); + } else { + tmpvar_103 = any(lessThan (tmpvar_102, vec2(0.0, 0.0))); + }; + if (tmpvar_103) { + tmpvar_101 = 1.0; + } else { + tmpvar_101 = float((dot (texture2D (u_shadowMap0, tmpvar_102), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_100.z - u_params1.x) / _shadowCoord_100.w))); + }; + result_32 = (result_32 + tmpvar_101); + vec4 tmpvar_104; + tmpvar_104.zw = vec2(0.0, 0.0); + tmpvar_104.xy = (vec2(1.5, 0.5) * tmpvar_33); + vec4 _shadowCoord_105; + _shadowCoord_105 = (tmpvar_30 + tmpvar_104); + float tmpvar_106; + vec2 tmpvar_107; + tmpvar_107 = (_shadowCoord_105.xy / _shadowCoord_105.w); + bool tmpvar_108; + if (any(greaterThan (tmpvar_107, vec2(1.0, 1.0)))) { + tmpvar_108 = bool(1); + } else { + tmpvar_108 = any(lessThan (tmpvar_107, vec2(0.0, 0.0))); + }; + if (tmpvar_108) { + tmpvar_106 = 1.0; + } else { + tmpvar_106 = float((dot (texture2D (u_shadowMap0, tmpvar_107), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_105.z - u_params1.x) / _shadowCoord_105.w))); + }; + result_32 = (result_32 + tmpvar_106); + vec4 tmpvar_109; + tmpvar_109.zw = vec2(0.0, 0.0); + tmpvar_109.xy = (vec2(1.5, 1.5) * tmpvar_33); + vec4 _shadowCoord_110; + _shadowCoord_110 = (tmpvar_30 + tmpvar_109); + float tmpvar_111; + vec2 tmpvar_112; + tmpvar_112 = (_shadowCoord_110.xy / _shadowCoord_110.w); + bool tmpvar_113; + if (any(greaterThan (tmpvar_112, vec2(1.0, 1.0)))) { + tmpvar_113 = bool(1); + } else { + tmpvar_113 = any(lessThan (tmpvar_112, vec2(0.0, 0.0))); + }; + if (tmpvar_113) { + tmpvar_111 = 1.0; + } else { + tmpvar_111 = float((dot (texture2D (u_shadowMap0, tmpvar_112), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_110.z - u_params1.x) / _shadowCoord_110.w))); + }; + float tmpvar_114; + tmpvar_114 = (result_32 + tmpvar_111); + result_32 = tmpvar_114; + tmpvar_31 = (tmpvar_114 / 16.0); + vec3 tmpvar_115; + tmpvar_115 = -(normalize(v_view)); + vec3 tmpvar_116; + float tmpvar_117; + tmpvar_116 = -(normalize(u_lightPosition.xyz)); + tmpvar_117 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_118; + tmpvar_118 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_119; + tmpvar_119 = normalize(tmpvar_118); + tmpvar_116 = tmpvar_119; + float tmpvar_120; + tmpvar_120 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_121; + tmpvar_121 = sqrt(dot (tmpvar_118, tmpvar_118)); + tmpvar_117 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_121)) + ((u_lightAttenuationSpotOuter.z * tmpvar_121) * tmpvar_121)))) * mix (clamp (((max (0.0, dot (-(tmpvar_119), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_120) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_120)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_122; + tmpvar_122 = dot (v_normal, tmpvar_116); + vec2 tmpvar_123; + tmpvar_123.x = tmpvar_122; + tmpvar_123.y = (((float((tmpvar_122 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_122) * v_normal) - tmpvar_116), tmpvar_115)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_124; + tmpvar_124 = (max (tmpvar_123, 0.0) * tmpvar_117); + float tmpvar_125; + tmpvar_125 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_124.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_124.y)) * u_color.xyz) * tmpvar_31))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_3 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_125) * tmpvar_125)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin new file mode 100644 index 000000000..06facb629 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_pcf_omni.bin @@ -0,0 +1,491 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap0; +uniform vec3 u_tetraNormalRed; +uniform vec3 u_tetraNormalBlue; +uniform vec3 u_tetraNormalYellow; +uniform vec3 u_tetraNormalGreen; +uniform vec4 u_smSamplingParams; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec4 v_position; +varying vec3 v_normal; +void main () +{ + vec4 shadowcoord_1; + vec4 faceSelection_2; + vec3 colorCoverage_3; + vec2 tmpvar_4; + tmpvar_4 = vec2((u_params2.z / 4.0)); + faceSelection_2.x = dot (u_tetraNormalGreen, v_position.xyz); + faceSelection_2.y = dot (u_tetraNormalYellow, v_position.xyz); + faceSelection_2.z = dot (u_tetraNormalBlue, v_position.xyz); + faceSelection_2.w = dot (u_tetraNormalRed, v_position.xyz); + float tmpvar_5; + tmpvar_5 = max (max (faceSelection_2.x, faceSelection_2.y), max (faceSelection_2.z, faceSelection_2.w)); + if ((faceSelection_2.x == tmpvar_5)) { + shadowcoord_1 = v_texcoord1; + vec2 _texcoord_6; + _texcoord_6 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_7; + tmpvar_7 = greaterThan (_texcoord_6, vec2(0.0, 0.0)); + bool tmpvar_8; + if ((tmpvar_7.x && tmpvar_7.y)) { + bvec2 tmpvar_9; + tmpvar_9 = lessThan (_texcoord_6, vec2(1.0, 1.0)); + tmpvar_8 = (tmpvar_9.x && tmpvar_9.y); + } else { + tmpvar_8 = bool(0); + }; + float tmpvar_10; + tmpvar_10 = (float(tmpvar_8) * 0.3); + vec3 tmpvar_11; + tmpvar_11.x = -(tmpvar_10); + tmpvar_11.y = tmpvar_10; + tmpvar_11.z = -(tmpvar_10); + colorCoverage_3 = tmpvar_11; + } else { + if ((faceSelection_2.y == tmpvar_5)) { + shadowcoord_1 = v_texcoord2; + vec2 _texcoord_12; + _texcoord_12 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_13; + tmpvar_13 = greaterThan (_texcoord_12, vec2(0.0, 0.0)); + bool tmpvar_14; + if ((tmpvar_13.x && tmpvar_13.y)) { + bvec2 tmpvar_15; + tmpvar_15 = lessThan (_texcoord_12, vec2(1.0, 1.0)); + tmpvar_14 = (tmpvar_15.x && tmpvar_15.y); + } else { + tmpvar_14 = bool(0); + }; + float tmpvar_16; + tmpvar_16 = (float(tmpvar_14) * 0.3); + vec3 tmpvar_17; + tmpvar_17.x = tmpvar_16; + tmpvar_17.y = tmpvar_16; + tmpvar_17.z = -(tmpvar_16); + colorCoverage_3 = tmpvar_17; + } else { + if ((faceSelection_2.z == tmpvar_5)) { + shadowcoord_1 = v_texcoord3; + vec2 _texcoord_18; + _texcoord_18 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_19; + tmpvar_19 = greaterThan (_texcoord_18, vec2(0.0, 0.0)); + bool tmpvar_20; + if ((tmpvar_19.x && tmpvar_19.y)) { + bvec2 tmpvar_21; + tmpvar_21 = lessThan (_texcoord_18, vec2(1.0, 1.0)); + tmpvar_20 = (tmpvar_21.x && tmpvar_21.y); + } else { + tmpvar_20 = bool(0); + }; + float tmpvar_22; + tmpvar_22 = (float(tmpvar_20) * 0.3); + vec3 tmpvar_23; + tmpvar_23.x = -(tmpvar_22); + tmpvar_23.y = -(tmpvar_22); + tmpvar_23.z = tmpvar_22; + colorCoverage_3 = tmpvar_23; + } else { + shadowcoord_1 = v_texcoord4; + vec2 _texcoord_24; + _texcoord_24 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_25; + tmpvar_25 = greaterThan (_texcoord_24, vec2(0.0, 0.0)); + bool tmpvar_26; + if ((tmpvar_25.x && tmpvar_25.y)) { + bvec2 tmpvar_27; + tmpvar_27 = lessThan (_texcoord_24, vec2(1.0, 1.0)); + tmpvar_26 = (tmpvar_27.x && tmpvar_27.y); + } else { + tmpvar_26 = bool(0); + }; + float tmpvar_28; + tmpvar_28 = (float(tmpvar_26) * 0.3); + vec3 tmpvar_29; + tmpvar_29.x = tmpvar_28; + tmpvar_29.y = -(tmpvar_28); + tmpvar_29.z = -(tmpvar_28); + colorCoverage_3 = tmpvar_29; + }; + }; + }; + float tmpvar_30; + float result_31; + result_31 = 0.0; + vec2 tmpvar_32; + tmpvar_32 = ((u_smSamplingParams.zw * tmpvar_4) * shadowcoord_1.w); + vec4 tmpvar_33; + tmpvar_33.zw = vec2(0.0, 0.0); + tmpvar_33.xy = (vec2(-1.5, -1.5) * tmpvar_32); + vec4 _shadowCoord_34; + _shadowCoord_34 = (shadowcoord_1 + tmpvar_33); + float tmpvar_35; + vec2 tmpvar_36; + tmpvar_36 = (_shadowCoord_34.xy / _shadowCoord_34.w); + bool tmpvar_37; + if (any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) { + tmpvar_37 = bool(1); + } else { + tmpvar_37 = any(lessThan (tmpvar_36, vec2(0.0, 0.0))); + }; + if (tmpvar_37) { + tmpvar_35 = 1.0; + } else { + tmpvar_35 = float((dot (texture2D (u_shadowMap0, tmpvar_36), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_34.z - u_params1.x) / _shadowCoord_34.w))); + }; + result_31 = tmpvar_35; + vec4 tmpvar_38; + tmpvar_38.zw = vec2(0.0, 0.0); + tmpvar_38.xy = (vec2(-1.5, -0.5) * tmpvar_32); + vec4 _shadowCoord_39; + _shadowCoord_39 = (shadowcoord_1 + tmpvar_38); + float tmpvar_40; + vec2 tmpvar_41; + tmpvar_41 = (_shadowCoord_39.xy / _shadowCoord_39.w); + bool tmpvar_42; + if (any(greaterThan (tmpvar_41, vec2(1.0, 1.0)))) { + tmpvar_42 = bool(1); + } else { + tmpvar_42 = any(lessThan (tmpvar_41, vec2(0.0, 0.0))); + }; + if (tmpvar_42) { + tmpvar_40 = 1.0; + } else { + tmpvar_40 = float((dot (texture2D (u_shadowMap0, tmpvar_41), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_39.z - u_params1.x) / _shadowCoord_39.w))); + }; + result_31 = (tmpvar_35 + tmpvar_40); + vec4 tmpvar_43; + tmpvar_43.zw = vec2(0.0, 0.0); + tmpvar_43.xy = (vec2(-1.5, 0.5) * tmpvar_32); + vec4 _shadowCoord_44; + _shadowCoord_44 = (shadowcoord_1 + tmpvar_43); + float tmpvar_45; + vec2 tmpvar_46; + tmpvar_46 = (_shadowCoord_44.xy / _shadowCoord_44.w); + bool tmpvar_47; + if (any(greaterThan (tmpvar_46, vec2(1.0, 1.0)))) { + tmpvar_47 = bool(1); + } else { + tmpvar_47 = any(lessThan (tmpvar_46, vec2(0.0, 0.0))); + }; + if (tmpvar_47) { + tmpvar_45 = 1.0; + } else { + tmpvar_45 = float((dot (texture2D (u_shadowMap0, tmpvar_46), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_44.z - u_params1.x) / _shadowCoord_44.w))); + }; + result_31 = (result_31 + tmpvar_45); + vec4 tmpvar_48; + tmpvar_48.zw = vec2(0.0, 0.0); + tmpvar_48.xy = (vec2(-1.5, 1.5) * tmpvar_32); + vec4 _shadowCoord_49; + _shadowCoord_49 = (shadowcoord_1 + tmpvar_48); + float tmpvar_50; + vec2 tmpvar_51; + tmpvar_51 = (_shadowCoord_49.xy / _shadowCoord_49.w); + bool tmpvar_52; + if (any(greaterThan (tmpvar_51, vec2(1.0, 1.0)))) { + tmpvar_52 = bool(1); + } else { + tmpvar_52 = any(lessThan (tmpvar_51, vec2(0.0, 0.0))); + }; + if (tmpvar_52) { + tmpvar_50 = 1.0; + } else { + tmpvar_50 = float((dot (texture2D (u_shadowMap0, tmpvar_51), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_49.z - u_params1.x) / _shadowCoord_49.w))); + }; + result_31 = (result_31 + tmpvar_50); + vec4 tmpvar_53; + tmpvar_53.zw = vec2(0.0, 0.0); + tmpvar_53.xy = (vec2(-0.5, -1.5) * tmpvar_32); + vec4 _shadowCoord_54; + _shadowCoord_54 = (shadowcoord_1 + tmpvar_53); + float tmpvar_55; + vec2 tmpvar_56; + tmpvar_56 = (_shadowCoord_54.xy / _shadowCoord_54.w); + bool tmpvar_57; + if (any(greaterThan (tmpvar_56, vec2(1.0, 1.0)))) { + tmpvar_57 = bool(1); + } else { + tmpvar_57 = any(lessThan (tmpvar_56, vec2(0.0, 0.0))); + }; + if (tmpvar_57) { + tmpvar_55 = 1.0; + } else { + tmpvar_55 = float((dot (texture2D (u_shadowMap0, tmpvar_56), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_54.z - u_params1.x) / _shadowCoord_54.w))); + }; + result_31 = (result_31 + tmpvar_55); + vec4 tmpvar_58; + tmpvar_58.zw = vec2(0.0, 0.0); + tmpvar_58.xy = (vec2(-0.5, -0.5) * tmpvar_32); + vec4 _shadowCoord_59; + _shadowCoord_59 = (shadowcoord_1 + tmpvar_58); + float tmpvar_60; + vec2 tmpvar_61; + tmpvar_61 = (_shadowCoord_59.xy / _shadowCoord_59.w); + bool tmpvar_62; + if (any(greaterThan (tmpvar_61, vec2(1.0, 1.0)))) { + tmpvar_62 = bool(1); + } else { + tmpvar_62 = any(lessThan (tmpvar_61, vec2(0.0, 0.0))); + }; + if (tmpvar_62) { + tmpvar_60 = 1.0; + } else { + tmpvar_60 = float((dot (texture2D (u_shadowMap0, tmpvar_61), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_59.z - u_params1.x) / _shadowCoord_59.w))); + }; + result_31 = (result_31 + tmpvar_60); + vec4 tmpvar_63; + tmpvar_63.zw = vec2(0.0, 0.0); + tmpvar_63.xy = (vec2(-0.5, 0.5) * tmpvar_32); + vec4 _shadowCoord_64; + _shadowCoord_64 = (shadowcoord_1 + tmpvar_63); + float tmpvar_65; + vec2 tmpvar_66; + tmpvar_66 = (_shadowCoord_64.xy / _shadowCoord_64.w); + bool tmpvar_67; + if (any(greaterThan (tmpvar_66, vec2(1.0, 1.0)))) { + tmpvar_67 = bool(1); + } else { + tmpvar_67 = any(lessThan (tmpvar_66, vec2(0.0, 0.0))); + }; + if (tmpvar_67) { + tmpvar_65 = 1.0; + } else { + tmpvar_65 = float((dot (texture2D (u_shadowMap0, tmpvar_66), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_64.z - u_params1.x) / _shadowCoord_64.w))); + }; + result_31 = (result_31 + tmpvar_65); + vec4 tmpvar_68; + tmpvar_68.zw = vec2(0.0, 0.0); + tmpvar_68.xy = (vec2(-0.5, 1.5) * tmpvar_32); + vec4 _shadowCoord_69; + _shadowCoord_69 = (shadowcoord_1 + tmpvar_68); + float tmpvar_70; + vec2 tmpvar_71; + tmpvar_71 = (_shadowCoord_69.xy / _shadowCoord_69.w); + bool tmpvar_72; + if (any(greaterThan (tmpvar_71, vec2(1.0, 1.0)))) { + tmpvar_72 = bool(1); + } else { + tmpvar_72 = any(lessThan (tmpvar_71, vec2(0.0, 0.0))); + }; + if (tmpvar_72) { + tmpvar_70 = 1.0; + } else { + tmpvar_70 = float((dot (texture2D (u_shadowMap0, tmpvar_71), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_69.z - u_params1.x) / _shadowCoord_69.w))); + }; + result_31 = (result_31 + tmpvar_70); + vec4 tmpvar_73; + tmpvar_73.zw = vec2(0.0, 0.0); + tmpvar_73.xy = (vec2(0.5, -1.5) * tmpvar_32); + vec4 _shadowCoord_74; + _shadowCoord_74 = (shadowcoord_1 + tmpvar_73); + float tmpvar_75; + vec2 tmpvar_76; + tmpvar_76 = (_shadowCoord_74.xy / _shadowCoord_74.w); + bool tmpvar_77; + if (any(greaterThan (tmpvar_76, vec2(1.0, 1.0)))) { + tmpvar_77 = bool(1); + } else { + tmpvar_77 = any(lessThan (tmpvar_76, vec2(0.0, 0.0))); + }; + if (tmpvar_77) { + tmpvar_75 = 1.0; + } else { + tmpvar_75 = float((dot (texture2D (u_shadowMap0, tmpvar_76), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_74.z - u_params1.x) / _shadowCoord_74.w))); + }; + result_31 = (result_31 + tmpvar_75); + vec4 tmpvar_78; + tmpvar_78.zw = vec2(0.0, 0.0); + tmpvar_78.xy = (vec2(0.5, -0.5) * tmpvar_32); + vec4 _shadowCoord_79; + _shadowCoord_79 = (shadowcoord_1 + tmpvar_78); + float tmpvar_80; + vec2 tmpvar_81; + tmpvar_81 = (_shadowCoord_79.xy / _shadowCoord_79.w); + bool tmpvar_82; + if (any(greaterThan (tmpvar_81, vec2(1.0, 1.0)))) { + tmpvar_82 = bool(1); + } else { + tmpvar_82 = any(lessThan (tmpvar_81, vec2(0.0, 0.0))); + }; + if (tmpvar_82) { + tmpvar_80 = 1.0; + } else { + tmpvar_80 = float((dot (texture2D (u_shadowMap0, tmpvar_81), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_79.z - u_params1.x) / _shadowCoord_79.w))); + }; + result_31 = (result_31 + tmpvar_80); + vec4 tmpvar_83; + tmpvar_83.zw = vec2(0.0, 0.0); + tmpvar_83.xy = (vec2(0.5, 0.5) * tmpvar_32); + vec4 _shadowCoord_84; + _shadowCoord_84 = (shadowcoord_1 + tmpvar_83); + float tmpvar_85; + vec2 tmpvar_86; + tmpvar_86 = (_shadowCoord_84.xy / _shadowCoord_84.w); + bool tmpvar_87; + if (any(greaterThan (tmpvar_86, vec2(1.0, 1.0)))) { + tmpvar_87 = bool(1); + } else { + tmpvar_87 = any(lessThan (tmpvar_86, vec2(0.0, 0.0))); + }; + if (tmpvar_87) { + tmpvar_85 = 1.0; + } else { + tmpvar_85 = float((dot (texture2D (u_shadowMap0, tmpvar_86), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_84.z - u_params1.x) / _shadowCoord_84.w))); + }; + result_31 = (result_31 + tmpvar_85); + vec4 tmpvar_88; + tmpvar_88.zw = vec2(0.0, 0.0); + tmpvar_88.xy = (vec2(0.5, 1.5) * tmpvar_32); + vec4 _shadowCoord_89; + _shadowCoord_89 = (shadowcoord_1 + tmpvar_88); + float tmpvar_90; + vec2 tmpvar_91; + tmpvar_91 = (_shadowCoord_89.xy / _shadowCoord_89.w); + bool tmpvar_92; + if (any(greaterThan (tmpvar_91, vec2(1.0, 1.0)))) { + tmpvar_92 = bool(1); + } else { + tmpvar_92 = any(lessThan (tmpvar_91, vec2(0.0, 0.0))); + }; + if (tmpvar_92) { + tmpvar_90 = 1.0; + } else { + tmpvar_90 = float((dot (texture2D (u_shadowMap0, tmpvar_91), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_89.z - u_params1.x) / _shadowCoord_89.w))); + }; + result_31 = (result_31 + tmpvar_90); + vec4 tmpvar_93; + tmpvar_93.zw = vec2(0.0, 0.0); + tmpvar_93.xy = (vec2(1.5, -1.5) * tmpvar_32); + vec4 _shadowCoord_94; + _shadowCoord_94 = (shadowcoord_1 + tmpvar_93); + float tmpvar_95; + vec2 tmpvar_96; + tmpvar_96 = (_shadowCoord_94.xy / _shadowCoord_94.w); + bool tmpvar_97; + if (any(greaterThan (tmpvar_96, vec2(1.0, 1.0)))) { + tmpvar_97 = bool(1); + } else { + tmpvar_97 = any(lessThan (tmpvar_96, vec2(0.0, 0.0))); + }; + if (tmpvar_97) { + tmpvar_95 = 1.0; + } else { + tmpvar_95 = float((dot (texture2D (u_shadowMap0, tmpvar_96), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_94.z - u_params1.x) / _shadowCoord_94.w))); + }; + result_31 = (result_31 + tmpvar_95); + vec4 tmpvar_98; + tmpvar_98.zw = vec2(0.0, 0.0); + tmpvar_98.xy = (vec2(1.5, -0.5) * tmpvar_32); + vec4 _shadowCoord_99; + _shadowCoord_99 = (shadowcoord_1 + tmpvar_98); + float tmpvar_100; + vec2 tmpvar_101; + tmpvar_101 = (_shadowCoord_99.xy / _shadowCoord_99.w); + bool tmpvar_102; + if (any(greaterThan (tmpvar_101, vec2(1.0, 1.0)))) { + tmpvar_102 = bool(1); + } else { + tmpvar_102 = any(lessThan (tmpvar_101, vec2(0.0, 0.0))); + }; + if (tmpvar_102) { + tmpvar_100 = 1.0; + } else { + tmpvar_100 = float((dot (texture2D (u_shadowMap0, tmpvar_101), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_99.z - u_params1.x) / _shadowCoord_99.w))); + }; + result_31 = (result_31 + tmpvar_100); + vec4 tmpvar_103; + tmpvar_103.zw = vec2(0.0, 0.0); + tmpvar_103.xy = (vec2(1.5, 0.5) * tmpvar_32); + vec4 _shadowCoord_104; + _shadowCoord_104 = (shadowcoord_1 + tmpvar_103); + float tmpvar_105; + vec2 tmpvar_106; + tmpvar_106 = (_shadowCoord_104.xy / _shadowCoord_104.w); + bool tmpvar_107; + if (any(greaterThan (tmpvar_106, vec2(1.0, 1.0)))) { + tmpvar_107 = bool(1); + } else { + tmpvar_107 = any(lessThan (tmpvar_106, vec2(0.0, 0.0))); + }; + if (tmpvar_107) { + tmpvar_105 = 1.0; + } else { + tmpvar_105 = float((dot (texture2D (u_shadowMap0, tmpvar_106), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_104.z - u_params1.x) / _shadowCoord_104.w))); + }; + result_31 = (result_31 + tmpvar_105); + vec4 tmpvar_108; + tmpvar_108.zw = vec2(0.0, 0.0); + tmpvar_108.xy = (vec2(1.5, 1.5) * tmpvar_32); + vec4 _shadowCoord_109; + _shadowCoord_109 = (shadowcoord_1 + tmpvar_108); + float tmpvar_110; + vec2 tmpvar_111; + tmpvar_111 = (_shadowCoord_109.xy / _shadowCoord_109.w); + bool tmpvar_112; + if (any(greaterThan (tmpvar_111, vec2(1.0, 1.0)))) { + tmpvar_112 = bool(1); + } else { + tmpvar_112 = any(lessThan (tmpvar_111, vec2(0.0, 0.0))); + }; + if (tmpvar_112) { + tmpvar_110 = 1.0; + } else { + tmpvar_110 = float((dot (texture2D (u_shadowMap0, tmpvar_111), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_109.z - u_params1.x) / _shadowCoord_109.w))); + }; + float tmpvar_113; + tmpvar_113 = (result_31 + tmpvar_110); + result_31 = tmpvar_113; + tmpvar_30 = (tmpvar_113 / 16.0); + vec3 tmpvar_114; + tmpvar_114 = -(normalize(v_view)); + vec3 tmpvar_115; + float tmpvar_116; + tmpvar_115 = -(normalize(u_lightPosition.xyz)); + tmpvar_116 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_117; + tmpvar_117 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_118; + tmpvar_118 = normalize(tmpvar_117); + tmpvar_115 = tmpvar_118; + float tmpvar_119; + tmpvar_119 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_120; + tmpvar_120 = sqrt(dot (tmpvar_117, tmpvar_117)); + tmpvar_116 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_120)) + ((u_lightAttenuationSpotOuter.z * tmpvar_120) * tmpvar_120)))) * mix (clamp (((max (0.0, dot (-(tmpvar_118), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_119) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_119)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_121; + tmpvar_121 = dot (v_normal, tmpvar_115); + vec2 tmpvar_122; + tmpvar_122.x = tmpvar_121; + tmpvar_122.y = (((float((tmpvar_121 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_121) * v_normal) - tmpvar_115), tmpvar_114)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_123; + tmpvar_123 = (max (tmpvar_122, 0.0) * tmpvar_116); + float tmpvar_124; + tmpvar_124 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_123.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_123.y)) * u_color.xyz) * tmpvar_30))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_3 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_124) * tmpvar_124)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..5afefd9c5919cf24ed1cadd0abd81d50bb19555f GIT binary patch literal 3955 zcma)9ZEvGS5N^L!{uNuDbb_Aau!~<}rKxmkdcCTxdQ$q`A~sH_Fi^np%PIf8&kVb; zi({*aWC1(#%*!(~44)o8fBRkW&*yi^dKIt5uYW9lc^DLByiBSj&%|@`^jwH_nn(5R z;9Z=plC`+L)?$NgmaOw~BdTaqq;aY4#dc9WN2`4IXH*2Y?fFZ*9OEbjSpBiC<7^w% zKz}Im`mb#rmv2kb@qGeUNcOiZJ1-Y6w`o*<$#>^O?vwR;Tg4Y7K5ib9IIAy6e95bX zJUMZ86Cs2oN`J4MqYx3dN2~Kkk#j_OTIOkfnv)_bqfMnwq?_mRcJLCFha`Iv$aW}R z7B5M>a~_WIuwiGJ=OsMqDP*8BO7S>PR$>z+nehC<*MT5FB^GtOXT1eX3Hw&u3C}?u z?GNJGH8$G$r1i*9^`?O71ws+RTm$5(j46|UKS!`^nH#bLUN8!V0zZC(l;^2Y4haZ_ z>3Ifiv={H+n`1RP_`diGnVth<(raB9!-X`is&n=w*~d>~zf}t)5t8FBGfq$Fi58xa2|hK3LSOuVT!gI5d~4CEr8b2(cP)l-m&m7NYgk*W!E*{h`*owMpktxsR7=cZno}yz zW}QUHKu2>Ay{oZ~7V^rNFlD6gXTXC)8;T`2W@kvk5Sq5$mN6!?XOHHg(YfI`T|Ol@W{0D=j#hcy=0Qrdc-NLe zI1i?3@>X|9G#}jPDIa&2mF?=1+})iwcE3sWW>V}?fOP+8f|VgMYbb0HEfRY)_F7Wv zdC_W08X22t-whsEIDko0FJurN>S}4s4=omtI{SS?-2B#Pk~{$nOaKe!nj)g|vxF(0 z)`2k!$-4Q_-ApXUCcYVJuUyOYV^0-nj}A)&lkw0iJGPg}vK zu{MTsds$I0cZo1=&NU_Gp5oNk2EfURavN7s<1X{cGv2+mGL3fN5An;{coK$&J{Q*Q zW2FFF{ae$?YbxGjRRhv?v2jUmykB+=^gIdM? zCPCXRQ!Jh|Ot}epcyny+t4#&|&>~2Cc)D0NrRH~yr6i4Dk6GBzCUjmEv&@{HA?k{V z3MBh&QRY~KpX@)9jZ6Fvn|ybJN9P` zfNEE5vGTw(ssVV9VVa7Lt4H9T+R}o#+z<6@?ydN2KD##`tFOA!o>n zDa)yk8*90)uw7D3FxH3DlWTE<4C$fPMQ5*AiYF|WQ5$cwZFbJd=4I(-*Pe`uCS%uO z%@o0#&YF);>EcrvJ^f4@J{27lxRPnev>R??7-hvNiykov@Mqe~`cPp6S__&lEBjy4?V acG###(r){gOU+?=2c7|XJ9r%ozWER2l+Y^x literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin new file mode 100644 index 000000000..8d0960d65 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_csm.bin @@ -0,0 +1,311 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); + } else { + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); + } else { + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + float tmpvar_21; + vec2 tmpvar_22; + tmpvar_22 = (v_texcoord1.xy / v_texcoord1.w); + bool tmpvar_23; + if (any(greaterThan (tmpvar_22, vec2(1.0, 1.0)))) { + tmpvar_23 = bool(1); + } else { + tmpvar_23 = any(lessThan (tmpvar_22, vec2(0.0, 0.0))); + }; + if (tmpvar_23) { + tmpvar_21 = 1.0; + } else { + float tmpvar_24; + tmpvar_24 = (((v_texcoord1.z - u_params1.x) / v_texcoord1.w) * u_params1.w); + vec4 tmpvar_25; + tmpvar_25 = texture2D (u_shadowMap0, tmpvar_22); + vec2 tmpvar_26; + tmpvar_26.x = dot (tmpvar_25.xy, vec2(0.00390625, 1.0)); + tmpvar_26.y = dot (tmpvar_25.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_27; + tmpvar_27 = (tmpvar_26 * u_params1.w); + if ((tmpvar_24 < tmpvar_27.x)) { + tmpvar_21 = 1.0; + } else { + float tmpvar_28; + tmpvar_28 = max ((tmpvar_27.y - (tmpvar_27.x * tmpvar_27.x)), u_params1.z); + float tmpvar_29; + tmpvar_29 = (tmpvar_24 - tmpvar_27.x); + tmpvar_21 = (tmpvar_28 / (tmpvar_28 + (tmpvar_29 * tmpvar_29))); + }; + }; + visibility_1 = tmpvar_21; + } else { + if (tmpvar_10) { + vec2 _texcoord_30; + _texcoord_30 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_31; + tmpvar_31 = greaterThan (_texcoord_30, vec2(0.0, 0.0)); + bool tmpvar_32; + if ((tmpvar_31.x && tmpvar_31.y)) { + bvec2 tmpvar_33; + tmpvar_33 = lessThan (_texcoord_30, vec2(1.0, 1.0)); + tmpvar_32 = (tmpvar_33.x && tmpvar_33.y); + } else { + tmpvar_32 = bool(0); + }; + float tmpvar_34; + tmpvar_34 = (float(tmpvar_32) * 0.4); + vec3 tmpvar_35; + tmpvar_35.x = tmpvar_34; + tmpvar_35.y = tmpvar_34; + tmpvar_35.z = -(tmpvar_34); + colorCoverage_2 = tmpvar_35; + float tmpvar_36; + vec2 tmpvar_37; + tmpvar_37 = (v_texcoord2.xy / v_texcoord2.w); + bool tmpvar_38; + if (any(greaterThan (tmpvar_37, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_37, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_36 = 1.0; + } else { + float tmpvar_39; + tmpvar_39 = (((v_texcoord2.z - u_params1.x) / v_texcoord2.w) * u_params1.w); + vec4 tmpvar_40; + tmpvar_40 = texture2D (u_shadowMap1, tmpvar_37); + vec2 tmpvar_41; + tmpvar_41.x = dot (tmpvar_40.xy, vec2(0.00390625, 1.0)); + tmpvar_41.y = dot (tmpvar_40.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_42; + tmpvar_42 = (tmpvar_41 * u_params1.w); + if ((tmpvar_39 < tmpvar_42.x)) { + tmpvar_36 = 1.0; + } else { + float tmpvar_43; + tmpvar_43 = max ((tmpvar_42.y - (tmpvar_42.x * tmpvar_42.x)), u_params1.z); + float tmpvar_44; + tmpvar_44 = (tmpvar_39 - tmpvar_42.x); + tmpvar_36 = (tmpvar_43 / (tmpvar_43 + (tmpvar_44 * tmpvar_44))); + }; + }; + visibility_1 = tmpvar_36; + } else { + if (tmpvar_13) { + vec2 _texcoord_45; + _texcoord_45 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_46; + tmpvar_46 = greaterThan (_texcoord_45, vec2(0.0, 0.0)); + bool tmpvar_47; + if ((tmpvar_46.x && tmpvar_46.y)) { + bvec2 tmpvar_48; + tmpvar_48 = lessThan (_texcoord_45, vec2(1.0, 1.0)); + tmpvar_47 = (tmpvar_48.x && tmpvar_48.y); + } else { + tmpvar_47 = bool(0); + }; + float tmpvar_49; + tmpvar_49 = (float(tmpvar_47) * 0.4); + vec3 tmpvar_50; + tmpvar_50.x = -(tmpvar_49); + tmpvar_50.y = -(tmpvar_49); + tmpvar_50.z = tmpvar_49; + colorCoverage_2 = tmpvar_50; + float tmpvar_51; + vec2 tmpvar_52; + tmpvar_52 = (v_texcoord3.xy / v_texcoord3.w); + bool tmpvar_53; + if (any(greaterThan (tmpvar_52, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_52, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_51 = 1.0; + } else { + float tmpvar_54; + tmpvar_54 = (((v_texcoord3.z - u_params1.x) / v_texcoord3.w) * u_params1.w); + vec4 tmpvar_55; + tmpvar_55 = texture2D (u_shadowMap2, tmpvar_52); + vec2 tmpvar_56; + tmpvar_56.x = dot (tmpvar_55.xy, vec2(0.00390625, 1.0)); + tmpvar_56.y = dot (tmpvar_55.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_57; + tmpvar_57 = (tmpvar_56 * u_params1.w); + if ((tmpvar_54 < tmpvar_57.x)) { + tmpvar_51 = 1.0; + } else { + float tmpvar_58; + tmpvar_58 = max ((tmpvar_57.y - (tmpvar_57.x * tmpvar_57.x)), u_params1.z); + float tmpvar_59; + tmpvar_59 = (tmpvar_54 - tmpvar_57.x); + tmpvar_51 = (tmpvar_58 / (tmpvar_58 + (tmpvar_59 * tmpvar_59))); + }; + }; + visibility_1 = tmpvar_51; + } else { + vec2 _texcoord_60; + _texcoord_60 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_61; + tmpvar_61 = greaterThan (_texcoord_60, vec2(0.0, 0.0)); + bool tmpvar_62; + if ((tmpvar_61.x && tmpvar_61.y)) { + bvec2 tmpvar_63; + tmpvar_63 = lessThan (_texcoord_60, vec2(1.0, 1.0)); + tmpvar_62 = (tmpvar_63.x && tmpvar_63.y); + } else { + tmpvar_62 = bool(0); + }; + float tmpvar_64; + tmpvar_64 = (float(tmpvar_62) * 0.4); + vec3 tmpvar_65; + tmpvar_65.x = tmpvar_64; + tmpvar_65.y = -(tmpvar_64); + tmpvar_65.z = -(tmpvar_64); + colorCoverage_2 = tmpvar_65; + float tmpvar_66; + vec2 tmpvar_67; + tmpvar_67 = (v_texcoord4.xy / v_texcoord4.w); + bool tmpvar_68; + if (any(greaterThan (tmpvar_67, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_67, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_66 = 1.0; + } else { + float tmpvar_69; + tmpvar_69 = (((v_texcoord4.z - u_params1.x) / v_texcoord4.w) * u_params1.w); + vec4 tmpvar_70; + tmpvar_70 = texture2D (u_shadowMap3, tmpvar_67); + vec2 tmpvar_71; + tmpvar_71.x = dot (tmpvar_70.xy, vec2(0.00390625, 1.0)); + tmpvar_71.y = dot (tmpvar_70.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_72; + tmpvar_72 = (tmpvar_71 * u_params1.w); + if ((tmpvar_69 < tmpvar_72.x)) { + tmpvar_66 = 1.0; + } else { + float tmpvar_73; + tmpvar_73 = max ((tmpvar_72.y - (tmpvar_72.x * tmpvar_72.x)), u_params1.z); + float tmpvar_74; + tmpvar_74 = (tmpvar_69 - tmpvar_72.x); + tmpvar_66 = (tmpvar_73 / (tmpvar_73 + (tmpvar_74 * tmpvar_74))); + }; + }; + visibility_1 = tmpvar_66; + }; + }; + }; + vec3 tmpvar_75; + tmpvar_75 = -(normalize(v_view)); + vec3 tmpvar_76; + float tmpvar_77; + tmpvar_76 = -(normalize(u_lightPosition.xyz)); + tmpvar_77 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_78; + tmpvar_78 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_79; + tmpvar_79 = normalize(tmpvar_78); + tmpvar_76 = tmpvar_79; + float tmpvar_80; + tmpvar_80 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_81; + tmpvar_81 = sqrt(dot (tmpvar_78, tmpvar_78)); + tmpvar_77 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_81)) + ((u_lightAttenuationSpotOuter.z * tmpvar_81) * tmpvar_81)))) * mix (clamp (((max (0.0, dot (-(tmpvar_79), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_80) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_80)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_82; + tmpvar_82 = dot (v_normal, tmpvar_76); + vec2 tmpvar_83; + tmpvar_83.x = tmpvar_82; + tmpvar_83.y = (((float((tmpvar_82 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_82) * v_normal) - tmpvar_76), tmpvar_75)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_84; + tmpvar_84 = (max (tmpvar_83, 0.0) * tmpvar_77); + float tmpvar_85; + tmpvar_85 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_84.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_84.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_85) * tmpvar_85)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..68228e896ece08d18a4288fb466aa8caad66d4d0 GIT binary patch literal 3999 zcma)9ZEvGS5N^L!{uNuDbb_Aau!~<}rKxmkdcCTxdQ$q`A~sH_Fi^np%PIf8&kXFc zi({*IQsiZ4o_Tv_7(P9G{`R}#pU>}-^(tPAU;kMA@-QgMc$rj5o{8t=>A4W=G>_`r z!MiwHC2Mhg-HHviS+dT{ji{nck;bLE7u!Yk9If)*pHUIqn){b{ImT5Au=--z+*knC?+c3v)CZqumzlJCxm+$Zbxwu&!EeB3-HaaLcD_>xx% zd2-_HCPD~Fl>S~hS0N%cSF7_^k#j|PTIOkfnv)_bqfMnwq?_mRcJLCFha`Iv$aW}R z7B5M>a~_WIu&K^6&r5jJQ^-)tD8=JES&2=QWWw_YUk8E!l~~mAp7jP-RD3xpzs{tb|)GNw%a{T#uvWp2n0c)=(b3jFaKq&!cxa!5cR zrsrw2(O$fNudmhU;QQh$WO@#aNzb@2h6`z2Rp;zWvX4KFeWMmq_^sWsV|NU@WZ_lB zX%)8)w34Lth!DJ>5g|G5GVSz)p0vUfGQqdnQ0R*vkc*I&x!$el)KZ(mn>&NyTpVz5 zrNJhQq5($7(>qugYoM70G#l+8jGQ>nQ2qbUh}P_k&AKc)5~`Dw8+t-%)6UH40aZTA z4xYmwgS$Vp{ORgv*w6~i;V&0Mo~;*&kd2NYrv^HLb~Pp6v=z<4_I%T&&S8iXvEb&^D*!jqozad%nSo+y$hLFbL#n^L`*7kg|V zyFco9Wr$4biWx+!X1%`dF;%v+#b`tpc?ko-Uyc)%>opl=P`{ zxC$HEn$D|Ymg(Cwg}S0b1(N-?O6FLDpX@&^BRoil&1>>iDb8M2~jIrVX{7V!$3C~<!byzb+@TRlo<5Rl$R7Ouf)7Joz4hqa<8Zu@ZZVZD~oU-T_?3$Iqe5^#xnLk6A?c9PEuKhXX;yO2d+!f*Kluc+;q1M*UJ`~nx zoQvvS^f{=8C962}wzPf6_m0z&r&oHAPb1xB9}L!svhPrP_v lC`2Mhv*|31uY$mOW2&hgHuy-|rhl0xPNmIC{W=(Y^B=>H-YftB literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin new file mode 100644 index 000000000..86cbf7c61 --- /dev/null +++ b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_csm.bin @@ -0,0 +1,319 @@ +FSHF­œ#ifdef GL_ES +precision highp float; +#endif // GL_ES + +uniform sampler2D u_shadowMap3; +uniform sampler2D u_shadowMap2; +uniform sampler2D u_shadowMap1; +uniform sampler2D u_shadowMap0; +uniform vec4 u_lightAttenuationSpotOuter; +uniform vec4 u_lightSpotDirectionInner; +uniform vec4 u_lightSpecularPower; +uniform vec4 u_lightDiffusePower; +uniform vec4 u_lightAmbientPower; +uniform vec4 u_lightPosition; +uniform vec4 u_materialKs; +uniform vec3 u_materialKd; +uniform vec3 u_materialKa; +uniform vec4 u_color; +uniform vec4 u_params2; +uniform vec4 u_params1; +varying vec3 v_view; +varying vec4 v_texcoord4; +varying vec4 v_texcoord3; +varying vec4 v_texcoord2; +varying vec4 v_texcoord1; +varying vec3 v_normal; +void main () +{ + float visibility_1; + vec3 colorCoverage_2; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); + } else { + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); + } else { + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + vec4 tmpvar_21; + tmpvar_21.w = 1.0; + tmpvar_21.xy = (v_texcoord1.xy / v_texcoord1.w); + tmpvar_21.z = v_texcoord1.z; + float tmpvar_22; + bool tmpvar_23; + if (any(greaterThan (tmpvar_21.xy, vec2(1.0, 1.0)))) { + tmpvar_23 = bool(1); + } else { + tmpvar_23 = any(lessThan (tmpvar_21.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_23) { + tmpvar_22 = 1.0; + } else { + float tmpvar_24; + tmpvar_24 = ((v_texcoord1.z - u_params1.x) * u_params1.w); + vec4 tmpvar_25; + tmpvar_25 = texture2D (u_shadowMap0, tmpvar_21.xy); + vec2 tmpvar_26; + tmpvar_26.x = dot (tmpvar_25.xy, vec2(0.00390625, 1.0)); + tmpvar_26.y = dot (tmpvar_25.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_27; + tmpvar_27 = (tmpvar_26 * u_params1.w); + if ((tmpvar_24 < tmpvar_27.x)) { + tmpvar_22 = 1.0; + } else { + float tmpvar_28; + tmpvar_28 = max ((tmpvar_27.y - (tmpvar_27.x * tmpvar_27.x)), u_params1.z); + float tmpvar_29; + tmpvar_29 = (tmpvar_24 - tmpvar_27.x); + tmpvar_22 = (tmpvar_28 / (tmpvar_28 + (tmpvar_29 * tmpvar_29))); + }; + }; + visibility_1 = tmpvar_22; + } else { + if (tmpvar_10) { + vec2 _texcoord_30; + _texcoord_30 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_31; + tmpvar_31 = greaterThan (_texcoord_30, vec2(0.0, 0.0)); + bool tmpvar_32; + if ((tmpvar_31.x && tmpvar_31.y)) { + bvec2 tmpvar_33; + tmpvar_33 = lessThan (_texcoord_30, vec2(1.0, 1.0)); + tmpvar_32 = (tmpvar_33.x && tmpvar_33.y); + } else { + tmpvar_32 = bool(0); + }; + float tmpvar_34; + tmpvar_34 = (float(tmpvar_32) * 0.4); + vec3 tmpvar_35; + tmpvar_35.x = tmpvar_34; + tmpvar_35.y = tmpvar_34; + tmpvar_35.z = -(tmpvar_34); + colorCoverage_2 = tmpvar_35; + vec4 tmpvar_36; + tmpvar_36.w = 1.0; + tmpvar_36.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_36.z = v_texcoord2.z; + float tmpvar_37; + bool tmpvar_38; + if (any(greaterThan (tmpvar_36.xy, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_36.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_37 = 1.0; + } else { + float tmpvar_39; + tmpvar_39 = ((v_texcoord2.z - u_params1.x) * u_params1.w); + vec4 tmpvar_40; + tmpvar_40 = texture2D (u_shadowMap1, tmpvar_36.xy); + vec2 tmpvar_41; + tmpvar_41.x = dot (tmpvar_40.xy, vec2(0.00390625, 1.0)); + tmpvar_41.y = dot (tmpvar_40.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_42; + tmpvar_42 = (tmpvar_41 * u_params1.w); + if ((tmpvar_39 < tmpvar_42.x)) { + tmpvar_37 = 1.0; + } else { + float tmpvar_43; + tmpvar_43 = max ((tmpvar_42.y - (tmpvar_42.x * tmpvar_42.x)), u_params1.z); + float tmpvar_44; + tmpvar_44 = (tmpvar_39 - tmpvar_42.x); + tmpvar_37 = (tmpvar_43 / (tmpvar_43 + (tmpvar_44 * tmpvar_44))); + }; + }; + visibility_1 = tmpvar_37; + } else { + if (tmpvar_13) { + vec2 _texcoord_45; + _texcoord_45 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_46; + tmpvar_46 = greaterThan (_texcoord_45, vec2(0.0, 0.0)); + bool tmpvar_47; + if ((tmpvar_46.x && tmpvar_46.y)) { + bvec2 tmpvar_48; + tmpvar_48 = lessThan (_texcoord_45, vec2(1.0, 1.0)); + tmpvar_47 = (tmpvar_48.x && tmpvar_48.y); + } else { + tmpvar_47 = bool(0); + }; + float tmpvar_49; + tmpvar_49 = (float(tmpvar_47) * 0.4); + vec3 tmpvar_50; + tmpvar_50.x = -(tmpvar_49); + tmpvar_50.y = -(tmpvar_49); + tmpvar_50.z = tmpvar_49; + colorCoverage_2 = tmpvar_50; + vec4 tmpvar_51; + tmpvar_51.w = 1.0; + tmpvar_51.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_51.z = v_texcoord3.z; + float tmpvar_52; + bool tmpvar_53; + if (any(greaterThan (tmpvar_51.xy, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_51.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_52 = 1.0; + } else { + float tmpvar_54; + tmpvar_54 = ((v_texcoord3.z - u_params1.x) * u_params1.w); + vec4 tmpvar_55; + tmpvar_55 = texture2D (u_shadowMap2, tmpvar_51.xy); + vec2 tmpvar_56; + tmpvar_56.x = dot (tmpvar_55.xy, vec2(0.00390625, 1.0)); + tmpvar_56.y = dot (tmpvar_55.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_57; + tmpvar_57 = (tmpvar_56 * u_params1.w); + if ((tmpvar_54 < tmpvar_57.x)) { + tmpvar_52 = 1.0; + } else { + float tmpvar_58; + tmpvar_58 = max ((tmpvar_57.y - (tmpvar_57.x * tmpvar_57.x)), u_params1.z); + float tmpvar_59; + tmpvar_59 = (tmpvar_54 - tmpvar_57.x); + tmpvar_52 = (tmpvar_58 / (tmpvar_58 + (tmpvar_59 * tmpvar_59))); + }; + }; + visibility_1 = tmpvar_52; + } else { + vec2 _texcoord_60; + _texcoord_60 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_61; + tmpvar_61 = greaterThan (_texcoord_60, vec2(0.0, 0.0)); + bool tmpvar_62; + if ((tmpvar_61.x && tmpvar_61.y)) { + bvec2 tmpvar_63; + tmpvar_63 = lessThan (_texcoord_60, vec2(1.0, 1.0)); + tmpvar_62 = (tmpvar_63.x && tmpvar_63.y); + } else { + tmpvar_62 = bool(0); + }; + float tmpvar_64; + tmpvar_64 = (float(tmpvar_62) * 0.4); + vec3 tmpvar_65; + tmpvar_65.x = tmpvar_64; + tmpvar_65.y = -(tmpvar_64); + tmpvar_65.z = -(tmpvar_64); + colorCoverage_2 = tmpvar_65; + vec4 tmpvar_66; + tmpvar_66.w = 1.0; + tmpvar_66.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_66.z = v_texcoord4.z; + float tmpvar_67; + bool tmpvar_68; + if (any(greaterThan (tmpvar_66.xy, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_66.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_67 = 1.0; + } else { + float tmpvar_69; + tmpvar_69 = ((v_texcoord4.z - u_params1.x) * u_params1.w); + vec4 tmpvar_70; + tmpvar_70 = texture2D (u_shadowMap3, tmpvar_66.xy); + vec2 tmpvar_71; + tmpvar_71.x = dot (tmpvar_70.xy, vec2(0.00390625, 1.0)); + tmpvar_71.y = dot (tmpvar_70.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_72; + tmpvar_72 = (tmpvar_71 * u_params1.w); + if ((tmpvar_69 < tmpvar_72.x)) { + tmpvar_67 = 1.0; + } else { + float tmpvar_73; + tmpvar_73 = max ((tmpvar_72.y - (tmpvar_72.x * tmpvar_72.x)), u_params1.z); + float tmpvar_74; + tmpvar_74 = (tmpvar_69 - tmpvar_72.x); + tmpvar_67 = (tmpvar_73 / (tmpvar_73 + (tmpvar_74 * tmpvar_74))); + }; + }; + visibility_1 = tmpvar_67; + }; + }; + }; + vec3 tmpvar_75; + tmpvar_75 = -(normalize(v_view)); + vec3 tmpvar_76; + float tmpvar_77; + tmpvar_76 = -(normalize(u_lightPosition.xyz)); + tmpvar_77 = 1.0; + if ((0.0 != u_lightPosition.w)) { + vec3 tmpvar_78; + tmpvar_78 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_79; + tmpvar_79 = normalize(tmpvar_78); + tmpvar_76 = tmpvar_79; + float tmpvar_80; + tmpvar_80 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_81; + tmpvar_81 = sqrt(dot (tmpvar_78, tmpvar_78)); + tmpvar_77 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_81)) + ((u_lightAttenuationSpotOuter.z * tmpvar_81) * tmpvar_81)))) * mix (clamp (((max (0.0, dot (-(tmpvar_79), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_80) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_80)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + }; + float tmpvar_82; + tmpvar_82 = dot (v_normal, tmpvar_76); + vec2 tmpvar_83; + tmpvar_83.x = tmpvar_82; + tmpvar_83.y = (((float((tmpvar_82 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_82) * v_normal) - tmpvar_76), tmpvar_75)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_84; + tmpvar_84 = (max (tmpvar_83, 0.0) * tmpvar_77); + float tmpvar_85; + tmpvar_85 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_84.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_84.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_85) * tmpvar_85)))), 0.0, 1.0)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..056cb15b7dea70ae693ad15b3397f75b382f5622 GIT binary patch literal 7098 zcma)B+in{-5N%)e6)XY-Qe(^7i*86=AdQ=}=q;%G(kEdft?UI>T2&Y866B%((O>94 zc4o*SIeV*H!0|3QGlw&0&XV-I`yal1_xHd5yvUY|bgAC|Jp2B>v)QKeY?l>l^_V?8 zZqza_lKtz>i*&unmg?rlOzRxh*|ONK)Gk?V@^l;Csl#mdm@JCpFUe-`+KxY^^9Y9a z>3*C13I<93d%9>F{w_bHZR3BYd0rgbX1w2~=~_&P0YMJS*}vKE)Ab?Q!}{(w#s0U$ zKHb*O#NoRPl7Vx7T(6twrSn6cY(EsorYU#Xa(URLEi>M%K4$59-!kJvvC9xi1?(z; zC1gqd(@qRw&h1b&-*zYwR+y)Gkr&mRY?5uV+J%+b`hD=a^OS7Q+4@0Iy`N@JSqe4s zUdHMPNN}1L#dZ-ljzo>q^ghis5oQ2`-bae^^tO0Px5+~~1K>)PruI+jRxOIX>I(i7J+C~N{nPo< ztFu4X+Uo{*mV-;J1MIM8nICJ-p?~YGQ7P1ZwSlD1pv21l4sKS-NpAudJvFTkklSwa2O zjqj#^Buq+u1YU)VV5I$+1dYJS!#2h4{o^qKB6V+jPr#s+jdNzG+cnMSe&IFiZFdFBOsq&#MF0AC<1nth~Ryk^U(F>%A# zY8xf3$gR3G|Ilcsjw?0RM08BlShGmk5 zmZT+i1U3w3Cj?gwR1Ja#u1dBBB##K)Cu{(qJjTMKPuVgoQWSLIsu}~ZI^tSXRpvV5 z2ouChj3tuT(pM=_Nk2L|5FCcNnmX_$@U<{73gTi9F}C1x5J@tdj|}58+TlEmh|oM- z2>{&>AzFq7r-PyC2UY&6c}@(3QaWm>4bE+FpW1EOYZ+3dx6wMxy+?WyAJ-gFnc$H} z@G_UI0=k5v2sV*?+(_~g&5dFqQbBYnjsdD8e~oZ%30`Q#OAnbMh64atOLj(AM|QV9 zl27YP&^;V@bgv=2bW)Z#PR7Y)#u9ey$sj2lPsg2tp7Uec-lauFD+mj>?OnM}! z9S;A8+Ep0}Q7IfHYr=qbzy!zZv9~;iGU*F>5B)jK)V65MSB(ClAHdq!7K=2FBTf5w zMu75Qj@?V(D}3O@PDXQBzS7%dXNIWdj0^e|AJd3JVWl`;M2(Ajo2<`WL3HQ(bT&kH zRI(CmW<@AYL;x}S+|tr zi@Js*yg8KjPsl&_$fpv&oRLu=c8byi$MpSSo5Gb299(rh@J{E76CO^Xn1*&FXl!h> z$37C5=>W{H@GI>UXAn&Xqi`q=7d#V$1fZ0RFUNLcfyO8nJM>i|ifa?&f3u@deZvcm zhLB3GndN!pRjnc|vT|1S7z`>NorWzZhOpjiM-hk!5P3Sqzw%0{?+Z{vWgsgUZ0R4- zU`f})B?}`@#syhGBRJD~53k(A*h4n%@u^VAMP%cUs&D|@WLAG6<`;!kTJ5*I6-~9cAL^Qxj_#xTwD}CRnnC)pgs&8-A6bvCL?kgo(Knltg zMg61{@inTgex$EceDRG*@z_)xR%78+A5@_Z1~Qur5gws~m2ZlpxjdwW5(+R0p@*$T z#K31kSnS*(s^mZ6fwl9=c zyS_5UsEn?|w2HvD&eO+-eD)5mn&0B}JdzF!h{-52_Nq_^23k?dl8>MS@E^CA_g4n; zfSUs?6aL6i?;6~n2=p^;9Et7Jf}UUh?;Fyu7%BT*pkGee7&j}}+6?x7yo|ca299T&uSPI~-vH(5?cr7!UD(%wqXBZ~^ejyJxq(qRXo*#kxYum!38utSIP@ hN8>2H9t?)wiYNZ^ftQHF_AyaTRNU^fKX*D`{0I86X8`~J literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_omni.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_lightning_vsm_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..367d049f8354c04e372faffb61a2dbb164e78593 GIT binary patch literal 7052 zcma)B+iu%N5N%)e6i()a)7vlZT)9-J4>rFl@wneoP_r=}) zS}e*c+gDY35It0 zZj=2AhphZPpLY#^SMKw!@jvsjtPWik?>BkA3Jg*pC^4Pg>)kG2?Xw-`ce}23zwLMV zrrDB)-xeqa+5Wg%wcF*heVJ`OREIW`x5Z+y-{u__ua_T-e6{Pa_)u*NLUICjnPCb= zR{pdNhN$Lt=(OH;C=0x(PP3}4PHVExHraA3PpsAZ_`3IyZJvtNo#1{yOdpCIJ@Q_r z;sGRhoK@9kp0_TP9{OB5Xj2r`%~Agw3!>i_pMXh(Z3Z;QOKv*1R|-qk>4>Hx{1RWDQo`Pm?>PTcRIlpCF60Ea?%%Hqdtia!OEkJV|;(k^b8mYPXa zccoQy;#yn&&RwMrrrk(RWV9($uT_BxA*>@BYY)weS>^Z=Yu@@CjbpfaB$aiNN=woj zJ7Sy0R7WCI3svK|g{vW3W0psP?h`f!D37st^eJ11#fm~9Tvt;7Ya*^ib;?}loKS(x z6w?q%YUwLP&`Cc#1qe6{TSXmw34AS#wSu_ZBg!3cIZi?{>yM1Vr?taH7&D>G@JRx! zex&Fa4mcf;^m-8WubLM`L#UObk=h7ull#=}(q7AuQ+jKyquP6ckJJFRdK8D5M*nB+J;+*SDb+U}d|- zhL(XTiU+q<+#QHY=L~a9+_Cih6w&*&kEm=)%tdQEY4KkwKMQsl9d}@1=WD>I;1=N}yEfsh%y*r>ODAxT|HR95sMDwWZXuViJ*_;OxEIZ*ttz;54ct(nZag^)Wl~ptD*{Odwk9`bcYD(RbHX zZJ1mQ$8r=L7mOvO;newf=ynd!Xbmy}{dJ$DjaBi#!if~$*x8OyTGK=)L|z+fjjVm! z602hd3~3mjZ!JkinD4pc3^D?uG3WeeULVyB0I6cg87l$C(?4`!O6NgHBX!!Cd1(QS z!6onEm3x?Y$R>Sr&T|5QE+jS&>x4l=+otnK-K!MG948LC`B4!9FIJ6UYH1)FRC+&< zzOXa*USQc#Mb(*8+7Ia^$6dxjS$uVait&WG zl=cMMzc#yw@23nPoaXGWCX9JO^^PJ``~sTQ1?EwJSzQKCj%_I&4`AMDe+=w{2XGb7 z%L126vl2Jaq^GUKN3roMe&X7T4wT(xI*4y?#1$M-6!+N*S-=WvI!gMOe6DVtS;g_a4JSvU0)ef zQbxDJl#1Y6=jr2JIemxA<2Q8SPNahaGnqujZb4LH(27fzeS{L=KeN2NzZ-A_+8HRB z@J9|*5U)m=dgiSlvz?cq7uWxbMHn|2smGmDTvM_MZC+?;8?d))?=K}`)NrUCcB?S@ zq3Mu8Q}U)@hvgOc&$|k$VmhM#sfzXA5CZV(`(d}Y;_Ik0VRVI+FMnK1%qSjA#*-vJ h9}Y*}j4%D^gO`NDu4ATL(D4KMjiA@P&%NFk{{g1@SeO6+ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_color_texture.bin b/examples/runtime/shaders/gles/fs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..d3345883ec8f0527886e56ea1ff5e225fbb2aa5e GIT binary patch literal 605 zcmZXRL2iRE5JlUq4^fSj4XDUT46I1IX`6P@T@HX;FvJpIWC%$bq2Pu4u`lEr#Dq79gWpaBmowZ+il17SynmVErZUqCrasb6_HNK6iO~Da9naBU|Irb z%Nix|I>HOPhZjIyd(Z+$I@3&V4s?wI5x$kN8G<3AR!49wlAg}LD93h(QRabNT#Ff< z_%n=eWX8?S!gUvqifSCne(I7ORhj#9FxBMf=WU_!hQeMPc&GY`3PkC|p Hm5_%&zbm=O literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin b/examples/runtime/shaders/gles/fs_shadowmaps_hblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..dbc5678564fd9ad10f72e299774f6fa489853dc1 GIT binary patch literal 1451 zcmchXyKaLp6o%WCr#Mm;NQh$_3`9|=@7O^J!2B7xhMuO;js&ou;Q~=N|m@rJI>J#J=!4$ z9lFO^P9Q}Bc_a!jE#uvQ^(a+d>d`{|Ccw6aJ4jU&S7v=BvI5i8Lsw(PwVSywXYX?? zXaYu*x|A?WceJj_P}jq*$J-bOHW0)p3xeenv-Mewoi6sMt_i}H1ugh9jiA|l1H{Dd zy8i;6NL);>OQf|Up^ig>%R5rEb-WhQsU5M49TxbPmvm~$t0CQ;Px# literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_hblur_vsm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_hblur_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..6af9051f8be754aaece52b4ac49fae79f159cb7f GIT binary patch literal 2703 zcmb7`&2F1O5XYMch^2ZpjGu-$wo)%jYHduFLUh;SL73EFy{=N?FgeJG zXIkRDkT#-=;8{%o!C{v|UG|A+?7Eu|AlAH9(PTUv*t_A#{g zO5yYNQsLqMZL8@o>|1a&p@14|xg-RUt8mf8`cPNla`d=dh0C$^xjfc_r_J@ey~yRW zP+#Hl^tgP5%e#UrU@ZiiT=Z(S^8$1n2$gw-EHqTO0zIx!;R>$cidYMgHdi;V0WP2= z-M@$+6|zW=j4EF*vFHjkI1vYE!ZoYp_%cdYI$jtkQvCok81=}kAS8~sPy&ts8nAiz+D2mGNFFE`3=|~xK2Rz31|w1N)^6qlmgr- zpeq&kWqw0^Tq~e@1vJG%r3#;hTKZiUxLY7<)?fSSc2M!5+mT)C<=SW0A-e|2zaam@ z%YoOQkuGvMp`^C5DxTD4zx|V)=3%c2ax*(8^0()`%6J?2ajAR*z6hy zR~=6y)ZxeeXoBR@zBxLajOdKholvaP(+Sdh!efBPkfGj)na;87)o z`5OIsU$fr4PTZ&enxd(+ftR=9c|)AnCGOF-u*G`oz%*8MIhpFVLIY9sV2&;p`r}aFvtZVg);eEl@^22wWW9&V`F2&couWVFkvkvZF)Y5c~wuA0mHeFayCQ zgZX95MkI}Snq^s{=R#x)NTpn+Tr41w?wJpKN1&h@`*q_czTChvO;4 X4Bt>OU_ukiN0BD-KRx2lgxq}tGtyk> literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/gles/fs_shadowmaps_packdepth_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..a5528773643b451e4527a22b46b81e57cba063fc GIT binary patch literal 288 zcmZ{cO%8%E5Jq*|E4Z12O;N-G0x`su5jAng0Z0QaGyzH~A*k^-9#q7?m7AF_-@JKY zv>)Fmhl?h7$~f$f@is!WVu?5jSwSwcyarxK+5|{rRVp|v7HszNpn981(V$fUd#PH$1ic~n7NFmEHj=GU`{HYO0F3b*re}x(iyjFqfzgD( z&E;}gJCA#S2N<_lWn|uC{KGFV-Iyn9%5Gsr86o7i5eG&*8zJI7w~ZVBCn)?fnyofxK2uMlY>@i>{zRI zBL>Z%$KUQ>C+F$gX=Ze$H16J$mp#-@rRKxf3Ja4LHR{sJCWe`+GNW-m?_qNK+x9@CAsiN(DBD+UJu+>_3JXpHVxRHiY!Yc>fzFV!2}c0T+x@ zN-q~7Ap$~-L}*;A(7(8+p+yvM5$ld#B)5W(Qq7}rly`aU_-9y(0W!w4v`6(ET-vKgE5e0X|Y#r=Z$1X9IL_H4(wTSn3UWp yIGjwK;q(SIv*^uCm^8ME0>%kE0MYrX5am80?r>IzQOx{{f5Y|vBgx?juy_GhGCrUH literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_texture_lightning.bin b/examples/runtime/shaders/gles/fs_shadowmaps_texture_lightning.bin new file mode 100644 index 0000000000000000000000000000000000000000..0f098eb2f61a1f4e100941190263a6919fe424cc GIT binary patch literal 2169 zcmbVNOK;jh5N@yj6(i-cPKbkfv_zC#nx?IkN>y^KBFlk=tmFr^4FRI`m-oB1JCWH$ zP3hvos(Fh{P4gn9GEV1-EIQY;h$^}IoF{oPtZ$cc+`~lzsOoO^_&v*HardkLa9rbO zUf#tMwJ48ilyf;=BykayPbyQHEXxCs@qzO$oFne(qLdA7EsxVjB{SsaQnA6#<04LX zz|*+WIV_cY9(v2TSgUMC(CyOlP}qSGWfX ziozkz49ykeVn&@>s6)6`Mbxb&1~BSrfjiU49@R#QWn{!Yn>c%@oC|Ydlr*w$baY}> zI!B^WUmLkIY(!l&Iz>fHp@J3L?FI~0orGuy?H0Ko*3voR7L_3aeMq>(S;!@zPt+fh zPcKk`lBOSxbFi-hDWebCl6D2!GGIWIaY_O~+Q2q+MPbnP9oD{?z$Kj<7ecTnp#${k zYP3yn5yX#?8_Gv*DH(GH5OE8pxmW$zX>$T%#A&)}MzAy|{uzv$O4Au@@2+=`T>-@sDj}JE*J`#0l`7NsF z$p)~;VbSNVpND_T0#I+{|TDY$q_^Zc2P;2;acw1^HDT>$pL z&ZKtsmI__az*OuLJ4vER9Tqov^EgK+y}a6LebSeoP&lT93!xeRTu8 zHAJ%{x+&rrzXKL~oZ!I)6_`ZA>i1D$XUaina+?j@>+65LhWAhC%b5w)!GxXv!+|&6 W@_N}Ggsr#PBI2i6C-v%i@BRVi1Dsv} literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/gles/fs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..158d75d61f1fbfc353bea78759cd13bc869290d7 GIT binary patch literal 366 zcmYk1&rZWI494M_hd`EgNu|U;-7 zW~Gx&7p51zlZ~yl3twp1RZ`*fDXmD^DBa1l<>Cur%z8cNh)yjNGzuDNTHqf0X7Cr? zH@8Q=1E=_YaGEIiHHLqE*`to0;8C!T#V*$O zLL@%LM`4sCOBeYd0wK105r_FaXK!IC>+IlU`HVF>Vmafc?1!-IMMX8s>@ zIKExt)#Lrf7TOf>`kuWUne!&Moy8U^TUHK=8daaNjcK(lV7vW0V?%2T^bL$AzlI@m z%B!YJ(tqBm#?{6r&$R3+rE&UDE>78~{A}BD(Iqfuy$Ly@*UJX2hDO;IxL{uley#h) zktExt1WvP@-~o1$G%FV7PofSd;N-pM8hhYm-w)nU3%;%qt&@ceGXd(uV;RT$yZAP_ ii57n$M0Ea5h7iOOS=QOXtMUnJ^b~n&m9lTfE`9(IoNQzO literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin b/examples/runtime/shaders/gles/fs_shadowmaps_vblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..dbc5678564fd9ad10f72e299774f6fa489853dc1 GIT binary patch literal 1451 zcmchXyKaLp6o%WCr#Mm;NQh$_3`9|=@7O^J!2B7xhMuO;js&ou;Q~=N|m@rJI>J#J=!4$ z9lFO^P9Q}Bc_a!jE#uvQ^(a+d>d`{|Ccw6aJ4jU&S7v=BvI5i8Lsw(PwVSywXYX?? zXaYu*x|A?WceJj_P}jq*$J-bOHW0)p3xeenv-Mewoi6sMt_i}H1ugh9jiA|l1H{Dd zy8i;6NL);>OQf|Up^ig>%R5rEb-WhQsU5M49TxbPmvm~$t0CQ;Px# literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_shadowmaps_vblur_vsm.bin b/examples/runtime/shaders/gles/fs_shadowmaps_vblur_vsm.bin new file mode 100644 index 0000000000000000000000000000000000000000..6af9051f8be754aaece52b4ac49fae79f159cb7f GIT binary patch literal 2703 zcmb7`&2F1O5XYMch^2ZpjGu-$wo)%jYHduFLUh;SL73EFy{=N?FgeJG zXIkRDkT#-=;8{%o!C{v|UG|A+?7Eu|AlAH9(PTUv*t_A#{g zO5yYNQsLqMZL8@o>|1a&p@14|xg-RUt8mf8`cPNla`d=dh0C$^xjfc_r_J@ey~yRW zP+#Hl^tgP5%e#UrU@ZiiT=Z(S^8$1n2$gw-EHqTO0zIx!;R>$cidYMgHdi;V0WP2= z-M@$+6|zW=j4EF*vFHjkI1vYE!ZoYp_%cdYI$jtkQvCok81=}kAS8~sPy&ts8nAiz+D2mGNFFE`3=|~xK2Rz31|w1N)^6qlmgr- zpeq&kWqw0^Tq~e@1vJG%r3#;hTKZiUxLY7<)?fSSc2M!5+mT)C<=SW0A-e|2zaam@ z%YoOQkuGvMp`^C5DxTD4zx|V)=3%c2ax*(8^0()`%6J?2ajAR*z6hy zR~=6y)ZxeeXoBR@zBxLajOdKholvaP(+Sdh!efBPkfGj)na;= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_3) * v_normal) - tmpvar_2), -(normalize(v_view)))), 1.0)) * 3.0) / 8.0); + lc_1 = max (tmpvar_4, 0.0); + float result_5; + result_5 = 0.0; + vec2 tmpvar_6; + tmpvar_6 = (vec2(0.00195312, 0.00195312) * v_shadowcoord.w); + vec4 tmpvar_7; + tmpvar_7.zw = vec2(0.0, 0.0); + tmpvar_7.xy = (vec2(-1.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_8; + _shadowCoord_8 = (v_shadowcoord + tmpvar_7); + float tmpvar_9; + vec2 tmpvar_10; + tmpvar_10 = (_shadowCoord_8.xy / _shadowCoord_8.w); + bool tmpvar_11; + if (any(greaterThan (tmpvar_10, vec2(1.0, 1.0)))) { + tmpvar_11 = bool(1); + } else { + tmpvar_11 = any(lessThan (tmpvar_10, vec2(0.0, 0.0))); + }; + if (tmpvar_11) { + tmpvar_9 = 1.0; + } else { + tmpvar_9 = float((dot (texture2D (u_shadowMap, tmpvar_10), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_8.z - 0.005) / _shadowCoord_8.w))); + }; + result_5 = tmpvar_9; + vec4 tmpvar_12; + tmpvar_12.zw = vec2(0.0, 0.0); + tmpvar_12.xy = (vec2(-1.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_13; + _shadowCoord_13 = (v_shadowcoord + tmpvar_12); + float tmpvar_14; + vec2 tmpvar_15; + tmpvar_15 = (_shadowCoord_13.xy / _shadowCoord_13.w); + bool tmpvar_16; + if (any(greaterThan (tmpvar_15, vec2(1.0, 1.0)))) { + tmpvar_16 = bool(1); + } else { + tmpvar_16 = any(lessThan (tmpvar_15, vec2(0.0, 0.0))); + }; + if (tmpvar_16) { + tmpvar_14 = 1.0; + } else { + tmpvar_14 = float((dot (texture2D (u_shadowMap, tmpvar_15), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_13.z - 0.005) / _shadowCoord_13.w))); + }; + result_5 = (tmpvar_9 + tmpvar_14); + vec4 tmpvar_17; + tmpvar_17.zw = vec2(0.0, 0.0); + tmpvar_17.xy = (vec2(-1.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_18; + _shadowCoord_18 = (v_shadowcoord + tmpvar_17); + float tmpvar_19; + vec2 tmpvar_20; + tmpvar_20 = (_shadowCoord_18.xy / _shadowCoord_18.w); + bool tmpvar_21; + if (any(greaterThan (tmpvar_20, vec2(1.0, 1.0)))) { + tmpvar_21 = bool(1); + } else { + tmpvar_21 = any(lessThan (tmpvar_20, vec2(0.0, 0.0))); + }; + if (tmpvar_21) { + tmpvar_19 = 1.0; + } else { + tmpvar_19 = float((dot (texture2D (u_shadowMap, tmpvar_20), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_18.z - 0.005) / _shadowCoord_18.w))); + }; + result_5 = (result_5 + tmpvar_19); + vec4 tmpvar_22; + tmpvar_22.zw = vec2(0.0, 0.0); + tmpvar_22.xy = (vec2(-1.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_23; + _shadowCoord_23 = (v_shadowcoord + tmpvar_22); + float tmpvar_24; + vec2 tmpvar_25; + tmpvar_25 = (_shadowCoord_23.xy / _shadowCoord_23.w); + bool tmpvar_26; + if (any(greaterThan (tmpvar_25, vec2(1.0, 1.0)))) { + tmpvar_26 = bool(1); + } else { + tmpvar_26 = any(lessThan (tmpvar_25, vec2(0.0, 0.0))); + }; + if (tmpvar_26) { + tmpvar_24 = 1.0; + } else { + tmpvar_24 = float((dot (texture2D (u_shadowMap, tmpvar_25), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_23.z - 0.005) / _shadowCoord_23.w))); + }; + result_5 = (result_5 + tmpvar_24); + vec4 tmpvar_27; + tmpvar_27.zw = vec2(0.0, 0.0); + tmpvar_27.xy = (vec2(-0.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_28; + _shadowCoord_28 = (v_shadowcoord + tmpvar_27); + float tmpvar_29; + vec2 tmpvar_30; + tmpvar_30 = (_shadowCoord_28.xy / _shadowCoord_28.w); + bool tmpvar_31; + if (any(greaterThan (tmpvar_30, vec2(1.0, 1.0)))) { + tmpvar_31 = bool(1); + } else { + tmpvar_31 = any(lessThan (tmpvar_30, vec2(0.0, 0.0))); + }; + if (tmpvar_31) { + tmpvar_29 = 1.0; + } else { + tmpvar_29 = float((dot (texture2D (u_shadowMap, tmpvar_30), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_28.z - 0.005) / _shadowCoord_28.w))); + }; + result_5 = (result_5 + tmpvar_29); + vec4 tmpvar_32; + tmpvar_32.zw = vec2(0.0, 0.0); + tmpvar_32.xy = (vec2(-0.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_33; + _shadowCoord_33 = (v_shadowcoord + tmpvar_32); + float tmpvar_34; + vec2 tmpvar_35; + tmpvar_35 = (_shadowCoord_33.xy / _shadowCoord_33.w); + bool tmpvar_36; + if (any(greaterThan (tmpvar_35, vec2(1.0, 1.0)))) { + tmpvar_36 = bool(1); + } else { + tmpvar_36 = any(lessThan (tmpvar_35, vec2(0.0, 0.0))); + }; + if (tmpvar_36) { + tmpvar_34 = 1.0; + } else { + tmpvar_34 = float((dot (texture2D (u_shadowMap, tmpvar_35), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_33.z - 0.005) / _shadowCoord_33.w))); + }; + result_5 = (result_5 + tmpvar_34); + vec4 tmpvar_37; + tmpvar_37.zw = vec2(0.0, 0.0); + tmpvar_37.xy = (vec2(-0.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_38; + _shadowCoord_38 = (v_shadowcoord + tmpvar_37); + float tmpvar_39; + vec2 tmpvar_40; + tmpvar_40 = (_shadowCoord_38.xy / _shadowCoord_38.w); + bool tmpvar_41; + if (any(greaterThan (tmpvar_40, vec2(1.0, 1.0)))) { + tmpvar_41 = bool(1); + } else { + tmpvar_41 = any(lessThan (tmpvar_40, vec2(0.0, 0.0))); + }; + if (tmpvar_41) { + tmpvar_39 = 1.0; + } else { + tmpvar_39 = float((dot (texture2D (u_shadowMap, tmpvar_40), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_38.z - 0.005) / _shadowCoord_38.w))); + }; + result_5 = (result_5 + tmpvar_39); + vec4 tmpvar_42; + tmpvar_42.zw = vec2(0.0, 0.0); + tmpvar_42.xy = (vec2(-0.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_43; + _shadowCoord_43 = (v_shadowcoord + tmpvar_42); + float tmpvar_44; + vec2 tmpvar_45; + tmpvar_45 = (_shadowCoord_43.xy / _shadowCoord_43.w); + bool tmpvar_46; + if (any(greaterThan (tmpvar_45, vec2(1.0, 1.0)))) { + tmpvar_46 = bool(1); + } else { + tmpvar_46 = any(lessThan (tmpvar_45, vec2(0.0, 0.0))); + }; + if (tmpvar_46) { + tmpvar_44 = 1.0; + } else { + tmpvar_44 = float((dot (texture2D (u_shadowMap, tmpvar_45), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_43.z - 0.005) / _shadowCoord_43.w))); + }; + result_5 = (result_5 + tmpvar_44); + vec4 tmpvar_47; + tmpvar_47.zw = vec2(0.0, 0.0); + tmpvar_47.xy = (vec2(0.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_48; + _shadowCoord_48 = (v_shadowcoord + tmpvar_47); + float tmpvar_49; + vec2 tmpvar_50; + tmpvar_50 = (_shadowCoord_48.xy / _shadowCoord_48.w); + bool tmpvar_51; + if (any(greaterThan (tmpvar_50, vec2(1.0, 1.0)))) { + tmpvar_51 = bool(1); + } else { + tmpvar_51 = any(lessThan (tmpvar_50, vec2(0.0, 0.0))); + }; + if (tmpvar_51) { + tmpvar_49 = 1.0; + } else { + tmpvar_49 = float((dot (texture2D (u_shadowMap, tmpvar_50), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_48.z - 0.005) / _shadowCoord_48.w))); + }; + result_5 = (result_5 + tmpvar_49); + vec4 tmpvar_52; + tmpvar_52.zw = vec2(0.0, 0.0); + tmpvar_52.xy = (vec2(0.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_53; + _shadowCoord_53 = (v_shadowcoord + tmpvar_52); + float tmpvar_54; + vec2 tmpvar_55; + tmpvar_55 = (_shadowCoord_53.xy / _shadowCoord_53.w); + bool tmpvar_56; + if (any(greaterThan (tmpvar_55, vec2(1.0, 1.0)))) { + tmpvar_56 = bool(1); + } else { + tmpvar_56 = any(lessThan (tmpvar_55, vec2(0.0, 0.0))); + }; + if (tmpvar_56) { + tmpvar_54 = 1.0; + } else { + tmpvar_54 = float((dot (texture2D (u_shadowMap, tmpvar_55), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_53.z - 0.005) / _shadowCoord_53.w))); + }; + result_5 = (result_5 + tmpvar_54); + vec4 tmpvar_57; + tmpvar_57.zw = vec2(0.0, 0.0); + tmpvar_57.xy = (vec2(0.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_58; + _shadowCoord_58 = (v_shadowcoord + tmpvar_57); + float tmpvar_59; + vec2 tmpvar_60; + tmpvar_60 = (_shadowCoord_58.xy / _shadowCoord_58.w); + bool tmpvar_61; + if (any(greaterThan (tmpvar_60, vec2(1.0, 1.0)))) { + tmpvar_61 = bool(1); + } else { + tmpvar_61 = any(lessThan (tmpvar_60, vec2(0.0, 0.0))); + }; + if (tmpvar_61) { + tmpvar_59 = 1.0; + } else { + tmpvar_59 = float((dot (texture2D (u_shadowMap, tmpvar_60), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_58.z - 0.005) / _shadowCoord_58.w))); + }; + result_5 = (result_5 + tmpvar_59); + vec4 tmpvar_62; + tmpvar_62.zw = vec2(0.0, 0.0); + tmpvar_62.xy = (vec2(0.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_63; + _shadowCoord_63 = (v_shadowcoord + tmpvar_62); + float tmpvar_64; + vec2 tmpvar_65; + tmpvar_65 = (_shadowCoord_63.xy / _shadowCoord_63.w); + bool tmpvar_66; + if (any(greaterThan (tmpvar_65, vec2(1.0, 1.0)))) { + tmpvar_66 = bool(1); + } else { + tmpvar_66 = any(lessThan (tmpvar_65, vec2(0.0, 0.0))); + }; + if (tmpvar_66) { + tmpvar_64 = 1.0; + } else { + tmpvar_64 = float((dot (texture2D (u_shadowMap, tmpvar_65), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_63.z - 0.005) / _shadowCoord_63.w))); + }; + result_5 = (result_5 + tmpvar_64); + vec4 tmpvar_67; + tmpvar_67.zw = vec2(0.0, 0.0); + tmpvar_67.xy = (vec2(1.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_68; + _shadowCoord_68 = (v_shadowcoord + tmpvar_67); + float tmpvar_69; + vec2 tmpvar_70; + tmpvar_70 = (_shadowCoord_68.xy / _shadowCoord_68.w); + bool tmpvar_71; + if (any(greaterThan (tmpvar_70, vec2(1.0, 1.0)))) { + tmpvar_71 = bool(1); + } else { + tmpvar_71 = any(lessThan (tmpvar_70, vec2(0.0, 0.0))); + }; + if (tmpvar_71) { + tmpvar_69 = 1.0; + } else { + tmpvar_69 = float((dot (texture2D (u_shadowMap, tmpvar_70), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_68.z - 0.005) / _shadowCoord_68.w))); + }; + result_5 = (result_5 + tmpvar_69); + vec4 tmpvar_72; + tmpvar_72.zw = vec2(0.0, 0.0); + tmpvar_72.xy = (vec2(1.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_73; + _shadowCoord_73 = (v_shadowcoord + tmpvar_72); + float tmpvar_74; + vec2 tmpvar_75; + tmpvar_75 = (_shadowCoord_73.xy / _shadowCoord_73.w); + bool tmpvar_76; + if (any(greaterThan (tmpvar_75, vec2(1.0, 1.0)))) { + tmpvar_76 = bool(1); + } else { + tmpvar_76 = any(lessThan (tmpvar_75, vec2(0.0, 0.0))); + }; + if (tmpvar_76) { + tmpvar_74 = 1.0; + } else { + tmpvar_74 = float((dot (texture2D (u_shadowMap, tmpvar_75), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_73.z - 0.005) / _shadowCoord_73.w))); + }; + result_5 = (result_5 + tmpvar_74); + vec4 tmpvar_77; + tmpvar_77.zw = vec2(0.0, 0.0); + tmpvar_77.xy = (vec2(1.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_78; + _shadowCoord_78 = (v_shadowcoord + tmpvar_77); + float tmpvar_79; + vec2 tmpvar_80; + tmpvar_80 = (_shadowCoord_78.xy / _shadowCoord_78.w); + bool tmpvar_81; + if (any(greaterThan (tmpvar_80, vec2(1.0, 1.0)))) { + tmpvar_81 = bool(1); + } else { + tmpvar_81 = any(lessThan (tmpvar_80, vec2(0.0, 0.0))); + }; + if (tmpvar_81) { + tmpvar_79 = 1.0; + } else { + tmpvar_79 = float((dot (texture2D (u_shadowMap, tmpvar_80), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_78.z - 0.005) / _shadowCoord_78.w))); + }; + result_5 = (result_5 + tmpvar_79); + vec4 tmpvar_82; + tmpvar_82.zw = vec2(0.0, 0.0); + tmpvar_82.xy = (vec2(1.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_83; + _shadowCoord_83 = (v_shadowcoord + tmpvar_82); + float tmpvar_84; + vec2 tmpvar_85; + tmpvar_85 = (_shadowCoord_83.xy / _shadowCoord_83.w); + bool tmpvar_86; + if (any(greaterThan (tmpvar_85, vec2(1.0, 1.0)))) { + tmpvar_86 = bool(1); + } else { + tmpvar_86 = any(lessThan (tmpvar_85, vec2(0.0, 0.0))); + }; + if (tmpvar_86) { + tmpvar_84 = 1.0; + } else { + tmpvar_84 = float((dot (texture2D (u_shadowMap, tmpvar_85), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_83.z - 0.005) / _shadowCoord_83.w))); + }; + float tmpvar_87; + tmpvar_87 = (result_5 + tmpvar_84); + result_5 = tmpvar_87; + gl_FragColor.xyz = pow (abs((vec3(0.1, 0.1, 0.1) + (vec3((lc_1.x + lc_1.y)) * (tmpvar_87 / 16.0)))), vec3(0.454545, 0.454545, 0.454545)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/gles/fs_smsimple_packdepth.bin b/examples/runtime/shaders/gles/fs_smsimple_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..dfd8804eeafc72899d4f3b1da9daee0d089d27cb GIT binary patch literal 328 zcmZ{fL2kk@5Jk(@rx=Ni4b*W$ov4afRi#~Y#{nWMvBO9qwoH@)6}RYNyQ~vR>87)o z`5OIsU$fr4PTZ&enxd(+ftR=9c|)AnCGOF-u*G`oz%*8MIhpFVLIY9sV2&;p`r}aFvtZVg);eEl@^22wWW9&V`F2&couWVFkvkvZF)Y5c~wuA0mHeFayCQ zgZX95MkI}Snq^s{=R#x)NTpn+Tr41w?wJpKN1&h@`*q_czTChvO;4 X4Bt>OU_ukiN0BD-KRx2lgxq}tGtyk> literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_color.bin b/examples/runtime/shaders/gles/vs_shadowmaps_color.bin new file mode 100644 index 0000000000000000000000000000000000000000..1a3fc98b61fff2fdbfdd1a7eeabb6b515347e8c8 GIT binary patch literal 249 zcmZ9GJr9B~5QcHRUvUWwI)FsC#?k2DKtjUWRNKlKprjP=BmQ@5qDH;x^1Saoxgy_A z0zV;XsWfhOe4RsU)qy%P4VH8)Thx^ijzOpzNg9*nRfE1EZETITa7*lYZKSFSQe$S# ziGgs=(!O^J2X$DW;H~M%c`Jj#kn~s7U^Imr;IpwrSGR+(JY^od_jtq=rt$oToiA5U YzlDg$if1ps&!WF?aP~1y8QcMa2h@5`NDh1uJitz$=Y`ZHV%{Y-Un$RL)DNLv47^(}Fa*;zr zHzCxxB!cACJRa&fk-DC#A@WNeZyGsIXtrkbuoQg%e>X-A5hqq`H7I}vH%c-phN@WY zNWu>r&P6inX+fb}k}O6r6a+jE6J0&3P1i7dYqqboPH$AHd~fE$ zt9Eds3oKpG`kak?243g0$LQadZDLTUE<<*vj&1m2HgL7*h8$Yt@J>RZA&(R4?)WO4 z3oC3{twH_tjO)lkMR!n2c*ow!?Y6O>R%fYy(HBRNI{J&y!ynzy B7F+-T literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_csm.bin b/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..4e34c092c8a14251f2ed1126b6085ef758868773 GIT binary patch literal 1335 zcmaJ>!EU245ba+56(jWmtx5?vxkP*Hwuh}$sZuXhgxp{fuL4HIAxT#~^gs3&_8&V2 z$C#4j27dGAy?KLqd4Blu>+}D=OOd5KgZtmf-7_gGJ{M~t3s{Q9vV?3UnVOPIUZf&} z+gnpcHigJ!l|#-Hg-xt607svT~X7)r;WU zr%L|mSjMeIk0Y;fG@Fu|ReMn^0F`2>lNy`#4k;cgzMD%~rSv3%VK|Lk4hC@o!EwGJ zrCbYzOX&gHRe?KTt0`ehRpM=9isdVD0iI9(63|o%DlbtyK@VV` zgDw1oQGoF~XS@A7p1Mi^i&gSutRm)Z5}UN%16jd=Nj(J#=a&ElyT=)nI1`q8s&aM?T7R& zoKA~2T8%+x8DmFkd_-z&q%gC?-r*WNcV?8Zw z>|ChA92Yn(7eQZ7F_-m34B=n=JZYpXBFUDL)4E{C|GNRIadDy9UVddjt@p}adNPoYF+-G7G{F!Y@TqQ7J7VotX4HH6>V>#lon=e08ZA_Z9< cheG-CwQ)cCMjlG%#<#A*n{CNizX(120juRQZ~y=R literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_csm.bin b/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_csm.bin new file mode 100644 index 0000000000000000000000000000000000000000..9e39f478540e9ae9f93643690d6ae7ed0f23df7a GIT binary patch literal 1683 zcmaJ>%Wm5+5NxjciUo3!8dTAPe!=Lmk3$0l2#`w<2&^U93@lNQW!X;AL;s_{(0}aG zqA1dme6u*aGqba#pP#>o&<_ zmcsqLEVK4GOL>_=Mk@mQXt$v;KRnRlp*n`kYiMv4^{=8{ht|nT=oYl3*{e{f@)8EGORJ{kiREiRr4Z_I=_4J;P_{Ha_K8f%rUY%NS6q$&kG#wr;pH8#nr7*L0?{EjUJ~K+F*W#X>W}2?rTvq32(i?lKd6^D) znYLc!@?X4Holc;akd3u?p##` YM%8?zDm1DVBUQwxLQkFKZ_E1dAN;#24*&oF literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_omni.bin b/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_linear_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..f9d6fabf839291b85a033e2e05903dbe378c1a77 GIT binary patch literal 1638 zcmaJ>$!^;)5N)sgiUD$w8dTBd4MvV#4h;|>K&}F7Nj3{f6l7YqQ}odP=r8miGt@#- zmgSqsnYZu_sn?h9AHV+n|L=~aagxHfAJLZ=QdY@^?HMm%$F{o?(u`BFCU;2@vlJd4 zx;AnsSjwv$awSQAgm9(PyeoUA1 zILTgFa(u4%FOBMsp{i?A)9TEMEg)Y2byOo{uo>c}NKPBht2msjU={|EiNPEuDrowm zQt~|$IFms^x+-u4G+PrYM8$p{MAF)&kwy$kAy9>>Ig4?8tN_a=?;7bPV2KfmM@o$b{7LmwHdOv#4-(Qvwq6n4tPgxZUA z5suah8?DBmF^riZHM=4;>!dKVe(rD&mU(8BP;bIH+oRLW4T*VcuYX$F-K>Rak;i_Z z4cwgP!r)u9eC990)ui)|w0}z;9!B1`&iz6zF9TT`?8`B`H_a|DfWf}J#=bJxS7Ua6 znqA&DgMD?4-5We3cg!D5^UFJB@O!QjP`@J2kB Py23#hdeV}A2>I|1OE4U{ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_omni.bin b/examples/runtime/shaders/gles/vs_shadowmaps_color_lightning_omni.bin new file mode 100644 index 0000000000000000000000000000000000000000..fc21229f8e275ef9adc196802375311cd26d670e GIT binary patch literal 1290 zcmaJ>%Wk7E6rFDU6<6v8T9qc?WD|AS$6_i~s?;rVgGpQgM#LdWM_u$k`V0NXx#nS; z(qsodJ`bOZd3k;~yZik9Iu~ieQ@H;d-#(MF;!Cj+vVgT%txHHV$<%_J^CA%`TwizF z$hHuvta8YiqOgrOYnI5}BP$=(K3beY!;|RrBsv+P8HQBoX@QzAb)b?}EZ>afa+&b# zMeyBICEqNoJBC3Qq-NDY6e~cz26dlvP5HBG`o^p{t?hr3MwzrJjM)Qo`W6S zz%;=2owfbp9ami^fK?Vhbx{%Xwz26`w+$CY(brP0AGTq%L(TR2pvVe?i4Rvg!H9?b z8eY`ooD6bCL7THXR;XVa@2&>4YC9C~+;aolu#vAxBWIksai+gCL_6nUL+yw3qa5o+ z8?PpyGmM#IHT%VC)>&a^{oLUaJon6KVeUk5@JFYaI~MacUVpW0x>-xJCO7>+8@jy@ o(^kR#DNL-)yp!o~Pc!e~FJyXrcQn=xkME}A-O+IO2O)p{1ARuXpa1{> literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_color_texture.bin b/examples/runtime/shaders/gles/vs_shadowmaps_color_texture.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd30b43cdc8ba21fdc59e4f898f65da1e447be40 GIT binary patch literal 332 zcmZ{fy-veG5QL%Khd?8xNm9fF(wWd9C@3ODN_#qdcg`aF);gb^Kk@EdARr5gZZ)&} z&CX{1axFKH4?}JM=2reIXLeZB9DIz;9i&-=6;0yN6bdv>ekf2`Fq*7JG~* zbRwLu7l?I}lGHp;!p}V0VTt)HMGdt5;h5AR5GX6Py6}@X{?h@|U*hD98kG1V4Jv&Q GU3~&rT5dJ~ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_depth.bin b/examples/runtime/shaders/gles/vs_shadowmaps_depth.bin new file mode 100644 index 0000000000000000000000000000000000000000..1a3fc98b61fff2fdbfdd1a7eeabb6b515347e8c8 GIT binary patch literal 249 zcmZ9GJr9B~5QcHRUvUWwI)FsC#?k2DKtjUWRNKlKprjP=BmQ@5qDH;x^1Saoxgy_A z0zV;XsWfhOe4RsU)qy%P4VH8)Thx^ijzOpzNg9*nRfE1EZETITa7*lYZKSFSQe$S# ziGgs=(!O^J2X$DW;H~M%c`Jj#kn~s7U^Imr;IpwrSGR+(JY^od_jtq=rt$oToiA5U YzlDg$if1ps&!WF?aP~1y8QcMa2h@5`;3|%z5FnxIlXmRdH|Wxn3yHZU z8}hNg|Nl;y&t7i7fBt@Z!uPlj&#&&&j6^YCh_z55ti*B^fgdQAOh}K1p73Eftgeww zD0~%5*z$!98+R>dOh$nSms1uqxt`P)BunxOQh7X>3%;Ai>Z6%f&$l>u<0%g&WXs|V zF(r8GCOlmz6?^v8iFI{iUY!_66BC-8(S)!hiN*US;duuWSl!`tX5lPSYmwl(5U7L) zl8F%d1M*3rTpc7bLM0ayq5chz(BHVVG)>{|!Vc+vkUuI`R8i2VrkHex9D`yj?JUjq zc&hgTSO)I2s#zu{-5gd_T}>Z>aBqrGU;fbOW3UvHoYj(4(yOI z8=0cJF5_r2PPdG8BIC5mINdVmzz!L!ktw?CGGk3<+%03D$c$TM#@#aKzz!L^k-_d? HgxvfCTK>Q% literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_packdepth.bin b/examples/runtime/shaders/gles/vs_shadowmaps_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..30d616fb545fd8e6caec578a5d5e20516b87c43a GIT binary patch literal 339 zcmZ9HyAHxI3`Jq}S6E^J2Hso6h+tr-gv1&JniQipi9*`)5P!kPG7_Lb%Vynsa_p>E zi>A5Rdy8ZwB+i#?wgO|tmJXy9?kL_Fl!@jpfR<1ZN$mGa3^GMh+Z0poCYZ5QM{8=pY#8|9 zGxrLd;;=WUWyjOmr&VFyFsjfaPqzP##_reOd7^Q`!t!iSm#bfr-+yYw6`=6|T@rAm literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/gles/vs_shadowmaps_packdepth_linear.bin new file mode 100644 index 0000000000000000000000000000000000000000..0683120ed0908af0a860809d65acc61d7b7ac25c GIT binary patch literal 352 zcmZ9H%WlFj5Jk&&eu2$MY!WJkN9oGyvMNYjAR)1}Tx=&(CAMXp0IB*n{m?ozAn3~0 z)wyS8wwvYPXSixdq@~jM_Re27;Jn(=o~*%w^1`7mtq2T8%1F{Une-UchP3q+Rw690 z=9QJI+>$!1z5Qg+2!A4z|FyB?}JM=2reIXLeZB9DIz;9i&-=6;0yN6bdv>ekf2`Fq*7JG~* zbRwLu7l?I}lGHp;!p}V0VTt)HMGdt5;h5AR5GX6Py6}@X{?h@|U*hD98kG1V4Jv&Q GU3~&rT5dJ~ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_texture_lightning.bin b/examples/runtime/shaders/gles/vs_shadowmaps_texture_lightning.bin new file mode 100644 index 0000000000000000000000000000000000000000..f6df25caf04fc9d18dc3aa5af6b8d33c39c3afed GIT binary patch literal 661 zcmZ{hF>iw~5QW>-zv84UP^pC2Y^Y<^4yhC=QdUI45LaL$$B?8|`^!7@AW#fSHtXKq z`|kO6+t>S_x8La1qA}Debr1#<&Bg+h2ERs$6r%_Uj!V7>w6+15vch$vRfvV*?H%C>RvxZq z)lTP6tlA`iyofeE7&T}1Mey+N=(biik6PZe)79f-2DNRblM*P literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/gles/vs_shadowmaps_unpackdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd30b43cdc8ba21fdc59e4f898f65da1e447be40 GIT binary patch literal 332 zcmZ{fy-veG5QL%Khd?8xNm9fF(wWd9C@3ODN_#qdcg`aF);gb^Kk@EdARr5gZZ)&} z&CX{1axFKH4?}JM=2reIXLeZB9DIz;9i&-=6;0yN6bdv>ekf2`Fq*7JG~* zbRwLu7l?I}lGHp;!p}V0VTt)HMGdt5;h5AR5GX6Py6}@X{?h@|U*hD98kG1V4Jv&Q GU3~&rT5dJ~ literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_shadowmaps_vblur.bin b/examples/runtime/shaders/gles/vs_shadowmaps_vblur.bin new file mode 100644 index 0000000000000000000000000000000000000000..8366c8b6544eb7849463dbc541b1a94aa362d2d2 GIT binary patch literal 1370 zcmaiyy-ve06op~+Q(UP_3u@Z@E)^q!fuT}S*T^(ZYm~%Mnzkv3CuL;i4OqDOsqF-s zZjsORIp@31a`AZm`StTX;9S{hSpmA+o?ZtJr51>#Sn76bn?&bVg{NXZ&TCv$BH)RCefUHfpKZ@*LNNhJptW zQ=Y(ZMBWM1tAjjF5y{6ykl%0z!<{dojU(LrvqR%BDlb(lYFv;=x>&{meM|#eX=lap z4Nvu60PDz~H#O_z)?;Ay$-T}~yp_}G1*#mq3@%;<+eXnIHj0*dEQ7U8BJ%hYYgVyM z2ivIo%hZlh$=orzZ5ye#G;#K1Tei{5N`f~mUeFs=sU_QJTAVeAf!+Y94fhLMH}##S&@cOAylV7y)!?=p zHHC_$cvyewLwMcDR4me!6#GS~w*PlSQuFdC^EK2W@}XumN=8MB#odO-Y9A?8#-m;% z$k7c?L&CK#<#(k;H;J=C?WD$qu38lMSyL++<0di(%O*br8Yu;x6=;ghLM#m5&K}-i z=D4HU;dsKTNdj1>Y|(?UXH{$z1U#Q7+RZ4F=NYrTMr#d5QRO+V4X=%Z8=Y_H{MM&C z^65LB&wdrJ`EA*K42bG7lqX@ChA(D)yAj=xsX?Z95~4kMoKSbiSK(Y(v}LshjmroO pRB#6s^eD`1xOaE~%iI|e7>ql!yFJWD)tMRI^2JMlM}G-<_yf0`3Y!1` literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_smsimple_packdepth.bin b/examples/runtime/shaders/gles/vs_smsimple_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..30d616fb545fd8e6caec578a5d5e20516b87c43a GIT binary patch literal 339 zcmZ9HyAHxI3`Jq}S6E^J2Hso6h+tr-gv1&JniQipi9*`)5P!kPG7_Lb%Vynsa_p>E zi>A5Rdy8ZwB+i#?wgO|tmJXy9?kL_Fl!@jpfR<1ZN$mGa3^GMh+Z0poCYZ5QM{8=pY#8|9 zGxrLd;;=WUWyjOmr&VFyFsjfaPqzP##_reOd7^Q`!t!iSm#bfr-+yYw6`=6|T@rAm literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm.bin index 25cb78341754c7cd63332cbb1e1b257e0a282a8d..edf503f816875bd7fb57b83cde1f6daf3a6d4165 100644 GIT binary patch literal 3491 zcma)8+iu%N5N+QIeZ}@AAQPG9Qq&EB3j{TS6h+Vg?z=!sYnufnvLt0)g8X~W%7m^dC6Ag?rT=X9|ui z@oD{-t4;fc#<#M`iOCt+bp{vmtoXC>L?d|IiB{J|nJ1z+Ez6=jk4cr)*}6&2wDouS zaqybehkWxa5bcq8UA*RM=Y34^QD;q`OvIv9 zdp@^-DdE0~I}v!u(f%NAePhusq*IR!)vha;UceP0>@z@~YekX#`z3>A$J~$!1aTA( z1%5(}RF;K3JR+d{Nd$pKi}vE(J1b72Ll}zh&^aNH(z%X83JQg4nrrqY*~gEz-yIu~ z`^IkS*-c@WEc_6vXp|vfH0jhMTnJ*VLV8a{nYEVmn7$b0F_~bgH8cvvd&FYIhdJLy zb>bYGfX!Wp;Ry~9+*q(Nqga6GcrMe-7AsY?FJHGsn^#4y>cx~W&%YAe?ZT90v;))r z?Z~z~PiKVU*2UbRIw!FITU<^_NK7AH6WQhvc$H-wotv`i)7lk@(U38WbCRS^(uF*- z4w>jH=LEkmTMc4)bw+Gynh!G=1t(IwR5&DF7MQmpQ2QzfE`5!q1yPkEHylV3FpT?mh1mPZ6)6B+mm2l$-#WHDsqb zX4O%n+5^;@CILKCz*_uz2M2k5b?3mvw6sUZpDB`t3Zm~Hg-Jxrctl}12?Y0k*Zq>( zzYm0^nQ|0+E%MXK41gaM9u2+z1p3Re2`sxydzqUT{>y1P9*yka^I>@i^srOFHviVG zDM3ByW!e>;Of8Hh%L6n(#BYPQ$?V04E|wSB9x!Sw>J;gL`kUSzJ$>&5^@{g(z88V% zwjfw%c;g!8_Uh)R9HX}T1et7~-(Ga7g-E?6IiXewI16i9x7UyEhMn}H>pP%=S}d8j zlQPem+k@QBL%np~4%1Hjb|>b*L{R$H^{aq~xOIzW6o=?_p~KQ=KVblO+Dmub%elL= zq=!0>XltQH*mAe)<&5YtJ7laXcj7crIFg`;``VaMZY?)A9|;0voj@dqX!`C3*We06 z=NRk5x#U*N%w%)DOL&kQ%!C$-W@oKn3lVjPoZjhPbQ5q&&A?% zojw0f*GMWl9Nq$;=S5APEIKqaZ*0y9HD(C+1qxzy#*hX{g3Iot|QzVxh7dr8bmzW7+ zI;MXL;^`9*z|JIi!f58|PUu6sz4gSy4o~2TjHZ+6h*xf33W;>xMm>5vlpD#*^bUFE K#r0z__~}1YmrJ|= literal 3086 zcma)8+m53~5KZ19e?{jFW^IP%;)_;}w906;Q50pR$-6~t>>&c<0KTsF-*c+yhHiUo z#eM<0tNPTbs?+uP^~;Yx?f&_)-)8HwDny+WyF9Ie7qMT|Z^^1W{*mnbj|07aNS6_o z@@(_gd}^9>yHA>|+`jJ0=FfeTR`2hm<(I5Vm$dh{?e_k@bh*!y>T7wtx8)^UulIHO zV8^H8?=0Om4|aSl>x_`xfGrY)kR|!=wY3x?;%;eme<`t+h^J+lm$#hkk}4_c;AVIG zU49%KlIomoHv(*j;;=Ym>CyTa;bWVfWm#50bY-wbDw7>w^;3#3diMjASBwL7VEgWaRP(Z!2n9qgueAgA^MG&w+G{p|*E)WNO(r<9$ zSm?adSv=c-y`$S2^+?EUnWOq}FisL9;V@Vy*`A$El~QK@dP@+AK4{1&9N(M8L*Smp zE`H)e8zYk}S6sRLZ`kM=j&22)nOA2bK8eH~h+QekjrdJ&_HoU}FUQ`F`MnH-#txIi-{m24& z;8FlR;^(<;{LTzG`ho~GH4`%Hh?>9^N{JPtGsJnwu!^PKZU!^8JWS!CCqN;bs0vcA z6rg%k#ugVd%i#>0mt{>Aepkr6BUgeiCs7=REjd>NOXjBwRQhmR|64WAs%*M4oeVXu ziFRUe%(edPJVtUtQ9p!w22|x#QjcQ$!~GX)zx6^b^dySx)OVv(BzWTn;lM_^1E=Vl zJ}-*PTd8l0%SFBw#+eH}KzASk1xeF=%j2+HeebeCjz-kEzGT#R(%CW(GrOC6e5fQs zAAHC4FLN=2OHvi89##XZs3gm$CSD@@%+F!blF}tU*3H^Urew|3mH|tNezTkgB)!O{ z(n8I=lmh4&9I~}5kK#H>FbUAJeO*Y(tA=JIBL+R{=!k^Sxan%hG+D8y54S7NVhVbQ z8}x1;o2imAB=}rFI=+C#mi($O<69S|07_E8|9hj@`C(1e=aNG7-PuYHt`I{`H~Hc- zuEk&J&ZeS;0XG6EQ(OOFyhV??WY$4*S4GCy!PZY&F3o`ilp=D23|k`)-o4nRuRWj6k^6tU5oU%K4`MJ{bJ)A4s{);Q#;t diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_csm.bin index eb791864a71de53a13ab1a3e70a534a62ec0a6d5..d79ecc3d08b935f60aa117c30877256e3c3fd017 100644 GIT binary patch literal 9220 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear.bin index 1431106b5ca250d114a28f243daaebc2ad3ac6b5..52d2ddabb7996f698e411a4c9c71ca66f49c3859 100644 GIT binary patch literal 3535 zcma)9S#R4$5N_WJ{fg~Nuykaaq^Jvl3j{TS6h+Vg?mIzCE13nal9WX$@PF^j?7>}K zs0|1rXXcyx+trunuRs4%|MPWMW}B)hSeq7gE}H0x?UMF2U03^WX&rnTY5AL2#URSF z?Q8eB>qNOryR0go>#F-}*NNt`CW@c3MyycxkFvb3Csw;WZN69gYbsCKX0vO>4UNym zOD4+hhQ{}*%`lR)V2cz|$kP1J))7r0V$Ix!>bxd(+N4DrooUPW;iu7C z+8nZS%b?m5_LjV5V(+|+;ic@(s;U}@=)|CeR;D?;uCg^N(yV0M8~qqD1dLeHiJt5d zaK-FL_Q<${?Dq%u;5zg79$LK+R9DpCI)PLe)87GP+X$@W->)fnw%m;=03P_kn8Al9 zk*X@!#uEg}HjHzP=J)Kw2Q7~LgXggypmP#HjCLl37(&QJ+g|e@qJQ|1{*BoL(^r0D z$8QXN(Zf3vc`H-^N)xSKAO#*s71Z10RodyGr}#!GPtgTQwWEp0?w}SEGNyhj)tO~B zgJ>QNh9fwD;9i4G2}J|=$8#BYh&9mM0-F1KP==Z~@1Xnte#W3>{2jj))j2}JM>cw(s$EB%5@hS(hW?b|& z=NAfi$N0MHz=PxY~!gG=JjH~71yh!1RwwJcaaBVn+*&Z6Cx_y4rk)!58>vfPb56)ChT`2Hq zzHYi78|lT=_kaqa1tG<4waoEm?;vgBSaR|0GVR%Kk8BB;xW#65-62M zj?L~z1O?KOKqbep^yaqL!gUAj2Z>m}C(kZHphbdGe)6x4+|+6Ne5AXp)hr%#}+zhOwfOr7yq)*8W*HXF|Y3 zS6=mP$sP-0)hLzEbl0V6rxmnt?K``R>qt&<*NCf176pDUS9@3&>$if7`dr(hQ`lC< zXhY+z5>v8LFybX0VycMo6#ub^r{4eph(|>`BQ$l*$2;p-AJ&rb;K+`kKA}IK%_nrc ZTA7A++AxpK8A_w(blTk8-bbUK{sS!VS-JoK literal 3057 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 literal 6163 zcmcIo+iv4F5N%)c73`b5nNscdzJoG>M3;oBQ z8IcqzTXx*+CO{&IoZ;cj91dsh?tl6I?(cv9SuN6sET4-ao-b!fE^ozZTs+0oZ2fz@ z41c^hIxbI)2Pek6_4so#iLmsfnBT?uZCaG^Vv-blzu}n6TEX$`+>j=WeQe?|u>6Q_9agtdYV_71EYJqr-XV8?TQ!$Uzh44BTUoM1r zm}PM(p3@@zoX*m6JBCtG?PWst_?SH>dHk4+0R!KydE!O{KB7^G^g(!Dy|}*E^MxRn^pYAK0G$z%p{0u~^O zE8+2UFJ5fD$2_6H`SU4;4fL{?v|~w=FKJU9{D}9JZCGfQ6vaV_E=k}INpw2=SZNUN z@HtXoIW*K-JqK&g-vI5E2BHP@Tz`wvgPZKZ$_E4+KC7kGvK+ihVc$X0_t%)MJZc=$ zCl9>VCt5EhR%%4gJlz;SC7Y$^d8@Hv6|lTR2L*v-AvvWdd&41KdhDidIO_H#p4s0NBMxGGsMkm6I?iRG zODjGO1r?c2#Z}iI@uH(1DdM1b5y`Ab6d_(mpsgX0OQAt!UE{NX>oD0Qku)UI^jEeU zHWUp>(OEdtb{bqUr^xNshP}=z=gu}4cCaImp zF_&clCr0vZ?Zm)kTG(V-Xfdt9wSe=ft4^NHw*am|0G^Y%jL2&l=W;Gk3EMUU_6_7F zi3QTor#4l{^gA_&f?J2WWuR6T+GrdisvCigGHOz>1{dv-@q{Zi#;8HZu%_d;B&4hf zNzmU+NWlIIgd`}(2)Ree2Eo)7#r9dxB^dk3z7N8uR;)R9!a!YbY<2zf35L9VF2S_O z|0I}6=XHDz?8J6xV}k~}`j%C6tPVI6K}py1_b2eI!53ffMEr1r>$WQgEOotT zHX&77(8@SxHbt={%&m4*nZ((WTXf10fNDb+&5A?%o%X4pl>*l)ZWSu244q^JRW+?0 z7_M`$|6maH!mu(^F|uSp1cjsvN4SXjx|jDYY66mTxIk+g@{t)edHZn)fK$ zEy^&h6{QSKKRSQs%y(W;2I1YlqwMnTA@CYO5VsFEQFSUX7BbH7hjg<1!$*C3+~ z+6NwcVNN}dcG2~v89mf0gQKpf&hG|{+j5z+8gMdxswtf!QLo&h`{x@mf}kl5DQ4Z^ z;%uh3MR|-(q#HZtxRPCtT130)ut+|_wWyOyq@%S;B8U-Q+0#7<*%yGv=-{zswiZoC zK}3SXb!_y>w;G%653-6v5{#&%wt961ayi%er0f0u$h8>4LSz|dcbtgy?zm#*Fw$R8 zUlMc+T);Y9>)I!yq?55`Sapiv*tO2b$JzJ}O|g&EAfupz07o(%GF1R`6wty5D>fNy zWMaVTd9pOMIx1G$BWnU}*(a{vIaPC{GyN>RcDL2l>x?w@PHp2L#Z5GGbjks?CbFzV4SIj{KyB{+AQH9l${SR8+wHrdO?#drS!)#FMt diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_linear_omni.bin index 5233d5bbd0c2cf6c3770a48311e32410c5ec2d47..e2791f36f42b744c9efbf33aeb4608e639bccd5e 100644 GIT binary patch literal 6632 zcma)A+iu%N5N%)m72B79N@PX6=!U=r(gbOXB5hFjrB4DQ(>4K0R4K~31bOIx^cVV% zJu`dfMYRJsCU@G;$v z-(2bOr)(8tsLtvt{S^jj@q2c6Y50d?pIsXNGb@VnaB0SmRhDhM2?-Ds`NL!Vwyv|y zKCSa|bGt3;-}ZG@bX_j#4AXztIOP5-=XwJ*}@Q+eo{@;<-6-|w;uGv2O0=h>#d zFym9X%Lz#f>^j8~^0fG6=M7QL%}_hvW+?TnC{L@hDBC&Nrd7J$MXlNLefZ|;DXmWV z=0R}1pO#N~h8j696Y&HR99Lyo-6g#vaqkF1_jvPzQ=F|ymSYlQV8aB2r!v12>onhp zU~u*2N)YNqNcu9uC7i0a_vtFT%?e3`C1CLTSa6=+l}}lfK4eP(7ostBbQCw@uB=7i z@t^5AbYPB-r}Lo8{?utN8{k9)6 z;jJtS?QABU@v^l?@a@G5Jz+XJnH4vH%%!cV&m2&SY`5#f5fTpk(m0Iaj1r-u&%Nk# zM3+&%imcdWD)pWvEhiZ3X>#_x%b|sQrvfY}7?10avw?Vt{KU!yE03BSVh5t4nMdx$ zYi+quCU%%wO$Tb4QWv#M8|`n+WoU2No#aGB6Ebm1<*5+dTB5P`(5jeKmM@{=t;^9c zgsDT)s7cbukhH;$(1g+1iQuY-s$tl}RiCXP%OgQ|2^#{G!&p4Jlx@OdMIjfqstJH~ z5!awGy(v40IJPu>7qz-lhm&c(}5F2|!u{|z_u}@~T$!L5^ zJFJH(6Iu_q0-*a5;=-`U>2RX@K{R(Y$BBZ_NJl5N;oJmwseMU%4MW=WR$527cSz6T zW1Ayx5Ji-+$B@)f??yDY0WVVGC5KcIqcH$> zl3k(LEYFbnhU%@1#L_hx85FM@E*6gNRkhC;p;Ie4qM}kt6GcbiA>Bm#FP1S3|iYhxL})5lfS$HpI#Qz)1S39XY}D z!bm22s2#=6q;_N^#;11VD<>W=Q`-m`ky`_#Z=o(~8*~?`9kH4kUp}?zGf0c_C2F&i z=TqB}BpsOb$fI^N`5$VxWhf%0u$1fw1MR>B%j=o5JPl<&^5i{o=k!zCpi#RR|Hr?; z+Qbx#HBLubjOdJj@=%WLOYjvNocARoIqbiZpUKvYQ2R5^9nVmwD_WqqII=?79x*O9tG(ibsU@>zP-1|&l&<-GZ$X5zaWtcGu%j2*D3(~t+pKOM#- ziO9BZijYW;T9H&W&xeu=4Tu!UCPKfRD#6gtv`+oEa^Po0>4Kg^A4;oo7ie@{S8CjJ zSbsQ6CULCKjlNs|bQjb2$?mVJR+N*s2=UaAES_pN8VJjNfQ-KmE`vFWS0&%kY4AXV-5#iOJeHH!v0AK=0v z;3}-?606_zFf^l`OFzIXpp8Su?Uc-m=Jp_WBJN>GLNBN3Ailp53;3iiHm&QiAaOU2 zgg$XOMf#@BRzG0}V7s|aNm#a3Mv~CoH+`=m@0j3-f~-x(1dq|7V%zed?x*l(C{e&9 zLJu2mBx9>sI-qr8tFGU zcN26AE|zCFKfA6nCZvqE!=#Epv>knXD3%{^oB57zfQfW4U?!8unA<2B7_{P)rJtb$ z_)!dWFS6MK?Y;8m-MQjMMgZK&Q7WJL+l1N9E$H}luh4zJ-bmB$os*yhrv};D8tm=X zxw`kg`a?~(JBiT}L*87_lAI-&;TX*YPN*y<6Z%J4Z2l#cr}=?qzg{@XP;c8(`LKCM k$Wu6)O=mH0vz8JG-zjLufS2B0%9QgeZa(F{UR{0jA2!V4&Hw-a literal 5988 zcmcIo+iv4F5N%)c73`b5>nNr!zF?68+YQndMcYNwmp&P)O(z0m%a!EoA`ktK{zCt; zGsBBWS=PqbbQf@Jab|RQ=5U7O{lgDm-~avZKbuv$$crT_ljS-SMR3P9)AA{q=ewVi z_2Au=9^Z;t2t$>qisTn?NV4C=yleQoY$LkH{}5T0@476$FN9b*1`#00(#NOjeN~Co zCaKbV^{~#XUpJK~+AVSTE-l0iZGT*?&fAIECQFKs`R<&_UAkCoO3`8Qe)(rAR#k_^ z$Gl7t$qCqH0#itn?5ENhLe9<5Dc@!&alDYHS)S#moUD@~S(d?xwS3OsU2T)%kggsX z<$F8brUG(gJ&f2EM6jRbc`=X9j)Z4N;MHfMxi81}tPNR~O9%ri5+Fp%(>Yrv>56&1 zt4~)9QAbS5mk>@NsCv3cX5v9)QV3IkLC-@*JblQwqDUUa6o50lru`#V+Xeh1+<38hl9K_=>{D}K(;134j zWH1ciJNE}Y37omILojBYkO)a`fu2T;yc%X>F#jAd>9DYqGjxIsF~}@~It~;9Fm}y6 zGWU|z!FwzOR+!(P5?CxMxiA5kYkr1_B>jo7^!pv{G1jU+h~28bSI}SB)L;08 z`s-34HBU*ptwFBppPdZu>aZ22P7yR@yXtWx^g6e}#cJgIVmTU@m+G;hNQ)k&LJso= zXEO+%rtAiAh2y6Art9qmwBL}xwMyhN_(T4A0O zood*&hN){`R04UVL^tp!w3C>`*gv~_uH~e*ALMkt?IK24f1%NXYN0mvpDNiO^5E zQiuA@ah`fi1#nqW)koWeU_Z-C4>s#(&-Wk!+*}U$D2l^S@4DTvYSHVkxZumbib|ac z$~*VnYQ# ziuLw%kiS4>JBx-mJ*{K`at xH=jNb+h@9rLTkP8fXM);jQnsI@fa_8tR#=^jKeZ?rbH{u5xCi=JYQXX^&ig>F{=Oo diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_esm_omni.bin index 941093347b67ab9692c0e129318f4f26ef50a268..37c207c021d07846c74193f4eb4f9d4e95ef8182 100644 GIT binary patch literal 6586 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard.bin index 162c3db65a5849872ed81c22b3467c4dcae76a0a..3ef696848b0194dac47d57cb852d4015f83349c9 100644 GIT binary patch literal 3369 zcma)8S#RSu5N_WJ{|feHA!Thv)Zqg`3M?8dwkQ_6K>BVlHtnd;;YxCREb`xXW=Kk; zFEjxRNi*}!Hz)b|`OB}rZT|hTEwfcs7pxJ*CYN>e#J2P1RV=IBSFs5n21foS7YT^+ zZ2j7PYFk-uMVnRS^QLOQZChDi);jGtU6Bt|eyjpH~5%Eq6mA;DtdrWborF zq^in|ag0FOig}(v3-;{82P2MxgYUB+pmRbXLA#DZ0u*xDG}rud^bbGEe`gkB_}Xvc z_)WksdU$6tZ=@!mHPPw?LhwSRf_kgG60ISf;uo!)q6?B5N3qZDAQv$iQ@yq7*fJXf zo5v2r5gb4;GGHm87=Yk-E_0Yo5Xr9N)PkNO)&JWJRtaZ_fh82>!E+ix^P1`|=&R7x zRBOz@HKmka%{r=}gTBls=zWj%WkFWPg=r)GJ^?%+gxoI`8O5q>-m+=|Mef^eEn!W1 z_MRM?8clr)GV#)2HV%`q9EBmo&4V;br&D}OX#&D{7LFr$rfy_^K*~>Yeq zu=j*<8kq)gvqE#->*HuIs>XwcxOzGUI~w+oPm(l_&H8a+Y3_U2F~Bze)vfM3wQqUc zbsFzr3|Y*#=Rrf=d$-B#*+*>O>ue9e)}W4|JfMD4|LEvDFFu&xu_D_uZ;`_t1CYEz zz#Gje%~ZF=cmmVY7f3TazeA{2^P%*HWQybAQ56b2^sbxkhMn}%H3kYb!V@aw#2cPW z$sBLMllbHG(hLvHmbjJH9nSd-3?V7~a&o(XR-Dk7P*Kpoa{#SW{hw%_7kSI2yAa_Kd$rn z=US})#LFBu9T-q2yR;KD!&3!E+mLHi~247&E%BVMta8op=K6Psb!C zF-h?slX&{17LP9Qm=dHf(1<={W}nc;llx5sk?>$Lp2T#{_N@@veE~1zzMEfa6Q|NU Os55{*4BiKWUw#5|{v^i$ literal 2930 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 literal 5297 zcmb`L+iu)85Qf`ZKLvZIP3*O(!&-|r1%enxi=t=%_kN-5%8mdXwvzVbz!!awzCz!z z|BOh9)E?|DoB+v6P8L<~9nPulJLxijyC<4_2^(kFH@(tNPzp`jU2?qLiEG1ua=aO}0pDnT}L zjC6+Wy%Z2^o6dw2j;9khm?T$jL_P?;FpBUHvR7Px>P|fTX7`Gp5h6?P6QZ=5sY3-; z_QF15Up|W@s}sf1>$ux>+}Y$!+CX&dP2eoUByY%`*RiKhjS9@oK+z2;I*Y%_+5BmV z*YT$gw6ZrE*c&l}M>Z3g2o84|*%00++=V!bVYl|#AW93wgVA{d5IyYZ1c<~y3!)Gf zimy$APX>%Oj#C|#4#=quq(21GH-H=-qo|tJoK34|(Rwg+Z$PVmnpOft)4Ip2O`qiQZoA&I z`3r{p1t<7ZW!>b@Kbt=ZFP>SKJCXlMpz0({yRmPBoC6yR2Kf005Dn~1Da|>@2{f!Z zn?TEMN@+z@)lEgK8DEF=tpZFVC6hr~fT}lo6ne$|1wax%d_Zqv%fXhuoAo1W!f{;d>PUhz~#P;)%02J^CZv~`E> zhvN-*v97!cLf_YMwAHGVt<_4Xt^cYT)l#-SzC=H$ZHu%T{ertC>b$R=)5dJkk)O17 z2WvY!xPd>d@X4BQJpfuf=jpa@n!m-})v#X0H&q@ulli*8XHA@tfvm%3bs zqma{$?6~L#hgppt3DgzcLR`sq6%zM*LD;abD1kW_=1lIEA6(qia*Z z)kANK>IS<=UpxEgPgnuv^v(&KP_-xuWzVr^Y4thFf)QTX(KjZ~qq_uKhlnl9jTiuvaw!Ld+MvpRMf5O@gN+ qc9QMV!=8e%KM7<=SLPlFFEkwhDy^>!44f734WiBE>-pm1yZ-=G`d3H* diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_hard_linear.bin index 928ad3d19dec1a3b416143a7fce663428b2f1290..16662b7850285d3daf75573b6aede18c299468c2 100644 GIT binary patch literal 3413 zcma)8+m72d5N+QIe+ByzNQtf0)fWU?Am}1UQ3MIFeK)kW>{TIIt|YH7!Tx*B3`vQ! z*G3ayVR43MhG%9D`T6n7ufJ{o{j%HStEw(Vla|{etHTGen>Wwtvf6)5xBkb0w!dVH z7^Wg$KewOSHrwpdHm^31+p7JxYqR=oPclE`b+#bizc!oee%WGIr1ke|f6e6~U#)gc zcEjUS`IKjy_J+szs>vyni)70bN66FS@5VAkIB{oMUN@zdiFjI6MRm!^Hm%dL2`{|m zdhl`ZlGew3vld`G5-;Bj5MU_g zZFb;&bA%G+r??l6h3p-U;?54{?OodS#87RyMd&$>B82`8kae9Alm9%Yh-`!#asrO; z`9py}u0*P;LT`=;C|?Q3(P-X5ynCn3p?7p$@dG|*3BRt6Rwtd%igHdU1Y32W$QAFwMZ}xA z-pX}sY#Sq+`wqi09AOw~u!K=GfOopIAwsNyCI-;N+rt^0SZk>M|L+JDcEVxpE;E`HI{nOzdj;eq9`gPr)oMy4r3@Ksp4z6tZS0dYNw!o}=;3MIYBSj=XWsn3?Ai34r z#rk2@H87x=Ql!v z5_KY?;fx4dNdl6Ro(P?$oYp=Pom1NsfXxbPK<`g7u&5db^}l+PVjxKv{9qC%QKY5H zhGmWDVaI@N{;ONnW>TAjsB5gCgVD(n-;RUkxpQtOa}Xb>Td!w(M7A1rjPk(!rvJ(E zw?5FM_%8E6kj}+JVKq~1u-V2FObUc^1UHj%|+>Tl8K9(&EYDPbU|L< zx*vAdx1KyG)QAe@2b{N2GAkPL?Yyk!Clb?Wg=;HbMx3n8K*JYnF`?S( z+{}6eU`1zw(+_CwDuKpn+??oNZjoa*n$+37X*wk+|Ks7%z4k^>J&O&S4vwW8WAv ze%sNJj3adBDcYZ}L?SUx=s%Ho{!0pvD)5*IQjcvy9}2A}ta#aB8-ky}n~WzB->H2o Ygl1phgTr_8%WYy+x_dpn4hFyc1l1NY#{d8T literal 2942 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 literal 5700 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 literal 5789 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 Uv?IOMKEYap+mAOtZf^ece+28=8UO$Q literal 4282 zcmaJ^$!_CD5KV4@zM^xZ#xliC8wNHo7-KMlAcz6yPS7%CGa*HVq^!l5f6uGxh24^6 z`y#UT?N#yH!}ni*+x+u=yDnCBQ;9aKHf7#KcVe5iFWFPQ`!m}Fp9h-$nlBR~RS(2i zte@|*Cac;rhO&5m>ArMbzTReCQLi61b@$h{%bWK(iF{Wy`I2~ltk;+M^5wS7n)`Zp ziRG?Xt+s9c0mql>vB=lm2ORfxTaYJb&Q=*hD6;YoH{uv6F{CF)${}SAi4wW2%lbSg z8%}C;#x386p9im5b3pP1$`Om#^tH%$&dUTZW%-tM-N2(0fi-HKm3UnjPom0-weW_6 zw}B9=vd%iOtY7mcd(Kms5@aM2UA2LZ6g~;_TihT5<*R=@5~-I2G4RnjLKG|Ec|GGn z+}w!J4~9eW2CAz+CIMq1h7!+-#NQvp*bUC#4W*D{+gq0CP#A_KaVcSy*Wxb}J?t22Vf_o%j=iKT49%(D2!F-K~tbB3(ZmYI@_Yz1X# zW@(w8XxXMb?RscXqN7x)WxcQpkG>&dotim`nMBQ@3a#V{!X7HD zVv+22FbhY+0vh@RC=chVgVZAhsD3J8Cl?`yVtfh%urKSDdi)~n`8)1~Ae<$WIF{)- zNpZ--)~gMnw*9Z^yr;S|jXED`&*oZ*m1XYsvG=hjd$je3t{&j3QW}Ol1s^LsI{eN9 z4bdl26?*LnsQn4G>cDwpSrLAKWr71urnLqGxs1Qn zr+Q!wEQgGnIw3K`iGFgF#y-IbIz-~3&OMC5J9Z9%Z|a>mEfYi{%x&Kp5v54GW|d=# z^eEE+#F4!jTR=5Qv8JnY%2>>i9?A{ow~x(6$}l1KxrKCmz;1H9cWtIs7!V0<5DWj8$t!r_tZb^MZ1eQ7$l5eyOx3@^txto{ z->cfg%x1Zgr)3&3+&V8<===s%eUo>-8kygR^|neQ z9w#R8BX^*Tp~>5A*`*P8l-;J0UH?ed|NKx!Zjo6`5*-(G1ohd`UfDH`xTcyi#ax>K zjHaqA#v??AK_G?XxfbFQnFsKI2%tL6p6af>jMqvM%d4zhmX;kti3E><^hhq&-AhsC zSYgdJ*DIbpJfx9YuY4A;@U2iD04UxN3H?3dVEdQCQkW@NlIW{{0L5zGo7Ef#46qVH$!%rdW+0fA3}o9dpkoqUnpiFTUM%#FJIGO6$qh-s zCL_0*&_jeSs;DucvNImgLdfB?y;0+Mz->>7)w-yB-swPJ8FFaU*j?xK5Bg$OM@zo% zwoQ(&N$NQBIf*T7?9o7sjsA!>1mEI`H}MzKAerXZ0gj%~pG1@S91rr=4&p^HjqqE3 zNML#O`G|bF2Q|RZanM_XdVM#UHuAVTFperXUd)0~fwIAUsj25nJGNJEOkXVh(I#(F z#ADsr&t>`z-&SAg!;fM4M&3uLOKgfRR~quftJs8w)kRx~KN=-UEQ(%e;HJr(X zWwB!K_H`QLs}E+a^& xnum_13)) { - break; - }; - y_18 = -(ynum_12); - while (true) { - if ((y_18 > ynum_12)) { - break; - }; - vec2 tmpvar_19; - tmpvar_19.x = float(x_11); - tmpvar_19.y = float(y_18); - vec4 tmpvar_20; - tmpvar_20.zw = vec2(0.0, 0.0); - tmpvar_20.xy = ((tmpvar_19 * _pcfParams_9.zw) * _texelSize_10); - vec4 tmpvar_21; - tmpvar_21 = (_shadowCoord_7 + tmpvar_20); - result_14 = (result_14 + float((dot (texture2D (u_shadowMap0, (tmpvar_21.xy / tmpvar_21.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_21.z - _bias_8) / tmpvar_21.w)))); - y_18 = (y_18 + 1); - }; - x_11 = (x_11 + 1); - }; - visibility_1 = (result_14 / max (tmpvar_16, 1.0)); + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); } else { - if ((v_position.z < u_csmFarDistances.y)) { - vec2 tmpvar_22; - tmpvar_22 = (v_texcoord2.xy / v_texcoord2.w); - float tmpvar_23; - tmpvar_23 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_22, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_22, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_24; - tmpvar_24.x = tmpvar_23; - tmpvar_24.y = tmpvar_23; - tmpvar_24.z = -(tmpvar_23); - colorCoverage_2 = tmpvar_24; - vec4 _shadowCoord_25; - _shadowCoord_25 = v_texcoord2; - float _bias_26; - _bias_26 = u_params1.x; - vec4 _pcfParams_27; - _pcfParams_27 = u_smSamplingParams; - vec2 _texelSize_28; - _texelSize_28 = (u_params2.zz / 2.0); - int x_29; - int ynum_30; - int xnum_31; - float result_32; - vec2 tmpvar_33; - tmpvar_33 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_34; - tmpvar_34 = (tmpvar_33.x * tmpvar_33.y); - result_32 = 0.0; - int tmpvar_35; - tmpvar_35 = int(u_smSamplingParams.x); - xnum_31 = tmpvar_35; - ynum_30 = int(u_smSamplingParams.y); - x_29 = -(tmpvar_35); - while (true) { - int y_36; - if ((x_29 > xnum_31)) { - break; - }; - y_36 = -(ynum_30); - while (true) { - if ((y_36 > ynum_30)) { - break; - }; - vec2 tmpvar_37; - tmpvar_37.x = float(x_29); - tmpvar_37.y = float(y_36); - vec4 tmpvar_38; - tmpvar_38.zw = vec2(0.0, 0.0); - tmpvar_38.xy = ((tmpvar_37 * _pcfParams_27.zw) * _texelSize_28); - vec4 tmpvar_39; - tmpvar_39 = (_shadowCoord_25 + tmpvar_38); - result_32 = (result_32 + float((dot (texture2D (u_shadowMap1, (tmpvar_39.xy / tmpvar_39.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_39.z - _bias_26) / tmpvar_39.w)))); - y_36 = (y_36 + 1); - }; - x_29 = (x_29 + 1); - }; - visibility_1 = (result_32 / max (tmpvar_34, 1.0)); + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); } else { - if ((v_position.z < u_csmFarDistances.z)) { - vec2 tmpvar_40; - tmpvar_40 = (v_texcoord3.xy / v_texcoord3.w); - float tmpvar_41; - tmpvar_41 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_40, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_40, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_42; - tmpvar_42.x = -(tmpvar_41); - tmpvar_42.y = -(tmpvar_41); - tmpvar_42.z = tmpvar_41; - colorCoverage_2 = tmpvar_42; - vec4 _shadowCoord_43; - _shadowCoord_43 = v_texcoord3; - float _bias_44; - _bias_44 = u_params1.x; - vec4 _pcfParams_45; - _pcfParams_45 = u_smSamplingParams; - vec2 _texelSize_46; - _texelSize_46 = (u_params2.zz / 3.0); - int x_47; - int ynum_48; - int xnum_49; - float result_50; - vec2 tmpvar_51; - tmpvar_51 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_52; - tmpvar_52 = (tmpvar_51.x * tmpvar_51.y); - result_50 = 0.0; - int tmpvar_53; - tmpvar_53 = int(u_smSamplingParams.x); - xnum_49 = tmpvar_53; - ynum_48 = int(u_smSamplingParams.y); - x_47 = -(tmpvar_53); - while (true) { - int y_54; - if ((x_47 > xnum_49)) { - break; - }; - y_54 = -(ynum_48); - while (true) { - if ((y_54 > ynum_48)) { - break; - }; - vec2 tmpvar_55; - tmpvar_55.x = float(x_47); - tmpvar_55.y = float(y_54); - vec4 tmpvar_56; - tmpvar_56.zw = vec2(0.0, 0.0); - tmpvar_56.xy = ((tmpvar_55 * _pcfParams_45.zw) * _texelSize_46); - vec4 tmpvar_57; - tmpvar_57 = (_shadowCoord_43 + tmpvar_56); - result_50 = (result_50 + float((dot (texture2D (u_shadowMap2, (tmpvar_57.xy / tmpvar_57.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_57.z - _bias_44) / tmpvar_57.w)))); - y_54 = (y_54 + 1); - }; - x_47 = (x_47 + 1); - }; - visibility_1 = (result_50 / max (tmpvar_52, 1.0)); + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + float result_21; + result_21 = 0.0; + vec2 tmpvar_22; + tmpvar_22 = ((u_smSamplingParams.zw * u_params2.zz) * v_texcoord1.w); + vec4 tmpvar_23; + tmpvar_23.zw = vec2(0.0, 0.0); + tmpvar_23.xy = (vec2(-1.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_24; + _shadowCoord_24 = (v_texcoord1 + tmpvar_23); + float tmpvar_25; + vec2 tmpvar_26; + tmpvar_26 = (_shadowCoord_24.xy / _shadowCoord_24.w); + bool tmpvar_27; + if (any(greaterThan (tmpvar_26, vec2(1.0, 1.0)))) { + tmpvar_27 = bool(1); + } else { + tmpvar_27 = any(lessThan (tmpvar_26, vec2(0.0, 0.0))); + }; + if (tmpvar_27) { + tmpvar_25 = 1.0; + } else { + tmpvar_25 = float((dot (texture2D (u_shadowMap0, tmpvar_26), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_24.z - u_params1.x) / _shadowCoord_24.w))); + }; + result_21 = tmpvar_25; + vec4 tmpvar_28; + tmpvar_28.zw = vec2(0.0, 0.0); + tmpvar_28.xy = (vec2(-1.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_29; + _shadowCoord_29 = (v_texcoord1 + tmpvar_28); + float tmpvar_30; + vec2 tmpvar_31; + tmpvar_31 = (_shadowCoord_29.xy / _shadowCoord_29.w); + bool tmpvar_32; + if (any(greaterThan (tmpvar_31, vec2(1.0, 1.0)))) { + tmpvar_32 = bool(1); + } else { + tmpvar_32 = any(lessThan (tmpvar_31, vec2(0.0, 0.0))); + }; + if (tmpvar_32) { + tmpvar_30 = 1.0; + } else { + tmpvar_30 = float((dot (texture2D (u_shadowMap0, tmpvar_31), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_29.z - u_params1.x) / _shadowCoord_29.w))); + }; + result_21 = (tmpvar_25 + tmpvar_30); + vec4 tmpvar_33; + tmpvar_33.zw = vec2(0.0, 0.0); + tmpvar_33.xy = (vec2(-1.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_34; + _shadowCoord_34 = (v_texcoord1 + tmpvar_33); + float tmpvar_35; + vec2 tmpvar_36; + tmpvar_36 = (_shadowCoord_34.xy / _shadowCoord_34.w); + bool tmpvar_37; + if (any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) { + tmpvar_37 = bool(1); + } else { + tmpvar_37 = any(lessThan (tmpvar_36, vec2(0.0, 0.0))); + }; + if (tmpvar_37) { + tmpvar_35 = 1.0; + } else { + tmpvar_35 = float((dot (texture2D (u_shadowMap0, tmpvar_36), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_34.z - u_params1.x) / _shadowCoord_34.w))); + }; + result_21 = (result_21 + tmpvar_35); + vec4 tmpvar_38; + tmpvar_38.zw = vec2(0.0, 0.0); + tmpvar_38.xy = (vec2(-1.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_39; + _shadowCoord_39 = (v_texcoord1 + tmpvar_38); + float tmpvar_40; + vec2 tmpvar_41; + tmpvar_41 = (_shadowCoord_39.xy / _shadowCoord_39.w); + bool tmpvar_42; + if (any(greaterThan (tmpvar_41, vec2(1.0, 1.0)))) { + tmpvar_42 = bool(1); + } else { + tmpvar_42 = any(lessThan (tmpvar_41, vec2(0.0, 0.0))); + }; + if (tmpvar_42) { + tmpvar_40 = 1.0; + } else { + tmpvar_40 = float((dot (texture2D (u_shadowMap0, tmpvar_41), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_39.z - u_params1.x) / _shadowCoord_39.w))); + }; + result_21 = (result_21 + tmpvar_40); + vec4 tmpvar_43; + tmpvar_43.zw = vec2(0.0, 0.0); + tmpvar_43.xy = (vec2(-0.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_44; + _shadowCoord_44 = (v_texcoord1 + tmpvar_43); + float tmpvar_45; + vec2 tmpvar_46; + tmpvar_46 = (_shadowCoord_44.xy / _shadowCoord_44.w); + bool tmpvar_47; + if (any(greaterThan (tmpvar_46, vec2(1.0, 1.0)))) { + tmpvar_47 = bool(1); + } else { + tmpvar_47 = any(lessThan (tmpvar_46, vec2(0.0, 0.0))); + }; + if (tmpvar_47) { + tmpvar_45 = 1.0; + } else { + tmpvar_45 = float((dot (texture2D (u_shadowMap0, tmpvar_46), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_44.z - u_params1.x) / _shadowCoord_44.w))); + }; + result_21 = (result_21 + tmpvar_45); + vec4 tmpvar_48; + tmpvar_48.zw = vec2(0.0, 0.0); + tmpvar_48.xy = (vec2(-0.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_49; + _shadowCoord_49 = (v_texcoord1 + tmpvar_48); + float tmpvar_50; + vec2 tmpvar_51; + tmpvar_51 = (_shadowCoord_49.xy / _shadowCoord_49.w); + bool tmpvar_52; + if (any(greaterThan (tmpvar_51, vec2(1.0, 1.0)))) { + tmpvar_52 = bool(1); + } else { + tmpvar_52 = any(lessThan (tmpvar_51, vec2(0.0, 0.0))); + }; + if (tmpvar_52) { + tmpvar_50 = 1.0; + } else { + tmpvar_50 = float((dot (texture2D (u_shadowMap0, tmpvar_51), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_49.z - u_params1.x) / _shadowCoord_49.w))); + }; + result_21 = (result_21 + tmpvar_50); + vec4 tmpvar_53; + tmpvar_53.zw = vec2(0.0, 0.0); + tmpvar_53.xy = (vec2(-0.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_54; + _shadowCoord_54 = (v_texcoord1 + tmpvar_53); + float tmpvar_55; + vec2 tmpvar_56; + tmpvar_56 = (_shadowCoord_54.xy / _shadowCoord_54.w); + bool tmpvar_57; + if (any(greaterThan (tmpvar_56, vec2(1.0, 1.0)))) { + tmpvar_57 = bool(1); + } else { + tmpvar_57 = any(lessThan (tmpvar_56, vec2(0.0, 0.0))); + }; + if (tmpvar_57) { + tmpvar_55 = 1.0; + } else { + tmpvar_55 = float((dot (texture2D (u_shadowMap0, tmpvar_56), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_54.z - u_params1.x) / _shadowCoord_54.w))); + }; + result_21 = (result_21 + tmpvar_55); + vec4 tmpvar_58; + tmpvar_58.zw = vec2(0.0, 0.0); + tmpvar_58.xy = (vec2(-0.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_59; + _shadowCoord_59 = (v_texcoord1 + tmpvar_58); + float tmpvar_60; + vec2 tmpvar_61; + tmpvar_61 = (_shadowCoord_59.xy / _shadowCoord_59.w); + bool tmpvar_62; + if (any(greaterThan (tmpvar_61, vec2(1.0, 1.0)))) { + tmpvar_62 = bool(1); + } else { + tmpvar_62 = any(lessThan (tmpvar_61, vec2(0.0, 0.0))); + }; + if (tmpvar_62) { + tmpvar_60 = 1.0; + } else { + tmpvar_60 = float((dot (texture2D (u_shadowMap0, tmpvar_61), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_59.z - u_params1.x) / _shadowCoord_59.w))); + }; + result_21 = (result_21 + tmpvar_60); + vec4 tmpvar_63; + tmpvar_63.zw = vec2(0.0, 0.0); + tmpvar_63.xy = (vec2(0.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_64; + _shadowCoord_64 = (v_texcoord1 + tmpvar_63); + float tmpvar_65; + vec2 tmpvar_66; + tmpvar_66 = (_shadowCoord_64.xy / _shadowCoord_64.w); + bool tmpvar_67; + if (any(greaterThan (tmpvar_66, vec2(1.0, 1.0)))) { + tmpvar_67 = bool(1); + } else { + tmpvar_67 = any(lessThan (tmpvar_66, vec2(0.0, 0.0))); + }; + if (tmpvar_67) { + tmpvar_65 = 1.0; + } else { + tmpvar_65 = float((dot (texture2D (u_shadowMap0, tmpvar_66), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_64.z - u_params1.x) / _shadowCoord_64.w))); + }; + result_21 = (result_21 + tmpvar_65); + vec4 tmpvar_68; + tmpvar_68.zw = vec2(0.0, 0.0); + tmpvar_68.xy = (vec2(0.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_69; + _shadowCoord_69 = (v_texcoord1 + tmpvar_68); + float tmpvar_70; + vec2 tmpvar_71; + tmpvar_71 = (_shadowCoord_69.xy / _shadowCoord_69.w); + bool tmpvar_72; + if (any(greaterThan (tmpvar_71, vec2(1.0, 1.0)))) { + tmpvar_72 = bool(1); + } else { + tmpvar_72 = any(lessThan (tmpvar_71, vec2(0.0, 0.0))); + }; + if (tmpvar_72) { + tmpvar_70 = 1.0; + } else { + tmpvar_70 = float((dot (texture2D (u_shadowMap0, tmpvar_71), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_69.z - u_params1.x) / _shadowCoord_69.w))); + }; + result_21 = (result_21 + tmpvar_70); + vec4 tmpvar_73; + tmpvar_73.zw = vec2(0.0, 0.0); + tmpvar_73.xy = (vec2(0.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_74; + _shadowCoord_74 = (v_texcoord1 + tmpvar_73); + float tmpvar_75; + vec2 tmpvar_76; + tmpvar_76 = (_shadowCoord_74.xy / _shadowCoord_74.w); + bool tmpvar_77; + if (any(greaterThan (tmpvar_76, vec2(1.0, 1.0)))) { + tmpvar_77 = bool(1); + } else { + tmpvar_77 = any(lessThan (tmpvar_76, vec2(0.0, 0.0))); + }; + if (tmpvar_77) { + tmpvar_75 = 1.0; + } else { + tmpvar_75 = float((dot (texture2D (u_shadowMap0, tmpvar_76), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_74.z - u_params1.x) / _shadowCoord_74.w))); + }; + result_21 = (result_21 + tmpvar_75); + vec4 tmpvar_78; + tmpvar_78.zw = vec2(0.0, 0.0); + tmpvar_78.xy = (vec2(0.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_79; + _shadowCoord_79 = (v_texcoord1 + tmpvar_78); + float tmpvar_80; + vec2 tmpvar_81; + tmpvar_81 = (_shadowCoord_79.xy / _shadowCoord_79.w); + bool tmpvar_82; + if (any(greaterThan (tmpvar_81, vec2(1.0, 1.0)))) { + tmpvar_82 = bool(1); + } else { + tmpvar_82 = any(lessThan (tmpvar_81, vec2(0.0, 0.0))); + }; + if (tmpvar_82) { + tmpvar_80 = 1.0; + } else { + tmpvar_80 = float((dot (texture2D (u_shadowMap0, tmpvar_81), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_79.z - u_params1.x) / _shadowCoord_79.w))); + }; + result_21 = (result_21 + tmpvar_80); + vec4 tmpvar_83; + tmpvar_83.zw = vec2(0.0, 0.0); + tmpvar_83.xy = (vec2(1.5, -1.5) * tmpvar_22); + vec4 _shadowCoord_84; + _shadowCoord_84 = (v_texcoord1 + tmpvar_83); + float tmpvar_85; + vec2 tmpvar_86; + tmpvar_86 = (_shadowCoord_84.xy / _shadowCoord_84.w); + bool tmpvar_87; + if (any(greaterThan (tmpvar_86, vec2(1.0, 1.0)))) { + tmpvar_87 = bool(1); + } else { + tmpvar_87 = any(lessThan (tmpvar_86, vec2(0.0, 0.0))); + }; + if (tmpvar_87) { + tmpvar_85 = 1.0; + } else { + tmpvar_85 = float((dot (texture2D (u_shadowMap0, tmpvar_86), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_84.z - u_params1.x) / _shadowCoord_84.w))); + }; + result_21 = (result_21 + tmpvar_85); + vec4 tmpvar_88; + tmpvar_88.zw = vec2(0.0, 0.0); + tmpvar_88.xy = (vec2(1.5, -0.5) * tmpvar_22); + vec4 _shadowCoord_89; + _shadowCoord_89 = (v_texcoord1 + tmpvar_88); + float tmpvar_90; + vec2 tmpvar_91; + tmpvar_91 = (_shadowCoord_89.xy / _shadowCoord_89.w); + bool tmpvar_92; + if (any(greaterThan (tmpvar_91, vec2(1.0, 1.0)))) { + tmpvar_92 = bool(1); + } else { + tmpvar_92 = any(lessThan (tmpvar_91, vec2(0.0, 0.0))); + }; + if (tmpvar_92) { + tmpvar_90 = 1.0; + } else { + tmpvar_90 = float((dot (texture2D (u_shadowMap0, tmpvar_91), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_89.z - u_params1.x) / _shadowCoord_89.w))); + }; + result_21 = (result_21 + tmpvar_90); + vec4 tmpvar_93; + tmpvar_93.zw = vec2(0.0, 0.0); + tmpvar_93.xy = (vec2(1.5, 0.5) * tmpvar_22); + vec4 _shadowCoord_94; + _shadowCoord_94 = (v_texcoord1 + tmpvar_93); + float tmpvar_95; + vec2 tmpvar_96; + tmpvar_96 = (_shadowCoord_94.xy / _shadowCoord_94.w); + bool tmpvar_97; + if (any(greaterThan (tmpvar_96, vec2(1.0, 1.0)))) { + tmpvar_97 = bool(1); + } else { + tmpvar_97 = any(lessThan (tmpvar_96, vec2(0.0, 0.0))); + }; + if (tmpvar_97) { + tmpvar_95 = 1.0; + } else { + tmpvar_95 = float((dot (texture2D (u_shadowMap0, tmpvar_96), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_94.z - u_params1.x) / _shadowCoord_94.w))); + }; + result_21 = (result_21 + tmpvar_95); + vec4 tmpvar_98; + tmpvar_98.zw = vec2(0.0, 0.0); + tmpvar_98.xy = (vec2(1.5, 1.5) * tmpvar_22); + vec4 _shadowCoord_99; + _shadowCoord_99 = (v_texcoord1 + tmpvar_98); + float tmpvar_100; + vec2 tmpvar_101; + tmpvar_101 = (_shadowCoord_99.xy / _shadowCoord_99.w); + bool tmpvar_102; + if (any(greaterThan (tmpvar_101, vec2(1.0, 1.0)))) { + tmpvar_102 = bool(1); + } else { + tmpvar_102 = any(lessThan (tmpvar_101, vec2(0.0, 0.0))); + }; + if (tmpvar_102) { + tmpvar_100 = 1.0; + } else { + tmpvar_100 = float((dot (texture2D (u_shadowMap0, tmpvar_101), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_99.z - u_params1.x) / _shadowCoord_99.w))); + }; + float tmpvar_103; + tmpvar_103 = (result_21 + tmpvar_100); + result_21 = tmpvar_103; + visibility_1 = (tmpvar_103 / 16.0); + } else { + if (tmpvar_10) { + vec2 _texcoord_104; + _texcoord_104 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_105; + tmpvar_105 = greaterThan (_texcoord_104, vec2(0.0, 0.0)); + bool tmpvar_106; + if ((tmpvar_105.x && tmpvar_105.y)) { + bvec2 tmpvar_107; + tmpvar_107 = lessThan (_texcoord_104, vec2(1.0, 1.0)); + tmpvar_106 = (tmpvar_107.x && tmpvar_107.y); } else { - vec2 tmpvar_58; - tmpvar_58 = (v_texcoord4.xy / v_texcoord4.w); - float tmpvar_59; - tmpvar_59 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_58, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_58, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_60; - tmpvar_60.x = tmpvar_59; - tmpvar_60.y = -(tmpvar_59); - tmpvar_60.z = -(tmpvar_59); - colorCoverage_2 = tmpvar_60; - vec4 _shadowCoord_61; - _shadowCoord_61 = v_texcoord4; - float _bias_62; - _bias_62 = u_params1.x; - vec4 _pcfParams_63; - _pcfParams_63 = u_smSamplingParams; - vec2 _texelSize_64; - _texelSize_64 = (u_params2.zz / 4.0); - int x_65; - int ynum_66; - int xnum_67; - float result_68; - vec2 tmpvar_69; - tmpvar_69 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_70; - tmpvar_70 = (tmpvar_69.x * tmpvar_69.y); - result_68 = 0.0; - int tmpvar_71; - tmpvar_71 = int(u_smSamplingParams.x); - xnum_67 = tmpvar_71; - ynum_66 = int(u_smSamplingParams.y); - x_65 = -(tmpvar_71); - while (true) { - int y_72; - if ((x_65 > xnum_67)) { - break; - }; - y_72 = -(ynum_66); - while (true) { - if ((y_72 > ynum_66)) { - break; - }; - vec2 tmpvar_73; - tmpvar_73.x = float(x_65); - tmpvar_73.y = float(y_72); - vec4 tmpvar_74; - tmpvar_74.zw = vec2(0.0, 0.0); - tmpvar_74.xy = ((tmpvar_73 * _pcfParams_63.zw) * _texelSize_64); - vec4 tmpvar_75; - tmpvar_75 = (_shadowCoord_61 + tmpvar_74); - result_68 = (result_68 + float((dot (texture2D (u_shadowMap3, (tmpvar_75.xy / tmpvar_75.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_75.z - _bias_62) / tmpvar_75.w)))); - y_72 = (y_72 + 1); - }; - x_65 = (x_65 + 1); + tmpvar_106 = bool(0); + }; + float tmpvar_108; + tmpvar_108 = (float(tmpvar_106) * 0.4); + vec3 tmpvar_109; + tmpvar_109.x = tmpvar_108; + tmpvar_109.y = tmpvar_108; + tmpvar_109.z = -(tmpvar_108); + colorCoverage_2 = tmpvar_109; + float result_110; + result_110 = 0.0; + vec2 tmpvar_111; + tmpvar_111 = ((u_smSamplingParams.zw * (u_params2.zz / 2.0)) * v_texcoord2.w); + vec4 tmpvar_112; + tmpvar_112.zw = vec2(0.0, 0.0); + tmpvar_112.xy = (vec2(-1.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_113; + _shadowCoord_113 = (v_texcoord2 + tmpvar_112); + float tmpvar_114; + vec2 tmpvar_115; + tmpvar_115 = (_shadowCoord_113.xy / _shadowCoord_113.w); + bool tmpvar_116; + if (any(greaterThan (tmpvar_115, vec2(1.0, 1.0)))) { + tmpvar_116 = bool(1); + } else { + tmpvar_116 = any(lessThan (tmpvar_115, vec2(0.0, 0.0))); + }; + if (tmpvar_116) { + tmpvar_114 = 1.0; + } else { + tmpvar_114 = float((dot (texture2D (u_shadowMap1, tmpvar_115), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_113.z - u_params1.x) / _shadowCoord_113.w))); + }; + result_110 = tmpvar_114; + vec4 tmpvar_117; + tmpvar_117.zw = vec2(0.0, 0.0); + tmpvar_117.xy = (vec2(-1.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_118; + _shadowCoord_118 = (v_texcoord2 + tmpvar_117); + float tmpvar_119; + vec2 tmpvar_120; + tmpvar_120 = (_shadowCoord_118.xy / _shadowCoord_118.w); + bool tmpvar_121; + if (any(greaterThan (tmpvar_120, vec2(1.0, 1.0)))) { + tmpvar_121 = bool(1); + } else { + tmpvar_121 = any(lessThan (tmpvar_120, vec2(0.0, 0.0))); + }; + if (tmpvar_121) { + tmpvar_119 = 1.0; + } else { + tmpvar_119 = float((dot (texture2D (u_shadowMap1, tmpvar_120), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_118.z - u_params1.x) / _shadowCoord_118.w))); + }; + result_110 = (tmpvar_114 + tmpvar_119); + vec4 tmpvar_122; + tmpvar_122.zw = vec2(0.0, 0.0); + tmpvar_122.xy = (vec2(-1.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_123; + _shadowCoord_123 = (v_texcoord2 + tmpvar_122); + float tmpvar_124; + vec2 tmpvar_125; + tmpvar_125 = (_shadowCoord_123.xy / _shadowCoord_123.w); + bool tmpvar_126; + if (any(greaterThan (tmpvar_125, vec2(1.0, 1.0)))) { + tmpvar_126 = bool(1); + } else { + tmpvar_126 = any(lessThan (tmpvar_125, vec2(0.0, 0.0))); + }; + if (tmpvar_126) { + tmpvar_124 = 1.0; + } else { + tmpvar_124 = float((dot (texture2D (u_shadowMap1, tmpvar_125), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_123.z - u_params1.x) / _shadowCoord_123.w))); + }; + result_110 = (result_110 + tmpvar_124); + vec4 tmpvar_127; + tmpvar_127.zw = vec2(0.0, 0.0); + tmpvar_127.xy = (vec2(-1.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_128; + _shadowCoord_128 = (v_texcoord2 + tmpvar_127); + float tmpvar_129; + vec2 tmpvar_130; + tmpvar_130 = (_shadowCoord_128.xy / _shadowCoord_128.w); + bool tmpvar_131; + if (any(greaterThan (tmpvar_130, vec2(1.0, 1.0)))) { + tmpvar_131 = bool(1); + } else { + tmpvar_131 = any(lessThan (tmpvar_130, vec2(0.0, 0.0))); + }; + if (tmpvar_131) { + tmpvar_129 = 1.0; + } else { + tmpvar_129 = float((dot (texture2D (u_shadowMap1, tmpvar_130), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_128.z - u_params1.x) / _shadowCoord_128.w))); + }; + result_110 = (result_110 + tmpvar_129); + vec4 tmpvar_132; + tmpvar_132.zw = vec2(0.0, 0.0); + tmpvar_132.xy = (vec2(-0.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_133; + _shadowCoord_133 = (v_texcoord2 + tmpvar_132); + float tmpvar_134; + vec2 tmpvar_135; + tmpvar_135 = (_shadowCoord_133.xy / _shadowCoord_133.w); + bool tmpvar_136; + if (any(greaterThan (tmpvar_135, vec2(1.0, 1.0)))) { + tmpvar_136 = bool(1); + } else { + tmpvar_136 = any(lessThan (tmpvar_135, vec2(0.0, 0.0))); + }; + if (tmpvar_136) { + tmpvar_134 = 1.0; + } else { + tmpvar_134 = float((dot (texture2D (u_shadowMap1, tmpvar_135), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_133.z - u_params1.x) / _shadowCoord_133.w))); + }; + result_110 = (result_110 + tmpvar_134); + vec4 tmpvar_137; + tmpvar_137.zw = vec2(0.0, 0.0); + tmpvar_137.xy = (vec2(-0.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_138; + _shadowCoord_138 = (v_texcoord2 + tmpvar_137); + float tmpvar_139; + vec2 tmpvar_140; + tmpvar_140 = (_shadowCoord_138.xy / _shadowCoord_138.w); + bool tmpvar_141; + if (any(greaterThan (tmpvar_140, vec2(1.0, 1.0)))) { + tmpvar_141 = bool(1); + } else { + tmpvar_141 = any(lessThan (tmpvar_140, vec2(0.0, 0.0))); + }; + if (tmpvar_141) { + tmpvar_139 = 1.0; + } else { + tmpvar_139 = float((dot (texture2D (u_shadowMap1, tmpvar_140), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_138.z - u_params1.x) / _shadowCoord_138.w))); + }; + result_110 = (result_110 + tmpvar_139); + vec4 tmpvar_142; + tmpvar_142.zw = vec2(0.0, 0.0); + tmpvar_142.xy = (vec2(-0.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_143; + _shadowCoord_143 = (v_texcoord2 + tmpvar_142); + float tmpvar_144; + vec2 tmpvar_145; + tmpvar_145 = (_shadowCoord_143.xy / _shadowCoord_143.w); + bool tmpvar_146; + if (any(greaterThan (tmpvar_145, vec2(1.0, 1.0)))) { + tmpvar_146 = bool(1); + } else { + tmpvar_146 = any(lessThan (tmpvar_145, vec2(0.0, 0.0))); + }; + if (tmpvar_146) { + tmpvar_144 = 1.0; + } else { + tmpvar_144 = float((dot (texture2D (u_shadowMap1, tmpvar_145), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_143.z - u_params1.x) / _shadowCoord_143.w))); + }; + result_110 = (result_110 + tmpvar_144); + vec4 tmpvar_147; + tmpvar_147.zw = vec2(0.0, 0.0); + tmpvar_147.xy = (vec2(-0.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_148; + _shadowCoord_148 = (v_texcoord2 + tmpvar_147); + float tmpvar_149; + vec2 tmpvar_150; + tmpvar_150 = (_shadowCoord_148.xy / _shadowCoord_148.w); + bool tmpvar_151; + if (any(greaterThan (tmpvar_150, vec2(1.0, 1.0)))) { + tmpvar_151 = bool(1); + } else { + tmpvar_151 = any(lessThan (tmpvar_150, vec2(0.0, 0.0))); + }; + if (tmpvar_151) { + tmpvar_149 = 1.0; + } else { + tmpvar_149 = float((dot (texture2D (u_shadowMap1, tmpvar_150), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_148.z - u_params1.x) / _shadowCoord_148.w))); + }; + result_110 = (result_110 + tmpvar_149); + vec4 tmpvar_152; + tmpvar_152.zw = vec2(0.0, 0.0); + tmpvar_152.xy = (vec2(0.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_153; + _shadowCoord_153 = (v_texcoord2 + tmpvar_152); + float tmpvar_154; + vec2 tmpvar_155; + tmpvar_155 = (_shadowCoord_153.xy / _shadowCoord_153.w); + bool tmpvar_156; + if (any(greaterThan (tmpvar_155, vec2(1.0, 1.0)))) { + tmpvar_156 = bool(1); + } else { + tmpvar_156 = any(lessThan (tmpvar_155, vec2(0.0, 0.0))); + }; + if (tmpvar_156) { + tmpvar_154 = 1.0; + } else { + tmpvar_154 = float((dot (texture2D (u_shadowMap1, tmpvar_155), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_153.z - u_params1.x) / _shadowCoord_153.w))); + }; + result_110 = (result_110 + tmpvar_154); + vec4 tmpvar_157; + tmpvar_157.zw = vec2(0.0, 0.0); + tmpvar_157.xy = (vec2(0.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_158; + _shadowCoord_158 = (v_texcoord2 + tmpvar_157); + float tmpvar_159; + vec2 tmpvar_160; + tmpvar_160 = (_shadowCoord_158.xy / _shadowCoord_158.w); + bool tmpvar_161; + if (any(greaterThan (tmpvar_160, vec2(1.0, 1.0)))) { + tmpvar_161 = bool(1); + } else { + tmpvar_161 = any(lessThan (tmpvar_160, vec2(0.0, 0.0))); + }; + if (tmpvar_161) { + tmpvar_159 = 1.0; + } else { + tmpvar_159 = float((dot (texture2D (u_shadowMap1, tmpvar_160), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_158.z - u_params1.x) / _shadowCoord_158.w))); + }; + result_110 = (result_110 + tmpvar_159); + vec4 tmpvar_162; + tmpvar_162.zw = vec2(0.0, 0.0); + tmpvar_162.xy = (vec2(0.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_163; + _shadowCoord_163 = (v_texcoord2 + tmpvar_162); + float tmpvar_164; + vec2 tmpvar_165; + tmpvar_165 = (_shadowCoord_163.xy / _shadowCoord_163.w); + bool tmpvar_166; + if (any(greaterThan (tmpvar_165, vec2(1.0, 1.0)))) { + tmpvar_166 = bool(1); + } else { + tmpvar_166 = any(lessThan (tmpvar_165, vec2(0.0, 0.0))); + }; + if (tmpvar_166) { + tmpvar_164 = 1.0; + } else { + tmpvar_164 = float((dot (texture2D (u_shadowMap1, tmpvar_165), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_163.z - u_params1.x) / _shadowCoord_163.w))); + }; + result_110 = (result_110 + tmpvar_164); + vec4 tmpvar_167; + tmpvar_167.zw = vec2(0.0, 0.0); + tmpvar_167.xy = (vec2(0.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_168; + _shadowCoord_168 = (v_texcoord2 + tmpvar_167); + float tmpvar_169; + vec2 tmpvar_170; + tmpvar_170 = (_shadowCoord_168.xy / _shadowCoord_168.w); + bool tmpvar_171; + if (any(greaterThan (tmpvar_170, vec2(1.0, 1.0)))) { + tmpvar_171 = bool(1); + } else { + tmpvar_171 = any(lessThan (tmpvar_170, vec2(0.0, 0.0))); + }; + if (tmpvar_171) { + tmpvar_169 = 1.0; + } else { + tmpvar_169 = float((dot (texture2D (u_shadowMap1, tmpvar_170), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_168.z - u_params1.x) / _shadowCoord_168.w))); + }; + result_110 = (result_110 + tmpvar_169); + vec4 tmpvar_172; + tmpvar_172.zw = vec2(0.0, 0.0); + tmpvar_172.xy = (vec2(1.5, -1.5) * tmpvar_111); + vec4 _shadowCoord_173; + _shadowCoord_173 = (v_texcoord2 + tmpvar_172); + float tmpvar_174; + vec2 tmpvar_175; + tmpvar_175 = (_shadowCoord_173.xy / _shadowCoord_173.w); + bool tmpvar_176; + if (any(greaterThan (tmpvar_175, vec2(1.0, 1.0)))) { + tmpvar_176 = bool(1); + } else { + tmpvar_176 = any(lessThan (tmpvar_175, vec2(0.0, 0.0))); + }; + if (tmpvar_176) { + tmpvar_174 = 1.0; + } else { + tmpvar_174 = float((dot (texture2D (u_shadowMap1, tmpvar_175), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_173.z - u_params1.x) / _shadowCoord_173.w))); + }; + result_110 = (result_110 + tmpvar_174); + vec4 tmpvar_177; + tmpvar_177.zw = vec2(0.0, 0.0); + tmpvar_177.xy = (vec2(1.5, -0.5) * tmpvar_111); + vec4 _shadowCoord_178; + _shadowCoord_178 = (v_texcoord2 + tmpvar_177); + float tmpvar_179; + vec2 tmpvar_180; + tmpvar_180 = (_shadowCoord_178.xy / _shadowCoord_178.w); + bool tmpvar_181; + if (any(greaterThan (tmpvar_180, vec2(1.0, 1.0)))) { + tmpvar_181 = bool(1); + } else { + tmpvar_181 = any(lessThan (tmpvar_180, vec2(0.0, 0.0))); + }; + if (tmpvar_181) { + tmpvar_179 = 1.0; + } else { + tmpvar_179 = float((dot (texture2D (u_shadowMap1, tmpvar_180), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_178.z - u_params1.x) / _shadowCoord_178.w))); + }; + result_110 = (result_110 + tmpvar_179); + vec4 tmpvar_182; + tmpvar_182.zw = vec2(0.0, 0.0); + tmpvar_182.xy = (vec2(1.5, 0.5) * tmpvar_111); + vec4 _shadowCoord_183; + _shadowCoord_183 = (v_texcoord2 + tmpvar_182); + float tmpvar_184; + vec2 tmpvar_185; + tmpvar_185 = (_shadowCoord_183.xy / _shadowCoord_183.w); + bool tmpvar_186; + if (any(greaterThan (tmpvar_185, vec2(1.0, 1.0)))) { + tmpvar_186 = bool(1); + } else { + tmpvar_186 = any(lessThan (tmpvar_185, vec2(0.0, 0.0))); + }; + if (tmpvar_186) { + tmpvar_184 = 1.0; + } else { + tmpvar_184 = float((dot (texture2D (u_shadowMap1, tmpvar_185), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_183.z - u_params1.x) / _shadowCoord_183.w))); + }; + result_110 = (result_110 + tmpvar_184); + vec4 tmpvar_187; + tmpvar_187.zw = vec2(0.0, 0.0); + tmpvar_187.xy = (vec2(1.5, 1.5) * tmpvar_111); + vec4 _shadowCoord_188; + _shadowCoord_188 = (v_texcoord2 + tmpvar_187); + float tmpvar_189; + vec2 tmpvar_190; + tmpvar_190 = (_shadowCoord_188.xy / _shadowCoord_188.w); + bool tmpvar_191; + if (any(greaterThan (tmpvar_190, vec2(1.0, 1.0)))) { + tmpvar_191 = bool(1); + } else { + tmpvar_191 = any(lessThan (tmpvar_190, vec2(0.0, 0.0))); + }; + if (tmpvar_191) { + tmpvar_189 = 1.0; + } else { + tmpvar_189 = float((dot (texture2D (u_shadowMap1, tmpvar_190), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_188.z - u_params1.x) / _shadowCoord_188.w))); + }; + float tmpvar_192; + tmpvar_192 = (result_110 + tmpvar_189); + result_110 = tmpvar_192; + visibility_1 = (tmpvar_192 / 16.0); + } else { + if (tmpvar_13) { + vec2 _texcoord_193; + _texcoord_193 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_194; + tmpvar_194 = greaterThan (_texcoord_193, vec2(0.0, 0.0)); + bool tmpvar_195; + if ((tmpvar_194.x && tmpvar_194.y)) { + bvec2 tmpvar_196; + tmpvar_196 = lessThan (_texcoord_193, vec2(1.0, 1.0)); + tmpvar_195 = (tmpvar_196.x && tmpvar_196.y); + } else { + tmpvar_195 = bool(0); }; - visibility_1 = (result_68 / max (tmpvar_70, 1.0)); + float tmpvar_197; + tmpvar_197 = (float(tmpvar_195) * 0.4); + vec3 tmpvar_198; + tmpvar_198.x = -(tmpvar_197); + tmpvar_198.y = -(tmpvar_197); + tmpvar_198.z = tmpvar_197; + colorCoverage_2 = tmpvar_198; + float result_199; + result_199 = 0.0; + vec2 tmpvar_200; + tmpvar_200 = ((u_smSamplingParams.zw * (u_params2.zz / 3.0)) * v_texcoord3.w); + vec4 tmpvar_201; + tmpvar_201.zw = vec2(0.0, 0.0); + tmpvar_201.xy = (vec2(-1.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_202; + _shadowCoord_202 = (v_texcoord3 + tmpvar_201); + float tmpvar_203; + vec2 tmpvar_204; + tmpvar_204 = (_shadowCoord_202.xy / _shadowCoord_202.w); + bool tmpvar_205; + if (any(greaterThan (tmpvar_204, vec2(1.0, 1.0)))) { + tmpvar_205 = bool(1); + } else { + tmpvar_205 = any(lessThan (tmpvar_204, vec2(0.0, 0.0))); + }; + if (tmpvar_205) { + tmpvar_203 = 1.0; + } else { + tmpvar_203 = float((dot (texture2D (u_shadowMap2, tmpvar_204), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_202.z - u_params1.x) / _shadowCoord_202.w))); + }; + result_199 = tmpvar_203; + vec4 tmpvar_206; + tmpvar_206.zw = vec2(0.0, 0.0); + tmpvar_206.xy = (vec2(-1.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_207; + _shadowCoord_207 = (v_texcoord3 + tmpvar_206); + float tmpvar_208; + vec2 tmpvar_209; + tmpvar_209 = (_shadowCoord_207.xy / _shadowCoord_207.w); + bool tmpvar_210; + if (any(greaterThan (tmpvar_209, vec2(1.0, 1.0)))) { + tmpvar_210 = bool(1); + } else { + tmpvar_210 = any(lessThan (tmpvar_209, vec2(0.0, 0.0))); + }; + if (tmpvar_210) { + tmpvar_208 = 1.0; + } else { + tmpvar_208 = float((dot (texture2D (u_shadowMap2, tmpvar_209), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_207.z - u_params1.x) / _shadowCoord_207.w))); + }; + result_199 = (tmpvar_203 + tmpvar_208); + vec4 tmpvar_211; + tmpvar_211.zw = vec2(0.0, 0.0); + tmpvar_211.xy = (vec2(-1.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_212; + _shadowCoord_212 = (v_texcoord3 + tmpvar_211); + float tmpvar_213; + vec2 tmpvar_214; + tmpvar_214 = (_shadowCoord_212.xy / _shadowCoord_212.w); + bool tmpvar_215; + if (any(greaterThan (tmpvar_214, vec2(1.0, 1.0)))) { + tmpvar_215 = bool(1); + } else { + tmpvar_215 = any(lessThan (tmpvar_214, vec2(0.0, 0.0))); + }; + if (tmpvar_215) { + tmpvar_213 = 1.0; + } else { + tmpvar_213 = float((dot (texture2D (u_shadowMap2, tmpvar_214), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_212.z - u_params1.x) / _shadowCoord_212.w))); + }; + result_199 = (result_199 + tmpvar_213); + vec4 tmpvar_216; + tmpvar_216.zw = vec2(0.0, 0.0); + tmpvar_216.xy = (vec2(-1.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_217; + _shadowCoord_217 = (v_texcoord3 + tmpvar_216); + float tmpvar_218; + vec2 tmpvar_219; + tmpvar_219 = (_shadowCoord_217.xy / _shadowCoord_217.w); + bool tmpvar_220; + if (any(greaterThan (tmpvar_219, vec2(1.0, 1.0)))) { + tmpvar_220 = bool(1); + } else { + tmpvar_220 = any(lessThan (tmpvar_219, vec2(0.0, 0.0))); + }; + if (tmpvar_220) { + tmpvar_218 = 1.0; + } else { + tmpvar_218 = float((dot (texture2D (u_shadowMap2, tmpvar_219), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_217.z - u_params1.x) / _shadowCoord_217.w))); + }; + result_199 = (result_199 + tmpvar_218); + vec4 tmpvar_221; + tmpvar_221.zw = vec2(0.0, 0.0); + tmpvar_221.xy = (vec2(-0.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_222; + _shadowCoord_222 = (v_texcoord3 + tmpvar_221); + float tmpvar_223; + vec2 tmpvar_224; + tmpvar_224 = (_shadowCoord_222.xy / _shadowCoord_222.w); + bool tmpvar_225; + if (any(greaterThan (tmpvar_224, vec2(1.0, 1.0)))) { + tmpvar_225 = bool(1); + } else { + tmpvar_225 = any(lessThan (tmpvar_224, vec2(0.0, 0.0))); + }; + if (tmpvar_225) { + tmpvar_223 = 1.0; + } else { + tmpvar_223 = float((dot (texture2D (u_shadowMap2, tmpvar_224), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_222.z - u_params1.x) / _shadowCoord_222.w))); + }; + result_199 = (result_199 + tmpvar_223); + vec4 tmpvar_226; + tmpvar_226.zw = vec2(0.0, 0.0); + tmpvar_226.xy = (vec2(-0.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_227; + _shadowCoord_227 = (v_texcoord3 + tmpvar_226); + float tmpvar_228; + vec2 tmpvar_229; + tmpvar_229 = (_shadowCoord_227.xy / _shadowCoord_227.w); + bool tmpvar_230; + if (any(greaterThan (tmpvar_229, vec2(1.0, 1.0)))) { + tmpvar_230 = bool(1); + } else { + tmpvar_230 = any(lessThan (tmpvar_229, vec2(0.0, 0.0))); + }; + if (tmpvar_230) { + tmpvar_228 = 1.0; + } else { + tmpvar_228 = float((dot (texture2D (u_shadowMap2, tmpvar_229), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_227.z - u_params1.x) / _shadowCoord_227.w))); + }; + result_199 = (result_199 + tmpvar_228); + vec4 tmpvar_231; + tmpvar_231.zw = vec2(0.0, 0.0); + tmpvar_231.xy = (vec2(-0.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_232; + _shadowCoord_232 = (v_texcoord3 + tmpvar_231); + float tmpvar_233; + vec2 tmpvar_234; + tmpvar_234 = (_shadowCoord_232.xy / _shadowCoord_232.w); + bool tmpvar_235; + if (any(greaterThan (tmpvar_234, vec2(1.0, 1.0)))) { + tmpvar_235 = bool(1); + } else { + tmpvar_235 = any(lessThan (tmpvar_234, vec2(0.0, 0.0))); + }; + if (tmpvar_235) { + tmpvar_233 = 1.0; + } else { + tmpvar_233 = float((dot (texture2D (u_shadowMap2, tmpvar_234), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_232.z - u_params1.x) / _shadowCoord_232.w))); + }; + result_199 = (result_199 + tmpvar_233); + vec4 tmpvar_236; + tmpvar_236.zw = vec2(0.0, 0.0); + tmpvar_236.xy = (vec2(-0.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_237; + _shadowCoord_237 = (v_texcoord3 + tmpvar_236); + float tmpvar_238; + vec2 tmpvar_239; + tmpvar_239 = (_shadowCoord_237.xy / _shadowCoord_237.w); + bool tmpvar_240; + if (any(greaterThan (tmpvar_239, vec2(1.0, 1.0)))) { + tmpvar_240 = bool(1); + } else { + tmpvar_240 = any(lessThan (tmpvar_239, vec2(0.0, 0.0))); + }; + if (tmpvar_240) { + tmpvar_238 = 1.0; + } else { + tmpvar_238 = float((dot (texture2D (u_shadowMap2, tmpvar_239), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_237.z - u_params1.x) / _shadowCoord_237.w))); + }; + result_199 = (result_199 + tmpvar_238); + vec4 tmpvar_241; + tmpvar_241.zw = vec2(0.0, 0.0); + tmpvar_241.xy = (vec2(0.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_242; + _shadowCoord_242 = (v_texcoord3 + tmpvar_241); + float tmpvar_243; + vec2 tmpvar_244; + tmpvar_244 = (_shadowCoord_242.xy / _shadowCoord_242.w); + bool tmpvar_245; + if (any(greaterThan (tmpvar_244, vec2(1.0, 1.0)))) { + tmpvar_245 = bool(1); + } else { + tmpvar_245 = any(lessThan (tmpvar_244, vec2(0.0, 0.0))); + }; + if (tmpvar_245) { + tmpvar_243 = 1.0; + } else { + tmpvar_243 = float((dot (texture2D (u_shadowMap2, tmpvar_244), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_242.z - u_params1.x) / _shadowCoord_242.w))); + }; + result_199 = (result_199 + tmpvar_243); + vec4 tmpvar_246; + tmpvar_246.zw = vec2(0.0, 0.0); + tmpvar_246.xy = (vec2(0.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_247; + _shadowCoord_247 = (v_texcoord3 + tmpvar_246); + float tmpvar_248; + vec2 tmpvar_249; + tmpvar_249 = (_shadowCoord_247.xy / _shadowCoord_247.w); + bool tmpvar_250; + if (any(greaterThan (tmpvar_249, vec2(1.0, 1.0)))) { + tmpvar_250 = bool(1); + } else { + tmpvar_250 = any(lessThan (tmpvar_249, vec2(0.0, 0.0))); + }; + if (tmpvar_250) { + tmpvar_248 = 1.0; + } else { + tmpvar_248 = float((dot (texture2D (u_shadowMap2, tmpvar_249), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_247.z - u_params1.x) / _shadowCoord_247.w))); + }; + result_199 = (result_199 + tmpvar_248); + vec4 tmpvar_251; + tmpvar_251.zw = vec2(0.0, 0.0); + tmpvar_251.xy = (vec2(0.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_252; + _shadowCoord_252 = (v_texcoord3 + tmpvar_251); + float tmpvar_253; + vec2 tmpvar_254; + tmpvar_254 = (_shadowCoord_252.xy / _shadowCoord_252.w); + bool tmpvar_255; + if (any(greaterThan (tmpvar_254, vec2(1.0, 1.0)))) { + tmpvar_255 = bool(1); + } else { + tmpvar_255 = any(lessThan (tmpvar_254, vec2(0.0, 0.0))); + }; + if (tmpvar_255) { + tmpvar_253 = 1.0; + } else { + tmpvar_253 = float((dot (texture2D (u_shadowMap2, tmpvar_254), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_252.z - u_params1.x) / _shadowCoord_252.w))); + }; + result_199 = (result_199 + tmpvar_253); + vec4 tmpvar_256; + tmpvar_256.zw = vec2(0.0, 0.0); + tmpvar_256.xy = (vec2(0.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_257; + _shadowCoord_257 = (v_texcoord3 + tmpvar_256); + float tmpvar_258; + vec2 tmpvar_259; + tmpvar_259 = (_shadowCoord_257.xy / _shadowCoord_257.w); + bool tmpvar_260; + if (any(greaterThan (tmpvar_259, vec2(1.0, 1.0)))) { + tmpvar_260 = bool(1); + } else { + tmpvar_260 = any(lessThan (tmpvar_259, vec2(0.0, 0.0))); + }; + if (tmpvar_260) { + tmpvar_258 = 1.0; + } else { + tmpvar_258 = float((dot (texture2D (u_shadowMap2, tmpvar_259), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_257.z - u_params1.x) / _shadowCoord_257.w))); + }; + result_199 = (result_199 + tmpvar_258); + vec4 tmpvar_261; + tmpvar_261.zw = vec2(0.0, 0.0); + tmpvar_261.xy = (vec2(1.5, -1.5) * tmpvar_200); + vec4 _shadowCoord_262; + _shadowCoord_262 = (v_texcoord3 + tmpvar_261); + float tmpvar_263; + vec2 tmpvar_264; + tmpvar_264 = (_shadowCoord_262.xy / _shadowCoord_262.w); + bool tmpvar_265; + if (any(greaterThan (tmpvar_264, vec2(1.0, 1.0)))) { + tmpvar_265 = bool(1); + } else { + tmpvar_265 = any(lessThan (tmpvar_264, vec2(0.0, 0.0))); + }; + if (tmpvar_265) { + tmpvar_263 = 1.0; + } else { + tmpvar_263 = float((dot (texture2D (u_shadowMap2, tmpvar_264), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_262.z - u_params1.x) / _shadowCoord_262.w))); + }; + result_199 = (result_199 + tmpvar_263); + vec4 tmpvar_266; + tmpvar_266.zw = vec2(0.0, 0.0); + tmpvar_266.xy = (vec2(1.5, -0.5) * tmpvar_200); + vec4 _shadowCoord_267; + _shadowCoord_267 = (v_texcoord3 + tmpvar_266); + float tmpvar_268; + vec2 tmpvar_269; + tmpvar_269 = (_shadowCoord_267.xy / _shadowCoord_267.w); + bool tmpvar_270; + if (any(greaterThan (tmpvar_269, vec2(1.0, 1.0)))) { + tmpvar_270 = bool(1); + } else { + tmpvar_270 = any(lessThan (tmpvar_269, vec2(0.0, 0.0))); + }; + if (tmpvar_270) { + tmpvar_268 = 1.0; + } else { + tmpvar_268 = float((dot (texture2D (u_shadowMap2, tmpvar_269), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_267.z - u_params1.x) / _shadowCoord_267.w))); + }; + result_199 = (result_199 + tmpvar_268); + vec4 tmpvar_271; + tmpvar_271.zw = vec2(0.0, 0.0); + tmpvar_271.xy = (vec2(1.5, 0.5) * tmpvar_200); + vec4 _shadowCoord_272; + _shadowCoord_272 = (v_texcoord3 + tmpvar_271); + float tmpvar_273; + vec2 tmpvar_274; + tmpvar_274 = (_shadowCoord_272.xy / _shadowCoord_272.w); + bool tmpvar_275; + if (any(greaterThan (tmpvar_274, vec2(1.0, 1.0)))) { + tmpvar_275 = bool(1); + } else { + tmpvar_275 = any(lessThan (tmpvar_274, vec2(0.0, 0.0))); + }; + if (tmpvar_275) { + tmpvar_273 = 1.0; + } else { + tmpvar_273 = float((dot (texture2D (u_shadowMap2, tmpvar_274), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_272.z - u_params1.x) / _shadowCoord_272.w))); + }; + result_199 = (result_199 + tmpvar_273); + vec4 tmpvar_276; + tmpvar_276.zw = vec2(0.0, 0.0); + tmpvar_276.xy = (vec2(1.5, 1.5) * tmpvar_200); + vec4 _shadowCoord_277; + _shadowCoord_277 = (v_texcoord3 + tmpvar_276); + float tmpvar_278; + vec2 tmpvar_279; + tmpvar_279 = (_shadowCoord_277.xy / _shadowCoord_277.w); + bool tmpvar_280; + if (any(greaterThan (tmpvar_279, vec2(1.0, 1.0)))) { + tmpvar_280 = bool(1); + } else { + tmpvar_280 = any(lessThan (tmpvar_279, vec2(0.0, 0.0))); + }; + if (tmpvar_280) { + tmpvar_278 = 1.0; + } else { + tmpvar_278 = float((dot (texture2D (u_shadowMap2, tmpvar_279), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_277.z - u_params1.x) / _shadowCoord_277.w))); + }; + float tmpvar_281; + tmpvar_281 = (result_199 + tmpvar_278); + result_199 = tmpvar_281; + visibility_1 = (tmpvar_281 / 16.0); + } else { + vec2 _texcoord_282; + _texcoord_282 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_283; + tmpvar_283 = greaterThan (_texcoord_282, vec2(0.0, 0.0)); + bool tmpvar_284; + if ((tmpvar_283.x && tmpvar_283.y)) { + bvec2 tmpvar_285; + tmpvar_285 = lessThan (_texcoord_282, vec2(1.0, 1.0)); + tmpvar_284 = (tmpvar_285.x && tmpvar_285.y); + } else { + tmpvar_284 = bool(0); + }; + float tmpvar_286; + tmpvar_286 = (float(tmpvar_284) * 0.4); + vec3 tmpvar_287; + tmpvar_287.x = tmpvar_286; + tmpvar_287.y = -(tmpvar_286); + tmpvar_287.z = -(tmpvar_286); + colorCoverage_2 = tmpvar_287; + float result_288; + result_288 = 0.0; + vec2 tmpvar_289; + tmpvar_289 = ((u_smSamplingParams.zw * (u_params2.zz / 4.0)) * v_texcoord4.w); + vec4 tmpvar_290; + tmpvar_290.zw = vec2(0.0, 0.0); + tmpvar_290.xy = (vec2(-1.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_291; + _shadowCoord_291 = (v_texcoord4 + tmpvar_290); + float tmpvar_292; + vec2 tmpvar_293; + tmpvar_293 = (_shadowCoord_291.xy / _shadowCoord_291.w); + bool tmpvar_294; + if (any(greaterThan (tmpvar_293, vec2(1.0, 1.0)))) { + tmpvar_294 = bool(1); + } else { + tmpvar_294 = any(lessThan (tmpvar_293, vec2(0.0, 0.0))); + }; + if (tmpvar_294) { + tmpvar_292 = 1.0; + } else { + tmpvar_292 = float((dot (texture2D (u_shadowMap3, tmpvar_293), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_291.z - u_params1.x) / _shadowCoord_291.w))); + }; + result_288 = tmpvar_292; + vec4 tmpvar_295; + tmpvar_295.zw = vec2(0.0, 0.0); + tmpvar_295.xy = (vec2(-1.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_296; + _shadowCoord_296 = (v_texcoord4 + tmpvar_295); + float tmpvar_297; + vec2 tmpvar_298; + tmpvar_298 = (_shadowCoord_296.xy / _shadowCoord_296.w); + bool tmpvar_299; + if (any(greaterThan (tmpvar_298, vec2(1.0, 1.0)))) { + tmpvar_299 = bool(1); + } else { + tmpvar_299 = any(lessThan (tmpvar_298, vec2(0.0, 0.0))); + }; + if (tmpvar_299) { + tmpvar_297 = 1.0; + } else { + tmpvar_297 = float((dot (texture2D (u_shadowMap3, tmpvar_298), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_296.z - u_params1.x) / _shadowCoord_296.w))); + }; + result_288 = (tmpvar_292 + tmpvar_297); + vec4 tmpvar_300; + tmpvar_300.zw = vec2(0.0, 0.0); + tmpvar_300.xy = (vec2(-1.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_301; + _shadowCoord_301 = (v_texcoord4 + tmpvar_300); + float tmpvar_302; + vec2 tmpvar_303; + tmpvar_303 = (_shadowCoord_301.xy / _shadowCoord_301.w); + bool tmpvar_304; + if (any(greaterThan (tmpvar_303, vec2(1.0, 1.0)))) { + tmpvar_304 = bool(1); + } else { + tmpvar_304 = any(lessThan (tmpvar_303, vec2(0.0, 0.0))); + }; + if (tmpvar_304) { + tmpvar_302 = 1.0; + } else { + tmpvar_302 = float((dot (texture2D (u_shadowMap3, tmpvar_303), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_301.z - u_params1.x) / _shadowCoord_301.w))); + }; + result_288 = (result_288 + tmpvar_302); + vec4 tmpvar_305; + tmpvar_305.zw = vec2(0.0, 0.0); + tmpvar_305.xy = (vec2(-1.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_306; + _shadowCoord_306 = (v_texcoord4 + tmpvar_305); + float tmpvar_307; + vec2 tmpvar_308; + tmpvar_308 = (_shadowCoord_306.xy / _shadowCoord_306.w); + bool tmpvar_309; + if (any(greaterThan (tmpvar_308, vec2(1.0, 1.0)))) { + tmpvar_309 = bool(1); + } else { + tmpvar_309 = any(lessThan (tmpvar_308, vec2(0.0, 0.0))); + }; + if (tmpvar_309) { + tmpvar_307 = 1.0; + } else { + tmpvar_307 = float((dot (texture2D (u_shadowMap3, tmpvar_308), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_306.z - u_params1.x) / _shadowCoord_306.w))); + }; + result_288 = (result_288 + tmpvar_307); + vec4 tmpvar_310; + tmpvar_310.zw = vec2(0.0, 0.0); + tmpvar_310.xy = (vec2(-0.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_311; + _shadowCoord_311 = (v_texcoord4 + tmpvar_310); + float tmpvar_312; + vec2 tmpvar_313; + tmpvar_313 = (_shadowCoord_311.xy / _shadowCoord_311.w); + bool tmpvar_314; + if (any(greaterThan (tmpvar_313, vec2(1.0, 1.0)))) { + tmpvar_314 = bool(1); + } else { + tmpvar_314 = any(lessThan (tmpvar_313, vec2(0.0, 0.0))); + }; + if (tmpvar_314) { + tmpvar_312 = 1.0; + } else { + tmpvar_312 = float((dot (texture2D (u_shadowMap3, tmpvar_313), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_311.z - u_params1.x) / _shadowCoord_311.w))); + }; + result_288 = (result_288 + tmpvar_312); + vec4 tmpvar_315; + tmpvar_315.zw = vec2(0.0, 0.0); + tmpvar_315.xy = (vec2(-0.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_316; + _shadowCoord_316 = (v_texcoord4 + tmpvar_315); + float tmpvar_317; + vec2 tmpvar_318; + tmpvar_318 = (_shadowCoord_316.xy / _shadowCoord_316.w); + bool tmpvar_319; + if (any(greaterThan (tmpvar_318, vec2(1.0, 1.0)))) { + tmpvar_319 = bool(1); + } else { + tmpvar_319 = any(lessThan (tmpvar_318, vec2(0.0, 0.0))); + }; + if (tmpvar_319) { + tmpvar_317 = 1.0; + } else { + tmpvar_317 = float((dot (texture2D (u_shadowMap3, tmpvar_318), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_316.z - u_params1.x) / _shadowCoord_316.w))); + }; + result_288 = (result_288 + tmpvar_317); + vec4 tmpvar_320; + tmpvar_320.zw = vec2(0.0, 0.0); + tmpvar_320.xy = (vec2(-0.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_321; + _shadowCoord_321 = (v_texcoord4 + tmpvar_320); + float tmpvar_322; + vec2 tmpvar_323; + tmpvar_323 = (_shadowCoord_321.xy / _shadowCoord_321.w); + bool tmpvar_324; + if (any(greaterThan (tmpvar_323, vec2(1.0, 1.0)))) { + tmpvar_324 = bool(1); + } else { + tmpvar_324 = any(lessThan (tmpvar_323, vec2(0.0, 0.0))); + }; + if (tmpvar_324) { + tmpvar_322 = 1.0; + } else { + tmpvar_322 = float((dot (texture2D (u_shadowMap3, tmpvar_323), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_321.z - u_params1.x) / _shadowCoord_321.w))); + }; + result_288 = (result_288 + tmpvar_322); + vec4 tmpvar_325; + tmpvar_325.zw = vec2(0.0, 0.0); + tmpvar_325.xy = (vec2(-0.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_326; + _shadowCoord_326 = (v_texcoord4 + tmpvar_325); + float tmpvar_327; + vec2 tmpvar_328; + tmpvar_328 = (_shadowCoord_326.xy / _shadowCoord_326.w); + bool tmpvar_329; + if (any(greaterThan (tmpvar_328, vec2(1.0, 1.0)))) { + tmpvar_329 = bool(1); + } else { + tmpvar_329 = any(lessThan (tmpvar_328, vec2(0.0, 0.0))); + }; + if (tmpvar_329) { + tmpvar_327 = 1.0; + } else { + tmpvar_327 = float((dot (texture2D (u_shadowMap3, tmpvar_328), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_326.z - u_params1.x) / _shadowCoord_326.w))); + }; + result_288 = (result_288 + tmpvar_327); + vec4 tmpvar_330; + tmpvar_330.zw = vec2(0.0, 0.0); + tmpvar_330.xy = (vec2(0.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_331; + _shadowCoord_331 = (v_texcoord4 + tmpvar_330); + float tmpvar_332; + vec2 tmpvar_333; + tmpvar_333 = (_shadowCoord_331.xy / _shadowCoord_331.w); + bool tmpvar_334; + if (any(greaterThan (tmpvar_333, vec2(1.0, 1.0)))) { + tmpvar_334 = bool(1); + } else { + tmpvar_334 = any(lessThan (tmpvar_333, vec2(0.0, 0.0))); + }; + if (tmpvar_334) { + tmpvar_332 = 1.0; + } else { + tmpvar_332 = float((dot (texture2D (u_shadowMap3, tmpvar_333), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_331.z - u_params1.x) / _shadowCoord_331.w))); + }; + result_288 = (result_288 + tmpvar_332); + vec4 tmpvar_335; + tmpvar_335.zw = vec2(0.0, 0.0); + tmpvar_335.xy = (vec2(0.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_336; + _shadowCoord_336 = (v_texcoord4 + tmpvar_335); + float tmpvar_337; + vec2 tmpvar_338; + tmpvar_338 = (_shadowCoord_336.xy / _shadowCoord_336.w); + bool tmpvar_339; + if (any(greaterThan (tmpvar_338, vec2(1.0, 1.0)))) { + tmpvar_339 = bool(1); + } else { + tmpvar_339 = any(lessThan (tmpvar_338, vec2(0.0, 0.0))); + }; + if (tmpvar_339) { + tmpvar_337 = 1.0; + } else { + tmpvar_337 = float((dot (texture2D (u_shadowMap3, tmpvar_338), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_336.z - u_params1.x) / _shadowCoord_336.w))); + }; + result_288 = (result_288 + tmpvar_337); + vec4 tmpvar_340; + tmpvar_340.zw = vec2(0.0, 0.0); + tmpvar_340.xy = (vec2(0.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_341; + _shadowCoord_341 = (v_texcoord4 + tmpvar_340); + float tmpvar_342; + vec2 tmpvar_343; + tmpvar_343 = (_shadowCoord_341.xy / _shadowCoord_341.w); + bool tmpvar_344; + if (any(greaterThan (tmpvar_343, vec2(1.0, 1.0)))) { + tmpvar_344 = bool(1); + } else { + tmpvar_344 = any(lessThan (tmpvar_343, vec2(0.0, 0.0))); + }; + if (tmpvar_344) { + tmpvar_342 = 1.0; + } else { + tmpvar_342 = float((dot (texture2D (u_shadowMap3, tmpvar_343), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_341.z - u_params1.x) / _shadowCoord_341.w))); + }; + result_288 = (result_288 + tmpvar_342); + vec4 tmpvar_345; + tmpvar_345.zw = vec2(0.0, 0.0); + tmpvar_345.xy = (vec2(0.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_346; + _shadowCoord_346 = (v_texcoord4 + tmpvar_345); + float tmpvar_347; + vec2 tmpvar_348; + tmpvar_348 = (_shadowCoord_346.xy / _shadowCoord_346.w); + bool tmpvar_349; + if (any(greaterThan (tmpvar_348, vec2(1.0, 1.0)))) { + tmpvar_349 = bool(1); + } else { + tmpvar_349 = any(lessThan (tmpvar_348, vec2(0.0, 0.0))); + }; + if (tmpvar_349) { + tmpvar_347 = 1.0; + } else { + tmpvar_347 = float((dot (texture2D (u_shadowMap3, tmpvar_348), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_346.z - u_params1.x) / _shadowCoord_346.w))); + }; + result_288 = (result_288 + tmpvar_347); + vec4 tmpvar_350; + tmpvar_350.zw = vec2(0.0, 0.0); + tmpvar_350.xy = (vec2(1.5, -1.5) * tmpvar_289); + vec4 _shadowCoord_351; + _shadowCoord_351 = (v_texcoord4 + tmpvar_350); + float tmpvar_352; + vec2 tmpvar_353; + tmpvar_353 = (_shadowCoord_351.xy / _shadowCoord_351.w); + bool tmpvar_354; + if (any(greaterThan (tmpvar_353, vec2(1.0, 1.0)))) { + tmpvar_354 = bool(1); + } else { + tmpvar_354 = any(lessThan (tmpvar_353, vec2(0.0, 0.0))); + }; + if (tmpvar_354) { + tmpvar_352 = 1.0; + } else { + tmpvar_352 = float((dot (texture2D (u_shadowMap3, tmpvar_353), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_351.z - u_params1.x) / _shadowCoord_351.w))); + }; + result_288 = (result_288 + tmpvar_352); + vec4 tmpvar_355; + tmpvar_355.zw = vec2(0.0, 0.0); + tmpvar_355.xy = (vec2(1.5, -0.5) * tmpvar_289); + vec4 _shadowCoord_356; + _shadowCoord_356 = (v_texcoord4 + tmpvar_355); + float tmpvar_357; + vec2 tmpvar_358; + tmpvar_358 = (_shadowCoord_356.xy / _shadowCoord_356.w); + bool tmpvar_359; + if (any(greaterThan (tmpvar_358, vec2(1.0, 1.0)))) { + tmpvar_359 = bool(1); + } else { + tmpvar_359 = any(lessThan (tmpvar_358, vec2(0.0, 0.0))); + }; + if (tmpvar_359) { + tmpvar_357 = 1.0; + } else { + tmpvar_357 = float((dot (texture2D (u_shadowMap3, tmpvar_358), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_356.z - u_params1.x) / _shadowCoord_356.w))); + }; + result_288 = (result_288 + tmpvar_357); + vec4 tmpvar_360; + tmpvar_360.zw = vec2(0.0, 0.0); + tmpvar_360.xy = (vec2(1.5, 0.5) * tmpvar_289); + vec4 _shadowCoord_361; + _shadowCoord_361 = (v_texcoord4 + tmpvar_360); + float tmpvar_362; + vec2 tmpvar_363; + tmpvar_363 = (_shadowCoord_361.xy / _shadowCoord_361.w); + bool tmpvar_364; + if (any(greaterThan (tmpvar_363, vec2(1.0, 1.0)))) { + tmpvar_364 = bool(1); + } else { + tmpvar_364 = any(lessThan (tmpvar_363, vec2(0.0, 0.0))); + }; + if (tmpvar_364) { + tmpvar_362 = 1.0; + } else { + tmpvar_362 = float((dot (texture2D (u_shadowMap3, tmpvar_363), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_361.z - u_params1.x) / _shadowCoord_361.w))); + }; + result_288 = (result_288 + tmpvar_362); + vec4 tmpvar_365; + tmpvar_365.zw = vec2(0.0, 0.0); + tmpvar_365.xy = (vec2(1.5, 1.5) * tmpvar_289); + vec4 _shadowCoord_366; + _shadowCoord_366 = (v_texcoord4 + tmpvar_365); + float tmpvar_367; + vec2 tmpvar_368; + tmpvar_368 = (_shadowCoord_366.xy / _shadowCoord_366.w); + bool tmpvar_369; + if (any(greaterThan (tmpvar_368, vec2(1.0, 1.0)))) { + tmpvar_369 = bool(1); + } else { + tmpvar_369 = any(lessThan (tmpvar_368, vec2(0.0, 0.0))); + }; + if (tmpvar_369) { + tmpvar_367 = 1.0; + } else { + tmpvar_367 = float((dot (texture2D (u_shadowMap3, tmpvar_368), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_366.z - u_params1.x) / _shadowCoord_366.w))); + }; + float tmpvar_370; + tmpvar_370 = (result_288 + tmpvar_367); + result_288 = tmpvar_370; + visibility_1 = (tmpvar_370 / 16.0); }; }; }; - vec3 tmpvar_76; - tmpvar_76 = -(normalize(v_view)); - vec3 tmpvar_77; - float tmpvar_78; - tmpvar_77 = -(normalize(u_lightPosition.xyz)); - tmpvar_78 = 1.0; + vec3 tmpvar_371; + tmpvar_371 = -(normalize(v_view)); + vec3 tmpvar_372; + float tmpvar_373; + tmpvar_372 = -(normalize(u_lightPosition.xyz)); + tmpvar_373 = 1.0; if ((0.0 != u_lightPosition.w)) { - vec3 tmpvar_79; - tmpvar_79 = (u_lightPosition.xyz - v_view); - vec3 tmpvar_80; - tmpvar_80 = normalize(tmpvar_79); - tmpvar_77 = tmpvar_80; - float tmpvar_81; - tmpvar_81 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); - float tmpvar_82; - tmpvar_82 = sqrt(dot (tmpvar_79, tmpvar_79)); - tmpvar_78 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_82)) + ((u_lightAttenuationSpotOuter.z * tmpvar_82) * tmpvar_82)))) * mix (clamp (((max (0.0, dot (-(tmpvar_80), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_81) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_81)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + vec3 tmpvar_374; + tmpvar_374 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_375; + tmpvar_375 = normalize(tmpvar_374); + tmpvar_372 = tmpvar_375; + float tmpvar_376; + tmpvar_376 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_377; + tmpvar_377 = sqrt(dot (tmpvar_374, tmpvar_374)); + tmpvar_373 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_377)) + ((u_lightAttenuationSpotOuter.z * tmpvar_377) * tmpvar_377)))) * mix (clamp (((max (0.0, dot (-(tmpvar_375), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_376) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_376)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); }; - float tmpvar_83; - tmpvar_83 = dot (v_normal, tmpvar_77); - vec2 tmpvar_84; - tmpvar_84.x = tmpvar_83; - tmpvar_84.y = (((float((tmpvar_83 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_83) * v_normal) - tmpvar_77), tmpvar_76)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); - vec2 tmpvar_85; - tmpvar_85 = (max (tmpvar_84, 0.0) * tmpvar_78); - float tmpvar_86; - tmpvar_86 = sqrt(dot (v_view, v_view)); - gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_85.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_85.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_86) * tmpvar_86)))), 0.0, 1.0)); + float tmpvar_378; + tmpvar_378 = dot (v_normal, tmpvar_372); + vec2 tmpvar_379; + tmpvar_379.x = tmpvar_378; + tmpvar_379.y = (((float((tmpvar_378 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_378) * v_normal) - tmpvar_372), tmpvar_371)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_380; + tmpvar_380 = (max (tmpvar_379, 0.0) * tmpvar_373); + float tmpvar_381; + tmpvar_381 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_380.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_380.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_381) * tmpvar_381)))), 0.0, 1.0)); gl_FragColor.w = 1.0; } diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear.bin index c85ba2e1728c4e596780d56d48593c83d6527684..dc7c30c80df2a8b5765ef80a1cf09e0ed2620fdc 100644 GIT binary patch literal 14497 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 literal 4443 zcmaJ^$!_CD5KV4@zoK)aywGeeS}?GI!3+j72!a@J?gTB_p7G=Yu%Ua`;>J3wQ9>b(f(L2Pt%q2bzQV~ z&E^!z*XrqM-IX6ud|o_M<+A^P;;!i`vgF9vMFAJ8qW;78H~}Q~>e1u!t_tspfSfmV zbBxJ~L5+{7)w%q1_FA+%fG-e^M7-v&Rk`sFQyi-B&6}o$MF$K^#JZ?)+*FTZQB+G2 zjLzQ9gm|i(q8Ib#wQP&$GKVTbN@CG3R*;dyCSiYz8+f2?4flIZo0|K?p-sXKsAY&$ zviwQ7-Qh6sOr^7H-}-Pf^0@Y3@_CL_rw&7^)Ep-*&ONd{nHao7hl}@38gK$Rl;z|Sze^4xU!E;+uuKoQ|AT}C&0_>8*5k%oE zyM)SFHo~8{P=RC4y6n2sY!S0X%r+X4i0G2yG7{(boifrt2^LN*tvGXV%EB!SA3XQ2 zD4tiraOnmv3n_3%x2~SCBW%pXDp9L_i7cTkAF)K2XF@zGZMC&iN6O?t$~x!HWC|RB z?v+Tx3woWU97w<;ey23|*>!6NV45dygY4g zm2<6M>TY2)pOAffBW93E4Tdt6yMmutZikl%5`ZCk%@r&*_7hXIc8o~3K}&RKCx<~n!^|2eon1iVCizg^#o7VVJaj+J_Gn6a|B+CsG z$Habs2AAkehffThPFv-#0}}IVR8Dg%QwT`V*d`vUS-N?t>Jme%U6*FAGt_ya=P~aB z%zP`f1?UWK@Pz&zu&ez`Zs{f|#15RSN880H3h|B}U_lEbGu)csIdef{EiKOs~ z0#c||cxi9NcouNl6R@U4DSW|U1z*_f*otwpE*L({rmWYLa@()l63<=AIQ!nk*tPo5 zT`;bPPmBcK!P6iMXX7Xxmsio0#%dO4(d0hq_P9$sGZ|UEVwHW8l0Er_IOGs?yOBxa13jjT14TGvs^#d`8PcNzR=5*`|yq0 zh!B^=23^fC;KZ}nx`tUrV~1b0sx4!A8*V4)DcV&zRTIh~#h@MHbd6^z7B5X5Gs3)z zF!*Fhn$bTQa`+2)L#<}b*dqHJqv$!0uIr%Ou40&&hRHaU8O09_CLXCX(UO!lA?L-! R(eTjP09<}O{5(7R<$o#&T$lg= diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin index 881bf86a3..5e16ee5ba 100644 --- a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin +++ b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_csm.bin @@ -2,7 +2,6 @@ FSHF uniform sampler2D u_shadowMap2; uniform sampler2D u_shadowMap1; uniform sampler2D u_shadowMap0; -uniform vec4 u_csmFarDistances; uniform vec4 u_smSamplingParams; uniform vec4 u_lightAttenuationSpotOuter; uniform vec4 u_lightSpotDirectionInner; @@ -21,300 +20,1484 @@ varying vec4 v_texcoord4; varying vec4 v_texcoord3; varying vec4 v_texcoord2; varying vec4 v_texcoord1; -varying vec4 v_position; varying vec3 v_normal; void main () { float visibility_1; vec3 colorCoverage_2; vec2 tmpvar_3; - tmpvar_3 = u_params2.zz; - visibility_1 = 1.0; - if ((v_position.z < u_csmFarDistances.x)) { - vec2 tmpvar_4; - tmpvar_4 = (v_texcoord1.xy / v_texcoord1.w); - float tmpvar_5; - tmpvar_5 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_4, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_4, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_6; - tmpvar_6.x = -(tmpvar_5); - tmpvar_6.y = tmpvar_5; - tmpvar_6.z = -(tmpvar_5); - colorCoverage_2 = tmpvar_6; - vec4 tmpvar_7; - tmpvar_7.w = 1.0; - tmpvar_7.xy = (v_texcoord1.xy / v_texcoord1.w); - tmpvar_7.z = v_texcoord1.z; - vec4 tmpvar_8; - tmpvar_8.xy = u_smSamplingParams.xy; - tmpvar_8.zw = (u_smSamplingParams.zw / v_texcoord1.w); - vec4 _shadowCoord_9; - _shadowCoord_9 = tmpvar_7; - float _bias_10; - _bias_10 = u_params1.x; - vec4 _pcfParams_11; - _pcfParams_11 = tmpvar_8; - vec2 _texelSize_12; - _texelSize_12 = tmpvar_3; - int x_13; - int ynum_14; - int xnum_15; - float result_16; - vec2 tmpvar_17; - tmpvar_17 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_18; - tmpvar_18 = (tmpvar_17.x * tmpvar_17.y); - result_16 = 0.0; - int tmpvar_19; - tmpvar_19 = int(u_smSamplingParams.x); - xnum_15 = tmpvar_19; - ynum_14 = int(u_smSamplingParams.y); - x_13 = -(tmpvar_19); - while (true) { - int y_20; - if ((x_13 > xnum_15)) { - break; - }; - y_20 = -(ynum_14); - while (true) { - if ((y_20 > ynum_14)) { - break; - }; - vec2 tmpvar_21; - tmpvar_21.x = float(x_13); - tmpvar_21.y = float(y_20); - vec4 tmpvar_22; - tmpvar_22.zw = vec2(0.0, 0.0); - tmpvar_22.xy = ((tmpvar_21 * _pcfParams_11.zw) * _texelSize_12); - vec4 tmpvar_23; - tmpvar_23 = (_shadowCoord_9 + tmpvar_22); - result_16 = (result_16 + float((dot (texture2D (u_shadowMap0, (tmpvar_23.xy / tmpvar_23.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_23.z - _bias_10) / tmpvar_23.w)))); - y_20 = (y_20 + 1); - }; - x_13 = (x_13 + 1); - }; - visibility_1 = (result_16 / max (tmpvar_18, 1.0)); + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); } else { - if ((v_position.z < u_csmFarDistances.y)) { - vec2 tmpvar_24; - tmpvar_24 = (v_texcoord2.xy / v_texcoord2.w); - float tmpvar_25; - tmpvar_25 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_24, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_24, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_26; - tmpvar_26.x = tmpvar_25; - tmpvar_26.y = tmpvar_25; - tmpvar_26.z = -(tmpvar_25); - colorCoverage_2 = tmpvar_26; - vec4 tmpvar_27; - tmpvar_27.w = 1.0; - tmpvar_27.xy = (v_texcoord2.xy / v_texcoord2.w); - tmpvar_27.z = v_texcoord2.z; - vec4 tmpvar_28; - tmpvar_28.xy = u_smSamplingParams.xy; - tmpvar_28.zw = (u_smSamplingParams.zw / v_texcoord2.w); - vec4 _shadowCoord_29; - _shadowCoord_29 = tmpvar_27; - float _bias_30; - _bias_30 = u_params1.x; - vec4 _pcfParams_31; - _pcfParams_31 = tmpvar_28; - vec2 _texelSize_32; - _texelSize_32 = (u_params2.zz / 2.0); - int x_33; - int ynum_34; - int xnum_35; - float result_36; - vec2 tmpvar_37; - tmpvar_37 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_38; - tmpvar_38 = (tmpvar_37.x * tmpvar_37.y); - result_36 = 0.0; - int tmpvar_39; - tmpvar_39 = int(u_smSamplingParams.x); - xnum_35 = tmpvar_39; - ynum_34 = int(u_smSamplingParams.y); - x_33 = -(tmpvar_39); - while (true) { - int y_40; - if ((x_33 > xnum_35)) { - break; - }; - y_40 = -(ynum_34); - while (true) { - if ((y_40 > ynum_34)) { - break; - }; - vec2 tmpvar_41; - tmpvar_41.x = float(x_33); - tmpvar_41.y = float(y_40); - vec4 tmpvar_42; - tmpvar_42.zw = vec2(0.0, 0.0); - tmpvar_42.xy = ((tmpvar_41 * _pcfParams_31.zw) * _texelSize_32); - vec4 tmpvar_43; - tmpvar_43 = (_shadowCoord_29 + tmpvar_42); - result_36 = (result_36 + float((dot (texture2D (u_shadowMap1, (tmpvar_43.xy / tmpvar_43.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_43.z - _bias_30) / tmpvar_43.w)))); - y_40 = (y_40 + 1); - }; - x_33 = (x_33 + 1); - }; - visibility_1 = (result_36 / max (tmpvar_38, 1.0)); + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); } else { - if ((v_position.z < u_csmFarDistances.z)) { - vec2 tmpvar_44; - tmpvar_44 = (v_texcoord3.xy / v_texcoord3.w); - float tmpvar_45; - tmpvar_45 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_44, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_44, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_46; - tmpvar_46.x = -(tmpvar_45); - tmpvar_46.y = -(tmpvar_45); - tmpvar_46.z = tmpvar_45; - colorCoverage_2 = tmpvar_46; - vec4 tmpvar_47; - tmpvar_47.w = 1.0; - tmpvar_47.xy = (v_texcoord3.xy / v_texcoord3.w); - tmpvar_47.z = v_texcoord3.z; - vec4 tmpvar_48; - tmpvar_48.xy = u_smSamplingParams.xy; - tmpvar_48.zw = (u_smSamplingParams.zw / v_texcoord3.w); - vec4 _shadowCoord_49; - _shadowCoord_49 = tmpvar_47; - float _bias_50; - _bias_50 = u_params1.x; - vec4 _pcfParams_51; - _pcfParams_51 = tmpvar_48; - vec2 _texelSize_52; - _texelSize_52 = (u_params2.zz / 3.0); - int x_53; - int ynum_54; - int xnum_55; - float result_56; - vec2 tmpvar_57; - tmpvar_57 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_58; - tmpvar_58 = (tmpvar_57.x * tmpvar_57.y); - result_56 = 0.0; - int tmpvar_59; - tmpvar_59 = int(u_smSamplingParams.x); - xnum_55 = tmpvar_59; - ynum_54 = int(u_smSamplingParams.y); - x_53 = -(tmpvar_59); - while (true) { - int y_60; - if ((x_53 > xnum_55)) { - break; - }; - y_60 = -(ynum_54); - while (true) { - if ((y_60 > ynum_54)) { - break; - }; - vec2 tmpvar_61; - tmpvar_61.x = float(x_53); - tmpvar_61.y = float(y_60); - vec4 tmpvar_62; - tmpvar_62.zw = vec2(0.0, 0.0); - tmpvar_62.xy = ((tmpvar_61 * _pcfParams_51.zw) * _texelSize_52); - vec4 tmpvar_63; - tmpvar_63 = (_shadowCoord_49 + tmpvar_62); - result_56 = (result_56 + float((dot (texture2D (u_shadowMap2, (tmpvar_63.xy / tmpvar_63.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_63.z - _bias_50) / tmpvar_63.w)))); - y_60 = (y_60 + 1); - }; - x_53 = (x_53 + 1); - }; - visibility_1 = (result_56 / max (tmpvar_58, 1.0)); + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + vec4 tmpvar_21; + tmpvar_21.w = 1.0; + tmpvar_21.xy = (v_texcoord1.xy / v_texcoord1.w); + tmpvar_21.z = v_texcoord1.z; + float result_22; + result_22 = 0.0; + vec2 tmpvar_23; + tmpvar_23 = (u_smSamplingParams.zw * u_params2.zz); + vec4 tmpvar_24; + tmpvar_24.zw = vec2(0.0, 0.0); + tmpvar_24.xy = (vec2(-1.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_25; + _shadowCoord_25 = (tmpvar_21 + tmpvar_24); + float tmpvar_26; + vec2 tmpvar_27; + tmpvar_27 = (_shadowCoord_25.xy / _shadowCoord_25.w); + bool tmpvar_28; + if (any(greaterThan (tmpvar_27, vec2(1.0, 1.0)))) { + tmpvar_28 = bool(1); + } else { + tmpvar_28 = any(lessThan (tmpvar_27, vec2(0.0, 0.0))); + }; + if (tmpvar_28) { + tmpvar_26 = 1.0; + } else { + tmpvar_26 = float((dot (texture2D (u_shadowMap0, tmpvar_27), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_25.z - u_params1.x) / _shadowCoord_25.w))); + }; + result_22 = tmpvar_26; + vec4 tmpvar_29; + tmpvar_29.zw = vec2(0.0, 0.0); + tmpvar_29.xy = (vec2(-1.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_30; + _shadowCoord_30 = (tmpvar_21 + tmpvar_29); + float tmpvar_31; + vec2 tmpvar_32; + tmpvar_32 = (_shadowCoord_30.xy / _shadowCoord_30.w); + bool tmpvar_33; + if (any(greaterThan (tmpvar_32, vec2(1.0, 1.0)))) { + tmpvar_33 = bool(1); + } else { + tmpvar_33 = any(lessThan (tmpvar_32, vec2(0.0, 0.0))); + }; + if (tmpvar_33) { + tmpvar_31 = 1.0; + } else { + tmpvar_31 = float((dot (texture2D (u_shadowMap0, tmpvar_32), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_30.z - u_params1.x) / _shadowCoord_30.w))); + }; + result_22 = (tmpvar_26 + tmpvar_31); + vec4 tmpvar_34; + tmpvar_34.zw = vec2(0.0, 0.0); + tmpvar_34.xy = (vec2(-1.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_35; + _shadowCoord_35 = (tmpvar_21 + tmpvar_34); + float tmpvar_36; + vec2 tmpvar_37; + tmpvar_37 = (_shadowCoord_35.xy / _shadowCoord_35.w); + bool tmpvar_38; + if (any(greaterThan (tmpvar_37, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_37, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_36 = 1.0; + } else { + tmpvar_36 = float((dot (texture2D (u_shadowMap0, tmpvar_37), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_35.z - u_params1.x) / _shadowCoord_35.w))); + }; + result_22 = (result_22 + tmpvar_36); + vec4 tmpvar_39; + tmpvar_39.zw = vec2(0.0, 0.0); + tmpvar_39.xy = (vec2(-1.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_40; + _shadowCoord_40 = (tmpvar_21 + tmpvar_39); + float tmpvar_41; + vec2 tmpvar_42; + tmpvar_42 = (_shadowCoord_40.xy / _shadowCoord_40.w); + bool tmpvar_43; + if (any(greaterThan (tmpvar_42, vec2(1.0, 1.0)))) { + tmpvar_43 = bool(1); + } else { + tmpvar_43 = any(lessThan (tmpvar_42, vec2(0.0, 0.0))); + }; + if (tmpvar_43) { + tmpvar_41 = 1.0; + } else { + tmpvar_41 = float((dot (texture2D (u_shadowMap0, tmpvar_42), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_40.z - u_params1.x) / _shadowCoord_40.w))); + }; + result_22 = (result_22 + tmpvar_41); + vec4 tmpvar_44; + tmpvar_44.zw = vec2(0.0, 0.0); + tmpvar_44.xy = (vec2(-0.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_45; + _shadowCoord_45 = (tmpvar_21 + tmpvar_44); + float tmpvar_46; + vec2 tmpvar_47; + tmpvar_47 = (_shadowCoord_45.xy / _shadowCoord_45.w); + bool tmpvar_48; + if (any(greaterThan (tmpvar_47, vec2(1.0, 1.0)))) { + tmpvar_48 = bool(1); + } else { + tmpvar_48 = any(lessThan (tmpvar_47, vec2(0.0, 0.0))); + }; + if (tmpvar_48) { + tmpvar_46 = 1.0; + } else { + tmpvar_46 = float((dot (texture2D (u_shadowMap0, tmpvar_47), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_45.z - u_params1.x) / _shadowCoord_45.w))); + }; + result_22 = (result_22 + tmpvar_46); + vec4 tmpvar_49; + tmpvar_49.zw = vec2(0.0, 0.0); + tmpvar_49.xy = (vec2(-0.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_50; + _shadowCoord_50 = (tmpvar_21 + tmpvar_49); + float tmpvar_51; + vec2 tmpvar_52; + tmpvar_52 = (_shadowCoord_50.xy / _shadowCoord_50.w); + bool tmpvar_53; + if (any(greaterThan (tmpvar_52, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_52, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_51 = 1.0; + } else { + tmpvar_51 = float((dot (texture2D (u_shadowMap0, tmpvar_52), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_50.z - u_params1.x) / _shadowCoord_50.w))); + }; + result_22 = (result_22 + tmpvar_51); + vec4 tmpvar_54; + tmpvar_54.zw = vec2(0.0, 0.0); + tmpvar_54.xy = (vec2(-0.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_55; + _shadowCoord_55 = (tmpvar_21 + tmpvar_54); + float tmpvar_56; + vec2 tmpvar_57; + tmpvar_57 = (_shadowCoord_55.xy / _shadowCoord_55.w); + bool tmpvar_58; + if (any(greaterThan (tmpvar_57, vec2(1.0, 1.0)))) { + tmpvar_58 = bool(1); + } else { + tmpvar_58 = any(lessThan (tmpvar_57, vec2(0.0, 0.0))); + }; + if (tmpvar_58) { + tmpvar_56 = 1.0; + } else { + tmpvar_56 = float((dot (texture2D (u_shadowMap0, tmpvar_57), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_55.z - u_params1.x) / _shadowCoord_55.w))); + }; + result_22 = (result_22 + tmpvar_56); + vec4 tmpvar_59; + tmpvar_59.zw = vec2(0.0, 0.0); + tmpvar_59.xy = (vec2(-0.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_60; + _shadowCoord_60 = (tmpvar_21 + tmpvar_59); + float tmpvar_61; + vec2 tmpvar_62; + tmpvar_62 = (_shadowCoord_60.xy / _shadowCoord_60.w); + bool tmpvar_63; + if (any(greaterThan (tmpvar_62, vec2(1.0, 1.0)))) { + tmpvar_63 = bool(1); + } else { + tmpvar_63 = any(lessThan (tmpvar_62, vec2(0.0, 0.0))); + }; + if (tmpvar_63) { + tmpvar_61 = 1.0; + } else { + tmpvar_61 = float((dot (texture2D (u_shadowMap0, tmpvar_62), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_60.z - u_params1.x) / _shadowCoord_60.w))); + }; + result_22 = (result_22 + tmpvar_61); + vec4 tmpvar_64; + tmpvar_64.zw = vec2(0.0, 0.0); + tmpvar_64.xy = (vec2(0.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_65; + _shadowCoord_65 = (tmpvar_21 + tmpvar_64); + float tmpvar_66; + vec2 tmpvar_67; + tmpvar_67 = (_shadowCoord_65.xy / _shadowCoord_65.w); + bool tmpvar_68; + if (any(greaterThan (tmpvar_67, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_67, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_66 = 1.0; + } else { + tmpvar_66 = float((dot (texture2D (u_shadowMap0, tmpvar_67), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_65.z - u_params1.x) / _shadowCoord_65.w))); + }; + result_22 = (result_22 + tmpvar_66); + vec4 tmpvar_69; + tmpvar_69.zw = vec2(0.0, 0.0); + tmpvar_69.xy = (vec2(0.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_70; + _shadowCoord_70 = (tmpvar_21 + tmpvar_69); + float tmpvar_71; + vec2 tmpvar_72; + tmpvar_72 = (_shadowCoord_70.xy / _shadowCoord_70.w); + bool tmpvar_73; + if (any(greaterThan (tmpvar_72, vec2(1.0, 1.0)))) { + tmpvar_73 = bool(1); + } else { + tmpvar_73 = any(lessThan (tmpvar_72, vec2(0.0, 0.0))); + }; + if (tmpvar_73) { + tmpvar_71 = 1.0; + } else { + tmpvar_71 = float((dot (texture2D (u_shadowMap0, tmpvar_72), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_70.z - u_params1.x) / _shadowCoord_70.w))); + }; + result_22 = (result_22 + tmpvar_71); + vec4 tmpvar_74; + tmpvar_74.zw = vec2(0.0, 0.0); + tmpvar_74.xy = (vec2(0.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_75; + _shadowCoord_75 = (tmpvar_21 + tmpvar_74); + float tmpvar_76; + vec2 tmpvar_77; + tmpvar_77 = (_shadowCoord_75.xy / _shadowCoord_75.w); + bool tmpvar_78; + if (any(greaterThan (tmpvar_77, vec2(1.0, 1.0)))) { + tmpvar_78 = bool(1); + } else { + tmpvar_78 = any(lessThan (tmpvar_77, vec2(0.0, 0.0))); + }; + if (tmpvar_78) { + tmpvar_76 = 1.0; + } else { + tmpvar_76 = float((dot (texture2D (u_shadowMap0, tmpvar_77), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_75.z - u_params1.x) / _shadowCoord_75.w))); + }; + result_22 = (result_22 + tmpvar_76); + vec4 tmpvar_79; + tmpvar_79.zw = vec2(0.0, 0.0); + tmpvar_79.xy = (vec2(0.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_80; + _shadowCoord_80 = (tmpvar_21 + tmpvar_79); + float tmpvar_81; + vec2 tmpvar_82; + tmpvar_82 = (_shadowCoord_80.xy / _shadowCoord_80.w); + bool tmpvar_83; + if (any(greaterThan (tmpvar_82, vec2(1.0, 1.0)))) { + tmpvar_83 = bool(1); + } else { + tmpvar_83 = any(lessThan (tmpvar_82, vec2(0.0, 0.0))); + }; + if (tmpvar_83) { + tmpvar_81 = 1.0; + } else { + tmpvar_81 = float((dot (texture2D (u_shadowMap0, tmpvar_82), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_80.z - u_params1.x) / _shadowCoord_80.w))); + }; + result_22 = (result_22 + tmpvar_81); + vec4 tmpvar_84; + tmpvar_84.zw = vec2(0.0, 0.0); + tmpvar_84.xy = (vec2(1.5, -1.5) * tmpvar_23); + vec4 _shadowCoord_85; + _shadowCoord_85 = (tmpvar_21 + tmpvar_84); + float tmpvar_86; + vec2 tmpvar_87; + tmpvar_87 = (_shadowCoord_85.xy / _shadowCoord_85.w); + bool tmpvar_88; + if (any(greaterThan (tmpvar_87, vec2(1.0, 1.0)))) { + tmpvar_88 = bool(1); + } else { + tmpvar_88 = any(lessThan (tmpvar_87, vec2(0.0, 0.0))); + }; + if (tmpvar_88) { + tmpvar_86 = 1.0; + } else { + tmpvar_86 = float((dot (texture2D (u_shadowMap0, tmpvar_87), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_85.z - u_params1.x) / _shadowCoord_85.w))); + }; + result_22 = (result_22 + tmpvar_86); + vec4 tmpvar_89; + tmpvar_89.zw = vec2(0.0, 0.0); + tmpvar_89.xy = (vec2(1.5, -0.5) * tmpvar_23); + vec4 _shadowCoord_90; + _shadowCoord_90 = (tmpvar_21 + tmpvar_89); + float tmpvar_91; + vec2 tmpvar_92; + tmpvar_92 = (_shadowCoord_90.xy / _shadowCoord_90.w); + bool tmpvar_93; + if (any(greaterThan (tmpvar_92, vec2(1.0, 1.0)))) { + tmpvar_93 = bool(1); + } else { + tmpvar_93 = any(lessThan (tmpvar_92, vec2(0.0, 0.0))); + }; + if (tmpvar_93) { + tmpvar_91 = 1.0; + } else { + tmpvar_91 = float((dot (texture2D (u_shadowMap0, tmpvar_92), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_90.z - u_params1.x) / _shadowCoord_90.w))); + }; + result_22 = (result_22 + tmpvar_91); + vec4 tmpvar_94; + tmpvar_94.zw = vec2(0.0, 0.0); + tmpvar_94.xy = (vec2(1.5, 0.5) * tmpvar_23); + vec4 _shadowCoord_95; + _shadowCoord_95 = (tmpvar_21 + tmpvar_94); + float tmpvar_96; + vec2 tmpvar_97; + tmpvar_97 = (_shadowCoord_95.xy / _shadowCoord_95.w); + bool tmpvar_98; + if (any(greaterThan (tmpvar_97, vec2(1.0, 1.0)))) { + tmpvar_98 = bool(1); + } else { + tmpvar_98 = any(lessThan (tmpvar_97, vec2(0.0, 0.0))); + }; + if (tmpvar_98) { + tmpvar_96 = 1.0; + } else { + tmpvar_96 = float((dot (texture2D (u_shadowMap0, tmpvar_97), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_95.z - u_params1.x) / _shadowCoord_95.w))); + }; + result_22 = (result_22 + tmpvar_96); + vec4 tmpvar_99; + tmpvar_99.zw = vec2(0.0, 0.0); + tmpvar_99.xy = (vec2(1.5, 1.5) * tmpvar_23); + vec4 _shadowCoord_100; + _shadowCoord_100 = (tmpvar_21 + tmpvar_99); + float tmpvar_101; + vec2 tmpvar_102; + tmpvar_102 = (_shadowCoord_100.xy / _shadowCoord_100.w); + bool tmpvar_103; + if (any(greaterThan (tmpvar_102, vec2(1.0, 1.0)))) { + tmpvar_103 = bool(1); + } else { + tmpvar_103 = any(lessThan (tmpvar_102, vec2(0.0, 0.0))); + }; + if (tmpvar_103) { + tmpvar_101 = 1.0; + } else { + tmpvar_101 = float((dot (texture2D (u_shadowMap0, tmpvar_102), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_100.z - u_params1.x) / _shadowCoord_100.w))); + }; + float tmpvar_104; + tmpvar_104 = (result_22 + tmpvar_101); + result_22 = tmpvar_104; + visibility_1 = (tmpvar_104 / 16.0); + } else { + if (tmpvar_10) { + vec2 _texcoord_105; + _texcoord_105 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_106; + tmpvar_106 = greaterThan (_texcoord_105, vec2(0.0, 0.0)); + bool tmpvar_107; + if ((tmpvar_106.x && tmpvar_106.y)) { + bvec2 tmpvar_108; + tmpvar_108 = lessThan (_texcoord_105, vec2(1.0, 1.0)); + tmpvar_107 = (tmpvar_108.x && tmpvar_108.y); } else { - vec2 tmpvar_64; - tmpvar_64 = (v_texcoord4.xy / v_texcoord4.w); - float tmpvar_65; - tmpvar_65 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_64, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_64, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_66; - tmpvar_66.x = tmpvar_65; - tmpvar_66.y = -(tmpvar_65); - tmpvar_66.z = -(tmpvar_65); - colorCoverage_2 = tmpvar_66; - vec4 tmpvar_67; - tmpvar_67.w = 1.0; - tmpvar_67.xy = (v_texcoord4.xy / v_texcoord4.w); - tmpvar_67.z = v_texcoord4.z; - vec4 tmpvar_68; - tmpvar_68.xy = u_smSamplingParams.xy; - tmpvar_68.zw = (u_smSamplingParams.zw / v_texcoord4.w); - vec4 _shadowCoord_69; - _shadowCoord_69 = tmpvar_67; - float _bias_70; - _bias_70 = u_params1.x; - vec4 _pcfParams_71; - _pcfParams_71 = tmpvar_68; - vec2 _texelSize_72; - _texelSize_72 = (u_params2.zz / 4.0); - int x_73; - int ynum_74; - int xnum_75; - float result_76; - vec2 tmpvar_77; - tmpvar_77 = ((u_smSamplingParams.xy * 2.0) + 1.0); - float tmpvar_78; - tmpvar_78 = (tmpvar_77.x * tmpvar_77.y); - result_76 = 0.0; - int tmpvar_79; - tmpvar_79 = int(u_smSamplingParams.x); - xnum_75 = tmpvar_79; - ynum_74 = int(u_smSamplingParams.y); - x_73 = -(tmpvar_79); - while (true) { - int y_80; - if ((x_73 > xnum_75)) { - break; - }; - y_80 = -(ynum_74); - while (true) { - if ((y_80 > ynum_74)) { - break; - }; - vec2 tmpvar_81; - tmpvar_81.x = float(x_73); - tmpvar_81.y = float(y_80); - vec4 tmpvar_82; - tmpvar_82.zw = vec2(0.0, 0.0); - tmpvar_82.xy = ((tmpvar_81 * _pcfParams_71.zw) * _texelSize_72); - vec4 tmpvar_83; - tmpvar_83 = (_shadowCoord_69 + tmpvar_82); - result_76 = (result_76 + float((dot (texture2D (u_shadowMap3, (tmpvar_83.xy / tmpvar_83.w)), vec4(5.96046e-08, 1.52588e-05, 0.00390625, 1.0)) >= ((tmpvar_83.z - _bias_70) / tmpvar_83.w)))); - y_80 = (y_80 + 1); - }; - x_73 = (x_73 + 1); + tmpvar_107 = bool(0); + }; + float tmpvar_109; + tmpvar_109 = (float(tmpvar_107) * 0.4); + vec3 tmpvar_110; + tmpvar_110.x = tmpvar_109; + tmpvar_110.y = tmpvar_109; + tmpvar_110.z = -(tmpvar_109); + colorCoverage_2 = tmpvar_110; + vec4 tmpvar_111; + tmpvar_111.w = 1.0; + tmpvar_111.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_111.z = v_texcoord2.z; + float result_112; + result_112 = 0.0; + vec2 tmpvar_113; + tmpvar_113 = (u_smSamplingParams.zw * (u_params2.zz / 2.0)); + vec4 tmpvar_114; + tmpvar_114.zw = vec2(0.0, 0.0); + tmpvar_114.xy = (vec2(-1.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_115; + _shadowCoord_115 = (tmpvar_111 + tmpvar_114); + float tmpvar_116; + vec2 tmpvar_117; + tmpvar_117 = (_shadowCoord_115.xy / _shadowCoord_115.w); + bool tmpvar_118; + if (any(greaterThan (tmpvar_117, vec2(1.0, 1.0)))) { + tmpvar_118 = bool(1); + } else { + tmpvar_118 = any(lessThan (tmpvar_117, vec2(0.0, 0.0))); + }; + if (tmpvar_118) { + tmpvar_116 = 1.0; + } else { + tmpvar_116 = float((dot (texture2D (u_shadowMap1, tmpvar_117), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_115.z - u_params1.x) / _shadowCoord_115.w))); + }; + result_112 = tmpvar_116; + vec4 tmpvar_119; + tmpvar_119.zw = vec2(0.0, 0.0); + tmpvar_119.xy = (vec2(-1.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_120; + _shadowCoord_120 = (tmpvar_111 + tmpvar_119); + float tmpvar_121; + vec2 tmpvar_122; + tmpvar_122 = (_shadowCoord_120.xy / _shadowCoord_120.w); + bool tmpvar_123; + if (any(greaterThan (tmpvar_122, vec2(1.0, 1.0)))) { + tmpvar_123 = bool(1); + } else { + tmpvar_123 = any(lessThan (tmpvar_122, vec2(0.0, 0.0))); + }; + if (tmpvar_123) { + tmpvar_121 = 1.0; + } else { + tmpvar_121 = float((dot (texture2D (u_shadowMap1, tmpvar_122), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_120.z - u_params1.x) / _shadowCoord_120.w))); + }; + result_112 = (tmpvar_116 + tmpvar_121); + vec4 tmpvar_124; + tmpvar_124.zw = vec2(0.0, 0.0); + tmpvar_124.xy = (vec2(-1.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_125; + _shadowCoord_125 = (tmpvar_111 + tmpvar_124); + float tmpvar_126; + vec2 tmpvar_127; + tmpvar_127 = (_shadowCoord_125.xy / _shadowCoord_125.w); + bool tmpvar_128; + if (any(greaterThan (tmpvar_127, vec2(1.0, 1.0)))) { + tmpvar_128 = bool(1); + } else { + tmpvar_128 = any(lessThan (tmpvar_127, vec2(0.0, 0.0))); + }; + if (tmpvar_128) { + tmpvar_126 = 1.0; + } else { + tmpvar_126 = float((dot (texture2D (u_shadowMap1, tmpvar_127), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_125.z - u_params1.x) / _shadowCoord_125.w))); + }; + result_112 = (result_112 + tmpvar_126); + vec4 tmpvar_129; + tmpvar_129.zw = vec2(0.0, 0.0); + tmpvar_129.xy = (vec2(-1.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_130; + _shadowCoord_130 = (tmpvar_111 + tmpvar_129); + float tmpvar_131; + vec2 tmpvar_132; + tmpvar_132 = (_shadowCoord_130.xy / _shadowCoord_130.w); + bool tmpvar_133; + if (any(greaterThan (tmpvar_132, vec2(1.0, 1.0)))) { + tmpvar_133 = bool(1); + } else { + tmpvar_133 = any(lessThan (tmpvar_132, vec2(0.0, 0.0))); + }; + if (tmpvar_133) { + tmpvar_131 = 1.0; + } else { + tmpvar_131 = float((dot (texture2D (u_shadowMap1, tmpvar_132), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_130.z - u_params1.x) / _shadowCoord_130.w))); + }; + result_112 = (result_112 + tmpvar_131); + vec4 tmpvar_134; + tmpvar_134.zw = vec2(0.0, 0.0); + tmpvar_134.xy = (vec2(-0.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_135; + _shadowCoord_135 = (tmpvar_111 + tmpvar_134); + float tmpvar_136; + vec2 tmpvar_137; + tmpvar_137 = (_shadowCoord_135.xy / _shadowCoord_135.w); + bool tmpvar_138; + if (any(greaterThan (tmpvar_137, vec2(1.0, 1.0)))) { + tmpvar_138 = bool(1); + } else { + tmpvar_138 = any(lessThan (tmpvar_137, vec2(0.0, 0.0))); + }; + if (tmpvar_138) { + tmpvar_136 = 1.0; + } else { + tmpvar_136 = float((dot (texture2D (u_shadowMap1, tmpvar_137), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_135.z - u_params1.x) / _shadowCoord_135.w))); + }; + result_112 = (result_112 + tmpvar_136); + vec4 tmpvar_139; + tmpvar_139.zw = vec2(0.0, 0.0); + tmpvar_139.xy = (vec2(-0.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_140; + _shadowCoord_140 = (tmpvar_111 + tmpvar_139); + float tmpvar_141; + vec2 tmpvar_142; + tmpvar_142 = (_shadowCoord_140.xy / _shadowCoord_140.w); + bool tmpvar_143; + if (any(greaterThan (tmpvar_142, vec2(1.0, 1.0)))) { + tmpvar_143 = bool(1); + } else { + tmpvar_143 = any(lessThan (tmpvar_142, vec2(0.0, 0.0))); + }; + if (tmpvar_143) { + tmpvar_141 = 1.0; + } else { + tmpvar_141 = float((dot (texture2D (u_shadowMap1, tmpvar_142), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_140.z - u_params1.x) / _shadowCoord_140.w))); + }; + result_112 = (result_112 + tmpvar_141); + vec4 tmpvar_144; + tmpvar_144.zw = vec2(0.0, 0.0); + tmpvar_144.xy = (vec2(-0.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_145; + _shadowCoord_145 = (tmpvar_111 + tmpvar_144); + float tmpvar_146; + vec2 tmpvar_147; + tmpvar_147 = (_shadowCoord_145.xy / _shadowCoord_145.w); + bool tmpvar_148; + if (any(greaterThan (tmpvar_147, vec2(1.0, 1.0)))) { + tmpvar_148 = bool(1); + } else { + tmpvar_148 = any(lessThan (tmpvar_147, vec2(0.0, 0.0))); + }; + if (tmpvar_148) { + tmpvar_146 = 1.0; + } else { + tmpvar_146 = float((dot (texture2D (u_shadowMap1, tmpvar_147), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_145.z - u_params1.x) / _shadowCoord_145.w))); + }; + result_112 = (result_112 + tmpvar_146); + vec4 tmpvar_149; + tmpvar_149.zw = vec2(0.0, 0.0); + tmpvar_149.xy = (vec2(-0.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_150; + _shadowCoord_150 = (tmpvar_111 + tmpvar_149); + float tmpvar_151; + vec2 tmpvar_152; + tmpvar_152 = (_shadowCoord_150.xy / _shadowCoord_150.w); + bool tmpvar_153; + if (any(greaterThan (tmpvar_152, vec2(1.0, 1.0)))) { + tmpvar_153 = bool(1); + } else { + tmpvar_153 = any(lessThan (tmpvar_152, vec2(0.0, 0.0))); + }; + if (tmpvar_153) { + tmpvar_151 = 1.0; + } else { + tmpvar_151 = float((dot (texture2D (u_shadowMap1, tmpvar_152), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_150.z - u_params1.x) / _shadowCoord_150.w))); + }; + result_112 = (result_112 + tmpvar_151); + vec4 tmpvar_154; + tmpvar_154.zw = vec2(0.0, 0.0); + tmpvar_154.xy = (vec2(0.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_155; + _shadowCoord_155 = (tmpvar_111 + tmpvar_154); + float tmpvar_156; + vec2 tmpvar_157; + tmpvar_157 = (_shadowCoord_155.xy / _shadowCoord_155.w); + bool tmpvar_158; + if (any(greaterThan (tmpvar_157, vec2(1.0, 1.0)))) { + tmpvar_158 = bool(1); + } else { + tmpvar_158 = any(lessThan (tmpvar_157, vec2(0.0, 0.0))); + }; + if (tmpvar_158) { + tmpvar_156 = 1.0; + } else { + tmpvar_156 = float((dot (texture2D (u_shadowMap1, tmpvar_157), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_155.z - u_params1.x) / _shadowCoord_155.w))); + }; + result_112 = (result_112 + tmpvar_156); + vec4 tmpvar_159; + tmpvar_159.zw = vec2(0.0, 0.0); + tmpvar_159.xy = (vec2(0.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_160; + _shadowCoord_160 = (tmpvar_111 + tmpvar_159); + float tmpvar_161; + vec2 tmpvar_162; + tmpvar_162 = (_shadowCoord_160.xy / _shadowCoord_160.w); + bool tmpvar_163; + if (any(greaterThan (tmpvar_162, vec2(1.0, 1.0)))) { + tmpvar_163 = bool(1); + } else { + tmpvar_163 = any(lessThan (tmpvar_162, vec2(0.0, 0.0))); + }; + if (tmpvar_163) { + tmpvar_161 = 1.0; + } else { + tmpvar_161 = float((dot (texture2D (u_shadowMap1, tmpvar_162), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_160.z - u_params1.x) / _shadowCoord_160.w))); + }; + result_112 = (result_112 + tmpvar_161); + vec4 tmpvar_164; + tmpvar_164.zw = vec2(0.0, 0.0); + tmpvar_164.xy = (vec2(0.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_165; + _shadowCoord_165 = (tmpvar_111 + tmpvar_164); + float tmpvar_166; + vec2 tmpvar_167; + tmpvar_167 = (_shadowCoord_165.xy / _shadowCoord_165.w); + bool tmpvar_168; + if (any(greaterThan (tmpvar_167, vec2(1.0, 1.0)))) { + tmpvar_168 = bool(1); + } else { + tmpvar_168 = any(lessThan (tmpvar_167, vec2(0.0, 0.0))); + }; + if (tmpvar_168) { + tmpvar_166 = 1.0; + } else { + tmpvar_166 = float((dot (texture2D (u_shadowMap1, tmpvar_167), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_165.z - u_params1.x) / _shadowCoord_165.w))); + }; + result_112 = (result_112 + tmpvar_166); + vec4 tmpvar_169; + tmpvar_169.zw = vec2(0.0, 0.0); + tmpvar_169.xy = (vec2(0.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_170; + _shadowCoord_170 = (tmpvar_111 + tmpvar_169); + float tmpvar_171; + vec2 tmpvar_172; + tmpvar_172 = (_shadowCoord_170.xy / _shadowCoord_170.w); + bool tmpvar_173; + if (any(greaterThan (tmpvar_172, vec2(1.0, 1.0)))) { + tmpvar_173 = bool(1); + } else { + tmpvar_173 = any(lessThan (tmpvar_172, vec2(0.0, 0.0))); + }; + if (tmpvar_173) { + tmpvar_171 = 1.0; + } else { + tmpvar_171 = float((dot (texture2D (u_shadowMap1, tmpvar_172), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_170.z - u_params1.x) / _shadowCoord_170.w))); + }; + result_112 = (result_112 + tmpvar_171); + vec4 tmpvar_174; + tmpvar_174.zw = vec2(0.0, 0.0); + tmpvar_174.xy = (vec2(1.5, -1.5) * tmpvar_113); + vec4 _shadowCoord_175; + _shadowCoord_175 = (tmpvar_111 + tmpvar_174); + float tmpvar_176; + vec2 tmpvar_177; + tmpvar_177 = (_shadowCoord_175.xy / _shadowCoord_175.w); + bool tmpvar_178; + if (any(greaterThan (tmpvar_177, vec2(1.0, 1.0)))) { + tmpvar_178 = bool(1); + } else { + tmpvar_178 = any(lessThan (tmpvar_177, vec2(0.0, 0.0))); + }; + if (tmpvar_178) { + tmpvar_176 = 1.0; + } else { + tmpvar_176 = float((dot (texture2D (u_shadowMap1, tmpvar_177), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_175.z - u_params1.x) / _shadowCoord_175.w))); + }; + result_112 = (result_112 + tmpvar_176); + vec4 tmpvar_179; + tmpvar_179.zw = vec2(0.0, 0.0); + tmpvar_179.xy = (vec2(1.5, -0.5) * tmpvar_113); + vec4 _shadowCoord_180; + _shadowCoord_180 = (tmpvar_111 + tmpvar_179); + float tmpvar_181; + vec2 tmpvar_182; + tmpvar_182 = (_shadowCoord_180.xy / _shadowCoord_180.w); + bool tmpvar_183; + if (any(greaterThan (tmpvar_182, vec2(1.0, 1.0)))) { + tmpvar_183 = bool(1); + } else { + tmpvar_183 = any(lessThan (tmpvar_182, vec2(0.0, 0.0))); + }; + if (tmpvar_183) { + tmpvar_181 = 1.0; + } else { + tmpvar_181 = float((dot (texture2D (u_shadowMap1, tmpvar_182), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_180.z - u_params1.x) / _shadowCoord_180.w))); + }; + result_112 = (result_112 + tmpvar_181); + vec4 tmpvar_184; + tmpvar_184.zw = vec2(0.0, 0.0); + tmpvar_184.xy = (vec2(1.5, 0.5) * tmpvar_113); + vec4 _shadowCoord_185; + _shadowCoord_185 = (tmpvar_111 + tmpvar_184); + float tmpvar_186; + vec2 tmpvar_187; + tmpvar_187 = (_shadowCoord_185.xy / _shadowCoord_185.w); + bool tmpvar_188; + if (any(greaterThan (tmpvar_187, vec2(1.0, 1.0)))) { + tmpvar_188 = bool(1); + } else { + tmpvar_188 = any(lessThan (tmpvar_187, vec2(0.0, 0.0))); + }; + if (tmpvar_188) { + tmpvar_186 = 1.0; + } else { + tmpvar_186 = float((dot (texture2D (u_shadowMap1, tmpvar_187), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_185.z - u_params1.x) / _shadowCoord_185.w))); + }; + result_112 = (result_112 + tmpvar_186); + vec4 tmpvar_189; + tmpvar_189.zw = vec2(0.0, 0.0); + tmpvar_189.xy = (vec2(1.5, 1.5) * tmpvar_113); + vec4 _shadowCoord_190; + _shadowCoord_190 = (tmpvar_111 + tmpvar_189); + float tmpvar_191; + vec2 tmpvar_192; + tmpvar_192 = (_shadowCoord_190.xy / _shadowCoord_190.w); + bool tmpvar_193; + if (any(greaterThan (tmpvar_192, vec2(1.0, 1.0)))) { + tmpvar_193 = bool(1); + } else { + tmpvar_193 = any(lessThan (tmpvar_192, vec2(0.0, 0.0))); + }; + if (tmpvar_193) { + tmpvar_191 = 1.0; + } else { + tmpvar_191 = float((dot (texture2D (u_shadowMap1, tmpvar_192), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_190.z - u_params1.x) / _shadowCoord_190.w))); + }; + float tmpvar_194; + tmpvar_194 = (result_112 + tmpvar_191); + result_112 = tmpvar_194; + visibility_1 = (tmpvar_194 / 16.0); + } else { + if (tmpvar_13) { + vec2 _texcoord_195; + _texcoord_195 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_196; + tmpvar_196 = greaterThan (_texcoord_195, vec2(0.0, 0.0)); + bool tmpvar_197; + if ((tmpvar_196.x && tmpvar_196.y)) { + bvec2 tmpvar_198; + tmpvar_198 = lessThan (_texcoord_195, vec2(1.0, 1.0)); + tmpvar_197 = (tmpvar_198.x && tmpvar_198.y); + } else { + tmpvar_197 = bool(0); }; - visibility_1 = (result_76 / max (tmpvar_78, 1.0)); + float tmpvar_199; + tmpvar_199 = (float(tmpvar_197) * 0.4); + vec3 tmpvar_200; + tmpvar_200.x = -(tmpvar_199); + tmpvar_200.y = -(tmpvar_199); + tmpvar_200.z = tmpvar_199; + colorCoverage_2 = tmpvar_200; + vec4 tmpvar_201; + tmpvar_201.w = 1.0; + tmpvar_201.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_201.z = v_texcoord3.z; + float result_202; + result_202 = 0.0; + vec2 tmpvar_203; + tmpvar_203 = (u_smSamplingParams.zw * (u_params2.zz / 3.0)); + vec4 tmpvar_204; + tmpvar_204.zw = vec2(0.0, 0.0); + tmpvar_204.xy = (vec2(-1.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_205; + _shadowCoord_205 = (tmpvar_201 + tmpvar_204); + float tmpvar_206; + vec2 tmpvar_207; + tmpvar_207 = (_shadowCoord_205.xy / _shadowCoord_205.w); + bool tmpvar_208; + if (any(greaterThan (tmpvar_207, vec2(1.0, 1.0)))) { + tmpvar_208 = bool(1); + } else { + tmpvar_208 = any(lessThan (tmpvar_207, vec2(0.0, 0.0))); + }; + if (tmpvar_208) { + tmpvar_206 = 1.0; + } else { + tmpvar_206 = float((dot (texture2D (u_shadowMap2, tmpvar_207), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_205.z - u_params1.x) / _shadowCoord_205.w))); + }; + result_202 = tmpvar_206; + vec4 tmpvar_209; + tmpvar_209.zw = vec2(0.0, 0.0); + tmpvar_209.xy = (vec2(-1.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_210; + _shadowCoord_210 = (tmpvar_201 + tmpvar_209); + float tmpvar_211; + vec2 tmpvar_212; + tmpvar_212 = (_shadowCoord_210.xy / _shadowCoord_210.w); + bool tmpvar_213; + if (any(greaterThan (tmpvar_212, vec2(1.0, 1.0)))) { + tmpvar_213 = bool(1); + } else { + tmpvar_213 = any(lessThan (tmpvar_212, vec2(0.0, 0.0))); + }; + if (tmpvar_213) { + tmpvar_211 = 1.0; + } else { + tmpvar_211 = float((dot (texture2D (u_shadowMap2, tmpvar_212), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_210.z - u_params1.x) / _shadowCoord_210.w))); + }; + result_202 = (tmpvar_206 + tmpvar_211); + vec4 tmpvar_214; + tmpvar_214.zw = vec2(0.0, 0.0); + tmpvar_214.xy = (vec2(-1.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_215; + _shadowCoord_215 = (tmpvar_201 + tmpvar_214); + float tmpvar_216; + vec2 tmpvar_217; + tmpvar_217 = (_shadowCoord_215.xy / _shadowCoord_215.w); + bool tmpvar_218; + if (any(greaterThan (tmpvar_217, vec2(1.0, 1.0)))) { + tmpvar_218 = bool(1); + } else { + tmpvar_218 = any(lessThan (tmpvar_217, vec2(0.0, 0.0))); + }; + if (tmpvar_218) { + tmpvar_216 = 1.0; + } else { + tmpvar_216 = float((dot (texture2D (u_shadowMap2, tmpvar_217), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_215.z - u_params1.x) / _shadowCoord_215.w))); + }; + result_202 = (result_202 + tmpvar_216); + vec4 tmpvar_219; + tmpvar_219.zw = vec2(0.0, 0.0); + tmpvar_219.xy = (vec2(-1.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_220; + _shadowCoord_220 = (tmpvar_201 + tmpvar_219); + float tmpvar_221; + vec2 tmpvar_222; + tmpvar_222 = (_shadowCoord_220.xy / _shadowCoord_220.w); + bool tmpvar_223; + if (any(greaterThan (tmpvar_222, vec2(1.0, 1.0)))) { + tmpvar_223 = bool(1); + } else { + tmpvar_223 = any(lessThan (tmpvar_222, vec2(0.0, 0.0))); + }; + if (tmpvar_223) { + tmpvar_221 = 1.0; + } else { + tmpvar_221 = float((dot (texture2D (u_shadowMap2, tmpvar_222), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_220.z - u_params1.x) / _shadowCoord_220.w))); + }; + result_202 = (result_202 + tmpvar_221); + vec4 tmpvar_224; + tmpvar_224.zw = vec2(0.0, 0.0); + tmpvar_224.xy = (vec2(-0.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_225; + _shadowCoord_225 = (tmpvar_201 + tmpvar_224); + float tmpvar_226; + vec2 tmpvar_227; + tmpvar_227 = (_shadowCoord_225.xy / _shadowCoord_225.w); + bool tmpvar_228; + if (any(greaterThan (tmpvar_227, vec2(1.0, 1.0)))) { + tmpvar_228 = bool(1); + } else { + tmpvar_228 = any(lessThan (tmpvar_227, vec2(0.0, 0.0))); + }; + if (tmpvar_228) { + tmpvar_226 = 1.0; + } else { + tmpvar_226 = float((dot (texture2D (u_shadowMap2, tmpvar_227), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_225.z - u_params1.x) / _shadowCoord_225.w))); + }; + result_202 = (result_202 + tmpvar_226); + vec4 tmpvar_229; + tmpvar_229.zw = vec2(0.0, 0.0); + tmpvar_229.xy = (vec2(-0.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_230; + _shadowCoord_230 = (tmpvar_201 + tmpvar_229); + float tmpvar_231; + vec2 tmpvar_232; + tmpvar_232 = (_shadowCoord_230.xy / _shadowCoord_230.w); + bool tmpvar_233; + if (any(greaterThan (tmpvar_232, vec2(1.0, 1.0)))) { + tmpvar_233 = bool(1); + } else { + tmpvar_233 = any(lessThan (tmpvar_232, vec2(0.0, 0.0))); + }; + if (tmpvar_233) { + tmpvar_231 = 1.0; + } else { + tmpvar_231 = float((dot (texture2D (u_shadowMap2, tmpvar_232), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_230.z - u_params1.x) / _shadowCoord_230.w))); + }; + result_202 = (result_202 + tmpvar_231); + vec4 tmpvar_234; + tmpvar_234.zw = vec2(0.0, 0.0); + tmpvar_234.xy = (vec2(-0.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_235; + _shadowCoord_235 = (tmpvar_201 + tmpvar_234); + float tmpvar_236; + vec2 tmpvar_237; + tmpvar_237 = (_shadowCoord_235.xy / _shadowCoord_235.w); + bool tmpvar_238; + if (any(greaterThan (tmpvar_237, vec2(1.0, 1.0)))) { + tmpvar_238 = bool(1); + } else { + tmpvar_238 = any(lessThan (tmpvar_237, vec2(0.0, 0.0))); + }; + if (tmpvar_238) { + tmpvar_236 = 1.0; + } else { + tmpvar_236 = float((dot (texture2D (u_shadowMap2, tmpvar_237), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_235.z - u_params1.x) / _shadowCoord_235.w))); + }; + result_202 = (result_202 + tmpvar_236); + vec4 tmpvar_239; + tmpvar_239.zw = vec2(0.0, 0.0); + tmpvar_239.xy = (vec2(-0.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_240; + _shadowCoord_240 = (tmpvar_201 + tmpvar_239); + float tmpvar_241; + vec2 tmpvar_242; + tmpvar_242 = (_shadowCoord_240.xy / _shadowCoord_240.w); + bool tmpvar_243; + if (any(greaterThan (tmpvar_242, vec2(1.0, 1.0)))) { + tmpvar_243 = bool(1); + } else { + tmpvar_243 = any(lessThan (tmpvar_242, vec2(0.0, 0.0))); + }; + if (tmpvar_243) { + tmpvar_241 = 1.0; + } else { + tmpvar_241 = float((dot (texture2D (u_shadowMap2, tmpvar_242), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_240.z - u_params1.x) / _shadowCoord_240.w))); + }; + result_202 = (result_202 + tmpvar_241); + vec4 tmpvar_244; + tmpvar_244.zw = vec2(0.0, 0.0); + tmpvar_244.xy = (vec2(0.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_245; + _shadowCoord_245 = (tmpvar_201 + tmpvar_244); + float tmpvar_246; + vec2 tmpvar_247; + tmpvar_247 = (_shadowCoord_245.xy / _shadowCoord_245.w); + bool tmpvar_248; + if (any(greaterThan (tmpvar_247, vec2(1.0, 1.0)))) { + tmpvar_248 = bool(1); + } else { + tmpvar_248 = any(lessThan (tmpvar_247, vec2(0.0, 0.0))); + }; + if (tmpvar_248) { + tmpvar_246 = 1.0; + } else { + tmpvar_246 = float((dot (texture2D (u_shadowMap2, tmpvar_247), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_245.z - u_params1.x) / _shadowCoord_245.w))); + }; + result_202 = (result_202 + tmpvar_246); + vec4 tmpvar_249; + tmpvar_249.zw = vec2(0.0, 0.0); + tmpvar_249.xy = (vec2(0.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_250; + _shadowCoord_250 = (tmpvar_201 + tmpvar_249); + float tmpvar_251; + vec2 tmpvar_252; + tmpvar_252 = (_shadowCoord_250.xy / _shadowCoord_250.w); + bool tmpvar_253; + if (any(greaterThan (tmpvar_252, vec2(1.0, 1.0)))) { + tmpvar_253 = bool(1); + } else { + tmpvar_253 = any(lessThan (tmpvar_252, vec2(0.0, 0.0))); + }; + if (tmpvar_253) { + tmpvar_251 = 1.0; + } else { + tmpvar_251 = float((dot (texture2D (u_shadowMap2, tmpvar_252), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_250.z - u_params1.x) / _shadowCoord_250.w))); + }; + result_202 = (result_202 + tmpvar_251); + vec4 tmpvar_254; + tmpvar_254.zw = vec2(0.0, 0.0); + tmpvar_254.xy = (vec2(0.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_255; + _shadowCoord_255 = (tmpvar_201 + tmpvar_254); + float tmpvar_256; + vec2 tmpvar_257; + tmpvar_257 = (_shadowCoord_255.xy / _shadowCoord_255.w); + bool tmpvar_258; + if (any(greaterThan (tmpvar_257, vec2(1.0, 1.0)))) { + tmpvar_258 = bool(1); + } else { + tmpvar_258 = any(lessThan (tmpvar_257, vec2(0.0, 0.0))); + }; + if (tmpvar_258) { + tmpvar_256 = 1.0; + } else { + tmpvar_256 = float((dot (texture2D (u_shadowMap2, tmpvar_257), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_255.z - u_params1.x) / _shadowCoord_255.w))); + }; + result_202 = (result_202 + tmpvar_256); + vec4 tmpvar_259; + tmpvar_259.zw = vec2(0.0, 0.0); + tmpvar_259.xy = (vec2(0.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_260; + _shadowCoord_260 = (tmpvar_201 + tmpvar_259); + float tmpvar_261; + vec2 tmpvar_262; + tmpvar_262 = (_shadowCoord_260.xy / _shadowCoord_260.w); + bool tmpvar_263; + if (any(greaterThan (tmpvar_262, vec2(1.0, 1.0)))) { + tmpvar_263 = bool(1); + } else { + tmpvar_263 = any(lessThan (tmpvar_262, vec2(0.0, 0.0))); + }; + if (tmpvar_263) { + tmpvar_261 = 1.0; + } else { + tmpvar_261 = float((dot (texture2D (u_shadowMap2, tmpvar_262), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_260.z - u_params1.x) / _shadowCoord_260.w))); + }; + result_202 = (result_202 + tmpvar_261); + vec4 tmpvar_264; + tmpvar_264.zw = vec2(0.0, 0.0); + tmpvar_264.xy = (vec2(1.5, -1.5) * tmpvar_203); + vec4 _shadowCoord_265; + _shadowCoord_265 = (tmpvar_201 + tmpvar_264); + float tmpvar_266; + vec2 tmpvar_267; + tmpvar_267 = (_shadowCoord_265.xy / _shadowCoord_265.w); + bool tmpvar_268; + if (any(greaterThan (tmpvar_267, vec2(1.0, 1.0)))) { + tmpvar_268 = bool(1); + } else { + tmpvar_268 = any(lessThan (tmpvar_267, vec2(0.0, 0.0))); + }; + if (tmpvar_268) { + tmpvar_266 = 1.0; + } else { + tmpvar_266 = float((dot (texture2D (u_shadowMap2, tmpvar_267), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_265.z - u_params1.x) / _shadowCoord_265.w))); + }; + result_202 = (result_202 + tmpvar_266); + vec4 tmpvar_269; + tmpvar_269.zw = vec2(0.0, 0.0); + tmpvar_269.xy = (vec2(1.5, -0.5) * tmpvar_203); + vec4 _shadowCoord_270; + _shadowCoord_270 = (tmpvar_201 + tmpvar_269); + float tmpvar_271; + vec2 tmpvar_272; + tmpvar_272 = (_shadowCoord_270.xy / _shadowCoord_270.w); + bool tmpvar_273; + if (any(greaterThan (tmpvar_272, vec2(1.0, 1.0)))) { + tmpvar_273 = bool(1); + } else { + tmpvar_273 = any(lessThan (tmpvar_272, vec2(0.0, 0.0))); + }; + if (tmpvar_273) { + tmpvar_271 = 1.0; + } else { + tmpvar_271 = float((dot (texture2D (u_shadowMap2, tmpvar_272), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_270.z - u_params1.x) / _shadowCoord_270.w))); + }; + result_202 = (result_202 + tmpvar_271); + vec4 tmpvar_274; + tmpvar_274.zw = vec2(0.0, 0.0); + tmpvar_274.xy = (vec2(1.5, 0.5) * tmpvar_203); + vec4 _shadowCoord_275; + _shadowCoord_275 = (tmpvar_201 + tmpvar_274); + float tmpvar_276; + vec2 tmpvar_277; + tmpvar_277 = (_shadowCoord_275.xy / _shadowCoord_275.w); + bool tmpvar_278; + if (any(greaterThan (tmpvar_277, vec2(1.0, 1.0)))) { + tmpvar_278 = bool(1); + } else { + tmpvar_278 = any(lessThan (tmpvar_277, vec2(0.0, 0.0))); + }; + if (tmpvar_278) { + tmpvar_276 = 1.0; + } else { + tmpvar_276 = float((dot (texture2D (u_shadowMap2, tmpvar_277), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_275.z - u_params1.x) / _shadowCoord_275.w))); + }; + result_202 = (result_202 + tmpvar_276); + vec4 tmpvar_279; + tmpvar_279.zw = vec2(0.0, 0.0); + tmpvar_279.xy = (vec2(1.5, 1.5) * tmpvar_203); + vec4 _shadowCoord_280; + _shadowCoord_280 = (tmpvar_201 + tmpvar_279); + float tmpvar_281; + vec2 tmpvar_282; + tmpvar_282 = (_shadowCoord_280.xy / _shadowCoord_280.w); + bool tmpvar_283; + if (any(greaterThan (tmpvar_282, vec2(1.0, 1.0)))) { + tmpvar_283 = bool(1); + } else { + tmpvar_283 = any(lessThan (tmpvar_282, vec2(0.0, 0.0))); + }; + if (tmpvar_283) { + tmpvar_281 = 1.0; + } else { + tmpvar_281 = float((dot (texture2D (u_shadowMap2, tmpvar_282), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_280.z - u_params1.x) / _shadowCoord_280.w))); + }; + float tmpvar_284; + tmpvar_284 = (result_202 + tmpvar_281); + result_202 = tmpvar_284; + visibility_1 = (tmpvar_284 / 16.0); + } else { + vec2 _texcoord_285; + _texcoord_285 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_286; + tmpvar_286 = greaterThan (_texcoord_285, vec2(0.0, 0.0)); + bool tmpvar_287; + if ((tmpvar_286.x && tmpvar_286.y)) { + bvec2 tmpvar_288; + tmpvar_288 = lessThan (_texcoord_285, vec2(1.0, 1.0)); + tmpvar_287 = (tmpvar_288.x && tmpvar_288.y); + } else { + tmpvar_287 = bool(0); + }; + float tmpvar_289; + tmpvar_289 = (float(tmpvar_287) * 0.4); + vec3 tmpvar_290; + tmpvar_290.x = tmpvar_289; + tmpvar_290.y = -(tmpvar_289); + tmpvar_290.z = -(tmpvar_289); + colorCoverage_2 = tmpvar_290; + vec4 tmpvar_291; + tmpvar_291.w = 1.0; + tmpvar_291.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_291.z = v_texcoord4.z; + float result_292; + result_292 = 0.0; + vec2 tmpvar_293; + tmpvar_293 = (u_smSamplingParams.zw * (u_params2.zz / 4.0)); + vec4 tmpvar_294; + tmpvar_294.zw = vec2(0.0, 0.0); + tmpvar_294.xy = (vec2(-1.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_295; + _shadowCoord_295 = (tmpvar_291 + tmpvar_294); + float tmpvar_296; + vec2 tmpvar_297; + tmpvar_297 = (_shadowCoord_295.xy / _shadowCoord_295.w); + bool tmpvar_298; + if (any(greaterThan (tmpvar_297, vec2(1.0, 1.0)))) { + tmpvar_298 = bool(1); + } else { + tmpvar_298 = any(lessThan (tmpvar_297, vec2(0.0, 0.0))); + }; + if (tmpvar_298) { + tmpvar_296 = 1.0; + } else { + tmpvar_296 = float((dot (texture2D (u_shadowMap3, tmpvar_297), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_295.z - u_params1.x) / _shadowCoord_295.w))); + }; + result_292 = tmpvar_296; + vec4 tmpvar_299; + tmpvar_299.zw = vec2(0.0, 0.0); + tmpvar_299.xy = (vec2(-1.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_300; + _shadowCoord_300 = (tmpvar_291 + tmpvar_299); + float tmpvar_301; + vec2 tmpvar_302; + tmpvar_302 = (_shadowCoord_300.xy / _shadowCoord_300.w); + bool tmpvar_303; + if (any(greaterThan (tmpvar_302, vec2(1.0, 1.0)))) { + tmpvar_303 = bool(1); + } else { + tmpvar_303 = any(lessThan (tmpvar_302, vec2(0.0, 0.0))); + }; + if (tmpvar_303) { + tmpvar_301 = 1.0; + } else { + tmpvar_301 = float((dot (texture2D (u_shadowMap3, tmpvar_302), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_300.z - u_params1.x) / _shadowCoord_300.w))); + }; + result_292 = (tmpvar_296 + tmpvar_301); + vec4 tmpvar_304; + tmpvar_304.zw = vec2(0.0, 0.0); + tmpvar_304.xy = (vec2(-1.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_305; + _shadowCoord_305 = (tmpvar_291 + tmpvar_304); + float tmpvar_306; + vec2 tmpvar_307; + tmpvar_307 = (_shadowCoord_305.xy / _shadowCoord_305.w); + bool tmpvar_308; + if (any(greaterThan (tmpvar_307, vec2(1.0, 1.0)))) { + tmpvar_308 = bool(1); + } else { + tmpvar_308 = any(lessThan (tmpvar_307, vec2(0.0, 0.0))); + }; + if (tmpvar_308) { + tmpvar_306 = 1.0; + } else { + tmpvar_306 = float((dot (texture2D (u_shadowMap3, tmpvar_307), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_305.z - u_params1.x) / _shadowCoord_305.w))); + }; + result_292 = (result_292 + tmpvar_306); + vec4 tmpvar_309; + tmpvar_309.zw = vec2(0.0, 0.0); + tmpvar_309.xy = (vec2(-1.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_310; + _shadowCoord_310 = (tmpvar_291 + tmpvar_309); + float tmpvar_311; + vec2 tmpvar_312; + tmpvar_312 = (_shadowCoord_310.xy / _shadowCoord_310.w); + bool tmpvar_313; + if (any(greaterThan (tmpvar_312, vec2(1.0, 1.0)))) { + tmpvar_313 = bool(1); + } else { + tmpvar_313 = any(lessThan (tmpvar_312, vec2(0.0, 0.0))); + }; + if (tmpvar_313) { + tmpvar_311 = 1.0; + } else { + tmpvar_311 = float((dot (texture2D (u_shadowMap3, tmpvar_312), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_310.z - u_params1.x) / _shadowCoord_310.w))); + }; + result_292 = (result_292 + tmpvar_311); + vec4 tmpvar_314; + tmpvar_314.zw = vec2(0.0, 0.0); + tmpvar_314.xy = (vec2(-0.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_315; + _shadowCoord_315 = (tmpvar_291 + tmpvar_314); + float tmpvar_316; + vec2 tmpvar_317; + tmpvar_317 = (_shadowCoord_315.xy / _shadowCoord_315.w); + bool tmpvar_318; + if (any(greaterThan (tmpvar_317, vec2(1.0, 1.0)))) { + tmpvar_318 = bool(1); + } else { + tmpvar_318 = any(lessThan (tmpvar_317, vec2(0.0, 0.0))); + }; + if (tmpvar_318) { + tmpvar_316 = 1.0; + } else { + tmpvar_316 = float((dot (texture2D (u_shadowMap3, tmpvar_317), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_315.z - u_params1.x) / _shadowCoord_315.w))); + }; + result_292 = (result_292 + tmpvar_316); + vec4 tmpvar_319; + tmpvar_319.zw = vec2(0.0, 0.0); + tmpvar_319.xy = (vec2(-0.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_320; + _shadowCoord_320 = (tmpvar_291 + tmpvar_319); + float tmpvar_321; + vec2 tmpvar_322; + tmpvar_322 = (_shadowCoord_320.xy / _shadowCoord_320.w); + bool tmpvar_323; + if (any(greaterThan (tmpvar_322, vec2(1.0, 1.0)))) { + tmpvar_323 = bool(1); + } else { + tmpvar_323 = any(lessThan (tmpvar_322, vec2(0.0, 0.0))); + }; + if (tmpvar_323) { + tmpvar_321 = 1.0; + } else { + tmpvar_321 = float((dot (texture2D (u_shadowMap3, tmpvar_322), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_320.z - u_params1.x) / _shadowCoord_320.w))); + }; + result_292 = (result_292 + tmpvar_321); + vec4 tmpvar_324; + tmpvar_324.zw = vec2(0.0, 0.0); + tmpvar_324.xy = (vec2(-0.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_325; + _shadowCoord_325 = (tmpvar_291 + tmpvar_324); + float tmpvar_326; + vec2 tmpvar_327; + tmpvar_327 = (_shadowCoord_325.xy / _shadowCoord_325.w); + bool tmpvar_328; + if (any(greaterThan (tmpvar_327, vec2(1.0, 1.0)))) { + tmpvar_328 = bool(1); + } else { + tmpvar_328 = any(lessThan (tmpvar_327, vec2(0.0, 0.0))); + }; + if (tmpvar_328) { + tmpvar_326 = 1.0; + } else { + tmpvar_326 = float((dot (texture2D (u_shadowMap3, tmpvar_327), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_325.z - u_params1.x) / _shadowCoord_325.w))); + }; + result_292 = (result_292 + tmpvar_326); + vec4 tmpvar_329; + tmpvar_329.zw = vec2(0.0, 0.0); + tmpvar_329.xy = (vec2(-0.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_330; + _shadowCoord_330 = (tmpvar_291 + tmpvar_329); + float tmpvar_331; + vec2 tmpvar_332; + tmpvar_332 = (_shadowCoord_330.xy / _shadowCoord_330.w); + bool tmpvar_333; + if (any(greaterThan (tmpvar_332, vec2(1.0, 1.0)))) { + tmpvar_333 = bool(1); + } else { + tmpvar_333 = any(lessThan (tmpvar_332, vec2(0.0, 0.0))); + }; + if (tmpvar_333) { + tmpvar_331 = 1.0; + } else { + tmpvar_331 = float((dot (texture2D (u_shadowMap3, tmpvar_332), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_330.z - u_params1.x) / _shadowCoord_330.w))); + }; + result_292 = (result_292 + tmpvar_331); + vec4 tmpvar_334; + tmpvar_334.zw = vec2(0.0, 0.0); + tmpvar_334.xy = (vec2(0.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_335; + _shadowCoord_335 = (tmpvar_291 + tmpvar_334); + float tmpvar_336; + vec2 tmpvar_337; + tmpvar_337 = (_shadowCoord_335.xy / _shadowCoord_335.w); + bool tmpvar_338; + if (any(greaterThan (tmpvar_337, vec2(1.0, 1.0)))) { + tmpvar_338 = bool(1); + } else { + tmpvar_338 = any(lessThan (tmpvar_337, vec2(0.0, 0.0))); + }; + if (tmpvar_338) { + tmpvar_336 = 1.0; + } else { + tmpvar_336 = float((dot (texture2D (u_shadowMap3, tmpvar_337), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_335.z - u_params1.x) / _shadowCoord_335.w))); + }; + result_292 = (result_292 + tmpvar_336); + vec4 tmpvar_339; + tmpvar_339.zw = vec2(0.0, 0.0); + tmpvar_339.xy = (vec2(0.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_340; + _shadowCoord_340 = (tmpvar_291 + tmpvar_339); + float tmpvar_341; + vec2 tmpvar_342; + tmpvar_342 = (_shadowCoord_340.xy / _shadowCoord_340.w); + bool tmpvar_343; + if (any(greaterThan (tmpvar_342, vec2(1.0, 1.0)))) { + tmpvar_343 = bool(1); + } else { + tmpvar_343 = any(lessThan (tmpvar_342, vec2(0.0, 0.0))); + }; + if (tmpvar_343) { + tmpvar_341 = 1.0; + } else { + tmpvar_341 = float((dot (texture2D (u_shadowMap3, tmpvar_342), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_340.z - u_params1.x) / _shadowCoord_340.w))); + }; + result_292 = (result_292 + tmpvar_341); + vec4 tmpvar_344; + tmpvar_344.zw = vec2(0.0, 0.0); + tmpvar_344.xy = (vec2(0.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_345; + _shadowCoord_345 = (tmpvar_291 + tmpvar_344); + float tmpvar_346; + vec2 tmpvar_347; + tmpvar_347 = (_shadowCoord_345.xy / _shadowCoord_345.w); + bool tmpvar_348; + if (any(greaterThan (tmpvar_347, vec2(1.0, 1.0)))) { + tmpvar_348 = bool(1); + } else { + tmpvar_348 = any(lessThan (tmpvar_347, vec2(0.0, 0.0))); + }; + if (tmpvar_348) { + tmpvar_346 = 1.0; + } else { + tmpvar_346 = float((dot (texture2D (u_shadowMap3, tmpvar_347), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_345.z - u_params1.x) / _shadowCoord_345.w))); + }; + result_292 = (result_292 + tmpvar_346); + vec4 tmpvar_349; + tmpvar_349.zw = vec2(0.0, 0.0); + tmpvar_349.xy = (vec2(0.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_350; + _shadowCoord_350 = (tmpvar_291 + tmpvar_349); + float tmpvar_351; + vec2 tmpvar_352; + tmpvar_352 = (_shadowCoord_350.xy / _shadowCoord_350.w); + bool tmpvar_353; + if (any(greaterThan (tmpvar_352, vec2(1.0, 1.0)))) { + tmpvar_353 = bool(1); + } else { + tmpvar_353 = any(lessThan (tmpvar_352, vec2(0.0, 0.0))); + }; + if (tmpvar_353) { + tmpvar_351 = 1.0; + } else { + tmpvar_351 = float((dot (texture2D (u_shadowMap3, tmpvar_352), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_350.z - u_params1.x) / _shadowCoord_350.w))); + }; + result_292 = (result_292 + tmpvar_351); + vec4 tmpvar_354; + tmpvar_354.zw = vec2(0.0, 0.0); + tmpvar_354.xy = (vec2(1.5, -1.5) * tmpvar_293); + vec4 _shadowCoord_355; + _shadowCoord_355 = (tmpvar_291 + tmpvar_354); + float tmpvar_356; + vec2 tmpvar_357; + tmpvar_357 = (_shadowCoord_355.xy / _shadowCoord_355.w); + bool tmpvar_358; + if (any(greaterThan (tmpvar_357, vec2(1.0, 1.0)))) { + tmpvar_358 = bool(1); + } else { + tmpvar_358 = any(lessThan (tmpvar_357, vec2(0.0, 0.0))); + }; + if (tmpvar_358) { + tmpvar_356 = 1.0; + } else { + tmpvar_356 = float((dot (texture2D (u_shadowMap3, tmpvar_357), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_355.z - u_params1.x) / _shadowCoord_355.w))); + }; + result_292 = (result_292 + tmpvar_356); + vec4 tmpvar_359; + tmpvar_359.zw = vec2(0.0, 0.0); + tmpvar_359.xy = (vec2(1.5, -0.5) * tmpvar_293); + vec4 _shadowCoord_360; + _shadowCoord_360 = (tmpvar_291 + tmpvar_359); + float tmpvar_361; + vec2 tmpvar_362; + tmpvar_362 = (_shadowCoord_360.xy / _shadowCoord_360.w); + bool tmpvar_363; + if (any(greaterThan (tmpvar_362, vec2(1.0, 1.0)))) { + tmpvar_363 = bool(1); + } else { + tmpvar_363 = any(lessThan (tmpvar_362, vec2(0.0, 0.0))); + }; + if (tmpvar_363) { + tmpvar_361 = 1.0; + } else { + tmpvar_361 = float((dot (texture2D (u_shadowMap3, tmpvar_362), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_360.z - u_params1.x) / _shadowCoord_360.w))); + }; + result_292 = (result_292 + tmpvar_361); + vec4 tmpvar_364; + tmpvar_364.zw = vec2(0.0, 0.0); + tmpvar_364.xy = (vec2(1.5, 0.5) * tmpvar_293); + vec4 _shadowCoord_365; + _shadowCoord_365 = (tmpvar_291 + tmpvar_364); + float tmpvar_366; + vec2 tmpvar_367; + tmpvar_367 = (_shadowCoord_365.xy / _shadowCoord_365.w); + bool tmpvar_368; + if (any(greaterThan (tmpvar_367, vec2(1.0, 1.0)))) { + tmpvar_368 = bool(1); + } else { + tmpvar_368 = any(lessThan (tmpvar_367, vec2(0.0, 0.0))); + }; + if (tmpvar_368) { + tmpvar_366 = 1.0; + } else { + tmpvar_366 = float((dot (texture2D (u_shadowMap3, tmpvar_367), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_365.z - u_params1.x) / _shadowCoord_365.w))); + }; + result_292 = (result_292 + tmpvar_366); + vec4 tmpvar_369; + tmpvar_369.zw = vec2(0.0, 0.0); + tmpvar_369.xy = (vec2(1.5, 1.5) * tmpvar_293); + vec4 _shadowCoord_370; + _shadowCoord_370 = (tmpvar_291 + tmpvar_369); + float tmpvar_371; + vec2 tmpvar_372; + tmpvar_372 = (_shadowCoord_370.xy / _shadowCoord_370.w); + bool tmpvar_373; + if (any(greaterThan (tmpvar_372, vec2(1.0, 1.0)))) { + tmpvar_373 = bool(1); + } else { + tmpvar_373 = any(lessThan (tmpvar_372, vec2(0.0, 0.0))); + }; + if (tmpvar_373) { + tmpvar_371 = 1.0; + } else { + tmpvar_371 = float((dot (texture2D (u_shadowMap3, tmpvar_372), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_370.z - u_params1.x) / _shadowCoord_370.w))); + }; + float tmpvar_374; + tmpvar_374 = (result_292 + tmpvar_371); + result_292 = tmpvar_374; + visibility_1 = (tmpvar_374 / 16.0); }; }; }; - vec3 tmpvar_84; - tmpvar_84 = -(normalize(v_view)); - vec3 tmpvar_85; - float tmpvar_86; - tmpvar_85 = -(normalize(u_lightPosition.xyz)); - tmpvar_86 = 1.0; + vec3 tmpvar_375; + tmpvar_375 = -(normalize(v_view)); + vec3 tmpvar_376; + float tmpvar_377; + tmpvar_376 = -(normalize(u_lightPosition.xyz)); + tmpvar_377 = 1.0; if ((0.0 != u_lightPosition.w)) { - vec3 tmpvar_87; - tmpvar_87 = (u_lightPosition.xyz - v_view); - vec3 tmpvar_88; - tmpvar_88 = normalize(tmpvar_87); - tmpvar_85 = tmpvar_88; - float tmpvar_89; - tmpvar_89 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); - float tmpvar_90; - tmpvar_90 = sqrt(dot (tmpvar_87, tmpvar_87)); - tmpvar_86 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_90)) + ((u_lightAttenuationSpotOuter.z * tmpvar_90) * tmpvar_90)))) * mix (clamp (((max (0.0, dot (-(tmpvar_88), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_89) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_89)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + vec3 tmpvar_378; + tmpvar_378 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_379; + tmpvar_379 = normalize(tmpvar_378); + tmpvar_376 = tmpvar_379; + float tmpvar_380; + tmpvar_380 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_381; + tmpvar_381 = sqrt(dot (tmpvar_378, tmpvar_378)); + tmpvar_377 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_381)) + ((u_lightAttenuationSpotOuter.z * tmpvar_381) * tmpvar_381)))) * mix (clamp (((max (0.0, dot (-(tmpvar_379), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_380) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_380)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); }; - float tmpvar_91; - tmpvar_91 = dot (v_normal, tmpvar_85); - vec2 tmpvar_92; - tmpvar_92.x = tmpvar_91; - tmpvar_92.y = (((float((tmpvar_91 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_91) * v_normal) - tmpvar_85), tmpvar_84)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); - vec2 tmpvar_93; - tmpvar_93 = (max (tmpvar_92, 0.0) * tmpvar_86); - float tmpvar_94; - tmpvar_94 = sqrt(dot (v_view, v_view)); - gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_93.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_93.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_94) * tmpvar_94)))), 0.0, 1.0)); + float tmpvar_382; + tmpvar_382 = dot (v_normal, tmpvar_376); + vec2 tmpvar_383; + tmpvar_383.x = tmpvar_382; + tmpvar_383.y = (((float((tmpvar_382 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_382) * v_normal) - tmpvar_376), tmpvar_375)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_384; + tmpvar_384 = (max (tmpvar_383, 0.0) * tmpvar_377); + float tmpvar_385; + tmpvar_385 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_384.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_384.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_385) * tmpvar_385)))), 0.0, 1.0)); gl_FragColor.w = 1.0; } diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_linear_omni.bin index 8248ab63bd4ad6ea7dbcd8b14656c8a125f0a46d..1ae5b4b87d8888e47e8895b69857d8c5c71dbcae 100644 GIT binary patch literal 17797 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 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_pcf_omni.bin index 9473f5f3d8275f9643b87d71a6c595cf269b349a..beae6e5078014fd1b2f02a4a6ec3f4b6381eb1d3 100644 GIT binary patch literal 17748 zcmb`P+m0K#5r&i7d5X@>LbE#_i>*GwaDa^sCqaL$B*=w>&dT|he`i>zYt=hu{$)Q3-h`t67R{O`Z_x0|oK{Y`RM-`s7RefmDR zzdC$hf7w0$b$z#dbEfMbn(Gy+j?Hnu{u>&sxBqCqj8*?(d*6)J|Et+$p*{@CopmQ?+Ivv01+ z_RqJs!*4jYQZ3-)G>A#B#$zt|(D zNikLagqW(e*WvYUyYq8$$4N~+>$Y6IIeS>|pOO581@Un8uxT)fqA*JyppvKS-ERLS z8?0Fk*1+{ZZ?<#tb7ztznygT9%L+wLyUmy6X1%#h7UyTboFx=>mbCij2(Qp-SNe5* z-F#}ctq`sd2A8iA&eOZyL$hChYpxJDm#4|`<_=!3Fvi6EoxCLv>0)tz)g|)sC3&4> zm&@~WvU7Y~KB2*v-7$f^SXnIm3o*XSr{|Yo`{!W$c4YhSn+CnrCTcPxUZ+xrr$Z971sIN#Bc1tLv+C2t+59c3ZKSl zF6PT(7`pAn#pI%_u(W#7C{rQJ&{QZjb(NZ4YNa|7Q4B(v{1v(y(5p%Z1ZzuHF-xgW zsamzNgoC$Iw{BRB73!i_1<@s>UK5os-@b813DT3E+mYl(!%1Szr1VZ5SVD%aUS77C zJB;+c3-WErS!K4KyGN9cuLDTmL&=)f)t&<&04_$VZBZB9DoWgEqUfXx!AVC@+UVRk zm(m^suu+{a?+$pBdm(TpP`@~!B^$*nA#hhq27`SiURl~VYuRzpE`PVM-M*1zjXz#o^x#?F zJ};~lZ@TZ6d%vK}gGiguV&sLOSXmb5qz(D#7p<--Jf5_@&=gQ)+OE{kKV3kOLR4fI zbV>E?>RRyUYJ3xMyx%wYT8mUol(_dWWfp zM3$?1S)}+I-jR&oV?Gydu3wT@_%^2drsVSJ9H04I6MPu$M=F8qI)!kv)Ddn*8>NfR znvTQx%_iWNZNe(n4q_^H@tZ~P%k{HVd@}qZ*D)3IbPTDum$Z2>XE~$VQn7?_7K1Si zJQYveL}WgTvoRKD0T$;Ti*w21+-GqXVlfJR73WbF=W!P26IjePK@}SZ5f$eyi}MJJ zxqgm{^OLa{xsIxMjKu*J=RS*b$>Kc5Vi-sj1H;qz!nqIQd<@2U0LHlo<6Ocx_hFoe zV2r|mjH58lH7kcnCoZB_+&6fu46Lh>6iiI+=p>4VVuWc z3E60vrSOO#z92Jg-hci zLSwF8I;!HCEG~T(my*S0jKwezDxS45E`1i4V=OKMEG|73my*S$&*Cz~ViX2c z9A$B-Q8~=wasrFlCahxZAf{rM#bt!WTt7?2Cu1>k9aAw+#|##iK8s7q;xfi!7)PM@k|z1K8q{K;wr{s7`Q5)DB{XTaW#hGDuCk3LvbZhT=^)jLMTRIK*UiL zSDKW=D6S@;m~Fx$)(&DKc2QhKP|WqSM0_$7BiAtz^K{HWapj}9k|?fXD29P6;)%QB z$|rF(M&c?!;@Tr|ElFJaB(6dvMxig_I!fX?PU3n3iP*Cr+aXp6OI)LKZLvbxpT>B`lLnuaJK*doM z*P4{WD6S`vRzOkMKNWQ z!8~Q3jMbF&n6%rOnL%p|IiPLHYqg94n=D*yPux7KrB7^>kq!s79b$HS9Z8eJ5h_kp$rU@1>aYh)7)r8$#co`b4*NogQj8DL3!S|06Jla5 zIhVqYhHGlOPMrKOE<_VT#r5t$*M0|YpI_36btFQSS-x7e33IN(D19?XyXWgThkx&n z-C^eT#xW9N&M)I{-IZ>n_yM{={$DS~BYMJ#&C!sb`{VA24YLLN(FQMe1N$9LkfPvb zgL}T$TioGCU+slo#t0wRHWwB!eb|fj)72%`zpUS??;KJvv)_s%7n5hZL!>+eq#S?Z6_=3diqm+m9_bKyjfThzYtX+$q1roMdSraL zi}R#!xCJ+B{&61#MES zZ*wsMLDM|z5Ur`nkssYN?lR(?`1OJVwsX{yyZgznd7V@}`NSwCFICFO<$L7XQHtBA zGyoBzYOgZd%euX0Wm*wJ`?c4C2G3Rj(r??V5BO1lcl1LFq(d}dbra3Z-R#ykgvPmB ze+DJ+j|PSKJqYgMM-55&OA*KmVi%cOx9|Cq4le*+n4(|#OB8m$R*l>57n!3JpB35_ zucQ5RCw>CM?$)ky`#rQl3W>Crcxg~#5T<@bYl8PNl*cTme<_ddUoDZ`yGqon{`Cc1 zGrLGMZ5WBo(;a@F0eCEna>e&Mgf3FPOVmq%mZn(TyiBcGf5e=l+c#&wo}K;X{}sT9 Ap8x;= literal 7153 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 lJW0YaT_{66v-`v;bjgGwmqq@4&x}Zs zlrLxk7?L=1=5l66qt8!Ye*9_k@0aa5TNdR?RLN?Sr=@xn+gbIREQ;M<$tJq*ne(@F zKEzR;y}Z_+>N;I-lR7KbPn)9tdt0aFc}Y5c%*u35vVW}Cm*vv=Hc!g0#qN^GW42sw ztMrP*r`2;u-+N2SL$-bq$aXB=W^Y-#^BxZIuwiFj6eT?BD6BzclH+laEyOCx)*=Xd-+F=o zm6+A(p7mxhCEQ!_AOa70us?`f-`HRmlGZar)vFCm&k%|b<{BU`WlEX+=QV+4$6TKs z2%a_Zsv@fJgoym6q0lE(cX+4$3~$UYVTaj^y5wy>5dgShJl-)d0S-1 z6qQV`ng+qs;z{B6f;%fDdFle`4Z*xDmu(`9n^R4Rxu-bwwE^(5qWs2H)VTAa3XFH> zR;IxY{2_ih8II!E(C5SYeXJBg$IuQIgVJjdcm!<3tlhd0O8zS>k2_8o$>ho_5WQ);1YEG20K z2h75XHlfR^m}Tbl0#P?aR3zDNhceF^{AB-;Y+T~E-|Pd|)3g)6J%}k3krXaE?q9zO zcz&Alqv^>hdYd(MYuTSL0IFTJ#mWQEsM2y{>)1oZrh_B!z?SVA7L$AI9T?jbJJBTy zDhfT^j!4Cejq%OlLr#ztQrO^RlhJlqGez*GbLQhqKKooIFTc}u4EcA?S|VJMp<#nl4nc; z{F(N0K2#Wi)`I5C%01apLYy2W%{_lwaJ6#_I=Jp9l8@`1ba5AiYf?6%&4pUqIQz75 zKFxeo|ELRFH9oq~w8T?LP6+Ms1m({w1toDfqJK(a_X-I14LD{r{Z&Pu2z_DZ2~WIq qzfp)p4kqJCoZdu{^Tt$TH*C}+X}A5$rRFic1J3}x@4feWKYRzK0>63y literal 3718 zcmaJ^+m72d5N+QIe+By{CAL?jB(IIs1%fVu6h+Yh+jm2?Wv>d^awYj1?7#QSh?Gd* zk{64^nK^Si!~OF5^~ayK|9;(VvSm@OMU||#d0MI$v71$I$)Y&?nQVhkJtNpI=+k~%9kuiK*jYgeb`?VBWi$;xz2cYoh(?%zx2yF4ks6^DCQUb5wKSEUbb zd|v;PrJMS}jc-Mj5t1vg>jWWWN&ZLWh(bi%iWc`pi6f#s&5OLa&dD|@lXa!8Za3%h zQ*WP?r);wl$aX09vwfBxoWlr*O?Bo)Q3BD0!Um;GavT@gLadW)BRs$Ny(b!j^?Hl@ zGx%{20LVQE>0p@`NiF8ZJ}r|~I*aJ6`w~+T4ACD#WJ}?ByP1w{coNg8ki)?D#dk>A zuoBvJObVj?f)URNXm~t{CpX67!Eclt-`+e&!@@B3b_#H94cf!b3(=JDJV15se zh_u7+h>$Na@H!!zYZcG8q_&@D%h)qtZh9a)r${X|kk1xvoiXV&<<*WRmX+~^6+QH3 zc2J^oW76p2KB_<#xD}8d@$=MhMXLrJT|HInt(OvwPo&`eA-ttvdC#yT4Ew^gtxa*(1$5@VN?}uPd0BgJeEM0$i|Loj%K4_Re zh;?=p?Ob~61YbNV9NNIlqLdh+t~@%O*NdX*GarRFAe9epz@(rEYht$hs)v3ny|t@Q zrvXiIAQ?A)nTk2y>`~`|?`ys=p6}THbt)#XNfbk+V`^}Fi@DT<6``V>qW!E%OI!T0 zncS8?B@?L8jG0%=mt!<09!5bmF}BH%1kf=!6l_}@#AThJqAVG~Bo;hN#JUINrd z(77c!kTDB)VjHA^??%jieYh4K$)&}G1y_!SN8167e&^tIYrTM653cCaMa6^CWd&|d z?8a?5-V^Q-uK|-j;zOWuw=vPK+3XVNZ|r8ypnkvTRqYhj-Yk;I%XM*g;loN~Dy?`+ zXsC*IM4cY%U76y!iec>Dt8Gilra5dVifP^$K{zmDv#tt|$@ZZT1mPqYDKs6wWvE#@ zRhq2})iXGUybl9wOJ4jI@@}wD-PzvmUN0osEPhEdO2){J%rs`*Iw~Ixmn2x%n5z85a2%}|nHs@?O zNkQ-~G53KG#Bb1qw5iNTWC4pnxDHR>dk)G;TPyoL$YETwwX!)^#Q@hW?B-1ZYt~C^ zmCwH5#rzxn1;B%>qd^aZ%|b+r@GBB%J?3D~#M3kY|MAd_H7#W$R0v$h9X8BmU2IuV zG8=1WQB42I+2t>^PM5}!)pw{prO|p{KY8hKtAHaKhNDQv=^%)$w8s|5DSjkdPh`%i PlaT`w$SwNb>;3RQ@!*bM diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin index ec100c779..96b5a2fd5 100644 --- a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin +++ b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_csm.bin @@ -2,7 +2,6 @@ FSHF uniform sampler2D u_shadowMap2; uniform sampler2D u_shadowMap1; uniform sampler2D u_shadowMap0; -uniform vec4 u_csmFarDistances; uniform vec4 u_lightAttenuationSpotOuter; uniform vec4 u_lightSpotDirectionInner; uniform vec4 u_lightSpecularPower; @@ -20,174 +19,288 @@ varying vec4 v_texcoord4; varying vec4 v_texcoord3; varying vec4 v_texcoord2; varying vec4 v_texcoord1; -varying vec4 v_position; varying vec3 v_normal; void main () { float visibility_1; vec3 colorCoverage_2; - visibility_1 = 1.0; - if ((v_position.z < u_csmFarDistances.x)) { - vec2 tmpvar_3; - tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); - float tmpvar_4; - tmpvar_4 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_3, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_3, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_5; - tmpvar_5.x = -(tmpvar_4); - tmpvar_5.y = tmpvar_4; - tmpvar_5.z = -(tmpvar_4); - colorCoverage_2 = tmpvar_5; - float tmpvar_6; - float tmpvar_7; - tmpvar_7 = (((v_texcoord1.z - u_params1.x) / v_texcoord1.w) * u_params1.w); - vec2 tmpvar_8; - tmpvar_8 = (v_texcoord1.xy / v_texcoord1.w); - vec4 tmpvar_9; - tmpvar_9 = texture2D (u_shadowMap0, tmpvar_8); - vec2 tmpvar_10; - tmpvar_10.x = dot (tmpvar_9.xy, vec2(0.00390625, 1.0)); - tmpvar_10.y = dot (tmpvar_9.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_11; - tmpvar_11 = (tmpvar_10 * u_params1.w); - if ((tmpvar_7 < tmpvar_11.x)) { - tmpvar_6 = 1.0; - } else { - float tmpvar_12; - tmpvar_12 = max ((tmpvar_11.y - (tmpvar_11.x * tmpvar_11.x)), u_params1.z); - float tmpvar_13; - tmpvar_13 = (tmpvar_7 - tmpvar_11.x); - tmpvar_6 = mix ((tmpvar_12 / (tmpvar_12 + (tmpvar_13 * tmpvar_13))), 1.0, float(any(greaterThan (tmpvar_8, vec2(0.95, 0.95))))); - }; - visibility_1 = tmpvar_6; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); } else { - if ((v_position.z < u_csmFarDistances.y)) { - vec2 tmpvar_14; - tmpvar_14 = (v_texcoord2.xy / v_texcoord2.w); - float tmpvar_15; - tmpvar_15 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_14, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_14, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_16; - tmpvar_16.x = tmpvar_15; - tmpvar_16.y = tmpvar_15; - tmpvar_16.z = -(tmpvar_15); - colorCoverage_2 = tmpvar_16; - float tmpvar_17; - float tmpvar_18; - tmpvar_18 = (((v_texcoord2.z - u_params1.x) / v_texcoord2.w) * u_params1.w); - vec2 tmpvar_19; - tmpvar_19 = (v_texcoord2.xy / v_texcoord2.w); - vec4 tmpvar_20; - tmpvar_20 = texture2D (u_shadowMap1, tmpvar_19); - vec2 tmpvar_21; - tmpvar_21.x = dot (tmpvar_20.xy, vec2(0.00390625, 1.0)); - tmpvar_21.y = dot (tmpvar_20.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_22; - tmpvar_22 = (tmpvar_21 * u_params1.w); - if ((tmpvar_18 < tmpvar_22.x)) { - tmpvar_17 = 1.0; - } else { - float tmpvar_23; - tmpvar_23 = max ((tmpvar_22.y - (tmpvar_22.x * tmpvar_22.x)), u_params1.z); - float tmpvar_24; - tmpvar_24 = (tmpvar_18 - tmpvar_22.x); - tmpvar_17 = mix ((tmpvar_23 / (tmpvar_23 + (tmpvar_24 * tmpvar_24))), 1.0, float(any(greaterThan (tmpvar_19, vec2(0.95, 0.95))))); - }; - visibility_1 = tmpvar_17; + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); } else { - if ((v_position.z < u_csmFarDistances.z)) { - vec2 tmpvar_25; - tmpvar_25 = (v_texcoord3.xy / v_texcoord3.w); - float tmpvar_26; - tmpvar_26 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_25, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_25, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_27; - tmpvar_27.x = -(tmpvar_26); - tmpvar_27.y = -(tmpvar_26); - tmpvar_27.z = tmpvar_26; - colorCoverage_2 = tmpvar_27; - float tmpvar_28; - float tmpvar_29; - tmpvar_29 = (((v_texcoord3.z - u_params1.x) / v_texcoord3.w) * u_params1.w); - vec2 tmpvar_30; - tmpvar_30 = (v_texcoord3.xy / v_texcoord3.w); - vec4 tmpvar_31; - tmpvar_31 = texture2D (u_shadowMap2, tmpvar_30); - vec2 tmpvar_32; - tmpvar_32.x = dot (tmpvar_31.xy, vec2(0.00390625, 1.0)); - tmpvar_32.y = dot (tmpvar_31.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_33; - tmpvar_33 = (tmpvar_32 * u_params1.w); - if ((tmpvar_29 < tmpvar_33.x)) { - tmpvar_28 = 1.0; - } else { - float tmpvar_34; - tmpvar_34 = max ((tmpvar_33.y - (tmpvar_33.x * tmpvar_33.x)), u_params1.z); - float tmpvar_35; - tmpvar_35 = (tmpvar_29 - tmpvar_33.x); - tmpvar_28 = mix ((tmpvar_34 / (tmpvar_34 + (tmpvar_35 * tmpvar_35))), 1.0, float(any(greaterThan (tmpvar_30, vec2(0.95, 0.95))))); - }; - visibility_1 = tmpvar_28; + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + float tmpvar_21; + vec2 tmpvar_22; + tmpvar_22 = (v_texcoord1.xy / v_texcoord1.w); + bool tmpvar_23; + if (any(greaterThan (tmpvar_22, vec2(1.0, 1.0)))) { + tmpvar_23 = bool(1); + } else { + tmpvar_23 = any(lessThan (tmpvar_22, vec2(0.0, 0.0))); + }; + if (tmpvar_23) { + tmpvar_21 = 1.0; + } else { + float tmpvar_24; + tmpvar_24 = (((v_texcoord1.z - u_params1.x) / v_texcoord1.w) * u_params1.w); + vec4 tmpvar_25; + tmpvar_25 = texture2D (u_shadowMap0, tmpvar_22); + vec2 tmpvar_26; + tmpvar_26.x = dot (tmpvar_25.xy, vec2(0.00390625, 1.0)); + tmpvar_26.y = dot (tmpvar_25.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_27; + tmpvar_27 = (tmpvar_26 * u_params1.w); + if ((tmpvar_24 < tmpvar_27.x)) { + tmpvar_21 = 1.0; + } else { + float tmpvar_28; + tmpvar_28 = max ((tmpvar_27.y - (tmpvar_27.x * tmpvar_27.x)), u_params1.z); + float tmpvar_29; + tmpvar_29 = (tmpvar_24 - tmpvar_27.x); + tmpvar_21 = (tmpvar_28 / (tmpvar_28 + (tmpvar_29 * tmpvar_29))); + }; + }; + visibility_1 = tmpvar_21; + } else { + if (tmpvar_10) { + vec2 _texcoord_30; + _texcoord_30 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_31; + tmpvar_31 = greaterThan (_texcoord_30, vec2(0.0, 0.0)); + bool tmpvar_32; + if ((tmpvar_31.x && tmpvar_31.y)) { + bvec2 tmpvar_33; + tmpvar_33 = lessThan (_texcoord_30, vec2(1.0, 1.0)); + tmpvar_32 = (tmpvar_33.x && tmpvar_33.y); + } else { + tmpvar_32 = bool(0); + }; + float tmpvar_34; + tmpvar_34 = (float(tmpvar_32) * 0.4); + vec3 tmpvar_35; + tmpvar_35.x = tmpvar_34; + tmpvar_35.y = tmpvar_34; + tmpvar_35.z = -(tmpvar_34); + colorCoverage_2 = tmpvar_35; + float tmpvar_36; + vec2 tmpvar_37; + tmpvar_37 = (v_texcoord2.xy / v_texcoord2.w); + bool tmpvar_38; + if (any(greaterThan (tmpvar_37, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_37, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_36 = 1.0; } else { - vec2 tmpvar_36; - tmpvar_36 = (v_texcoord4.xy / v_texcoord4.w); - float tmpvar_37; - tmpvar_37 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_36, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_38; - tmpvar_38.x = tmpvar_37; - tmpvar_38.y = -(tmpvar_37); - tmpvar_38.z = -(tmpvar_37); - colorCoverage_2 = tmpvar_38; float tmpvar_39; - float tmpvar_40; - tmpvar_40 = (((v_texcoord4.z - u_params1.x) / v_texcoord4.w) * u_params1.w); + tmpvar_39 = (((v_texcoord2.z - u_params1.x) / v_texcoord2.w) * u_params1.w); + vec4 tmpvar_40; + tmpvar_40 = texture2D (u_shadowMap1, tmpvar_37); vec2 tmpvar_41; - tmpvar_41 = (v_texcoord4.xy / v_texcoord4.w); - vec4 tmpvar_42; - tmpvar_42 = texture2D (u_shadowMap3, tmpvar_41); - vec2 tmpvar_43; - tmpvar_43.x = dot (tmpvar_42.xy, vec2(0.00390625, 1.0)); - tmpvar_43.y = dot (tmpvar_42.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_44; - tmpvar_44 = (tmpvar_43 * u_params1.w); - if ((tmpvar_40 < tmpvar_44.x)) { - tmpvar_39 = 1.0; + tmpvar_41.x = dot (tmpvar_40.xy, vec2(0.00390625, 1.0)); + tmpvar_41.y = dot (tmpvar_40.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_42; + tmpvar_42 = (tmpvar_41 * u_params1.w); + if ((tmpvar_39 < tmpvar_42.x)) { + tmpvar_36 = 1.0; } else { - float tmpvar_45; - tmpvar_45 = max ((tmpvar_44.y - (tmpvar_44.x * tmpvar_44.x)), u_params1.z); - float tmpvar_46; - tmpvar_46 = (tmpvar_40 - tmpvar_44.x); - tmpvar_39 = mix ((tmpvar_45 / (tmpvar_45 + (tmpvar_46 * tmpvar_46))), 1.0, float(any(greaterThan (tmpvar_41, vec2(0.95, 0.95))))); + float tmpvar_43; + tmpvar_43 = max ((tmpvar_42.y - (tmpvar_42.x * tmpvar_42.x)), u_params1.z); + float tmpvar_44; + tmpvar_44 = (tmpvar_39 - tmpvar_42.x); + tmpvar_36 = (tmpvar_43 / (tmpvar_43 + (tmpvar_44 * tmpvar_44))); }; - visibility_1 = tmpvar_39; + }; + visibility_1 = tmpvar_36; + } else { + if (tmpvar_13) { + vec2 _texcoord_45; + _texcoord_45 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_46; + tmpvar_46 = greaterThan (_texcoord_45, vec2(0.0, 0.0)); + bool tmpvar_47; + if ((tmpvar_46.x && tmpvar_46.y)) { + bvec2 tmpvar_48; + tmpvar_48 = lessThan (_texcoord_45, vec2(1.0, 1.0)); + tmpvar_47 = (tmpvar_48.x && tmpvar_48.y); + } else { + tmpvar_47 = bool(0); + }; + float tmpvar_49; + tmpvar_49 = (float(tmpvar_47) * 0.4); + vec3 tmpvar_50; + tmpvar_50.x = -(tmpvar_49); + tmpvar_50.y = -(tmpvar_49); + tmpvar_50.z = tmpvar_49; + colorCoverage_2 = tmpvar_50; + float tmpvar_51; + vec2 tmpvar_52; + tmpvar_52 = (v_texcoord3.xy / v_texcoord3.w); + bool tmpvar_53; + if (any(greaterThan (tmpvar_52, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_52, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_51 = 1.0; + } else { + float tmpvar_54; + tmpvar_54 = (((v_texcoord3.z - u_params1.x) / v_texcoord3.w) * u_params1.w); + vec4 tmpvar_55; + tmpvar_55 = texture2D (u_shadowMap2, tmpvar_52); + vec2 tmpvar_56; + tmpvar_56.x = dot (tmpvar_55.xy, vec2(0.00390625, 1.0)); + tmpvar_56.y = dot (tmpvar_55.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_57; + tmpvar_57 = (tmpvar_56 * u_params1.w); + if ((tmpvar_54 < tmpvar_57.x)) { + tmpvar_51 = 1.0; + } else { + float tmpvar_58; + tmpvar_58 = max ((tmpvar_57.y - (tmpvar_57.x * tmpvar_57.x)), u_params1.z); + float tmpvar_59; + tmpvar_59 = (tmpvar_54 - tmpvar_57.x); + tmpvar_51 = (tmpvar_58 / (tmpvar_58 + (tmpvar_59 * tmpvar_59))); + }; + }; + visibility_1 = tmpvar_51; + } else { + vec2 _texcoord_60; + _texcoord_60 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_61; + tmpvar_61 = greaterThan (_texcoord_60, vec2(0.0, 0.0)); + bool tmpvar_62; + if ((tmpvar_61.x && tmpvar_61.y)) { + bvec2 tmpvar_63; + tmpvar_63 = lessThan (_texcoord_60, vec2(1.0, 1.0)); + tmpvar_62 = (tmpvar_63.x && tmpvar_63.y); + } else { + tmpvar_62 = bool(0); + }; + float tmpvar_64; + tmpvar_64 = (float(tmpvar_62) * 0.4); + vec3 tmpvar_65; + tmpvar_65.x = tmpvar_64; + tmpvar_65.y = -(tmpvar_64); + tmpvar_65.z = -(tmpvar_64); + colorCoverage_2 = tmpvar_65; + float tmpvar_66; + vec2 tmpvar_67; + tmpvar_67 = (v_texcoord4.xy / v_texcoord4.w); + bool tmpvar_68; + if (any(greaterThan (tmpvar_67, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_67, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_66 = 1.0; + } else { + float tmpvar_69; + tmpvar_69 = (((v_texcoord4.z - u_params1.x) / v_texcoord4.w) * u_params1.w); + vec4 tmpvar_70; + tmpvar_70 = texture2D (u_shadowMap3, tmpvar_67); + vec2 tmpvar_71; + tmpvar_71.x = dot (tmpvar_70.xy, vec2(0.00390625, 1.0)); + tmpvar_71.y = dot (tmpvar_70.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_72; + tmpvar_72 = (tmpvar_71 * u_params1.w); + if ((tmpvar_69 < tmpvar_72.x)) { + tmpvar_66 = 1.0; + } else { + float tmpvar_73; + tmpvar_73 = max ((tmpvar_72.y - (tmpvar_72.x * tmpvar_72.x)), u_params1.z); + float tmpvar_74; + tmpvar_74 = (tmpvar_69 - tmpvar_72.x); + tmpvar_66 = (tmpvar_73 / (tmpvar_73 + (tmpvar_74 * tmpvar_74))); + }; + }; + visibility_1 = tmpvar_66; }; }; }; - vec3 tmpvar_47; - tmpvar_47 = -(normalize(v_view)); - vec3 tmpvar_48; - float tmpvar_49; - tmpvar_48 = -(normalize(u_lightPosition.xyz)); - tmpvar_49 = 1.0; + vec3 tmpvar_75; + tmpvar_75 = -(normalize(v_view)); + vec3 tmpvar_76; + float tmpvar_77; + tmpvar_76 = -(normalize(u_lightPosition.xyz)); + tmpvar_77 = 1.0; if ((0.0 != u_lightPosition.w)) { - vec3 tmpvar_50; - tmpvar_50 = (u_lightPosition.xyz - v_view); - vec3 tmpvar_51; - tmpvar_51 = normalize(tmpvar_50); - tmpvar_48 = tmpvar_51; - float tmpvar_52; - tmpvar_52 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); - float tmpvar_53; - tmpvar_53 = sqrt(dot (tmpvar_50, tmpvar_50)); - tmpvar_49 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_53)) + ((u_lightAttenuationSpotOuter.z * tmpvar_53) * tmpvar_53)))) * mix (clamp (((max (0.0, dot (-(tmpvar_51), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_52) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_52)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + vec3 tmpvar_78; + tmpvar_78 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_79; + tmpvar_79 = normalize(tmpvar_78); + tmpvar_76 = tmpvar_79; + float tmpvar_80; + tmpvar_80 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_81; + tmpvar_81 = sqrt(dot (tmpvar_78, tmpvar_78)); + tmpvar_77 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_81)) + ((u_lightAttenuationSpotOuter.z * tmpvar_81) * tmpvar_81)))) * mix (clamp (((max (0.0, dot (-(tmpvar_79), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_80) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_80)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); }; - float tmpvar_54; - tmpvar_54 = dot (v_normal, tmpvar_48); - vec2 tmpvar_55; - tmpvar_55.x = tmpvar_54; - tmpvar_55.y = (((float((tmpvar_54 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_54) * v_normal) - tmpvar_48), tmpvar_47)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); - vec2 tmpvar_56; - tmpvar_56 = (max (tmpvar_55, 0.0) * tmpvar_49); - float tmpvar_57; - tmpvar_57 = sqrt(dot (v_view, v_view)); - gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_56.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_56.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_57) * tmpvar_57)))), 0.0, 1.0)); + float tmpvar_82; + tmpvar_82 = dot (v_normal, tmpvar_76); + vec2 tmpvar_83; + tmpvar_83.x = tmpvar_82; + tmpvar_83.y = (((float((tmpvar_82 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_82) * v_normal) - tmpvar_76), tmpvar_75)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_84; + tmpvar_84 = (max (tmpvar_83, 0.0) * tmpvar_77); + float tmpvar_85; + tmpvar_85 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_84.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_84.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_85) * tmpvar_85)))), 0.0, 1.0)); gl_FragColor.w = 1.0; } diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear.bin index 28667a5aa8849b70829be96c986a56758b69c5d6..a423285fbf5751e5b2ce8d9bad3adcc5fad1ede9 100644 GIT binary patch literal 3946 zcma)9+iu%N5N+QIeZ}@AARAfXE_Jbxxw_>|!p0kH)_gA(_J`T+NOTHZA zsw|$K+fQwqueVuSRO`D<)&9M0^ZIQ`y1p&yd`Yr@tk>t|^5wS7>aW%AoXBnQ__%HI z3lg7J_eH*LFGzf?nu0tzadwp^^-uhQ}MERDe_(LaEymtb(U3C!=s+U8l}uiJg$ldvC4|Ih~mMwfgnI7 z7Hz&~y#-7O|0r%m6d;fG2k{{^HrmCcb_JjA8&r$J0Al7#pCO2Q(Y)AdH*@&rtpU-x1pEjLn8! zbR^UuDcAIb(q^2Q(*vq}wmw8b|5)7pLHCcVpX~-MG>5-j40*O*BtkY^gPa<04eDx2 zz8Nc~2le^dr7q}@AY#d>wVfanN^Ni2j^YZWp=n^Wr`B-CZti%7Z3!h$umhC<#dNpZ zItPVEK8FuYre_#x4olO44npz}J1E6H_fWMqY$>7XMmS05$y80=nk0!qg(p4bqDg85C5G%ubo#bX^9gS5TFdv}<4j!j}ifUg9` ze|!d#J_X4s3|vLso25AB=v;a&bqIkL(@NO-JnhE$Sr15W6XvCi9y@lZM!_o;*BH|& ze!f9Mc?+?6@I^Co;0_auD;|wM<|0&uNn}??)Fsx(P~qq*8eNwN z{SaMtW-riL7nVUxg&hN>P#%b1ls^XY!2!LB^QyquElVt^K#F(>nX5TA`x;b9JoE~r zJv?1PyH<KiTtq51B16y`0 zTT1S+cc|E=+KGOlprSCtt~YoIGQN5BkTYb(wBPN3-cH&99Qgdt<7pA2#}twC((In*^1%EA{JO@WXeeWX*d3 literal 3689 zcmb7H+iu%N5N+QIeZ}^TOl+CEq+|)H3j{TS6h+Yh?z_Osw9SGNRg$^}{`Z`jy>OR` z4Ag#+c6MgYoVl$&J$(N0r_H~gx9jq$ZdRhrSDUJ6)V-U%GN%K0R&Q z;*A?0SO1j7x_jfsm%1$p$r;#Hju6Vc`lAg*DI#{F$IGHT5D`zyx~k7P+2l>WYSr0o zeJ($Yc6oCw*UtiMr((C*mBl_d%y6i)v#jd|hz1I4q%yB?T$hhxm6vM~#iOqyp$&Gc z4el@CCp-Y4@F1mwr>f37v8;DRlRp=W%v{QZF*Bh9`+2+^^k}D!97Vq#m zTHcq#3JoU(!jt>a7k30|&xz|xI^jVyaiN!Oi@8{MtcFUJ_@sy_mDWl4Z*`lvA zBOP5A2JPIlG89iqPMXeP~mTaJp!!t077`W2jRLiTIKl0t-_&Q+m4hHE!3yS(0RULbe+XWyalOZ%p7zIlCYwY zcv*FS<)q(Ra>&y)jh=+D$#-k%Y6F|q{kg!d?7sEWEsuUWyFO7^+ zYoU4Rn1LSS`j)1mw_;oD0@7kj@6RPSVg`B$E=EBgn?Ew;6s%}$Havk5Dv z`z|rw6N2gpI<{?n$)1dPxO3kiHGJP<{<9^t7)XW|A3eAdYruCvt=~I%*mzH;&_gI1 zx@fskdRE}($Zo=t<2?}`@fxu7(L9U>OP;2#UCR>SnJx3kG3y=)bT0|%ZxK0%!LB%T z+or&46q)ItqpomJz#6Mx2g-kasDx`gn2vL3xt*RQ={%V#6bEf&pI@j_4-8aKm<{BO zM$@@!fP>e9;YZO@v0bF7KYC*H!-scY&*m?-N)<6@SD%&BrZzkCRTNcQnAI30NQEm% zQAP4pbvPs<#1qJ21Xr#*v|s8=o3RtKGgwF}Tu6$m(!!ke^N`Ky-D{;31kZd2K+%A< zXcTP}`z7^&VcB3_AbdMd|M%mK1390o%Ac!>=4!uM_3Ht-_ufR$)#4K##lO)bpIgqv zgDOb%>Ozt5dk=Uco|ch~NOB4A?*rX{v_7qnLN}48x@)|PE<=*%rg4@{=%1VoKcRSf zBBx&EDKt8OdGFzys5opCaAf0jn#oCVolHF9d6e6XWVD~W$1HOiFyej-ypBdcd;``s Bg;f9m diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin index 61d1a468d..a0c7d2394 100644 --- a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin +++ b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_csm.bin @@ -2,7 +2,6 @@ FSHF uniform sampler2D u_shadowMap2; uniform sampler2D u_shadowMap1; uniform sampler2D u_shadowMap0; -uniform vec4 u_csmFarDistances; uniform vec4 u_lightAttenuationSpotOuter; uniform vec4 u_lightSpotDirectionInner; uniform vec4 u_lightSpecularPower; @@ -20,182 +19,296 @@ varying vec4 v_texcoord4; varying vec4 v_texcoord3; varying vec4 v_texcoord2; varying vec4 v_texcoord1; -varying vec4 v_position; varying vec3 v_normal; void main () { float visibility_1; vec3 colorCoverage_2; - visibility_1 = 1.0; - if ((v_position.z < u_csmFarDistances.x)) { - vec2 tmpvar_3; - tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); - float tmpvar_4; - tmpvar_4 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_3, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_3, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_5; - tmpvar_5.x = -(tmpvar_4); - tmpvar_5.y = tmpvar_4; - tmpvar_5.z = -(tmpvar_4); - colorCoverage_2 = tmpvar_5; - vec4 tmpvar_6; - tmpvar_6.w = 1.0; - tmpvar_6.xy = (v_texcoord1.xy / v_texcoord1.w); - tmpvar_6.z = v_texcoord1.z; - float tmpvar_7; - float tmpvar_8; - tmpvar_8 = ((v_texcoord1.z - u_params1.x) * u_params1.w); - vec4 tmpvar_9; - tmpvar_9 = texture2D (u_shadowMap0, tmpvar_6.xy); - vec2 tmpvar_10; - tmpvar_10.x = dot (tmpvar_9.xy, vec2(0.00390625, 1.0)); - tmpvar_10.y = dot (tmpvar_9.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_11; - tmpvar_11 = (tmpvar_10 * u_params1.w); - if ((tmpvar_8 < tmpvar_11.x)) { - tmpvar_7 = 1.0; - } else { - float tmpvar_12; - tmpvar_12 = max ((tmpvar_11.y - (tmpvar_11.x * tmpvar_11.x)), u_params1.z); - float tmpvar_13; - tmpvar_13 = (tmpvar_8 - tmpvar_11.x); - tmpvar_7 = mix ((tmpvar_12 / (tmpvar_12 + (tmpvar_13 * tmpvar_13))), 1.0, float(any(greaterThan (tmpvar_6.xy, vec2(0.95, 0.95))))); - }; - visibility_1 = tmpvar_7; + vec2 tmpvar_3; + tmpvar_3 = (v_texcoord1.xy / v_texcoord1.w); + vec2 tmpvar_4; + tmpvar_4 = (v_texcoord2.xy / v_texcoord2.w); + vec2 tmpvar_5; + tmpvar_5 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_6; + tmpvar_6 = lessThan (tmpvar_3, vec2(0.99, 0.99)); + bool tmpvar_7; + if ((tmpvar_6.x && tmpvar_6.y)) { + bvec2 tmpvar_8; + tmpvar_8 = greaterThan (tmpvar_3, vec2(0.01, 0.01)); + tmpvar_7 = (tmpvar_8.x && tmpvar_8.y); } else { - if ((v_position.z < u_csmFarDistances.y)) { - vec2 tmpvar_14; - tmpvar_14 = (v_texcoord2.xy / v_texcoord2.w); - float tmpvar_15; - tmpvar_15 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_14, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_14, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_16; - tmpvar_16.x = tmpvar_15; - tmpvar_16.y = tmpvar_15; - tmpvar_16.z = -(tmpvar_15); - colorCoverage_2 = tmpvar_16; - vec4 tmpvar_17; - tmpvar_17.w = 1.0; - tmpvar_17.xy = (v_texcoord2.xy / v_texcoord2.w); - tmpvar_17.z = v_texcoord2.z; - float tmpvar_18; - float tmpvar_19; - tmpvar_19 = ((v_texcoord2.z - u_params1.x) * u_params1.w); - vec4 tmpvar_20; - tmpvar_20 = texture2D (u_shadowMap1, tmpvar_17.xy); - vec2 tmpvar_21; - tmpvar_21.x = dot (tmpvar_20.xy, vec2(0.00390625, 1.0)); - tmpvar_21.y = dot (tmpvar_20.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_22; - tmpvar_22 = (tmpvar_21 * u_params1.w); - if ((tmpvar_19 < tmpvar_22.x)) { - tmpvar_18 = 1.0; - } else { - float tmpvar_23; - tmpvar_23 = max ((tmpvar_22.y - (tmpvar_22.x * tmpvar_22.x)), u_params1.z); - float tmpvar_24; - tmpvar_24 = (tmpvar_19 - tmpvar_22.x); - tmpvar_18 = mix ((tmpvar_23 / (tmpvar_23 + (tmpvar_24 * tmpvar_24))), 1.0, float(any(greaterThan (tmpvar_17.xy, vec2(0.95, 0.95))))); - }; - visibility_1 = tmpvar_18; + tmpvar_7 = bool(0); + }; + bvec2 tmpvar_9; + tmpvar_9 = lessThan (tmpvar_4, vec2(0.99, 0.99)); + bool tmpvar_10; + if ((tmpvar_9.x && tmpvar_9.y)) { + bvec2 tmpvar_11; + tmpvar_11 = greaterThan (tmpvar_4, vec2(0.01, 0.01)); + tmpvar_10 = (tmpvar_11.x && tmpvar_11.y); + } else { + tmpvar_10 = bool(0); + }; + bvec2 tmpvar_12; + tmpvar_12 = lessThan (tmpvar_5, vec2(0.99, 0.99)); + bool tmpvar_13; + if ((tmpvar_12.x && tmpvar_12.y)) { + bvec2 tmpvar_14; + tmpvar_14 = greaterThan (tmpvar_5, vec2(0.01, 0.01)); + tmpvar_13 = (tmpvar_14.x && tmpvar_14.y); + } else { + tmpvar_13 = bool(0); + }; + if (tmpvar_7) { + vec2 _texcoord_15; + _texcoord_15 = (v_texcoord1.xy / v_texcoord1.w); + bvec2 tmpvar_16; + tmpvar_16 = greaterThan (_texcoord_15, vec2(0.0, 0.0)); + bool tmpvar_17; + if ((tmpvar_16.x && tmpvar_16.y)) { + bvec2 tmpvar_18; + tmpvar_18 = lessThan (_texcoord_15, vec2(1.0, 1.0)); + tmpvar_17 = (tmpvar_18.x && tmpvar_18.y); } else { - if ((v_position.z < u_csmFarDistances.z)) { - vec2 tmpvar_25; - tmpvar_25 = (v_texcoord3.xy / v_texcoord3.w); - float tmpvar_26; - tmpvar_26 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_25, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_25, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_27; - tmpvar_27.x = -(tmpvar_26); - tmpvar_27.y = -(tmpvar_26); - tmpvar_27.z = tmpvar_26; - colorCoverage_2 = tmpvar_27; - vec4 tmpvar_28; - tmpvar_28.w = 1.0; - tmpvar_28.xy = (v_texcoord3.xy / v_texcoord3.w); - tmpvar_28.z = v_texcoord3.z; - float tmpvar_29; - float tmpvar_30; - tmpvar_30 = ((v_texcoord3.z - u_params1.x) * u_params1.w); - vec4 tmpvar_31; - tmpvar_31 = texture2D (u_shadowMap2, tmpvar_28.xy); - vec2 tmpvar_32; - tmpvar_32.x = dot (tmpvar_31.xy, vec2(0.00390625, 1.0)); - tmpvar_32.y = dot (tmpvar_31.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_33; - tmpvar_33 = (tmpvar_32 * u_params1.w); - if ((tmpvar_30 < tmpvar_33.x)) { - tmpvar_29 = 1.0; - } else { - float tmpvar_34; - tmpvar_34 = max ((tmpvar_33.y - (tmpvar_33.x * tmpvar_33.x)), u_params1.z); - float tmpvar_35; - tmpvar_35 = (tmpvar_30 - tmpvar_33.x); - tmpvar_29 = mix ((tmpvar_34 / (tmpvar_34 + (tmpvar_35 * tmpvar_35))), 1.0, float(any(greaterThan (tmpvar_28.xy, vec2(0.95, 0.95))))); - }; - visibility_1 = tmpvar_29; + tmpvar_17 = bool(0); + }; + float tmpvar_19; + tmpvar_19 = (float(tmpvar_17) * 0.4); + vec3 tmpvar_20; + tmpvar_20.x = -(tmpvar_19); + tmpvar_20.y = tmpvar_19; + tmpvar_20.z = -(tmpvar_19); + colorCoverage_2 = tmpvar_20; + vec4 tmpvar_21; + tmpvar_21.w = 1.0; + tmpvar_21.xy = (v_texcoord1.xy / v_texcoord1.w); + tmpvar_21.z = v_texcoord1.z; + float tmpvar_22; + bool tmpvar_23; + if (any(greaterThan (tmpvar_21.xy, vec2(1.0, 1.0)))) { + tmpvar_23 = bool(1); + } else { + tmpvar_23 = any(lessThan (tmpvar_21.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_23) { + tmpvar_22 = 1.0; + } else { + float tmpvar_24; + tmpvar_24 = ((v_texcoord1.z - u_params1.x) * u_params1.w); + vec4 tmpvar_25; + tmpvar_25 = texture2D (u_shadowMap0, tmpvar_21.xy); + vec2 tmpvar_26; + tmpvar_26.x = dot (tmpvar_25.xy, vec2(0.00390625, 1.0)); + tmpvar_26.y = dot (tmpvar_25.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_27; + tmpvar_27 = (tmpvar_26 * u_params1.w); + if ((tmpvar_24 < tmpvar_27.x)) { + tmpvar_22 = 1.0; } else { - vec2 tmpvar_36; - tmpvar_36 = (v_texcoord4.xy / v_texcoord4.w); - float tmpvar_37; - tmpvar_37 = (clamp ((1.0 - (float(any(greaterThan (tmpvar_36, vec2(1.0, 1.0)))) + float(any(lessThan (tmpvar_36, vec2(0.0, 0.0)))))), 0.0, 1.0) * 0.4); - vec3 tmpvar_38; - tmpvar_38.x = tmpvar_37; - tmpvar_38.y = -(tmpvar_37); - tmpvar_38.z = -(tmpvar_37); - colorCoverage_2 = tmpvar_38; - vec4 tmpvar_39; - tmpvar_39.w = 1.0; - tmpvar_39.xy = (v_texcoord4.xy / v_texcoord4.w); - tmpvar_39.z = v_texcoord4.z; - float tmpvar_40; - float tmpvar_41; - tmpvar_41 = ((v_texcoord4.z - u_params1.x) * u_params1.w); - vec4 tmpvar_42; - tmpvar_42 = texture2D (u_shadowMap3, tmpvar_39.xy); - vec2 tmpvar_43; - tmpvar_43.x = dot (tmpvar_42.xy, vec2(0.00390625, 1.0)); - tmpvar_43.y = dot (tmpvar_42.zw, vec2(0.00390625, 1.0)); - vec2 tmpvar_44; - tmpvar_44 = (tmpvar_43 * u_params1.w); - if ((tmpvar_41 < tmpvar_44.x)) { - tmpvar_40 = 1.0; + float tmpvar_28; + tmpvar_28 = max ((tmpvar_27.y - (tmpvar_27.x * tmpvar_27.x)), u_params1.z); + float tmpvar_29; + tmpvar_29 = (tmpvar_24 - tmpvar_27.x); + tmpvar_22 = (tmpvar_28 / (tmpvar_28 + (tmpvar_29 * tmpvar_29))); + }; + }; + visibility_1 = tmpvar_22; + } else { + if (tmpvar_10) { + vec2 _texcoord_30; + _texcoord_30 = (v_texcoord2.xy / v_texcoord2.w); + bvec2 tmpvar_31; + tmpvar_31 = greaterThan (_texcoord_30, vec2(0.0, 0.0)); + bool tmpvar_32; + if ((tmpvar_31.x && tmpvar_31.y)) { + bvec2 tmpvar_33; + tmpvar_33 = lessThan (_texcoord_30, vec2(1.0, 1.0)); + tmpvar_32 = (tmpvar_33.x && tmpvar_33.y); + } else { + tmpvar_32 = bool(0); + }; + float tmpvar_34; + tmpvar_34 = (float(tmpvar_32) * 0.4); + vec3 tmpvar_35; + tmpvar_35.x = tmpvar_34; + tmpvar_35.y = tmpvar_34; + tmpvar_35.z = -(tmpvar_34); + colorCoverage_2 = tmpvar_35; + vec4 tmpvar_36; + tmpvar_36.w = 1.0; + tmpvar_36.xy = (v_texcoord2.xy / v_texcoord2.w); + tmpvar_36.z = v_texcoord2.z; + float tmpvar_37; + bool tmpvar_38; + if (any(greaterThan (tmpvar_36.xy, vec2(1.0, 1.0)))) { + tmpvar_38 = bool(1); + } else { + tmpvar_38 = any(lessThan (tmpvar_36.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_38) { + tmpvar_37 = 1.0; + } else { + float tmpvar_39; + tmpvar_39 = ((v_texcoord2.z - u_params1.x) * u_params1.w); + vec4 tmpvar_40; + tmpvar_40 = texture2D (u_shadowMap1, tmpvar_36.xy); + vec2 tmpvar_41; + tmpvar_41.x = dot (tmpvar_40.xy, vec2(0.00390625, 1.0)); + tmpvar_41.y = dot (tmpvar_40.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_42; + tmpvar_42 = (tmpvar_41 * u_params1.w); + if ((tmpvar_39 < tmpvar_42.x)) { + tmpvar_37 = 1.0; } else { - float tmpvar_45; - tmpvar_45 = max ((tmpvar_44.y - (tmpvar_44.x * tmpvar_44.x)), u_params1.z); - float tmpvar_46; - tmpvar_46 = (tmpvar_41 - tmpvar_44.x); - tmpvar_40 = mix ((tmpvar_45 / (tmpvar_45 + (tmpvar_46 * tmpvar_46))), 1.0, float(any(greaterThan (tmpvar_39.xy, vec2(0.95, 0.95))))); + float tmpvar_43; + tmpvar_43 = max ((tmpvar_42.y - (tmpvar_42.x * tmpvar_42.x)), u_params1.z); + float tmpvar_44; + tmpvar_44 = (tmpvar_39 - tmpvar_42.x); + tmpvar_37 = (tmpvar_43 / (tmpvar_43 + (tmpvar_44 * tmpvar_44))); }; - visibility_1 = tmpvar_40; + }; + visibility_1 = tmpvar_37; + } else { + if (tmpvar_13) { + vec2 _texcoord_45; + _texcoord_45 = (v_texcoord3.xy / v_texcoord3.w); + bvec2 tmpvar_46; + tmpvar_46 = greaterThan (_texcoord_45, vec2(0.0, 0.0)); + bool tmpvar_47; + if ((tmpvar_46.x && tmpvar_46.y)) { + bvec2 tmpvar_48; + tmpvar_48 = lessThan (_texcoord_45, vec2(1.0, 1.0)); + tmpvar_47 = (tmpvar_48.x && tmpvar_48.y); + } else { + tmpvar_47 = bool(0); + }; + float tmpvar_49; + tmpvar_49 = (float(tmpvar_47) * 0.4); + vec3 tmpvar_50; + tmpvar_50.x = -(tmpvar_49); + tmpvar_50.y = -(tmpvar_49); + tmpvar_50.z = tmpvar_49; + colorCoverage_2 = tmpvar_50; + vec4 tmpvar_51; + tmpvar_51.w = 1.0; + tmpvar_51.xy = (v_texcoord3.xy / v_texcoord3.w); + tmpvar_51.z = v_texcoord3.z; + float tmpvar_52; + bool tmpvar_53; + if (any(greaterThan (tmpvar_51.xy, vec2(1.0, 1.0)))) { + tmpvar_53 = bool(1); + } else { + tmpvar_53 = any(lessThan (tmpvar_51.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_53) { + tmpvar_52 = 1.0; + } else { + float tmpvar_54; + tmpvar_54 = ((v_texcoord3.z - u_params1.x) * u_params1.w); + vec4 tmpvar_55; + tmpvar_55 = texture2D (u_shadowMap2, tmpvar_51.xy); + vec2 tmpvar_56; + tmpvar_56.x = dot (tmpvar_55.xy, vec2(0.00390625, 1.0)); + tmpvar_56.y = dot (tmpvar_55.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_57; + tmpvar_57 = (tmpvar_56 * u_params1.w); + if ((tmpvar_54 < tmpvar_57.x)) { + tmpvar_52 = 1.0; + } else { + float tmpvar_58; + tmpvar_58 = max ((tmpvar_57.y - (tmpvar_57.x * tmpvar_57.x)), u_params1.z); + float tmpvar_59; + tmpvar_59 = (tmpvar_54 - tmpvar_57.x); + tmpvar_52 = (tmpvar_58 / (tmpvar_58 + (tmpvar_59 * tmpvar_59))); + }; + }; + visibility_1 = tmpvar_52; + } else { + vec2 _texcoord_60; + _texcoord_60 = (v_texcoord4.xy / v_texcoord4.w); + bvec2 tmpvar_61; + tmpvar_61 = greaterThan (_texcoord_60, vec2(0.0, 0.0)); + bool tmpvar_62; + if ((tmpvar_61.x && tmpvar_61.y)) { + bvec2 tmpvar_63; + tmpvar_63 = lessThan (_texcoord_60, vec2(1.0, 1.0)); + tmpvar_62 = (tmpvar_63.x && tmpvar_63.y); + } else { + tmpvar_62 = bool(0); + }; + float tmpvar_64; + tmpvar_64 = (float(tmpvar_62) * 0.4); + vec3 tmpvar_65; + tmpvar_65.x = tmpvar_64; + tmpvar_65.y = -(tmpvar_64); + tmpvar_65.z = -(tmpvar_64); + colorCoverage_2 = tmpvar_65; + vec4 tmpvar_66; + tmpvar_66.w = 1.0; + tmpvar_66.xy = (v_texcoord4.xy / v_texcoord4.w); + tmpvar_66.z = v_texcoord4.z; + float tmpvar_67; + bool tmpvar_68; + if (any(greaterThan (tmpvar_66.xy, vec2(1.0, 1.0)))) { + tmpvar_68 = bool(1); + } else { + tmpvar_68 = any(lessThan (tmpvar_66.xy, vec2(0.0, 0.0))); + }; + if (tmpvar_68) { + tmpvar_67 = 1.0; + } else { + float tmpvar_69; + tmpvar_69 = ((v_texcoord4.z - u_params1.x) * u_params1.w); + vec4 tmpvar_70; + tmpvar_70 = texture2D (u_shadowMap3, tmpvar_66.xy); + vec2 tmpvar_71; + tmpvar_71.x = dot (tmpvar_70.xy, vec2(0.00390625, 1.0)); + tmpvar_71.y = dot (tmpvar_70.zw, vec2(0.00390625, 1.0)); + vec2 tmpvar_72; + tmpvar_72 = (tmpvar_71 * u_params1.w); + if ((tmpvar_69 < tmpvar_72.x)) { + tmpvar_67 = 1.0; + } else { + float tmpvar_73; + tmpvar_73 = max ((tmpvar_72.y - (tmpvar_72.x * tmpvar_72.x)), u_params1.z); + float tmpvar_74; + tmpvar_74 = (tmpvar_69 - tmpvar_72.x); + tmpvar_67 = (tmpvar_73 / (tmpvar_73 + (tmpvar_74 * tmpvar_74))); + }; + }; + visibility_1 = tmpvar_67; }; }; }; - vec3 tmpvar_47; - tmpvar_47 = -(normalize(v_view)); - vec3 tmpvar_48; - float tmpvar_49; - tmpvar_48 = -(normalize(u_lightPosition.xyz)); - tmpvar_49 = 1.0; + vec3 tmpvar_75; + tmpvar_75 = -(normalize(v_view)); + vec3 tmpvar_76; + float tmpvar_77; + tmpvar_76 = -(normalize(u_lightPosition.xyz)); + tmpvar_77 = 1.0; if ((0.0 != u_lightPosition.w)) { - vec3 tmpvar_50; - tmpvar_50 = (u_lightPosition.xyz - v_view); - vec3 tmpvar_51; - tmpvar_51 = normalize(tmpvar_50); - tmpvar_48 = tmpvar_51; - float tmpvar_52; - tmpvar_52 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); - float tmpvar_53; - tmpvar_53 = sqrt(dot (tmpvar_50, tmpvar_50)); - tmpvar_49 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_53)) + ((u_lightAttenuationSpotOuter.z * tmpvar_53) * tmpvar_53)))) * mix (clamp (((max (0.0, dot (-(tmpvar_51), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_52) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_52)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); + vec3 tmpvar_78; + tmpvar_78 = (u_lightPosition.xyz - v_view); + vec3 tmpvar_79; + tmpvar_79 = normalize(tmpvar_78); + tmpvar_76 = tmpvar_79; + float tmpvar_80; + tmpvar_80 = cos((u_lightAttenuationSpotOuter.w * 0.0174533)); + float tmpvar_81; + tmpvar_81 = sqrt(dot (tmpvar_78, tmpvar_78)); + tmpvar_77 = ((1.0/(((u_lightAttenuationSpotOuter.x + (u_lightAttenuationSpotOuter.y * tmpvar_81)) + ((u_lightAttenuationSpotOuter.z * tmpvar_81) * tmpvar_81)))) * mix (clamp (((max (0.0, dot (-(tmpvar_79), normalize(u_lightSpotDirectionInner.xyz))) - tmpvar_80) / (cos((min (u_lightSpotDirectionInner.w, (u_lightAttenuationSpotOuter.w - 0.001)) * 0.0174533)) - tmpvar_80)), 0.0, 1.0), 1.0, float((u_lightAttenuationSpotOuter.w >= 90.0)))); }; - float tmpvar_54; - tmpvar_54 = dot (v_normal, tmpvar_48); - vec2 tmpvar_55; - tmpvar_55.x = tmpvar_54; - tmpvar_55.y = (((float((tmpvar_54 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_54) * v_normal) - tmpvar_48), tmpvar_47)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); - vec2 tmpvar_56; - tmpvar_56 = (max (tmpvar_55, 0.0) * tmpvar_49); - float tmpvar_57; - tmpvar_57 = sqrt(dot (v_view, v_view)); - gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_56.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_56.y)) * u_color.xyz) * visibility_1)), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((4.36415e-05 * tmpvar_57) * tmpvar_57)))), 0.0, 1.0)); + float tmpvar_82; + tmpvar_82 = dot (v_normal, tmpvar_76); + vec2 tmpvar_83; + tmpvar_83.x = tmpvar_82; + tmpvar_83.y = (((float((tmpvar_82 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_82) * v_normal) - tmpvar_76), tmpvar_75)), u_materialKs.w)) * (2.0 + u_materialKs.w)) / 8.0); + vec2 tmpvar_84; + tmpvar_84 = (max (tmpvar_83, 0.0) * tmpvar_77); + float tmpvar_85; + tmpvar_85 = sqrt(dot (v_view, v_view)); + gl_FragColor.xyz = mix (vec3(0.0, 0.0, 0.0), (pow (abs(((((u_lightAmbientPower.xyz * u_lightAmbientPower.w) * u_materialKa) * u_color.xyz) + ((((((u_lightDiffusePower.xyz * u_lightDiffusePower.w) * u_materialKd) * tmpvar_84.x) + (((u_lightSpecularPower.xyz * u_lightSpecularPower.w) * u_materialKs.xyz) * tmpvar_84.y)) * u_color.xyz) * visibility_1))), vec3(0.454545, 0.454545, 0.454545)) + (colorCoverage_2 * u_params2.y)), clamp ((1.0/(exp2(((1.7673e-005 * tmpvar_85) * tmpvar_85)))), 0.0, 1.0)); gl_FragColor.w = 1.0; } diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_linear_omni.bin index 2d7695d2eb24f2972a0b3ae4cc47f946371a2a3b..0163c59c16a01cdcf29222fa9e77c73530294a9b 100644 GIT binary patch literal 7045 zcma)B+iu)85N%)m73@o(ZS2j8(%z7|K-wT}QM3)}zVvCKtYt@lcD3D$_Y&lx|IuIQ zKXzuwAvwC$E#O!pXXbF`%n?byyZiCWcYpu;&tY9WRNIx>Wvfk@Z}nSsSnNJ#_to*2 zY%_X&#p6%;GJ&CezTalQf>WR6PL+PRpv=-lv@-N#_WJ?(imqW1NjkR$!9Az?ujMo~q(r zt+HaRqQTXtD}|_2W#~%?7vR*seaM#iU0xa@EC2?*PZZ_p`|2s*W{>#-fGbs-Iy|Xc zbzkjOB=}GCybfRvPv^^^&HmhKZyMlP4lb<@u*05Zerz>|{%yA|t8B0Ks|_T50VP)M zcW|@HPAZ}wjU-(+@^&6v8-x1XOLOjVK&dMpR20>xL;i0ah`~U80!&Jl8K8MyQqifr zS~;>V#<&y}z5t^ru!8!jSD~BXkuWLs0eGbu!NmBn37UYD$8CXP zFAx^ZJyI{;u;tvE_+e}{4pcYAE^3(8+TWX-&|=xG%^DT*G`VS z7u1bFl6CCp8_vNFaI)Po2it&?62R>gcaNsl2Yu8Il&hxPI$*u0wkB!v)CO^q8;rD@ z+Byiv3qzUgpteq)Np0;UMp9c#<%Gw6YC9oAax*~O3$;<(q3fl#CN*`wB(-rH#G>3s zZF2H_Y6p_Ufk}@9we|RasNIwyjY{Du*%Ah{115N0PlM$#l-W?oyAJ1cQ`@1jUorZJ zegJDzS1i&vjx-?d`uGxg_YuX2{kV2 zZMHr~g6Q7$>1>JaspKTs&Pq_6hyq4WM2ClSFpQ^bOANnpr{Yi!5ubCy;?FNo+iem> zRJn4iglvS{vZ$8ii@Jd$ygif;Psl(2$fuI9oQYK+c8byi$MpSSo5Ph399&I3@J{EN z6Rzh_OiMcwG&Z){;~t62bO7d8_?7mGGfL*8i5`o?1U;-|R%IZ+OAU7*feKb39Lisx_oVR?ev&gF(fk)3D>j7}k5^DFP7zB2TCI*Fh=G zeF18y4CDlZEyE)kEa^tLWMSmVxF82;0%zLb;iZ3=2FRuZJ{1bNNL(CJ6%K%#teeQ( z!W5Sr&L?poc zJfwvZ3NX>o!%ibp+H5hlpdNtEBb^Q4A-Eae!A=@;OTJzcRiOzCw4#({ zA3zD6)NQulk0emP}R+^k@0 zGuXRL@OKsIRSwnN?hMAzH6BTDt-%u9aDoj$y9&%=I>!Goi}l~Y1;DHCp8fWUF0ZZ? s>k27fe%feQQ9PVZrb&J?8jXV$&%)&cFA;_7W1^g>xZ7uczPkG2Ka*!xPyhe` literal 6621 zcmcIoUvJws5Z_+&DY!SebsR~Q92;E*bS<(C!?t4C%bpC)VNwCI`X`Fp$0@5*W=>TIh{$3x5ZYS+W%b@MY%gg@m;0V+9OCngCf6w-@I-b zwcch;UaoI8W%J9nQB^-BZokbdwM5z<*6U$9wcHk2^{(6vk-W|C?zXi$LGgO^N3Pb* z35s`Rouej4%C0gnA? zi(qv2;Y?_)o7D#B7a-4HfTR5d(2^Dsp%G6;Ex;#0Stxi2Gu3 z4KaIzse!Hs?GWbyMG8>eY%2v75Q5g0z_AEg#7Dp-E}RsICZGlQL@kpboy@0UGF9i{ zY%HQl8mF@ve57L$PQp;m!)Xk^qe(c@iVGihsEkc50x!WZW;15!SL@jskpGurn&Hk3 z&fF6+Ms}7< z0XYJUhd=aFOAs%>KM94>PtOS2k7IEZQdXU_Ds#ia=^jonY0Q^zC$M6yk61g2+_LMV zKMGaU%3!A#W^kfC^3uZWGXO2_0xkX|pq+vml|}S32A2I7830 zUC2fD0FG3QqMil2D0(*TEX&h?*MT0j1{Zviz-KLBOL;-M;5)Wh`uK}tgIytpA!tw@)s(Pli{AhZ7Dz_3x}Zz`N6zEL2%nR@v1>fogTT{xN3Trp3vo1X5#QOjh85n>u{!l)y- zLRv*lH+6NNd-br#xOoS4vmRv5J7v+O83vx!=A-sC{YU?R(g`aa)AV3m9fuQ~XkltW zmUa$8{|D6?SmJP-7>B|j+Wqj<5>W1z=Hz0zx+ zF%?A?gssyRWbVU!tpw!{S}HS0U@&G=>wwZDzPjRjwB-X`%$(z?V{(IqQPJ%=66Qu@ zk&cKb!xR&ift9v(1h4Y^$KPlt|26`AubAq?G*h5omURH5```lsKmbS0FuF`qDR~C> z#hRpNv6%4npH*XS2>N0fLm6j+gvIaz`kQ9yi{P{}kC3z{wcUfZEEQ)4_8k&Hd5x;z3#jLOV1L-j~Ih}fpwnX7XfC}4>phg)pSFt)6l8;=+q z#A3mdWA`bk#)b-fBvr|pW;?Ise<8+`WQpn^-Z zvM$agbp}=p1|d!oUc!Og&MKYP4}=xdB{U}J2N+#mC0v%EK;UTsz}|m2IYJ~g2Np(C zJbxrTuAmmk1hM$qs*!^0xC8P&!qv1+Z^ZQ@gf$b|3YE-&O^OHu zG)n3e#3ss{G1$(g>%4IY+mb+~(;Swh_!m#?{sQ!X?C#KtrAtRPp6t<~+mTFa8Dpee$#b diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_color_lightning_vsm_omni.bin index fbfbe8542796542034d8a5110a0eef1c0fa7c117..2203d684e5ab17c3641a6a0e2924dab89db34772 100644 GIT binary patch literal 6999 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 bOQ+PyB{o3kA&gw>IR;;038^2?&c65;Iho~o diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.bin index a68bc874a9c39c37d3803da19c1218eee2bde960..e41b557e1c2179b05e89e32a91cfc4dbbbc14a7b 100644 GIT binary patch delta 222 zcmaFN^^I$T9wVQDg^q%uo~eHekXkya2nf0J9%9 hLj;(0C$D2x#3prsQG2p1i!v^$K5SANlb^8E0{{|MI7R>f delta 200 zcmeyy^_Xje9wU#1j)I|{sgbFLMXK)PiARgbu4hz0mvEZ=o>2*1&}DKm6NbtZ ibX881U73|J1$ST*)Mmk=avr9j_~d6Sf|Gx+)BylR+B5P1 diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.bin index 5e17307d2f2ec4a107ab05c0059a517cab18fee4..169b26c2c5844e9cc4c6c02ba64583293c781619 100644 GIT binary patch delta 9 QcmbQlG?{6_l!=q;0TILl@c;k- delta 9 QcmbQtG>K`#l!;U801?Rp@&Et; diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.bin index 2e637209610fa49d7c48ede689593f62793ed243..c98de4172caaf299c1232f63bdce5d0a43ee8f9d 100644 GIT binary patch delta 9 QcmaFG_?mG-&cy6`02W3BPXGV_ delta 9 QcmaFO_=<5t&cxh002WIGPyhe` diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.bin index 2e237bbc97ab71d4789f55f2e0dd9fb90dae8c0c..d6865de85559f8271819dd8c6ad2283f01ce15a5 100644 GIT binary patch delta 24 fcmdnaw3BJV6FvhA9R))@QzKIgi&R~Mi67hnUx){w delta 22 dcmdnVw4G_f6CMj41w%bkBU1~DRNaZ6+yPS&2S5M- diff --git a/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin b/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.bin index a68bc874a9c39c37d3803da19c1218eee2bde960..e41b557e1c2179b05e89e32a91cfc4dbbbc14a7b 100644 GIT binary patch delta 222 zcmaFN^^I$T9wVQDg^q%uo~eHekXkya2nf0J9%9 hLj;(0C$D2x#3prsQG2p1i!v^$K5SANlb^8E0{{|MI7R>f delta 200 zcmeyy^_Xje9wU#1j)I|{sgbFLMXK)PiARgbu4hz0mvEZ=o>2*1&}DKm6NbtZ ibX881U73|J1$ST*)Mmk=avr9j_~d6Sf|Gx+)BylR+B5P1 diff --git a/examples/runtime/shaders/glsl/fs_smsimple_draw.bin b/examples/runtime/shaders/glsl/fs_smsimple_draw.bin new file mode 100644 index 000000000..483b6e37b --- /dev/null +++ b/examples/runtime/shaders/glsl/fs_smsimple_draw.bin @@ -0,0 +1,347 @@ +FSHpjHuniform sampler2D u_shadowMap; +uniform vec4 u_lightPos; +varying vec3 v_view; +varying vec4 v_shadowcoord; +varying vec3 v_normal; +void main () +{ + vec2 lc_1; + vec3 tmpvar_2; + tmpvar_2 = -(normalize(u_lightPos.xyz)); + float tmpvar_3; + tmpvar_3 = dot (v_normal, tmpvar_2); + vec2 tmpvar_4; + tmpvar_4.x = tmpvar_3; + tmpvar_4.y = (((float((tmpvar_3 >= 0.0)) * pow (max (0.0, dot ((((2.0 * tmpvar_3) * v_normal) - tmpvar_2), -(normalize(v_view)))), 1.0)) * 3.0) / 8.0); + lc_1 = max (tmpvar_4, 0.0); + float result_5; + result_5 = 0.0; + vec2 tmpvar_6; + tmpvar_6 = (vec2(0.00195312, 0.00195312) * v_shadowcoord.w); + vec4 tmpvar_7; + tmpvar_7.zw = vec2(0.0, 0.0); + tmpvar_7.xy = (vec2(-1.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_8; + _shadowCoord_8 = (v_shadowcoord + tmpvar_7); + float tmpvar_9; + vec2 tmpvar_10; + tmpvar_10 = (_shadowCoord_8.xy / _shadowCoord_8.w); + bool tmpvar_11; + if (any(greaterThan (tmpvar_10, vec2(1.0, 1.0)))) { + tmpvar_11 = bool(1); + } else { + tmpvar_11 = any(lessThan (tmpvar_10, vec2(0.0, 0.0))); + }; + if (tmpvar_11) { + tmpvar_9 = 1.0; + } else { + tmpvar_9 = float((dot (texture2D (u_shadowMap, tmpvar_10), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_8.z - 0.005) / _shadowCoord_8.w))); + }; + result_5 = tmpvar_9; + vec4 tmpvar_12; + tmpvar_12.zw = vec2(0.0, 0.0); + tmpvar_12.xy = (vec2(-1.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_13; + _shadowCoord_13 = (v_shadowcoord + tmpvar_12); + float tmpvar_14; + vec2 tmpvar_15; + tmpvar_15 = (_shadowCoord_13.xy / _shadowCoord_13.w); + bool tmpvar_16; + if (any(greaterThan (tmpvar_15, vec2(1.0, 1.0)))) { + tmpvar_16 = bool(1); + } else { + tmpvar_16 = any(lessThan (tmpvar_15, vec2(0.0, 0.0))); + }; + if (tmpvar_16) { + tmpvar_14 = 1.0; + } else { + tmpvar_14 = float((dot (texture2D (u_shadowMap, tmpvar_15), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_13.z - 0.005) / _shadowCoord_13.w))); + }; + result_5 = (tmpvar_9 + tmpvar_14); + vec4 tmpvar_17; + tmpvar_17.zw = vec2(0.0, 0.0); + tmpvar_17.xy = (vec2(-1.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_18; + _shadowCoord_18 = (v_shadowcoord + tmpvar_17); + float tmpvar_19; + vec2 tmpvar_20; + tmpvar_20 = (_shadowCoord_18.xy / _shadowCoord_18.w); + bool tmpvar_21; + if (any(greaterThan (tmpvar_20, vec2(1.0, 1.0)))) { + tmpvar_21 = bool(1); + } else { + tmpvar_21 = any(lessThan (tmpvar_20, vec2(0.0, 0.0))); + }; + if (tmpvar_21) { + tmpvar_19 = 1.0; + } else { + tmpvar_19 = float((dot (texture2D (u_shadowMap, tmpvar_20), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_18.z - 0.005) / _shadowCoord_18.w))); + }; + result_5 = (result_5 + tmpvar_19); + vec4 tmpvar_22; + tmpvar_22.zw = vec2(0.0, 0.0); + tmpvar_22.xy = (vec2(-1.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_23; + _shadowCoord_23 = (v_shadowcoord + tmpvar_22); + float tmpvar_24; + vec2 tmpvar_25; + tmpvar_25 = (_shadowCoord_23.xy / _shadowCoord_23.w); + bool tmpvar_26; + if (any(greaterThan (tmpvar_25, vec2(1.0, 1.0)))) { + tmpvar_26 = bool(1); + } else { + tmpvar_26 = any(lessThan (tmpvar_25, vec2(0.0, 0.0))); + }; + if (tmpvar_26) { + tmpvar_24 = 1.0; + } else { + tmpvar_24 = float((dot (texture2D (u_shadowMap, tmpvar_25), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_23.z - 0.005) / _shadowCoord_23.w))); + }; + result_5 = (result_5 + tmpvar_24); + vec4 tmpvar_27; + tmpvar_27.zw = vec2(0.0, 0.0); + tmpvar_27.xy = (vec2(-0.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_28; + _shadowCoord_28 = (v_shadowcoord + tmpvar_27); + float tmpvar_29; + vec2 tmpvar_30; + tmpvar_30 = (_shadowCoord_28.xy / _shadowCoord_28.w); + bool tmpvar_31; + if (any(greaterThan (tmpvar_30, vec2(1.0, 1.0)))) { + tmpvar_31 = bool(1); + } else { + tmpvar_31 = any(lessThan (tmpvar_30, vec2(0.0, 0.0))); + }; + if (tmpvar_31) { + tmpvar_29 = 1.0; + } else { + tmpvar_29 = float((dot (texture2D (u_shadowMap, tmpvar_30), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_28.z - 0.005) / _shadowCoord_28.w))); + }; + result_5 = (result_5 + tmpvar_29); + vec4 tmpvar_32; + tmpvar_32.zw = vec2(0.0, 0.0); + tmpvar_32.xy = (vec2(-0.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_33; + _shadowCoord_33 = (v_shadowcoord + tmpvar_32); + float tmpvar_34; + vec2 tmpvar_35; + tmpvar_35 = (_shadowCoord_33.xy / _shadowCoord_33.w); + bool tmpvar_36; + if (any(greaterThan (tmpvar_35, vec2(1.0, 1.0)))) { + tmpvar_36 = bool(1); + } else { + tmpvar_36 = any(lessThan (tmpvar_35, vec2(0.0, 0.0))); + }; + if (tmpvar_36) { + tmpvar_34 = 1.0; + } else { + tmpvar_34 = float((dot (texture2D (u_shadowMap, tmpvar_35), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_33.z - 0.005) / _shadowCoord_33.w))); + }; + result_5 = (result_5 + tmpvar_34); + vec4 tmpvar_37; + tmpvar_37.zw = vec2(0.0, 0.0); + tmpvar_37.xy = (vec2(-0.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_38; + _shadowCoord_38 = (v_shadowcoord + tmpvar_37); + float tmpvar_39; + vec2 tmpvar_40; + tmpvar_40 = (_shadowCoord_38.xy / _shadowCoord_38.w); + bool tmpvar_41; + if (any(greaterThan (tmpvar_40, vec2(1.0, 1.0)))) { + tmpvar_41 = bool(1); + } else { + tmpvar_41 = any(lessThan (tmpvar_40, vec2(0.0, 0.0))); + }; + if (tmpvar_41) { + tmpvar_39 = 1.0; + } else { + tmpvar_39 = float((dot (texture2D (u_shadowMap, tmpvar_40), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_38.z - 0.005) / _shadowCoord_38.w))); + }; + result_5 = (result_5 + tmpvar_39); + vec4 tmpvar_42; + tmpvar_42.zw = vec2(0.0, 0.0); + tmpvar_42.xy = (vec2(-0.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_43; + _shadowCoord_43 = (v_shadowcoord + tmpvar_42); + float tmpvar_44; + vec2 tmpvar_45; + tmpvar_45 = (_shadowCoord_43.xy / _shadowCoord_43.w); + bool tmpvar_46; + if (any(greaterThan (tmpvar_45, vec2(1.0, 1.0)))) { + tmpvar_46 = bool(1); + } else { + tmpvar_46 = any(lessThan (tmpvar_45, vec2(0.0, 0.0))); + }; + if (tmpvar_46) { + tmpvar_44 = 1.0; + } else { + tmpvar_44 = float((dot (texture2D (u_shadowMap, tmpvar_45), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_43.z - 0.005) / _shadowCoord_43.w))); + }; + result_5 = (result_5 + tmpvar_44); + vec4 tmpvar_47; + tmpvar_47.zw = vec2(0.0, 0.0); + tmpvar_47.xy = (vec2(0.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_48; + _shadowCoord_48 = (v_shadowcoord + tmpvar_47); + float tmpvar_49; + vec2 tmpvar_50; + tmpvar_50 = (_shadowCoord_48.xy / _shadowCoord_48.w); + bool tmpvar_51; + if (any(greaterThan (tmpvar_50, vec2(1.0, 1.0)))) { + tmpvar_51 = bool(1); + } else { + tmpvar_51 = any(lessThan (tmpvar_50, vec2(0.0, 0.0))); + }; + if (tmpvar_51) { + tmpvar_49 = 1.0; + } else { + tmpvar_49 = float((dot (texture2D (u_shadowMap, tmpvar_50), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_48.z - 0.005) / _shadowCoord_48.w))); + }; + result_5 = (result_5 + tmpvar_49); + vec4 tmpvar_52; + tmpvar_52.zw = vec2(0.0, 0.0); + tmpvar_52.xy = (vec2(0.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_53; + _shadowCoord_53 = (v_shadowcoord + tmpvar_52); + float tmpvar_54; + vec2 tmpvar_55; + tmpvar_55 = (_shadowCoord_53.xy / _shadowCoord_53.w); + bool tmpvar_56; + if (any(greaterThan (tmpvar_55, vec2(1.0, 1.0)))) { + tmpvar_56 = bool(1); + } else { + tmpvar_56 = any(lessThan (tmpvar_55, vec2(0.0, 0.0))); + }; + if (tmpvar_56) { + tmpvar_54 = 1.0; + } else { + tmpvar_54 = float((dot (texture2D (u_shadowMap, tmpvar_55), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_53.z - 0.005) / _shadowCoord_53.w))); + }; + result_5 = (result_5 + tmpvar_54); + vec4 tmpvar_57; + tmpvar_57.zw = vec2(0.0, 0.0); + tmpvar_57.xy = (vec2(0.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_58; + _shadowCoord_58 = (v_shadowcoord + tmpvar_57); + float tmpvar_59; + vec2 tmpvar_60; + tmpvar_60 = (_shadowCoord_58.xy / _shadowCoord_58.w); + bool tmpvar_61; + if (any(greaterThan (tmpvar_60, vec2(1.0, 1.0)))) { + tmpvar_61 = bool(1); + } else { + tmpvar_61 = any(lessThan (tmpvar_60, vec2(0.0, 0.0))); + }; + if (tmpvar_61) { + tmpvar_59 = 1.0; + } else { + tmpvar_59 = float((dot (texture2D (u_shadowMap, tmpvar_60), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_58.z - 0.005) / _shadowCoord_58.w))); + }; + result_5 = (result_5 + tmpvar_59); + vec4 tmpvar_62; + tmpvar_62.zw = vec2(0.0, 0.0); + tmpvar_62.xy = (vec2(0.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_63; + _shadowCoord_63 = (v_shadowcoord + tmpvar_62); + float tmpvar_64; + vec2 tmpvar_65; + tmpvar_65 = (_shadowCoord_63.xy / _shadowCoord_63.w); + bool tmpvar_66; + if (any(greaterThan (tmpvar_65, vec2(1.0, 1.0)))) { + tmpvar_66 = bool(1); + } else { + tmpvar_66 = any(lessThan (tmpvar_65, vec2(0.0, 0.0))); + }; + if (tmpvar_66) { + tmpvar_64 = 1.0; + } else { + tmpvar_64 = float((dot (texture2D (u_shadowMap, tmpvar_65), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_63.z - 0.005) / _shadowCoord_63.w))); + }; + result_5 = (result_5 + tmpvar_64); + vec4 tmpvar_67; + tmpvar_67.zw = vec2(0.0, 0.0); + tmpvar_67.xy = (vec2(1.5, -1.5) * tmpvar_6); + vec4 _shadowCoord_68; + _shadowCoord_68 = (v_shadowcoord + tmpvar_67); + float tmpvar_69; + vec2 tmpvar_70; + tmpvar_70 = (_shadowCoord_68.xy / _shadowCoord_68.w); + bool tmpvar_71; + if (any(greaterThan (tmpvar_70, vec2(1.0, 1.0)))) { + tmpvar_71 = bool(1); + } else { + tmpvar_71 = any(lessThan (tmpvar_70, vec2(0.0, 0.0))); + }; + if (tmpvar_71) { + tmpvar_69 = 1.0; + } else { + tmpvar_69 = float((dot (texture2D (u_shadowMap, tmpvar_70), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_68.z - 0.005) / _shadowCoord_68.w))); + }; + result_5 = (result_5 + tmpvar_69); + vec4 tmpvar_72; + tmpvar_72.zw = vec2(0.0, 0.0); + tmpvar_72.xy = (vec2(1.5, -0.5) * tmpvar_6); + vec4 _shadowCoord_73; + _shadowCoord_73 = (v_shadowcoord + tmpvar_72); + float tmpvar_74; + vec2 tmpvar_75; + tmpvar_75 = (_shadowCoord_73.xy / _shadowCoord_73.w); + bool tmpvar_76; + if (any(greaterThan (tmpvar_75, vec2(1.0, 1.0)))) { + tmpvar_76 = bool(1); + } else { + tmpvar_76 = any(lessThan (tmpvar_75, vec2(0.0, 0.0))); + }; + if (tmpvar_76) { + tmpvar_74 = 1.0; + } else { + tmpvar_74 = float((dot (texture2D (u_shadowMap, tmpvar_75), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_73.z - 0.005) / _shadowCoord_73.w))); + }; + result_5 = (result_5 + tmpvar_74); + vec4 tmpvar_77; + tmpvar_77.zw = vec2(0.0, 0.0); + tmpvar_77.xy = (vec2(1.5, 0.5) * tmpvar_6); + vec4 _shadowCoord_78; + _shadowCoord_78 = (v_shadowcoord + tmpvar_77); + float tmpvar_79; + vec2 tmpvar_80; + tmpvar_80 = (_shadowCoord_78.xy / _shadowCoord_78.w); + bool tmpvar_81; + if (any(greaterThan (tmpvar_80, vec2(1.0, 1.0)))) { + tmpvar_81 = bool(1); + } else { + tmpvar_81 = any(lessThan (tmpvar_80, vec2(0.0, 0.0))); + }; + if (tmpvar_81) { + tmpvar_79 = 1.0; + } else { + tmpvar_79 = float((dot (texture2D (u_shadowMap, tmpvar_80), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_78.z - 0.005) / _shadowCoord_78.w))); + }; + result_5 = (result_5 + tmpvar_79); + vec4 tmpvar_82; + tmpvar_82.zw = vec2(0.0, 0.0); + tmpvar_82.xy = (vec2(1.5, 1.5) * tmpvar_6); + vec4 _shadowCoord_83; + _shadowCoord_83 = (v_shadowcoord + tmpvar_82); + float tmpvar_84; + vec2 tmpvar_85; + tmpvar_85 = (_shadowCoord_83.xy / _shadowCoord_83.w); + bool tmpvar_86; + if (any(greaterThan (tmpvar_85, vec2(1.0, 1.0)))) { + tmpvar_86 = bool(1); + } else { + tmpvar_86 = any(lessThan (tmpvar_85, vec2(0.0, 0.0))); + }; + if (tmpvar_86) { + tmpvar_84 = 1.0; + } else { + tmpvar_84 = float((dot (texture2D (u_shadowMap, tmpvar_85), vec4(5.96046e-008, 1.52588e-005, 0.00390625, 1.0)) >= ((_shadowCoord_83.z - 0.005) / _shadowCoord_83.w))); + }; + float tmpvar_87; + tmpvar_87 = (result_5 + tmpvar_84); + result_5 = tmpvar_87; + gl_FragColor.xyz = pow (abs((vec3(0.1, 0.1, 0.1) + (vec3((lc_1.x + lc_1.y)) * (tmpvar_87 / 16.0)))), vec3(0.454545, 0.454545, 0.454545)); + gl_FragColor.w = 1.0; +} + + \ No newline at end of file diff --git a/examples/runtime/shaders/glsl/fs_smsimple_packdepth.bin b/examples/runtime/shaders/glsl/fs_smsimple_packdepth.bin new file mode 100644 index 0000000000000000000000000000000000000000..169b26c2c5844e9cc4c6c02ba64583293c781619 GIT binary patch literal 275 zcmZ{fK@Ng25Jh#{Q_QjztOYE@5LYI|y$2u-B54AYRDyu<79Q561){id7W025Gw)}j z({Win^{WxOlVt`?nrxwoD|MB%RAq=7CC^X@Spp{Lj$qoTi^^QYPG|-n4|}+1k<@so z89{s4{1EAlzzP`U1guF`BN98*4}!o=Eye;He9k?eG8buS=I=ztRY@mgN-$} znR$^-GnjmUMQU;#3p5xSz=MVnWi;YEf*I904G68 AEdT%j delta 224 zcmZqT`o}pzJhddXq$tt1q#`Ia#hR-$FEcH_C|4mjvBX57G#)1BlvA3DQ!+9&Cnvug zr?h)fYHHrby4%dWFw?*ylharf`CuXtBPLH_QS^cdfvi-}QYgtSC`&AgH`BD{Qcx%Z cI;bK!Kffr&M8Q@;1K~cP+fmila&a*L0JRBFng9R* diff --git a/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_csm.bin b/examples/runtime/shaders/glsl/vs_shadowmaps_color_lightning_linear_csm.bin index 899fa17e10951fc90192ab86855b6629cde21a29..8ec50ef735a89a1ac9c08f4a300f93d75082429a 100644 GIT binary patch delta 198 zcmcb`bB||&czSV0VoH9wZ(@OONrkaBS7}~mT7FTkLT+M-i9%^SvaAtaSwpyvW-$38i`3*E7IPF)L!f9NiiiHWil{MIbQ$Xw0G{bdu>b%7 delta 190 zcmcb|bBkw!cxp*%Nl~J2Nkvdvyo?lczSV0VoH9wZ(@OONrkaBS7}~mT7FTkLT+M-i9%^SvaAtaSwplOgc>P86w delta 182 zcmdnUvzBLqcxp*%Nl~J2Nkvd=&h|%Q9EQ<2Tx{MXH6iRXn$`Xs>%`~mKYPq-=0KR-iyZ`_I delta 196 zcmcc0d69F1cxp*%Nl~J2Nkvdp$v905keK$5Ee-Z770=dpts-#K@# zz4=-_ztsCxTZtdplu&X-p=E{0cj{9e6LQrkWttTmk@f3F?jLs(((&dbsvNp(8$ri9 zlvqWI#lw!LvfoPCq*hN0Ds;n(gm9%A@!hIyoWxlz4?+o9U9~9ii>8wz#Z5#7j!S+C zXek9%)@X_a2^QvWuZIr^Jm0DvPiL%}B!IkN>j{iKr)5?U@Oqi(>QN>yG-iid>&!+` z6?(o4@7lqQE;4k{;M2E!M&9UiS|!xK1AB@AQDcVUoH?f9#cbqi(G8gzWO^qdI+5*! z#yh?WXJOHSH5fE5BQ{X+9aKD_FthpI;SC&fXGCBye&CLKn2%~SGr#4YV2zmMk D3aFcAip@XBr`wHnk%uSq$o3~v?LWIWvq~hBvqE5nF2H}GfzQ7ldGCb0iwAiw*Y8Z zyrDHv0LIoUSFlwu)H6U4tEj93iXt0`YJw4xY9pXZ4Kzn9Xu-|b1Sw6=i4TA}8>kv; PHP{e@e^4Z9xwserssUg0 literal 0 HcmV?d00001 From 24d32d57d6161ef493116477c744c22df222d96b Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Mon, 13 Jan 2014 21:25:53 +0100 Subject: [PATCH 6/8] Trailing whitespaces removed. --- examples/16-shadowmaps/common.sh | 2 +- .../fs_shadowmaps_color_lightning.sh | 4 ++-- .../fs_shadowmaps_color_lightning_main.sh | 2 +- ...adowmaps_color_lightning_vsm_linear_csm.sc | 2 +- examples/16-shadowmaps/vs_shadowmaps_color.sc | 2 +- .../vs_shadowmaps_color_lightning_csm.sc | 6 +++--- .../vs_shadowmaps_color_lightning_linear.sc | 8 ++++---- ...s_shadowmaps_color_lightning_linear_csm.sc | 6 +++--- ..._shadowmaps_color_lightning_linear_omni.sc | 6 +++--- .../vs_shadowmaps_color_lightning_omni.sc | 6 +++--- .../vs_shadowmaps_color_texture.sc | 2 +- examples/16-shadowmaps/vs_shadowmaps_depth.sc | 2 +- .../16-shadowmaps/vs_shadowmaps_packdepth.sc | 2 +- .../vs_shadowmaps_packdepth_linear.sc | 2 +- .../16-shadowmaps/vs_shadowmaps_texture.sc | 2 +- .../vs_shadowmaps_texture_lightning.sc | 2 +- .../vs_shadowmaps_unpackdepth.sc | 2 +- .../vs_shadowmaps_color_lightning_linear.bin | Bin 2063 -> 2027 bytes 18 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/16-shadowmaps/common.sh b/examples/16-shadowmaps/common.sh index 29785b94e..b0b2d93d8 100644 --- a/examples/16-shadowmaps/common.sh +++ b/examples/16-shadowmaps/common.sh @@ -61,7 +61,7 @@ Light evalLight(vec3 _v, vec4 _l, vec3 _spotDirection, float _spotInner, float _ light.ld = normalize(light.l); float ldotsd = max(0.0, dot(-light.ld, normalize(_spotDirection))); - float falloff = spot(ldotsd, _spotOuter, _spotInner); + float falloff = spot(ldotsd, _spotOuter, _spotInner); light.attn = attenuation(length(light.l), _attnParams) * mix(falloff, 1.0, step(90, _spotOuter)); } diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh b/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh index c6adfa8b0..1d0b28b80 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh @@ -12,7 +12,7 @@ uniform vec4 u_color; uniform vec3 u_materialKa; uniform vec3 u_materialKd; -uniform vec4 u_materialKs; +uniform vec4 u_materialKs; uniform vec4 u_lightPosition; uniform vec4 u_lightAmbientPower; uniform vec4 u_lightDiffusePower; @@ -45,7 +45,7 @@ Shader evalShader(float _diff, float _spec) { Shader shader; - shader.ambi = u_lightAmbientPower.xyz * u_lightAmbientPower.w * u_materialKa; + shader.ambi = u_lightAmbientPower.xyz * u_lightAmbientPower.w * u_materialKa; shader.diff = u_lightDiffusePower.xyz * u_lightDiffusePower.w * u_materialKd * _diff; shader.spec = u_lightSpecularPower.xyz * u_lightSpecularPower.w * u_materialKs.xyz * _spec; diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh index fb8b90971..9b2aa7381 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_main.sh @@ -107,7 +107,7 @@ float coverage = texcoordInRange(shadowcoord.xy/shadowcoord.w) * 0.3; colorCoverage = vec3(-coverage, -coverage, coverage); } - else // (faceSelection.w == faceMax) + else // (faceSelection.w == faceMax) { shadowcoord = v_texcoord4; diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc index 9b46fea28..2ac4a9750 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc @@ -14,4 +14,4 @@ void main() { #include "fs_shadowmaps_color_lightning_main.sh" } - + diff --git a/examples/16-shadowmaps/vs_shadowmaps_color.sc b/examples/16-shadowmaps/vs_shadowmaps_color.sc index 8ad767cf8..edf8b3c13 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color.sc @@ -5,7 +5,7 @@ $input a_position * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc index 254e1d767..34133076d 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc @@ -1,15 +1,15 @@ $input a_position, a_normal -$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* * Copyright 2013 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" uniform vec4 u_params1; -#define u_shadowMapOffset u_params1.y +#define u_shadowMapOffset u_params1.y uniform mat4 u_lightMtx; uniform mat4 u_shadowMapMtx0; diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc index 22a581b8e..cb40301f0 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc @@ -1,4 +1,4 @@ -$input a_position, a_normal, a_texcoord0 +$input a_position, a_normal $output v_normal, v_view, v_shadowcoord /* @@ -6,11 +6,11 @@ $output v_normal, v_view, v_shadowcoord * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" uniform mat4 u_lightMtx; uniform vec4 u_params1; -#define u_shadowMapOffset u_params1.y +#define u_shadowMapOffset u_params1.y void main() { @@ -21,6 +21,6 @@ void main() v_view = mul(u_modelView, vec4(a_position, 1.0)).xyz; vec3 posOffset = a_position + normal.xyz * u_shadowMapOffset; - v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) ); + v_shadowcoord = mul(u_lightMtx, vec4(posOffset, 1.0) ); v_shadowcoord.z += 0.5; } diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc index 74a0fce88..6bcf411fe 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc @@ -1,15 +1,15 @@ $input a_position, a_normal -$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* * Copyright 2013 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" uniform vec4 u_params1; -#define u_shadowMapOffset u_params1.y +#define u_shadowMapOffset u_params1.y uniform mat4 u_lightMtx; uniform mat4 u_shadowMapMtx0; diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc index 6cdb68d77..cfec102c6 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc @@ -1,15 +1,15 @@ $input a_position, a_normal -$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* * Copyright 2013 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" uniform vec4 u_params1; -#define u_shadowMapOffset u_params1.y +#define u_shadowMapOffset u_params1.y uniform mat4 u_lightMtx; uniform mat4 u_shadowMapMtx0; diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc index 464bd4664..8150c41fe 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc @@ -1,15 +1,15 @@ $input a_position, a_normal -$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 +$output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* * Copyright 2013 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" uniform vec4 u_params1; -#define u_shadowMapOffset u_params1.y +#define u_shadowMapOffset u_params1.y uniform mat4 u_lightMtx; uniform mat4 u_shadowMapMtx0; diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc b/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc index 1276312f3..5a646fab7 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc @@ -6,7 +6,7 @@ $output v_texcoord0 * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_depth.sc b/examples/16-shadowmaps/vs_shadowmaps_depth.sc index 25ccd241f..f882005c5 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_depth.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_depth.sc @@ -5,7 +5,7 @@ $input a_position * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc b/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc index d6e7c4613..dc1024b62 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc @@ -6,7 +6,7 @@ $output v_position * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc b/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc index 1286d7dca..2e188e336 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc @@ -6,7 +6,7 @@ $output v_depth * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_texture.sc b/examples/16-shadowmaps/vs_shadowmaps_texture.sc index 1276312f3..5a646fab7 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_texture.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_texture.sc @@ -6,7 +6,7 @@ $output v_texcoord0 * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc b/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc index 1925aa649..1fcd73ba6 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc @@ -6,7 +6,7 @@ $output v_normal, v_view, v_texcoord0 * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc b/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc index 1276312f3..5a646fab7 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc @@ -6,7 +6,7 @@ $output v_texcoord0 * License: http://www.opensource.org/licenses/BSD-2-Clause */ -#include "../common/common.sh" +#include "../common/common.sh" void main() { diff --git a/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin b/examples/runtime/shaders/dx11/vs_shadowmaps_color_lightning_linear.bin index 289e2d9f6876a560f9a04c776ddf321f4b66389f..82007af134a9d03813ba2b988eaade30a5a01a85 100644 GIT binary patch delta 162 zcmeAdc+D>m7VN>uQIO^F|33p5OcV$)Zee$caB?m&uQIO^F|33o={GTWgV!VRgCBn)1&x`&i#zxB$^&?IG&W_>y$_SKR z!Opw#d>*&J};2-Q6;_2_l5aJr)?C&4s!mxVvYX4w&zZRf679a-N Kxw(-!iv<89b|nn} From 098ef114d2c512ef8ae4f917a99532d0b1a1ef69 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Mon, 13 Jan 2014 21:34:32 +0100 Subject: [PATCH 7/8] Added screenshots. --- examples/15-shadowmaps-simple/screenshot.png | Bin 0 -> 26768 bytes examples/16-shadowmaps/screenshot.png | Bin 0 -> 117196 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/15-shadowmaps-simple/screenshot.png create mode 100644 examples/16-shadowmaps/screenshot.png diff --git a/examples/15-shadowmaps-simple/screenshot.png b/examples/15-shadowmaps-simple/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c499397bce4c77cc9d5ce01c4e0aa0051b06c2d2 GIT binary patch literal 26768 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 literal 0 HcmV?d00001 diff --git a/examples/16-shadowmaps/screenshot.png b/examples/16-shadowmaps/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb5fa7a72e81d0a41b933da07833f6338ddb04c GIT binary patch literal 117196 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 literal 0 HcmV?d00001 From 658552be7ed566fd5ffaa59cc058e24c012e7e08 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Mon, 13 Jan 2014 23:45:18 +0100 Subject: [PATCH 8/8] Copyright dates updated. --- examples/13-stencil/fs_stencil_color_black.sc | 2 +- .../13-stencil/fs_stencil_color_lightning.sc | 2 +- .../13-stencil/fs_stencil_color_texture.sc | 2 +- examples/13-stencil/fs_stencil_texture.sc | 2 +- .../fs_stencil_texture_lightning.sc | 2 +- examples/13-stencil/makefile | 2 +- examples/13-stencil/stencil.cpp | 2 +- examples/13-stencil/vs_stencil_color.sc | 2 +- .../13-stencil/vs_stencil_color_lightning.sc | 2 +- .../13-stencil/vs_stencil_color_texture.sc | 2 +- examples/13-stencil/vs_stencil_texture.sc | 2 +- .../vs_stencil_texture_lightning.sc | 2 +- .../fs_shadowvolume_color_lightning.sc | 2 +- .../fs_shadowvolume_color_texture.sc | 2 +- .../fs_shadowvolume_svbackblank.sc | 2 +- .../fs_shadowvolume_svbackcolor.sc | 2 +- .../fs_shadowvolume_svbacktex1.sc | 2 +- .../fs_shadowvolume_svbacktex2.sc | 2 +- .../fs_shadowvolume_svfrontblank.sc | 2 +- .../fs_shadowvolume_svfrontcolor.sc | 2 +- .../fs_shadowvolume_svfronttex1.sc | 2 +- .../fs_shadowvolume_svfronttex2.sc | 2 +- .../fs_shadowvolume_svside.sc | 2 +- .../fs_shadowvolume_svsideblank.sc | 2 +- .../fs_shadowvolume_svsidecolor.sc | 2 +- .../fs_shadowvolume_svsidetex.sc | 2 +- .../fs_shadowvolume_texture.sc | 2 +- .../fs_shadowvolume_texture_lightning.sc | 2 +- examples/14-shadowvolumes/makefile | 2 +- examples/14-shadowvolumes/shadowvolumes.cpp | 2 +- .../vs_shadowvolume_color_lightning.sc | 2 +- .../vs_shadowvolume_color_texture.sc | 2 +- .../vs_shadowvolume_svback.sc | 2 +- .../vs_shadowvolume_svfront.sc | 2 +- .../vs_shadowvolume_svside.sc | 2 +- .../vs_shadowvolume_texture.sc | 2 +- .../vs_shadowvolume_texture_lightning.sc | 2 +- .../15-shadowmaps-simple/fs_smsimple_draw.sc | 2 +- .../fs_smsimple_packdepth.sc | 2 +- examples/15-shadowmaps-simple/makefile | 2 +- .../shadowmaps_simple.cpp | 2 +- .../15-shadowmaps-simple/vs_smsimple_draw.sc | 2 +- .../vs_smsimple_packdepth.sc | 2 +- examples/16-shadowmaps/common.sh | 2 +- .../fs_shadowmaps_color_black.sc | 2 +- .../fs_shadowmaps_color_lightning.sh | 2 +- .../fs_shadowmaps_color_lightning_esm.sc | 2 +- .../fs_shadowmaps_color_lightning_esm_csm.sc | 2 +- ...s_shadowmaps_color_lightning_esm_linear.sc | 2 +- ...adowmaps_color_lightning_esm_linear_csm.sc | 2 +- ...dowmaps_color_lightning_esm_linear_omni.sc | 2 +- .../fs_shadowmaps_color_lightning_esm_omni.sc | 2 +- .../fs_shadowmaps_color_lightning_hard.sc | 2 +- .../fs_shadowmaps_color_lightning_hard_csm.sc | 2 +- ..._shadowmaps_color_lightning_hard_linear.sc | 2 +- ...dowmaps_color_lightning_hard_linear_csm.sc | 2 +- ...owmaps_color_lightning_hard_linear_omni.sc | 2 +- ...fs_shadowmaps_color_lightning_hard_omni.sc | 2 +- .../fs_shadowmaps_color_lightning_pcf.sc | 2 +- .../fs_shadowmaps_color_lightning_pcf_csm.sc | 2 +- ...s_shadowmaps_color_lightning_pcf_linear.sc | 2 +- ...adowmaps_color_lightning_pcf_linear_csm.sc | 2 +- ...dowmaps_color_lightning_pcf_linear_omni.sc | 2 +- .../fs_shadowmaps_color_lightning_pcf_omni.sc | 2 +- .../fs_shadowmaps_color_lightning_vsm.sc | 2 +- .../fs_shadowmaps_color_lightning_vsm_csm.sc | 2 +- ...s_shadowmaps_color_lightning_vsm_linear.sc | 2 +- ...adowmaps_color_lightning_vsm_linear_csm.sc | 2 +- ...dowmaps_color_lightning_vsm_linear_omni.sc | 2 +- .../fs_shadowmaps_color_lightning_vsm_omni.sc | 2 +- .../fs_shadowmaps_color_texture.sc | 2 +- examples/16-shadowmaps/fs_shadowmaps_hblur.sc | 2 +- .../16-shadowmaps/fs_shadowmaps_hblur_vsm.sc | 2 +- .../16-shadowmaps/fs_shadowmaps_packdepth.sc | 2 +- .../fs_shadowmaps_packdepth_linear.sc | 2 +- .../fs_shadowmaps_packdepth_vsm.sc | 2 +- .../fs_shadowmaps_packdepth_vsm_linear.sc | 2 +- .../16-shadowmaps/fs_shadowmaps_texture.sc | 2 +- .../fs_shadowmaps_unpackdepth.sc | 2 +- .../fs_shadowmaps_unpackdepth_vsm.sc | 2 +- examples/16-shadowmaps/fs_shadowmaps_vblur.sc | 2 +- .../16-shadowmaps/fs_shadowmaps_vblur_vsm.sc | 2 +- examples/16-shadowmaps/makefile | 2 +- examples/16-shadowmaps/screenshot.png | Bin 117196 -> 117194 bytes examples/16-shadowmaps/shadowmaps.cpp | 2 +- examples/16-shadowmaps/vs_shadowmaps_color.sc | 2 +- .../vs_shadowmaps_color_lightning.sc | 2 +- .../vs_shadowmaps_color_lightning_csm.sc | 2 +- .../vs_shadowmaps_color_lightning_linear.sc | 2 +- ...s_shadowmaps_color_lightning_linear_csm.sc | 2 +- ..._shadowmaps_color_lightning_linear_omni.sc | 2 +- .../vs_shadowmaps_color_lightning_omni.sc | 2 +- .../vs_shadowmaps_color_texture.sc | 2 +- examples/16-shadowmaps/vs_shadowmaps_depth.sc | 2 +- .../16-shadowmaps/vs_shadowmaps_packdepth.sc | 2 +- .../vs_shadowmaps_packdepth_linear.sc | 2 +- .../16-shadowmaps/vs_shadowmaps_texture.sc | 2 +- .../vs_shadowmaps_texture_lightning.sc | 2 +- .../vs_shadowmaps_unpackdepth.sc | 2 +- examples/16-shadowmaps/vs_shadowmaps_vblur.sc | 2 +- 100 files changed, 99 insertions(+), 99 deletions(-) diff --git a/examples/13-stencil/fs_stencil_color_black.sc b/examples/13-stencil/fs_stencil_color_black.sc index 057b621ba..7adb966b9 100644 --- a/examples/13-stencil/fs_stencil_color_black.sc +++ b/examples/13-stencil/fs_stencil_color_black.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/fs_stencil_color_lightning.sc b/examples/13-stencil/fs_stencil_color_lightning.sc index 501dacc8f..19ca37e67 100644 --- a/examples/13-stencil/fs_stencil_color_lightning.sc +++ b/examples/13-stencil/fs_stencil_color_lightning.sc @@ -1,7 +1,7 @@ $input v_normal, v_view /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/fs_stencil_color_texture.sc b/examples/13-stencil/fs_stencil_color_texture.sc index 5a109e08e..eea20d8ff 100644 --- a/examples/13-stencil/fs_stencil_color_texture.sc +++ b/examples/13-stencil/fs_stencil_color_texture.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/fs_stencil_texture.sc b/examples/13-stencil/fs_stencil_texture.sc index 78156e1ca..42c278142 100644 --- a/examples/13-stencil/fs_stencil_texture.sc +++ b/examples/13-stencil/fs_stencil_texture.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/fs_stencil_texture_lightning.sc b/examples/13-stencil/fs_stencil_texture_lightning.sc index fa801edee..594774695 100644 --- a/examples/13-stencil/fs_stencil_texture_lightning.sc +++ b/examples/13-stencil/fs_stencil_texture_lightning.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/makefile b/examples/13-stencil/makefile index 6525ae16a..974347697 100644 --- a/examples/13-stencil/makefile +++ b/examples/13-stencil/makefile @@ -1,5 +1,5 @@ # -# Copyright 2013 Dario Manesku. All rights reserved. +# Copyright 2013-2014 Dario Manesku. All rights reserved. # License: http://www.opensource.org/licenses/BSD-2-Clause # diff --git a/examples/13-stencil/stencil.cpp b/examples/13-stencil/stencil.cpp index 0b1fc66c8..850b85b2e 100644 --- a/examples/13-stencil/stencil.cpp +++ b/examples/13-stencil/stencil.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/vs_stencil_color.sc b/examples/13-stencil/vs_stencil_color.sc index 8ad767cf8..c6750be32 100644 --- a/examples/13-stencil/vs_stencil_color.sc +++ b/examples/13-stencil/vs_stencil_color.sc @@ -1,7 +1,7 @@ $input a_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/vs_stencil_color_lightning.sc b/examples/13-stencil/vs_stencil_color_lightning.sc index a10bd86eb..15e191f15 100644 --- a/examples/13-stencil/vs_stencil_color_lightning.sc +++ b/examples/13-stencil/vs_stencil_color_lightning.sc @@ -2,7 +2,7 @@ $input a_position, a_normal, a_texcoord0 $output v_normal, v_view /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/vs_stencil_color_texture.sc b/examples/13-stencil/vs_stencil_color_texture.sc index 1276312f3..577fd62c2 100644 --- a/examples/13-stencil/vs_stencil_color_texture.sc +++ b/examples/13-stencil/vs_stencil_color_texture.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/vs_stencil_texture.sc b/examples/13-stencil/vs_stencil_texture.sc index 1276312f3..577fd62c2 100644 --- a/examples/13-stencil/vs_stencil_texture.sc +++ b/examples/13-stencil/vs_stencil_texture.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/13-stencil/vs_stencil_texture_lightning.sc b/examples/13-stencil/vs_stencil_texture_lightning.sc index 2a96a65cf..b9f58339d 100644 --- a/examples/13-stencil/vs_stencil_texture_lightning.sc +++ b/examples/13-stencil/vs_stencil_texture_lightning.sc @@ -2,7 +2,7 @@ $input a_position, a_normal, a_texcoord0 $output v_normal, v_view, v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc b/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc index b5059dcf5..f399bafca 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_color_lightning.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_pos /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc b/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc index b4bad8175..c99e1bf07 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc b/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc index ebf288ac4..6e7b52bcc 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc b/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc index a8130d600..99e7dfe4d 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc b/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc index 8b8faf6c1..7c8bdd9d1 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc b/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc index ec0999b41..ba281a41b 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc b/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc index 56a143bad..52bdc2b78 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc b/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc index c82664d14..9711a71f9 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc b/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc index 7f92ea847..7623b254e 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc @@ -1,5 +1,5 @@ /* -* Copyright 2013 Dario Manesku. All rights reserved. +* Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc b/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc index fa8a082a8..71244ad68 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svside.sc b/examples/14-shadowvolumes/fs_shadowvolume_svside.sc index 5a8e023d7..21042bebc 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svside.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svside.sc @@ -1,7 +1,7 @@ $input v_k /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc b/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc index 9df48c991..879281dd4 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc @@ -1,7 +1,7 @@ $input v_k /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc b/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc index 80a71bd0a..6a167b80c 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc @@ -1,7 +1,7 @@ $input v_k /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc b/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc index 1a2d05bd4..0d3181167 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc @@ -1,7 +1,7 @@ $input v_k /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_texture.sc b/examples/14-shadowvolumes/fs_shadowvolume_texture.sc index 78156e1ca..42c278142 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_texture.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_texture.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc b/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc index 9ec5682f1..e70dfb565 100644 --- a/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc +++ b/examples/14-shadowvolumes/fs_shadowvolume_texture_lightning.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_texcoord0, v_pos /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/makefile b/examples/14-shadowvolumes/makefile index d129bd1e8..c122df283 100644 --- a/examples/14-shadowvolumes/makefile +++ b/examples/14-shadowvolumes/makefile @@ -1,5 +1,5 @@ # -# Copyright 2013 Dario Manesku. All rights reserved. +# Copyright 2013-2014 Dario Manesku. All rights reserved. # License: http://www.opensource.org/licenses/BSD-2-Clause # diff --git a/examples/14-shadowvolumes/shadowvolumes.cpp b/examples/14-shadowvolumes/shadowvolumes.cpp index 8f2e2ecf3..3d9e46909 100644 --- a/examples/14-shadowvolumes/shadowvolumes.cpp +++ b/examples/14-shadowvolumes/shadowvolumes.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc b/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc index 2e730a47b..fd7ec84b8 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_color_lightning.sc @@ -2,7 +2,7 @@ $input a_position, a_color0, a_normal, a_texcoord0 $output v_normal, v_view, v_pos /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc b/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc index 81b75a6fd..6c5f246b7 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_svback.sc b/examples/14-shadowvolumes/vs_shadowvolume_svback.sc index f07bc3d43..ba762fc29 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_svback.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_svback.sc @@ -1,7 +1,7 @@ $input a_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc b/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc index f882005c5..52a2e6052 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc @@ -1,7 +1,7 @@ $input a_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_svside.sc b/examples/14-shadowvolumes/vs_shadowvolume_svside.sc index 746970cb1..1fcc7ebba 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_svside.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_svside.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_k /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_texture.sc b/examples/14-shadowvolumes/vs_shadowvolume_texture.sc index dc1ea4fdf..6e3ffa49c 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_texture.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_texture.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc b/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc index c46af0a11..b557a3127 100644 --- a/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc +++ b/examples/14-shadowvolumes/vs_shadowvolume_texture_lightning.sc @@ -2,7 +2,7 @@ $input a_position, a_normal, a_texcoord0 $output v_normal, v_view, v_texcoord0, v_pos /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/15-shadowmaps-simple/fs_smsimple_draw.sc b/examples/15-shadowmaps-simple/fs_smsimple_draw.sc index 176030b30..7cf8c2fbe 100644 --- a/examples/15-shadowmaps-simple/fs_smsimple_draw.sc +++ b/examples/15-shadowmaps-simple/fs_smsimple_draw.sc @@ -1,7 +1,7 @@ $input v_view, v_normal, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc b/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc index b77d2972e..5433f91bc 100644 --- a/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc +++ b/examples/15-shadowmaps-simple/fs_smsimple_packdepth.sc @@ -1,7 +1,7 @@ $input v_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/15-shadowmaps-simple/makefile b/examples/15-shadowmaps-simple/makefile index 6525ae16a..974347697 100644 --- a/examples/15-shadowmaps-simple/makefile +++ b/examples/15-shadowmaps-simple/makefile @@ -1,5 +1,5 @@ # -# Copyright 2013 Dario Manesku. All rights reserved. +# Copyright 2013-2014 Dario Manesku. All rights reserved. # License: http://www.opensource.org/licenses/BSD-2-Clause # diff --git a/examples/15-shadowmaps-simple/shadowmaps_simple.cpp b/examples/15-shadowmaps-simple/shadowmaps_simple.cpp index 0a22c2d38..924374742 100644 --- a/examples/15-shadowmaps-simple/shadowmaps_simple.cpp +++ b/examples/15-shadowmaps-simple/shadowmaps_simple.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/15-shadowmaps-simple/vs_smsimple_draw.sc b/examples/15-shadowmaps-simple/vs_smsimple_draw.sc index 20d6f0943..2143c61c0 100644 --- a/examples/15-shadowmaps-simple/vs_smsimple_draw.sc +++ b/examples/15-shadowmaps-simple/vs_smsimple_draw.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_view, v_normal, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc b/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc index dc1024b62..ca364dd29 100644 --- a/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc +++ b/examples/15-shadowmaps-simple/vs_smsimple_packdepth.sc @@ -2,7 +2,7 @@ $input a_position $output v_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/common.sh b/examples/16-shadowmaps/common.sh index b0b2d93d8..ef2ba8599 100644 --- a/examples/16-shadowmaps/common.sh +++ b/examples/16-shadowmaps/common.sh @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_black.sc b/examples/16-shadowmaps/fs_shadowmaps_color_black.sc index 057b621ba..7adb966b9 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_black.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_black.sc @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh b/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh index 1d0b28b80..769a8c662 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning.sh @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc index 1b7644cfe..6827c44ca 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc index fa53a9d0e..d30616700 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc index 8f960b20e..9fab45674 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc index 5ca772630..d43dffb22 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc index f578abd7f..c92d19b18 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_linear_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc index ebeac2cc1..acc8aa253 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_esm_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc index f06666db5..1564c3b61 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc index 27918465d..aeab8c855 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc index b6d7554e9..fe66c147d 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_HARD 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc index 05bf3ac50..4aa3bafc2 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_HARD 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc index 90947dbfe..34f5857c4 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_linear_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_HARD 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc index 78ad2baee..0587cfb20 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_hard_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc index 89a7c5011..21dfe96c9 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc index f356d0c88..6305ad386 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc index 7b593b75e..5cd7d0253 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc index 182562fc4..27053c07a 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_PCF 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc index e601ae88f..228ccd570 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_linear_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_PCF 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc index f6da783ac..3ee82afbc 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_pcf_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc index c3e675df7..158e29ab0 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc index 7b5e33ff1..825f49543 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc index 6078739ff..3dd86847c 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear.sc @@ -1,7 +1,7 @@ $input v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc index 2ac4a9750..66f05cf8e 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_csm.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_VSM 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc index 70027ef14..615a200ff 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_linear_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ #define SM_VSM 1 diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc index ecf3533ea..e8d245782 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_lightning_vsm_omni.sc @@ -1,7 +1,7 @@ $input v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc b/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc index 5a109e08e..eea20d8ff 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_hblur.sc b/examples/16-shadowmaps/fs_shadowmaps_hblur.sc index 401f3f77c..7c4186ed1 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_hblur.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_hblur.sc @@ -1,7 +1,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc index bccdfe087..50f96c5fc 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc @@ -1,7 +1,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc index 867e92c40..86dc03916 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc @@ -1,7 +1,7 @@ $input v_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc index cc18624c2..9a9937c7f 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc @@ -1,7 +1,7 @@ $input v_depth /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc index b683249b1..c67612443 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc @@ -1,7 +1,7 @@ $input v_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc index d1cd1537a..3ed8d1b92 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc @@ -1,7 +1,7 @@ $input v_depth /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_texture.sc b/examples/16-shadowmaps/fs_shadowmaps_texture.sc index 78156e1ca..42c278142 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_texture.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_texture.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc index 1cd1ab49f..592a1d926 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc index ee8f0269e..c81ba1856 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc @@ -1,7 +1,7 @@ $input v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_vblur.sc b/examples/16-shadowmaps/fs_shadowmaps_vblur.sc index 401f3f77c..7c4186ed1 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_vblur.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_vblur.sc @@ -1,7 +1,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc b/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc index bccdfe087..50f96c5fc 100644 --- a/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc +++ b/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc @@ -1,7 +1,7 @@ $input v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/makefile b/examples/16-shadowmaps/makefile index 6525ae16a..974347697 100644 --- a/examples/16-shadowmaps/makefile +++ b/examples/16-shadowmaps/makefile @@ -1,5 +1,5 @@ # -# Copyright 2013 Dario Manesku. All rights reserved. +# Copyright 2013-2014 Dario Manesku. All rights reserved. # License: http://www.opensource.org/licenses/BSD-2-Clause # diff --git a/examples/16-shadowmaps/screenshot.png b/examples/16-shadowmaps/screenshot.png index bbb5fa7a72e81d0a41b933da07833f6338ddb04c..f3394bdc5a934fd30b5451647b4b8c1f64807a59 100644 GIT binary patch delta 24 gcmX>znf=scc9zZnKlhESTMjkvI<$S)Ax0r~0Eg2GwEzGB delta 27 jcmX>#nf=UUcGk`SKX=}ZEL#pS@;2`{w0*}RMj>_pnkEX& diff --git a/examples/16-shadowmaps/shadowmaps.cpp b/examples/16-shadowmaps/shadowmaps.cpp index 1ba57667c..eaf0729ed 100644 --- a/examples/16-shadowmaps/shadowmaps.cpp +++ b/examples/16-shadowmaps/shadowmaps.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color.sc b/examples/16-shadowmaps/vs_shadowmaps_color.sc index edf8b3c13..681f3afbf 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color.sc @@ -1,7 +1,7 @@ $input a_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc index a898c8ce2..c0c727a13 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc index 34133076d..d6ba93824 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_csm.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc index cb40301f0..db0f4c328 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_normal, v_view, v_shadowcoord /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc index 6bcf411fe..5c7072966 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_csm.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc index cfec102c6..9c8faeaca 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_linear_omni.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc index 8150c41fe..3c27561f0 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_lightning_omni.sc @@ -2,7 +2,7 @@ $input a_position, a_normal $output v_position, v_normal, v_view, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc b/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc index 5a646fab7..bb5be99d7 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_depth.sc b/examples/16-shadowmaps/vs_shadowmaps_depth.sc index f882005c5..52a2e6052 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_depth.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_depth.sc @@ -1,7 +1,7 @@ $input a_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc b/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc index dc1024b62..ca364dd29 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc @@ -2,7 +2,7 @@ $input a_position $output v_position /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc b/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc index 2e188e336..e842b44c2 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc @@ -2,7 +2,7 @@ $input a_position $output v_depth /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_texture.sc b/examples/16-shadowmaps/vs_shadowmaps_texture.sc index 5a646fab7..bb5be99d7 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_texture.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_texture.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc b/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc index 1fcd73ba6..32a418cbb 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_texture_lightning.sc @@ -2,7 +2,7 @@ $input a_position, a_normal, a_texcoord0 $output v_normal, v_view, v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc b/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc index 5a646fab7..bb5be99d7 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */ diff --git a/examples/16-shadowmaps/vs_shadowmaps_vblur.sc b/examples/16-shadowmaps/vs_shadowmaps_vblur.sc index 74915a09e..1ee057eb5 100644 --- a/examples/16-shadowmaps/vs_shadowmaps_vblur.sc +++ b/examples/16-shadowmaps/vs_shadowmaps_vblur.sc @@ -2,7 +2,7 @@ $input a_position, a_texcoord0 $output v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3, v_texcoord4 /* - * Copyright 2013 Dario Manesku. All rights reserved. + * Copyright 2013-2014 Dario Manesku. All rights reserved. * License: http://www.opensource.org/licenses/BSD-2-Clause */