diff --git a/project_templates/sample_scene/.gitignore b/project_templates/sample_scene/.gitignore new file mode 100644 index 00000000..d12392f0 --- /dev/null +++ b/project_templates/sample_scene/.gitignore @@ -0,0 +1,35 @@ +# Ide +.vs +.vscode + +# Out +build + +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app diff --git a/project_templates/sample_scene/CMakeLists.txt b/project_templates/sample_scene/CMakeLists.txt new file mode 100644 index 00000000..de5e0ae8 --- /dev/null +++ b/project_templates/sample_scene/CMakeLists.txt @@ -0,0 +1,231 @@ +# CMakeList.txt : Top-level CMake project file, do global configuration +# and include sub-projects here. +# +cmake_minimum_required(VERSION 3.20) + +project(%%(ProjectName:no_space)%%) + +# TODO: set enviroment variables for other platforms +if(WIN32) + execute_process(COMMAND "${CMAKE_SOURCE_DIR}/cmake/platformSpec/set_env.bat") +endif(WIN32) + +if(POLICY CMP0091) + cmake_policy(SET CMP0091 NEW) +endif() + +if(NOT DEFINED ${NauEngineFolder}) + file(TO_CMAKE_PATH "$ENV{NAU_ENGINE_SDK_DIR}" ENV_NAU_ENGINE_SDK_DIR) + set(NauEngineFolder "${ENV_NAU_ENGINE_SDK_DIR}") +endif(NOT DEFINED ${NauEngineFolder}) + +message(NOTICE "SDK folder ${NauEngineFolder}") + +if(NOT EXISTS ${NauEngineFolder}/CMakeLists.txt + OR NOT EXISTS ${NauEngineFolder}/cmake + OR NOT EXISTS ${NauEngineFolder}/lib + OR NOT EXISTS ${NauEngineFolder}/include +) + message(FATAL_ERROR "SDK folder ${NauEngineFolder} does not contain required files!") +endif() + +set(CMAKE_MODULE_PATH ${NauEngineFolder} + ${NauEngineFolder}/cmake + ${NauEngineFolder}/cmake/defaults +) + +option(NAU_RTTI "Enable rtti support" OFF) +option(NAU_EXCEPTIONS "Enable exception support" OFF) +option(NAU_VERBOSE_LOG "Enable verbose messages for logger" OFF) +option(NAU_MATH_USE_DOUBLE_PRECISION "Enable double precision for math" OFF) + +option(BUILD_SHARED_LIBS "Build shared libs" ON) + +if(BUILD_SHARED_LIBS) + message(STATUS "Configure for dynamic (DLL) runtime") +else() + message(STATUS "Configure for static (monolith) runtime") +endif() + +set(NauSDKIncludes ${NauEngineFolder}/include) +set(NauSDKLibraries ${NauEngineFolder}/lib) + +set(CMAKE_CXX_STANDARD 20) + +find_package(Python + REQUIRED +) + +include(NauCommon) +include(NauModule) +include(NauGenFunctions) +include(platformSpec/NauPlatformSetup) + +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) + +# Enable Hot Reload for MSVC compilers if supported. +if(POLICY CMP0141) + cmake_policy(SET CMP0141 NEW) + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") +endif() + +find_package(Threads REQUIRED) + +function(try_inc cmakeName) + if(EXISTS ${NauEngineFolder}/${cmakeName}) + include(${NauEngineFolder}/${cmakeName}) + message(STATUS "${NauEngineFolder}/${cmakeName}") + endif() +endfunction() + +function(try_add subdir) + if(EXISTS ${NauEngineFolder}/${subdir}) + add_subdirectory(${NauEngineFolder}/${subdir}) + message(STATUS "${NauEngineFolder}/${subdir}") + endif() +endfunction() + +try_inc(cmake/3rdPartyLibs/asio/asio-config.cmake) +try_inc(cmake/3rdPartyLibs/brotli/brotli-config.cmake) +try_inc(cmake/3rdPartyLibs/EABase/EABase-config.cmake) +try_inc(cmake/3rdPartyLibs/EASTL/EASTL-config.cmake) +try_inc(cmake/3rdPartyLibs/fast_float/fast_float-config.cmake) +try_inc(cmake/3rdPartyLibs/jsoncpp/jsoncpp-config.cmake) +try_inc(cmake/3rdPartyLibs/lzma-9.20/lzma-9.20-config.cmake) +try_inc(cmake/3rdPartyLibs/md5/md5-config.cmake) +try_inc(cmake/3rdPartyLibs/vectormath/vectormath-config.cmake) +try_inc(cmake/3rdPartyLibs/wyhash/wyhash-config.cmake) +try_inc(cmake/3rdPartyLibs/zlib-ng/zlib-ng-config.cmake) +try_inc(cmake/3rdPartyLibs/zstd-1.4.5/zstd-1.4.5-config.cmake) +try_inc(cmake/3rdPartyLibs/fmt/fmt-config.cmake) +try_inc(cmake/3rdPartyLibs/tinyutf8/tinyutf8-config.cmake) +try_inc(cmake/3rdPartyLibs/utf8cpp/utf8cpp-config.cmake) +try_inc(cmake/3rdPartyLibs/tinyimageformat/tinyimageformat-config.cmake) +try_inc(cmake/3rdPartyLibs/gainputstatic/gainputstatic-config.cmake) +try_inc(cmake/3rdPartyLibs/imgui/imgui-config.cmake) +try_inc(cmake/3rdPartyLibs/RenderDoc/RenderDoc-config.cmake) +try_inc(cmake/3rdPartyLibs/adlSdk/adlSdk-config.cmake) +try_inc(cmake/3rdPartyLibs/dxc/dxc-config.cmake) +try_inc(cmake/3rdPartyLibs/ska_hash_map/ska_hash_map-config.cmake) +try_inc(cmake/3rdPartyLibs/xxHash/xxHash-config.cmake) +try_inc(cmake/3rdPartyLibs/ozz_base/ozz_base-config.cmake) +try_inc(cmake/3rdPartyLibs/ozz_animation/ozz_animation-config.cmake) +try_inc(cmake/3rdPartyLibs/stb/stb-config.cmake) +try_inc(cmake/3rdPartyLibs/ispc_texcomp/ispc_texcomp-config.cmake) +try_inc(cmake/3rdPartyLibs/tinydds/tinydds-config.cmake) +try_inc(cmake/3rdPartyLibs/Jolt/Jolt-config.cmake) +try_inc(cmake/3rdPartyLibs/uriparser/uriparser-config.cmake) + +## try_inc(share/Tracy/TracyConfig.cmake) + +try_inc(cmake/core/NauKernel/NauKernel-config.cmake) + +try_inc(cmake/3rdPartyLibs/binPack2D/binPack2D-config.cmake) + +try_inc(cmake/core/NauKernel/NauKernel-config.cmake) + +try_inc(cmake/core/CoreAssets/CoreAssets-config.cmake) +try_inc(cmake/core/CoreScene/CoreScene-config.cmake) +try_inc(cmake/core/PlatformAppApi/PlatformAppApi-config.cmake) +try_inc(cmake/core/PlatformApp/PlatformApp-config.cmake) +try_inc(cmake/core/CoreInput/CoreInput-config.cmake) +try_inc(cmake/core/Render/Render-config.cmake) +try_inc(cmake/core/Render/Render-config.cmake) +try_inc(cmake/core/GraphicsAssets/GraphicsAssets-config.cmake) +try_inc(cmake/core/CoreInput/CoreInput-config.cmake) +try_inc(cmake/core/Animation/Animation-config.cmake) +try_inc(cmake/core/ext_tinyxml2/ext_tinyxml2-config.cmake) +try_inc(cmake/core/ext_clipper/ext_clipper-config.cmake) +try_inc(cmake/core/ext_edtaa3func/ext_edtaa3func-config.cmake) +try_inc(cmake/core/ext_convertUTF/ext_convertUTF-config.cmake) +try_inc(cmake/core/ext_poly2tri/ext_poly2tri-config.cmake) +try_inc(cmake/core/png/png-config.cmake) +try_inc(cmake/core/external/external-config.cmake) +try_inc(cmake/core/cocos2d/cocos2d-config.cmake) +try_inc(cmake/core/ui/ui-config.cmake) +try_inc(cmake/core/DebugRenderer/DebugRenderer-config.cmake) +try_inc(cmake/core/VFX/VFX-config.cmake) +try_inc(cmake/core/Graphics/Graphics-config.cmake) +try_inc(cmake/core/CoreAssetFormats/CoreAssetFormats-config.cmake) +try_inc(cmake/core/NauFramework/NauFramework-config.cmake) +try_inc(cmake/core/Physics/Physics-config.cmake) +try_inc(cmake/core/PhysicsJolt/PhysicsJolt-config.cmake) +try_inc(cmake/core/Network/Network-config.cmake) +try_inc(cmake/core/Audio/Audio-config.cmake) + +try_inc(cmake/tools/ShaderCompilerTool/ShaderCompilerTool-config.cmake) + +include(source/game/%%(ProjectName:no_space)%%.cmake) + +file(GLOB Sources + source/main.cpp +) + +set(TargetName %%(ProjectName:no_space)%%Main) + +add_executable(${TargetName} ${Sources}) + +target_precompile_headers(${TargetName} PRIVATE source/pch.h) + +target_link_libraries(${TargetName} PRIVATE + MainGameModule + PlatformAppApi + Animation + CoreInput + NauFramework + imgui + Physics + Graphics + + jsoncpp +) + +if(CMAKE_GENERATOR MATCHES "Visual Studio") + set(CURRENT_CONFIG $) + set(ENGINE_BIN_PATH "PATH=${NAU_BUILD_DIR}/bin/${CMAKE_BUILD_TYPE}/${CURRENT_CONFIG};%PATH%") + set_target_properties(${TargetName} PROPERTIES VS_DEBUGGER_ENVIRONMENT "${ENGINE_BIN_PATH}") + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${TargetName}) +endif() + +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${Sources}) + +nau_add_compile_options(${TargetName}) + +nau_target_link_modules(${TargetName} + MainGameModule + PlatformApp + Animation + Audio + CoreScene + CoreAssets + GraphicsAssets + DebugRenderer + CoreAssetFormats + CoreInput + Graphics + Physics + PhysicsJolt +) + +add_custom_command(TARGET ${TargetName} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + -DFileToCheck=${NauEngineFolder}/lib/$ + -P ${NauEngineFolder}/cmake/for_build/check.cmake + COMMENT "Checking if ${NauEngineFolder}/lib/$ exists...") + +add_custom_command(TARGET ${TargetName} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${NauEngineFolder}/bin/$" + $ +) + +## add_custom_command(TARGET ${TargetName} POST_BUILD +## COMMAND ${CMAKE_COMMAND} -E copy +## "${NauEngineFolder}/bin/TracyClient.dll" +## $ +## ) + +install(TARGETS ${TargetName} + DESTINATION bin +) \ No newline at end of file diff --git a/project_templates/sample_scene/CMakePresets.json b/project_templates/sample_scene/CMakePresets.json new file mode 100644 index 00000000..08e40f19 --- /dev/null +++ b/project_templates/sample_scene/CMakePresets.json @@ -0,0 +1,96 @@ +{ + "version": 5, + "configurePresets": [ + { + "name": "config_base", + "hidden": true, + "binaryDir": "${sourceDir}/build/${presetName}", + "installDir": "${sourceDir}/dist/${presetName}", + "cacheVariables": { + "CMAKE_EXPORT_COMPILE_COMMANDS": true, + "CMAKE_SYSTEM_VERSION": "10.0", + "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "NAU_BUILD_SDK": true, + "BUILD_SHARED_LIBS": false, + "EASTL_BUILD_BENCHMARK": false, + "EASTL_BUILD_TESTS": false + } + }, + + { + "name": "vs_2022_base", + "hidden": true, + "generator": "Visual Studio 17 2022", + "cacheVariables": { + "CMAKE_CONFIGURATION_TYPES": "Debug;Release" + }, + + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": ["Windows"], + "intelliSenseMode": "windows-msvc-x64" + } + } + }, + + { + "name": "win_vs2022_x64_base", + "inherits": ["config_base", "vs_2022_base"], + "hidden": true, + "toolset": { + "strategy": "set", + "value": "v143,host=x64" + }, + "architecture": { + "strategy": "set", + "value": "x64" + } + }, + + + { + "name": "win_vs2022_x64", + "inherits": ["win_vs2022_x64_base"], + "displayName": "Visual Studio 2022 x64", + "description": "Configure for Visual Studio 17 2022", + "hidden": false + }, + { + "name": "win_vs2022_x64_dll", + "inherits": ["config_base", "vs_2022_base"], + "displayName": "Visual Studio 2022 x64, DLL", + "description": "Dll configure for Visual Studio 17 2022", + "hidden": false, + "cacheVariables": { + "BUILD_SHARED_LIBS": true + } + } + + ], + "buildPresets": [ + { + "name": "VS Debug", + "displayName": "Visual Studio Community 2022 x64 Debug", + "configurePreset": "win_vs2022_x64", + "configuration": "Debug" + }, + { + "name": "VS Debug Dll", + "displayName": "Visual Studio Community 2022 x64 Debug Dll", + "configurePreset": "win_vs2022_x64_dll", + "configuration": "Debug" + }, + { + "name": "VS Release", + "displayName": "Visual Studio Community 2022 x64 Release", + "configurePreset": "win_vs2022_x64", + "configuration": "Release" + }, + { + "name": "VS Release Dll", + "displayName": "Visual Studio Community 2022 x64 Release", + "configurePreset": "win_vs2022_x64_dll", + "configuration": "Release" + } + ] +} diff --git a/project_templates/sample_scene/config/app.json b/project_templates/sample_scene/config/app.json new file mode 100644 index 00000000..62bc38d5 --- /dev/null +++ b/project_templates/sample_scene/config/app.json @@ -0,0 +1,19 @@ +{ + "app": { + "name": "%%(ProjectName: no_space)%%", + "author": "Nau Engine", + "version": "%%(Version: no_space)%%", + "log": { + "files": [ + "$folder{LocalAppData}/nau/${app/name}/logs/log", + { + "contentType": "application/text", + "location": "$folder{ExecutableLocation}/logs", + "fileNamePrefix": "log", + "optional": true + } + ] + } + }, + "contentPath": "test" +} \ No newline at end of file diff --git a/project_templates/sample_scene/config/scene.json b/project_templates/sample_scene/config/scene.json new file mode 100644 index 00000000..4fd83b5c --- /dev/null +++ b/project_templates/sample_scene/config/scene.json @@ -0,0 +1,5 @@ +{ + "scene": { + "startupScene": "asset:/content/scenes/main.nausd_scene" + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/config/vfs.json b/project_templates/sample_scene/config/vfs.json new file mode 100644 index 00000000..2ecc3501 --- /dev/null +++ b/project_templates/sample_scene/config/vfs.json @@ -0,0 +1,56 @@ +{ + "app":{ + "vfs":{ + "mounts":[ + { + "mountPoint":"/content", + "path":"${projectDir}/content" + }, + { + "mountPoint":"/assets_db", + "path":"${projectDir}/assets_database", + "isOptional":true + }, + { + "mountPoint":"/res", + "path":"${projectDir}/resources", + "enabled":true, + "isOptional":true + }, + { + "mountPoint":"/content", + "path":"${projectDir}/content/content.assets", + "isOptional":true + }, + { + "mountPoint":"/content", + "path":"${projectDir}/content.packs/content.nau_pack", + "enabled":false, + "isOptional":true + }, + { + "mountPoint":"/app/data", + "path":"$folder{LocalAppData}/nau/${app/name}/data", + "isOptional":true + }, + { + "mountPoint":"/user/docs", + "path":"$folder{UserDocuments}/nau/${app/name}", + "isOptional":true + } + ] + }, + "asset_db":{ + "mounts":[ + { + "kind":"asset_db", + "entryPoint":"assets_db/database.db" + }, + { + "kind":"asset_db", + "entryPoint":"/content/assets_database/database.db" + } + ] + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/animation/Teapot.003Action.blk b/project_templates/sample_scene/content/animation/Teapot.003Action.blk new file mode 100644 index 00000000..6c354827 --- /dev/null +++ b/project_templates/sample_scene/content/animation/Teapot.003Action.blk @@ -0,0 +1,24 @@ +frame{ +i:i=3 +event{ +id:t="one-time" +type:i=0 +dir:i=0 +} +} +frame{ +i:i=10 +event{ +id:t="long-lasting" +type:i=1 +dir:i=0 +} +} +frame{ +i:i=20 +event{ +id:t="long-lasting" +type:i=2 +dir:i=0 +} +} diff --git a/project_templates/sample_scene/content/gui_content/Images/Arrow-default.png b/project_templates/sample_scene/content/gui_content/Images/Arrow-default.png new file mode 100644 index 00000000..56ec6117 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Arrow-default.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Arrow-hover.png b/project_templates/sample_scene/content/gui_content/Images/Arrow-hover.png new file mode 100644 index 00000000..312d8294 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Arrow-hover.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Arrow-pressing.png b/project_templates/sample_scene/content/gui_content/Images/Arrow-pressing.png new file mode 100644 index 00000000..212a24b0 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Arrow-pressing.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Button-default.png b/project_templates/sample_scene/content/gui_content/Images/Button-default.png new file mode 100644 index 00000000..513aa5c0 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Button-default.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Button-disabled.png b/project_templates/sample_scene/content/gui_content/Images/Button-disabled.png new file mode 100644 index 00000000..29d5776a Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Button-disabled.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Button-hover.png b/project_templates/sample_scene/content/gui_content/Images/Button-hover.png new file mode 100644 index 00000000..c46acd31 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Button-hover.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Button-pressing.png b/project_templates/sample_scene/content/gui_content/Images/Button-pressing.png new file mode 100644 index 00000000..8568a437 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Button-pressing.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Image-placeholder.png b/project_templates/sample_scene/content/gui_content/Images/Image-placeholder.png new file mode 100644 index 00000000..9b3e5704 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Image-placeholder.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Slider-bar-default.png b/project_templates/sample_scene/content/gui_content/Images/Slider-bar-default.png new file mode 100644 index 00000000..821cd52c Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Slider-bar-default.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Slider-default.png b/project_templates/sample_scene/content/gui_content/Images/Slider-default.png new file mode 100644 index 00000000..d24114bc Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Slider-default.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Slider-hover.png b/project_templates/sample_scene/content/gui_content/Images/Slider-hover.png new file mode 100644 index 00000000..4e5cdf39 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Slider-hover.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/Slider-pressing.png b/project_templates/sample_scene/content/gui_content/Images/Slider-pressing.png new file mode 100644 index 00000000..849d0f86 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/Slider-pressing.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/nau_logo.png b/project_templates/sample_scene/content/gui_content/Images/nau_logo.png new file mode 100644 index 00000000..6fc6e4a4 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/nau_logo.png differ diff --git a/project_templates/sample_scene/content/gui_content/Images/nau_logo_alpha.png b/project_templates/sample_scene/content/gui_content/Images/nau_logo_alpha.png new file mode 100644 index 00000000..9c8fb0a1 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/Images/nau_logo_alpha.png differ diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans16.fnt b/project_templates/sample_scene/content/gui_content/fonts/OpenSans16.fnt new file mode 100644 index 00000000..d0fca4c2 --- /dev/null +++ b/project_templates/sample_scene/content/gui_content/fonts/OpenSans16.fnt @@ -0,0 +1,415 @@ +info face="Open Sans" size=16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0 +common lineHeight=16 base=12 scaleW=512 scaleH=128 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="OpenSans16_0.png" +chars count=411 +char id=13 x=232 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=15 +char id=32 x=224 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=15 +char id=33 x=427 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=34 x=104 y=57 width=4 height=3 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=35 x=494 y=20 width=8 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=36 x=427 y=11 width=6 height=9 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=37 x=415 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=38 x=435 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=39 x=129 y=57 width=2 height=3 xoffset=0 yoffset=4 xadvance=2 page=0 chnl=15 +char id=40 x=238 y=12 width=3 height=10 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=41 x=228 y=12 width=4 height=10 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=42 x=31 y=59 width=6 height=5 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=43 x=38 y=58 width=6 height=5 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=15 +char id=44 x=113 y=57 width=3 height=3 xoffset=0 yoffset=11 xadvance=3 page=0 chnl=15 +char id=45 x=207 y=57 width=4 height=1 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=15 +char id=46 x=216 y=57 width=3 height=1 xoffset=0 yoffset=11 xadvance=3 page=0 chnl=15 +char id=47 x=413 y=39 width=5 height=8 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=48 x=349 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=49 x=407 y=39 width=5 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=50 x=363 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=51 x=174 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=52 x=63 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=53 x=181 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=54 x=359 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=55 x=209 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=56 x=328 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=57 x=300 y=40 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=58 x=6 y=59 width=3 height=6 xoffset=0 yoffset=6 xadvance=3 page=0 chnl=15 +char id=59 x=435 y=39 width=3 height=8 xoffset=0 yoffset=6 xadvance=3 page=0 chnl=15 +char id=60 x=24 y=59 width=6 height=5 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=61 x=55 y=58 width=6 height=3 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=62 x=17 y=59 width=6 height=5 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=63 x=188 y=41 width=6 height=8 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=15 +char id=64 x=288 y=12 width=10 height=9 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=65 x=425 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=66 x=24 y=43 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=67 x=40 y=42 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=68 x=243 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=69 x=160 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=70 x=356 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=71 x=234 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=72 x=72 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=73 x=443 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=74 x=198 y=12 width=5 height=10 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=15 +char id=75 x=327 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=76 x=293 y=40 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=77 x=146 y=23 width=10 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=78 x=198 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=79 x=245 y=22 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=80 x=367 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=81 x=428 y=0 width=9 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=82 x=32 y=42 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=83 x=244 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=84 x=189 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=85 x=9 y=34 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=86 x=144 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=87 x=26 y=24 width=11 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=88 x=135 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=89 x=126 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=90 x=48 y=42 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=91 x=233 y=12 width=4 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=92 x=401 y=39 width=5 height=8 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=93 x=508 y=0 width=3 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=94 x=10 y=59 width=6 height=5 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=95 x=192 y=57 width=7 height=1 xoffset=-1 yoffset=13 xadvance=5 page=0 chnl=15 +char id=96 x=149 y=57 width=3 height=2 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=15 +char id=97 x=396 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=98 x=495 y=29 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=99 x=389 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=100 x=112 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=101 x=382 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=102 x=307 y=40 width=6 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=15 +char id=103 x=308 y=11 width=8 height=9 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=104 x=503 y=29 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=105 x=447 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=106 x=283 y=0 width=4 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=15 +char id=107 x=258 y=40 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=108 x=451 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=109 x=55 y=51 width=10 height=6 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=110 x=307 y=49 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=111 x=299 y=49 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=112 x=341 y=11 width=7 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=113 x=325 y=11 width=7 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=114 x=499 y=45 width=5 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=115 x=493 y=45 width=5 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=116 x=472 y=39 width=5 height=7 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=15 +char id=117 x=291 y=49 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=118 x=315 y=48 width=7 height=6 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=119 x=137 y=50 width=9 height=6 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=120 x=431 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=121 x=349 y=11 width=7 height=9 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=122 x=505 y=45 width=5 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=123 x=222 y=12 width=5 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=124 x=288 y=0 width=2 height=11 xoffset=2 yoffset=4 xadvance=6 page=0 chnl=15 +char id=125 x=216 y=12 width=5 height=10 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=126 x=135 y=57 width=6 height=2 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=1024 x=264 y=0 width=6 height=11 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=1025 x=184 y=12 width=6 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=1026 x=445 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1027 x=257 y=0 width=6 height=11 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=1028 x=311 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1029 x=251 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1030 x=423 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1031 x=210 y=12 width=5 height=10 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=15 +char id=1032 x=204 y=12 width=5 height=10 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1033 x=489 y=11 width=12 height=8 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1034 x=62 y=23 width=11 height=8 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1035 x=375 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1036 x=225 y=0 width=7 height=11 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=1037 x=165 y=0 width=8 height=11 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=15 +char id=1038 x=217 y=0 width=7 height=11 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=1039 x=0 y=14 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1040 x=365 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1041 x=152 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1042 x=471 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1043 x=223 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1044 x=488 y=0 width=9 height=10 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1045 x=216 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1046 x=38 y=24 width=11 height=8 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1047 x=447 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1048 x=252 y=31 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1049 x=138 y=0 width=8 height=11 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=15 +char id=1050 x=439 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1051 x=225 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1052 x=168 y=23 width=10 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1053 x=216 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1054 x=405 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1055 x=207 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1056 x=423 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1057 x=415 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1058 x=153 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1059 x=399 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1060 x=395 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1061 x=117 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1062 x=498 y=0 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1063 x=375 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1064 x=50 y=24 width=11 height=8 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1065 x=291 y=0 width=12 height=10 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1066 x=335 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1067 x=295 y=22 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1068 x=88 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1069 x=144 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1070 x=0 y=25 width=12 height=8 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1071 x=16 y=43 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1072 x=480 y=46 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1073 x=64 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1074 x=267 y=49 width=7 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1075 x=487 y=46 width=5 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1076 x=99 y=32 width=8 height=8 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1077 x=473 y=47 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1078 x=66 y=50 width=10 height=6 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1079 x=361 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1080 x=323 y=48 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1081 x=373 y=11 width=7 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=1082 x=347 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1083 x=259 y=49 width=7 height=6 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1084 x=201 y=50 width=8 height=6 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1085 x=251 y=50 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1086 x=243 y=50 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1087 x=235 y=50 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1088 x=365 y=11 width=7 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1089 x=368 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1090 x=227 y=50 width=7 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1091 x=389 y=11 width=7 height=9 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1092 x=156 y=0 width=8 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1093 x=403 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1094 x=431 y=30 width=7 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1095 x=438 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1096 x=0 y=52 width=10 height=6 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1097 x=190 y=23 width=10 height=8 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1098 x=107 y=50 width=9 height=6 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1099 x=174 y=50 width=8 height=6 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1100 x=275 y=49 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1101 x=445 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1102 x=97 y=50 width=9 height=6 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1103 x=452 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1104 x=413 y=11 width=6 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1105 x=286 y=40 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1106 x=174 y=0 width=8 height=11 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1107 x=469 y=11 width=5 height=9 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=15 +char id=1108 x=459 y=47 width=6 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1109 x=0 y=59 width=5 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1110 x=419 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1111 x=389 y=39 width=5 height=8 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1112 x=278 y=0 width=4 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1113 x=489 y=38 width=10 height=6 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1114 x=478 y=39 width=10 height=6 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1115 x=18 y=34 width=8 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1116 x=462 y=11 width=6 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1117 x=333 y=11 width=7 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=1118 x=22 y=0 width=7 height=12 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1119 x=463 y=30 width=7 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1120 x=86 y=23 width=11 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1121 x=500 y=38 width=10 height=6 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1122 x=275 y=22 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1123 x=455 y=39 width=8 height=7 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=15 +char id=1124 x=98 y=23 width=11 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1125 x=77 y=50 width=9 height=6 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1126 x=475 y=20 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1127 x=156 y=50 width=8 height=6 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1128 x=134 y=23 width=11 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1129 x=87 y=50 width=9 height=6 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1130 x=54 y=33 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1131 x=165 y=50 width=8 height=6 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1132 x=74 y=23 width=11 height=8 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1133 x=11 y=52 width=10 height=6 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1134 x=30 y=0 width=7 height=12 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=1135 x=105 y=12 width=7 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=15 +char id=1136 x=385 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1137 x=147 y=0 width=8 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1138 x=285 y=22 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1139 x=331 y=48 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1140 x=265 y=22 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1141 x=147 y=50 width=8 height=6 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1142 x=119 y=0 width=9 height=11 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=15 +char id=1143 x=299 y=11 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1144 x=46 y=0 width=14 height=11 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15 +char id=1145 x=242 y=12 width=12 height=9 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=1146 x=478 y=0 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=15 +char id=1147 x=479 y=29 width=7 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=1148 x=10 y=0 width=11 height=12 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15 +char id=1149 x=98 y=0 width=10 height=11 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=15 +char id=1150 x=86 y=0 width=11 height=11 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=15 +char id=1151 x=255 y=12 width=10 height=9 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=15 +char id=1152 x=249 y=0 width=7 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1153 x=441 y=11 width=6 height=9 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1154 x=464 y=39 width=7 height=7 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=15 +char id=1155 x=62 y=58 width=6 height=3 xoffset=-6 yoffset=3 xadvance=0 page=0 chnl=15 +char id=1156 x=142 y=57 width=6 height=2 xoffset=-6 yoffset=3 xadvance=0 page=0 chnl=15 +char id=1157 x=153 y=57 width=2 height=2 xoffset=-4 yoffset=3 xadvance=0 page=0 chnl=15 +char id=1158 x=156 y=57 width=2 height=2 xoffset=-4 yoffset=3 xadvance=0 page=0 chnl=15 +char id=1160 x=304 y=0 width=12 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1161 x=317 y=0 width=12 height=10 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1162 x=0 y=0 width=9 height=13 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=15 +char id=1163 x=192 y=0 width=8 height=11 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=15 +char id=1164 x=180 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1165 x=171 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1166 x=407 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1167 x=381 y=11 width=7 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1168 x=177 y=12 width=6 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=1169 x=395 y=39 width=5 height=8 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=15 +char id=1170 x=383 y=30 width=7 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1171 x=354 y=48 width=6 height=6 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1172 x=209 y=0 width=7 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1173 x=455 y=11 width=6 height=9 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1174 x=342 y=0 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1175 x=201 y=23 width=10 height=8 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1176 x=81 y=12 width=7 height=10 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1177 x=272 y=40 width=6 height=8 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1178 x=54 y=12 width=8 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1179 x=96 y=41 width=7 height=8 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1180 x=335 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1181 x=466 y=47 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1182 x=27 y=33 width=8 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1183 x=0 y=43 width=7 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1184 x=305 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1185 x=210 y=50 width=8 height=6 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1186 x=468 y=0 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1187 x=36 y=33 width=8 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1188 x=179 y=23 width=10 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1189 x=127 y=50 width=9 height=6 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1190 x=61 y=0 width=12 height=11 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1191 x=266 y=12 width=10 height=9 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1192 x=455 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1193 x=339 y=48 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1194 x=121 y=12 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1195 x=230 y=41 width=6 height=8 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1196 x=27 y=13 width=8 height=10 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1197 x=8 y=43 width=7 height=8 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1198 x=108 y=32 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1199 x=405 y=11 width=7 height=9 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1200 x=270 y=31 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1201 x=397 y=11 width=7 height=9 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1202 x=9 y=14 width=8 height=10 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1203 x=104 y=41 width=7 height=8 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1204 x=330 y=0 width=11 height=10 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1205 x=255 y=22 width=9 height=8 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1206 x=18 y=13 width=8 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1207 x=303 y=31 width=7 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1208 x=295 y=31 width=7 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1209 x=424 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1210 x=287 y=31 width=7 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1211 x=279 y=31 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1212 x=315 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1213 x=183 y=50 width=8 height=6 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1214 x=458 y=0 width=9 height=10 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1215 x=45 y=33 width=8 height=8 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1216 x=439 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1217 x=74 y=0 width=11 height=11 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=15 +char id=1218 x=277 y=12 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1219 x=129 y=0 width=8 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1220 x=448 y=11 width=6 height=9 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1221 x=438 y=0 width=9 height=10 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1222 x=81 y=32 width=8 height=8 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1223 x=183 y=0 width=8 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1224 x=317 y=11 width=7 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1225 x=448 y=0 width=9 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1226 x=90 y=32 width=8 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1227 x=129 y=12 width=7 height=10 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1228 x=370 y=39 width=6 height=8 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1229 x=354 y=0 width=11 height=10 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1230 x=465 y=21 width=9 height=8 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1231 x=431 y=39 width=3 height=8 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=1232 x=109 y=0 width=9 height=11 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=15 +char id=1233 x=434 y=11 width=6 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1234 x=398 y=0 width=9 height=10 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=15 +char id=1235 x=202 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1236 x=110 y=23 width=11 height=8 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1237 x=44 y=51 width=10 height=6 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1238 x=271 y=0 width=6 height=11 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=1239 x=420 y=11 width=6 height=9 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1240 x=162 y=32 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1241 x=375 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1242 x=36 y=13 width=8 height=10 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1243 x=237 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1244 x=366 y=0 width=11 height=10 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=15 +char id=1245 x=157 y=23 width=10 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1246 x=145 y=12 width=7 height=10 xoffset=0 yoffset=2 xadvance=6 page=0 chnl=15 +char id=1247 x=279 y=40 width=6 height=8 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=15 +char id=1248 x=343 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1249 x=357 y=11 width=7 height=9 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1250 x=63 y=12 width=8 height=10 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1251 x=455 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1252 x=72 y=12 width=8 height=10 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1253 x=487 y=29 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1254 x=418 y=0 width=9 height=10 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=1255 x=319 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1256 x=502 y=11 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1257 x=283 y=49 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1258 x=408 y=0 width=9 height=10 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=1259 x=391 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1260 x=153 y=12 width=7 height=10 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=1261 x=335 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=15 +char id=1262 x=161 y=12 width=7 height=10 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=1263 x=241 y=0 width=7 height=11 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1264 x=89 y=12 width=7 height=10 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=15 +char id=1265 x=201 y=0 width=7 height=11 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1266 x=233 y=0 width=7 height=11 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=1267 x=38 y=0 width=7 height=12 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=15 +char id=1268 x=169 y=12 width=7 height=10 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1269 x=167 y=41 width=6 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1270 x=191 y=12 width=6 height=10 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1271 x=383 y=39 width=5 height=8 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1272 x=388 y=0 width=9 height=10 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=15 +char id=1273 x=261 y=31 width=8 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1274 x=137 y=12 width=7 height=10 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1275 x=195 y=41 width=6 height=8 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1276 x=45 y=13 width=8 height=10 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1277 x=56 y=42 width=7 height=8 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1278 x=485 y=20 width=8 height=8 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1279 x=410 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1280 x=72 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1281 x=80 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1282 x=223 y=23 width=10 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1283 x=234 y=23 width=10 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1284 x=212 y=23 width=10 height=8 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1285 x=117 y=50 width=9 height=6 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1286 x=97 y=12 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1287 x=265 y=40 width=6 height=8 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=1288 x=13 y=25 width=12 height=8 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1289 x=22 y=52 width=10 height=6 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1290 x=122 y=23 width=11 height=8 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=15 +char id=1291 x=33 y=51 width=10 height=6 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1292 x=503 y=20 width=8 height=8 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1293 x=219 y=50 width=7 height=6 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1294 x=355 y=21 width=9 height=8 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1295 x=192 y=50 width=8 height=6 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1296 x=120 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1297 x=417 y=48 width=6 height=6 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=1298 x=378 y=0 width=9 height=10 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1299 x=0 y=34 width=8 height=8 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15 +char id=8192 x=212 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=6 page=0 chnl=15 +char id=8193 x=256 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=11 page=0 chnl=15 +char id=8194 x=264 y=56 width=3 height=1 xoffset=-1 yoffset=15 xadvance=6 page=0 chnl=15 +char id=8195 x=260 y=56 width=3 height=1 xoffset=-1 yoffset=15 xadvance=11 page=0 chnl=15 +char id=8196 x=252 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=4 page=0 chnl=15 +char id=8197 x=248 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=15 +char id=8198 x=244 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=2 page=0 chnl=15 +char id=8199 x=240 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=6 page=0 chnl=15 +char id=8200 x=236 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=15 +char id=8201 x=228 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=2 page=0 chnl=15 +char id=8202 x=220 y=57 width=3 height=1 xoffset=-1 yoffset=15 xadvance=1 page=0 chnl=15 +char id=8203 x=268 y=56 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=200 y=57 width=6 height=1 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=15 +char id=8212 x=159 y=57 width=11 height=1 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=8213 x=171 y=57 width=11 height=1 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=8215 x=69 y=57 width=6 height=3 xoffset=-1 yoffset=12 xadvance=5 page=0 chnl=15 +char id=8216 x=125 y=57 width=3 height=3 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=15 +char id=8217 x=132 y=57 width=2 height=3 xoffset=0 yoffset=4 xadvance=2 page=0 chnl=15 +char id=8218 x=109 y=57 width=3 height=3 xoffset=0 yoffset=11 xadvance=3 page=0 chnl=15 +char id=8219 x=121 y=57 width=3 height=3 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=15 +char id=8220 x=88 y=57 width=5 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=15 +char id=8221 x=99 y=57 width=4 height=3 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=8222 x=82 y=57 width=5 height=3 xoffset=0 yoffset=11 xadvance=5 page=0 chnl=15 +char id=8224 x=314 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=8225 x=321 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=8226 x=94 y=57 width=4 height=3 xoffset=0 yoffset=6 xadvance=4 page=0 chnl=15 +char id=8230 x=183 y=57 width=8 height=1 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=15 +char id=8240 x=475 y=11 width=13 height=8 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15 +char id=8242 x=117 y=57 width=3 height=3 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=15 +char id=8243 x=76 y=57 width=5 height=3 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=15 +char id=8249 x=50 y=58 width=4 height=5 xoffset=0 yoffset=6 xadvance=3 page=0 chnl=15 +char id=8250 x=45 y=58 width=4 height=5 xoffset=0 yoffset=6 xadvance=3 page=0 chnl=15 +char id=8252 x=377 y=39 width=5 height=8 xoffset=0 yoffset=4 xadvance=5 page=0 chnl=15 +char id=8260 x=128 y=41 width=7 height=8 xoffset=-3 yoffset=4 xadvance=1 page=0 chnl=15 +char id=8355 x=342 y=39 width=6 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=8356 x=136 y=41 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=8359 x=345 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=8362 x=325 y=21 width=9 height=8 xoffset=0 yoffset=4 xadvance=9 page=0 chnl=15 +char id=8363 x=113 y=12 width=7 height=10 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=8364 x=351 y=30 width=7 height=8 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans16_0.png b/project_templates/sample_scene/content/gui_content/fonts/OpenSans16_0.png new file mode 100644 index 00000000..b0f29f94 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/fonts/OpenSans16_0.png differ diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans24.fnt b/project_templates/sample_scene/content/gui_content/fonts/OpenSans24.fnt new file mode 100644 index 00000000..d3da1935 --- /dev/null +++ b/project_templates/sample_scene/content/gui_content/fonts/OpenSans24.fnt @@ -0,0 +1,415 @@ +info face="Open Sans" size=24 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0 +common lineHeight=24 base=19 scaleW=512 scaleH=128 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="OpenSans24_0.png" +chars count=411 +char id=13 x=510 y=14 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=32 x=510 y=24 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=33 x=190 y=86 width=3 height=12 xoffset=1 yoffset=7 xadvance=4 page=0 chnl=15 +char id=34 x=45 y=114 width=5 height=5 xoffset=1 yoffset=7 xadvance=7 page=0 chnl=15 +char id=35 x=354 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=36 x=388 y=33 width=9 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=37 x=321 y=47 width=14 height=12 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15 +char id=38 x=422 y=47 width=13 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=39 x=509 y=72 width=2 height=5 xoffset=1 yoffset=7 xadvance=4 page=0 chnl=15 +char id=40 x=453 y=17 width=5 height=15 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=15 +char id=41 x=471 y=17 width=5 height=15 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=15 +char id=42 x=266 y=96 width=9 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=43 x=206 y=98 width=9 height=9 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15 +char id=44 x=96 y=110 width=4 height=4 xoffset=0 yoffset=17 xadvance=4 page=0 chnl=15 +char id=45 x=189 y=109 width=5 height=3 xoffset=0 yoffset=13 xadvance=5 page=0 chnl=15 +char id=46 x=195 y=109 width=3 height=3 xoffset=1 yoffset=16 xadvance=4 page=0 chnl=15 +char id=47 x=167 y=86 width=6 height=12 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=48 x=449 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=49 x=506 y=46 width=5 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=50 x=439 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=51 x=429 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=52 x=242 y=73 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=53 x=58 y=88 width=8 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=54 x=409 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=55 x=379 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=56 x=369 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=57 x=359 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=58 x=502 y=96 width=3 height=9 xoffset=1 yoffset=10 xadvance=4 page=0 chnl=15 +char id=59 x=235 y=86 width=4 height=11 xoffset=0 yoffset=10 xadvance=4 page=0 chnl=15 +char id=60 x=246 y=96 width=9 height=9 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15 +char id=61 x=6 y=114 width=9 height=6 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=62 x=226 y=98 width=9 height=9 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15 +char id=63 x=129 y=87 width=7 height=12 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=15 +char id=64 x=477 y=17 width=15 height=14 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=65 x=222 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=66 x=297 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=67 x=306 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=68 x=294 y=60 width=11 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=69 x=94 y=87 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15 +char id=70 x=85 y=87 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15 +char id=71 x=42 y=64 width=12 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=72 x=253 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=73 x=174 y=86 width=3 height=12 xoffset=1 yoffset=7 xadvance=5 page=0 chnl=15 +char id=74 x=441 y=17 width=5 height=15 xoffset=-2 yoffset=7 xadvance=4 page=0 chnl=15 +char id=75 x=308 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=76 x=103 y=87 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15 +char id=77 x=464 y=47 width=13 height=12 xoffset=1 yoffset=7 xadvance=15 page=0 chnl=15 +char id=78 x=330 y=60 width=11 height=12 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15 +char id=79 x=0 y=65 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=80 x=459 y=73 width=9 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=81 x=192 y=17 width=13 height=15 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=82 x=22 y=78 width=10 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=83 x=419 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=84 x=414 y=60 width=10 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=85 x=88 y=74 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=86 x=246 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=87 x=78 y=48 width=16 height=12 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=88 x=480 y=60 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=89 x=469 y=60 width=10 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=90 x=458 y=60 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=91 x=447 y=17 width=5 height=15 xoffset=1 yoffset=7 xadvance=5 page=0 chnl=15 +char id=92 x=145 y=87 width=7 height=12 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=93 x=459 y=17 width=5 height=15 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=15 +char id=94 x=114 y=100 width=10 height=9 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=95 x=199 y=108 width=8 height=2 xoffset=0 yoffset=20 xadvance=7 page=0 chnl=15 +char id=96 x=91 y=111 width=4 height=4 xoffset=0 yoffset=6 xadvance=5 page=0 chnl=15 +char id=97 x=216 y=98 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=98 x=298 y=33 width=9 height=13 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 +char id=99 x=425 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=100 x=248 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=101 x=196 y=98 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=102 x=27 y=50 width=7 height=13 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=15 +char id=103 x=328 y=33 width=9 height=13 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=104 x=417 y=33 width=8 height=13 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 +char id=105 x=507 y=17 width=2 height=13 xoffset=1 yoffset=6 xadvance=4 page=0 chnl=15 +char id=106 x=112 y=0 width=4 height=17 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=15 +char id=107 x=462 y=33 width=8 height=13 xoffset=1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=108 x=507 y=31 width=2 height=13 xoffset=1 yoffset=6 xadvance=4 page=0 chnl=15 +char id=109 x=240 y=86 width=14 height=9 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15 +char id=110 x=416 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=111 x=92 y=100 width=10 height=9 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=112 x=258 y=33 width=9 height=13 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=113 x=228 y=33 width=9 height=13 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=114 x=488 y=96 width=6 height=9 xoffset=1 yoffset=10 xadvance=7 page=0 chnl=15 +char id=115 x=443 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=116 x=228 y=86 width=6 height=11 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=15 +char id=117 x=452 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=118 x=176 y=99 width=9 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=119 x=387 y=86 width=13 height=9 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15 +char id=120 x=166 y=99 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=121 x=398 y=33 width=9 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=122 x=470 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=123 x=434 y=17 width=6 height=15 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=124 x=117 y=0 width=2 height=17 xoffset=4 yoffset=6 xadvance=9 page=0 chnl=15 +char id=125 x=427 y=17 width=6 height=15 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=126 x=162 y=110 width=9 height=3 xoffset=0 yoffset=12 xadvance=10 page=0 chnl=15 +char id=1024 x=27 y=19 width=8 height=16 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=15 +char id=1025 x=18 y=19 width=8 height=16 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=15 +char id=1026 x=133 y=61 width=12 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1027 x=9 y=20 width=8 height=16 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=15 +char id=1028 x=342 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1029 x=329 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1030 x=182 y=86 width=3 height=12 xoffset=1 yoffset=7 xadvance=5 page=0 chnl=15 +char id=1031 x=36 y=19 width=6 height=16 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=15 +char id=1032 x=465 y=17 width=5 height=15 xoffset=-2 yoffset=7 xadvance=4 page=0 chnl=15 +char id=1033 x=95 y=48 width=16 height=12 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15 +char id=1034 x=180 y=47 width=15 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15 +char id=1035 x=107 y=61 width=12 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1036 x=446 y=0 width=10 height=16 xoffset=1 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1037 x=283 y=0 width=11 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=15 +char id=1038 x=343 y=0 width=11 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1039 x=389 y=17 width=10 height=15 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1040 x=378 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1041 x=10 y=91 width=9 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1042 x=165 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1043 x=67 y=88 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1044 x=245 y=17 width=12 height=15 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1045 x=76 y=88 width=8 height=12 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1046 x=228 y=47 width=15 height=12 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15 +char id=1047 x=499 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1048 x=198 y=60 width=11 height=12 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1049 x=295 y=0 width=11 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=15 +char id=1050 x=187 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1051 x=318 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1052 x=450 y=47 width=13 height=12 xoffset=1 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1053 x=176 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1054 x=366 y=47 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1055 x=154 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1056 x=489 y=73 width=9 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1057 x=258 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1058 x=99 y=74 width=10 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1059 x=210 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1060 x=394 y=47 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1061 x=11 y=78 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1062 x=258 y=17 width=12 height=15 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1063 x=264 y=73 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1064 x=244 y=47 width=15 height=12 xoffset=1 yoffset=7 xadvance=17 page=0 chnl=15 +char id=1065 x=43 y=18 width=17 height=15 xoffset=1 yoffset=7 xadvance=17 page=0 chnl=15 +char id=1066 x=390 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1067 x=81 y=61 width=12 height=12 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15 +char id=1068 x=349 y=73 width=9 height=12 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1069 x=77 y=74 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1070 x=112 y=48 width=16 height=12 xoffset=1 yoffset=7 xadvance=17 page=0 chnl=15 +char id=1071 x=0 y=78 width=10 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1072 x=146 y=100 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1073 x=115 y=34 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1074 x=389 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1075 x=495 y=96 width=6 height=9 xoffset=1 yoffset=10 xadvance=7 page=0 chnl=15 +char id=1076 x=220 y=73 width=10 height=12 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1077 x=316 y=96 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1078 x=359 y=86 width=13 height=9 xoffset=0 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1079 x=479 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1080 x=306 y=96 width=9 height=9 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1081 x=358 y=33 width=9 height=13 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=15 +char id=1082 x=461 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1083 x=296 y=96 width=9 height=9 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1084 x=492 y=86 width=11 height=9 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1085 x=286 y=96 width=9 height=9 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1086 x=48 y=103 width=10 height=9 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1087 x=276 y=96 width=9 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1088 x=168 y=33 width=9 height=13 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1089 x=434 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1090 x=407 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1091 x=278 y=33 width=9 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1092 x=41 y=0 width=12 height=17 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=1093 x=256 y=96 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1094 x=198 y=73 width=10 height=12 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1095 x=398 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1096 x=415 y=86 width=13 height=9 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15 +char id=1097 x=351 y=47 width=14 height=12 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15 +char id=1098 x=480 y=86 width=11 height=9 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1099 x=468 y=86 width=11 height=9 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15 +char id=1100 x=186 y=99 width=9 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1101 x=353 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1102 x=401 y=86 width=13 height=9 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1103 x=344 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1104 x=308 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1105 x=238 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1106 x=66 y=0 width=10 height=17 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1107 x=43 y=50 width=6 height=13 xoffset=1 yoffset=6 xadvance=7 page=0 chnl=15 +char id=1108 x=335 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1109 x=326 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1110 x=508 y=0 width=2 height=13 xoffset=1 yoffset=6 xadvance=4 page=0 chnl=15 +char id=1111 x=50 y=48 width=6 height=13 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=15 +char id=1112 x=107 y=0 width=4 height=17 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=15 +char id=1113 x=270 y=86 width=14 height=9 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1114 x=255 y=86 width=14 height=9 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15 +char id=1115 x=188 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1116 x=426 y=33 width=8 height=13 xoffset=1 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1117 x=148 y=33 width=9 height=13 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=15 +char id=1118 x=97 y=0 width=9 height=17 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1119 x=389 y=73 width=9 height=12 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1120 x=129 y=48 width=16 height=12 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1121 x=345 y=86 width=13 height=9 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15 +char id=1122 x=282 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1123 x=206 y=86 width=10 height=11 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1124 x=196 y=47 width=15 height=12 xoffset=1 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1125 x=429 y=86 width=12 height=9 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1126 x=159 y=60 width=12 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1127 x=103 y=100 width=10 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1128 x=212 y=47 width=15 height=12 xoffset=1 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1129 x=455 y=86 width=12 height=9 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=15 +char id=1130 x=492 y=46 width=13 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1131 x=12 y=104 width=11 height=9 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1132 x=163 y=47 width=16 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15 +char id=1133 x=330 y=86 width=14 height=9 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1134 x=31 y=0 width=9 height=18 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=15 +char id=1135 x=418 y=17 width=8 height=15 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1136 x=380 y=47 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1137 x=54 y=0 width=11 height=17 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=1138 x=408 y=47 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1139 x=81 y=101 width=10 height=9 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1140 x=172 y=60 width=12 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1141 x=136 y=100 width=9 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1142 x=233 y=0 width=12 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1143 x=268 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1144 x=120 y=0 width=21 height=16 xoffset=0 yoffset=7 xadvance=20 page=0 chnl=15 +char id=1145 x=0 y=37 width=19 height=13 xoffset=0 yoffset=10 xadvance=18 page=0 chnl=15 +char id=1146 x=493 y=17 width=13 height=14 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=15 +char id=1147 x=194 y=86 width=11 height=11 xoffset=0 yoffset=9 xadvance=11 page=0 chnl=15 +char id=1148 x=13 y=0 width=17 height=18 xoffset=0 yoffset=1 xadvance=17 page=0 chnl=15 +char id=1149 x=145 y=17 width=15 height=15 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1150 x=79 y=18 width=16 height=15 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1151 x=14 y=65 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1152 x=319 y=0 width=11 height=16 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1153 x=0 y=51 width=8 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1154 x=217 y=86 width=10 height=11 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=15 +char id=1155 x=68 y=111 width=7 height=4 xoffset=-8 yoffset=6 xadvance=0 page=0 chnl=15 +char id=1156 x=181 y=109 width=7 height=3 xoffset=-8 yoffset=7 xadvance=0 page=0 chnl=15 +char id=1157 x=101 y=110 width=3 height=4 xoffset=-6 yoffset=6 xadvance=0 page=0 chnl=15 +char id=1158 x=105 y=110 width=3 height=4 xoffset=-6 yoffset=6 xadvance=0 page=0 chnl=15 +char id=1160 x=61 y=18 width=17 height=15 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15 +char id=1161 x=96 y=18 width=16 height=15 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15 +char id=1162 x=0 y=0 width=12 height=19 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=15 +char id=1163 x=457 y=0 width=10 height=16 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=15 +char id=1164 x=110 y=74 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1165 x=126 y=34 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1166 x=479 y=73 width=9 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1167 x=348 y=33 width=9 height=13 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1168 x=400 y=17 width=8 height=15 xoffset=1 yoffset=4 xadvance=9 page=0 chnl=15 +char id=1169 x=160 y=86 width=6 height=12 xoffset=1 yoffset=7 xadvance=7 page=0 chnl=15 +char id=1170 x=469 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1171 x=504 y=86 width=7 height=9 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=15 +char id=1172 x=413 y=0 width=10 height=16 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1173 x=471 y=33 width=8 height=13 xoffset=1 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1174 x=113 y=18 width=15 height=15 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1175 x=28 y=64 width=13 height=12 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15 +char id=1176 x=478 y=0 width=9 height=16 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1177 x=444 y=33 width=8 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1178 x=378 y=17 width=10 height=15 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1179 x=49 y=90 width=8 height=12 xoffset=1 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1180 x=66 y=75 width=10 height=12 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1181 x=362 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1182 x=234 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1183 x=158 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1184 x=146 y=60 width=12 height=12 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1185 x=0 y=104 width=11 height=9 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1186 x=206 y=17 width=12 height=15 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1187 x=447 y=60 width=10 height=12 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1188 x=478 y=47 width=13 height=12 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1189 x=442 y=86 width=12 height=9 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1190 x=142 y=0 width=17 height=16 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=15 +char id=1191 x=35 y=36 width=14 height=13 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1192 x=50 y=34 width=13 height=13 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1193 x=24 y=104 width=11 height=9 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1194 x=271 y=0 width=11 height=16 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1195 x=9 y=51 width=8 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1196 x=367 y=17 width=10 height=15 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1197 x=40 y=90 width=8 height=12 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1198 x=143 y=74 width=10 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1199 x=178 y=33 width=9 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1200 x=436 y=60 width=10 height=12 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1201 x=368 y=33 width=9 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1202 x=344 y=17 width=11 height=15 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1203 x=30 y=91 width=9 height=12 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1204 x=161 y=17 width=15 height=15 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15 +char id=1205 x=68 y=61 width=12 height=12 xoffset=0 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1206 x=308 y=17 width=11 height=15 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1207 x=33 y=77 width=10 height=12 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1208 x=44 y=77 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1209 x=380 y=96 width=8 height=9 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1210 x=55 y=75 width=10 height=12 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1211 x=498 y=32 width=8 height=13 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1212 x=336 y=47 width=14 height=12 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15 +char id=1213 x=36 y=104 width=11 height=9 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1214 x=177 y=17 width=14 height=15 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15 +char id=1215 x=366 y=60 width=11 height=12 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1216 x=186 y=86 width=3 height=12 xoffset=1 yoffset=7 xadvance=5 page=0 chnl=15 +char id=1217 x=160 y=0 width=15 height=16 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=15 +char id=1218 x=78 y=34 width=13 height=13 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=1219 x=424 y=0 width=10 height=16 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1220 x=453 y=33 width=8 height=13 xoffset=1 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1221 x=232 y=17 width=12 height=15 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1222 x=491 y=60 width=10 height=12 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1223 x=402 y=0 width=10 height=16 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1224 x=318 y=33 width=9 height=13 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1225 x=271 y=17 width=12 height=15 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1226 x=425 y=60 width=10 height=12 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1227 x=356 y=17 width=10 height=15 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1228 x=112 y=87 width=8 height=12 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1229 x=129 y=17 width=15 height=15 xoffset=1 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1230 x=120 y=61 width=12 height=12 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1231 x=178 y=86 width=3 height=12 xoffset=1 yoffset=7 xadvance=5 page=0 chnl=15 +char id=1232 x=367 y=0 width=11 height=16 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=15 +char id=1233 x=198 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1234 x=259 y=0 width=11 height=16 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=15 +char id=1235 x=218 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1236 x=276 y=47 width=14 height=12 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15 +char id=1237 x=285 y=86 width=14 height=9 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1238 x=0 y=20 width=8 height=16 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=15 +char id=1239 x=338 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1240 x=55 y=62 width=12 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1241 x=236 y=98 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1242 x=220 y=0 width=12 height=16 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=15 +char id=1243 x=288 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1244 x=176 y=0 width=15 height=16 xoffset=0 yoffset=3 xadvance=14 page=0 chnl=15 +char id=1245 x=64 y=34 width=13 height=13 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=15 +char id=1246 x=488 y=0 width=9 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1247 x=408 y=33 width=8 height=13 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1248 x=20 y=91 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1249 x=435 y=33 width=8 height=13 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1250 x=332 y=17 width=11 height=15 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=15 +char id=1251 x=502 y=59 width=9 height=12 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=15 +char id=1252 x=307 y=0 width=11 height=16 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=15 +char id=1253 x=378 y=33 width=9 height=13 xoffset=1 yoffset=6 xadvance=11 page=0 chnl=15 +char id=1254 x=206 y=0 width=13 height=16 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=15 +char id=1255 x=137 y=33 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1256 x=436 y=47 width=13 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1257 x=70 y=101 width=10 height=9 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1258 x=192 y=0 width=13 height=16 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=15 +char id=1259 x=104 y=34 width=10 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1260 x=391 y=0 width=10 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1261 x=480 y=32 width=8 height=13 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1262 x=320 y=17 width=11 height=15 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=15 +char id=1263 x=468 y=0 width=9 height=16 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1264 x=331 y=0 width=11 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1265 x=87 y=0 width=9 height=17 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1266 x=379 y=0 width=11 height=16 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15 +char id=1267 x=77 y=0 width=9 height=17 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1268 x=435 y=0 width=10 height=16 xoffset=1 yoffset=3 xadvance=12 page=0 chnl=15 +char id=1269 x=489 y=32 width=8 height=13 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1270 x=409 y=17 width=8 height=15 xoffset=1 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1271 x=153 y=87 width=6 height=12 xoffset=1 yoffset=10 xadvance=7 page=0 chnl=15 +char id=1272 x=246 y=0 width=12 height=16 xoffset=1 yoffset=3 xadvance=14 page=0 chnl=15 +char id=1273 x=92 y=34 width=11 height=13 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=1274 x=498 y=0 width=9 height=16 xoffset=0 yoffset=7 xadvance=9 page=0 chnl=15 +char id=1275 x=121 y=87 width=7 height=12 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=15 +char id=1276 x=284 y=17 width=11 height=15 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1277 x=319 y=73 width=9 height=12 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1278 x=121 y=74 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1279 x=156 y=100 width=9 height=9 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1280 x=339 y=73 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1281 x=208 y=33 width=9 height=13 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=1282 x=306 y=47 width=14 height=12 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1283 x=20 y=36 width=14 height=13 xoffset=0 yoffset=6 xadvance=15 page=0 chnl=15 +char id=1284 x=291 y=47 width=14 height=12 xoffset=0 yoffset=7 xadvance=15 page=0 chnl=15 +char id=1285 x=373 y=86 width=13 height=9 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15 +char id=1286 x=296 y=17 width=11 height=15 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1287 x=399 y=73 width=9 height=12 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15 +char id=1288 x=146 y=47 width=16 height=12 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15 +char id=1289 x=315 y=86 width=14 height=9 xoffset=0 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1290 x=260 y=47 width=15 height=12 xoffset=1 yoffset=7 xadvance=17 page=0 chnl=15 +char id=1291 x=300 y=86 width=14 height=9 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15 +char id=1292 x=185 y=60 width=12 height=12 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15 +char id=1293 x=59 y=101 width=10 height=9 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1294 x=402 y=60 width=11 height=12 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1295 x=125 y=100 width=10 height=9 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1296 x=209 y=73 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=1297 x=371 y=96 width=8 height=9 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1298 x=219 y=17 width=12 height=15 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15 +char id=1299 x=231 y=73 width=10 height=12 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=8192 x=510 y=30 width=1 height=1 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=8193 x=510 y=28 width=1 height=1 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15 +char id=8194 x=510 y=26 width=1 height=1 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=8195 x=510 y=22 width=1 height=1 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15 +char id=8196 x=45 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8197 x=43 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8198 x=508 y=14 width=1 height=1 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=15 +char id=8199 x=510 y=16 width=1 height=1 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15 +char id=8200 x=510 y=18 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8201 x=510 y=32 width=1 height=1 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=15 +char id=8202 x=510 y=20 width=1 height=1 xoffset=0 yoffset=0 xadvance=2 page=0 chnl=15 +char id=8203 x=47 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=172 y=109 width=8 height=3 xoffset=0 yoffset=13 xadvance=8 page=0 chnl=15 +char id=8212 x=113 y=110 width=17 height=3 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=8213 x=131 y=110 width=17 height=3 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=8215 x=76 y=111 width=7 height=4 xoffset=0 yoffset=19 xadvance=7 page=0 chnl=15 +char id=8216 x=60 y=111 width=3 height=5 xoffset=0 yoffset=7 xadvance=3 page=0 chnl=15 +char id=8217 x=64 y=111 width=3 height=5 xoffset=0 yoffset=7 xadvance=3 page=0 chnl=15 +char id=8218 x=109 y=110 width=3 height=4 xoffset=0 yoffset=17 xadvance=4 page=0 chnl=15 +char id=8219 x=56 y=113 width=3 height=5 xoffset=0 yoffset=7 xadvance=3 page=0 chnl=15 +char id=8220 x=25 y=114 width=6 height=5 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=8221 x=32 y=114 width=6 height=5 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=15 +char id=8222 x=84 y=111 width=6 height=4 xoffset=0 yoffset=17 xadvance=7 page=0 chnl=15 +char id=8224 x=35 y=50 width=7 height=13 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=8225 x=18 y=51 width=8 height=13 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=15 +char id=8226 x=51 y=113 width=4 height=5 xoffset=1 yoffset=11 xadvance=6 page=0 chnl=15 +char id=8230 x=149 y=110 width=12 height=3 xoffset=1 yoffset=16 xadvance=13 page=0 chnl=15 +char id=8240 x=57 y=48 width=20 height=12 xoffset=0 yoffset=7 xadvance=20 page=0 chnl=15 +char id=8242 x=39 y=114 width=5 height=5 xoffset=0 yoffset=7 xadvance=4 page=0 chnl=15 +char id=8243 x=16 y=114 width=8 height=5 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=15 +char id=8249 x=506 y=96 width=5 height=8 xoffset=0 yoffset=11 xadvance=5 page=0 chnl=15 +char id=8250 x=0 y=114 width=5 height=8 xoffset=0 yoffset=11 xadvance=5 page=0 chnl=15 +char id=8252 x=137 y=87 width=7 height=12 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=8260 x=275 y=73 width=10 height=12 xoffset=-4 yoffset=7 xadvance=2 page=0 chnl=15 +char id=8355 x=0 y=91 width=9 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=8356 x=286 y=73 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 +char id=8359 x=94 y=61 width=12 height=12 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15 +char id=8362 x=270 y=60 width=11 height=12 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15 +char id=8363 x=355 y=0 width=11 height=16 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=15 +char id=8364 x=132 y=74 width=10 height=12 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=15 diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans24_0.png b/project_templates/sample_scene/content/gui_content/fonts/OpenSans24_0.png new file mode 100644 index 00000000..faf85dff Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/fonts/OpenSans24_0.png differ diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans32.fnt b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32.fnt new file mode 100644 index 00000000..75f120b7 --- /dev/null +++ b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32.fnt @@ -0,0 +1,415 @@ +info face="Open Sans" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0 +common lineHeight=32 base=25 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="OpenSans32_0.png" +chars count=411 +char id=13 x=64 y=117 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=32 x=60 y=100 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=33 x=505 y=95 width=4 height=16 xoffset=1 yoffset=9 xadvance=6 page=0 chnl=15 +char id=34 x=442 y=157 width=7 height=7 xoffset=1 yoffset=9 xadvance=9 page=0 chnl=15 +char id=35 x=173 y=99 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=36 x=224 y=43 width=11 height=18 xoffset=1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=37 x=250 y=79 width=17 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=38 x=421 y=78 width=15 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=39 x=464 y=157 width=3 height=7 xoffset=1 yoffset=9 xadvance=5 page=0 chnl=15 +char id=40 x=137 y=44 width=6 height=19 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=15 +char id=41 x=144 y=44 width=6 height=19 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=15 +char id=42 x=380 y=159 width=12 height=11 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=43 x=393 y=159 width=11 height=11 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15 +char id=44 x=506 y=155 width=5 height=5 xoffset=0 yoffset=22 xadvance=6 page=0 chnl=15 +char id=45 x=147 y=176 width=7 height=3 xoffset=0 yoffset=18 xadvance=7 page=0 chnl=15 +char id=46 x=155 y=176 width=4 height=3 xoffset=1 yoffset=22 xadvance=6 page=0 chnl=15 +char id=47 x=348 y=130 width=8 height=16 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=48 x=156 y=133 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=49 x=357 y=130 width=7 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=50 x=132 y=133 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=51 x=468 y=112 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=52 x=365 y=96 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=53 x=84 y=134 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=54 x=48 y=137 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=55 x=455 y=112 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=56 x=12 y=137 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=57 x=216 y=132 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=58 x=362 y=160 width=4 height=12 xoffset=1 yoffset=13 xadvance=6 page=0 chnl=15 +char id=59 x=459 y=129 width=5 height=14 xoffset=0 yoffset=13 xadvance=6 page=0 chnl=15 +char id=60 x=216 y=163 width=11 height=12 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15 +char id=61 x=419 y=158 width=11 height=7 xoffset=1 yoffset=14 xadvance=13 page=0 chnl=15 +char id=62 x=192 y=163 width=11 height=12 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15 +char id=63 x=280 y=130 width=9 height=16 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15 +char id=64 x=188 y=44 width=18 height=18 xoffset=1 yoffset=9 xadvance=20 page=0 chnl=15 +char id=65 x=218 y=98 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=66 x=494 y=112 width=11 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=67 x=168 y=116 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=68 x=477 y=95 width=13 height=16 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=69 x=310 y=130 width=9 height=16 xoffset=2 yoffset=9 xadvance=12 page=0 chnl=15 +char id=70 x=290 y=130 width=9 height=16 xoffset=2 yoffset=9 xadvance=11 page=0 chnl=15 +char id=71 x=128 y=99 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=72 x=364 y=113 width=12 height=16 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=73 x=506 y=112 width=2 height=16 xoffset=2 yoffset=9 xadvance=6 page=0 chnl=15 +char id=74 x=44 y=47 width=6 height=20 xoffset=-2 yoffset=9 xadvance=6 page=0 chnl=15 +char id=75 x=351 y=113 width=12 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=76 x=260 y=131 width=9 height=16 xoffset=2 yoffset=9 xadvance=12 page=0 chnl=15 +char id=77 x=370 y=78 width=16 height=16 xoffset=2 yoffset=9 xadvance=20 page=0 chnl=15 +char id=78 x=154 y=116 width=13 height=16 xoffset=2 yoffset=9 xadvance=17 page=0 chnl=15 +char id=79 x=485 y=78 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=80 x=120 y=133 width=11 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15 +char id=81 x=258 y=22 width=15 height=20 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=82 x=195 y=115 width=12 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=83 x=501 y=78 width=10 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=84 x=338 y=113 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=85 x=393 y=95 width=13 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=86 x=188 y=98 width=14 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=87 x=403 y=61 width=20 height=16 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=88 x=449 y=95 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=89 x=323 y=96 width=13 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=90 x=312 y=113 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=91 x=158 y=44 width=6 height=19 xoffset=1 yoffset=9 xadvance=7 page=0 chnl=15 +char id=92 x=339 y=130 width=8 height=16 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=93 x=151 y=44 width=6 height=19 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=15 +char id=94 x=367 y=160 width=12 height=11 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=95 x=136 y=176 width=10 height=3 xoffset=0 yoffset=26 xadvance=10 page=0 chnl=15 +char id=96 x=19 y=180 width=6 height=5 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=15 +char id=97 x=156 y=163 width=11 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=98 x=360 y=43 width=12 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=99 x=334 y=160 width=9 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=100 x=240 y=61 width=11 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=101 x=486 y=142 width=11 height=12 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=102 x=502 y=43 width=9 height=17 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=15 +char id=103 x=425 y=43 width=12 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=104 x=60 y=65 width=11 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=105 x=353 y=61 width=3 height=17 xoffset=1 yoffset=8 xadvance=6 page=0 chnl=15 +char id=106 x=187 y=0 width=6 height=22 xoffset=-2 yoffset=8 xadvance=6 page=0 chnl=15 +char id=107 x=12 y=68 width=11 height=17 xoffset=1 yoffset=8 xadvance=12 page=0 chnl=15 +char id=108 x=507 y=18 width=3 height=17 xoffset=1 yoffset=8 xadvance=6 page=0 chnl=15 +char id=109 x=76 y=151 width=18 height=12 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=110 x=180 y=163 width=11 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=111 x=144 y=163 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=112 x=438 y=43 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=113 x=48 y=68 width=11 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=114 x=353 y=160 width=8 height=12 xoffset=1 yoffset=13 xadvance=9 page=0 chnl=15 +char id=115 x=314 y=160 width=9 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=116 x=409 y=129 width=8 height=15 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=117 x=120 y=164 width=11 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=118 x=108 y=164 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=119 x=131 y=150 width=17 height=12 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=120 x=398 y=146 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=121 x=132 y=64 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=122 x=261 y=161 width=10 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15 +char id=123 x=128 y=44 width=8 height=19 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=124 x=194 y=0 width=2 height=22 xoffset=5 yoffset=8 xadvance=12 page=0 chnl=15 +char id=125 x=119 y=44 width=8 height=19 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=126 x=41 y=180 width=11 height=4 xoffset=1 yoffset=16 xadvance=13 page=0 chnl=15 +char id=1024 x=25 y=25 width=9 height=21 xoffset=2 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1025 x=45 y=25 width=9 height=21 xoffset=2 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1026 x=32 y=103 width=15 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1027 x=35 y=25 width=9 height=21 xoffset=2 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1028 x=407 y=95 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1029 x=239 y=131 width=10 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1030 x=509 y=112 width=2 height=16 xoffset=2 yoffset=9 xadvance=6 page=0 chnl=15 +char id=1031 x=55 y=23 width=7 height=21 xoffset=0 yoffset=4 xadvance=6 page=0 chnl=15 +char id=1032 x=51 y=47 width=6 height=20 xoffset=-2 yoffset=9 xadvance=6 page=0 chnl=15 +char id=1033 x=487 y=61 width=20 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1034 x=80 y=83 width=19 height=16 xoffset=2 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1035 x=437 y=78 width=15 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1036 x=481 y=0 width=12 height=21 xoffset=2 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1037 x=439 y=0 width=13 height=21 xoffset=2 yoffset=4 xadvance=17 page=0 chnl=15 +char id=1038 x=411 y=22 width=14 height=20 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15 +char id=1039 x=468 y=22 width=12 height=20 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1040 x=278 y=96 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1041 x=192 y=133 width=11 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1042 x=0 y=137 width=11 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1043 x=250 y=131 width=9 height=16 xoffset=2 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1044 x=274 y=22 width=15 height=20 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1045 x=320 y=130 width=9 height=16 xoffset=2 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1046 x=40 y=86 width=19 height=16 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1047 x=273 y=113 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1048 x=126 y=116 width=13 height=16 xoffset=2 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1049 x=454 y=22 width=13 height=20 xoffset=2 yoffset=5 xadvance=17 page=0 chnl=15 +char id=1050 x=260 y=114 width=12 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1051 x=203 y=98 width=14 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1052 x=336 y=79 width=16 height=16 xoffset=2 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1053 x=247 y=114 width=12 height=16 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1054 x=0 y=103 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1055 x=234 y=114 width=12 height=16 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1056 x=72 y=134 width=11 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1057 x=0 y=120 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1058 x=377 y=113 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1059 x=293 y=96 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1060 x=302 y=79 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1061 x=84 y=117 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1062 x=306 y=22 width=14 height=20 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1063 x=28 y=120 width=13 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1064 x=60 y=83 width=19 height=16 xoffset=2 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1065 x=85 y=23 width=21 height=20 xoffset=2 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1066 x=233 y=97 width=14 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1067 x=112 y=99 width=15 height=16 xoffset=2 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1068 x=24 y=137 width=11 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1069 x=112 y=116 width=13 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1070 x=445 y=61 width=20 height=16 xoffset=2 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1071 x=325 y=113 width=12 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1072 x=72 y=167 width=11 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1073 x=144 y=64 width=11 height=17 xoffset=1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1074 x=60 y=167 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1075 x=344 y=160 width=8 height=12 xoffset=1 yoffset=13 xadvance=10 page=0 chnl=15 +char id=1076 x=42 y=120 width=13 height=16 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1077 x=48 y=167 width=11 height=12 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1078 x=167 y=150 width=17 height=12 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1079 x=250 y=162 width=10 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1080 x=424 y=144 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1081 x=481 y=112 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1082 x=204 y=163 width=11 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1083 x=12 y=167 width=11 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1084 x=313 y=147 width=14 height=12 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1085 x=168 y=163 width=11 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1086 x=24 y=167 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1087 x=36 y=167 width=11 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1088 x=412 y=43 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1089 x=324 y=160 width=9 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1090 x=272 y=161 width=10 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15 +char id=1091 x=216 y=62 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1092 x=89 y=0 width=14 height=22 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=15 +char id=1093 x=437 y=144 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1094 x=70 y=117 width=13 height=16 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1095 x=132 y=163 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1096 x=113 y=151 width=17 height=12 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1097 x=100 y=82 width=19 height=16 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1098 x=268 y=148 width=14 height=12 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1099 x=343 y=147 width=14 height=12 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1100 x=0 y=167 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1101 x=239 y=162 width=10 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1102 x=219 y=149 width=16 height=12 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1103 x=450 y=144 width=11 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1104 x=156 y=64 width=11 height=17 xoffset=1 yoffset=8 xadvance=12 page=0 chnl=15 +char id=1105 x=96 y=64 width=11 height=17 xoffset=1 yoffset=8 xadvance=12 page=0 chnl=15 +char id=1106 x=143 y=0 width=12 height=22 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1107 x=336 y=61 width=8 height=17 xoffset=1 yoffset=8 xadvance=10 page=0 chnl=15 +char id=1108 x=228 y=162 width=10 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1109 x=294 y=160 width=9 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1110 x=507 y=0 width=3 height=17 xoffset=1 yoffset=8 xadvance=6 page=0 chnl=15 +char id=1111 x=345 y=61 width=7 height=17 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=15 +char id=1112 x=180 y=0 width=6 height=22 xoffset=-2 yoffset=8 xadvance=6 page=0 chnl=15 +char id=1113 x=38 y=154 width=18 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1114 x=19 y=154 width=18 height=12 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1115 x=373 y=43 width=12 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1116 x=108 y=64 width=11 height=17 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1117 x=399 y=43 width=12 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1118 x=13 y=25 width=11 height=21 xoffset=0 yoffset=9 xadvance=11 page=0 chnl=15 +char id=1119 x=180 y=133 width=11 height=16 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1120 x=382 y=61 width=20 height=16 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1121 x=95 y=151 width=17 height=12 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1122 x=158 y=99 width=14 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1123 x=432 y=129 width=13 height=14 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15 +char id=1124 x=158 y=82 width=18 height=16 xoffset=2 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1125 x=236 y=149 width=15 height=12 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1126 x=80 y=100 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1127 x=498 y=129 width=13 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1128 x=20 y=86 width=19 height=16 xoffset=2 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1129 x=202 y=150 width=16 height=12 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1130 x=387 y=78 width=16 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1131 x=283 y=147 width=14 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1132 x=424 y=61 width=20 height=16 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15 +char id=1133 x=57 y=154 width=18 height=12 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1134 x=38 y=0 width=12 height=24 xoffset=0 yoffset=6 xadvance=13 page=0 chnl=15 +char id=1135 x=23 y=47 width=10 height=20 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1136 x=404 y=78 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1137 x=73 y=0 width=15 height=22 xoffset=1 yoffset=8 xadvance=17 page=0 chnl=15 +char id=1138 x=64 y=100 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1139 x=462 y=144 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1140 x=48 y=103 width=15 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1141 x=385 y=146 width=12 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1142 x=276 y=0 width=15 height=21 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1143 x=477 y=43 width=12 height=17 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1144 x=197 y=0 width=26 height=21 xoffset=1 yoffset=9 xadvance=27 page=0 chnl=15 +char id=1145 x=236 y=43 width=23 height=17 xoffset=1 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1146 x=207 y=43 width=16 height=18 xoffset=1 yoffset=8 xadvance=18 page=0 chnl=15 +char id=1147 x=418 y=129 width=13 height=14 xoffset=1 yoffset=12 xadvance=14 page=0 chnl=15 +char id=1148 x=0 y=0 width=21 height=24 xoffset=1 yoffset=1 xadvance=23 page=0 chnl=15 +char id=1149 x=168 y=23 width=18 height=20 xoffset=1 yoffset=5 xadvance=20 page=0 chnl=15 +char id=1150 x=58 y=45 width=20 height=19 xoffset=0 yoffset=6 xadvance=20 page=0 chnl=15 +char id=1151 x=368 y=130 width=17 height=15 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15 +char id=1152 x=467 y=0 width=13 height=21 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1153 x=306 y=61 width=9 height=17 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1154 x=446 y=129 width=12 height=14 xoffset=1 yoffset=11 xadvance=13 page=0 chnl=15 +char id=1155 x=468 y=157 width=9 height=6 xoffset=-11 yoffset=7 xadvance=0 page=0 chnl=15 +char id=1156 x=53 y=180 width=8 height=4 xoffset=-10 yoffset=9 xadvance=0 page=0 chnl=15 +char id=1157 x=36 y=180 width=4 height=5 xoffset=-8 yoffset=8 xadvance=0 page=0 chnl=15 +char id=1158 x=26 y=180 width=4 height=5 xoffset=-8 yoffset=8 xadvance=0 page=0 chnl=15 +char id=1160 x=165 y=44 width=22 height=18 xoffset=0 yoffset=10 xadvance=22 page=0 chnl=15 +char id=1161 x=63 y=23 width=21 height=20 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1162 x=22 y=0 width=15 height=24 xoffset=2 yoffset=5 xadvance=17 page=0 chnl=15 +char id=1163 x=308 y=0 width=14 height=21 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1164 x=14 y=120 width=13 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1165 x=386 y=43 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1166 x=36 y=137 width=11 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1167 x=451 y=43 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1168 x=108 y=44 width=10 height=19 xoffset=2 yoffset=6 xadvance=12 page=0 chnl=15 +char id=1169 x=399 y=129 width=9 height=15 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15 +char id=1170 x=221 y=115 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1171 x=304 y=160 width=9 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15 +char id=1172 x=130 y=0 width=12 height=22 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1173 x=274 y=61 width=10 height=17 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1174 x=107 y=23 width=20 height=20 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1175 x=214 y=81 width=17 height=16 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1176 x=0 y=25 width=12 height=21 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1177 x=263 y=61 width=10 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1178 x=440 y=22 width=13 height=20 xoffset=2 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1179 x=108 y=134 width=11 height=16 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1180 x=286 y=113 width=12 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1181 x=84 y=164 width=11 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1182 x=143 y=99 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1183 x=347 y=43 width=12 height=17 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=1184 x=453 y=78 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1185 x=328 y=147 width=14 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1186 x=381 y=22 width=14 height=20 xoffset=2 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1187 x=379 y=95 width=13 height=16 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1188 x=268 y=79 width=16 height=16 xoffset=2 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1189 x=252 y=148 width=15 height=12 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1190 x=51 y=0 width=21 height=22 xoffset=2 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1191 x=260 y=43 width=18 height=17 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1192 x=315 y=43 width=16 height=17 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1193 x=465 y=129 width=13 height=13 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1194 x=397 y=0 width=13 height=21 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1195 x=296 y=61 width=9 height=17 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1196 x=481 y=22 width=12 height=20 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1197 x=228 y=132 width=10 height=16 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15 +char id=1198 x=56 y=120 width=13 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1199 x=180 y=63 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1200 x=351 y=96 width=13 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1201 x=192 y=63 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1202 x=396 y=22 width=14 height=20 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1203 x=390 y=112 width=12 height=16 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1204 x=148 y=23 width=19 height=20 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1205 x=319 y=79 width=16 height=16 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1206 x=336 y=22 width=14 height=20 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1207 x=337 y=96 width=13 height=16 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1208 x=491 y=95 width=13 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1209 x=498 y=142 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1210 x=182 y=116 width=12 height=16 xoffset=2 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1211 x=0 y=68 width=11 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1212 x=120 y=82 width=18 height=16 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1213 x=298 y=147 width=14 height=12 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1214 x=206 y=22 width=18 height=20 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1215 x=308 y=96 width=14 height=16 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1216 x=365 y=130 width=2 height=16 xoffset=2 yoffset=9 xadvance=6 page=0 chnl=15 +char id=1217 x=128 y=23 width=19 height=20 xoffset=0 yoffset=5 xadvance=19 page=0 chnl=15 +char id=1218 x=196 y=81 width=17 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1219 x=104 y=0 width=12 height=22 xoffset=2 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1220 x=72 y=65 width=11 height=17 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1221 x=225 y=22 width=16 height=20 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1222 x=421 y=95 width=13 height=16 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1223 x=117 y=0 width=12 height=22 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1224 x=84 y=64 width=11 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1225 x=242 y=22 width=15 height=20 xoffset=2 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1226 x=140 y=116 width=13 height=16 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1227 x=426 y=22 width=13 height=20 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1228 x=96 y=134 width=11 height=16 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1229 x=187 y=23 width=18 height=20 xoffset=2 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1230 x=353 y=79 width=16 height=16 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1231 x=508 y=61 width=2 height=16 xoffset=2 yoffset=9 xadvance=6 page=0 chnl=15 +char id=1232 x=321 y=22 width=14 height=20 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=15 +char id=1233 x=204 y=132 width=11 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1234 x=368 y=0 width=14 height=21 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1235 x=168 y=63 width=11 height=17 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=1236 x=177 y=81 width=18 height=16 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1237 x=479 y=129 width=18 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1238 x=34 y=47 width=9 height=20 xoffset=2 yoffset=5 xadvance=12 page=0 chnl=15 +char id=1239 x=168 y=133 width=11 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1240 x=248 y=97 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1241 x=474 y=143 width=11 height=12 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1242 x=353 y=0 width=14 height=21 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15 +char id=1243 x=204 y=63 width=11 height=17 xoffset=1 yoffset=8 xadvance=12 page=0 chnl=15 +char id=1244 x=224 y=0 width=19 height=21 xoffset=0 yoffset=4 xadvance=19 page=0 chnl=15 +char id=1245 x=297 y=43 width=17 height=17 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=15 +char id=1246 x=494 y=0 width=12 height=21 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15 +char id=1247 x=252 y=61 width=10 height=17 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1248 x=403 y=112 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1249 x=120 y=64 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1250 x=94 y=44 width=13 height=19 xoffset=2 yoffset=6 xadvance=17 page=0 chnl=15 +char id=1251 x=386 y=130 width=12 height=15 xoffset=1 yoffset=10 xadvance=14 page=0 chnl=15 +char id=1252 x=453 y=0 width=13 height=21 xoffset=2 yoffset=4 xadvance=17 page=0 chnl=15 +char id=1253 x=464 y=43 width=12 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1254 x=260 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15 +char id=1255 x=36 y=68 width=11 height=17 xoffset=1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1256 x=469 y=78 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1257 x=96 y=164 width=11 height=12 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1258 x=292 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15 +char id=1259 x=24 y=68 width=11 height=17 xoffset=1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1260 x=411 y=0 width=13 height=21 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1261 x=285 y=61 width=10 height=17 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1262 x=79 y=44 width=14 height=19 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=15 +char id=1263 x=0 y=47 width=11 height=20 xoffset=0 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1264 x=323 y=0 width=14 height=21 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1265 x=168 y=0 width=11 height=22 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1266 x=338 y=0 width=14 height=21 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1267 x=156 y=0 width=11 height=22 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1268 x=383 y=0 width=13 height=21 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1269 x=490 y=43 width=11 height=17 xoffset=1 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1270 x=12 y=47 width=10 height=20 xoffset=2 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1271 x=330 y=130 width=8 height=16 xoffset=1 yoffset=13 xadvance=10 page=0 chnl=15 +char id=1272 x=244 y=0 width=15 height=21 xoffset=2 yoffset=4 xadvance=19 page=0 chnl=15 +char id=1273 x=332 y=43 width=14 height=17 xoffset=1 yoffset=8 xadvance=17 page=0 chnl=15 +char id=1274 x=494 y=22 width=12 height=20 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1275 x=270 y=131 width=9 height=16 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15 +char id=1276 x=366 y=22 width=14 height=20 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1277 x=208 y=115 width=12 height=16 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1278 x=463 y=95 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1279 x=411 y=145 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1280 x=144 y=133 width=11 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1281 x=228 y=62 width=11 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1282 x=232 y=80 width=17 height=16 xoffset=1 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1283 x=279 y=43 width=17 height=17 xoffset=1 yoffset=8 xadvance=20 page=0 chnl=15 +char id=1284 x=139 y=82 width=18 height=16 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1285 x=185 y=150 width=16 height=12 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1286 x=351 y=22 width=14 height=20 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1287 x=299 y=113 width=12 height=16 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1288 x=466 y=61 width=20 height=16 xoffset=0 yoffset=9 xadvance=22 page=0 chnl=15 +char id=1289 x=149 y=150 width=17 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1290 x=0 y=86 width=19 height=16 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15 +char id=1291 x=0 y=154 width=18 height=12 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1292 x=96 y=100 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1293 x=372 y=146 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1294 x=263 y=96 width=14 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1295 x=358 y=147 width=13 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1296 x=60 y=137 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1297 x=283 y=160 width=10 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1298 x=290 y=22 width=15 height=20 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1299 x=98 y=117 width=13 height=16 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=8192 x=510 y=95 width=1 height=1 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15 +char id=8193 x=58 y=65 width=1 height=1 xoffset=0 yoffset=0 xadvance=22 page=0 chnl=15 +char id=8194 x=55 y=45 width=1 height=1 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15 +char id=8195 x=53 y=23 width=1 height=1 xoffset=0 yoffset=0 xadvance=22 page=0 chnl=15 +char id=8196 x=51 y=23 width=1 height=1 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15 +char id=8197 x=510 y=101 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8198 x=510 y=97 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8199 x=68 y=117 width=1 height=1 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15 +char id=8200 x=66 y=117 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8201 x=510 y=103 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8202 x=510 y=99 width=1 height=1 xoffset=0 yoffset=0 xadvance=2 page=0 chnl=15 +char id=8203 x=62 y=100 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=124 y=177 width=11 height=3 xoffset=0 yoffset=18 xadvance=11 page=0 chnl=15 +char id=8212 x=62 y=180 width=22 height=3 xoffset=0 yoffset=18 xadvance=22 page=0 chnl=15 +char id=8213 x=85 y=177 width=22 height=3 xoffset=0 yoffset=18 xadvance=22 page=0 chnl=15 +char id=8215 x=0 y=180 width=9 height=5 xoffset=0 yoffset=25 xadvance=9 page=0 chnl=15 +char id=8216 x=496 y=155 width=4 height=6 xoffset=0 yoffset=9 xadvance=4 page=0 chnl=15 +char id=8217 x=501 y=155 width=4 height=6 xoffset=0 yoffset=9 xadvance=4 page=0 chnl=15 +char id=8218 x=31 y=180 width=4 height=5 xoffset=0 yoffset=22 xadvance=5 page=0 chnl=15 +char id=8219 x=507 y=36 width=4 height=6 xoffset=0 yoffset=9 xadvance=4 page=0 chnl=15 +char id=8220 x=487 y=155 width=8 height=6 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=8221 x=478 y=156 width=8 height=6 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=8222 x=10 y=180 width=8 height=5 xoffset=0 yoffset=22 xadvance=9 page=0 chnl=15 +char id=8224 x=316 y=61 width=9 height=17 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=15 +char id=8225 x=326 y=61 width=9 height=17 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=15 +char id=8226 x=457 y=157 width=6 height=7 xoffset=1 yoffset=14 xadvance=8 page=0 chnl=15 +char id=8230 x=108 y=177 width=15 height=3 xoffset=1 yoffset=22 xadvance=17 page=0 chnl=15 +char id=8240 x=357 y=61 width=24 height=16 xoffset=1 yoffset=9 xadvance=26 page=0 chnl=15 +char id=8242 x=450 y=157 width=6 height=7 xoffset=0 yoffset=9 xadvance=5 page=0 chnl=15 +char id=8243 x=431 y=157 width=10 height=7 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=15 +char id=8249 x=405 y=159 width=6 height=10 xoffset=0 yoffset=15 xadvance=7 page=0 chnl=15 +char id=8250 x=412 y=158 width=6 height=10 xoffset=0 yoffset=15 xadvance=7 page=0 chnl=15 +char id=8252 x=300 y=130 width=9 height=16 xoffset=1 yoffset=9 xadvance=11 page=0 chnl=15 +char id=8260 x=416 y=112 width=12 height=16 xoffset=-5 yoffset=9 xadvance=3 page=0 chnl=15 +char id=8355 x=429 y=112 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=8356 x=442 y=112 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=8359 x=285 y=79 width=16 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=8362 x=16 y=103 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=8363 x=425 y=0 width=13 height=21 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=8364 x=435 y=95 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans32Bold.fnt b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32Bold.fnt new file mode 100644 index 00000000..4408c92c --- /dev/null +++ b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32Bold.fnt @@ -0,0 +1,415 @@ +info face="Open Sans" size=32 bold=1 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0 +common lineHeight=32 base=25 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="OpenSans32Bold_0.png" +chars count=411 +char id=13 x=55 y=87 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=32 x=48 y=69 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=33 x=339 y=150 width=4 height=16 xoffset=1 yoffset=9 xadvance=6 page=0 chnl=15 +char id=34 x=0 y=201 width=8 height=7 xoffset=1 yoffset=9 xadvance=10 page=0 chnl=15 +char id=35 x=150 y=136 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=36 x=361 y=44 width=12 height=18 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=37 x=0 y=107 width=20 height=16 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=38 x=408 y=97 width=17 height=16 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15 +char id=39 x=17 y=201 width=4 height=7 xoffset=1 yoffset=9 xadvance=6 page=0 chnl=15 +char id=40 x=294 y=44 width=7 height=19 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=41 x=302 y=44 width=7 height=19 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=42 x=443 y=175 width=12 height=11 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=43 x=305 y=180 width=12 height=12 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=44 x=123 y=199 width=5 height=5 xoffset=0 yoffset=22 xadvance=6 page=0 chnl=15 +char id=45 x=226 y=196 width=7 height=4 xoffset=0 yoffset=17 xadvance=7 page=0 chnl=15 +char id=46 x=234 y=196 width=4 height=4 xoffset=1 yoffset=21 xadvance=6 page=0 chnl=15 +char id=47 x=285 y=150 width=9 height=16 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=15 +char id=48 x=143 y=153 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=49 x=305 y=150 width=9 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=50 x=475 y=131 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=51 x=488 y=131 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=52 x=365 y=132 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=53 x=207 y=153 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=54 x=169 y=153 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=55 x=39 y=158 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=56 x=104 y=156 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=57 x=52 y=158 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=58 x=424 y=176 width=4 height=12 xoffset=1 yoffset=13 xadvance=6 page=0 chnl=15 +char id=59 x=408 y=149 width=5 height=14 xoffset=0 yoffset=13 xadvance=6 page=0 chnl=15 +char id=60 x=442 y=148 width=12 height=13 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=61 x=474 y=174 width=12 height=8 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=62 x=429 y=148 width=12 height=13 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15 +char id=63 x=253 y=152 width=10 height=16 xoffset=0 yoffset=9 xadvance=11 page=0 chnl=15 +char id=64 x=324 y=44 width=18 height=18 xoffset=1 yoffset=9 xadvance=20 page=0 chnl=15 +char id=65 x=85 y=122 width=16 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=66 x=323 y=133 width=13 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=67 x=267 y=134 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=68 x=389 y=115 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=69 x=231 y=152 width=10 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=70 x=264 y=152 width=10 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=71 x=180 y=136 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=72 x=45 y=141 width=14 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=73 x=315 y=150 width=5 height=16 xoffset=1 yoffset=9 xadvance=7 page=0 chnl=15 +char id=74 x=95 y=45 width=8 height=21 xoffset=-2 yoffset=9 xadvance=7 page=0 chnl=15 +char id=75 x=419 y=114 width=14 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=76 x=219 y=153 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=77 x=165 y=102 width=18 height=16 xoffset=1 yoffset=9 xadvance=21 page=0 chnl=15 +char id=78 x=231 y=118 width=15 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=79 x=443 y=97 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=80 x=78 y=158 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=81 x=206 y=45 width=16 height=20 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=82 x=494 y=114 width=14 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=83 x=26 y=158 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=84 x=421 y=131 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=85 x=75 y=141 width=14 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=86 x=183 y=119 width=15 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=87 x=250 y=83 width=22 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=88 x=215 y=118 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=89 x=404 y=115 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=90 x=351 y=133 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=91 x=310 y=44 width=6 height=19 xoffset=1 yoffset=9 xadvance=7 page=0 chnl=15 +char id=92 x=275 y=151 width=9 height=16 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=15 +char id=93 x=317 y=44 width=6 height=19 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=15 +char id=94 x=429 y=176 width=13 height=11 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=95 x=239 y=196 width=10 height=3 xoffset=0 yoffset=26 xadvance=9 page=0 chnl=15 +char id=96 x=108 y=201 width=8 height=5 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=15 +char id=97 x=253 y=182 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=98 x=383 y=63 width=12 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=99 x=318 y=180 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=100 x=300 y=64 width=13 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=101 x=240 y=182 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=102 x=140 y=84 width=10 height=17 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=15 +char id=103 x=160 y=66 width=13 height=17 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=104 x=396 y=62 width=12 height=17 xoffset=1 yoffset=8 xadvance=15 page=0 chnl=15 +char id=105 x=380 y=44 width=5 height=18 xoffset=1 yoffset=7 xadvance=7 page=0 chnl=15 +char id=106 x=57 y=0 width=8 height=23 xoffset=-2 yoffset=7 xadvance=7 page=0 chnl=15 +char id=107 x=230 y=66 width=13 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=108 x=192 y=84 width=4 height=17 xoffset=1 yoffset=8 xadvance=7 page=0 chnl=15 +char id=109 x=120 y=173 width=19 height=12 xoffset=1 yoffset=13 xadvance=22 page=0 chnl=15 +char id=110 x=227 y=183 width=12 height=12 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=111 x=0 y=188 width=13 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=112 x=52 y=89 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=113 x=356 y=63 width=13 height=17 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=114 x=501 y=161 width=9 height=12 xoffset=1 yoffset=13 xadvance=10 page=0 chnl=15 +char id=115 x=354 y=179 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=116 x=355 y=150 width=9 height=15 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15 +char id=117 x=110 y=186 width=12 height=12 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=118 x=473 y=161 width=13 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=119 x=140 y=171 width=19 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=120 x=459 y=161 width=13 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=121 x=244 y=65 width=13 height=17 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=122 x=402 y=177 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=123 x=285 y=44 width=8 height=19 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=15 +char id=124 x=237 y=0 width=4 height=22 xoffset=4 yoffset=8 xadvance=12 page=0 chnl=15 +char id=125 x=275 y=44 width=9 height=19 xoffset=0 yoffset=9 xadvance=9 page=0 chnl=15 +char id=126 x=84 y=201 width=12 height=5 xoffset=0 yoffset=15 xadvance=13 page=0 chnl=15 +char id=1024 x=64 y=47 width=10 height=21 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1025 x=75 y=46 width=10 height=21 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1026 x=354 y=98 width=17 height=16 xoffset=0 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1027 x=40 y=47 width=11 height=21 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1028 x=90 y=139 width=14 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1029 x=117 y=156 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1030 x=321 y=150 width=5 height=16 xoffset=1 yoffset=9 xadvance=7 page=0 chnl=15 +char id=1031 x=502 y=0 width=8 height=21 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=15 +char id=1032 x=86 y=46 width=8 height=21 xoffset=-2 yoffset=9 xadvance=7 page=0 chnl=15 +char id=1033 x=450 y=80 width=21 height=16 xoffset=0 yoffset=9 xadvance=22 page=0 chnl=15 +char id=1034 x=428 y=80 width=21 height=16 xoffset=1 yoffset=9 xadvance=22 page=0 chnl=15 +char id=1035 x=494 y=80 width=17 height=16 xoffset=0 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1036 x=339 y=22 width=14 height=21 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1037 x=105 y=23 width=16 height=21 xoffset=1 yoffset=4 xadvance=18 page=0 chnl=15 +char id=1038 x=275 y=22 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1039 x=399 y=22 width=14 height=21 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1040 x=460 y=97 width=16 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1041 x=182 y=153 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1042 x=309 y=133 width=13 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1043 x=195 y=153 width=11 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1044 x=0 y=27 width=17 height=21 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1045 x=501 y=131 width=10 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1046 x=340 y=81 width=21 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1047 x=359 y=115 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1048 x=426 y=97 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1049 x=224 y=23 width=16 height=21 xoffset=1 yoffset=4 xadvance=18 page=0 chnl=15 +char id=1050 x=479 y=114 width=14 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1051 x=247 y=118 width=15 height=16 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1052 x=184 y=102 width=18 height=16 xoffset=1 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1053 x=449 y=114 width=14 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1054 x=0 y=124 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1055 x=434 y=114 width=14 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1056 x=462 y=131 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1057 x=239 y=135 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1058 x=379 y=132 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1059 x=119 y=120 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1060 x=279 y=99 width=18 height=16 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1061 x=199 y=119 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1062 x=156 y=23 width=16 height=21 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1063 x=225 y=135 width=13 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1064 x=318 y=82 width=21 height=16 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15 +char id=1065 x=271 y=0 width=24 height=21 xoffset=1 yoffset=9 xadvance=25 page=0 chnl=15 +char id=1066 x=151 y=119 width=15 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1067 x=372 y=98 width=17 height=16 xoffset=1 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1068 x=13 y=158 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1069 x=0 y=141 width=14 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1070 x=273 y=82 width=22 height=16 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15 +char id=1071 x=30 y=141 width=14 height=16 xoffset=-1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1072 x=266 y=182 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1073 x=342 y=63 width=13 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1074 x=214 y=183 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1075 x=414 y=177 width=9 height=12 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1076 x=167 y=119 width=15 height=16 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1077 x=201 y=183 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1078 x=476 y=148 width=20 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1079 x=188 y=183 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1080 x=497 y=148 width=14 height=12 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1081 x=85 y=68 width=14 height=17 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=15 +char id=1082 x=28 y=188 width=13 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1083 x=14 y=188 width=13 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1084 x=254 y=169 width=16 height=12 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1085 x=175 y=183 width=12 height=12 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1086 x=56 y=188 width=13 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1087 x=162 y=183 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1088 x=435 y=62 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1089 x=378 y=177 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1090 x=279 y=182 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1091 x=314 y=64 width=13 height=17 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1092 x=99 y=0 width=17 height=22 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=15 +char id=1093 x=42 y=188 width=13 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1094 x=464 y=114 width=14 height=16 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1095 x=136 y=186 width=12 height=12 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1096 x=100 y=173 width=19 height=12 xoffset=1 yoffset=13 xadvance=22 page=0 chnl=15 +char id=1097 x=296 y=82 width=21 height=16 xoffset=1 yoffset=13 xadvance=22 page=0 chnl=15 +char id=1098 x=354 y=166 width=15 height=12 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1099 x=288 y=167 width=16 height=12 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1100 x=97 y=188 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1101 x=390 y=177 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1102 x=218 y=170 width=18 height=12 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1103 x=84 y=188 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1104 x=91 y=86 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1105 x=65 y=87 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1106 x=181 y=0 width=13 height=22 xoffset=0 yoffset=8 xadvance=15 page=0 chnl=15 +char id=1107 x=151 y=84 width=10 height=17 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1108 x=342 y=180 width=11 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1109 x=366 y=179 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1110 x=374 y=44 width=5 height=18 xoffset=1 yoffset=7 xadvance=7 page=0 chnl=15 +char id=1111 x=183 y=84 width=8 height=17 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=15 +char id=1112 x=66 y=0 width=8 height=23 xoffset=-2 yoffset=7 xadvance=7 page=0 chnl=15 +char id=1113 x=20 y=175 width=19 height=12 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1114 x=180 y=170 width=18 height=12 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1115 x=328 y=63 width=13 height=17 xoffset=0 yoffset=8 xadvance=15 page=0 chnl=15 +char id=1116 x=272 y=64 width=13 height=17 xoffset=1 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1117 x=115 y=66 width=14 height=17 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=15 +char id=1118 x=223 y=0 width=13 height=22 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1119 x=337 y=133 width=13 height=16 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1120 x=406 y=80 width=21 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1121 x=0 y=175 width=19 height=12 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1122 x=165 y=136 width=14 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1123 x=365 y=149 width=14 height=14 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15 +char id=1124 x=63 y=107 width=20 height=16 xoffset=1 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1125 x=305 y=167 width=16 height=12 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1126 x=336 y=99 width=17 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1127 x=338 y=167 width=15 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1128 x=413 y=44 width=22 height=17 xoffset=1 yoffset=8 xadvance=22 page=0 chnl=15 +char id=1129 x=160 y=170 width=19 height=12 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1130 x=260 y=100 width=18 height=16 xoffset=0 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1131 x=386 y=164 width=14 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1132 x=226 y=84 width=23 height=16 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15 +char id=1133 x=40 y=175 width=19 height=12 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1134 x=20 y=0 width=13 height=25 xoffset=0 yoffset=6 xadvance=14 page=0 chnl=15 +char id=1135 x=27 y=49 width=12 height=21 xoffset=0 yoffset=10 xadvance=12 page=0 chnl=15 +char id=1136 x=203 y=101 width=18 height=16 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1137 x=117 y=0 width=17 height=22 xoffset=1 yoffset=8 xadvance=19 page=0 chnl=15 +char id=1138 x=102 y=122 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1139 x=445 y=162 width=13 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1140 x=68 y=124 width=16 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1141 x=401 y=164 width=14 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1142 x=139 y=23 width=16 height=21 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15 +char id=1143 x=130 y=66 width=14 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1144 x=242 y=0 width=28 height=21 xoffset=1 yoffset=9 xadvance=29 page=0 chnl=15 +char id=1145 x=386 y=44 width=26 height=17 xoffset=0 yoffset=13 xadvance=26 page=0 chnl=15 +char id=1146 x=343 y=44 width=17 height=18 xoffset=1 yoffset=8 xadvance=19 page=0 chnl=15 +char id=1147 x=380 y=149 width=14 height=14 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15 +char id=1148 x=34 y=0 width=22 height=24 xoffset=1 yoffset=1 xadvance=24 page=0 chnl=15 +char id=1149 x=169 y=45 width=19 height=20 xoffset=1 yoffset=5 xadvance=21 page=0 chnl=15 +char id=1150 x=126 y=45 width=21 height=20 xoffset=0 yoffset=5 xadvance=21 page=0 chnl=15 +char id=1151 x=105 y=103 width=19 height=16 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1152 x=429 y=22 width=14 height=21 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1153 x=116 y=84 width=11 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1154 x=395 y=149 width=12 height=14 xoffset=1 yoffset=11 xadvance=14 page=0 chnl=15 +char id=1155 x=55 y=201 width=10 height=6 xoffset=-11 yoffset=8 xadvance=0 page=0 chnl=15 +char id=1156 x=215 y=196 width=10 height=4 xoffset=-11 yoffset=9 xadvance=0 page=0 chnl=15 +char id=1157 x=134 y=199 width=4 height=5 xoffset=-8 yoffset=8 xadvance=0 page=0 chnl=15 +char id=1158 x=129 y=199 width=4 height=5 xoffset=-8 yoffset=8 xadvance=0 page=0 chnl=15 +char id=1160 x=239 y=45 width=22 height=19 xoffset=0 yoffset=10 xadvance=22 page=0 chnl=15 +char id=1161 x=104 y=45 width=21 height=20 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1162 x=0 y=0 width=19 height=26 xoffset=1 yoffset=4 xadvance=20 page=0 chnl=15 +char id=1163 x=18 y=27 width=17 height=21 xoffset=1 yoffset=8 xadvance=18 page=0 chnl=15 +char id=1164 x=253 y=135 width=13 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1165 x=216 y=66 width=13 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1166 x=449 y=131 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1167 x=448 y=62 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1168 x=262 y=44 width=12 height=19 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15 +char id=1169 x=344 y=150 width=10 height=15 xoffset=1 yoffset=10 xadvance=11 page=0 chnl=15 +char id=1170 x=91 y=156 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1171 x=330 y=180 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1172 x=166 y=0 width=14 height=22 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1173 x=461 y=62 width=12 height=17 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1174 x=296 y=0 width=23 height=21 xoffset=0 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1175 x=362 y=81 width=21 height=16 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1176 x=354 y=22 width=14 height=21 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1177 x=487 y=62 width=12 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1178 x=207 y=23 width=16 height=21 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1179 x=60 y=141 width=14 height=16 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1180 x=105 y=139 width=14 height=16 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1181 x=487 y=161 width=13 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1182 x=295 y=116 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1183 x=100 y=67 width=14 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1184 x=390 y=98 width=17 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1185 x=271 y=169 width=16 height=12 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1186 x=427 y=0 width=18 height=21 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1187 x=263 y=117 width=15 height=16 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1188 x=317 y=99 width=18 height=16 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1189 x=237 y=169 width=16 height=12 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1190 x=75 y=0 width=23 height=22 xoffset=1 yoffset=9 xadvance=25 page=0 chnl=15 +char id=1191 x=0 y=71 width=18 height=17 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1192 x=36 y=71 width=16 height=17 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1193 x=414 y=149 width=14 height=13 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1194 x=486 y=22 width=13 height=21 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1195 x=104 y=85 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1196 x=472 y=22 width=13 height=21 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1197 x=65 y=158 width=12 height=16 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1198 x=195 y=136 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1199 x=258 y=65 width=13 height=17 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1200 x=210 y=136 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1201 x=286 y=64 width=13 height=17 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1202 x=241 y=23 width=16 height=21 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1203 x=15 y=141 width=14 height=16 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1204 x=387 y=0 width=20 height=21 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1205 x=222 y=101 width=18 height=16 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1206 x=484 y=0 width=17 height=21 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1207 x=311 y=116 width=15 height=16 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1208 x=393 y=132 width=13 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1209 x=292 y=180 width=12 height=12 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1210 x=374 y=115 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1211 x=0 y=89 width=12 height=17 xoffset=1 yoffset=8 xadvance=15 page=0 chnl=15 +char id=1212 x=21 y=107 width=20 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1213 x=322 y=167 width=15 height=12 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1214 x=148 y=45 width=20 height=20 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1215 x=343 y=116 width=15 height=16 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1216 x=327 y=150 width=5 height=16 xoffset=1 yoffset=9 xadvance=7 page=0 chnl=15 +char id=1217 x=343 y=0 width=21 height=21 xoffset=0 yoffset=4 xadvance=21 page=0 chnl=15 +char id=1218 x=457 y=44 width=20 height=17 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=15 +char id=1219 x=135 y=0 width=15 height=22 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1220 x=498 y=44 width=13 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1221 x=465 y=0 width=18 height=21 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1222 x=51 y=124 width=16 height=16 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1223 x=151 y=0 width=14 height=22 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1224 x=370 y=63 width=12 height=17 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1225 x=446 y=0 width=18 height=21 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1226 x=17 y=124 width=16 height=16 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1227 x=444 y=22 width=13 height=21 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1228 x=130 y=154 width=12 height=16 xoffset=1 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1229 x=320 y=0 width=22 height=21 xoffset=1 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1230 x=42 y=107 width=20 height=16 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1231 x=333 y=150 width=5 height=16 xoffset=1 yoffset=9 xadvance=7 page=0 chnl=15 +char id=1232 x=190 y=23 width=16 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1233 x=409 y=62 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1234 x=258 y=22 width=16 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1235 x=422 y=62 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1236 x=84 y=105 width=20 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1237 x=455 y=148 width=20 height=12 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1238 x=52 y=47 width=11 height=21 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=15 +char id=1239 x=39 y=89 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1240 x=477 y=97 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1241 x=123 y=186 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1242 x=122 y=23 width=16 height=21 xoffset=1 yoffset=4 xadvance=18 page=0 chnl=15 +char id=1243 x=474 y=62 width=12 height=17 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1244 x=365 y=0 width=21 height=21 xoffset=0 yoffset=4 xadvance=21 page=0 chnl=15 +char id=1245 x=436 y=44 width=20 height=17 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=15 +char id=1246 x=369 y=22 width=14 height=21 xoffset=0 yoffset=4 xadvance=14 page=0 chnl=15 +char id=1247 x=13 y=89 width=12 height=17 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=15 +char id=1248 x=435 y=131 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1249 x=78 y=87 width=12 height=17 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1250 x=189 y=45 width=16 height=20 xoffset=1 yoffset=5 xadvance=18 page=0 chnl=15 +char id=1251 x=135 y=136 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1252 x=88 y=23 width=16 height=21 xoffset=1 yoffset=4 xadvance=18 page=0 chnl=15 +char id=1253 x=70 y=69 width=14 height=17 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=15 +char id=1254 x=173 y=23 width=16 height=21 xoffset=1 yoffset=4 xadvance=18 page=0 chnl=15 +char id=1255 x=202 y=66 width=13 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1256 x=34 y=124 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1257 x=431 y=162 width=13 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1258 x=54 y=25 width=16 height=21 xoffset=1 yoffset=4 xadvance=18 page=0 chnl=15 +char id=1259 x=188 y=66 width=13 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1260 x=384 y=22 width=14 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1261 x=128 y=84 width=11 height=17 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=15 +char id=1262 x=223 y=45 width=15 height=20 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15 +char id=1263 x=0 y=49 width=13 height=21 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=1264 x=323 y=22 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1265 x=209 y=0 width=13 height=22 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1266 x=291 y=22 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15 +char id=1267 x=195 y=0 width=13 height=22 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=15 +char id=1268 x=458 y=22 width=13 height=21 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15 +char id=1269 x=26 y=89 width=12 height=17 xoffset=1 yoffset=8 xadvance=15 page=0 chnl=15 +char id=1270 x=500 y=22 width=11 height=21 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1271 x=295 y=150 width=9 height=16 xoffset=1 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1272 x=36 y=25 width=17 height=21 xoffset=1 yoffset=4 xadvance=20 page=0 chnl=15 +char id=1273 x=19 y=71 width=16 height=17 xoffset=1 yoffset=8 xadvance=19 page=0 chnl=15 +char id=1274 x=14 y=49 width=12 height=21 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=1275 x=500 y=62 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=1276 x=71 y=24 width=16 height=21 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1277 x=145 y=66 width=14 height=17 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=1278 x=135 y=119 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15 +char id=1279 x=70 y=188 width=13 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15 +char id=1280 x=0 y=158 width=12 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1281 x=174 y=66 width=13 height=17 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=1282 x=145 y=102 width=19 height=16 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=15 +char id=1283 x=478 y=44 width=19 height=17 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=15 +char id=1284 x=125 y=102 width=19 height=16 xoffset=0 yoffset=9 xadvance=20 page=0 chnl=15 +char id=1285 x=199 y=170 width=18 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1286 x=307 y=22 width=15 height=21 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=1287 x=327 y=116 width=15 height=16 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1288 x=472 y=80 width=21 height=16 xoffset=0 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1289 x=80 y=175 width=19 height=12 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1290 x=384 y=81 width=21 height=16 xoffset=1 yoffset=9 xadvance=23 page=0 chnl=15 +char id=1291 x=60 y=175 width=19 height=12 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1292 x=494 y=97 width=16 height=16 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1293 x=416 y=163 width=14 height=12 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15 +char id=1294 x=279 y=116 width=15 height=16 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15 +char id=1295 x=370 y=164 width=15 height=12 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=1296 x=120 y=137 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15 +char id=1297 x=149 y=184 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=1298 x=408 y=0 width=18 height=21 xoffset=0 yoffset=9 xadvance=18 page=0 chnl=15 +char id=1299 x=53 y=69 width=16 height=17 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 +char id=8192 x=57 y=87 width=1 height=1 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15 +char id=8193 x=59 y=87 width=1 height=1 xoffset=0 yoffset=0 xadvance=22 page=0 chnl=15 +char id=8194 x=34 y=25 width=1 height=1 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15 +char id=8195 x=36 y=47 width=1 height=1 xoffset=0 yoffset=0 xadvance=22 page=0 chnl=15 +char id=8196 x=38 y=47 width=1 height=1 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15 +char id=8197 x=40 y=69 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8198 x=42 y=69 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8199 x=44 y=69 width=1 height=1 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15 +char id=8200 x=46 y=69 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8201 x=61 y=87 width=1 height=1 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=15 +char id=8202 x=50 y=69 width=1 height=1 xoffset=0 yoffset=0 xadvance=2 page=0 chnl=15 +char id=8203 x=53 y=87 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=203 y=196 width=11 height=4 xoffset=0 yoffset=17 xadvance=11 page=0 chnl=15 +char id=8212 x=139 y=199 width=22 height=4 xoffset=0 yoffset=17 xadvance=22 page=0 chnl=15 +char id=8213 x=162 y=196 width=22 height=4 xoffset=0 yoffset=17 xadvance=22 page=0 chnl=15 +char id=8215 x=22 y=201 width=10 height=6 xoffset=0 yoffset=25 xadvance=9 page=0 chnl=15 +char id=8216 x=72 y=201 width=5 height=6 xoffset=0 yoffset=9 xadvance=5 page=0 chnl=15 +char id=8217 x=78 y=201 width=5 height=6 xoffset=0 yoffset=9 xadvance=5 page=0 chnl=15 +char id=8218 x=117 y=199 width=5 height=5 xoffset=0 yoffset=22 xadvance=6 page=0 chnl=15 +char id=8219 x=66 y=201 width=5 height=6 xoffset=0 yoffset=9 xadvance=5 page=0 chnl=15 +char id=8220 x=33 y=201 width=10 height=6 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15 +char id=8221 x=44 y=201 width=10 height=6 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15 +char id=8222 x=97 y=201 width=10 height=5 xoffset=0 yoffset=22 xadvance=11 page=0 chnl=15 +char id=8224 x=173 y=84 width=9 height=17 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=15 +char id=8225 x=162 y=84 width=10 height=17 xoffset=1 yoffset=8 xadvance=11 page=0 chnl=15 +char id=8226 x=487 y=174 width=8 height=8 xoffset=0 yoffset=13 xadvance=8 page=0 chnl=15 +char id=8230 x=185 y=196 width=17 height=4 xoffset=1 yoffset=21 xadvance=19 page=0 chnl=15 +char id=8240 x=197 y=84 width=28 height=16 xoffset=0 yoffset=9 xadvance=28 page=0 chnl=15 +char id=8242 x=9 y=201 width=7 height=7 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=15 +char id=8243 x=496 y=174 width=12 height=7 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15 +char id=8249 x=456 y=175 width=8 height=11 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=15 +char id=8250 x=465 y=174 width=8 height=11 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=15 +char id=8252 x=242 y=152 width=10 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15 +char id=8260 x=281 y=133 width=13 height=16 xoffset=-5 yoffset=9 xadvance=3 page=0 chnl=15 +char id=8355 x=156 y=153 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=8356 x=295 y=133 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 +char id=8359 x=241 y=101 width=18 height=16 xoffset=1 yoffset=9 xadvance=20 page=0 chnl=15 +char id=8362 x=298 y=99 width=18 height=16 xoffset=1 yoffset=9 xadvance=20 page=0 chnl=15 +char id=8363 x=414 y=22 width=14 height=21 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=15 +char id=8364 x=407 y=132 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15 diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans32Bold_0.png b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32Bold_0.png new file mode 100644 index 00000000..520e099c Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32Bold_0.png differ diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans32_0.png b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32_0.png new file mode 100644 index 00000000..9a90fa81 Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/fonts/OpenSans32_0.png differ diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans48.fnt b/project_templates/sample_scene/content/gui_content/fonts/OpenSans48.fnt new file mode 100644 index 00000000..3617d3ba --- /dev/null +++ b/project_templates/sample_scene/content/gui_content/fonts/OpenSans48.fnt @@ -0,0 +1,415 @@ +info face="Open Sans" size=48 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0 +common lineHeight=48 base=37 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="OpenSans48_0.png" +chars count=411 +char id=13 x=89 y=66 width=1 height=1 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=32 x=23 y=68 width=1 height=1 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=33 x=63 y=309 width=5 height=24 xoffset=2 yoffset=13 xadvance=9 page=0 chnl=15 +char id=34 x=97 y=372 width=9 height=10 xoffset=2 yoffset=13 xadvance=13 page=0 chnl=15 +char id=35 x=422 y=198 width=21 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=36 x=255 y=96 width=16 height=27 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15 +char id=37 x=308 y=174 width=25 height=24 xoffset=1 yoffset=13 xadvance=28 page=0 chnl=15 +char id=38 x=168 y=206 width=23 height=24 xoffset=1 yoffset=13 xadvance=24 page=0 chnl=15 +char id=39 x=107 y=371 width=4 height=10 xoffset=2 yoffset=13 xadvance=7 page=0 chnl=15 +char id=40 x=184 y=97 width=8 height=29 xoffset=1 yoffset=13 xadvance=10 page=0 chnl=15 +char id=41 x=164 y=97 width=9 height=29 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15 +char id=42 x=54 y=372 width=16 height=16 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15 +char id=43 x=18 y=372 width=17 height=17 xoffset=1 yoffset=16 xadvance=19 page=0 chnl=15 +char id=44 x=211 y=367 width=6 height=8 xoffset=1 yoffset=33 xadvance=9 page=0 chnl=15 +char id=45 x=408 y=356 width=9 height=4 xoffset=1 yoffset=26 xadvance=11 page=0 chnl=15 +char id=46 x=322 y=358 width=5 height=5 xoffset=2 yoffset=32 xadvance=9 page=0 chnl=15 +char id=47 x=26 y=309 width=12 height=24 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=48 x=385 y=249 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=49 x=52 y=309 width=10 height=24 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15 +char id=50 x=18 y=284 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=51 x=300 y=276 width=16 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=52 x=490 y=222 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=53 x=385 y=274 width=15 height=24 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=15 +char id=54 x=403 y=249 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=55 x=108 y=282 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=56 x=162 y=281 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=57 x=457 y=248 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=58 x=506 y=297 width=5 height=18 xoffset=2 yoffset=19 xadvance=9 page=0 chnl=15 +char id=59 x=191 y=306 width=7 height=22 xoffset=0 yoffset=19 xadvance=9 page=0 chnl=15 +char id=60 x=0 y=372 width=17 height=17 xoffset=1 yoffset=17 xadvance=19 page=0 chnl=15 +char id=61 x=80 y=372 width=16 height=10 xoffset=1 yoffset=21 xadvance=19 page=0 chnl=15 +char id=62 x=481 y=336 width=17 height=17 xoffset=1 yoffset=17 xadvance=19 page=0 chnl=15 +char id=63 x=492 y=272 width=14 height=24 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15 +char id=64 x=227 y=97 width=27 height=27 xoffset=1 yoffset=13 xadvance=30 page=0 chnl=15 +char id=65 x=22 y=234 width=21 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=66 x=36 y=284 width=17 height=24 xoffset=3 yoffset=13 xadvance=21 page=0 chnl=15 +char id=67 x=40 y=259 width=19 height=24 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=68 x=470 y=222 width=19 height=24 xoffset=3 yoffset=13 xadvance=24 page=0 chnl=15 +char id=69 x=462 y=273 width=14 height=24 xoffset=3 yoffset=13 xadvance=18 page=0 chnl=15 +char id=70 x=477 y=272 width=14 height=24 xoffset=3 yoffset=13 xadvance=17 page=0 chnl=15 +char id=71 x=44 y=234 width=21 height=24 xoffset=1 yoffset=13 xadvance=24 page=0 chnl=15 +char id=72 x=0 y=259 width=19 height=24 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=73 x=69 y=309 width=3 height=24 xoffset=3 yoffset=13 xadvance=9 page=0 chnl=15 +char id=74 x=470 y=63 width=9 height=30 xoffset=-3 yoffset=13 xadvance=9 page=0 chnl=15 +char id=75 x=176 y=256 width=18 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=76 x=497 y=147 width=14 height=24 xoffset=3 yoffset=13 xadvance=17 page=0 chnl=15 +char id=77 x=434 y=173 width=24 height=24 xoffset=3 yoffset=13 xadvance=30 page=0 chnl=15 +char id=78 x=20 y=259 width=19 height=24 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=79 x=72 y=207 width=23 height=24 xoffset=1 yoffset=13 xadvance=26 page=0 chnl=15 +char id=80 x=368 y=274 width=16 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=81 x=64 y=99 width=23 height=29 xoffset=1 yoffset=13 xadvance=26 page=0 chnl=15 +char id=82 x=493 y=247 width=17 height=24 xoffset=3 yoffset=13 xadvance=21 page=0 chnl=15 +char id=83 x=283 y=276 width=16 height=24 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15 +char id=84 x=290 y=251 width=18 height=24 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15 +char id=85 x=230 y=229 width=19 height=24 xoffset=2 yoffset=13 xadvance=24 page=0 chnl=15 +char id=86 x=108 y=231 width=20 height=24 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15 +char id=87 x=314 y=149 width=30 height=24 xoffset=0 yoffset=13 xadvance=31 page=0 chnl=15 +char id=88 x=430 y=223 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=89 x=410 y=224 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=90 x=439 y=248 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=91 x=193 y=97 width=8 height=29 xoffset=2 yoffset=13 xadvance=11 page=0 chnl=15 +char id=92 x=0 y=309 width=12 height=24 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=93 x=174 y=97 width=9 height=29 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15 +char id=94 x=36 y=372 width=17 height=16 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=95 x=418 y=356 width=16 height=3 xoffset=-1 yoffset=39 xadvance=15 page=0 chnl=15 +char id=96 x=260 y=361 width=7 height=6 xoffset=1 yoffset=12 xadvance=9 page=0 chnl=15 +char id=97 x=303 y=339 width=15 height=18 xoffset=1 yoffset=19 xadvance=18 page=0 chnl=15 +char id=98 x=409 y=121 width=17 height=25 xoffset=2 yoffset=12 xadvance=20 page=0 chnl=15 +char id=99 x=396 y=337 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=100 x=391 y=122 width=17 height=25 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=101 x=138 y=352 width=16 height=18 xoffset=1 yoffset=19 xadvance=19 page=0 chnl=15 +char id=102 x=193 y=153 width=13 height=25 xoffset=0 yoffset=12 xadvance=11 page=0 chnl=15 +char id=103 x=335 y=96 width=18 height=26 xoffset=0 yoffset=19 xadvance=18 page=0 chnl=15 +char id=104 x=68 y=156 width=16 height=25 xoffset=2 yoffset=12 xadvance=20 page=0 chnl=15 +char id=105 x=231 y=151 width=4 height=25 xoffset=2 yoffset=12 xadvance=8 page=0 chnl=15 +char id=106 x=200 y=0 width=8 height=33 xoffset=-2 yoffset=12 xadvance=8 page=0 chnl=15 +char id=107 x=17 y=158 width=16 height=25 xoffset=2 yoffset=12 xadvance=17 page=0 chnl=15 +char id=108 x=236 y=151 width=4 height=25 xoffset=2 yoffset=12 xadvance=8 page=0 chnl=15 +char id=109 x=373 y=299 width=26 height=18 xoffset=2 yoffset=19 xadvance=31 page=0 chnl=15 +char id=110 x=104 y=352 width=16 height=18 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=111 x=371 y=318 width=17 height=18 xoffset=1 yoffset=19 xadvance=20 page=0 chnl=15 +char id=112 x=354 y=96 width=17 height=26 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=113 x=372 y=96 width=17 height=26 xoffset=1 yoffset=19 xadvance=20 page=0 chnl=15 +char id=114 x=469 y=336 width=11 height=18 xoffset=2 yoffset=19 xadvance=14 page=0 chnl=15 +char id=115 x=366 y=337 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=116 x=179 y=306 width=11 height=22 xoffset=0 yoffset=15 xadvance=12 page=0 chnl=15 +char id=117 x=155 y=348 width=16 height=18 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=118 x=479 y=317 width=17 height=18 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=119 x=346 y=299 width=26 height=18 xoffset=0 yoffset=19 xadvance=26 page=0 chnl=15 +char id=120 x=461 y=317 width=17 height=18 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=121 x=390 y=95 width=17 height=26 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=122 x=441 y=337 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=123 x=139 y=97 width=12 height=29 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=124 x=209 y=0 width=4 height=33 xoffset=7 yoffset=12 xadvance=18 page=0 chnl=15 +char id=125 x=152 y=97 width=11 height=29 xoffset=1 yoffset=13 xadvance=12 page=0 chnl=15 +char id=126 x=291 y=361 width=17 height=5 xoffset=1 yoffset=23 xadvance=19 page=0 chnl=15 +char id=1024 x=355 y=33 width=14 height=31 xoffset=3 yoffset=6 xadvance=18 page=0 chnl=15 +char id=1025 x=340 y=33 width=14 height=31 xoffset=3 yoffset=6 xadvance=18 page=0 chnl=15 +char id=1026 x=332 y=199 width=22 height=24 xoffset=0 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1027 x=325 y=33 width=14 height=31 xoffset=3 yoffset=6 xadvance=17 page=0 chnl=15 +char id=1028 x=129 y=231 width=20 height=24 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1029 x=232 y=279 width=16 height=24 xoffset=1 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1030 x=73 y=309 width=3 height=24 xoffset=3 yoffset=13 xadvance=9 page=0 chnl=15 +char id=1031 x=385 y=32 width=10 height=31 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15 +char id=1032 x=480 y=63 width=9 height=30 xoffset=-3 yoffset=13 xadvance=9 page=0 chnl=15 +char id=1033 x=345 y=149 width=30 height=24 xoffset=0 yoffset=13 xadvance=31 page=0 chnl=15 +char id=1034 x=29 y=184 width=28 height=24 xoffset=3 yoffset=13 xadvance=32 page=0 chnl=15 +char id=1035 x=309 y=199 width=22 height=24 xoffset=0 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1036 x=234 y=33 width=18 height=31 xoffset=3 yoffset=6 xadvance=20 page=0 chnl=15 +char id=1037 x=174 y=34 width=19 height=31 xoffset=3 yoffset=6 xadvance=25 page=0 chnl=15 +char id=1038 x=67 y=36 width=21 height=31 xoffset=0 yoffset=6 xadvance=21 page=0 chnl=15 +char id=1039 x=398 y=63 width=18 height=30 xoffset=3 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1040 x=0 y=234 width=21 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1041 x=215 y=279 width=16 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1042 x=475 y=247 width=17 height=24 xoffset=3 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1043 x=432 y=274 width=14 height=24 xoffset=3 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1044 x=185 y=66 width=22 height=30 xoffset=0 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1045 x=447 y=273 width=14 height=24 xoffset=3 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1046 x=468 y=147 width=28 height=24 xoffset=0 yoffset=13 xadvance=28 page=0 chnl=15 +char id=1047 x=421 y=249 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1048 x=210 y=229 width=19 height=24 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=1049 x=214 y=33 width=19 height=31 xoffset=3 yoffset=6 xadvance=25 page=0 chnl=15 +char id=1050 x=100 y=257 width=18 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1051 x=66 y=234 width=20 height=24 xoffset=0 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1052 x=359 y=174 width=24 height=24 xoffset=3 yoffset=13 xadvance=30 page=0 chnl=15 +char id=1053 x=150 y=231 width=19 height=24 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=1054 x=24 y=209 width=23 height=24 xoffset=1 yoffset=13 xadvance=26 page=0 chnl=15 +char id=1055 x=309 y=251 width=18 height=24 xoffset=3 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1056 x=334 y=274 width=16 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1057 x=310 y=224 width=19 height=24 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1058 x=328 y=249 width=18 height=24 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1059 x=488 y=197 width=21 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1060 x=384 y=174 width=24 height=24 xoffset=1 yoffset=13 xadvance=27 page=0 chnl=15 +char id=1061 x=250 y=228 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1062 x=490 y=32 width=21 height=30 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=1063 x=214 y=254 width=18 height=24 xoffset=2 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1064 x=0 y=184 width=28 height=24 xoffset=3 yoffset=13 xadvance=34 page=0 chnl=15 +char id=1065 x=428 y=32 width=31 height=30 xoffset=3 yoffset=13 xadvance=35 page=0 chnl=15 +char id=1066 x=466 y=197 width=21 height=24 xoffset=0 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1067 x=286 y=201 width=22 height=24 xoffset=3 yoffset=13 xadvance=28 page=0 chnl=15 +char id=1068 x=54 y=284 width=17 height=24 xoffset=3 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1069 x=330 y=224 width=19 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1070 x=407 y=148 width=30 height=24 xoffset=3 yoffset=13 xadvance=35 page=0 chnl=15 +char id=1071 x=233 y=254 width=18 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1072 x=223 y=347 width=15 height=18 xoffset=1 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1073 x=319 y=123 width=17 height=25 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1074 x=87 y=353 width=16 height=18 xoffset=2 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1075 x=456 y=337 width=12 height=18 xoffset=2 yoffset=19 xadvance=14 page=0 chnl=15 +char id=1076 x=190 y=231 width=19 height=24 xoffset=0 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1077 x=53 y=353 width=16 height=18 xoffset=1 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1078 x=480 y=297 width=25 height=18 xoffset=0 yoffset=19 xadvance=24 page=0 chnl=15 +char id=1079 x=426 y=337 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1080 x=425 y=318 width=17 height=18 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1081 x=373 y=123 width=17 height=25 xoffset=2 yoffset=12 xadvance=21 page=0 chnl=15 +char id=1082 x=255 y=342 width=15 height=18 xoffset=2 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1083 x=389 y=318 width=17 height=18 xoffset=0 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1084 x=211 y=328 width=20 height=18 xoffset=2 yoffset=19 xadvance=24 page=0 chnl=15 +char id=1085 x=36 y=353 width=16 height=18 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1086 x=353 y=318 width=17 height=18 xoffset=1 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1087 x=206 y=348 width=16 height=18 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1088 x=426 y=94 width=17 height=26 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1089 x=351 y=339 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1090 x=271 y=342 width=15 height=18 xoffset=0 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1091 x=444 y=94 width=17 height=26 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1092 x=96 y=0 width=21 height=33 xoffset=1 yoffset=12 xadvance=24 page=0 chnl=15 +char id=1093 x=18 y=353 width=17 height=18 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1094 x=119 y=256 width=18 height=24 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1095 x=70 y=353 width=16 height=18 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1096 x=0 y=334 width=25 height=18 xoffset=2 yoffset=19 xadvance=30 page=0 chnl=15 +char id=1097 x=116 y=181 width=27 height=24 xoffset=2 yoffset=19 xadvance=30 page=0 chnl=15 +char id=1098 x=167 y=329 width=21 height=18 xoffset=0 yoffset=19 xadvance=23 page=0 chnl=15 +char id=1099 x=145 y=329 width=21 height=18 xoffset=2 yoffset=19 xadvance=26 page=0 chnl=15 +char id=1100 x=172 y=348 width=16 height=18 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1101 x=287 y=342 width=15 height=18 xoffset=0 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1102 x=26 y=334 width=24 height=18 xoffset=2 yoffset=19 xadvance=28 page=0 chnl=15 +char id=1103 x=189 y=348 width=16 height=18 xoffset=0 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1104 x=0 y=158 width=16 height=25 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15 +char id=1105 x=51 y=156 width=16 height=25 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15 +char id=1106 x=118 y=0 width=18 height=33 xoffset=0 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1107 x=207 y=153 width=12 height=25 xoffset=2 yoffset=12 xadvance=14 page=0 chnl=15 +char id=1108 x=319 y=339 width=15 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1109 x=381 y=337 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1110 x=241 y=151 width=4 height=25 xoffset=2 yoffset=12 xadvance=8 page=0 chnl=15 +char id=1111 x=220 y=152 width=10 height=25 xoffset=0 yoffset=12 xadvance=8 page=0 chnl=15 +char id=1112 x=191 y=0 width=8 height=33 xoffset=-2 yoffset=12 xadvance=8 page=0 chnl=15 +char id=1113 x=265 y=304 width=26 height=18 xoffset=0 yoffset=19 xadvance=28 page=0 chnl=15 +char id=1114 x=238 y=304 width=26 height=18 xoffset=2 yoffset=19 xadvance=30 page=0 chnl=15 +char id=1115 x=208 y=126 width=18 height=25 xoffset=0 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1116 x=85 y=155 width=15 height=25 xoffset=2 yoffset=12 xadvance=17 page=0 chnl=15 +char id=1117 x=355 y=123 width=17 height=25 xoffset=2 yoffset=12 xadvance=21 page=0 chnl=15 +char id=1118 x=173 y=0 width=17 height=33 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15 +char id=1119 x=249 y=279 width=16 height=24 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1120 x=283 y=149 width=30 height=24 xoffset=0 yoffset=13 xadvance=30 page=0 chnl=15 +char id=1121 x=454 y=298 width=25 height=18 xoffset=0 yoffset=19 xadvance=26 page=0 chnl=15 +char id=1122 x=444 y=198 width=21 height=24 xoffset=0 yoffset=13 xadvance=22 page=0 chnl=15 +char id=1123 x=138 y=306 width=20 height=22 xoffset=0 yoffset=15 xadvance=21 page=0 chnl=15 +char id=1124 x=144 y=181 width=27 height=24 xoffset=3 yoffset=13 xadvance=31 page=0 chnl=15 +char id=1125 x=99 y=333 width=22 height=18 xoffset=2 yoffset=19 xadvance=25 page=0 chnl=15 +char id=1126 x=48 y=209 width=23 height=24 xoffset=0 yoffset=13 xadvance=22 page=0 chnl=15 +char id=1127 x=294 y=320 width=19 height=18 xoffset=0 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1128 x=58 y=182 width=28 height=24 xoffset=3 yoffset=13 xadvance=31 page=0 chnl=15 +char id=1129 x=75 y=334 width=23 height=18 xoffset=2 yoffset=19 xadvance=25 page=0 chnl=15 +char id=1130 x=409 y=173 width=24 height=24 xoffset=0 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1131 x=189 y=329 width=21 height=18 xoffset=0 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1132 x=438 y=147 width=29 height=24 xoffset=3 yoffset=13 xadvance=33 page=0 chnl=15 +char id=1133 x=400 y=299 width=26 height=18 xoffset=2 yoffset=19 xadvance=28 page=0 chnl=15 +char id=1134 x=55 y=0 width=18 height=35 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=15 +char id=1135 x=108 y=99 width=15 height=29 xoffset=0 yoffset=15 xadvance=16 page=0 chnl=15 +char id=1136 x=334 y=174 width=24 height=24 xoffset=1 yoffset=13 xadvance=27 page=0 chnl=15 +char id=1137 x=74 y=0 width=21 height=33 xoffset=2 yoffset=12 xadvance=25 page=0 chnl=15 +char id=1138 x=216 y=204 width=23 height=24 xoffset=1 yoffset=13 xadvance=26 page=0 chnl=15 +char id=1139 x=0 y=353 width=17 height=18 xoffset=1 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1140 x=263 y=201 width=22 height=24 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1141 x=334 y=320 width=18 height=18 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1142 x=447 y=0 width=22 height=31 xoffset=0 yoffset=6 xadvance=21 page=0 chnl=15 +char id=1143 x=246 y=125 width=18 height=25 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15 +char id=1144 x=214 y=0 width=39 height=32 xoffset=1 yoffset=13 xadvance=40 page=0 chnl=15 +char id=1145 x=272 y=96 width=35 height=26 xoffset=1 yoffset=19 xadvance=36 page=0 chnl=15 +char id=1146 x=202 y=97 width=24 height=28 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15 +char id=1147 x=159 y=306 width=19 height=22 xoffset=1 yoffset=17 xadvance=22 page=0 chnl=15 +char id=1148 x=23 y=0 width=31 height=35 xoffset=1 yoffset=2 xadvance=34 page=0 chnl=15 +char id=1149 x=57 y=68 width=27 height=30 xoffset=1 yoffset=7 xadvance=30 page=0 chnl=15 +char id=1150 x=33 y=99 width=30 height=29 xoffset=0 yoffset=8 xadvance=30 page=0 chnl=15 +char id=1151 x=81 y=309 width=25 height=23 xoffset=0 yoffset=14 xadvance=26 page=0 chnl=15 +char id=1152 x=286 y=0 width=20 height=32 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1153 x=67 y=129 width=14 height=26 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1154 x=199 y=306 width=18 height=21 xoffset=1 yoffset=16 xadvance=20 page=0 chnl=15 +char id=1155 x=234 y=366 width=13 height=7 xoffset=-16 yoffset=13 xadvance=0 page=0 chnl=15 +char id=1156 x=309 y=358 width=12 height=5 xoffset=-15 yoffset=13 xadvance=0 page=0 chnl=15 +char id=1157 x=254 y=362 width=5 height=7 xoffset=-12 yoffset=11 xadvance=0 page=0 chnl=15 +char id=1158 x=248 y=362 width=5 height=7 xoffset=-12 yoffset=11 xadvance=0 page=0 chnl=15 +char id=1160 x=0 y=101 width=32 height=29 xoffset=0 yoffset=14 xadvance=33 page=0 chnl=15 +char id=1161 x=396 y=32 width=31 height=30 xoffset=0 yoffset=13 xadvance=32 page=0 chnl=15 +char id=1162 x=0 y=0 width=22 height=37 xoffset=3 yoffset=6 xadvance=26 page=0 chnl=15 +char id=1163 x=133 y=34 width=20 height=31 xoffset=2 yoffset=12 xadvance=22 page=0 chnl=15 +char id=1164 x=170 y=231 width=19 height=24 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1165 x=227 y=125 width=18 height=25 xoffset=0 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1166 x=198 y=281 width=16 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1167 x=408 y=94 width=17 height=26 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1168 x=124 y=97 width=14 height=29 xoffset=3 yoffset=8 xadvance=18 page=0 chnl=15 +char id=1169 x=125 y=307 width=12 height=23 xoffset=2 yoffset=14 xadvance=14 page=0 chnl=15 +char id=1170 x=90 y=284 width=17 height=24 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1171 x=497 y=316 width=14 height=18 xoffset=0 yoffset=19 xadvance=14 page=0 chnl=15 +char id=1172 x=346 y=0 width=18 height=32 xoffset=3 yoffset=13 xadvance=22 page=0 chnl=15 +char id=1173 x=51 y=129 width=15 height=26 xoffset=2 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1174 x=460 y=32 width=29 height=30 xoffset=0 yoffset=13 xadvance=29 page=0 chnl=15 +char id=1175 x=254 y=176 width=26 height=24 xoffset=0 yoffset=19 xadvance=26 page=0 chnl=15 +char id=1176 x=271 y=33 width=17 height=31 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1177 x=148 y=153 width=14 height=25 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1178 x=338 y=65 width=19 height=30 xoffset=3 yoffset=13 xadvance=22 page=0 chnl=15 +char id=1179 x=266 y=278 width=16 height=24 xoffset=2 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1180 x=195 y=256 width=18 height=24 xoffset=3 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1181 x=239 y=343 width=15 height=18 xoffset=2 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1182 x=378 y=199 width=21 height=24 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1183 x=337 y=123 width=17 height=25 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15 +char id=1184 x=0 y=209 width=23 height=24 xoffset=0 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1185 x=253 y=323 width=20 height=18 xoffset=0 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1186 x=275 y=65 width=21 height=30 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=1187 x=350 y=224 width=19 height=24 xoffset=2 yoffset=19 xadvance=22 page=0 chnl=15 +char id=1188 x=459 y=172 width=24 height=24 xoffset=3 yoffset=13 xadvance=27 page=0 chnl=15 +char id=1189 x=122 y=333 width=22 height=18 xoffset=2 yoffset=19 xadvance=24 page=0 chnl=15 +char id=1190 x=254 y=0 width=31 height=32 xoffset=3 yoffset=13 xadvance=35 page=0 chnl=15 +char id=1191 x=308 y=96 width=26 height=26 xoffset=2 yoffset=19 xadvance=29 page=0 chnl=15 +char id=1192 x=161 y=127 width=24 height=25 xoffset=1 yoffset=13 xadvance=26 page=0 chnl=15 +char id=1193 x=218 y=304 width=19 height=19 xoffset=1 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1194 x=154 y=34 width=19 height=31 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1195 x=133 y=155 width=14 height=25 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1196 x=436 y=63 width=18 height=30 xoffset=0 yoffset=13 xadvance=18 page=0 chnl=15 +char id=1197 x=401 y=274 width=15 height=24 xoffset=0 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1198 x=370 y=224 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1199 x=462 y=94 width=17 height=26 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1200 x=390 y=224 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1201 x=480 y=94 width=17 height=26 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1202 x=253 y=65 width=21 height=30 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1203 x=271 y=251 width=18 height=24 xoffset=0 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1204 x=0 y=70 width=28 height=30 xoffset=0 yoffset=13 xadvance=29 page=0 chnl=15 +char id=1205 x=484 y=172 width=24 height=24 xoffset=0 yoffset=19 xadvance=24 page=0 chnl=15 +char id=1206 x=231 y=65 width=21 height=30 xoffset=2 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1207 x=366 y=249 width=18 height=24 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1208 x=252 y=253 width=18 height=24 xoffset=2 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1209 x=335 y=339 width=15 height=18 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1210 x=157 y=256 width=18 height=24 xoffset=3 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1211 x=445 y=121 width=16 height=25 xoffset=2 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1212 x=227 y=178 width=26 height=24 xoffset=0 yoffset=13 xadvance=28 page=0 chnl=15 +char id=1213 x=232 y=324 width=20 height=18 xoffset=0 yoffset=19 xadvance=22 page=0 chnl=15 +char id=1214 x=85 y=68 width=26 height=30 xoffset=0 yoffset=13 xadvance=28 page=0 chnl=15 +char id=1215 x=87 y=232 width=20 height=24 xoffset=0 yoffset=19 xadvance=22 page=0 chnl=15 +char id=1216 x=77 y=309 width=3 height=24 xoffset=3 yoffset=13 xadvance=9 page=0 chnl=15 +char id=1217 x=365 y=0 width=28 height=31 xoffset=0 yoffset=6 xadvance=28 page=0 chnl=15 +char id=1218 x=109 y=129 width=25 height=25 xoffset=0 yoffset=12 xadvance=24 page=0 chnl=15 +char id=1219 x=327 y=0 width=18 height=32 xoffset=3 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1220 x=0 y=131 width=16 height=26 xoffset=2 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1221 x=112 y=66 width=24 height=30 xoffset=0 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1222 x=270 y=226 width=19 height=24 xoffset=0 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1223 x=307 y=0 width=19 height=32 xoffset=3 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1224 x=17 y=131 width=16 height=26 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1225 x=208 y=66 width=22 height=30 xoffset=3 yoffset=13 xadvance=25 page=0 chnl=15 +char id=1226 x=450 y=223 width=19 height=24 xoffset=2 yoffset=19 xadvance=22 page=0 chnl=15 +char id=1227 x=417 y=63 width=18 height=30 xoffset=2 yoffset=13 xadvance=23 page=0 chnl=15 +char id=1228 x=351 y=274 width=16 height=24 xoffset=2 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1229 x=29 y=68 width=27 height=30 xoffset=3 yoffset=13 xadvance=30 page=0 chnl=15 +char id=1230 x=96 y=206 width=23 height=24 xoffset=2 yoffset=19 xadvance=25 page=0 chnl=15 +char id=1231 x=507 y=272 width=3 height=24 xoffset=3 yoffset=13 xadvance=9 page=0 chnl=15 +char id=1232 x=89 y=34 width=21 height=31 xoffset=0 yoffset=6 xadvance=21 page=0 chnl=15 +char id=1233 x=117 y=155 width=15 height=25 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15 +char id=1234 x=45 y=36 width=21 height=31 xoffset=0 yoffset=6 xadvance=21 page=0 chnl=15 +char id=1235 x=101 y=155 width=15 height=25 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15 +char id=1236 x=172 y=179 width=27 height=24 xoffset=0 yoffset=13 xadvance=29 page=0 chnl=15 +char id=1237 x=427 y=299 width=26 height=18 xoffset=1 yoffset=19 xadvance=29 page=0 chnl=15 +char id=1238 x=370 y=32 width=14 height=31 xoffset=3 yoffset=6 xadvance=18 page=0 chnl=15 +char id=1239 x=479 y=121 width=16 height=25 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15 +char id=1240 x=355 y=199 width=22 height=24 xoffset=1 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1241 x=121 y=352 width=16 height=18 xoffset=1 yoffset=19 xadvance=19 page=0 chnl=15 +char id=1242 x=0 y=38 width=22 height=31 xoffset=1 yoffset=6 xadvance=24 page=0 chnl=15 +char id=1243 x=462 y=121 width=16 height=25 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15 +char id=1244 x=394 y=0 width=28 height=31 xoffset=0 yoffset=6 xadvance=28 page=0 chnl=15 +char id=1245 x=135 y=127 width=25 height=25 xoffset=0 yoffset=12 xadvance=24 page=0 chnl=15 +char id=1246 x=289 y=33 width=17 height=31 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15 +char id=1247 x=163 y=153 width=14 height=25 xoffset=1 yoffset=12 xadvance=16 page=0 chnl=15 +char id=1248 x=72 y=284 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1249 x=34 y=129 width=16 height=26 xoffset=0 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1250 x=88 y=99 width=19 height=29 xoffset=3 yoffset=8 xadvance=25 page=0 chnl=15 +char id=1251 x=107 y=309 width=17 height=23 xoffset=2 yoffset=14 xadvance=21 page=0 chnl=15 +char id=1252 x=194 y=34 width=19 height=31 xoffset=3 yoffset=6 xadvance=25 page=0 chnl=15 +char id=1253 x=301 y=123 width=17 height=25 xoffset=2 yoffset=12 xadvance=21 page=0 chnl=15 +char id=1254 x=423 y=0 width=23 height=31 xoffset=1 yoffset=6 xadvance=26 page=0 chnl=15 +char id=1255 x=283 y=123 width=17 height=25 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1256 x=144 y=206 width=23 height=24 xoffset=1 yoffset=13 xadvance=26 page=0 chnl=15 +char id=1257 x=407 y=318 width=17 height=18 xoffset=1 yoffset=19 xadvance=20 page=0 chnl=15 +char id=1258 x=161 y=66 width=23 height=30 xoffset=1 yoffset=7 xadvance=26 page=0 chnl=15 +char id=1259 x=265 y=124 width=17 height=25 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1260 x=378 y=64 width=19 height=30 xoffset=0 yoffset=7 xadvance=21 page=0 chnl=15 +char id=1261 x=496 y=121 width=15 height=25 xoffset=0 yoffset=12 xadvance=16 page=0 chnl=15 +char id=1262 x=490 y=63 width=21 height=29 xoffset=0 yoffset=8 xadvance=21 page=0 chnl=15 +char id=1263 x=253 y=33 width=17 height=31 xoffset=0 yoffset=14 xadvance=17 page=0 chnl=15 +char id=1264 x=23 y=36 width=21 height=31 xoffset=0 yoffset=6 xadvance=21 page=0 chnl=15 +char id=1265 x=155 y=0 width=17 height=33 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15 +char id=1266 x=111 y=34 width=21 height=31 xoffset=0 yoffset=6 xadvance=21 page=0 chnl=15 +char id=1267 x=137 y=0 width=17 height=33 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15 +char id=1268 x=493 y=0 width=18 height=31 xoffset=2 yoffset=6 xadvance=23 page=0 chnl=15 +char id=1269 x=34 y=156 width=16 height=25 xoffset=2 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1270 x=455 y=63 width=14 height=30 xoffset=3 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1271 x=39 y=309 width=12 height=24 xoffset=2 yoffset=19 xadvance=14 page=0 chnl=15 +char id=1272 x=470 y=0 width=22 height=31 xoffset=3 yoffset=6 xadvance=28 page=0 chnl=15 +char id=1273 x=186 y=127 width=21 height=25 xoffset=2 yoffset=12 xadvance=26 page=0 chnl=15 +char id=1274 x=307 y=33 width=17 height=31 xoffset=0 yoffset=13 xadvance=17 page=0 chnl=15 +char id=1275 x=417 y=274 width=14 height=24 xoffset=0 yoffset=19 xadvance=14 page=0 chnl=15 +char id=1276 x=297 y=65 width=20 height=30 xoffset=0 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1277 x=138 y=256 width=18 height=24 xoffset=0 yoffset=19 xadvance=18 page=0 chnl=15 +char id=1278 x=80 y=259 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1279 x=443 y=318 width=17 height=18 xoffset=0 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1280 x=180 y=281 width=17 height=24 xoffset=1 yoffset=13 xadvance=20 page=0 chnl=15 +char id=1281 x=427 y=121 width=17 height=25 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=1282 x=200 y=179 width=26 height=24 xoffset=1 yoffset=13 xadvance=30 page=0 chnl=15 +char id=1283 x=82 y=129 width=26 height=25 xoffset=1 yoffset=12 xadvance=30 page=0 chnl=15 +char id=1284 x=281 y=176 width=26 height=24 xoffset=1 yoffset=13 xadvance=30 page=0 chnl=15 +char id=1285 x=51 y=334 width=23 height=18 xoffset=1 yoffset=19 xadvance=27 page=0 chnl=15 +char id=1286 x=318 y=65 width=19 height=30 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15 +char id=1287 x=317 y=276 width=16 height=24 xoffset=1 yoffset=19 xadvance=17 page=0 chnl=15 +char id=1288 x=376 y=149 width=30 height=24 xoffset=0 yoffset=13 xadvance=32 page=0 chnl=15 +char id=1289 x=319 y=301 width=26 height=18 xoffset=0 yoffset=19 xadvance=28 page=0 chnl=15 +char id=1290 x=87 y=181 width=28 height=24 xoffset=3 yoffset=13 xadvance=34 page=0 chnl=15 +char id=1291 x=292 y=301 width=26 height=18 xoffset=2 yoffset=19 xadvance=30 page=0 chnl=15 +char id=1292 x=120 y=206 width=23 height=24 xoffset=1 yoffset=13 xadvance=25 page=0 chnl=15 +char id=1293 x=314 y=320 width=19 height=18 xoffset=1 yoffset=19 xadvance=21 page=0 chnl=15 +char id=1294 x=400 y=199 width=21 height=24 xoffset=0 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1295 x=274 y=323 width=19 height=18 xoffset=0 yoffset=19 xadvance=22 page=0 chnl=15 +char id=1296 x=0 y=284 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=1297 x=411 y=337 width=14 height=18 xoffset=1 yoffset=19 xadvance=16 page=0 chnl=15 +char id=1298 x=137 y=66 width=23 height=30 xoffset=0 yoffset=13 xadvance=24 page=0 chnl=15 +char id=1299 x=290 y=226 width=19 height=24 xoffset=0 yoffset=19 xadvance=19 page=0 chnl=15 +char id=8192 x=82 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15 +char id=8193 x=80 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=33 page=0 chnl=15 +char id=8194 x=78 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15 +char id=8195 x=76 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=33 page=0 chnl=15 +char id=8196 x=74 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15 +char id=8197 x=93 y=66 width=1 height=1 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=8198 x=91 y=66 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8199 x=25 y=68 width=1 height=1 xoffset=0 yoffset=0 xadvance=19 page=0 chnl=15 +char id=8200 x=27 y=68 width=1 height=1 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15 +char id=8201 x=95 y=66 width=1 height=1 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=15 +char id=8202 x=86 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=15 +char id=8203 x=84 y=34 width=1 height=1 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=392 y=356 width=15 height=4 xoffset=1 yoffset=26 xadvance=17 page=0 chnl=15 +char id=8212 x=328 y=358 width=31 height=4 xoffset=1 yoffset=26 xadvance=33 page=0 chnl=15 +char id=8213 x=360 y=358 width=31 height=4 xoffset=1 yoffset=26 xadvance=33 page=0 chnl=15 +char id=8215 x=218 y=367 width=15 height=7 xoffset=-1 yoffset=37 xadvance=14 page=0 chnl=15 +char id=8216 x=184 y=367 width=6 height=9 xoffset=0 yoffset=13 xadvance=6 page=0 chnl=15 +char id=8217 x=177 y=367 width=6 height=9 xoffset=0 yoffset=13 xadvance=6 page=0 chnl=15 +char id=8218 x=204 y=367 width=6 height=8 xoffset=1 yoffset=33 xadvance=8 page=0 chnl=15 +char id=8219 x=170 y=367 width=6 height=9 xoffset=0 yoffset=13 xadvance=6 page=0 chnl=15 +char id=8220 x=139 y=371 width=12 height=9 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=8221 x=126 y=371 width=12 height=9 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15 +char id=8222 x=191 y=367 width=12 height=8 xoffset=1 yoffset=33 xadvance=14 page=0 chnl=15 +char id=8224 x=498 y=93 width=13 height=25 xoffset=2 yoffset=12 xadvance=17 page=0 chnl=15 +char id=8225 x=178 y=153 width=14 height=25 xoffset=1 yoffset=12 xadvance=17 page=0 chnl=15 +char id=8226 x=161 y=367 width=8 height=9 xoffset=2 yoffset=21 xadvance=13 page=0 chnl=15 +char id=8230 x=268 y=361 width=22 height=5 xoffset=2 yoffset=32 xadvance=26 page=0 chnl=15 +char id=8240 x=246 y=151 width=36 height=24 xoffset=1 yoffset=13 xadvance=39 page=0 chnl=15 +char id=8242 x=152 y=371 width=8 height=9 xoffset=1 yoffset=13 xadvance=8 page=0 chnl=15 +char id=8243 x=112 y=371 width=13 height=9 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15 +char id=8249 x=499 y=335 width=8 height=15 xoffset=1 yoffset=21 xadvance=10 page=0 chnl=15 +char id=8250 x=71 y=372 width=8 height=15 xoffset=1 yoffset=21 xadvance=10 page=0 chnl=15 +char id=8252 x=13 y=309 width=12 height=24 xoffset=2 yoffset=13 xadvance=16 page=0 chnl=15 +char id=8260 x=347 y=249 width=18 height=24 xoffset=-7 yoffset=13 xadvance=4 page=0 chnl=15 +char id=8355 x=126 y=281 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=8356 x=144 y=281 width=17 height=24 xoffset=1 yoffset=13 xadvance=19 page=0 chnl=15 +char id=8359 x=192 y=204 width=23 height=24 xoffset=2 yoffset=13 xadvance=26 page=0 chnl=15 +char id=8362 x=240 y=203 width=22 height=24 xoffset=2 yoffset=13 xadvance=26 page=0 chnl=15 +char id=8363 x=358 y=65 width=19 height=30 xoffset=1 yoffset=12 xadvance=20 page=0 chnl=15 +char id=8364 x=60 y=259 width=19 height=24 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15 diff --git a/project_templates/sample_scene/content/gui_content/fonts/OpenSans48_0.png b/project_templates/sample_scene/content/gui_content/fonts/OpenSans48_0.png new file mode 100644 index 00000000..17f3297c Binary files /dev/null and b/project_templates/sample_scene/content/gui_content/fonts/OpenSans48_0.png differ diff --git a/project_templates/sample_scene/content/materials/Black.nausd b/project_templates/sample_scene/content/materials/Black.nausd new file mode 100644 index 00000000..a7946900 --- /dev/null +++ b/project_templates/sample_scene/content/materials/Black.nausd @@ -0,0 +1,51 @@ +#nausd 1.0 + +def NauAssetMaterial "material_Black" +{ + string uid = "8315ca2b-4925-11f1-8ba0-d85ed3ae0e43" + + def "Common" + { + asset Texture:albedoTex = @asset:/content/textures/default_1k_grey_albedo.jpg.nausd@ + asset Texture:metalRoughnessAoTex = @asset:/content/textures/default_1k_ORM.jpg.nausd@ + asset Texture:normalTex = @asset:/content/textures/default_normal_8x8.png.nausd @ + } + + def NauMaterialPipeline "default" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferred" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferredEmissive" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.ps.psmain]"] + } + + def NauMaterialPipeline "instanced" + { + int albedoSampler = 0 + token blendMode + float4 instanceBaseID = (0, 0, 0, 0) + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } +} + diff --git a/project_templates/sample_scene/content/materials/Default.nausd b/project_templates/sample_scene/content/materials/Default.nausd new file mode 100644 index 00000000..efc9fc88 --- /dev/null +++ b/project_templates/sample_scene/content/materials/Default.nausd @@ -0,0 +1,51 @@ +#nausd 1.0 + +def NauAssetMaterial "Default" +{ + string uid = "c5f171ab-aaa1-11ef-8890-fcb0de45266c" + + def "Common" + { + asset Texture:albedoTex = @asset:/content/textures/default_1k_albedo.jpg.nausd@ + asset Texture:metalRoughnessAoTex = @asset:/content/textures/default_1k_ORM.jpg.nausd@ + asset Texture:normalTex = @asset:/content/textures/default_normal_8x8.png.nausd@ + } + + def NauMaterialPipeline "default" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferred" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferredEmissive" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.ps.psmain]"] + } + + def NauMaterialPipeline "instanced" + { + int albedoSampler = 0 + token blendMode + float4 instanceBaseID = (0, 0, 0, 0) + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } +} + diff --git a/project_templates/sample_scene/content/materials/Rusted.nausd b/project_templates/sample_scene/content/materials/Rusted.nausd new file mode 100644 index 00000000..33009f0e --- /dev/null +++ b/project_templates/sample_scene/content/materials/Rusted.nausd @@ -0,0 +1,51 @@ +#nausd 1.0 + +def NauAssetMaterial "material_Rusted" +{ + string uid = "68173227-4929-11f1-8ba0-d85ed3ae0e43" + + def "Common" + { + asset Texture:albedoTex = @asset:/content/textures/rusted_pbr/rusted_albedo_ao.png.nausd@ + asset Texture:metalRoughnessAoTex = @asset:/content/textures/rusted_pbr/rusted_metallic_roughness.png.nausd@ + asset Texture:normalTex = @asset:/content/textures/rusted_pbr/rusted_normals.png.nausd@ + } + + def NauMaterialPipeline "default" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferred" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferredEmissive" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.ps.psmain]"] + } + + def NauMaterialPipeline "instanced" + { + int albedoSampler = 0 + token blendMode + float4 instanceBaseID = (0, 0, 0, 0) + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } +} + diff --git a/project_templates/sample_scene/content/materials/White.nausd b/project_templates/sample_scene/content/materials/White.nausd new file mode 100644 index 00000000..b482ce4c --- /dev/null +++ b/project_templates/sample_scene/content/materials/White.nausd @@ -0,0 +1,51 @@ +#nausd 1.0 + +def NauAssetMaterial "material_White" +{ + string uid = "ac7fa305-4929-11f1-8ba0-d85ed3ae0e43" + + def "Common" + { + asset Texture:albedoTex = @asset:/content/textures/white_8x8.png.nausd@ + asset Texture:metalRoughnessAoTex = @asset:/content/textures/default.jpg.nausd@ + asset Texture:normalTex = @asset:/content/textures/default_normal_8x8.png.nausd@ + } + + def NauMaterialPipeline "default" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 0 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferred" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } + + def NauMaterialPipeline "deferredEmissive" + { + int albedoSampler = 0 + token blendMode + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.ps.psmain]"] + } + + def NauMaterialPipeline "instanced" + { + int albedoSampler = 0 + token blendMode + float4 instanceBaseID = (0, 0, 0, 0) + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = ["file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]"] + } +} + diff --git a/project_templates/sample_scene/content/meshes/cone.usda b/project_templates/sample_scene/content/meshes/cone.usda new file mode 100644 index 00000000..90eb77be --- /dev/null +++ b/project_templates/sample_scene/content/meshes/cone.usda @@ -0,0 +1,29 @@ +#usda 1.0 +( + defaultPrim = "Cone" + doc = "Blender v3.6.5" + metersPerUnit = 1 + upAxis = "Z" +) + +def Mesh "Cone" +{ + float3[] extent = [(-0.5, 0, -0.5), (0.5, 1, 0.5)] + int[] faceVertexCounts = [32, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 32] + int[] faceVertexIndices = [31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 33, 32, 1, 2, 34, 33, 2, 3, 35, 34, 3, 4, 36, 35, 4, 5, 37, 36, 5, 6, 38, 37, 6, 7, 39, 38, 7, 8, 40, 39, 8, 9, 41, 40, 9, 10, 42, 41, 10, 11, 43, 42, 11, 12, 44, 43, 12, 13, 45, 44, 13, 14, 46, 45, 14, 15, 47, 46, 15, 16, 48, 47, 16, 17, 49, 48, 17, 18, 50, 49, 18, 19, 51, 50, 19, 20, 52, 51, 20, 21, 53, 52, 21, 22, 54, 53, 22, 23, 55, 54, 23, 24, 56, 55, 24, 25, 57, 56, 25, 26, 58, 57, 26, 27, 59, 58, 27, 28, 60, 59, 28, 29, 61, 60, 29, 30, 62, 61, 30, 31, 63, 62, 31, 0, 32, 63, 63, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62] + point3f[] points = [(0.5, 0, 0), (0.49039263, 0, -0.09754516), (0.46193975, 0, -0.19134173), (0.4157348, 0, -0.27778512), (0.35355338, 0, -0.35355338), (0.2777851, 0, -0.41573483), (0.19134171, 0, -0.46193975), (0.09754518, 0, -0.49039263), (3.774895e-8, 0, -0.5), (-0.0975451, 0, -0.49039266), (-0.19134164, 0, -0.46193978), (-0.2777851, 0, -0.41573483), (-0.35355338, 0, -0.35355338), (-0.41573483, 0, -0.2777851), (-0.4619398, 0, -0.19134164), (-0.49039266, 0, -0.09754504), (-0.5, 0, 1.6292068e-7), (-0.4903926, 0, 0.09754536), (-0.46193966, 0, 0.19134194), (-0.41573465, 0, 0.27778536), (-0.35355318, 0, 0.35355362), (-0.27778482, 0, 0.415735), (-0.19134134, 0, 0.46193993), (-0.09754473, 0, 0.4903927), (4.827996e-7, 0, 0.5), (0.097545676, 0, 0.49039254), (0.19134223, 0, 0.46193954), (0.27778563, 0, 0.41573447), (0.35355383, 0, 0.35355294), (0.4157352, 0, 0.27778456), (0.46194005, 0, 0.19134104), (0.49039277, 0, 0.09754441), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0)] + color3f[] primvars:displayColor = [(0.21960784, 0.3372549, 0.6431373)] + float3[] primvars:normals = [(0, -1, 0), (0, -1, 0), (0, -1, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -0.99999994, 0), (0, -1, 0), (0, -1, 0), (0, -1, 0), (0.89442724, 0.44721362, -2.6450775e-7), (0.8772411, 0.4472136, -0.17449407), (0.87724096, 0.44721353, -0.17449404), (0.89442724, 0.44721356, -2.7617023e-7), (0.82634306, 0.44721356, -0.34228247), (0.826343, 0.44721356, -0.34228244), (0.74368906, 0.4472136, -0.4969171), (0.743689, 0.44721356, -0.4969171), (0.6324556, 0.44721368, -0.63245547), (0.63245547, 0.44721362, -0.63245547), (0.49691707, 0.44721362, -0.7436891), (0.496917, 0.44721356, -0.743689), (0.3422824, 0.4472136, -0.82634306), (0.34228244, 0.44721356, -0.826343), (0.17449413, 0.4472136, -0.8772411), (0.17449413, 0.44721362, -0.8772411), (6.367779e-8, 0.44721356, -0.89442724), (6.666178e-8, 0.44721353, -0.8944271), (-0.17449412, 0.4472136, -0.8772411), (-0.17449412, 0.44721356, -0.87724096), (-0.34228244, 0.4472136, -0.82634306), (-0.3422824, 0.44721362, -0.826343), (-0.49691707, 0.44721362, -0.7436891), (-0.496917, 0.44721356, -0.743689), (-0.6324556, 0.44721362, -0.6324556), (-0.63245547, 0.44721362, -0.63245547), (-0.74368906, 0.44721362, -0.4969172), (-0.743689, 0.44721362, -0.49691713), (-0.82634306, 0.44721362, -0.34228227), (-0.82634306, 0.44721362, -0.34228227), (-0.87724113, 0.44721362, -0.17449383), (-0.877241, 0.44721353, -0.17449382), (-0.8944272, 0.4472136, 2.7430434e-7), (-0.89442724, 0.44721362, 2.7617028e-7), (-0.8772409, 0.44721362, 0.17449452), (-0.8772409, 0.44721362, 0.17449452), (-0.8263429, 0.44721362, 0.3422829), (-0.82634276, 0.44721362, 0.34228286), (-0.7436888, 0.44721356, 0.49691746), (-0.74368876, 0.44721356, 0.4969175), (-0.63245517, 0.4472136, 0.63245595), (-0.6324551, 0.44721356, 0.63245595), (-0.49691656, 0.44721356, 0.7436894), (-0.49691656, 0.44721353, 0.7436893), (-0.34228173, 0.44721356, 0.82634336), (-0.34228173, 0.44721353, 0.82634324), (-0.17449328, 0.44721362, 0.87724125), (-0.17449327, 0.44721356, 0.87724113), (8.229131e-7, 0.44721362, 0.8944272), (8.237492e-7, 0.44721362, 0.8944271), (0.17449498, 0.44721362, 0.87724084), (0.17449498, 0.44721362, 0.87724084), (0.34228334, 0.4472136, 0.82634264), (0.3422833, 0.44721362, 0.8263426), (0.49691805, 0.4472136, 0.7436884), (0.496918, 0.44721356, 0.7436884), (0.63245636, 0.4472136, 0.63245475), (0.6324563, 0.44721356, 0.63245475), (0.74368966, 0.44721362, 0.4969162), (0.7436896, 0.44721356, 0.49691617), (0.82634354, 0.4472136, 0.34228122), (0.8263434, 0.44721356, 0.3422812), (0.8772412, 0.44721362, 0.17449307), (0.87724125, 0.44721356, 0.17449307), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7), (5.9790193e-7, 1, -1.0452831e-7)] ( + interpolation = "faceVarying" + ) + int[] primvars:normals:indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 33, 36, 37, 34, 36, 38, 39, 37, 38, 40, 41, 39, 40, 42, 43, 41, 42, 44, 45, 43, 44, 46, 47, 45, 46, 48, 49, 47, 48, 50, 51, 49, 50, 52, 53, 51, 52, 54, 55, 53, 54, 56, 57, 55, 56, 58, 59, 57, 58, 60, 61, 59, 60, 62, 63, 61, 62, 64, 65, 63, 64, 66, 67, 65, 66, 68, 69, 67, 68, 70, 71, 69, 70, 72, 73, 71, 72, 74, 75, 73, 74, 76, 77, 75, 76, 78, 79, 77, 78, 80, 81, 79, 80, 82, 83, 81, 82, 84, 85, 83, 84, 86, 87, 85, 86, 88, 89, 87, 88, 90, 91, 89, 90, 92, 93, 91, 92, 94, 95, 93, 94, 32, 35, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127] + texCoord2f[] primvars:st = [(1.5, 1.0006588), (1.5624999, 1.0006588), (1.625, 1.0006588), (1.6874999, 1.0006588), (1.7499999, 1.0006588), (1.8124999, 1.0006588), (1.875, 1.0006588), (1.9375, 1.0006588), (1.9999999, 1.0006588), (0.062499948, 1.0006588), (0.124999896, 1.0006588), (0.18749993, 1.0006588), (0.24999994, 1.0006588), (0.31249997, 1.0006588), (0.37500003, 1.0006588), (0.4375, 1.0006588), (0.50000006, 1.0006588), (0.5625001, 1.0006588), (0.62500006, 1.0006588), (0.6875001, 1.0006588), (0.7500001, 1.0006588), (0.8125002, 1.0006588), (0.8750002, 1.0006588), (0.9375002, 1.0006588), (1.0000002, 1.0006588), (1.0625002, 1.0006588), (1.1250002, 1.0006588), (1.1875004, 1.0006588), (1.2500004, 1.0006588), (1.3125004, 1.0006588), (1.3750004, 1.0006588), (1.4375004, 1.0006588), (1, 1.99978), (1.53125, 1.99978), (1.59375, 1.99978), (1.65625, 1.99978), (1.7187499, 1.99978), (1.7812499, 1.99978), (1.84375, 1.99978), (1.90625, 1.99978), (1.96875, 1.99978), (-1.1920929e-7, 1.0006588), (0.031249914, 1.99978), (0.093749925, 1.99978), (0.15624991, 1.99978), (0.21874994, 1.99978), (0.28124994, 1.99978), (0.34375, 1.99978), (0.40625, 1.99978), (0.46875003, 1.99978), (0.5312501, 1.99978), (0.5937501, 1.99978), (0.6562501, 1.99978), (0.7187501, 1.99978), (0.7812501, 1.99978), (0.8437502, 1.99978), (0.9062502, 1.99978), (0.9687501, 1.99978), (0.9531251, 1.99978), (1.0312502, 1.99978), (1.0937502, 1.99978), (1.1562502, 1.99978), (1.2187504, 1.99978), (1.2812504, 1.99978), (1.3437504, 1.99978), (1.4062504, 1.99978), (1.4687502, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1, 1.99978), (1.5012007, 1.0390629), (1.6862992, 1.039063), (1.7440417, 1.1143954), (1.7960088, 1.223761), (1.8402033, 1.362957), (1.874927, 1.5266347), (1.8988456, 1.7085042), (1.9110394, 1.9015756), (1.91104, 2.0984294), (1.8988472, 2.2915003), (1.8749298, 2.4733691), (1.8402069, 2.6370473), (1.7960128, 2.7762442), (1.7440457, 2.8856106), (1.6863027, 2.9609444), (1.6250029, 2.9993496), (1.5625018, 2.9993508), (1.5012013, 2.9609478), (1.4434572, 2.885616), (1.3914888, 2.7762504), (1.3472931, 2.6370535), (1.3125687, 2.4733748), (1.2886497, 2.291504), (1.2764554, 2.0984306), (1.2764546, 1.9015749), (1.2886472, 1.7085017), (1.3125647, 1.5266309), (1.347288, 1.3629516), (1.3914827, 1.2237538), (1.4434505, 1.1143867), (1.53125, 1.99978), (1.59375, 1.99978), (1.65625, 1.99978), (1.7187499, 1.99978), (1.7812499, 1.99978), (1.84375, 1.99978), (1.90625, 1.99978), (1.96875, 1.99978), (0.031249914, 1.99978), (0.093749925, 1.99978), (0.15624991, 1.99978), (0.21874994, 1.99978), (0.28124994, 1.99978), (0.34375, 1.99978), (0.40625, 1.99978), (0.46875003, 1.99978), (0.5312501, 1.99978), (0.5937501, 1.99978), (0.6562501, 1.99978), (0.7187501, 1.99978), (0.7812501, 1.99978), (0.8437502, 1.99978), (0.9062502, 1.99978), (1.0312502, 1.99978), (1.0937502, 1.99978), (1.1562502, 1.99978), (1.2187504, 1.99978), (1.2812504, 1.99978), (1.3437504, 1.99978), (1.4062504, 1.99978), (1.4687502, 1.99978)] ( + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 2, 1, 98, 0, 1, 33, 128, 1, 2, 34, 129, 2, 3, 35, 130, 3, 4, 36, 131, 4, 5, 37, 132, 5, 6, 38, 133, 6, 7, 39, 134, 7, 8, 40, 135, 41, 9, 42, 136, 9, 10, 43, 137, 10, 11, 44, 138, 11, 12, 45, 139, 12, 13, 46, 140, 13, 14, 47, 141, 14, 15, 48, 142, 15, 16, 49, 143, 16, 17, 50, 144, 17, 18, 51, 145, 18, 19, 52, 146, 19, 20, 53, 147, 20, 21, 54, 148, 21, 22, 55, 149, 22, 23, 56, 150, 23, 24, 57, 58, 24, 25, 59, 151, 25, 26, 60, 152, 26, 27, 61, 153, 27, 28, 62, 154, 28, 29, 63, 155, 29, 30, 64, 156, 30, 31, 65, 157, 31, 0, 66, 158, 32, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97] + uniform token subdivisionScheme = "none" + uniform token subsetFamily:materialBind:familyType = "partition" + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 0, -1, 0), (0, 1, 0, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} + diff --git a/project_templates/sample_scene/content/meshes/cube.usda b/project_templates/sample_scene/content/meshes/cube.usda new file mode 100644 index 00000000..48dda287 --- /dev/null +++ b/project_templates/sample_scene/content/meshes/cube.usda @@ -0,0 +1,29 @@ +#usda 1.0 +( + defaultPrim = "Cube" + metersPerUnit = 1 + upAxis = "Y" +) + + + def Mesh "Cube" + { + float3[] extent = [(-0.5, 0, -0.5), (0.5, 1, 0.5)] + int[] faceVertexCounts = [4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + int[] faceVertexIndices = [104, 105, 106, 107, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8, 2, 2, 8, 9, 2, 9, 10, 2, 10, 11, 2, 11, 12, 3, 3, 12, 13, 3, 13, 14, 3, 14, 15, 3, 15, 16, 1, 1, 16, 17, 1, 17, 18, 1, 18, 19, 1, 19, 4, 0, 4, 20, 21, 5, 5, 21, 22, 6, 6, 22, 23, 7, 7, 23, 24, 8, 8, 24, 25, 9, 9, 25, 26, 10, 10, 26, 27, 11, 11, 27, 28, 12, 12, 28, 29, 13, 13, 29, 30, 14, 14, 30, 31, 15, 15, 31, 32, 16, 16, 32, 33, 17, 17, 33, 34, 18, 18, 34, 35, 19, 19, 35, 20, 4, 20, 36, 37, 21, 21, 37, 38, 22, 22, 38, 39, 23, 23, 39, 40, 24, 24, 40, 41, 25, 25, 41, 42, 26, 26, 42, 43, 27, 27, 43, 44, 28, 28, 44, 45, 29, 29, 45, 46, 30, 30, 46, 47, 31, 31, 47, 48, 32, 32, 48, 49, 33, 33, 49, 50, 34, 34, 50, 51, 35, 35, 51, 36, 20, 36, 52, 53, 37, 37, 53, 54, 38, 38, 54, 55, 39, 109, 110, 111, 108, 40, 56, 57, 41, 41, 57, 58, 42, 42, 58, 59, 43, 113, 114, 115, 112, 44, 60, 61, 45, 45, 61, 62, 46, 46, 62, 63, 47, 117, 118, 119, 116, 48, 64, 65, 49, 49, 65, 66, 50, 50, 66, 67, 51, 121, 122, 123, 120, 52, 68, 69, 53, 53, 69, 70, 54, 54, 70, 71, 55, 55, 71, 72, 56, 56, 72, 73, 57, 57, 73, 74, 58, 58, 74, 75, 59, 59, 75, 76, 60, 60, 76, 77, 61, 61, 77, 78, 62, 62, 78, 79, 63, 63, 79, 80, 64, 64, 80, 81, 65, 65, 81, 82, 66, 66, 82, 83, 67, 67, 83, 68, 52, 68, 84, 85, 69, 69, 85, 86, 70, 70, 86, 87, 71, 71, 87, 88, 72, 72, 88, 89, 73, 73, 89, 90, 74, 74, 90, 91, 75, 75, 91, 92, 76, 76, 92, 93, 77, 77, 93, 94, 78, 78, 94, 95, 79, 79, 95, 96, 80, 80, 96, 97, 81, 81, 97, 98, 82, 82, 98, 99, 83, 83, 99, 84, 68, 84, 103, 85, 85, 103, 86, 86, 103, 87, 87, 103, 101, 88, 88, 101, 89, 89, 101, 90, 90, 101, 91, 91, 101, 100, 92, 92, 100, 93, 93, 100, 94, 94, 100, 95, 95, 100, 102, 96, 96, 102, 97, 97, 102, 98, 98, 102, 99, 99, 102, 103, 84, 126, 127, 124, 125, 0, 2, 105, 104, 2, 3, 106, 105, 3, 1, 107, 106, 1, 0, 104, 107, 40, 39, 109, 108, 39, 55, 110, 109, 55, 56, 111, 110, 56, 40, 108, 111, 44, 43, 113, 112, 43, 59, 114, 113, 59, 60, 115, 114, 60, 44, 112, 115, 48, 47, 117, 116, 47, 63, 118, 117, 63, 64, 119, 118, 64, 48, 116, 119, 36, 51, 121, 120, 51, 67, 122, 121, 67, 52, 123, 122, 52, 36, 120, 123, 101, 103, 125, 124, 103, 102, 126, 125, 102, 100, 127, 126, 100, 101, 124, 127] + point3f[] points = [(-0.47486922, 1, -0.47486925), (0.47486922, 1, -0.47486925), (-0.47486922, 1, 0.47486925), (0.47486922, 1, 0.47486925), (-0.47486922, 0.9966331, -0.48743457), (-0.4811519, 0.99663305, -0.4857512), (-0.48575118, 0.9966332, -0.48115188), (-0.48743463, 0.9966332, -0.4748692), (-0.48743463, 0.99663305, 0.4748692), (-0.48575118, 0.99663305, 0.48115188), (-0.4811519, 0.9966332, 0.4857512), (-0.47486922, 0.99663305, 0.48743463), (0.47486922, 0.99663305, 0.48743463), (0.4811519, 0.9966332, 0.4857512), (0.48575118, 0.99663305, 0.48115188), (0.48743463, 0.99663305, 0.4748692), (0.48743463, 0.9966332, -0.4748692), (0.48575118, 0.9966332, -0.48115188), (0.4811519, 0.99663305, -0.4857512), (0.47486922, 0.9966331, -0.48743457), (-0.47486922, 0.9874346, -0.49663305), (-0.48575118, 0.9874346, -0.4937173), (-0.4937173, 0.9874346, -0.48575115), (-0.4966331, 0.9874346, -0.47486925), (-0.4966331, 0.9874346, 0.47486925), (-0.4937173, 0.9874346, 0.48575115), (-0.48575118, 0.9874346, 0.4937173), (-0.47486922, 0.98743457, 0.4966331), (0.47486922, 0.98743457, 0.4966331), (0.48575118, 0.9874346, 0.4937173), (0.4937173, 0.9874346, 0.48575115), (0.4966331, 0.9874346, 0.47486925), (0.4966331, 0.9874346, -0.47486925), (0.4937173, 0.9874346, -0.48575115), (0.48575118, 0.9874346, -0.4937173), (0.47486922, 0.9874346, -0.49663305), (-0.47486922, 0.97486925, -0.5), (-0.48743463, 0.97486925, -0.49663305), (-0.4966331, 0.97486925, -0.48743463), (-0.5, 0.97486925, -0.47486925), (-0.5, 0.97486925, 0.47486925), (-0.4966331, 0.97486925, 0.48743463), (-0.48743463, 0.9748692, 0.4966331), (-0.47486922, 0.97486925, 0.5), (0.47486922, 0.97486925, 0.5), (0.48743463, 0.9748692, 0.4966331), (0.4966331, 0.97486925, 0.48743463), (0.5, 0.97486925, 0.47486925), (0.5, 0.97486925, -0.47486925), (0.4966331, 0.97486925, -0.48743463), (0.48743463, 0.97486925, -0.49663305), (0.47486922, 0.97486925, -0.5), (-0.47486922, 0.025130779, -0.49999997), (-0.48743463, 0.025130779, -0.49663314), (-0.4966331, 0.025130779, -0.4874346), (-0.5, 0.025130779, -0.47486922), (-0.5, 0.025130779, 0.47486922), (-0.4966331, 0.025130749, 0.48743463), (-0.48743463, 0.025130808, 0.4966331), (-0.47486922, 0.025130749, 0.5), (0.47486922, 0.025130749, 0.5), (0.48743463, 0.025130808, 0.4966331), (0.4966331, 0.025130749, 0.48743463), (0.5, 0.025130779, 0.47486922), (0.5, 0.025130779, -0.47486922), (0.4966331, 0.025130779, -0.4874346), (0.48743463, 0.025130779, -0.49663314), (0.47486922, 0.025130779, -0.49999997), (-0.47486922, 0.012565404, -0.49663314), (-0.48575118, 0.012565404, -0.49371728), (-0.4937173, 0.012565404, -0.48575118), (-0.4966331, 0.012565404, -0.47486922), (-0.4966331, 0.012565404, 0.47486922), (-0.4937173, 0.012565404, 0.48575118), (-0.48575118, 0.012565374, 0.4937173), (-0.47486922, 0.012565434, 0.4966331), (0.47486922, 0.012565434, 0.4966331), (0.48575118, 0.012565374, 0.4937173), (0.4937173, 0.012565404, 0.48575118), (0.4966331, 0.012565404, 0.47486922), (0.4966331, 0.012565404, -0.47486922), (0.4937173, 0.012565404, -0.48575118), (0.48575118, 0.012565404, -0.49371728), (0.47486922, 0.012565404, -0.49663314), (-0.47486922, 0.0033668876, -0.48743463), (-0.4811519, 0.0033668876, -0.48575118), (-0.48575118, 0.0033668876, -0.4811519), (-0.48743463, 0.0033668876, -0.47486922), (-0.48743463, 0.0033668876, 0.47486922), (-0.48575118, 0.0033668876, 0.4811519), (-0.4811519, 0.0033668876, 0.48575118), (-0.47486922, 0.0033668876, 0.48743463), (0.47486922, 0.0033668876, 0.48743463), (0.4811519, 0.0033668876, 0.48575118), (0.48575118, 0.0033668876, 0.4811519), (0.48743463, 0.0033668876, 0.47486922), (0.48743463, 0.0033668876, -0.47486922), (0.48575118, 0.0033668876, -0.4811519), (0.4811519, 0.0033668876, -0.48575118), (0.47486922, 0.0033668876, -0.48743463), (0.47486922, 0, 0.47486922), (-0.47486922, 0, 0.47486922), (0.47486922, 0, -0.47486922), (-0.47486922, 0, -0.47486922), (-0.46486923, 1, -0.46486926), (-0.46486923, 1, 0.46486926), (0.46486923, 1, 0.46486926), (0.46486923, 1, -0.46486926), (-0.5, 0.96486926, 0.46486926), (-0.5, 0.96486926, -0.46486926), (-0.5, 0.03513077, -0.46486923), (-0.5, 0.03513077, 0.46486923), (0.46486923, 0.96486926, 0.5), (-0.46486923, 0.96486926, 0.5), (-0.46486923, 0.0351308, 0.5), (0.46486923, 0.0351308, 0.5), (0.5, 0.96486926, -0.46486926), (0.5, 0.96486926, 0.46486926), (0.5, 0.03513077, 0.46486923), (0.5, 0.03513077, -0.46486923), (-0.46486923, 0.96486926, -0.5), (0.46486923, 0.96486926, -0.5), (0.46486923, 0.03513077, -0.5), (-0.46486923, 0.03513077, -0.5), (-0.46486923, 0, 0.46486923), (-0.46486923, 0, -0.46486923), (0.46486923, 0, -0.46486923), (0.46486923, 0, 0.46486923)] + color3f[] primvars:displayColor = [(0.27450982, 0.13333334, 0.62352943)] + float3[] primvars:normals = [(-0.10872859, 0.9881071, -0.1087309), (0.10872859, 0.9881071, -0.1087309), (-0.108729385, 0.9881071, 0.10873023), (0.108729385, 0.98810714, 0.10873023), (-0.06981154, 0.8549297, -0.51402485), (-0.26544783, 0.8474327, -0.45977756), (-0.45976907, 0.84743583, -0.26545194), (-0.5140251, 0.8549295, -0.06981149), (-0.5140252, 0.8549295, 0.069811665), (-0.4597769, 0.8474339, 0.26544517), (-0.2654481, 0.8474363, 0.45977077), (-0.06980558, 0.8549279, 0.51402885), (0.06980559, 0.8549279, 0.51402885), (0.26544815, 0.8474363, 0.45977077), (0.4597769, 0.8474339, 0.2654452), (0.5140252, 0.8549295, 0.069811665), (0.5140251, 0.8549295, -0.06981149), (0.45976907, 0.84743583, -0.26545194), (0.26544783, 0.8474327, -0.45977753), (0.06981153, 0.8549297, -0.5140248), (-0.11292031, 0.48833364, -0.86532027), (-0.43799007, 0.4823416, -0.75862455), (-0.75862354, 0.48234135, -0.43799224), (-0.86532116, 0.48833185, -0.112921745), (-0.86532044, 0.48833308, 0.11292152), (-0.758624, 0.48234248, 0.43799), (-0.4379911, 0.48234215, 0.75862354), (-0.1129194, 0.48833174, 0.8653216), (0.11291941, 0.48833174, 0.8653216), (0.4379911, 0.48234215, 0.75862354), (0.758624, 0.48234254, 0.43798998), (0.86532044, 0.48833308, 0.11292152), (0.86532116, 0.48833185, -0.112921745), (0.75862354, 0.48234135, -0.43799224), (0.43799007, 0.4823416, -0.75862455), (0.1129203, 0.48833364, -0.86532027), (-0.12814826, 0.12814946, -0.9834409), (-0.4958982, 0.1278263, -0.8589212), (-0.8589207, 0.12782624, -0.49589875), (-0.9834409, 0.12814845, -0.12814845), (-0.9834409, 0.12814845, 0.12814838), (-0.8589209, 0.1278267, 0.49589851), (-0.49589822, 0.12782608, 0.8589211), (-0.12814805, 0.12814885, 0.9834409), (0.12814805, 0.12814885, 0.9834409), (0.49589822, 0.12782608, 0.8589211), (0.8589209, 0.1278267, 0.4958985), (0.9834409, 0.12814845, 0.12814838), (0.9834409, 0.12814845, -0.12814845), (0.8589207, 0.12782626, -0.4958988), (0.4958982, 0.1278263, -0.8589212), (0.12814826, 0.12814946, -0.9834409), (-0.1281483, -0.12814766, -0.98344105), (-0.49589816, -0.1278265, -0.85892105), (-0.85892123, -0.12782654, -0.49589804), (-0.9834409, -0.1281483, -0.1281483), (-0.98344094, -0.12814835, 0.12814808), (-0.85892105, -0.12782669, 0.49589822), (-0.4958981, -0.12782593, 0.8589211), (-0.12814805, -0.12814885, 0.9834409), (0.12814805, -0.12814885, 0.9834409), (0.49589813, -0.12782596, 0.85892123), (0.85892105, -0.12782669, 0.49589822), (0.9834409, -0.12814835, 0.12814808), (0.98344094, -0.1281483, -0.1281483), (0.85892123, -0.12782654, -0.495898), (0.49589816, -0.1278265, -0.85892105), (0.1281483, -0.12814766, -0.98344094), (-0.11292171, -0.488331, -0.8653216), (-0.43799213, -0.48234153, -0.7586234), (-0.75862396, -0.48234126, -0.43799168), (-0.8653213, -0.48833165, -0.11292126), (-0.8653212, -0.48833176, 0.112921074), (-0.75862414, -0.48234132, 0.43799126), (-0.43799096, -0.48234197, 0.7586237), (-0.1129207, -0.48833126, 0.86532164), (0.1129207, -0.48833126, 0.86532164), (0.43799096, -0.48234197, 0.7586237), (0.75862414, -0.48234132, 0.43799126), (0.8653212, -0.48833176, 0.112921074), (0.8653213, -0.48833165, -0.11292125), (0.7586239, -0.48234132, -0.4379917), (0.43799216, -0.4823416, -0.7586235), (0.11292171, -0.488331, -0.8653216), (-0.06981236, -0.85492927, -0.5140255), (-0.26545027, -0.8474341, -0.45977318), (-0.45977303, -0.8474343, -0.26545012), (-0.514026, -0.854929, -0.06981169), (-0.514026, -0.854929, 0.06981169), (-0.45977318, -0.84743446, 0.2654494), (-0.26544932, -0.8474346, 0.45977297), (-0.06981104, -0.85492873, 0.5140265), (0.069811024, -0.85492873, 0.5140265), (0.2654493, -0.8474346, 0.45977297), (0.45977318, -0.84743446, 0.2654494), (0.514026, -0.854929, 0.06981169), (0.514026, -0.854929, -0.06981169), (0.45977303, -0.84743434, -0.26545015), (0.26545027, -0.8474341, -0.45977318), (0.06981236, -0.85492927, -0.5140255), (0.10872937, -0.98810726, 0.10872937), (-0.10872937, -0.98810726, 0.10872937), (0.10872937, -0.98810726, -0.10872937), (-0.10872937, -0.98810726, -0.10872937), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (-1, 0, 0), (-1, 0, 0), (-1, 0, 0), (-1, 0, 0), (0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 0, 1), (1, 0, 0), (1, 0, 0), (1, 0, 0), (1, 0, 0), (-5.5879406e-7, -5.9462657e-9, -1), (5.5879406e-7, -5.9462657e-9, -1), (5.5879406e-7, -0.0000011235346, -1), (-5.5879406e-7, -0.0000011235346, -1), (0, -1, 0), (0, -1, 0), (0, -1, 0), (0, -1, 0)] ( + interpolation = "vertex" + ) + texCoord2f[] primvars:st = [(0.025131017, 0.97486925), (0.97486925, 0.974869), (0.025130779, 0.025131017), (0.974869, 0.025130779), (0.025131017, 0.9874346), (0.01884833, 0.98575115), (0.014249057, 0.98115194), (0.012565613, 0.97486925), (0.012565374, 0.025131017), (0.014248818, 0.01884833), (0.018848091, 0.014249057), (0.025130779, 0.012565613), (0.974869, 0.012565374), (0.9811517, 0.014248818), (0.9857509, 0.018848091), (0.9874344, 0.025130779), (0.9874346, 0.974869), (0.98575115, 0.9811517), (0.98115194, 0.9857509), (0.97486925, 0.9874344), (0.025131017, 0.9966331), (0.014249057, 0.9937173), (0.0062829256, 0.98575115), (0.003367126, 0.97486925), (0.0033668876, 0.025131017), (0.006282687, 0.014249057), (0.014248818, 0.0062829256), (0.025130779, 0.003367126), (0.974869, 0.0033668876), (0.9857509, 0.006282687), (0.9937171, 0.014248818), (0.9966329, 0.025130779), (0.9966331, 0.974869), (0.9937173, 0.9857509), (0.98575115, 0.9937171), (0.97486925, 0.9966329), (0.974869, 0.97486925), (0.9874344, 0.97486925), (0.9966329, 0.97486925), (0.025130749, 0.97486925), (0.974869, 0.97486925), (0.9874344, 0.97486925), (0.9966329, 0.97486925), (0.025130779, 0.97486925), (0.974869, 0.97486925), (0.9874344, 0.97486925), (0.9966329, 0.97486925), (0.025130779, 0.97486925), (0.974869, 0.97486925), (0.9874344, 0.97486925), (0.9966329, 0.97486925), (0.025130749, 0.97486925), (0.974869, 0.025130779), (0.9874344, 0.025130779), (0.9966329, 0.025130779), (0.025130749, 0.025130779), (0.974869, 0.025130779), (0.9874344, 0.025130779), (0.9966329, 0.025130779), (0.025130779, 0.025130779), (0.974869, 0.025130779), (0.9874344, 0.025130779), (0.9966329, 0.025130779), (0.025130779, 0.025130779), (0.974869, 0.025130779), (0.9874344, 0.025130779), (0.9966329, 0.025130779), (0.025130749, 0.025130779), (0.974869, 0.012565404), (0.9857509, 0.012565404), (0.9937171, 0.012565404), (0.025130749, 0.012565404), (0.974869, 0.012565404), (0.9857509, 0.012565404), (0.9937171, 0.012565404), (0.025130779, 0.012565404), (0.974869, 0.012565404), (0.9857509, 0.012565404), (0.9937171, 0.012565404), (0.025130779, 0.012565404), (0.974869, 0.012565404), (0.9857509, 0.012565404), (0.9937171, 0.012565404), (0.025130749, 0.012565404), (0.974869, 0.0033668876), (0.9811517, 0.0033668876), (0.9857509, 0.98115194), (0.025130749, 0.0033668876), (0.974869, 0.0033668876), (0.9811517, 0.0033668876), (0.98115194, 0.014249057), (0.025130779, 0.0033668876), (0.974869, 0.0033668876), (0.9811517, 0.0033668876), (0.014249086, 0.018848091), (0.025130779, 0.0033668876), (0.974869, 0.0033668876), (0.9811517, 0.0033668876), (0.018848062, 0.9857509), (0.025130749, 0.0033668876), (0.025130987, 0.025130779), (0.97486925, 0.025131017), (0.025130749, 0.974869), (0.974869, 0.97486925), (0.035131007, 0.96486926), (0.03513077, 0.035131007), (0.964869, 0.03513077), (0.96486926, 0.964869), (0.964869, 0.96486926), (0.03513074, 0.96486926), (0.03513074, 0.03513077), (0.964869, 0.03513077), (0.964869, 0.96486926), (0.03513077, 0.96486926), (0.03513077, 0.03513077), (0.964869, 0.03513077), (0.964869, 0.96486926), (0.03513077, 0.96486926), (0.03513077, 0.03513077), (0.964869, 0.03513077), (0.964869, 0.96486926), (0.03513074, 0.96486926), (0.03513074, 0.03513077), (0.964869, 0.03513077), (0.96486926, 0.035131007), (0.964869, 0.96486926), (0.03513074, 0.964869), (0.035130978, 0.03513077), (0.974869, 0.9874346), (0.9857509, 0.9874346), (0.9857509, 0.9874346), (0.9937171, 0.9874346), (0.014248848, 0.9874346), (0.012565374, 0.97486925), (0.025130749, 0.9874346), (0.025130749, 0.9874346), (0.974869, 0.9874346), (0.974869, 0.9874346), (0.9857509, 0.9874346), (0.9857509, 0.9874346), (0.9937171, 0.9874346), (0.014248818, 0.9874346), (0.012565374, 0.97486925), (0.025130779, 0.9874346), (0.025130779, 0.9874346), (0.974869, 0.9874346), (0.974869, 0.9874346), (0.9857509, 0.9874346), (0.9857509, 0.9874346), (0.9937171, 0.9874346), (0.014248818, 0.9874346), (0.012565374, 0.97486925), (0.025130779, 0.9874346), (0.025130779, 0.9874346), (0.974869, 0.9874346), (0.974869, 0.9874346), (0.9857509, 0.9874346), (0.9857509, 0.9874346), (0.9937171, 0.9874346), (0.014248848, 0.9874346), (0.012565374, 0.97486925), (0.025130749, 0.9874346), (0.025130749, 0.9874346), (0.974869, 0.9874346), (0.012565374, 0.97486925), (0.012565374, 0.025130779), (0.012565374, 0.97486925), (0.012565374, 0.025130779), (0.012565374, 0.97486925), (0.012565374, 0.025130779), (0.012565374, 0.97486925), (0.012565374, 0.025130779), (0.012565374, 0.025130779), (0.014248848, 0.012565404), (0.012565374, 0.025130779), (0.014248818, 0.012565404), (0.012565374, 0.025130779), (0.014248818, 0.012565404), (0.012565374, 0.025130779), (0.014248848, 0.012565404), (0.9857509, 0.9937173), (0.9811517, 0.98575115), (0.9937171, 0.98575115), (0.014248848, 0.012565404), (0.018848062, 0.0033668876), (0.9937173, 0.014249057), (0.98575115, 0.01884833), (0.98575115, 0.0062829256), (0.014248818, 0.012565404), (0.018848091, 0.0033668876), (0.014249086, 0.006282687), (0.0188483, 0.014248818), (0.0062829256, 0.014248818), (0.014248818, 0.012565404), (0.018848091, 0.0033668876), (0.006282687, 0.9857509), (0.014248848, 0.9811517), (0.014248848, 0.9937171), (0.014248848, 0.012565404), (0.018848062, 0.0033668876), (0.974869, 0.9874346), (0.9811517, 0.98575115), (0.9811517, 0.98575115), (0.9874344, 0.97486925), (0.9874344, 0.97486925), (0.9874346, 0.025131017), (0.9874346, 0.025131017), (0.98575115, 0.01884833), (0.98575115, 0.01884833), (0.97486925, 0.012565613), (0.97486925, 0.012565613), (0.025130987, 0.012565374), (0.025130987, 0.012565374), (0.0188483, 0.014248818), (0.0188483, 0.014248818), (0.012565613, 0.025130779), (0.012565613, 0.025130779), (0.012565374, 0.974869), (0.012565374, 0.974869), (0.014248848, 0.9811517), (0.014248848, 0.9811517), (0.025130749, 0.9874344), (0.025130749, 0.9874344), (0.974869, 0.9874346)] ( + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [104, 105, 106, 107, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8, 2, 2, 8, 9, 2, 9, 10, 2, 10, 11, 2, 11, 12, 3, 3, 12, 13, 3, 13, 14, 3, 14, 15, 3, 15, 16, 1, 1, 16, 17, 1, 17, 18, 1, 18, 19, 1, 19, 4, 0, 4, 20, 21, 5, 5, 21, 22, 6, 6, 22, 23, 7, 7, 23, 24, 8, 8, 24, 25, 9, 9, 25, 26, 10, 10, 26, 27, 11, 11, 27, 28, 12, 12, 28, 29, 13, 13, 29, 30, 14, 14, 30, 31, 15, 15, 31, 32, 16, 16, 32, 33, 17, 17, 33, 34, 18, 18, 34, 35, 19, 19, 35, 20, 4, 128, 36, 37, 129, 130, 37, 38, 131, 132, 133, 39, 134, 135, 39, 40, 136, 137, 40, 41, 138, 139, 41, 42, 140, 141, 142, 43, 143, 144, 43, 44, 145, 146, 44, 45, 147, 148, 45, 46, 149, 150, 151, 47, 152, 153, 47, 48, 154, 155, 48, 49, 156, 157, 49, 50, 158, 159, 160, 51, 161, 162, 51, 36, 163, 36, 52, 53, 37, 37, 53, 54, 38, 164, 165, 55, 39, 109, 110, 111, 108, 40, 56, 57, 41, 41, 57, 58, 42, 166, 167, 59, 43, 113, 114, 115, 112, 44, 60, 61, 45, 45, 61, 62, 46, 168, 169, 63, 47, 117, 118, 119, 116, 48, 64, 65, 49, 49, 65, 66, 50, 170, 171, 67, 51, 121, 122, 123, 120, 52, 68, 69, 53, 53, 69, 70, 54, 172, 173, 71, 55, 55, 71, 72, 56, 56, 72, 73, 57, 57, 73, 74, 58, 174, 175, 75, 59, 59, 75, 76, 60, 60, 76, 77, 61, 61, 77, 78, 62, 176, 177, 79, 63, 63, 79, 80, 64, 64, 80, 81, 65, 65, 81, 82, 66, 178, 179, 83, 67, 67, 83, 68, 52, 68, 84, 85, 69, 180, 181, 86, 182, 183, 184, 87, 71, 71, 87, 88, 72, 72, 88, 89, 73, 185, 186, 90, 187, 188, 189, 91, 75, 75, 91, 92, 76, 76, 92, 93, 77, 190, 191, 94, 192, 193, 194, 95, 79, 79, 95, 96, 80, 80, 96, 97, 81, 195, 196, 98, 197, 198, 199, 99, 83, 83, 99, 84, 68, 200, 103, 201, 202, 103, 86, 86, 103, 203, 204, 103, 101, 205, 206, 101, 207, 208, 101, 90, 90, 101, 209, 210, 101, 100, 211, 212, 100, 213, 214, 100, 94, 94, 100, 215, 216, 100, 102, 217, 218, 102, 219, 220, 102, 98, 98, 102, 221, 222, 102, 103, 223, 126, 127, 124, 125, 0, 2, 105, 104, 2, 3, 106, 105, 3, 1, 107, 106, 1, 0, 104, 107, 40, 39, 109, 108, 39, 55, 110, 109, 55, 56, 111, 110, 56, 40, 108, 111, 44, 43, 113, 112, 43, 59, 114, 113, 59, 60, 115, 114, 60, 44, 112, 115, 48, 47, 117, 116, 47, 63, 118, 117, 63, 64, 119, 118, 64, 48, 116, 119, 36, 51, 121, 120, 51, 67, 122, 121, 67, 52, 123, 122, 52, 36, 120, 123, 101, 103, 125, 124, 103, 102, 126, 125, 102, 100, 127, 126, 100, 101, 124, 127] + uniform token subdivisionScheme = "none" + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 0, -1, 0), (0, 1, 0, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + + } + + diff --git a/project_templates/sample_scene/content/meshes/itmo.usd b/project_templates/sample_scene/content/meshes/itmo.usd new file mode 100644 index 00000000..8374b3e0 Binary files /dev/null and b/project_templates/sample_scene/content/meshes/itmo.usd differ diff --git a/project_templates/sample_scene/content/meshes/plane.usda b/project_templates/sample_scene/content/meshes/plane.usda new file mode 100644 index 00000000..7ecb3296 --- /dev/null +++ b/project_templates/sample_scene/content/meshes/plane.usda @@ -0,0 +1,25 @@ +#usda 1.0 +( + defaultPrim = "Plane" + doc = "Blender v3.6.5" + metersPerUnit = 1 + upAxis = "Z" +) + +def Mesh "Plane" +{ + float3[] extent = [(-2.5, 0, -2.5), (2.5, 0.0001, 2.5)] + int[] faceVertexCounts = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + int[] faceVertexIndices = [5, 0, 1, 6, 6, 1, 2, 7, 7, 2, 3, 8, 8, 3, 4, 9, 10, 5, 6, 11, 11, 6, 7, 12, 12, 7, 8, 13, 13, 8, 9, 14, 15, 10, 11, 16, 16, 11, 12, 17, 17, 12, 13, 18, 18, 13, 14, 19, 20, 15, 16, 21, 21, 16, 17, 22, 22, 17, 18, 23, 23, 18, 19, 24] + point3f[] points = [(-2.5, 0, 2.5), (-1.25, 0, 2.5), (0, 0, 2.5), (1.25, 0, 2.5), (2.5, 0, 2.5), (-2.5, 0, 1.25), (-1.25, 0, 1.25), (0, 0, 1.25), (1.25, 0, 1.25), (2.5, 0, 1.25), (-2.5, 0, 0), (-1.25, 0, 0), (0, 0, 0), (1.25, 0, 0), (2.5, 0, 0), (-2.5, 0, -1.25), (-1.25, 0, -1.25), (0, 0, -1.25), (1.25, 0, -1.25), (2.5, 0, -1.25), (-2.5, 0, -2.5), (-1.25, 0, -2.5), (0, 0, -2.5), (1.25, 0, -2.5), (2.5, 0, -2.5)] + color3f[] primvars:displayColor = [(0.61960787, 0.60784316, 0.85882354)] + float3[] primvars:normals = [(0, 1, 0)] ( + interpolation = "constant" + ) + texCoord2f[] primvars:st = [(0, 0), (0.25, 0), (0.5, 0), (0.75, 0), (1, 0), (0, 0.25), (0.25, 0.25), (0.5, 0.25), (0.75, 0.25), (1, 0.25), (0, 0.5), (0.25, 0.5), (0.5, 0.5), (0.75, 0.5), (1, 0.5), (0, 0.75), (0.25, 0.75), (0.5, 0.75), (0.75, 0.75), (1, 0.75), (0, 1), (0.25, 1), (0.5, 1), (0.75, 1), (1, 1)] ( + interpolation = "vertex" + ) + uniform token subdivisionScheme = "none" + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 0, -1, 0), (0, 1, 0, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} diff --git a/project_templates/sample_scene/content/meshes/sphere.usda b/project_templates/sample_scene/content/meshes/sphere.usda new file mode 100644 index 00000000..fe784c5c --- /dev/null +++ b/project_templates/sample_scene/content/meshes/sphere.usda @@ -0,0 +1,29 @@ +#usda 1.0 +( + defaultPrim = "Sphere" + doc = "Blender v3.6.5" + metersPerUnit = 1 + upAxis = "Z" +) + +def Mesh "Sphere" +{ + + float3[] extent = [(-0.5, -0.5, -0.5), (0.5, 0.5, 0.5)] + int[] faceVertexCounts = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + int[] faceVertexIndices = [0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8, 0, 8, 9, 0, 9, 10, 0, 10, 11, 0, 11, 12, 0, 12, 13, 0, 13, 14, 0, 14, 15, 0, 15, 16, 0, 16, 17, 0, 17, 18, 0, 18, 19, 0, 19, 20, 0, 20, 21, 0, 21, 22, 0, 22, 23, 0, 23, 24, 0, 24, 25, 0, 25, 26, 0, 26, 27, 0, 27, 28, 0, 28, 29, 0, 29, 30, 0, 30, 31, 0, 31, 32, 0, 32, 1, 1, 33, 34, 2, 2, 34, 35, 3, 3, 35, 36, 4, 4, 36, 37, 5, 5, 37, 38, 6, 6, 38, 39, 7, 7, 39, 40, 8, 8, 40, 41, 9, 9, 41, 42, 10, 10, 42, 43, 11, 11, 43, 44, 12, 12, 44, 45, 13, 13, 45, 46, 14, 14, 46, 47, 15, 15, 47, 48, 16, 16, 48, 49, 17, 17, 49, 50, 18, 18, 50, 51, 19, 19, 51, 52, 20, 20, 52, 53, 21, 21, 53, 54, 22, 22, 54, 55, 23, 23, 55, 56, 24, 24, 56, 57, 25, 25, 57, 58, 26, 26, 58, 59, 27, 27, 59, 60, 28, 28, 60, 61, 29, 29, 61, 62, 30, 30, 62, 63, 31, 31, 63, 64, 32, 32, 64, 33, 1, 33, 65, 66, 34, 34, 66, 67, 35, 35, 67, 68, 36, 36, 68, 69, 37, 37, 69, 70, 38, 38, 70, 71, 39, 39, 71, 72, 40, 40, 72, 73, 41, 41, 73, 74, 42, 42, 74, 75, 43, 43, 75, 76, 44, 44, 76, 77, 45, 45, 77, 78, 46, 46, 78, 79, 47, 47, 79, 80, 48, 48, 80, 81, 49, 49, 81, 82, 50, 50, 82, 83, 51, 51, 83, 84, 52, 52, 84, 85, 53, 53, 85, 86, 54, 54, 86, 87, 55, 55, 87, 88, 56, 56, 88, 89, 57, 57, 89, 90, 58, 58, 90, 91, 59, 59, 91, 92, 60, 60, 92, 93, 61, 61, 93, 94, 62, 62, 94, 95, 63, 63, 95, 96, 64, 64, 96, 65, 33, 65, 97, 98, 66, 66, 98, 99, 67, 67, 99, 100, 68, 68, 100, 101, 69, 69, 101, 102, 70, 70, 102, 103, 71, 71, 103, 104, 72, 72, 104, 105, 73, 73, 105, 106, 74, 74, 106, 107, 75, 75, 107, 108, 76, 76, 108, 109, 77, 77, 109, 110, 78, 78, 110, 111, 79, 79, 111, 112, 80, 80, 112, 113, 81, 81, 113, 114, 82, 82, 114, 115, 83, 83, 115, 116, 84, 84, 116, 117, 85, 85, 117, 118, 86, 86, 118, 119, 87, 87, 119, 120, 88, 88, 120, 121, 89, 89, 121, 122, 90, 90, 122, 123, 91, 91, 123, 124, 92, 92, 124, 125, 93, 93, 125, 126, 94, 94, 126, 127, 95, 95, 127, 128, 96, 96, 128, 97, 65, 97, 129, 130, 98, 98, 130, 131, 99, 99, 131, 132, 100, 100, 132, 133, 101, 101, 133, 134, 102, 102, 134, 135, 103, 103, 135, 136, 104, 104, 136, 137, 105, 105, 137, 138, 106, 106, 138, 139, 107, 107, 139, 140, 108, 108, 140, 141, 109, 109, 141, 142, 110, 110, 142, 143, 111, 111, 143, 144, 112, 112, 144, 145, 113, 113, 145, 146, 114, 114, 146, 147, 115, 115, 147, 148, 116, 116, 148, 149, 117, 117, 149, 150, 118, 118, 150, 151, 119, 119, 151, 152, 120, 120, 152, 153, 121, 121, 153, 154, 122, 122, 154, 155, 123, 123, 155, 156, 124, 124, 156, 157, 125, 125, 157, 158, 126, 126, 158, 159, 127, 127, 159, 160, 128, 128, 160, 129, 97, 129, 161, 162, 130, 130, 162, 163, 131, 131, 163, 164, 132, 132, 164, 165, 133, 133, 165, 166, 134, 134, 166, 167, 135, 135, 167, 168, 136, 136, 168, 169, 137, 137, 169, 170, 138, 138, 170, 171, 139, 139, 171, 172, 140, 140, 172, 173, 141, 141, 173, 174, 142, 142, 174, 175, 143, 143, 175, 176, 144, 144, 176, 177, 145, 145, 177, 178, 146, 146, 178, 179, 147, 147, 179, 180, 148, 148, 180, 181, 149, 149, 181, 182, 150, 150, 182, 183, 151, 151, 183, 184, 152, 152, 184, 185, 153, 153, 185, 186, 154, 154, 186, 187, 155, 155, 187, 188, 156, 156, 188, 189, 157, 157, 189, 190, 158, 158, 190, 191, 159, 159, 191, 192, 160, 160, 192, 161, 129, 161, 193, 194, 162, 162, 194, 195, 163, 163, 195, 196, 164, 164, 196, 197, 165, 165, 197, 198, 166, 166, 198, 199, 167, 167, 199, 200, 168, 168, 200, 201, 169, 169, 201, 202, 170, 170, 202, 203, 171, 171, 203, 204, 172, 172, 204, 205, 173, 173, 205, 206, 174, 174, 206, 207, 175, 175, 207, 208, 176, 176, 208, 209, 177, 177, 209, 210, 178, 178, 210, 211, 179, 179, 211, 212, 180, 180, 212, 213, 181, 181, 213, 214, 182, 182, 214, 215, 183, 183, 215, 216, 184, 184, 216, 217, 185, 185, 217, 218, 186, 186, 218, 219, 187, 187, 219, 220, 188, 188, 220, 221, 189, 189, 221, 222, 190, 190, 222, 223, 191, 191, 223, 224, 192, 192, 224, 193, 161, 193, 225, 226, 194, 194, 226, 227, 195, 195, 227, 228, 196, 196, 228, 229, 197, 197, 229, 230, 198, 198, 230, 231, 199, 199, 231, 232, 200, 200, 232, 233, 201, 201, 233, 234, 202, 202, 234, 235, 203, 203, 235, 236, 204, 204, 236, 237, 205, 205, 237, 238, 206, 206, 238, 239, 207, 207, 239, 240, 208, 208, 240, 241, 209, 209, 241, 242, 210, 210, 242, 243, 211, 211, 243, 244, 212, 212, 244, 245, 213, 213, 245, 246, 214, 214, 246, 247, 215, 215, 247, 248, 216, 216, 248, 249, 217, 217, 249, 250, 218, 218, 250, 251, 219, 219, 251, 252, 220, 220, 252, 253, 221, 221, 253, 254, 222, 222, 254, 255, 223, 223, 255, 256, 224, 224, 256, 225, 193, 225, 257, 258, 226, 226, 258, 259, 227, 227, 259, 260, 228, 228, 260, 261, 229, 229, 261, 262, 230, 230, 262, 263, 231, 231, 263, 264, 232, 232, 264, 265, 233, 233, 265, 266, 234, 234, 266, 267, 235, 235, 267, 268, 236, 236, 268, 269, 237, 237, 269, 270, 238, 238, 270, 271, 239, 239, 271, 272, 240, 240, 272, 273, 241, 241, 273, 274, 242, 242, 274, 275, 243, 243, 275, 276, 244, 244, 276, 277, 245, 245, 277, 278, 246, 246, 278, 279, 247, 247, 279, 280, 248, 248, 280, 281, 249, 249, 281, 282, 250, 250, 282, 283, 251, 251, 283, 284, 252, 252, 284, 285, 253, 253, 285, 286, 254, 254, 286, 287, 255, 255, 287, 288, 256, 256, 288, 257, 225, 257, 289, 290, 258, 258, 290, 291, 259, 259, 291, 292, 260, 260, 292, 293, 261, 261, 293, 294, 262, 262, 294, 295, 263, 263, 295, 296, 264, 264, 296, 297, 265, 265, 297, 298, 266, 266, 298, 299, 267, 267, 299, 300, 268, 268, 300, 301, 269, 269, 301, 302, 270, 270, 302, 303, 271, 271, 303, 304, 272, 272, 304, 305, 273, 273, 305, 306, 274, 274, 306, 307, 275, 275, 307, 308, 276, 276, 308, 309, 277, 277, 309, 310, 278, 278, 310, 311, 279, 279, 311, 312, 280, 280, 312, 313, 281, 281, 313, 314, 282, 282, 314, 315, 283, 283, 315, 316, 284, 284, 316, 317, 285, 285, 317, 318, 286, 286, 318, 319, 287, 287, 319, 320, 288, 288, 320, 289, 257, 289, 321, 322, 290, 290, 322, 323, 291, 291, 323, 324, 292, 292, 324, 325, 293, 293, 325, 326, 294, 294, 326, 327, 295, 295, 327, 328, 296, 296, 328, 329, 297, 297, 329, 330, 298, 298, 330, 331, 299, 299, 331, 332, 300, 300, 332, 333, 301, 301, 333, 334, 302, 302, 334, 335, 303, 303, 335, 336, 304, 304, 336, 337, 305, 305, 337, 338, 306, 306, 338, 339, 307, 307, 339, 340, 308, 308, 340, 341, 309, 309, 341, 342, 310, 310, 342, 343, 311, 311, 343, 344, 312, 312, 344, 345, 313, 313, 345, 346, 314, 314, 346, 347, 315, 315, 347, 348, 316, 316, 348, 349, 317, 317, 349, 350, 318, 318, 350, 351, 319, 319, 351, 352, 320, 320, 352, 321, 289, 321, 353, 354, 322, 322, 354, 355, 323, 323, 355, 356, 324, 324, 356, 357, 325, 325, 357, 358, 326, 326, 358, 359, 327, 327, 359, 360, 328, 328, 360, 361, 329, 329, 361, 362, 330, 330, 362, 363, 331, 331, 363, 364, 332, 332, 364, 365, 333, 333, 365, 366, 334, 334, 366, 367, 335, 335, 367, 368, 336, 336, 368, 369, 337, 337, 369, 370, 338, 338, 370, 371, 339, 339, 371, 372, 340, 340, 372, 373, 341, 341, 373, 374, 342, 342, 374, 375, 343, 343, 375, 376, 344, 344, 376, 377, 345, 345, 377, 378, 346, 346, 378, 379, 347, 347, 379, 380, 348, 348, 380, 381, 349, 349, 381, 382, 350, 350, 382, 383, 351, 351, 383, 384, 352, 352, 384, 353, 321, 353, 385, 386, 354, 354, 386, 387, 355, 355, 387, 388, 356, 356, 388, 389, 357, 357, 389, 390, 358, 358, 390, 391, 359, 359, 391, 392, 360, 360, 392, 393, 361, 361, 393, 394, 362, 362, 394, 395, 363, 363, 395, 396, 364, 364, 396, 397, 365, 365, 397, 398, 366, 366, 398, 399, 367, 367, 399, 400, 368, 368, 400, 401, 369, 369, 401, 402, 370, 370, 402, 403, 371, 371, 403, 404, 372, 372, 404, 405, 373, 373, 405, 406, 374, 374, 406, 407, 375, 375, 407, 408, 376, 376, 408, 409, 377, 377, 409, 410, 378, 378, 410, 411, 379, 379, 411, 412, 380, 380, 412, 413, 381, 381, 413, 414, 382, 382, 414, 415, 383, 383, 415, 416, 384, 384, 416, 385, 353, 385, 417, 418, 386, 386, 418, 419, 387, 387, 419, 420, 388, 388, 420, 421, 389, 389, 421, 422, 390, 390, 422, 423, 391, 391, 423, 424, 392, 392, 424, 425, 393, 393, 425, 426, 394, 394, 426, 427, 395, 395, 427, 428, 396, 396, 428, 429, 397, 397, 429, 430, 398, 398, 430, 431, 399, 399, 431, 432, 400, 400, 432, 433, 401, 401, 433, 434, 402, 402, 434, 435, 403, 403, 435, 436, 404, 404, 436, 437, 405, 405, 437, 438, 406, 406, 438, 439, 407, 407, 439, 440, 408, 408, 440, 441, 409, 409, 441, 442, 410, 410, 442, 443, 411, 411, 443, 444, 412, 412, 444, 445, 413, 413, 445, 446, 414, 414, 446, 447, 415, 415, 447, 448, 416, 416, 448, 417, 385, 417, 449, 450, 418, 418, 450, 451, 419, 419, 451, 452, 420, 420, 452, 453, 421, 421, 453, 454, 422, 422, 454, 455, 423, 423, 455, 456, 424, 424, 456, 457, 425, 425, 457, 458, 426, 426, 458, 459, 427, 427, 459, 460, 428, 428, 460, 461, 429, 429, 461, 462, 430, 430, 462, 463, 431, 431, 463, 464, 432, 432, 464, 465, 433, 433, 465, 466, 434, 434, 466, 467, 435, 435, 467, 468, 436, 436, 468, 469, 437, 437, 469, 470, 438, 438, 470, 471, 439, 439, 471, 472, 440, 440, 472, 473, 441, 441, 473, 474, 442, 442, 474, 475, 443, 443, 475, 476, 444, 444, 476, 477, 445, 445, 477, 478, 446, 446, 478, 479, 447, 447, 479, 480, 448, 448, 480, 449, 417, 481, 450, 449, 481, 451, 450, 481, 452, 451, 481, 453, 452, 481, 454, 453, 481, 455, 454, 481, 456, 455, 481, 457, 456, 481, 458, 457, 481, 459, 458, 481, 460, 459, 481, 461, 460, 481, 462, 461, 481, 463, 462, 481, 464, 463, 481, 465, 464, 481, 466, 465, 481, 467, 466, 481, 468, 467, 481, 469, 468, 481, 470, 469, 481, 471, 470, 481, 472, 471, 481, 473, 472, 481, 474, 473, 481, 475, 474, 481, 476, 475, 481, 477, 476, 481, 478, 477, 481, 479, 478, 481, 480, 479, 481, 449, 480] + point3f[] points = [(0, 0.5, 0), (-4.2638346e-9, 0.49039263, -0.09754515), (-0.019030116, 0.49039263, -0.09567088), (-0.037328914, 0.49039263, -0.09011996), (-0.054193184, 0.49039263, -0.08110583), (-0.068974845, 0.49039263, -0.06897485), (-0.08110584, 0.49039263, -0.0541932), (-0.09011999, 0.49039263, -0.0373289), (-0.095670864, 0.49039263, -0.019030094), (-0.09754516, 0.49039263, 2.9802322e-8), (-0.09567085, 0.49039263, 0.019030154), (-0.09011996, 0.49039263, 0.03732896), (-0.081105806, 0.49039266, 0.05419323), (-0.0689748, 0.49039266, 0.06897488), (-0.05419313, 0.49039263, 0.08110589), (-0.037328843, 0.49039263, 0.09012002), (-0.019030033, 0.49039263, 0.09567088), (9.4189524e-8, 0.49039263, 0.09754515), (0.019030217, 0.4903926, 0.09567085), (0.037329018, 0.49039266, 0.09011993), (0.054193288, 0.49039263, 0.08110577), (0.068974935, 0.4903926, 0.06897476), (0.08110591, 0.49039263, 0.05419308), (0.09012003, 0.49039263, 0.03732878), (0.09567089, 0.49039263, 0.019029975), (0.09754516, 0.49039263, -1.4901161e-7), (0.09567083, 0.49039263, -0.019030273), (0.09011991, 0.49039263, -0.037329078), (0.08110574, 0.49039263, -0.054193318), (0.06897471, 0.49039263, -0.06897497), (0.054193027, 0.49039263, -0.08110595), (0.03732873, 0.49039263, -0.09012008), (0.01902991, 0.49039263, -0.09567088), (-8.363813e-9, 0.46193975, -0.1913417), (-0.03732892, 0.46193975, -0.18766516), (-0.0732233, 0.46193975, -0.1767767), (-0.10630376, 0.46193975, -0.15909487), (-0.13529903, 0.46193975, -0.13529903), (-0.15909484, 0.46193975, -0.10630375), (-0.17677672, 0.46193975, -0.07322329), (-0.18766515, 0.46193975, -0.03732887), (-0.19134173, 0.46193975, 5.9604645e-8), (-0.18766513, 0.46193975, 0.03732899), (-0.17677666, 0.46193975, 0.07322341), (-0.15909477, 0.46193975, 0.10630387), (-0.13529895, 0.46193978, 0.13529912), (-0.106303655, 0.46193975, 0.15909493), (-0.073223166, 0.46193975, 0.17677677), (-0.037328754, 0.46193975, 0.18766516), (1.8475941e-7, 0.46193972, 0.19134173), (0.037329115, 0.46193975, 0.1876651), (0.07322351, 0.46193972, 0.17677662), (0.10630397, 0.46193975, 0.15909469), (0.1352992, 0.46193975, 0.13529885), (0.15909497, 0.46193978, 0.10630354), (0.17677681, 0.46193975, 0.073223054), (0.1876652, 0.46193975, 0.03732863), (0.19134173, 0.46193975, -2.9802322e-7), (0.18766509, 0.46193975, -0.037329227), (0.17677657, 0.46193975, -0.07322365), (0.15909463, 0.46193975, -0.10630405), (0.13529877, 0.46193975, -0.13529927), (0.10630345, 0.46193975, -0.15909505), (0.07322294, 0.46193975, -0.17677683), (0.03732851, 0.46193975, -0.18766522), (-1.2142373e-8, 0.4157348, -0.27778515), (-0.05419319, 0.4157348, -0.27244756), (-0.10630375, 0.4157348, -0.25664), (-0.15432914, 0.4157348, -0.23096988), (-0.19642374, 0.4157348, -0.19642374), (-0.2309699, 0.41573477, -0.15432915), (-0.25664002, 0.4157348, -0.10630372), (-0.27244756, 0.41573483, -0.05419311), (-0.27778512, 0.4157348, 8.940697e-8), (-0.27244753, 0.41573477, 0.054193288), (-0.25663993, 0.41573483, 0.1063039), (-0.2309698, 0.41573477, 0.15432927), (-0.19642362, 0.41573477, 0.19642387), (-0.15432899, 0.4157348, 0.23097), (-0.10630356, 0.41573477, 0.25664008), (-0.05419295, 0.41573477, 0.2724476), (2.682291e-7, 0.41573483, 0.27778512), (0.054193474, 0.4157348, 0.2724475), (0.10630405, 0.4157348, 0.25663987), (0.15432943, 0.4157348, 0.2309697), (0.19642399, 0.41573483, 0.19642349), (0.2309701, 0.41573483, 0.15432885), (0.25664014, 0.41573477, 0.106303394), (0.27244765, 0.4157348, 0.05419278), (0.27778512, 0.4157348, -4.4703484e-7), (0.27244747, 0.4157348, -0.054193646), (0.2566398, 0.4157348, -0.1063042), (0.23096961, 0.41573483, -0.15432957), (0.19642337, 0.4157348, -0.1964241), (0.15432869, 0.4157348, -0.23097023), (0.10630323, 0.4157348, -0.25664023), (0.0541926, 0.4157348, -0.27244768), (-1.545431e-8, 0.35355338, -0.35355338), (-0.068974845, 0.35355338, -0.34675995), (-0.13529901, 0.35355338, -0.32664075), (-0.19642372, 0.35355338, -0.29396895), (-0.24999999, 0.35355338, -0.24999997), (-0.29396892, 0.35355338, -0.19642374), (-0.32664075, 0.35355338, -0.13529897), (-0.34675997, 0.35355338, -0.06897476), (-0.35355338, 0.35355338, 1.1920929e-7), (-0.34675992, 0.3535534, 0.068975), (-0.32664067, 0.35355338, 0.13529918), (-0.2939688, 0.3535534, 0.1964239), (-0.24999985, 0.35355338, 0.25000015), (-0.19642353, 0.3535534, 0.29396904), (-0.13529876, 0.3535534, 0.32664084), (-0.06897454, 0.35355338, 0.34676), (3.4139086e-7, 0.35355338, 0.35355338), (0.06897521, 0.35355338, 0.3467599), (0.13529938, 0.35355338, 0.32664058), (0.1964241, 0.35355338, 0.29396865), (0.2500003, 0.35355338, 0.24999967), (0.29396915, 0.35355335, 0.19642334), (0.32664093, 0.35355338, 0.13529855), (0.34676006, 0.35355338, 0.068974316), (0.35355338, 0.35355338, -5.662441e-7), (0.34675983, 0.35355338, -0.06897542), (0.3266405, 0.35355338, -0.1352996), (0.29396853, 0.35355338, -0.19642428), (0.24999951, 0.35355338, -0.2500005), (0.19642314, 0.35355338, -0.2939693), (0.13529834, 0.35355338, -0.326641), (0.06897409, 0.35355338, -0.34676012), (-1.8172347e-8, 0.2777851, -0.41573486), (-0.08110584, 0.2777851, -0.40774658), (-0.15909481, 0.2777851, -0.3840889), (-0.23096988, 0.2777851, -0.3456709), (-0.29396892, 0.2777851, -0.2939689), (-0.34567088, 0.2777851, -0.23096988), (-0.38408893, 0.2777851, -0.15909478), (-0.4077466, 0.2777851, -0.08110574), (-0.41573483, 0.2777851, 1.4901161e-7), (-0.40774655, 0.2777851, 0.08110601), (-0.3840888, 0.2777851, 0.15909502), (-0.34567076, 0.27778512, 0.2309701), (-0.29396874, 0.27778512, 0.2939691), (-0.23096965, 0.2777851, 0.34567103), (-0.15909451, 0.2777851, 0.38408902), (-0.081105486, 0.27778506, 0.40774667), (4.014332e-7, 0.27778512, 0.41573483), (0.08110627, 0.2777851, 0.40774652), (0.15909526, 0.2777851, 0.38408872), (0.23097032, 0.2777851, 0.3456706), (0.29396927, 0.2777851, 0.29396853), (0.34567118, 0.27778506, 0.23096943), (0.38408914, 0.2777851, 0.15909427), (0.4077467, 0.27778506, 0.08110522), (0.41573483, 0.2777851, -6.556511e-7), (0.40774646, 0.2777851, -0.081106514), (0.3840886, 0.2777851, -0.1590955), (0.34567046, 0.2777851, -0.23097053), (0.29396835, 0.2777851, -0.29396948), (0.2309692, 0.2777851, -0.34567133), (0.15909404, 0.2777851, -0.3840892), (0.08110496, 0.2777851, -0.40774676), (-2.0192028e-8, 0.1913417, -0.46193975), (-0.09011997, 0.19134173, -0.45306373), (-0.17677668, 0.19134171, -0.4267767), (-0.25663996, 0.19134171, -0.38408887), (-0.32664073, 0.19134171, -0.32664073), (-0.38408887, 0.19134171, -0.25663996), (-0.42677674, 0.19134171, -0.17677663), (-0.45306373, 0.19134171, -0.09011988), (-0.46193975, 0.19134171, 1.4901161e-7), (-0.45306367, 0.1913417, 0.09012016), (-0.4267766, 0.19134171, 0.1767769), (-0.38408872, 0.1913417, 0.2566402), (-0.32664055, 0.19134173, 0.32664093), (-0.25663972, 0.1913417, 0.38408905), (-0.17677635, 0.1913417, 0.42677683), (-0.09011958, 0.1913417, 0.4530638), (4.4604863e-7, 0.1913417, 0.46193975), (0.09012045, 0.1913417, 0.4530636), (0.17677717, 0.1913417, 0.42677647), (0.25664046, 0.19134173, 0.38408855), (0.32664114, 0.1913417, 0.3266403), (0.38408923, 0.19134173, 0.25663945), (0.42677695, 0.19134171, 0.17677607), (0.45306385, 0.19134173, 0.09011928), (0.46193975, 0.19134171, -7.4505806e-7), (0.45306355, 0.19134171, -0.09012075), (0.42677638, 0.19134171, -0.17677744), (0.3840884, 0.19134171, -0.25664073), (0.3266401, 0.19134171, -0.32664138), (0.2566392, 0.19134171, -0.3840894), (0.17677581, 0.19134171, -0.42677706), (0.09011899, 0.1913417, -0.4530639), (-2.1435742e-8, 0.09754518, -0.49039266), (-0.09567086, 0.09754518, -0.48096988), (-0.18766512, 0.09754518, -0.4530637), (-0.27244753, 0.09754518, -0.40774658), (-0.34675995, 0.09754518, -0.34675995), (-0.40774658, 0.09754518, -0.27244753), (-0.45306376, 0.09754518, -0.18766508), (-0.48096988, 0.09754518, -0.09567073), (-0.49039263, 0.09754518, 1.5646219e-7), (-0.48096982, 0.097545184, 0.09567105), (-0.4530636, 0.09754518, 0.18766534), (-0.4077464, 0.09754518, 0.2724478), (-0.34675974, 0.09754518, 0.34676018), (-0.27244726, 0.09754518, 0.40774676), (-0.18766476, 0.09754518, 0.45306388), (-0.09567043, 0.09754518, 0.48096994), (4.735227e-7, 0.09754521, 0.49039263), (0.09567136, 0.09754518, 0.48096976), (0.18766564, 0.09754515, 0.4530635), (0.27244803, 0.09754518, 0.40774623), (0.3467604, 0.09754518, 0.3467595), (0.40774694, 0.09754518, 0.272447), (0.453064, 0.09754518, 0.18766448), (0.48097, 0.09754518, 0.09567012), (0.49039263, 0.09754518, -7.8976154e-7), (0.4809697, 0.09754518, -0.09567167), (0.45306337, 0.09754518, -0.18766594), (0.40774605, 0.09754518, -0.2724483), (0.34675926, 0.09754518, -0.34676063), (0.27244672, 0.09754518, -0.40774712), (0.1876642, 0.09754518, -0.4530641), (0.09566981, 0.09754518, -0.4809701), (-2.1855694e-8, 2.9802322e-8, -0.5), (-0.09754516, 2.9802322e-8, -0.49039263), (-0.1913417, 2.9802322e-8, -0.46193978), (-0.2777851, 2.9802322e-8, -0.41573483), (-0.35355338, 2.9802322e-8, -0.35355338), (-0.41573483, 2.9802322e-8, -0.2777851), (-0.4619398, 4.4703484e-8, -0.19134164), (-0.49039266, 3.7252903e-8, -0.09754504), (-0.5, 3.7748947e-8, 1.6292068e-7), (-0.4903926, 3.7252903e-8, 0.09754536), (-0.46193966, 4.4703484e-8, 0.19134194), (-0.41573465, 2.9802322e-8, 0.27778536), (-0.35355318, 2.9802322e-8, 0.35355362), (-0.27778482, 2.9802322e-8, 0.415735), (-0.19134134, 2.9802322e-8, 0.46193993), (-0.09754473, 2.9802322e-8, 0.4903927), (4.827996e-7, 5.9604645e-8, 0.5), (0.097545676, 2.9802322e-8, 0.49039254), (0.19134223, 2.9802322e-8, 0.46193954), (0.27778563, 2.9802322e-8, 0.41573447), (0.35355383, 2.9802322e-8, 0.35355294), (0.4157352, 2.9802322e-8, 0.27778456), (0.46194005, 4.4703484e-8, 0.19134104), (0.49039277, 3.7252903e-8, 0.09754441), (0.5, 3.7748976e-8, -8.026785e-7), (0.49039248, 3.7252903e-8, -0.09754599), (0.46193942, 4.4703484e-8, -0.19134253), (0.4157343, 2.9802322e-8, -0.2777859), (0.3535527, 2.9802322e-8, -0.35355407), (0.2777843, 2.9802322e-8, -0.41573536), (0.19134076, 2.9802322e-8, -0.46194017), (0.0975441, 2.9802322e-8, -0.49039286), (-2.1435744e-8, -0.09754512, -0.49039263), (-0.095670864, -0.09754512, -0.48096985), (-0.18766512, -0.09754512, -0.45306373), (-0.27244753, -0.09754509, -0.4077466), (-0.34675997, -0.09754509, -0.34675997), (-0.4077466, -0.09754509, -0.27244753), (-0.4530638, -0.09754512, -0.18766508), (-0.4809699, -0.0975451, -0.095670745), (-0.49039266, -0.0975451, 1.5646219e-7), (-0.48096985, -0.0975451, 0.09567106), (-0.45306364, -0.0975451, 0.18766536), (-0.40774643, -0.0975451, 0.27244782), (-0.34675977, -0.0975451, 0.3467602), (-0.2724473, -0.09754509, 0.4077468), (-0.18766478, -0.09754509, 0.4530639), (-0.09567044, -0.09754509, 0.48096997), (4.7352273e-7, -0.09754512, 0.49039268), (0.09567136, -0.09754509, 0.4809698), (0.18766566, -0.09754512, 0.45306355), (0.27244806, -0.09754509, 0.40774626), (0.3467604, -0.0975451, 0.34675956), (0.40774697, -0.0975451, 0.27244705), (0.45306402, -0.0975451, 0.1876645), (0.48097003, -0.0975451, 0.09567012), (0.49039266, -0.0975451, -7.8976154e-7), (0.48096973, -0.097545095, -0.095671676), (0.4530634, -0.09754509, -0.18766594), (0.40774608, -0.09754512, -0.27244833), (0.3467593, -0.09754509, -0.34676063), (0.27244675, -0.09754509, -0.40774715), (0.18766421, -0.09754509, -0.45306414), (0.09566981, -0.09754512, -0.48097008), (-2.019203e-8, -0.19134167, -0.46193978), (-0.09011998, -0.19134164, -0.45306373), (-0.17677668, -0.19134167, -0.42677674), (-0.25663996, -0.19134161, -0.3840889), (-0.32664075, -0.19134161, -0.32664075), (-0.3840889, -0.19134164, -0.25663996), (-0.42677674, -0.19134165, -0.17677663), (-0.45306376, -0.19134164, -0.09011987), (-0.46193978, -0.19134164, 1.4901161e-7), (-0.4530637, -0.19134164, 0.09012017), (-0.42677662, -0.19134164, 0.17677689), (-0.38408875, -0.19134164, 0.25664023), (-0.32664055, -0.19134164, 0.32664096), (-0.25663972, -0.19134164, 0.3840891), (-0.17677635, -0.19134164, 0.4267769), (-0.090119585, -0.19134164, 0.45306385), (4.4604866e-7, -0.19134164, 0.4619398), (0.09012046, -0.19134164, 0.4530636), (0.17677718, -0.19134164, 0.42677653), (0.25664046, -0.19134164, 0.38408858), (0.32664117, -0.19134164, 0.32664037), (0.38408923, -0.19134164, 0.25663948), (0.42677698, -0.19134164, 0.17677608), (0.45306388, -0.19134164, 0.0901193), (0.46193978, -0.19134164, -7.4505806e-7), (0.45306358, -0.19134162, -0.09012075), (0.42677638, -0.19134164, -0.17677745), (0.38408843, -0.19134164, -0.2566407), (0.3266401, -0.19134164, -0.32664138), (0.2566392, -0.19134164, -0.3840894), (0.17677581, -0.19134167, -0.4267771), (0.090119, -0.19134167, -0.45306394), (-1.8172347e-8, -0.27778512, -0.41573483), (-0.08110584, -0.2777851, -0.40774658), (-0.15909481, -0.2777851, -0.3840889), (-0.23096988, -0.27778512, -0.34567088), (-0.29396892, -0.27778506, -0.29396892), (-0.34567088, -0.2777851, -0.23096988), (-0.38408893, -0.27778512, -0.15909477), (-0.4077466, -0.2777851, -0.08110574), (-0.41573483, -0.2777851, 1.4901161e-7), (-0.40774655, -0.2777851, 0.08110601), (-0.3840888, -0.2777851, 0.15909502), (-0.34567076, -0.2777851, 0.23097011), (-0.29396874, -0.2777851, 0.29396912), (-0.23096965, -0.2777851, 0.34567103), (-0.15909451, -0.2777851, 0.38408902), (-0.081105486, -0.2777851, 0.40774664), (4.014332e-7, -0.2777851, 0.41573486), (0.08110627, -0.2777851, 0.40774652), (0.15909526, -0.2777851, 0.38408872), (0.23097032, -0.2777851, 0.3456706), (0.29396927, -0.2777851, 0.29396853), (0.34567118, -0.2777851, 0.2309694), (0.38408914, -0.2777851, 0.15909427), (0.4077467, -0.2777851, 0.0811052), (0.41573483, -0.2777851, -6.556511e-7), (0.40774646, -0.27778506, -0.08110653), (0.3840886, -0.27778506, -0.15909551), (0.34567046, -0.27778506, -0.23097055), (0.29396835, -0.2777851, -0.29396948), (0.2309692, -0.2777851, -0.34567133), (0.15909404, -0.27778506, -0.38408923), (0.08110496, -0.27778506, -0.4077468), (-1.545431e-8, -0.35355338, -0.35355338), (-0.068974845, -0.35355338, -0.34675995), (-0.13529901, -0.35355338, -0.32664075), (-0.19642372, -0.3535534, -0.29396892), (-0.24999999, -0.35355335, -0.24999999), (-0.29396892, -0.3535534, -0.19642372), (-0.32664075, -0.35355338, -0.13529897), (-0.34675997, -0.35355338, -0.06897476), (-0.35355338, -0.35355338, 1.1920929e-7), (-0.34675992, -0.35355335, 0.068975), (-0.32664067, -0.35355338, 0.13529918), (-0.2939688, -0.35355338, 0.19642392), (-0.24999985, -0.35355338, 0.25000015), (-0.19642353, -0.35355338, 0.29396906), (-0.13529876, -0.35355338, 0.32664087), (-0.06897454, -0.35355338, 0.34676), (3.4139086e-7, -0.35355338, 0.35355338), (0.06897521, -0.35355338, 0.3467599), (0.13529938, -0.35355338, 0.32664058), (0.1964241, -0.35355338, 0.29396865), (0.2500003, -0.35355338, 0.24999967), (0.29396915, -0.35355338, 0.19642332), (0.32664093, -0.35355338, 0.13529855), (0.34676006, -0.35355338, 0.068974316), (0.35355338, -0.35355338, -5.662441e-7), (0.34675983, -0.35355338, -0.06897542), (0.3266405, -0.35355338, -0.1352996), (0.29396853, -0.35355335, -0.19642429), (0.24999951, -0.3535534, -0.25000048), (0.19642314, -0.35355338, -0.2939693), (0.13529834, -0.35355335, -0.32664102), (0.06897409, -0.35355338, -0.34676012), (-1.2142372e-8, -0.41573486, -0.2777851), (-0.054193184, -0.41573483, -0.27244753), (-0.106303744, -0.41573483, -0.25663996), (-0.15432912, -0.4157348, -0.23096988), (-0.19642372, -0.41573483, -0.19642372), (-0.23096988, -0.41573483, -0.15432912), (-0.25664, -0.41573483, -0.10630369), (-0.27244753, -0.41573483, -0.05419311), (-0.2777851, -0.41573483, 8.940697e-8), (-0.2724475, -0.41573483, 0.054193288), (-0.2566399, -0.41573483, 0.10630387), (-0.23096977, -0.41573483, 0.15432924), (-0.1964236, -0.41573483, 0.19642383), (-0.15432897, -0.41573483, 0.23096997), (-0.10630354, -0.41573483, 0.25664002), (-0.054192945, -0.41573483, 0.2724476), (2.6822906e-7, -0.41573483, 0.27778512), (0.05419347, -0.41573483, 0.27244747), (0.10630404, -0.41573483, 0.25663984), (0.15432942, -0.41573483, 0.23096967), (0.19642396, -0.41573483, 0.19642347), (0.23097007, -0.41573483, 0.15432882), (0.2566401, -0.41573483, 0.106303394), (0.27244762, -0.41573483, 0.05419278), (0.2777851, -0.41573483, -4.4703484e-7), (0.27244744, -0.41573483, -0.054193646), (0.25663978, -0.41573486, -0.1063042), (0.23096958, -0.41573486, -0.15432957), (0.19642334, -0.4157348, -0.1964241), (0.15432867, -0.41573486, -0.23097017), (0.10630322, -0.41573483, -0.2566402), (0.05419259, -0.41573483, -0.27244765), (-8.363808e-9, -0.4619398, -0.19134164), (-0.037328903, -0.4619398, -0.18766505), (-0.07322327, -0.4619398, -0.17677665), (-0.10630371, -0.4619398, -0.15909475), (-0.13529897, -0.4619398, -0.13529897), (-0.15909477, -0.4619398, -0.10630369), (-0.17677665, -0.4619398, -0.07322323), (-0.18766508, -0.4619398, -0.03732887), (-0.19134164, -0.4619398, 5.9604645e-8), (-0.18766505, -0.4619398, 0.03732899), (-0.17677659, -0.4619398, 0.07322335), (-0.15909469, -0.4619398, 0.10630381), (-0.1352989, -0.4619398, 0.13529909), (-0.10630361, -0.4619398, 0.15909481), (-0.07322313, -0.4619398, 0.1767767), (-0.037328735, -0.4619398, 0.1876651), (1.8475933e-7, -0.4619398, 0.19134164), (0.0373291, -0.4619398, 0.18766499), (0.07322347, -0.4619398, 0.17677653), (0.106303915, -0.4619398, 0.15909463), (0.13529915, -0.4619398, 0.13529879), (0.1590949, -0.4619398, 0.10630351), (0.17677674, -0.4619398, 0.073222995), (0.18766512, -0.4619398, 0.0373286), (0.19134164, -0.4619398, -2.9802322e-7), (0.187665, -0.4619398, -0.037329227), (0.1767765, -0.4619398, -0.07322359), (0.15909456, -0.46193984, -0.10630402), (0.1352987, -0.46193978, -0.13529924), (0.1063034, -0.4619398, -0.15909499), (0.073222905, -0.4619398, -0.17677677), (0.037328493, -0.4619398, -0.18766516), (-4.2638293e-9, -0.49039268, -0.09754506), (-0.019030094, -0.49039266, -0.09567073), (-0.03732887, -0.49039266, -0.09011987), (-0.054193117, -0.49039266, -0.08110574), (-0.06897476, -0.49039266, -0.06897476), (-0.08110575, -0.49039266, -0.05419311), (-0.090119876, -0.49039266, -0.03732887), (-0.095670745, -0.49039266, -0.019030064), (-0.09754504, -0.49039266, 2.9802322e-8), (-0.09567073, -0.49039266, 0.019030124), (-0.090119846, -0.49039263, 0.03732893), (-0.08110571, -0.49039266, 0.05419317), (-0.06897472, -0.49039263, 0.06897482), (-0.054193065, -0.49039266, 0.0811058), (-0.0373288, -0.49039266, 0.09011987), (-0.01903001, -0.49039266, 0.09567073), (9.418941e-8, -0.49039263, 0.09754506), (0.019030195, -0.49039266, 0.09567073), (0.037328973, -0.49039268, 0.09011981), (0.05419322, -0.49039266, 0.08110568), (0.068974845, -0.49039266, 0.068974644), (0.08110581, -0.49039266, 0.05419299), (0.09011992, -0.49039266, 0.03732875), (0.09567077, -0.49039266, 0.019029945), (0.09754504, -0.49039266, -1.4901161e-7), (0.09567071, -0.49039266, -0.019030243), (0.0901198, -0.49039268, -0.037329018), (0.081105635, -0.49039268, -0.054193288), (0.06897463, -0.49039263, -0.06897488), (0.05419296, -0.49039266, -0.08110586), (0.037328687, -0.49039263, -0.09011996), (0.019029886, -0.49039266, -0.09567079), (0, -0.5, 0)] + color3f[] primvars:displayColor = [(0.27450982, 0.13333334, 0.62352943)] + float3[] primvars:normals = [(7.292757e-8, 0.99999994, -5.6875273e-9), (2.6251005e-8, 0.97959757, -0.20096882), (-0.03920708, 0.97959757, -0.19710742), (-0.076907486, 0.9795976, -0.18567094), (-0.11165225, 0.9795976, -0.1670995), (-0.14210646, 0.9795976, -0.14210647), (-0.16709955, 0.97959757, -0.111652344), (-0.18567103, 0.9795976, -0.076907404), (-0.19710734, 0.9795976, -0.039207034), (-0.20096889, 0.9795976, 4.7132488e-8), (-0.1971073, 0.9795976, 0.03920718), (-0.18567125, 0.9795976, 0.07690713), (-0.16709973, 0.97959757, 0.111651845), (-0.14210592, 0.9795976, 0.14210673), (-0.11165172, 0.9795976, 0.16709997), (-0.07690725, 0.97959757, 0.18567115), (-0.039206732, 0.97959757, 0.19710746), (6.473259e-7, 0.97959757, 0.20096886), (0.03920685, 0.9795976, 0.19710769), (0.07690721, 0.97959757, 0.18567105), (0.11165323, 0.97959757, 0.16709895), (0.14210662, 0.9795976, 0.14210646), (0.16709928, 0.9795976, 0.11165242), (0.18567117, 0.9795976, 0.07690704), (0.19710739, 0.97959757, 0.039206807), (0.20096888, 0.97959757, -2.9532382e-7), (0.19710723, 0.9795976, -0.0392074), (0.18567088, 0.97959757, -0.07690783), (0.16709925, 0.9795976, -0.111652665), (0.14210624, 0.97959757, -0.14210668), (0.11165205, 0.97959757, -0.16709971), (0.07690705, 0.97959757, -0.18567134), (0.03920667, 0.9795976, -0.19710733), (-1.18328e-7, 0.92170703, -0.38788676), (-0.07567298, 0.921707, -0.38043377), (-0.1484379, 0.92170686, -0.35836077), (-0.21549842, 0.921707, -0.32251626), (-0.27427754, 0.921707, -0.27427742), (-0.3225162, 0.92170686, -0.21549848), (-0.35836077, 0.92170686, -0.14843792), (-0.38043374, 0.921707, -0.07567285), (-0.38788694, 0.921707, 2.438274e-7), (-0.3804339, 0.921707, 0.075673096), (-0.3583608, 0.921707, 0.14843798), (-0.3225163, 0.9217069, 0.21549858), (-0.2742774, 0.9217069, 0.27427775), (-0.21549803, 0.9217069, 0.32251668), (-0.14843746, 0.921707, 0.35836112), (-0.07567259, 0.92170686, 0.3804339), (3.4183643e-7, 0.921707, 0.3878869), (0.075673334, 0.921707, 0.38043362), (0.14843823, 0.921707, 0.35836068), (0.21549873, 0.921707, 0.32251588), (0.2742775, 0.92170703, 0.2742772), (0.32251632, 0.92170703, 0.21549785), (0.35836115, 0.92170686, 0.14843711), (0.38043386, 0.921707, 0.075672485), (0.3878869, 0.921707, -5.832734e-7), (0.38043362, 0.92170686, -0.075673595), (0.35836053, 0.92170703, -0.1484385), (0.32251564, 0.92170703, -0.21549901), (0.2742769, 0.921707, -0.2742779), (0.21549779, 0.921707, -0.32251653), (0.14843702, 0.921707, -0.35836107), (0.07567235, 0.921707, -0.38043383), (-3.400706e-7, 0.8286446, -0.55977505), (-0.109206736, 0.8286446, -0.5490191), (-0.21421659, 0.8286446, -0.51716477), (-0.31099442, 0.8286446, -0.46543586), (-0.39582077, 0.8286446, -0.39582065), (-0.46543595, 0.8286446, -0.31099445), (-0.51716477, 0.8286446, -0.21421666), (-0.54901916, 0.82864463, -0.10920652), (-0.559775, 0.8286446, 3.4965004e-7), (-0.5490191, 0.8286446, 0.109206825), (-0.5171645, 0.82864463, 0.2142168), (-0.4654357, 0.8286446, 0.3109947), (-0.39582062, 0.8286446, 0.39582092), (-0.310994, 0.82864463, 0.46543616), (-0.21421595, 0.8286446, 0.517165), (-0.10920633, 0.8286446, 0.54901916), (3.5324234e-7, 0.82864463, 0.559775), (0.10920741, 0.82864463, 0.5490189), (0.21421723, 0.82864463, 0.5171644), (0.3109948, 0.8286446, 0.46543562), (0.39582118, 0.8286446, 0.39582038), (0.46543652, 0.8286445, 0.31099364), (0.5171651, 0.8286445, 0.21421582), (0.5490193, 0.82864463, 0.10920599), (0.55977505, 0.8286446, -9.244173e-7), (0.54901904, 0.8286445, -0.10920765), (0.5171644, 0.8286446, -0.21421742), (0.46543536, 0.82864463, -0.31099522), (0.39581993, 0.8286446, -0.39582142), (0.31099343, 0.8286446, -0.4654366), (0.21421549, 0.8286446, -0.5171653), (0.109205894, 0.82864463, -0.5490193), (-4.8225303e-7, 0.70405906, -0.7101414), (-0.1385418, 0.70405906, -0.69649625), (-0.2717592, 0.70405906, -0.65608513), (-0.3945335, 0.70405906, -0.5904609), (-0.5021459, 0.70405906, -0.50214577), (-0.590461, 0.70405906, -0.3945335), (-0.6560852, 0.7040592, -0.27175927), (-0.69649637, 0.70405906, -0.13854155), (-0.7101415, 0.70405906, 2.783152e-7), (-0.6964961, 0.70405906, 0.13854201), (-0.656085, 0.704059, 0.2717595), (-0.59046066, 0.7040592, 0.3945337), (-0.5021454, 0.7040592, 0.5021461), (-0.39453304, 0.7040592, 0.59046125), (-0.27175865, 0.7040592, 0.6560853), (-0.13854116, 0.7040592, 0.69649637), (5.518319e-7, 0.7040592, 0.7101414), (0.13854255, 0.70405906, 0.69649607), (0.2717601, 0.7040592, 0.65608484), (0.39453417, 0.7040592, 0.59046054), (0.5021466, 0.704059, 0.5021452), (0.5904617, 0.70405895, 0.39453268), (0.6560855, 0.704059, 0.2717584), (0.6964965, 0.70405906, 0.13854069), (0.7101415, 0.704059, -0.0000011348542), (0.69649607, 0.7040592, -0.13854295), (0.6560847, 0.704059, -0.27176046), (0.59046036, 0.70405906, -0.3945345), (0.5021449, 0.70405906, -0.5021469), (0.39453217, 0.704059, -0.59046185), (0.27175802, 0.704059, -0.65608585), (0.13854077, 0.704059, -0.6964965), (-4.6142696e-7, 0.55276126, -0.8333397), (-0.16257653, 0.5527614, -0.81732726), (-0.3189052, 0.5527613, -0.76990557), (-0.4629788, 0.55276126, -0.6928966), (-0.5892602, 0.5527613, -0.58926004), (-0.6928966, 0.5527614, -0.4629788), (-0.76990557, 0.5527614, -0.31890514), (-0.8173273, 0.55276126, -0.16257621), (-0.83333975, 0.55276126, 3.0281146e-7), (-0.8173273, 0.55276126, 0.1625769), (-0.7699054, 0.55276114, 0.3189055), (-0.6928965, 0.55276126, 0.462979), (-0.58925974, 0.55276126, 0.5892606), (-0.46297818, 0.5527612, 0.692897), (-0.3189046, 0.55276126, 0.7699058), (-0.16257584, 0.55276126, 0.8173275), (7.353993e-7, 0.55276126, 0.83333975), (0.16257744, 0.5527612, 0.81732726), (0.31890613, 0.55276126, 0.76990527), (0.46297958, 0.5527613, 0.692896), (0.589261, 0.5527613, 0.5892593), (0.69289714, 0.5527613, 0.4629779), (0.7699059, 0.5527614, 0.31890416), (0.81732756, 0.5527612, 0.1625752), (0.8333397, 0.5527613, -0.0000012641177), (0.817327, 0.5527613, -0.16257791), (0.7699049, 0.5527614, -0.31890655), (0.6928958, 0.5527614, -0.46297988), (0.58925897, 0.5527614, -0.5892613), (0.46297723, 0.5527614, -0.6928976), (0.31890365, 0.5527614, -0.76990616), (0.1625753, 0.5527613, -0.8173275), (-4.8369753e-7, 0.3805373, -0.9247656), (-0.18041287, 0.38053727, -0.9069965), (-0.35389245, 0.38053715, -0.854372), (-0.5137723, 0.38053718, -0.7689145), (-0.653908, 0.38053724, -0.653908), (-0.7689144, 0.38053727, -0.5137723), (-0.8543721, 0.3805372, -0.35389236), (-0.9069966, 0.38053718, -0.18041252), (-0.9247656, 0.38053718, 3.152457e-7), (-0.9069965, 0.38053715, 0.18041323), (-0.85437196, 0.38053715, 0.35389283), (-0.76891434, 0.3805371, 0.51377255), (-0.65390766, 0.38053718, 0.6539085), (-0.51377165, 0.38053724, 0.7689149), (-0.35389173, 0.38053724, 0.8543723), (-0.18041204, 0.3805372, 0.9069967), (8.735435e-7, 0.38053718, 0.92476565), (0.18041387, 0.38053712, 0.9069963), (0.35389346, 0.38053706, 0.8543717), (0.5137733, 0.38053718, 0.7689139), (0.65390897, 0.38053718, 0.6539072), (0.7689152, 0.38053733, 0.51377136), (0.85437256, 0.38053724, 0.35389113), (0.9069968, 0.38053727, 0.18041138), (0.9247656, 0.38053724, -0.0000014607186), (0.90699625, 0.3805372, -0.1804144), (0.8543715, 0.38053718, -0.3538939), (0.7689136, 0.38053718, -0.51377374), (0.6539067, 0.38053715, -0.6539093), (0.51377064, 0.38053718, -0.7689155), (0.3538906, 0.3805373, -0.8543727), (0.18041135, 0.3805373, -0.90699667), (-6.310305e-7, 0.1939301, -0.9810153), (-0.19138668, 0.19393001, -0.96216536), (-0.37541834, 0.19393009, -0.90634), (-0.5450229, 0.19393015, -0.81568444), (-0.69368255, 0.19393015, -0.6936826), (-0.8156843, 0.19393015, -0.545023), (-0.90634006, 0.1939301, -0.37541813), (-0.9621655, 0.19393012, -0.1913863), (-0.98101526, 0.19393015, 3.0828974e-7), (-0.96216524, 0.19393016, 0.19138703), (-0.9063398, 0.19393012, 0.3754187), (-0.8156842, 0.19393012, 0.54502326), (-0.69368213, 0.19393015, 0.693683), (-0.5450223, 0.19393012, 0.8156848), (-0.37541747, 0.19393015, 0.9063403), (-0.19138572, 0.19393015, 0.9621656), (9.2727777e-7, 0.19393021, 0.98101526), (0.19138771, 0.19393021, 0.9621652), (0.37541935, 0.19393015, 0.90633965), (0.54502386, 0.19393015, 0.8156838), (0.69368345, 0.1939301, 0.6936818), (0.8156851, 0.1939301, 0.5450219), (0.90634054, 0.19393012, 0.3754169), (0.9621657, 0.1939301, 0.19138506), (0.9810153, 0.19393015, -0.0000015534912), (0.9621651, 0.19393015, -0.19138823), (0.9063393, 0.1939301, -0.37541988), (0.8156835, 0.19393004, -0.5450244), (0.6936813, 0.19393003, -0.6936839), (0.54502136, 0.19393004, -0.8156855), (0.3754164, 0.1939301, -0.9063407), (0.19138502, 0.19393016, -0.9621657), (-7.1072105e-7, -1.5178111e-7, -1), (-0.19509035, -7.2276734e-8, -0.98078537), (-0.38268328, 6.504906e-8, -0.9238796), (-0.5555702, 1.4214424e-7, -0.83146966), (-0.7071068, 1.5178114e-7, -0.7071068), (-0.83146966, 1.3250734e-7, -0.55557024), (-0.9238796, 1.5659958e-7, -0.38268322), (-0.98078537, 1.5178114e-7, -0.19509003), (-0.99999994, 1.5178114e-7, 3.0838072e-7), (-0.98078525, 1.4937191e-7, 0.1950908), (-0.9238793, 1.782826e-7, 0.3826838), (-0.83146936, 1.9273796e-7, 0.5555706), (-0.7071063, 2.0237485e-7, 0.7071073), (-0.55556965, 1.782826e-7, 0.8314701), (-0.3826826, 1.5178114e-7, 0.92387986), (-0.19508944, 1.7587338e-7, 0.9807854), (9.275514e-7, 2.3851322e-7, 0.99999994), (0.1950914, 2.1923942e-7, 0.9807851), (0.38268444, 2.457409e-7, 0.9238792), (0.5555712, 2.3610399e-7, 0.8314689), (0.7071077, 2.264671e-7, 0.7071059), (0.8314704, 2.2405787e-7, 0.5555692), (0.9238801, 2.071933e-7, 0.38268194), (0.9807856, 1.5659958e-7, 0.19508877), (0.99999994, 1.590088e-7, -0.000001546722), (0.980785, 1.5659958e-7, -0.19509201), (0.9238789, 1.7105494e-7, -0.38268507), (0.8314686, 1.5659958e-7, -0.5555718), (0.7071054, 1.4937191e-7, -0.7071082), (0.5555687, 1.5419036e-7, -0.8314707), (0.38268152, 9.1550525e-8, -0.9238803), (0.19508864, -6.98675e-8, -0.9807856), (-6.912433e-7, -0.19393003, -0.9810154), (-0.19138657, -0.19392999, -0.9621654), (-0.3754182, -0.19393001, -0.90634006), (-0.5450228, -0.19392999, -0.8156845), (-0.6936826, -0.19393003, -0.6936826), (-0.8156845, -0.19393001, -0.5450229), (-0.90634006, -0.19393004, -0.3754181), (-0.9621655, -0.19393001, -0.1913863), (-0.9810153, -0.19392997, 3.034727e-7), (-0.96216536, -0.19392999, 0.19138706), (-0.9063398, -0.19392997, 0.37541863), (-0.8156842, -0.19392996, 0.54502326), (-0.69368213, -0.19392997, 0.693683), (-0.54502237, -0.19392991, 0.81568485), (-0.37541753, -0.19392984, 0.90634036), (-0.19138579, -0.19392984, 0.9621656), (0.0000010019417, -0.19392993, 0.9810153), (0.19138765, -0.19393001, 0.9621652), (0.37541926, -0.19393001, 0.9063395), (0.545024, -0.19392993, 0.8156838), (0.69368345, -0.19392993, 0.69368184), (0.81568515, -0.19392997, 0.54502183), (0.90634066, -0.19392997, 0.37541687), (0.9621657, -0.19392996, 0.19138508), (0.9810153, -0.19392999, -0.0000015558998), (0.96216506, -0.19393003, -0.19138826), (0.9063393, -0.19392999, -0.37541988), (0.8156834, -0.19393004, -0.5450245), (0.6936813, -0.19393001, -0.693684), (0.5450214, -0.19392997, -0.8156855), (0.3754164, -0.19392993, -0.9063408), (0.19138491, -0.19393001, -0.9621658), (-6.473366e-7, -0.38053706, -0.92476565), (-0.1804128, -0.38053703, -0.9069966), (-0.35389236, -0.38053706, -0.85437214), (-0.5137723, -0.38053715, -0.7689145), (-0.6539081, -0.38053718, -0.6539081), (-0.7689145, -0.38053715, -0.51377225), (-0.8543721, -0.38053718, -0.3538924), (-0.9069966, -0.38053712, -0.18041252), (-0.92476565, -0.38053715, 3.0321345e-7), (-0.90699637, -0.38053715, 0.18041326), (-0.85437196, -0.38053712, 0.35389277), (-0.76891434, -0.38053715, 0.51377267), (-0.65390754, -0.38053718, 0.6539085), (-0.5137717, -0.38053727, 0.7689149), (-0.35389167, -0.38053718, 0.8543723), (-0.1804121, -0.38053718, 0.9069967), (0.0000010034921, -0.38053715, 0.92476565), (0.18041386, -0.38053715, 0.9069963), (0.35389334, -0.38053718, 0.8543717), (0.5137732, -0.38053718, 0.76891387), (0.65390885, -0.38053727, 0.65390724), (0.7689151, -0.38053733, 0.51377124), (0.85437256, -0.38053724, 0.35389122), (0.9069968, -0.38053715, 0.18041138), (0.92476565, -0.38053718, -0.0000015088478), (0.90699625, -0.38053715, -0.18041445), (0.8543714, -0.38053718, -0.3538939), (0.7689135, -0.38053715, -0.5137737), (0.6539067, -0.38053715, -0.6539093), (0.5137708, -0.3805372, -0.7689155), (0.3538907, -0.38053724, -0.8543727), (0.18041131, -0.38053715, -0.90699685), (-5.8519515e-7, -0.5527614, -0.8333397), (-0.16257653, -0.5527613, -0.8173273), (-0.3189052, -0.55276126, -0.7699056), (-0.4629789, -0.55276126, -0.69289654), (-0.5892603, -0.5527612, -0.58926016), (-0.6928966, -0.55276126, -0.46297893), (-0.76990545, -0.55276126, -0.31890514), (-0.8173274, -0.55276126, -0.16257624), (-0.8333397, -0.5527613, 3.4486862e-7), (-0.81732726, -0.55276126, 0.16257687), (-0.7699054, -0.55276126, 0.31890553), (-0.6928965, -0.55276126, 0.46297908), (-0.5892597, -0.55276126, 0.5892606), (-0.46297824, -0.5527613, 0.692897), (-0.3189046, -0.5527614, 0.7699058), (-0.16257586, -0.55276144, 0.8173274), (7.91876e-7, -0.55276126, 0.83333963), (0.16257748, -0.5527612, 0.81732714), (0.3189061, -0.55276126, 0.76990515), (0.4629796, -0.5527613, 0.692896), (0.589261, -0.5527614, 0.5892593), (0.6928972, -0.5527614, 0.46297786), (0.76990587, -0.55276126, 0.3189042), (0.81732756, -0.55276126, 0.16257522), (0.8333397, -0.55276126, -0.0000013614499), (0.8173271, -0.55276126, -0.16257803), (0.76990503, -0.55276126, -0.31890664), (0.6928958, -0.55276126, -0.4629799), (0.5892591, -0.55276126, -0.5892613), (0.46297735, -0.5527613, -0.6928976), (0.3189037, -0.5527613, -0.7699061), (0.16257527, -0.5527613, -0.8173275), (-4.942494e-7, -0.70405906, -0.7101414), (-0.13854177, -0.704059, -0.6964963), (-0.2717592, -0.70405906, -0.65608513), (-0.3945335, -0.7040592, -0.59046084), (-0.5021458, -0.704059, -0.5021459), (-0.59046096, -0.70405906, -0.39453354), (-0.6560852, -0.7040592, -0.27175915), (-0.69649625, -0.70405906, -0.1385415), (-0.7101415, -0.70405906, 3.442951e-7), (-0.69649625, -0.704059, 0.13854206), (-0.6560851, -0.70405906, 0.27175948), (-0.5904608, -0.7040592, 0.39453372), (-0.50214547, -0.7040592, 0.5021461), (-0.39453295, -0.704059, 0.5904613), (-0.27175876, -0.704059, 0.65608543), (-0.13854116, -0.704059, 0.6964964), (6.2500953e-7, -0.70405906, 0.7101414), (0.13854255, -0.70405906, 0.69649607), (0.2717601, -0.7040592, 0.65608484), (0.39453423, -0.7040592, 0.59046054), (0.5021466, -0.70405906, 0.5021452), (0.59046155, -0.70405906, 0.39453277), (0.65608555, -0.70405906, 0.2717585), (0.6964964, -0.704059, 0.13854064), (0.7101415, -0.70405906, -0.0000011948359), (0.69649607, -0.704059, -0.13854295), (0.6560848, -0.704059, -0.27176052), (0.5904604, -0.704059, -0.39453456), (0.5021449, -0.70405906, -0.5021467), (0.39453223, -0.704059, -0.59046197), (0.271758, -0.70405895, -0.65608585), (0.13854076, -0.70405906, -0.6964965), (-4.1071908e-7, -0.8286446, -0.55977505), (-0.109206796, -0.8286446, -0.54901916), (-0.21421662, -0.82864463, -0.5171647), (-0.31099442, -0.8286446, -0.46543592), (-0.39582065, -0.8286446, -0.3958209), (-0.46543586, -0.8286446, -0.31099436), (-0.5171648, -0.8286446, -0.21421647), (-0.5490192, -0.8286446, -0.10920656), (-0.5597751, -0.8286446, 2.418812e-7), (-0.5490192, -0.8286446, 0.109207), (-0.51716465, -0.82864463, 0.21421683), (-0.4654358, -0.8286446, 0.31099454), (-0.3958205, -0.82864463, 0.39582095), (-0.310994, -0.82864463, 0.46543616), (-0.21421625, -0.82864463, 0.5171648), (-0.10920631, -0.8286446, 0.5490193), (6.106902e-7, -0.8286446, 0.5597751), (0.109207384, -0.8286446, 0.549019), (0.21421719, -0.8286446, 0.5171645), (0.31099495, -0.8286446, 0.46543556), (0.39582133, -0.8286446, 0.39582026), (0.46543637, -0.8286446, 0.31099376), (0.51716506, -0.82864463, 0.21421595), (0.5490193, -0.82864463, 0.10920589), (0.55977505, -0.8286446, -9.351942e-7), (0.54901904, -0.8286446, -0.10920753), (0.51716447, -0.8286445, -0.21421741), (0.46543527, -0.8286446, -0.31099552), (0.39582, -0.8286445, -0.3958215), (0.31099352, -0.82864463, -0.4654365), (0.21421549, -0.8286446, -0.5171653), (0.10920593, -0.8286446, -0.54901934), (-3.496055e-7, -0.92170715, -0.3878867), (-0.075673126, -0.92170703, -0.3804336), (-0.14843789, -0.92170703, -0.35836068), (-0.21549839, -0.92170703, -0.32251605), (-0.27427733, -0.92170703, -0.27427742), (-0.32251602, -0.92170703, -0.21549828), (-0.35836065, -0.92170703, -0.14843777), (-0.38043365, -0.92170703, -0.07567284), (-0.38788676, -0.92170703, 1.3984219e-7), (-0.38043356, -0.92170715, 0.07567325), (-0.35836053, -0.92170703, 0.14843799), (-0.32251593, -0.92170715, 0.21549843), (-0.2742772, -0.9217071, 0.2742776), (-0.21549807, -0.92170703, 0.3225161), (-0.1484376, -0.9217071, 0.35836083), (-0.07567256, -0.92170715, 0.38043362), (4.6853114e-7, -0.92170715, 0.38788667), (0.07567324, -0.92170703, 0.38043356), (0.14843814, -0.92170703, 0.35836053), (0.21549882, -0.92170703, 0.32251573), (0.2742777, -0.92170703, 0.27427694), (0.32251632, -0.92170715, 0.21549793), (0.35836083, -0.92170703, 0.14843729), (0.38043368, -0.92170703, 0.075672366), (0.38788676, -0.92170703, -6.0658044e-7), (0.38043356, -0.92170703, -0.075673394), (0.3583605, -0.92170703, -0.1484381), (0.32251522, -0.92170715, -0.2154994), (0.27427664, -0.92170703, -0.27427813), (0.21549785, -0.92170715, -0.3225162), (0.14843695, -0.92170703, -0.35836086), (0.07567264, -0.92170715, -0.3804337), (-2.2492341e-7, -0.9795976, -0.20096852), (-0.039207537, -0.9795977, -0.19710696), (-0.07690732, -0.9795976, -0.18567081), (-0.11165218, -0.9795976, -0.16709928), (-0.1421063, -0.97959775, -0.14210626), (-0.16709928, -0.9795977, -0.11165216), (-0.18567078, -0.9795976, -0.07690736), (-0.19710703, -0.9795977, -0.039206956), (-0.20096861, -0.9795976, 8.9939526e-8), (-0.19710687, -0.9795976, 0.039207585), (-0.18567088, -0.9795977, 0.076907486), (-0.16709913, -0.9795976, 0.11165214), (-0.14210628, -0.9795977, 0.14210643), (-0.111652344, -0.9795976, 0.16709916), (-0.07690709, -0.9795977, 0.18567076), (-0.03920643, -0.97959775, 0.19710702), (1.5989247e-7, -0.9795976, 0.20096879), (0.03920638, -0.9795976, 0.19710726), (0.07690746, -0.9795976, 0.18567057), (0.111652866, -0.9795976, 0.16709897), (0.14210644, -0.9795976, 0.142106), (0.16709939, -0.9795976, 0.11165198), (0.1856709, -0.9795977, 0.076907106), (0.19710708, -0.9795976, 0.039206725), (0.20096861, -0.9795976, -3.0725607e-7), (0.19710715, -0.9795977, -0.039206885), (0.18567082, -0.97959775, -0.07690704), (0.1670983, -0.9795976, -0.111653365), (0.14210568, -0.97959757, -0.1421071), (0.111651935, -0.9795976, -0.16709933), (0.07690702, -0.9795977, -0.18567109), (0.03920769, -0.9795977, -0.19710685), (-1.436848e-8, -1, 6.465816e-8)] ( + interpolation = "vertex" + ) + texCoord2f[] primvars:st = [(1.9687502, 1), (1.9999999, 0.9375001), (0.062499948, 0.9375001), (0.12499997, 0.9375001), (0.18749993, 0.9375001), (0.24999994, 0.9375001), (0.31249997, 0.9375001), (0.375, 0.9375001), (0.43750006, 0.9375001), (0.50000006, 0.9375001), (0.56250006, 0.9375001), (0.62500006, 0.9375001), (0.6875001, 0.9375001), (0.7500001, 0.9375001), (0.8125002, 0.9375001), (0.8750002, 0.9375001), (0.9375002, 0.9375001), (1.0000002, 0.9375001), (1.0625002, 0.9375001), (1.1250002, 0.9375001), (1.1875004, 0.9375001), (1.2500004, 0.9375001), (1.3125004, 0.9375001), (1.3750004, 0.9375001), (1.4375004, 0.9375001), (1.5000005, 0.9375001), (1.5625005, 0.9375001), (1.6250005, 0.9375001), (1.6875005, 0.9375001), (1.7500005, 0.9375001), (1.8125005, 0.9375001), (1.8750006, 0.9375001), (1.9375006, 0.9375001), (1.9999999, 0.87499994), (0.062499948, 0.87499994), (0.12499997, 0.87499994), (0.18749993, 0.87499994), (0.24999994, 0.87499994), (0.31249997, 0.87499994), (0.375, 0.87499994), (0.4375, 0.87499994), (0.50000006, 0.87499994), (0.5625001, 0.87499994), (0.6250001, 0.87499994), (0.6875001, 0.87499994), (0.7500001, 0.87499994), (0.8125002, 0.87499994), (0.8750002, 0.87499994), (0.9375002, 0.87499994), (1.0000002, 0.87499994), (1.0625002, 0.875), (1.1250002, 0.87499994), (1.1875004, 0.87499994), (1.2500004, 0.87499994), (1.3125004, 0.87499994), (1.3750004, 0.87499994), (1.4375004, 0.87499994), (1.5000005, 0.87499994), (1.5625005, 0.87499994), (1.6250005, 0.87499994), (1.6875005, 0.87499994), (1.7500005, 0.87499994), (1.8125005, 0.87499994), (1.8750006, 0.87499994), (1.9375006, 0.87499994), (1.9999999, 0.8125), (0.062499948, 0.8125), (0.12499997, 0.8125), (0.18749993, 0.8125), (0.24999994, 0.8125), (0.31249997, 0.8125), (0.375, 0.8125), (0.4375, 0.8125), (0.50000006, 0.8125), (0.5625001, 0.8125), (0.62500006, 0.8125), (0.6875001, 0.8125), (0.7500001, 0.8125), (0.8125002, 0.8125), (0.8750002, 0.8125), (0.9375002, 0.8125), (1.0000002, 0.8125), (1.0625002, 0.8125), (1.1250002, 0.8125), (1.1875004, 0.8125), (1.2500004, 0.8125), (1.3125004, 0.8125), (1.3750004, 0.8125), (1.4375004, 0.8125), (1.5000005, 0.8125), (1.5625005, 0.8125), (1.6250005, 0.8125), (1.6875005, 0.8125), (1.7500005, 0.8125), (1.8125005, 0.8125), (1.8750006, 0.8125), (1.9375006, 0.8125), (1.9999999, 0.75), (0.062499948, 0.75), (0.12499997, 0.75), (0.18749993, 0.75), (0.24999994, 0.75), (0.31249997, 0.75), (0.375, 0.75), (0.4375, 0.75), (0.50000006, 0.75), (0.5625001, 0.75), (0.62500006, 0.75), (0.6875001, 0.75), (0.7500001, 0.75), (0.8125002, 0.75), (0.8750002, 0.75), (0.9375002, 0.75), (1.0000002, 0.75), (1.0625002, 0.75), (1.1250002, 0.75), (1.1875004, 0.75), (1.2500004, 0.75), (1.3125004, 0.75), (1.3750004, 0.75), (1.4375004, 0.75), (1.5000005, 0.75), (1.5625005, 0.75), (1.6250005, 0.75), (1.6875005, 0.75), (1.7500005, 0.75), (1.8125005, 0.75), (1.8750006, 0.75), (1.9375006, 0.75), (1.9999999, 0.68749994), (0.062499948, 0.68749994), (0.12499997, 0.68749994), (0.18749993, 0.68749994), (0.24999994, 0.68749994), (0.31249997, 0.68749994), (0.37500003, 0.68749994), (0.4375, 0.68749994), (0.50000006, 0.68749994), (0.56250006, 0.68749994), (0.6250001, 0.68749994), (0.6875001, 0.68749994), (0.7500001, 0.68749994), (0.8125002, 0.68749994), (0.8750002, 0.68749994), (0.9375002, 0.68749994), (1.0000002, 0.68749994), (1.0625002, 0.68749994), (1.1250002, 0.68749994), (1.1875004, 0.68749994), (1.2500004, 0.68749994), (1.3125004, 0.68749994), (1.3750004, 0.68749994), (1.4375004, 0.68749994), (1.5000005, 0.68749994), (1.5625005, 0.68749994), (1.6250005, 0.68749994), (1.6875005, 0.68749994), (1.7500005, 0.68749994), (1.8125005, 0.68749994), (1.8750006, 0.68749994), (1.9375006, 0.68749994), (1.9999999, 0.625), (0.062499948, 0.625), (0.12499997, 0.625), (0.18749993, 0.625), (0.24999994, 0.625), (0.31249997, 0.625), (0.37500003, 0.625), (0.4375, 0.625), (0.50000006, 0.625), (0.56250006, 0.625), (0.62500006, 0.625), (0.6875001, 0.625), (0.7500001, 0.625), (0.8125002, 0.625), (0.8750002, 0.625), (0.9375002, 0.625), (1.0000002, 0.625), (1.0625002, 0.625), (1.1250002, 0.625), (1.1875004, 0.625), (1.2500004, 0.625), (1.3125004, 0.625), (1.3750004, 0.625), (1.4375004, 0.625), (1.5000005, 0.625), (1.5625005, 0.625), (1.6250005, 0.625), (1.6875005, 0.625), (1.7500005, 0.625), (1.8125005, 0.625), (1.8750006, 0.625), (1.9375006, 0.625), (1.9999999, 0.5625), (0.062499948, 0.5625), (0.12499997, 0.5625), (0.18749993, 0.5625), (0.24999994, 0.5625), (0.31249997, 0.5625), (0.37500003, 0.5625), (0.4375, 0.5625), (0.50000006, 0.5625), (0.56250006, 0.5625), (0.62500006, 0.5625), (0.6875001, 0.5625), (0.7500001, 0.5625), (0.8125002, 0.5625), (0.8750002, 0.5625), (0.9375002, 0.5625), (1.0000002, 0.5625), (1.0625002, 0.5625), (1.1250002, 0.5625), (1.1875004, 0.5625), (1.2500004, 0.5625), (1.3125004, 0.5625), (1.3750004, 0.5625), (1.4375004, 0.5625), (1.5000005, 0.5625), (1.5625005, 0.5625), (1.6250005, 0.5625), (1.6875005, 0.5625), (1.7500007, 0.5625), (1.8125005, 0.5625), (1.8750006, 0.5625), (1.9375006, 0.5625), (1.9999999, 0.50000006), (0.062499948, 0.50000006), (0.12499997, 0.50000006), (0.18749993, 0.50000006), (0.24999994, 0.50000006), (0.31249997, 0.50000006), (0.37500003, 0.50000006), (0.4375, 0.50000006), (0.50000006, 0.50000006), (0.56250006, 0.50000006), (0.6250001, 0.50000006), (0.6875001, 0.50000006), (0.7500001, 0.50000006), (0.8125002, 0.50000006), (0.8750002, 0.50000006), (0.9375002, 0.50000006), (1.0000002, 0.50000006), (1.0625002, 0.50000006), (1.1250002, 0.50000006), (1.1875004, 0.50000006), (1.2500004, 0.50000006), (1.3125004, 0.50000006), (1.3750004, 0.50000006), (1.4375004, 0.50000006), (1.5000005, 0.50000006), (1.5625005, 0.50000006), (1.6250005, 0.50000006), (1.6875005, 0.50000006), (1.7500005, 0.50000006), (1.8125005, 0.50000006), (1.8750006, 0.50000006), (1.9375006, 0.50000006), (1.9999999, 0.43750006), (0.062499948, 0.4375), (0.12499997, 0.43750006), (0.18749993, 0.43750006), (0.24999994, 0.43750006), (0.31249997, 0.43750006), (0.37500003, 0.43750006), (0.4375, 0.4375), (0.50000006, 0.43750006), (0.56250006, 0.43750006), (0.6250001, 0.4375), (0.6875001, 0.43750006), (0.7500001, 0.43750006), (0.8125002, 0.43750006), (0.8750002, 0.43750006), (0.9375002, 0.4375), (1.0000002, 0.43750006), (1.0625002, 0.43750006), (1.1250002, 0.43750006), (1.1875004, 0.43750006), (1.2500004, 0.4375), (1.3125004, 0.43750006), (1.3750004, 0.43750006), (1.4375004, 0.4375), (1.5000005, 0.43750006), (1.5625005, 0.43750006), (1.6250005, 0.43750006), (1.6875005, 0.43750006), (1.7500005, 0.4375), (1.8125005, 0.43750006), (1.8750006, 0.43750006), (1.9375006, 0.43750006), (1.9999999, 0.37500006), (0.062499948, 0.37500006), (0.12499997, 0.37500006), (0.18749993, 0.37500003), (0.24999994, 0.37500006), (0.31249997, 0.37500003), (0.375, 0.37500006), (0.4375, 0.37500003), (0.50000006, 0.37500006), (0.56250006, 0.37500006), (0.62500006, 0.37500003), (0.6875001, 0.37500006), (0.7500001, 0.37500006), (0.8125002, 0.37500003), (0.8750002, 0.37500006), (0.9375002, 0.37500003), (1.0000002, 0.37500006), (1.0625002, 0.37500006), (1.1250002, 0.37500003), (1.1875004, 0.37500003), (1.2500004, 0.37500003), (1.3125004, 0.37500003), (1.3750004, 0.37500006), (1.4375004, 0.37500003), (1.5000005, 0.37500006), (1.5625005, 0.37500006), (1.6250005, 0.37500003), (1.6875005, 0.37500006), (1.7500005, 0.37500003), (1.8125005, 0.37500003), (1.8750006, 0.37500006), (1.9375006, 0.37500003), (1.9999999, 0.31250003), (0.062499948, 0.31250003), (0.12499997, 0.31250003), (0.18749993, 0.31250003), (0.24999994, 0.31250003), (0.31249997, 0.31250003), (0.37500003, 0.31250003), (0.4375, 0.31250003), (0.50000006, 0.31250003), (0.56250006, 0.31250003), (0.6250001, 0.31250003), (0.6875001, 0.31250003), (0.7500001, 0.31250003), (0.8125002, 0.31250003), (0.8750002, 0.31250003), (0.9375002, 0.31250003), (1.0000002, 0.31250003), (1.0625002, 0.31250003), (1.1250002, 0.31250003), (1.1875004, 0.31250003), (1.2500004, 0.31250003), (1.3125004, 0.31250003), (1.3750004, 0.31250003), (1.4375004, 0.3125), (1.5000005, 0.31250003), (1.5625005, 0.31250003), (1.6250005, 0.31250003), (1.6875005, 0.31250003), (1.7500005, 0.31250003), (1.8125005, 0.31250003), (1.8750006, 0.31250003), (1.9375006, 0.31250003), (1.9999999, 0.24999999), (0.062499948, 0.24999999), (0.12499997, 0.25000003), (0.18749993, 0.25000003), (0.24999994, 0.24999999), (0.31249997, 0.25000003), (0.375, 0.24999999), (0.4375, 0.25000003), (0.50000006, 0.24999999), (0.5625001, 0.24999999), (0.62500006, 0.25000003), (0.6875001, 0.24999999), (0.7500001, 0.24999999), (0.8125002, 0.25000003), (0.8750002, 0.24999999), (0.9375002, 0.24999999), (1.0000002, 0.24999999), (1.0625002, 0.24999999), (1.1250002, 0.24999999), (1.1875004, 0.24999999), (1.2500004, 0.24999999), (1.3125004, 0.25000003), (1.3750004, 0.24999999), (1.4375004, 0.25000003), (1.5000005, 0.24999999), (1.5625005, 0.24999999), (1.6250005, 0.24999999), (1.6875005, 0.24999999), (1.7500005, 0.24999999), (1.8125005, 0.25000003), (1.8750006, 0.25000003), (1.9375006, 0.25000003), (1.9999999, 0.1875), (0.062499948, 0.18749993), (0.12499997, 0.1875), (0.18749993, 0.1875), (0.24999994, 0.1875), (0.31249997, 0.1875), (0.375, 0.1875), (0.4375, 0.1875), (0.50000006, 0.1875), (0.5625001, 0.18749993), (0.62500006, 0.1875), (0.6875001, 0.1875), (0.7500001, 0.1875), (0.8125002, 0.1875), (0.8750002, 0.1875), (0.9375002, 0.1875), (1.0000002, 0.1875), (1.0625002, 0.1875), (1.1250002, 0.1875), (1.1875004, 0.1875), (1.2500004, 0.1875), (1.3125004, 0.1875), (1.3750004, 0.1875), (1.4375004, 0.1875), (1.5000005, 0.1875), (1.5625005, 0.1875), (1.6250005, 0.1875), (1.6875005, 0.1875), (1.7500005, 0.1875), (1.8125005, 0.1875), (1.8750006, 0.1875), (1.9375006, 0.1875), (1.9999999, 0.12499993), (0.062499948, 0.12499993), (0.12499997, 0.12499993), (0.18749993, 0.12499993), (0.24999994, 0.12499993), (0.31249997, 0.12499993), (0.375, 0.12499993), (0.4375, 0.12499993), (0.50000006, 0.12499993), (0.5625001, 0.12499993), (0.62500006, 0.12499993), (0.6875001, 0.12499993), (0.7500001, 0.12499993), (0.8125002, 0.12499993), (0.8750002, 0.12499993), (0.9375002, 0.12499993), (1.0000002, 0.12499993), (1.0625002, 0.12499993), (1.1250002, 0.12499993), (1.1875004, 0.12499993), (1.2500004, 0.12499993), (1.3125004, 0.12499993), (1.3750004, 0.12499993), (1.4375004, 0.12499993), (1.5000005, 0.12499993), (1.5625005, 0.12499993), (1.6250005, 0.12499993), (1.6875005, 0.12499993), (1.7500005, 0.12499993), (1.8125005, 0.12499993), (1.8750006, 0.12499993), (1.9375006, 0.12499993), (1.9999999, 0.062499758), (0.062499948, 0.062499758), (0.12499997, 0.062499758), (0.18749993, 0.062499758), (0.24999994, 0.062499758), (0.31249997, 0.062499758), (0.375, 0.062499758), (0.43750006, 0.062499758), (0.50000006, 0.062499758), (0.5625001, 0.062499758), (0.62500006, 0.062499758), (0.6875001, 0.062499758), (0.7500001, 0.062499758), (0.8125002, 0.062499758), (0.8750002, 0.062499758), (0.9375002, 0.062499758), (1.0000002, 0.062499758), (1.0625002, 0.062499758), (1.1250002, 0.062499758), (1.1875004, 0.062499758), (1.2500004, 0.062499758), (1.3125004, 0.062499758), (1.3750004, 0.062499758), (1.4375004, 0.062499758), (1.5000005, 0.062499758), (1.5625005, 0.062499758), (1.6250005, 0.062499758), (1.6875005, 0.062499758), (1.7500005, 0.062499758), (1.8125005, 0.062499758), (1.8750006, 0.062499758), (1.9375006, 0.062499758), (1.9687502, 0), (0.031249914, 1), (-1.1920929e-7, 0.9375001), (0.093749955, 1), (0.15624994, 1), (0.21874994, 1), (0.28124994, 1), (0.34375, 1), (0.40625003, 1), (0.46875006, 1), (0.53125006, 1), (0.59375006, 1), (0.6562501, 1), (0.7187501, 1), (0.7812501, 1), (0.8437502, 1), (0.9062502, 1), (0.96875024, 1), (1.0312502, 1), (1.0937502, 1), (1.1562502, 1), (1.2187504, 1), (1.2812504, 1), (1.3437504, 1), (1.4062504, 1), (1.4687505, 1), (1.5312505, 1), (1.5937505, 1), (1.6562505, 1), (1.7187505, 1), (1.7812505, 1), (1.8437505, 1), (1.9062506, 1), (-1.1920929e-7, 0.9375001), (-1.1920929e-7, 0.87499994), (-1.1920929e-7, 0.87499994), (-1.1920929e-7, 0.8125), (-1.1920929e-7, 0.8125), (-1.1920929e-7, 0.75), (-1.1920929e-7, 0.75), (-1.1920929e-7, 0.68749994), (-1.1920929e-7, 0.68749994), (-1.1920929e-7, 0.625), (-1.1920929e-7, 0.625), (-1.1920929e-7, 0.5625), (-1.1920929e-7, 0.5625), (-1.1920929e-7, 0.50000006), (-1.1920929e-7, 0.50000006), (-1.1920929e-7, 0.43750006), (-1.1920929e-7, 0.43750006), (-1.1920929e-7, 0.37500006), (-1.1920929e-7, 0.37500006), (-1.1920929e-7, 0.31250003), (-1.1920929e-7, 0.31250003), (-1.1920929e-7, 0.24999999), (-1.1920929e-7, 0.24999999), (-1.1920929e-7, 0.1875), (-1.1920929e-7, 0.1875), (-1.1920929e-7, 0.12499993), (-1.1920929e-7, 0.12499993), (-1.1920929e-7, 0.062499758), (0.031249914, 0), (-1.1920929e-7, 0.062499758), (0.093749955, 0), (0.15624994, 0), (0.21874994, 0), (0.28124994, 0), (0.34375, 0), (0.40625003, 0), (0.46875006, 0), (0.5312501, 0), (0.5937501, 0), (0.6562501, 0), (0.7187501, 0), (0.7812501, 0), (0.8437502, 0), (0.9062502, 0), (0.96875024, 0), (1.0312502, 0), (1.0937502, 0), (1.1562502, 0), (1.2187504, 0), (1.2812504, 0), (1.3437504, 0), (1.4062504, 0), (1.4687505, 0), (1.5312505, 0), (1.5937505, 0), (1.6562505, 0), (1.7187505, 0), (1.7812505, 0), (1.8437505, 0), (1.9062506, 0)] ( + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [482, 483, 2, 484, 2, 3, 485, 3, 4, 486, 4, 5, 487, 5, 6, 488, 6, 7, 489, 7, 8, 490, 8, 9, 491, 9, 10, 492, 10, 11, 493, 11, 12, 494, 12, 13, 495, 13, 14, 496, 14, 15, 497, 15, 16, 498, 16, 17, 499, 17, 18, 500, 18, 19, 501, 19, 20, 502, 20, 21, 503, 21, 22, 504, 22, 23, 505, 23, 24, 506, 24, 25, 507, 25, 26, 508, 26, 27, 509, 27, 28, 510, 28, 29, 511, 29, 30, 512, 30, 31, 513, 31, 32, 0, 32, 1, 514, 515, 34, 2, 2, 34, 35, 3, 3, 35, 36, 4, 4, 36, 37, 5, 5, 37, 38, 6, 6, 38, 39, 7, 7, 39, 40, 8, 8, 40, 41, 9, 9, 41, 42, 10, 10, 42, 43, 11, 11, 43, 44, 12, 12, 44, 45, 13, 13, 45, 46, 14, 14, 46, 47, 15, 15, 47, 48, 16, 16, 48, 49, 17, 17, 49, 50, 18, 18, 50, 51, 19, 19, 51, 52, 20, 20, 52, 53, 21, 21, 53, 54, 22, 22, 54, 55, 23, 23, 55, 56, 24, 24, 56, 57, 25, 25, 57, 58, 26, 26, 58, 59, 27, 27, 59, 60, 28, 28, 60, 61, 29, 29, 61, 62, 30, 30, 62, 63, 31, 31, 63, 64, 32, 32, 64, 33, 1, 516, 517, 66, 34, 34, 66, 67, 35, 35, 67, 68, 36, 36, 68, 69, 37, 37, 69, 70, 38, 38, 70, 71, 39, 39, 71, 72, 40, 40, 72, 73, 41, 41, 73, 74, 42, 42, 74, 75, 43, 43, 75, 76, 44, 44, 76, 77, 45, 45, 77, 78, 46, 46, 78, 79, 47, 47, 79, 80, 48, 48, 80, 81, 49, 49, 81, 82, 50, 50, 82, 83, 51, 51, 83, 84, 52, 52, 84, 85, 53, 53, 85, 86, 54, 54, 86, 87, 55, 55, 87, 88, 56, 56, 88, 89, 57, 57, 89, 90, 58, 58, 90, 91, 59, 59, 91, 92, 60, 60, 92, 93, 61, 61, 93, 94, 62, 62, 94, 95, 63, 63, 95, 96, 64, 64, 96, 65, 33, 518, 519, 98, 66, 66, 98, 99, 67, 67, 99, 100, 68, 68, 100, 101, 69, 69, 101, 102, 70, 70, 102, 103, 71, 71, 103, 104, 72, 72, 104, 105, 73, 73, 105, 106, 74, 74, 106, 107, 75, 75, 107, 108, 76, 76, 108, 109, 77, 77, 109, 110, 78, 78, 110, 111, 79, 79, 111, 112, 80, 80, 112, 113, 81, 81, 113, 114, 82, 82, 114, 115, 83, 83, 115, 116, 84, 84, 116, 117, 85, 85, 117, 118, 86, 86, 118, 119, 87, 87, 119, 120, 88, 88, 120, 121, 89, 89, 121, 122, 90, 90, 122, 123, 91, 91, 123, 124, 92, 92, 124, 125, 93, 93, 125, 126, 94, 94, 126, 127, 95, 95, 127, 128, 96, 96, 128, 97, 65, 520, 521, 130, 98, 98, 130, 131, 99, 99, 131, 132, 100, 100, 132, 133, 101, 101, 133, 134, 102, 102, 134, 135, 103, 103, 135, 136, 104, 104, 136, 137, 105, 105, 137, 138, 106, 106, 138, 139, 107, 107, 139, 140, 108, 108, 140, 141, 109, 109, 141, 142, 110, 110, 142, 143, 111, 111, 143, 144, 112, 112, 144, 145, 113, 113, 145, 146, 114, 114, 146, 147, 115, 115, 147, 148, 116, 116, 148, 149, 117, 117, 149, 150, 118, 118, 150, 151, 119, 119, 151, 152, 120, 120, 152, 153, 121, 121, 153, 154, 122, 122, 154, 155, 123, 123, 155, 156, 124, 124, 156, 157, 125, 125, 157, 158, 126, 126, 158, 159, 127, 127, 159, 160, 128, 128, 160, 129, 97, 522, 523, 162, 130, 130, 162, 163, 131, 131, 163, 164, 132, 132, 164, 165, 133, 133, 165, 166, 134, 134, 166, 167, 135, 135, 167, 168, 136, 136, 168, 169, 137, 137, 169, 170, 138, 138, 170, 171, 139, 139, 171, 172, 140, 140, 172, 173, 141, 141, 173, 174, 142, 142, 174, 175, 143, 143, 175, 176, 144, 144, 176, 177, 145, 145, 177, 178, 146, 146, 178, 179, 147, 147, 179, 180, 148, 148, 180, 181, 149, 149, 181, 182, 150, 150, 182, 183, 151, 151, 183, 184, 152, 152, 184, 185, 153, 153, 185, 186, 154, 154, 186, 187, 155, 155, 187, 188, 156, 156, 188, 189, 157, 157, 189, 190, 158, 158, 190, 191, 159, 159, 191, 192, 160, 160, 192, 161, 129, 524, 525, 194, 162, 162, 194, 195, 163, 163, 195, 196, 164, 164, 196, 197, 165, 165, 197, 198, 166, 166, 198, 199, 167, 167, 199, 200, 168, 168, 200, 201, 169, 169, 201, 202, 170, 170, 202, 203, 171, 171, 203, 204, 172, 172, 204, 205, 173, 173, 205, 206, 174, 174, 206, 207, 175, 175, 207, 208, 176, 176, 208, 209, 177, 177, 209, 210, 178, 178, 210, 211, 179, 179, 211, 212, 180, 180, 212, 213, 181, 181, 213, 214, 182, 182, 214, 215, 183, 183, 215, 216, 184, 184, 216, 217, 185, 185, 217, 218, 186, 186, 218, 219, 187, 187, 219, 220, 188, 188, 220, 221, 189, 189, 221, 222, 190, 190, 222, 223, 191, 191, 223, 224, 192, 192, 224, 193, 161, 526, 527, 226, 194, 194, 226, 227, 195, 195, 227, 228, 196, 196, 228, 229, 197, 197, 229, 230, 198, 198, 230, 231, 199, 199, 231, 232, 200, 200, 232, 233, 201, 201, 233, 234, 202, 202, 234, 235, 203, 203, 235, 236, 204, 204, 236, 237, 205, 205, 237, 238, 206, 206, 238, 239, 207, 207, 239, 240, 208, 208, 240, 241, 209, 209, 241, 242, 210, 210, 242, 243, 211, 211, 243, 244, 212, 212, 244, 245, 213, 213, 245, 246, 214, 214, 246, 247, 215, 215, 247, 248, 216, 216, 248, 249, 217, 217, 249, 250, 218, 218, 250, 251, 219, 219, 251, 252, 220, 220, 252, 253, 221, 221, 253, 254, 222, 222, 254, 255, 223, 223, 255, 256, 224, 224, 256, 225, 193, 528, 529, 258, 226, 226, 258, 259, 227, 227, 259, 260, 228, 228, 260, 261, 229, 229, 261, 262, 230, 230, 262, 263, 231, 231, 263, 264, 232, 232, 264, 265, 233, 233, 265, 266, 234, 234, 266, 267, 235, 235, 267, 268, 236, 236, 268, 269, 237, 237, 269, 270, 238, 238, 270, 271, 239, 239, 271, 272, 240, 240, 272, 273, 241, 241, 273, 274, 242, 242, 274, 275, 243, 243, 275, 276, 244, 244, 276, 277, 245, 245, 277, 278, 246, 246, 278, 279, 247, 247, 279, 280, 248, 248, 280, 281, 249, 249, 281, 282, 250, 250, 282, 283, 251, 251, 283, 284, 252, 252, 284, 285, 253, 253, 285, 286, 254, 254, 286, 287, 255, 255, 287, 288, 256, 256, 288, 257, 225, 530, 531, 290, 258, 258, 290, 291, 259, 259, 291, 292, 260, 260, 292, 293, 261, 261, 293, 294, 262, 262, 294, 295, 263, 263, 295, 296, 264, 264, 296, 297, 265, 265, 297, 298, 266, 266, 298, 299, 267, 267, 299, 300, 268, 268, 300, 301, 269, 269, 301, 302, 270, 270, 302, 303, 271, 271, 303, 304, 272, 272, 304, 305, 273, 273, 305, 306, 274, 274, 306, 307, 275, 275, 307, 308, 276, 276, 308, 309, 277, 277, 309, 310, 278, 278, 310, 311, 279, 279, 311, 312, 280, 280, 312, 313, 281, 281, 313, 314, 282, 282, 314, 315, 283, 283, 315, 316, 284, 284, 316, 317, 285, 285, 317, 318, 286, 286, 318, 319, 287, 287, 319, 320, 288, 288, 320, 289, 257, 532, 533, 322, 290, 290, 322, 323, 291, 291, 323, 324, 292, 292, 324, 325, 293, 293, 325, 326, 294, 294, 326, 327, 295, 295, 327, 328, 296, 296, 328, 329, 297, 297, 329, 330, 298, 298, 330, 331, 299, 299, 331, 332, 300, 300, 332, 333, 301, 301, 333, 334, 302, 302, 334, 335, 303, 303, 335, 336, 304, 304, 336, 337, 305, 305, 337, 338, 306, 306, 338, 339, 307, 307, 339, 340, 308, 308, 340, 341, 309, 309, 341, 342, 310, 310, 342, 343, 311, 311, 343, 344, 312, 312, 344, 345, 313, 313, 345, 346, 314, 314, 346, 347, 315, 315, 347, 348, 316, 316, 348, 349, 317, 317, 349, 350, 318, 318, 350, 351, 319, 319, 351, 352, 320, 320, 352, 321, 289, 534, 535, 354, 322, 322, 354, 355, 323, 323, 355, 356, 324, 324, 356, 357, 325, 325, 357, 358, 326, 326, 358, 359, 327, 327, 359, 360, 328, 328, 360, 361, 329, 329, 361, 362, 330, 330, 362, 363, 331, 331, 363, 364, 332, 332, 364, 365, 333, 333, 365, 366, 334, 334, 366, 367, 335, 335, 367, 368, 336, 336, 368, 369, 337, 337, 369, 370, 338, 338, 370, 371, 339, 339, 371, 372, 340, 340, 372, 373, 341, 341, 373, 374, 342, 342, 374, 375, 343, 343, 375, 376, 344, 344, 376, 377, 345, 345, 377, 378, 346, 346, 378, 379, 347, 347, 379, 380, 348, 348, 380, 381, 349, 349, 381, 382, 350, 350, 382, 383, 351, 351, 383, 384, 352, 352, 384, 353, 321, 536, 537, 386, 354, 354, 386, 387, 355, 355, 387, 388, 356, 356, 388, 389, 357, 357, 389, 390, 358, 358, 390, 391, 359, 359, 391, 392, 360, 360, 392, 393, 361, 361, 393, 394, 362, 362, 394, 395, 363, 363, 395, 396, 364, 364, 396, 397, 365, 365, 397, 398, 366, 366, 398, 399, 367, 367, 399, 400, 368, 368, 400, 401, 369, 369, 401, 402, 370, 370, 402, 403, 371, 371, 403, 404, 372, 372, 404, 405, 373, 373, 405, 406, 374, 374, 406, 407, 375, 375, 407, 408, 376, 376, 408, 409, 377, 377, 409, 410, 378, 378, 410, 411, 379, 379, 411, 412, 380, 380, 412, 413, 381, 381, 413, 414, 382, 382, 414, 415, 383, 383, 415, 416, 384, 384, 416, 385, 353, 538, 539, 418, 386, 386, 418, 419, 387, 387, 419, 420, 388, 388, 420, 421, 389, 389, 421, 422, 390, 390, 422, 423, 391, 391, 423, 424, 392, 392, 424, 425, 393, 393, 425, 426, 394, 394, 426, 427, 395, 395, 427, 428, 396, 396, 428, 429, 397, 397, 429, 430, 398, 398, 430, 431, 399, 399, 431, 432, 400, 400, 432, 433, 401, 401, 433, 434, 402, 402, 434, 435, 403, 403, 435, 436, 404, 404, 436, 437, 405, 405, 437, 438, 406, 406, 438, 439, 407, 407, 439, 440, 408, 408, 440, 441, 409, 409, 441, 442, 410, 410, 442, 443, 411, 411, 443, 444, 412, 412, 444, 445, 413, 413, 445, 446, 414, 414, 446, 447, 415, 415, 447, 448, 416, 416, 448, 417, 385, 540, 541, 450, 418, 418, 450, 451, 419, 419, 451, 452, 420, 420, 452, 453, 421, 421, 453, 454, 422, 422, 454, 455, 423, 423, 455, 456, 424, 424, 456, 457, 425, 425, 457, 458, 426, 426, 458, 459, 427, 427, 459, 460, 428, 428, 460, 461, 429, 429, 461, 462, 430, 430, 462, 463, 431, 431, 463, 464, 432, 432, 464, 465, 433, 433, 465, 466, 434, 434, 466, 467, 435, 435, 467, 468, 436, 436, 468, 469, 437, 437, 469, 470, 438, 438, 470, 471, 439, 439, 471, 472, 440, 440, 472, 473, 441, 441, 473, 474, 442, 442, 474, 475, 443, 443, 475, 476, 444, 444, 476, 477, 445, 445, 477, 478, 446, 446, 478, 479, 447, 447, 479, 480, 448, 448, 480, 449, 417, 542, 450, 543, 544, 451, 450, 545, 452, 451, 546, 453, 452, 547, 454, 453, 548, 455, 454, 549, 456, 455, 550, 457, 456, 551, 458, 457, 552, 459, 458, 553, 460, 459, 554, 461, 460, 555, 462, 461, 556, 463, 462, 557, 464, 463, 558, 465, 464, 559, 466, 465, 560, 467, 466, 561, 468, 467, 562, 469, 468, 563, 470, 469, 564, 471, 470, 565, 472, 471, 566, 473, 472, 567, 474, 473, 568, 475, 474, 569, 476, 475, 570, 477, 476, 571, 478, 477, 572, 479, 478, 573, 480, 479, 481, 449, 480] + uniform token subdivisionScheme = "none" + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 0, -1, 0), (0, 1, 0, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + +} + diff --git a/project_templates/sample_scene/content/meshes/teapot.usda b/project_templates/sample_scene/content/meshes/teapot.usda new file mode 100644 index 00000000..6e0bb40e --- /dev/null +++ b/project_templates/sample_scene/content/meshes/teapot.usda @@ -0,0 +1,25 @@ +#usda 1.0 +( + defaultPrim = "TeapotMesh" + metersPerUnit = 1 + upAxis = "Z" +) + +def Mesh "TeapotMesh" +{ + float3[] extent = [(-1.5, 0, -1), (1.7165772, 1.575, 1)] + int[] faceVertexCounts = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + int[] faceVertexIndices = [0, 9, 10, 1, 1, 10, 11, 2, 2, 11, 12, 3, 3, 12, 13, 4, 4, 13, 14, 5, 5, 14, 15, 6, 6, 15, 16, 7, 7, 16, 17, 8, 9, 18, 19, 10, 10, 19, 20, 11, 11, 20, 21, 12, 12, 21, 22, 13, 13, 22, 23, 14, 14, 23, 24, 15, 15, 24, 25, 16, 16, 25, 26, 17, 18, 27, 28, 19, 19, 28, 29, 20, 20, 29, 30, 21, 21, 30, 31, 22, 22, 31, 32, 23, 23, 32, 33, 24, 24, 33, 34, 25, 25, 34, 35, 26, 27, 36, 37, 28, 28, 37, 38, 29, 29, 38, 39, 30, 30, 39, 40, 31, 31, 40, 41, 32, 32, 41, 42, 33, 33, 42, 43, 34, 34, 43, 44, 35, 36, 45, 46, 37, 37, 46, 47, 38, 38, 47, 48, 39, 39, 48, 49, 40, 40, 49, 50, 41, 41, 50, 51, 42, 42, 51, 52, 43, 43, 52, 53, 44, 45, 54, 55, 46, 46, 55, 56, 47, 47, 56, 57, 48, 48, 57, 58, 49, 49, 58, 59, 50, 50, 59, 60, 51, 51, 60, 61, 52, 52, 61, 62, 53, 54, 63, 64, 55, 55, 64, 65, 56, 56, 65, 66, 57, 57, 66, 67, 58, 58, 67, 68, 59, 59, 68, 69, 60, 60, 69, 70, 61, 61, 70, 71, 62, 63, 72, 73, 64, 64, 73, 74, 65, 65, 74, 75, 66, 66, 75, 76, 67, 67, 76, 77, 68, 68, 77, 78, 69, 69, 78, 79, 70, 70, 79, 80, 71, 72, 81, 82, 73, 73, 82, 83, 74, 74, 83, 84, 75, 75, 84, 85, 76, 76, 85, 86, 77, 77, 86, 87, 78, 78, 87, 88, 79, 79, 88, 89, 80, 81, 90, 91, 82, 82, 91, 92, 83, 83, 92, 93, 84, 84, 93, 94, 85, 85, 94, 95, 86, 86, 95, 96, 87, 87, 96, 97, 88, 88, 97, 98, 89, 90, 99, 100, 91, 91, 100, 101, 92, 92, 101, 102, 93, 93, 102, 103, 94, 94, 103, 104, 95, 95, 104, 105, 96, 96, 105, 106, 97, 97, 106, 107, 98, 99, 108, 109, 100, 100, 109, 110, 101, 101, 110, 111, 102, 102, 111, 112, 103, 103, 112, 113, 104, 104, 113, 114, 105, 105, 114, 115, 106, 106, 115, 116, 107, 108, 117, 118, 109, 109, 118, 119, 110, 110, 119, 120, 111, 111, 120, 121, 112, 112, 121, 122, 113, 113, 122, 123, 114, 114, 123, 124, 115, 115, 124, 125, 116, 117, 126, 127, 118, 118, 127, 128, 119, 119, 128, 129, 120, 120, 129, 130, 121, 121, 130, 131, 122, 122, 131, 132, 123, 123, 132, 133, 124, 124, 133, 134, 125, 126, 135, 136, 127, 127, 136, 137, 128, 128, 137, 138, 129, 129, 138, 139, 130, 130, 139, 140, 131, 131, 140, 141, 132, 132, 141, 142, 133, 133, 142, 143, 134, 135, 144, 145, 136, 136, 145, 146, 137, 137, 146, 147, 138, 138, 147, 148, 139, 139, 148, 149, 140, 140, 149, 150, 141, 141, 150, 151, 142, 142, 151, 152, 143, 144, 153, 154, 145, 145, 154, 155, 146, 146, 155, 156, 147, 147, 156, 157, 148, 148, 157, 158, 149, 149, 158, 159, 150, 150, 159, 160, 151, 151, 160, 161, 152, 153, 162, 163, 154, 154, 163, 164, 155, 155, 164, 165, 156, 156, 165, 166, 157, 157, 166, 167, 158, 158, 167, 168, 159, 159, 168, 169, 160, 160, 169, 170, 161, 162, 171, 172, 163, 163, 172, 173, 164, 164, 173, 174, 165, 165, 174, 175, 166, 166, 175, 176, 167, 167, 176, 177, 168, 168, 177, 178, 169, 169, 178, 179, 170, 171, 180, 181, 172, 172, 181, 182, 173, 173, 182, 183, 174, 174, 183, 184, 175, 175, 184, 185, 176, 176, 185, 186, 177, 177, 186, 187, 178, 178, 187, 188, 179, 180, 189, 190, 181, 181, 190, 191, 182, 182, 191, 192, 183, 183, 192, 193, 184, 184, 193, 194, 185, 185, 194, 195, 186, 186, 195, 196, 187, 187, 196, 197, 188, 189, 198, 199, 190, 190, 199, 200, 191, 191, 200, 201, 192, 192, 201, 202, 193, 193, 202, 203, 194, 194, 203, 204, 195, 195, 204, 205, 196, 196, 205, 206, 197, 198, 207, 208, 199, 199, 208, 209, 200, 200, 209, 210, 201, 201, 210, 211, 202, 202, 211, 212, 203, 203, 212, 213, 204, 204, 213, 214, 205, 205, 214, 215, 206, 207, 216, 217, 208, 208, 217, 218, 209, 209, 218, 219, 210, 210, 219, 220, 211, 211, 220, 221, 212, 212, 221, 222, 213, 213, 222, 223, 214, 214, 223, 224, 215, 216, 225, 226, 217, 217, 226, 227, 218, 218, 227, 228, 219, 219, 228, 229, 220, 220, 229, 230, 221, 221, 230, 231, 222, 222, 231, 232, 223, 223, 232, 233, 224, 225, 234, 235, 226, 226, 235, 236, 227, 227, 236, 237, 228, 228, 237, 238, 229, 229, 238, 239, 230, 230, 239, 240, 231, 231, 240, 241, 232, 232, 241, 242, 233, 234, 243, 244, 235, 235, 244, 245, 236, 236, 245, 246, 237, 237, 246, 247, 238, 238, 247, 248, 239, 239, 248, 249, 240, 240, 249, 250, 241, 241, 250, 251, 242, 243, 252, 253, 244, 244, 253, 254, 245, 245, 254, 255, 246, 246, 255, 256, 247, 247, 256, 257, 248, 248, 257, 258, 249, 249, 258, 259, 250, 250, 259, 260, 251, 252, 261, 262, 253, 253, 262, 263, 254, 254, 263, 264, 255, 255, 264, 265, 256, 256, 265, 266, 257, 257, 266, 267, 258, 258, 267, 268, 259, 259, 268, 269, 260, 261, 270, 271, 262, 262, 271, 272, 263, 263, 272, 273, 264, 264, 273, 274, 265, 265, 274, 275, 266, 266, 275, 276, 267, 267, 276, 277, 268, 268, 277, 278, 269, 270, 279, 280, 271, 271, 280, 281, 272, 272, 281, 282, 273, 273, 282, 283, 274, 274, 283, 284, 275, 275, 284, 285, 276, 276, 285, 286, 277, 277, 286, 287, 278, 279, 0, 1, 280, 280, 1, 2, 281, 281, 2, 3, 282, 282, 3, 4, 283, 283, 4, 5, 284, 284, 5, 6, 285, 285, 6, 7, 286, 286, 7, 8, 287, 8, 17, 296, 288, 288, 296, 297, 289, 289, 297, 298, 290, 290, 298, 299, 291, 291, 299, 300, 292, 292, 300, 301, 293, 293, 301, 302, 294, 294, 302, 303, 295, 17, 26, 304, 296, 296, 304, 305, 297, 297, 305, 306, 298, 298, 306, 307, 299, 299, 307, 308, 300, 300, 308, 309, 301, 301, 309, 310, 302, 302, 310, 311, 303, 26, 35, 312, 304, 304, 312, 313, 305, 305, 313, 314, 306, 306, 314, 315, 307, 307, 315, 316, 308, 308, 316, 317, 309, 309, 317, 318, 310, 310, 318, 319, 311, 35, 44, 320, 312, 312, 320, 321, 313, 313, 321, 322, 314, 314, 322, 323, 315, 315, 323, 324, 316, 316, 324, 325, 317, 317, 325, 326, 318, 318, 326, 327, 319, 44, 53, 328, 320, 320, 328, 329, 321, 321, 329, 330, 322, 322, 330, 331, 323, 323, 331, 332, 324, 324, 332, 333, 325, 325, 333, 334, 326, 326, 334, 335, 327, 53, 62, 336, 328, 328, 336, 337, 329, 329, 337, 338, 330, 330, 338, 339, 331, 331, 339, 340, 332, 332, 340, 341, 333, 333, 341, 342, 334, 334, 342, 343, 335, 62, 71, 344, 336, 336, 344, 345, 337, 337, 345, 346, 338, 338, 346, 347, 339, 339, 347, 348, 340, 340, 348, 349, 341, 341, 349, 350, 342, 342, 350, 351, 343, 71, 80, 352, 344, 344, 352, 353, 345, 345, 353, 354, 346, 346, 354, 355, 347, 347, 355, 356, 348, 348, 356, 357, 349, 349, 357, 358, 350, 350, 358, 359, 351, 80, 89, 360, 352, 352, 360, 361, 353, 353, 361, 362, 354, 354, 362, 363, 355, 355, 363, 364, 356, 356, 364, 365, 357, 357, 365, 366, 358, 358, 366, 367, 359, 89, 98, 368, 360, 360, 368, 369, 361, 361, 369, 370, 362, 362, 370, 371, 363, 363, 371, 372, 364, 364, 372, 373, 365, 365, 373, 374, 366, 366, 374, 375, 367, 98, 107, 376, 368, 368, 376, 377, 369, 369, 377, 378, 370, 370, 378, 379, 371, 371, 379, 380, 372, 372, 380, 381, 373, 373, 381, 382, 374, 374, 382, 383, 375, 107, 116, 384, 376, 376, 384, 385, 377, 377, 385, 386, 378, 378, 386, 387, 379, 379, 387, 388, 380, 380, 388, 389, 381, 381, 389, 390, 382, 382, 390, 391, 383, 116, 125, 392, 384, 384, 392, 393, 385, 385, 393, 394, 386, 386, 394, 395, 387, 387, 395, 396, 388, 388, 396, 397, 389, 389, 397, 398, 390, 390, 398, 399, 391, 125, 134, 400, 392, 392, 400, 401, 393, 393, 401, 402, 394, 394, 402, 403, 395, 395, 403, 404, 396, 396, 404, 405, 397, 397, 405, 406, 398, 398, 406, 407, 399, 134, 143, 408, 400, 400, 408, 409, 401, 401, 409, 410, 402, 402, 410, 411, 403, 403, 411, 412, 404, 404, 412, 413, 405, 405, 413, 414, 406, 406, 414, 415, 407, 143, 152, 416, 408, 408, 416, 417, 409, 409, 417, 418, 410, 410, 418, 419, 411, 411, 419, 420, 412, 412, 420, 421, 413, 413, 421, 422, 414, 414, 422, 423, 415, 152, 161, 424, 416, 416, 424, 425, 417, 417, 425, 426, 418, 418, 426, 427, 419, 419, 427, 428, 420, 420, 428, 429, 421, 421, 429, 430, 422, 422, 430, 431, 423, 161, 170, 432, 424, 424, 432, 433, 425, 425, 433, 434, 426, 426, 434, 435, 427, 427, 435, 436, 428, 428, 436, 437, 429, 429, 437, 438, 430, 430, 438, 439, 431, 170, 179, 440, 432, 432, 440, 441, 433, 433, 441, 442, 434, 434, 442, 443, 435, 435, 443, 444, 436, 436, 444, 445, 437, 437, 445, 446, 438, 438, 446, 447, 439, 179, 188, 448, 440, 440, 448, 449, 441, 441, 449, 450, 442, 442, 450, 451, 443, 443, 451, 452, 444, 444, 452, 453, 445, 445, 453, 454, 446, 446, 454, 455, 447, 188, 197, 456, 448, 448, 456, 457, 449, 449, 457, 458, 450, 450, 458, 459, 451, 451, 459, 460, 452, 452, 460, 461, 453, 453, 461, 462, 454, 454, 462, 463, 455, 197, 206, 464, 456, 456, 464, 465, 457, 457, 465, 466, 458, 458, 466, 467, 459, 459, 467, 468, 460, 460, 468, 469, 461, 461, 469, 470, 462, 462, 470, 471, 463, 206, 215, 472, 464, 464, 472, 473, 465, 465, 473, 474, 466, 466, 474, 475, 467, 467, 475, 476, 468, 468, 476, 477, 469, 469, 477, 478, 470, 470, 478, 479, 471, 215, 224, 480, 472, 472, 480, 481, 473, 473, 481, 482, 474, 474, 482, 483, 475, 475, 483, 484, 476, 476, 484, 485, 477, 477, 485, 486, 478, 478, 486, 487, 479, 224, 233, 488, 480, 480, 488, 489, 481, 481, 489, 490, 482, 482, 490, 491, 483, 483, 491, 492, 484, 484, 492, 493, 485, 485, 493, 494, 486, 486, 494, 495, 487, 233, 242, 496, 488, 488, 496, 497, 489, 489, 497, 498, 490, 490, 498, 499, 491, 491, 499, 500, 492, 492, 500, 501, 493, 493, 501, 502, 494, 494, 502, 503, 495, 242, 251, 504, 496, 496, 504, 505, 497, 497, 505, 506, 498, 498, 506, 507, 499, 499, 507, 508, 500, 500, 508, 509, 501, 501, 509, 510, 502, 502, 510, 511, 503, 251, 260, 512, 504, 504, 512, 513, 505, 505, 513, 514, 506, 506, 514, 515, 507, 507, 515, 516, 508, 508, 516, 517, 509, 509, 517, 518, 510, 510, 518, 519, 511, 260, 269, 520, 512, 512, 520, 521, 513, 513, 521, 522, 514, 514, 522, 523, 515, 515, 523, 524, 516, 516, 524, 525, 517, 517, 525, 526, 518, 518, 526, 527, 519, 269, 278, 528, 520, 520, 528, 529, 521, 521, 529, 530, 522, 522, 530, 531, 523, 523, 531, 532, 524, 524, 532, 533, 525, 525, 533, 534, 526, 526, 534, 535, 527, 278, 287, 536, 528, 528, 536, 537, 529, 529, 537, 538, 530, 530, 538, 539, 531, 531, 539, 540, 532, 532, 540, 541, 533, 533, 541, 542, 534, 534, 542, 543, 535, 287, 8, 288, 536, 536, 288, 289, 537, 537, 289, 290, 538, 538, 290, 291, 539, 539, 291, 292, 540, 540, 292, 293, 541, 541, 293, 294, 542, 542, 294, 295, 543, 295, 303, 552, 544, 544, 552, 553, 545, 545, 553, 554, 546, 546, 554, 555, 547, 547, 555, 556, 548, 548, 556, 557, 549, 549, 557, 558, 550, 550, 558, 559, 551, 303, 311, 560, 552, 552, 560, 561, 553, 553, 561, 562, 554, 554, 562, 563, 555, 555, 563, 564, 556, 556, 564, 565, 557, 557, 565, 566, 558, 558, 566, 567, 559, 311, 319, 568, 560, 560, 568, 569, 561, 561, 569, 570, 562, 562, 570, 571, 563, 563, 571, 572, 564, 564, 572, 573, 565, 565, 573, 574, 566, 566, 574, 575, 567, 319, 327, 576, 568, 568, 576, 577, 569, 569, 577, 578, 570, 570, 578, 579, 571, 571, 579, 580, 572, 572, 580, 581, 573, 573, 581, 582, 574, 574, 582, 583, 575, 327, 335, 584, 576, 576, 584, 585, 577, 577, 585, 586, 578, 578, 586, 587, 579, 579, 587, 588, 580, 580, 588, 589, 581, 581, 589, 590, 582, 582, 590, 591, 583, 335, 343, 592, 584, 584, 592, 593, 585, 585, 593, 594, 586, 586, 594, 595, 587, 587, 595, 596, 588, 588, 596, 597, 589, 589, 597, 598, 590, 590, 598, 599, 591, 343, 351, 600, 592, 592, 600, 601, 593, 593, 601, 602, 594, 594, 602, 603, 595, 595, 603, 604, 596, 596, 604, 605, 597, 597, 605, 606, 598, 598, 606, 607, 599, 351, 359, 608, 600, 600, 608, 609, 601, 601, 609, 610, 602, 602, 610, 611, 603, 603, 611, 612, 604, 604, 612, 613, 605, 605, 613, 614, 606, 606, 614, 615, 607, 359, 367, 616, 608, 608, 616, 617, 609, 609, 617, 618, 610, 610, 618, 619, 611, 611, 619, 620, 612, 612, 620, 621, 613, 613, 621, 622, 614, 614, 622, 623, 615, 367, 375, 624, 616, 616, 624, 625, 617, 617, 625, 626, 618, 618, 626, 627, 619, 619, 627, 628, 620, 620, 628, 629, 621, 621, 629, 630, 622, 622, 630, 631, 623, 375, 383, 632, 624, 624, 632, 633, 625, 625, 633, 634, 626, 626, 634, 635, 627, 627, 635, 636, 628, 628, 636, 637, 629, 629, 637, 638, 630, 630, 638, 639, 631, 383, 391, 640, 632, 632, 640, 641, 633, 633, 641, 642, 634, 634, 642, 643, 635, 635, 643, 644, 636, 636, 644, 645, 637, 637, 645, 646, 638, 638, 646, 647, 639, 391, 399, 648, 640, 640, 648, 649, 641, 641, 649, 650, 642, 642, 650, 651, 643, 643, 651, 652, 644, 644, 652, 653, 645, 645, 653, 654, 646, 646, 654, 655, 647, 399, 407, 656, 648, 648, 656, 657, 649, 649, 657, 658, 650, 650, 658, 659, 651, 651, 659, 660, 652, 652, 660, 661, 653, 653, 661, 662, 654, 654, 662, 663, 655, 407, 415, 664, 656, 656, 664, 665, 657, 657, 665, 666, 658, 658, 666, 667, 659, 659, 667, 668, 660, 660, 668, 669, 661, 661, 669, 670, 662, 662, 670, 671, 663, 415, 423, 672, 664, 664, 672, 673, 665, 665, 673, 674, 666, 666, 674, 675, 667, 667, 675, 676, 668, 668, 676, 677, 669, 669, 677, 678, 670, 670, 678, 679, 671, 423, 431, 680, 672, 672, 680, 681, 673, 673, 681, 682, 674, 674, 682, 683, 675, 675, 683, 684, 676, 676, 684, 685, 677, 677, 685, 686, 678, 678, 686, 687, 679, 431, 439, 688, 680, 680, 688, 689, 681, 681, 689, 690, 682, 682, 690, 691, 683, 683, 691, 692, 684, 684, 692, 693, 685, 685, 693, 694, 686, 686, 694, 695, 687, 439, 447, 696, 688, 688, 696, 697, 689, 689, 697, 698, 690, 690, 698, 699, 691, 691, 699, 700, 692, 692, 700, 701, 693, 693, 701, 702, 694, 694, 702, 703, 695, 447, 455, 704, 696, 696, 704, 705, 697, 697, 705, 706, 698, 698, 706, 707, 699, 699, 707, 708, 700, 700, 708, 709, 701, 701, 709, 710, 702, 702, 710, 711, 703, 455, 463, 712, 704, 704, 712, 713, 705, 705, 713, 714, 706, 706, 714, 715, 707, 707, 715, 716, 708, 708, 716, 717, 709, 709, 717, 718, 710, 710, 718, 719, 711, 463, 471, 720, 712, 712, 720, 721, 713, 713, 721, 722, 714, 714, 722, 723, 715, 715, 723, 724, 716, 716, 724, 725, 717, 717, 725, 726, 718, 718, 726, 727, 719, 471, 479, 728, 720, 720, 728, 729, 721, 721, 729, 730, 722, 722, 730, 731, 723, 723, 731, 732, 724, 724, 732, 733, 725, 725, 733, 734, 726, 726, 734, 735, 727, 479, 487, 736, 728, 728, 736, 737, 729, 729, 737, 738, 730, 730, 738, 739, 731, 731, 739, 740, 732, 732, 740, 741, 733, 733, 741, 742, 734, 734, 742, 743, 735, 487, 495, 744, 736, 736, 744, 745, 737, 737, 745, 746, 738, 738, 746, 747, 739, 739, 747, 748, 740, 740, 748, 749, 741, 741, 749, 750, 742, 742, 750, 751, 743, 495, 503, 752, 744, 744, 752, 753, 745, 745, 753, 754, 746, 746, 754, 755, 747, 747, 755, 756, 748, 748, 756, 757, 749, 749, 757, 758, 750, 750, 758, 759, 751, 503, 511, 760, 752, 752, 760, 761, 753, 753, 761, 762, 754, 754, 762, 763, 755, 755, 763, 764, 756, 756, 764, 765, 757, 757, 765, 766, 758, 758, 766, 767, 759, 511, 519, 768, 760, 760, 768, 769, 761, 761, 769, 770, 762, 762, 770, 771, 763, 763, 771, 772, 764, 764, 772, 773, 765, 765, 773, 774, 766, 766, 774, 775, 767, 519, 527, 776, 768, 768, 776, 777, 769, 769, 777, 778, 770, 770, 778, 779, 771, 771, 779, 780, 772, 772, 780, 781, 773, 773, 781, 782, 774, 774, 782, 783, 775, 527, 535, 784, 776, 776, 784, 785, 777, 777, 785, 786, 778, 778, 786, 787, 779, 779, 787, 788, 780, 780, 788, 789, 781, 781, 789, 790, 782, 782, 790, 791, 783, 535, 543, 792, 784, 784, 792, 793, 785, 785, 793, 794, 786, 786, 794, 795, 787, 787, 795, 796, 788, 788, 796, 797, 789, 789, 797, 798, 790, 790, 798, 799, 791, 543, 295, 544, 792, 792, 544, 545, 793, 793, 545, 546, 794, 794, 546, 547, 795, 795, 547, 548, 796, 796, 548, 549, 797, 797, 549, 550, 798, 798, 550, 551, 799, 551, 559, 808, 800, 800, 808, 809, 801, 801, 809, 810, 802, 802, 810, 811, 803, 803, 811, 812, 804, 804, 812, 813, 805, 805, 813, 814, 806, 806, 814, 807, 559, 567, 815, 808, 808, 815, 816, 809, 809, 816, 817, 810, 810, 817, 818, 811, 811, 818, 819, 812, 812, 819, 820, 813, 813, 820, 821, 814, 814, 821, 807, 567, 575, 822, 815, 815, 822, 823, 816, 816, 823, 824, 817, 817, 824, 825, 818, 818, 825, 826, 819, 819, 826, 827, 820, 820, 827, 828, 821, 821, 828, 807, 575, 583, 829, 822, 822, 829, 830, 823, 823, 830, 831, 824, 824, 831, 832, 825, 825, 832, 833, 826, 826, 833, 834, 827, 827, 834, 835, 828, 828, 835, 807, 583, 591, 836, 829, 829, 836, 837, 830, 830, 837, 838, 831, 831, 838, 839, 832, 832, 839, 840, 833, 833, 840, 841, 834, 834, 841, 842, 835, 835, 842, 807, 591, 599, 843, 836, 836, 843, 844, 837, 837, 844, 845, 838, 838, 845, 846, 839, 839, 846, 847, 840, 840, 847, 848, 841, 841, 848, 849, 842, 842, 849, 807, 599, 607, 850, 843, 843, 850, 851, 844, 844, 851, 852, 845, 845, 852, 853, 846, 846, 853, 854, 847, 847, 854, 855, 848, 848, 855, 856, 849, 849, 856, 807, 607, 615, 857, 850, 850, 857, 858, 851, 851, 858, 859, 852, 852, 859, 860, 853, 853, 860, 861, 854, 854, 861, 862, 855, 855, 862, 863, 856, 856, 863, 807, 615, 623, 864, 857, 857, 864, 865, 858, 858, 865, 866, 859, 859, 866, 867, 860, 860, 867, 868, 861, 861, 868, 869, 862, 862, 869, 870, 863, 863, 870, 807, 623, 631, 871, 864, 864, 871, 872, 865, 865, 872, 873, 866, 866, 873, 874, 867, 867, 874, 875, 868, 868, 875, 876, 869, 869, 876, 877, 870, 870, 877, 807, 631, 639, 878, 871, 871, 878, 879, 872, 872, 879, 880, 873, 873, 880, 881, 874, 874, 881, 882, 875, 875, 882, 883, 876, 876, 883, 884, 877, 877, 884, 807, 639, 647, 885, 878, 878, 885, 886, 879, 879, 886, 887, 880, 880, 887, 888, 881, 881, 888, 889, 882, 882, 889, 890, 883, 883, 890, 891, 884, 884, 891, 807, 647, 655, 892, 885, 885, 892, 893, 886, 886, 893, 894, 887, 887, 894, 895, 888, 888, 895, 896, 889, 889, 896, 897, 890, 890, 897, 898, 891, 891, 898, 807, 655, 663, 899, 892, 892, 899, 900, 893, 893, 900, 901, 894, 894, 901, 902, 895, 895, 902, 903, 896, 896, 903, 904, 897, 897, 904, 905, 898, 898, 905, 807, 663, 671, 906, 899, 899, 906, 907, 900, 900, 907, 908, 901, 901, 908, 909, 902, 902, 909, 910, 903, 903, 910, 911, 904, 904, 911, 912, 905, 905, 912, 807, 671, 679, 913, 906, 906, 913, 914, 907, 907, 914, 915, 908, 908, 915, 916, 909, 909, 916, 917, 910, 910, 917, 918, 911, 911, 918, 919, 912, 912, 919, 807, 679, 687, 920, 913, 913, 920, 921, 914, 914, 921, 922, 915, 915, 922, 923, 916, 916, 923, 924, 917, 917, 924, 925, 918, 918, 925, 926, 919, 919, 926, 807, 687, 695, 927, 920, 920, 927, 928, 921, 921, 928, 929, 922, 922, 929, 930, 923, 923, 930, 931, 924, 924, 931, 932, 925, 925, 932, 933, 926, 926, 933, 807, 695, 703, 934, 927, 927, 934, 935, 928, 928, 935, 936, 929, 929, 936, 937, 930, 930, 937, 938, 931, 931, 938, 939, 932, 932, 939, 940, 933, 933, 940, 807, 703, 711, 941, 934, 934, 941, 942, 935, 935, 942, 943, 936, 936, 943, 944, 937, 937, 944, 945, 938, 938, 945, 946, 939, 939, 946, 947, 940, 940, 947, 807, 711, 719, 948, 941, 941, 948, 949, 942, 942, 949, 950, 943, 943, 950, 951, 944, 944, 951, 952, 945, 945, 952, 953, 946, 946, 953, 954, 947, 947, 954, 807, 719, 727, 955, 948, 948, 955, 956, 949, 949, 956, 957, 950, 950, 957, 958, 951, 951, 958, 959, 952, 952, 959, 960, 953, 953, 960, 961, 954, 954, 961, 807, 727, 735, 962, 955, 955, 962, 963, 956, 956, 963, 964, 957, 957, 964, 965, 958, 958, 965, 966, 959, 959, 966, 967, 960, 960, 967, 968, 961, 961, 968, 807, 735, 743, 969, 962, 962, 969, 970, 963, 963, 970, 971, 964, 964, 971, 972, 965, 965, 972, 973, 966, 966, 973, 974, 967, 967, 974, 975, 968, 968, 975, 807, 743, 751, 976, 969, 969, 976, 977, 970, 970, 977, 978, 971, 971, 978, 979, 972, 972, 979, 980, 973, 973, 980, 981, 974, 974, 981, 982, 975, 975, 982, 807, 751, 759, 983, 976, 976, 983, 984, 977, 977, 984, 985, 978, 978, 985, 986, 979, 979, 986, 987, 980, 980, 987, 988, 981, 981, 988, 989, 982, 982, 989, 807, 759, 767, 990, 983, 983, 990, 991, 984, 984, 991, 992, 985, 985, 992, 993, 986, 986, 993, 994, 987, 987, 994, 995, 988, 988, 995, 996, 989, 989, 996, 807, 767, 775, 997, 990, 990, 997, 998, 991, 991, 998, 999, 992, 992, 999, 1000, 993, 993, 1000, 1001, 994, 994, 1001, 1002, 995, 995, 1002, 1003, 996, 996, 1003, 807, 775, 783, 1004, 997, 997, 1004, 1005, 998, 998, 1005, 1006, 999, 999, 1006, 1007, 1000, 1000, 1007, 1008, 1001, 1001, 1008, 1009, 1002, 1002, 1009, 1010, 1003, 1003, 1010, 807, 783, 791, 1011, 1004, 1004, 1011, 1012, 1005, 1005, 1012, 1013, 1006, 1006, 1013, 1014, 1007, 1007, 1014, 1015, 1008, 1008, 1015, 1016, 1009, 1009, 1016, 1017, 1010, 1010, 1017, 807, 791, 799, 1018, 1011, 1011, 1018, 1019, 1012, 1012, 1019, 1020, 1013, 1013, 1020, 1021, 1014, 1014, 1021, 1022, 1015, 1015, 1022, 1023, 1016, 1016, 1023, 1024, 1017, 1017, 1024, 807, 799, 551, 800, 1018, 1018, 800, 801, 1019, 1019, 801, 802, 1020, 1020, 802, 803, 1021, 1021, 803, 804, 1022, 1022, 804, 805, 1023, 1023, 805, 806, 1024, 1024, 806, 807, 1025, 1034, 1035, 1026, 1026, 1035, 1036, 1027, 1027, 1036, 1037, 1028, 1028, 1037, 1038, 1029, 1029, 1038, 1039, 1030, 1030, 1039, 1040, 1031, 1031, 1040, 1041, 1032, 1032, 1041, 1042, 1033, 1034, 1043, 1044, 1035, 1035, 1044, 1045, 1036, 1036, 1045, 1046, 1037, 1037, 1046, 1047, 1038, 1038, 1047, 1048, 1039, 1039, 1048, 1049, 1040, 1040, 1049, 1050, 1041, 1041, 1050, 1051, 1042, 1043, 1052, 1053, 1044, 1044, 1053, 1054, 1045, 1045, 1054, 1055, 1046, 1046, 1055, 1056, 1047, 1047, 1056, 1057, 1048, 1048, 1057, 1058, 1049, 1049, 1058, 1059, 1050, 1050, 1059, 1060, 1051, 1052, 1061, 1062, 1053, 1053, 1062, 1063, 1054, 1054, 1063, 1064, 1055, 1055, 1064, 1065, 1056, 1056, 1065, 1066, 1057, 1057, 1066, 1067, 1058, 1058, 1067, 1068, 1059, 1059, 1068, 1069, 1060, 1061, 1070, 1071, 1062, 1062, 1071, 1072, 1063, 1063, 1072, 1073, 1064, 1064, 1073, 1074, 1065, 1065, 1074, 1075, 1066, 1066, 1075, 1076, 1067, 1067, 1076, 1077, 1068, 1068, 1077, 1078, 1069, 1070, 1079, 1080, 1071, 1071, 1080, 1081, 1072, 1072, 1081, 1082, 1073, 1073, 1082, 1083, 1074, 1074, 1083, 1084, 1075, 1075, 1084, 1085, 1076, 1076, 1085, 1086, 1077, 1077, 1086, 1087, 1078, 1079, 1088, 1089, 1080, 1080, 1089, 1090, 1081, 1081, 1090, 1091, 1082, 1082, 1091, 1092, 1083, 1083, 1092, 1093, 1084, 1084, 1093, 1094, 1085, 1085, 1094, 1095, 1086, 1086, 1095, 1096, 1087, 1088, 1097, 1098, 1089, 1089, 1098, 1099, 1090, 1090, 1099, 1100, 1091, 1091, 1100, 1101, 1092, 1092, 1101, 1102, 1093, 1093, 1102, 1103, 1094, 1094, 1103, 1104, 1095, 1095, 1104, 1105, 1096, 1097, 1106, 1107, 1098, 1098, 1107, 1108, 1099, 1099, 1108, 1109, 1100, 1100, 1109, 1110, 1101, 1101, 1110, 1111, 1102, 1102, 1111, 1112, 1103, 1103, 1112, 1113, 1104, 1104, 1113, 1114, 1105, 1106, 1115, 1116, 1107, 1107, 1116, 1117, 1108, 1108, 1117, 1118, 1109, 1109, 1118, 1119, 1110, 1110, 1119, 1120, 1111, 1111, 1120, 1121, 1112, 1112, 1121, 1122, 1113, 1113, 1122, 1123, 1114, 1115, 1124, 1125, 1116, 1116, 1125, 1126, 1117, 1117, 1126, 1127, 1118, 1118, 1127, 1128, 1119, 1119, 1128, 1129, 1120, 1120, 1129, 1130, 1121, 1121, 1130, 1131, 1122, 1122, 1131, 1132, 1123, 1124, 1133, 1134, 1125, 1125, 1134, 1135, 1126, 1126, 1135, 1136, 1127, 1127, 1136, 1137, 1128, 1128, 1137, 1138, 1129, 1129, 1138, 1139, 1130, 1130, 1139, 1140, 1131, 1131, 1140, 1141, 1132, 1133, 1142, 1143, 1134, 1134, 1143, 1144, 1135, 1135, 1144, 1145, 1136, 1136, 1145, 1146, 1137, 1137, 1146, 1147, 1138, 1138, 1147, 1148, 1139, 1139, 1148, 1149, 1140, 1140, 1149, 1150, 1141, 1142, 1151, 1152, 1143, 1143, 1152, 1153, 1144, 1144, 1153, 1154, 1145, 1145, 1154, 1155, 1146, 1146, 1155, 1156, 1147, 1147, 1156, 1157, 1148, 1148, 1157, 1158, 1149, 1149, 1158, 1159, 1150, 1151, 1160, 1161, 1152, 1152, 1161, 1162, 1153, 1153, 1162, 1163, 1154, 1154, 1163, 1164, 1155, 1155, 1164, 1165, 1156, 1156, 1165, 1166, 1157, 1157, 1166, 1167, 1158, 1158, 1167, 1168, 1159, 1160, 1025, 1026, 1161, 1161, 1026, 1027, 1162, 1162, 1027, 1028, 1163, 1163, 1028, 1029, 1164, 1164, 1029, 1030, 1165, 1165, 1030, 1031, 1166, 1166, 1031, 1032, 1167, 1167, 1032, 1033, 1168, 1033, 1042, 1177, 1169, 1169, 1177, 1178, 1170, 1170, 1178, 1179, 1171, 1171, 1179, 1180, 1172, 1172, 1180, 1181, 1173, 1173, 1181, 1182, 1174, 1174, 1182, 1183, 1175, 1175, 1183, 1184, 1176, 1042, 1051, 1185, 1177, 1177, 1185, 1186, 1178, 1178, 1186, 1187, 1179, 1179, 1187, 1188, 1180, 1180, 1188, 1189, 1181, 1181, 1189, 1190, 1182, 1182, 1190, 1191, 1183, 1183, 1191, 1192, 1184, 1051, 1060, 1193, 1185, 1185, 1193, 1194, 1186, 1186, 1194, 1195, 1187, 1187, 1195, 1196, 1188, 1188, 1196, 1197, 1189, 1189, 1197, 1198, 1190, 1190, 1198, 1199, 1191, 1191, 1199, 1200, 1192, 1060, 1069, 1201, 1193, 1193, 1201, 1202, 1194, 1194, 1202, 1203, 1195, 1195, 1203, 1204, 1196, 1196, 1204, 1205, 1197, 1197, 1205, 1206, 1198, 1198, 1206, 1207, 1199, 1199, 1207, 1208, 1200, 1069, 1078, 1209, 1201, 1201, 1209, 1210, 1202, 1202, 1210, 1211, 1203, 1203, 1211, 1212, 1204, 1204, 1212, 1213, 1205, 1205, 1213, 1214, 1206, 1206, 1214, 1215, 1207, 1207, 1215, 1216, 1208, 1078, 1087, 1217, 1209, 1209, 1217, 1218, 1210, 1210, 1218, 1219, 1211, 1211, 1219, 1220, 1212, 1212, 1220, 1221, 1213, 1213, 1221, 1222, 1214, 1214, 1222, 1223, 1215, 1215, 1223, 1224, 1216, 1087, 1096, 1225, 1217, 1217, 1225, 1226, 1218, 1218, 1226, 1227, 1219, 1219, 1227, 1228, 1220, 1220, 1228, 1229, 1221, 1221, 1229, 1230, 1222, 1222, 1230, 1231, 1223, 1223, 1231, 1232, 1224, 1096, 1105, 1233, 1225, 1225, 1233, 1234, 1226, 1226, 1234, 1235, 1227, 1227, 1235, 1236, 1228, 1228, 1236, 1237, 1229, 1229, 1237, 1238, 1230, 1230, 1238, 1239, 1231, 1231, 1239, 1240, 1232, 1105, 1114, 1241, 1233, 1233, 1241, 1242, 1234, 1234, 1242, 1243, 1235, 1235, 1243, 1244, 1236, 1236, 1244, 1245, 1237, 1237, 1245, 1246, 1238, 1238, 1246, 1247, 1239, 1239, 1247, 1248, 1240, 1114, 1123, 1249, 1241, 1241, 1249, 1250, 1242, 1242, 1250, 1251, 1243, 1243, 1251, 1252, 1244, 1244, 1252, 1253, 1245, 1245, 1253, 1254, 1246, 1246, 1254, 1255, 1247, 1247, 1255, 1256, 1248, 1123, 1132, 1257, 1249, 1249, 1257, 1258, 1250, 1250, 1258, 1259, 1251, 1251, 1259, 1260, 1252, 1252, 1260, 1261, 1253, 1253, 1261, 1262, 1254, 1254, 1262, 1263, 1255, 1255, 1263, 1264, 1256, 1132, 1141, 1265, 1257, 1257, 1265, 1266, 1258, 1258, 1266, 1267, 1259, 1259, 1267, 1268, 1260, 1260, 1268, 1269, 1261, 1261, 1269, 1270, 1262, 1262, 1270, 1271, 1263, 1263, 1271, 1272, 1264, 1141, 1150, 1273, 1265, 1265, 1273, 1274, 1266, 1266, 1274, 1275, 1267, 1267, 1275, 1276, 1268, 1268, 1276, 1277, 1269, 1269, 1277, 1278, 1270, 1270, 1278, 1279, 1271, 1271, 1279, 1280, 1272, 1150, 1159, 1281, 1273, 1273, 1281, 1282, 1274, 1274, 1282, 1283, 1275, 1275, 1283, 1284, 1276, 1276, 1284, 1285, 1277, 1277, 1285, 1286, 1278, 1278, 1286, 1287, 1279, 1279, 1287, 1288, 1280, 1159, 1168, 1289, 1281, 1281, 1289, 1290, 1282, 1282, 1290, 1291, 1283, 1283, 1291, 1292, 1284, 1284, 1292, 1293, 1285, 1285, 1293, 1294, 1286, 1286, 1294, 1295, 1287, 1287, 1295, 1296, 1288, 1168, 1033, 1169, 1289, 1289, 1169, 1170, 1290, 1290, 1170, 1171, 1291, 1291, 1171, 1172, 1292, 1292, 1172, 1173, 1293, 1293, 1173, 1174, 1294, 1294, 1174, 1175, 1295, 1295, 1175, 1176, 1296, 1297, 1306, 1307, 1298, 1298, 1307, 1308, 1299, 1299, 1308, 1309, 1300, 1300, 1309, 1310, 1301, 1301, 1310, 1311, 1302, 1302, 1311, 1312, 1303, 1303, 1312, 1313, 1304, 1304, 1313, 1314, 1305, 1306, 1315, 1316, 1307, 1307, 1316, 1317, 1308, 1308, 1317, 1318, 1309, 1309, 1318, 1319, 1310, 1310, 1319, 1320, 1311, 1311, 1320, 1321, 1312, 1312, 1321, 1322, 1313, 1313, 1322, 1323, 1314, 1315, 1324, 1325, 1316, 1316, 1325, 1326, 1317, 1317, 1326, 1327, 1318, 1318, 1327, 1328, 1319, 1319, 1328, 1329, 1320, 1320, 1329, 1330, 1321, 1321, 1330, 1331, 1322, 1322, 1331, 1332, 1323, 1324, 1333, 1334, 1325, 1325, 1334, 1335, 1326, 1326, 1335, 1336, 1327, 1327, 1336, 1337, 1328, 1328, 1337, 1338, 1329, 1329, 1338, 1339, 1330, 1330, 1339, 1340, 1331, 1331, 1340, 1341, 1332, 1333, 1342, 1343, 1334, 1334, 1343, 1344, 1335, 1335, 1344, 1345, 1336, 1336, 1345, 1346, 1337, 1337, 1346, 1347, 1338, 1338, 1347, 1348, 1339, 1339, 1348, 1349, 1340, 1340, 1349, 1350, 1341, 1342, 1351, 1352, 1343, 1343, 1352, 1353, 1344, 1344, 1353, 1354, 1345, 1345, 1354, 1355, 1346, 1346, 1355, 1356, 1347, 1347, 1356, 1357, 1348, 1348, 1357, 1358, 1349, 1349, 1358, 1359, 1350, 1351, 1360, 1361, 1352, 1352, 1361, 1362, 1353, 1353, 1362, 1363, 1354, 1354, 1363, 1364, 1355, 1355, 1364, 1365, 1356, 1356, 1365, 1366, 1357, 1357, 1366, 1367, 1358, 1358, 1367, 1368, 1359, 1360, 1369, 1370, 1361, 1361, 1370, 1371, 1362, 1362, 1371, 1372, 1363, 1363, 1372, 1373, 1364, 1364, 1373, 1374, 1365, 1365, 1374, 1375, 1366, 1366, 1375, 1376, 1367, 1367, 1376, 1377, 1368, 1369, 1378, 1379, 1370, 1370, 1379, 1380, 1371, 1371, 1380, 1381, 1372, 1372, 1381, 1382, 1373, 1373, 1382, 1383, 1374, 1374, 1383, 1384, 1375, 1375, 1384, 1385, 1376, 1376, 1385, 1386, 1377, 1378, 1387, 1388, 1379, 1379, 1388, 1389, 1380, 1380, 1389, 1390, 1381, 1381, 1390, 1391, 1382, 1382, 1391, 1392, 1383, 1383, 1392, 1393, 1384, 1384, 1393, 1394, 1385, 1385, 1394, 1395, 1386, 1387, 1396, 1397, 1388, 1388, 1397, 1398, 1389, 1389, 1398, 1399, 1390, 1390, 1399, 1400, 1391, 1391, 1400, 1401, 1392, 1392, 1401, 1402, 1393, 1393, 1402, 1403, 1394, 1394, 1403, 1404, 1395, 1396, 1405, 1406, 1397, 1397, 1406, 1407, 1398, 1398, 1407, 1408, 1399, 1399, 1408, 1409, 1400, 1400, 1409, 1410, 1401, 1401, 1410, 1411, 1402, 1402, 1411, 1412, 1403, 1403, 1412, 1413, 1404, 1405, 1414, 1415, 1406, 1406, 1415, 1416, 1407, 1407, 1416, 1417, 1408, 1408, 1417, 1418, 1409, 1409, 1418, 1419, 1410, 1410, 1419, 1420, 1411, 1411, 1420, 1421, 1412, 1412, 1421, 1422, 1413, 1414, 1423, 1424, 1415, 1415, 1424, 1425, 1416, 1416, 1425, 1426, 1417, 1417, 1426, 1427, 1418, 1418, 1427, 1428, 1419, 1419, 1428, 1429, 1420, 1420, 1429, 1430, 1421, 1421, 1430, 1431, 1422, 1423, 1432, 1433, 1424, 1424, 1433, 1434, 1425, 1425, 1434, 1435, 1426, 1426, 1435, 1436, 1427, 1427, 1436, 1437, 1428, 1428, 1437, 1438, 1429, 1429, 1438, 1439, 1430, 1430, 1439, 1440, 1431, 1432, 1297, 1298, 1433, 1433, 1298, 1299, 1434, 1434, 1299, 1300, 1435, 1435, 1300, 1301, 1436, 1436, 1301, 1302, 1437, 1437, 1302, 1303, 1438, 1438, 1303, 1304, 1439, 1439, 1304, 1305, 1440, 1305, 1314, 1449, 1441, 1441, 1449, 1450, 1442, 1442, 1450, 1451, 1443, 1443, 1451, 1452, 1444, 1444, 1452, 1453, 1445, 1445, 1453, 1454, 1446, 1446, 1454, 1455, 1447, 1447, 1455, 1456, 1448, 1314, 1323, 1457, 1449, 1449, 1457, 1458, 1450, 1450, 1458, 1459, 1451, 1451, 1459, 1460, 1452, 1452, 1460, 1461, 1453, 1453, 1461, 1462, 1454, 1454, 1462, 1463, 1455, 1455, 1463, 1464, 1456, 1323, 1332, 1465, 1457, 1457, 1465, 1466, 1458, 1458, 1466, 1467, 1459, 1459, 1467, 1468, 1460, 1460, 1468, 1469, 1461, 1461, 1469, 1470, 1462, 1462, 1470, 1471, 1463, 1463, 1471, 1472, 1464, 1332, 1341, 1473, 1465, 1465, 1473, 1474, 1466, 1466, 1474, 1475, 1467, 1467, 1475, 1476, 1468, 1468, 1476, 1477, 1469, 1469, 1477, 1478, 1470, 1470, 1478, 1479, 1471, 1471, 1479, 1480, 1472, 1341, 1350, 1481, 1473, 1473, 1481, 1482, 1474, 1474, 1482, 1483, 1475, 1475, 1483, 1484, 1476, 1476, 1484, 1485, 1477, 1477, 1485, 1486, 1478, 1478, 1486, 1487, 1479, 1479, 1487, 1488, 1480, 1350, 1359, 1489, 1481, 1481, 1489, 1490, 1482, 1482, 1490, 1491, 1483, 1483, 1491, 1492, 1484, 1484, 1492, 1493, 1485, 1485, 1493, 1494, 1486, 1486, 1494, 1495, 1487, 1487, 1495, 1496, 1488, 1359, 1368, 1497, 1489, 1489, 1497, 1498, 1490, 1490, 1498, 1499, 1491, 1491, 1499, 1500, 1492, 1492, 1500, 1501, 1493, 1493, 1501, 1502, 1494, 1494, 1502, 1503, 1495, 1495, 1503, 1504, 1496, 1368, 1377, 1505, 1497, 1497, 1505, 1506, 1498, 1498, 1506, 1507, 1499, 1499, 1507, 1508, 1500, 1500, 1508, 1509, 1501, 1501, 1509, 1510, 1502, 1502, 1510, 1511, 1503, 1503, 1511, 1512, 1504, 1377, 1386, 1513, 1505, 1505, 1513, 1514, 1506, 1506, 1514, 1515, 1507, 1507, 1515, 1516, 1508, 1508, 1516, 1517, 1509, 1509, 1517, 1518, 1510, 1510, 1518, 1519, 1511, 1511, 1519, 1520, 1512, 1386, 1395, 1521, 1513, 1513, 1521, 1522, 1514, 1514, 1522, 1523, 1515, 1515, 1523, 1524, 1516, 1516, 1524, 1525, 1517, 1517, 1525, 1526, 1518, 1518, 1526, 1527, 1519, 1519, 1527, 1528, 1520, 1395, 1404, 1529, 1521, 1521, 1529, 1530, 1522, 1522, 1530, 1531, 1523, 1523, 1531, 1532, 1524, 1524, 1532, 1533, 1525, 1525, 1533, 1534, 1526, 1526, 1534, 1535, 1527, 1527, 1535, 1536, 1528, 1404, 1413, 1537, 1529, 1529, 1537, 1538, 1530, 1530, 1538, 1539, 1531, 1531, 1539, 1540, 1532, 1532, 1540, 1541, 1533, 1533, 1541, 1542, 1534, 1534, 1542, 1543, 1535, 1535, 1543, 1544, 1536, 1413, 1422, 1545, 1537, 1537, 1545, 1546, 1538, 1538, 1546, 1547, 1539, 1539, 1547, 1548, 1540, 1540, 1548, 1549, 1541, 1541, 1549, 1550, 1542, 1542, 1550, 1551, 1543, 1543, 1551, 1552, 1544, 1422, 1431, 1553, 1545, 1545, 1553, 1554, 1546, 1546, 1554, 1555, 1547, 1547, 1555, 1556, 1548, 1548, 1556, 1557, 1549, 1549, 1557, 1558, 1550, 1550, 1558, 1559, 1551, 1551, 1559, 1560, 1552, 1431, 1440, 1561, 1553, 1553, 1561, 1562, 1554, 1554, 1562, 1563, 1555, 1555, 1563, 1564, 1556, 1556, 1564, 1565, 1557, 1557, 1565, 1566, 1558, 1558, 1566, 1567, 1559, 1559, 1567, 1568, 1560, 1440, 1305, 1441, 1561, 1561, 1441, 1442, 1562, 1562, 1442, 1443, 1563, 1563, 1443, 1444, 1564, 1564, 1444, 1445, 1565, 1565, 1445, 1446, 1566, 1566, 1446, 1447, 1567, 1567, 1447, 1448, 1568, 1578, 1570, 1569, 1570, 1578, 1579, 1571, 1571, 1579, 1580, 1572, 1572, 1580, 1581, 1573, 1573, 1581, 1582, 1574, 1574, 1582, 1583, 1575, 1575, 1583, 1584, 1576, 1576, 1584, 1585, 1577, 1586, 1578, 1569, 1578, 1586, 1587, 1579, 1579, 1587, 1588, 1580, 1580, 1588, 1589, 1581, 1581, 1589, 1590, 1582, 1582, 1590, 1591, 1583, 1583, 1591, 1592, 1584, 1584, 1592, 1593, 1585, 1594, 1586, 1569, 1586, 1594, 1595, 1587, 1587, 1595, 1596, 1588, 1588, 1596, 1597, 1589, 1589, 1597, 1598, 1590, 1590, 1598, 1599, 1591, 1591, 1599, 1600, 1592, 1592, 1600, 1601, 1593, 1602, 1594, 1569, 1594, 1602, 1603, 1595, 1595, 1603, 1604, 1596, 1596, 1604, 1605, 1597, 1597, 1605, 1606, 1598, 1598, 1606, 1607, 1599, 1599, 1607, 1608, 1600, 1600, 1608, 1609, 1601, 1610, 1602, 1569, 1602, 1610, 1611, 1603, 1603, 1611, 1612, 1604, 1604, 1612, 1613, 1605, 1605, 1613, 1614, 1606, 1606, 1614, 1615, 1607, 1607, 1615, 1616, 1608, 1608, 1616, 1617, 1609, 1618, 1610, 1569, 1610, 1618, 1619, 1611, 1611, 1619, 1620, 1612, 1612, 1620, 1621, 1613, 1613, 1621, 1622, 1614, 1614, 1622, 1623, 1615, 1615, 1623, 1624, 1616, 1616, 1624, 1625, 1617, 1626, 1618, 1569, 1618, 1626, 1627, 1619, 1619, 1627, 1628, 1620, 1620, 1628, 1629, 1621, 1621, 1629, 1630, 1622, 1622, 1630, 1631, 1623, 1623, 1631, 1632, 1624, 1624, 1632, 1633, 1625, 1634, 1626, 1569, 1626, 1634, 1635, 1627, 1627, 1635, 1636, 1628, 1628, 1636, 1637, 1629, 1629, 1637, 1638, 1630, 1630, 1638, 1639, 1631, 1631, 1639, 1640, 1632, 1632, 1640, 1641, 1633, 1642, 1634, 1569, 1634, 1642, 1643, 1635, 1635, 1643, 1644, 1636, 1636, 1644, 1645, 1637, 1637, 1645, 1646, 1638, 1638, 1646, 1647, 1639, 1639, 1647, 1648, 1640, 1640, 1648, 1649, 1641, 1650, 1642, 1569, 1642, 1650, 1651, 1643, 1643, 1651, 1652, 1644, 1644, 1652, 1653, 1645, 1645, 1653, 1654, 1646, 1646, 1654, 1655, 1647, 1647, 1655, 1656, 1648, 1648, 1656, 1657, 1649, 1658, 1650, 1569, 1650, 1658, 1659, 1651, 1651, 1659, 1660, 1652, 1652, 1660, 1661, 1653, 1653, 1661, 1662, 1654, 1654, 1662, 1663, 1655, 1655, 1663, 1664, 1656, 1656, 1664, 1665, 1657, 1666, 1658, 1569, 1658, 1666, 1667, 1659, 1659, 1667, 1668, 1660, 1660, 1668, 1669, 1661, 1661, 1669, 1670, 1662, 1662, 1670, 1671, 1663, 1663, 1671, 1672, 1664, 1664, 1672, 1673, 1665, 1674, 1666, 1569, 1666, 1674, 1675, 1667, 1667, 1675, 1676, 1668, 1668, 1676, 1677, 1669, 1669, 1677, 1678, 1670, 1670, 1678, 1679, 1671, 1671, 1679, 1680, 1672, 1672, 1680, 1681, 1673, 1682, 1674, 1569, 1674, 1682, 1683, 1675, 1675, 1683, 1684, 1676, 1676, 1684, 1685, 1677, 1677, 1685, 1686, 1678, 1678, 1686, 1687, 1679, 1679, 1687, 1688, 1680, 1680, 1688, 1689, 1681, 1690, 1682, 1569, 1682, 1690, 1691, 1683, 1683, 1691, 1692, 1684, 1684, 1692, 1693, 1685, 1685, 1693, 1694, 1686, 1686, 1694, 1695, 1687, 1687, 1695, 1696, 1688, 1688, 1696, 1697, 1689, 1698, 1690, 1569, 1690, 1698, 1699, 1691, 1691, 1699, 1700, 1692, 1692, 1700, 1701, 1693, 1693, 1701, 1702, 1694, 1694, 1702, 1703, 1695, 1695, 1703, 1704, 1696, 1696, 1704, 1705, 1697, 1706, 1698, 1569, 1698, 1706, 1707, 1699, 1699, 1707, 1708, 1700, 1700, 1708, 1709, 1701, 1701, 1709, 1710, 1702, 1702, 1710, 1711, 1703, 1703, 1711, 1712, 1704, 1704, 1712, 1713, 1705, 1714, 1706, 1569, 1706, 1714, 1715, 1707, 1707, 1715, 1716, 1708, 1708, 1716, 1717, 1709, 1709, 1717, 1718, 1710, 1710, 1718, 1719, 1711, 1711, 1719, 1720, 1712, 1712, 1720, 1721, 1713, 1722, 1714, 1569, 1714, 1722, 1723, 1715, 1715, 1723, 1724, 1716, 1716, 1724, 1725, 1717, 1717, 1725, 1726, 1718, 1718, 1726, 1727, 1719, 1719, 1727, 1728, 1720, 1720, 1728, 1729, 1721, 1730, 1722, 1569, 1722, 1730, 1731, 1723, 1723, 1731, 1732, 1724, 1724, 1732, 1733, 1725, 1725, 1733, 1734, 1726, 1726, 1734, 1735, 1727, 1727, 1735, 1736, 1728, 1728, 1736, 1737, 1729, 1738, 1730, 1569, 1730, 1738, 1739, 1731, 1731, 1739, 1740, 1732, 1732, 1740, 1741, 1733, 1733, 1741, 1742, 1734, 1734, 1742, 1743, 1735, 1735, 1743, 1744, 1736, 1736, 1744, 1745, 1737, 1746, 1738, 1569, 1738, 1746, 1747, 1739, 1739, 1747, 1748, 1740, 1740, 1748, 1749, 1741, 1741, 1749, 1750, 1742, 1742, 1750, 1751, 1743, 1743, 1751, 1752, 1744, 1744, 1752, 1753, 1745, 1754, 1746, 1569, 1746, 1754, 1755, 1747, 1747, 1755, 1756, 1748, 1748, 1756, 1757, 1749, 1749, 1757, 1758, 1750, 1750, 1758, 1759, 1751, 1751, 1759, 1760, 1752, 1752, 1760, 1761, 1753, 1762, 1754, 1569, 1754, 1762, 1763, 1755, 1755, 1763, 1764, 1756, 1756, 1764, 1765, 1757, 1757, 1765, 1766, 1758, 1758, 1766, 1767, 1759, 1759, 1767, 1768, 1760, 1760, 1768, 1769, 1761, 1770, 1762, 1569, 1762, 1770, 1771, 1763, 1763, 1771, 1772, 1764, 1764, 1772, 1773, 1765, 1765, 1773, 1774, 1766, 1766, 1774, 1775, 1767, 1767, 1775, 1776, 1768, 1768, 1776, 1777, 1769, 1778, 1770, 1569, 1770, 1778, 1779, 1771, 1771, 1779, 1780, 1772, 1772, 1780, 1781, 1773, 1773, 1781, 1782, 1774, 1774, 1782, 1783, 1775, 1775, 1783, 1784, 1776, 1776, 1784, 1785, 1777, 1786, 1778, 1569, 1778, 1786, 1787, 1779, 1779, 1787, 1788, 1780, 1780, 1788, 1789, 1781, 1781, 1789, 1790, 1782, 1782, 1790, 1791, 1783, 1783, 1791, 1792, 1784, 1784, 1792, 1793, 1785, 1794, 1786, 1569, 1786, 1794, 1795, 1787, 1787, 1795, 1796, 1788, 1788, 1796, 1797, 1789, 1789, 1797, 1798, 1790, 1790, 1798, 1799, 1791, 1791, 1799, 1800, 1792, 1792, 1800, 1801, 1793, 1802, 1794, 1569, 1794, 1802, 1803, 1795, 1795, 1803, 1804, 1796, 1796, 1804, 1805, 1797, 1797, 1805, 1806, 1798, 1798, 1806, 1807, 1799, 1799, 1807, 1808, 1800, 1800, 1808, 1809, 1801, 1810, 1802, 1569, 1802, 1810, 1811, 1803, 1803, 1811, 1812, 1804, 1804, 1812, 1813, 1805, 1805, 1813, 1814, 1806, 1806, 1814, 1815, 1807, 1807, 1815, 1816, 1808, 1808, 1816, 1817, 1809, 1818, 1810, 1569, 1810, 1818, 1819, 1811, 1811, 1819, 1820, 1812, 1812, 1820, 1821, 1813, 1813, 1821, 1822, 1814, 1814, 1822, 1823, 1815, 1815, 1823, 1824, 1816, 1816, 1824, 1825, 1817, 1570, 1818, 1569, 1818, 1570, 1571, 1819, 1819, 1571, 1572, 1820, 1820, 1572, 1573, 1821, 1821, 1573, 1574, 1822, 1822, 1574, 1575, 1823, 1823, 1575, 1576, 1824, 1824, 1576, 1577, 1825, 1577, 1585, 1834, 1826, 1826, 1834, 1835, 1827, 1827, 1835, 1836, 1828, 1828, 1836, 1837, 1829, 1829, 1837, 1838, 1830, 1830, 1838, 1839, 1831, 1831, 1839, 1840, 1832, 1832, 1840, 1841, 1833, 1585, 1593, 1842, 1834, 1834, 1842, 1843, 1835, 1835, 1843, 1844, 1836, 1836, 1844, 1845, 1837, 1837, 1845, 1846, 1838, 1838, 1846, 1847, 1839, 1839, 1847, 1848, 1840, 1840, 1848, 1849, 1841, 1593, 1601, 1850, 1842, 1842, 1850, 1851, 1843, 1843, 1851, 1852, 1844, 1844, 1852, 1853, 1845, 1845, 1853, 1854, 1846, 1846, 1854, 1855, 1847, 1847, 1855, 1856, 1848, 1848, 1856, 1857, 1849, 1601, 1609, 1858, 1850, 1850, 1858, 1859, 1851, 1851, 1859, 1860, 1852, 1852, 1860, 1861, 1853, 1853, 1861, 1862, 1854, 1854, 1862, 1863, 1855, 1855, 1863, 1864, 1856, 1856, 1864, 1865, 1857, 1609, 1617, 1866, 1858, 1858, 1866, 1867, 1859, 1859, 1867, 1868, 1860, 1860, 1868, 1869, 1861, 1861, 1869, 1870, 1862, 1862, 1870, 1871, 1863, 1863, 1871, 1872, 1864, 1864, 1872, 1873, 1865, 1617, 1625, 1874, 1866, 1866, 1874, 1875, 1867, 1867, 1875, 1876, 1868, 1868, 1876, 1877, 1869, 1869, 1877, 1878, 1870, 1870, 1878, 1879, 1871, 1871, 1879, 1880, 1872, 1872, 1880, 1881, 1873, 1625, 1633, 1882, 1874, 1874, 1882, 1883, 1875, 1875, 1883, 1884, 1876, 1876, 1884, 1885, 1877, 1877, 1885, 1886, 1878, 1878, 1886, 1887, 1879, 1879, 1887, 1888, 1880, 1880, 1888, 1889, 1881, 1633, 1641, 1890, 1882, 1882, 1890, 1891, 1883, 1883, 1891, 1892, 1884, 1884, 1892, 1893, 1885, 1885, 1893, 1894, 1886, 1886, 1894, 1895, 1887, 1887, 1895, 1896, 1888, 1888, 1896, 1897, 1889, 1641, 1649, 1898, 1890, 1890, 1898, 1899, 1891, 1891, 1899, 1900, 1892, 1892, 1900, 1901, 1893, 1893, 1901, 1902, 1894, 1894, 1902, 1903, 1895, 1895, 1903, 1904, 1896, 1896, 1904, 1905, 1897, 1649, 1657, 1906, 1898, 1898, 1906, 1907, 1899, 1899, 1907, 1908, 1900, 1900, 1908, 1909, 1901, 1901, 1909, 1910, 1902, 1902, 1910, 1911, 1903, 1903, 1911, 1912, 1904, 1904, 1912, 1913, 1905, 1657, 1665, 1914, 1906, 1906, 1914, 1915, 1907, 1907, 1915, 1916, 1908, 1908, 1916, 1917, 1909, 1909, 1917, 1918, 1910, 1910, 1918, 1919, 1911, 1911, 1919, 1920, 1912, 1912, 1920, 1921, 1913, 1665, 1673, 1922, 1914, 1914, 1922, 1923, 1915, 1915, 1923, 1924, 1916, 1916, 1924, 1925, 1917, 1917, 1925, 1926, 1918, 1918, 1926, 1927, 1919, 1919, 1927, 1928, 1920, 1920, 1928, 1929, 1921, 1673, 1681, 1930, 1922, 1922, 1930, 1931, 1923, 1923, 1931, 1932, 1924, 1924, 1932, 1933, 1925, 1925, 1933, 1934, 1926, 1926, 1934, 1935, 1927, 1927, 1935, 1936, 1928, 1928, 1936, 1937, 1929, 1681, 1689, 1938, 1930, 1930, 1938, 1939, 1931, 1931, 1939, 1940, 1932, 1932, 1940, 1941, 1933, 1933, 1941, 1942, 1934, 1934, 1942, 1943, 1935, 1935, 1943, 1944, 1936, 1936, 1944, 1945, 1937, 1689, 1697, 1946, 1938, 1938, 1946, 1947, 1939, 1939, 1947, 1948, 1940, 1940, 1948, 1949, 1941, 1941, 1949, 1950, 1942, 1942, 1950, 1951, 1943, 1943, 1951, 1952, 1944, 1944, 1952, 1953, 1945, 1697, 1705, 1954, 1946, 1946, 1954, 1955, 1947, 1947, 1955, 1956, 1948, 1948, 1956, 1957, 1949, 1949, 1957, 1958, 1950, 1950, 1958, 1959, 1951, 1951, 1959, 1960, 1952, 1952, 1960, 1961, 1953, 1705, 1713, 1962, 1954, 1954, 1962, 1963, 1955, 1955, 1963, 1964, 1956, 1956, 1964, 1965, 1957, 1957, 1965, 1966, 1958, 1958, 1966, 1967, 1959, 1959, 1967, 1968, 1960, 1960, 1968, 1969, 1961, 1713, 1721, 1970, 1962, 1962, 1970, 1971, 1963, 1963, 1971, 1972, 1964, 1964, 1972, 1973, 1965, 1965, 1973, 1974, 1966, 1966, 1974, 1975, 1967, 1967, 1975, 1976, 1968, 1968, 1976, 1977, 1969, 1721, 1729, 1978, 1970, 1970, 1978, 1979, 1971, 1971, 1979, 1980, 1972, 1972, 1980, 1981, 1973, 1973, 1981, 1982, 1974, 1974, 1982, 1983, 1975, 1975, 1983, 1984, 1976, 1976, 1984, 1985, 1977, 1729, 1737, 1986, 1978, 1978, 1986, 1987, 1979, 1979, 1987, 1988, 1980, 1980, 1988, 1989, 1981, 1981, 1989, 1990, 1982, 1982, 1990, 1991, 1983, 1983, 1991, 1992, 1984, 1984, 1992, 1993, 1985, 1737, 1745, 1994, 1986, 1986, 1994, 1995, 1987, 1987, 1995, 1996, 1988, 1988, 1996, 1997, 1989, 1989, 1997, 1998, 1990, 1990, 1998, 1999, 1991, 1991, 1999, 2000, 1992, 1992, 2000, 2001, 1993, 1745, 1753, 2002, 1994, 1994, 2002, 2003, 1995, 1995, 2003, 2004, 1996, 1996, 2004, 2005, 1997, 1997, 2005, 2006, 1998, 1998, 2006, 2007, 1999, 1999, 2007, 2008, 2000, 2000, 2008, 2009, 2001, 1753, 1761, 2010, 2002, 2002, 2010, 2011, 2003, 2003, 2011, 2012, 2004, 2004, 2012, 2013, 2005, 2005, 2013, 2014, 2006, 2006, 2014, 2015, 2007, 2007, 2015, 2016, 2008, 2008, 2016, 2017, 2009, 1761, 1769, 2018, 2010, 2010, 2018, 2019, 2011, 2011, 2019, 2020, 2012, 2012, 2020, 2021, 2013, 2013, 2021, 2022, 2014, 2014, 2022, 2023, 2015, 2015, 2023, 2024, 2016, 2016, 2024, 2025, 2017, 1769, 1777, 2026, 2018, 2018, 2026, 2027, 2019, 2019, 2027, 2028, 2020, 2020, 2028, 2029, 2021, 2021, 2029, 2030, 2022, 2022, 2030, 2031, 2023, 2023, 2031, 2032, 2024, 2024, 2032, 2033, 2025, 1777, 1785, 2034, 2026, 2026, 2034, 2035, 2027, 2027, 2035, 2036, 2028, 2028, 2036, 2037, 2029, 2029, 2037, 2038, 2030, 2030, 2038, 2039, 2031, 2031, 2039, 2040, 2032, 2032, 2040, 2041, 2033, 1785, 1793, 2042, 2034, 2034, 2042, 2043, 2035, 2035, 2043, 2044, 2036, 2036, 2044, 2045, 2037, 2037, 2045, 2046, 2038, 2038, 2046, 2047, 2039, 2039, 2047, 2048, 2040, 2040, 2048, 2049, 2041, 1793, 1801, 2050, 2042, 2042, 2050, 2051, 2043, 2043, 2051, 2052, 2044, 2044, 2052, 2053, 2045, 2045, 2053, 2054, 2046, 2046, 2054, 2055, 2047, 2047, 2055, 2056, 2048, 2048, 2056, 2057, 2049, 1801, 1809, 2058, 2050, 2050, 2058, 2059, 2051, 2051, 2059, 2060, 2052, 2052, 2060, 2061, 2053, 2053, 2061, 2062, 2054, 2054, 2062, 2063, 2055, 2055, 2063, 2064, 2056, 2056, 2064, 2065, 2057, 1809, 1817, 2066, 2058, 2058, 2066, 2067, 2059, 2059, 2067, 2068, 2060, 2060, 2068, 2069, 2061, 2061, 2069, 2070, 2062, 2062, 2070, 2071, 2063, 2063, 2071, 2072, 2064, 2064, 2072, 2073, 2065, 1817, 1825, 2074, 2066, 2066, 2074, 2075, 2067, 2067, 2075, 2076, 2068, 2068, 2076, 2077, 2069, 2069, 2077, 2078, 2070, 2070, 2078, 2079, 2071, 2071, 2079, 2080, 2072, 2072, 2080, 2081, 2073, 1825, 1577, 1826, 2074, 2074, 1826, 1827, 2075, 2075, 1827, 1828, 2076, 2076, 1828, 1829, 2077, 2077, 1829, 1830, 2078, 2078, 1830, 1831, 2079, 2079, 1831, 1832, 2080, 2080, 1832, 1833, 2081] + point3f[] points = [(0.7, 1.2, 0), (0.69189453, 1.2215333, 0), (0.69023436, 1.236914, 0), (0.69384766, 1.2461426, 0), (0.7015625, 1.2492187, 0), (0.712207, 1.2461426, 0), (0.7246094, 1.2369142, 0), (0.73759764, 1.2215333, 0), (0.75, 1.2, 0), (0.686, 1.2000002, 0.14262497), (0.6780566, 1.2215334, 0.14097345), (0.6764297, 1.236914, 0.14063525), (0.67997074, 1.2461426, 0.14137149), (0.6875313, 1.2492188, 0.14294338), (0.6979629, 1.2461426, 0.14511216), (0.7101172, 1.2369142, 0.14763916), (0.7228457, 1.2215333, 0.15028548), (0.735, 1.2000002, 0.15281248), (0.64575, 1.2, 0.27475), (0.63827264, 1.2215333, 0.2715686), (0.6367412, 1.236914, 0.27091694), (0.64007443, 1.2461426, 0.27233517), (0.6471914, 1.2492187, 0.27536333), (0.657011, 1.2461426, 0.27954125), (0.66845214, 1.2369142, 0.28440917), (0.68043387, 1.2215333, 0.2895071), (0.691875, 1.2, 0.294375), (0.58187497, 1.2, 0.39374995), (0.5751374, 1.2215333, 0.38919067), (0.5737573, 1.2369142, 0.38825685), (0.5767609, 1.2461426, 0.3902893), (0.5831738, 1.2492187, 0.39462888), (0.59202206, 1.2461426, 0.40061647), (0.6023315, 1.2369142, 0.40759277), (0.61312807, 1.2215333, 0.4148987), (0.6234375, 1.2, 0.421875), (0.49699998, 1.2, 0.49699998), (0.49124512, 1.2215333, 0.49124515), (0.49006638, 1.236914, 0.4900664), (0.49263185, 1.2461426, 0.49263185), (0.49810937, 1.2492187, 0.49810934), (0.505667, 1.2461426, 0.505667), (0.51447266, 1.2369142, 0.51447266), (0.52369434, 1.2215333, 0.52369434), (0.5325, 1.2, 0.5325), (0.39375, 1.2, 0.58187497), (0.3891907, 1.2215333, 0.5751374), (0.38825685, 1.236914, 0.5737573), (0.3902893, 1.2461426, 0.5767609), (0.3946289, 1.2492187, 0.5831738), (0.40061647, 1.2461426, 0.59202206), (0.40759277, 1.2369142, 0.6023315), (0.4148987, 1.2215333, 0.61312807), (0.421875, 1.2, 0.6234375), (0.27475, 1.2, 0.64575), (0.2715686, 1.2215333, 0.63827264), (0.27091697, 1.2369142, 0.6367412), (0.27233517, 1.2461426, 0.6400745), (0.2753633, 1.2492187, 0.6471914), (0.27954125, 1.2461426, 0.657011), (0.28440917, 1.2369142, 0.66845214), (0.2895071, 1.2215333, 0.68043387), (0.294375, 1.2, 0.691875), (0.142625, 1.2, 0.686), (0.14097351, 1.2215333, 0.6780566), (0.14063525, 1.2369139, 0.6764297), (0.14137144, 1.2461426, 0.67997074), (0.14294335, 1.2492187, 0.6875313), (0.14511217, 1.2461426, 0.6979629), (0.14763916, 1.2369142, 0.7101172), (0.15028553, 1.2215333, 0.7228457), (0.1528125, 1.2, 0.735), (0, 1.2, 0.7), (0, 1.2215333, 0.69189453), (0, 1.2369139, 0.69023436), (0, 1.2461426, 0.69384766), (0, 1.2492187, 0.7015625), (0, 1.2461426, 0.712207), (0, 1.2369142, 0.7246094), (0, 1.2215333, 0.73759764), (0, 1.2, 0.75), (-0.1555449, 1.2000002, 0.686), (-0.14962883, 1.2215334, 0.6780566), (-0.14608583, 1.2369139, 0.6764297), (-0.14452572, 1.2461426, 0.67997074), (-0.14455834, 1.249219, 0.6875313), (-0.1457935, 1.2461426, 0.6979629), (-0.14784102, 1.2369142, 0.7101172), (-0.15031075, 1.2215333, 0.7228457), (-0.1528125, 1.2000002, 0.735), (-0.29373437, 1.2, 0.64575), (-0.28428665, 1.2215333, 0.63827264), (-0.278926, 1.2369142, 0.6367412), (-0.27697003, 1.2461426, 0.64007443), (-0.27773634, 1.2492187, 0.6471914), (-0.28054237, 1.2461426, 0.657011), (-0.28470582, 1.2369142, 0.66845214), (-0.28954417, 1.2215333, 0.68043387), (-0.294375, 1.2, 0.691875), (-0.4135254, 1.2, 0.58187497), (-0.40243867, 1.2215333, 0.5751374), (-0.3965996, 1.236914, 0.5737573), (-0.39511728, 1.2461426, 0.5767609), (-0.39710084, 1.2492187, 0.5831738), (-0.4016593, 1.2461426, 0.59202206), (-0.40790176, 1.2369142, 0.6023315), (-0.41493732, 1.2215333, 0.61312807), (-0.421875, 1.2, 0.6234375), (-0.51387495, 1.2, 0.49699998), (-0.50255, 1.2215333, 0.49124515), (-0.4971855, 1.236914, 0.4900664), (-0.49675167, 1.2461426, 0.49263185), (-0.50021875, 1.2492187, 0.49810934), (-0.50655687, 1.2461426, 0.505667), (-0.51473635, 1.2369142, 0.51447266), (-0.5237273, 1.2215333, 0.52369434), (-0.5325, 1.2, 0.5325), (-0.5937402, 1.2, 0.39375), (-0.58308613, 1.2215333, 0.38919067), (-0.57876295, 1.2369142, 0.38825685), (-0.5796577, 1.2461426, 0.3902893), (-0.58465695, 1.2492187, 0.39462888), (-0.5926478, 1.2461426, 0.40061647), (-0.60251695, 1.2369142, 0.40759277), (-0.61315125, 1.2215333, 0.4148987), (-0.6234375, 1.2, 0.421875), (-0.65207815, 1.2, 0.27475), (-0.6425121, 1.2215333, 0.2715686), (-0.6394109, 1.236914, 0.27091694), (-0.64161944, 1.2461426, 0.27233517), (-0.6479824, 1.2492187, 0.27536333), (-0.6573447, 1.2461426, 0.27954125), (-0.66855097, 1.2369142, 0.28440917), (-0.6804462, 1.2215333, 0.2895071), (-0.691875, 1.2, 0.294375), (-0.6878457, 1.2, 0.14262497), (-0.6792931, 1.2215333, 0.14097357), (-0.67720836, 1.236914, 0.14063525), (-0.68042135, 1.2461426, 0.14137149), (-0.68776196, 1.2492187, 0.14294338), (-0.6980603, 1.2461426, 0.14511216), (-0.71014607, 1.2369142, 0.14763916), (-0.7228493, 1.2215333, 0.15028548), (-0.735, 1.2, 0.15281248), (-0.7, 1.2, 0), (-0.69189453, 1.2215333, 0), (-0.69023436, 1.236914, 0), (-0.69384766, 1.2461426, 0), (-0.7015625, 1.2492187, 0), (-0.712207, 1.2461426, 0), (-0.7246094, 1.2369142, 0), (-0.73759764, 1.2215333, 0), (-0.75, 1.2, 0), (-0.686, 1.2000002, -0.14262497), (-0.6780566, 1.2215334, -0.14097345), (-0.6764297, 1.236914, -0.14063525), (-0.67997074, 1.2461426, -0.14137149), (-0.6875313, 1.2492188, -0.14294338), (-0.6979629, 1.2461426, -0.14511216), (-0.7101172, 1.2369142, -0.14763916), (-0.7228457, 1.2215333, -0.15028548), (-0.735, 1.2000002, -0.15281248), (-0.64575, 1.2, -0.27475), (-0.63827264, 1.2215333, -0.27156854), (-0.6367412, 1.236914, -0.27091694), (-0.64007443, 1.2461426, -0.27233517), (-0.6471914, 1.2492187, -0.27536333), (-0.657011, 1.2461426, -0.27954125), (-0.66845214, 1.2369142, -0.28440917), (-0.68043387, 1.2215333, -0.28950715), (-0.691875, 1.2, -0.29437494), (-0.58187497, 1.2, -0.39374995), (-0.5751374, 1.2215333, -0.38919067), (-0.5737573, 1.236914, -0.3882569), (-0.5767609, 1.2461426, -0.3902893), (-0.5831738, 1.2492187, -0.39462888), (-0.59202206, 1.2461426, -0.4006164), (-0.6023315, 1.2369142, -0.40759277), (-0.61312807, 1.2215333, -0.41489863), (-0.6234375, 1.2, -0.421875), (-0.49699998, 1.2, -0.49699998), (-0.49124512, 1.2215333, -0.49124515), (-0.49006638, 1.236914, -0.4900664), (-0.49263185, 1.2461426, -0.4926319), (-0.49810937, 1.2492187, -0.49810934), (-0.505667, 1.2461426, -0.505667), (-0.51447266, 1.2369142, -0.5144727), (-0.52369434, 1.2215333, -0.5236943), (-0.5325, 1.2, -0.5325), (-0.39375, 1.2, -0.58187497), (-0.3891907, 1.2215333, -0.5751374), (-0.38825685, 1.236914, -0.5737573), (-0.3902893, 1.2461426, -0.5767609), (-0.3946289, 1.2492187, -0.58317375), (-0.40061647, 1.2461426, -0.59202206), (-0.40759277, 1.2369142, -0.6023315), (-0.4148987, 1.2215333, -0.61312807), (-0.421875, 1.2, -0.6234375), (-0.27475, 1.2, -0.64575005), (-0.2715686, 1.2215333, -0.63827264), (-0.27091697, 1.236914, -0.6367413), (-0.27233517, 1.2461426, -0.6400745), (-0.2753633, 1.2492187, -0.6471914), (-0.27954125, 1.2461426, -0.65701103), (-0.28440917, 1.2369142, -0.66845214), (-0.2895071, 1.2215333, -0.68043387), (-0.294375, 1.2, -0.691875), (-0.142625, 1.2, -0.686), (-0.14097351, 1.2215333, -0.6780566), (-0.14063525, 1.236914, -0.6764296), (-0.14137144, 1.2461426, -0.67997074), (-0.14294335, 1.2492187, -0.68753123), (-0.14511217, 1.2461426, -0.6979629), (-0.14763916, 1.2369142, -0.7101172), (-0.15028553, 1.2215333, -0.7228457), (-0.1528125, 1.2, -0.735), (0, 1.2, -0.70000005), (0, 1.2215333, -0.69189453), (0, 1.236914, -0.6902343), (0, 1.2461426, -0.69384766), (0, 1.2492187, -0.7015625), (0, 1.2461426, -0.7122071), (0, 1.2369142, -0.7246094), (0, 1.2215333, -0.7375977), (0, 1.2, -0.75), (0.14262499, 1.2000002, -0.686), (0.1409735, 1.2215334, -0.6780566), (0.14063524, 1.236914, -0.6764296), (0.14137144, 1.2461426, -0.67997074), (0.14294335, 1.2492188, -0.68753135), (0.14511217, 1.2461426, -0.6979629), (0.14763916, 1.2369142, -0.7101172), (0.15028551, 1.2215333, -0.7228457), (0.1528125, 1.2000002, -0.735), (0.27475, 1.2, -0.64575005), (0.2715686, 1.2215333, -0.63827264), (0.27091697, 1.236914, -0.6367413), (0.27233517, 1.2461426, -0.6400745), (0.2753633, 1.2492187, -0.6471914), (0.27954125, 1.2461426, -0.65701103), (0.28440917, 1.2369142, -0.66845214), (0.2895071, 1.2215333, -0.68043387), (0.294375, 1.2, -0.691875), (0.39374998, 1.2, -0.58187497), (0.38919067, 1.2215333, -0.5751374), (0.38825685, 1.236914, -0.5737573), (0.3902893, 1.2461426, -0.5767609), (0.3946289, 1.2492187, -0.58317375), (0.40061647, 1.2461426, -0.59202206), (0.40759277, 1.2369142, -0.6023315), (0.4148987, 1.2215333, -0.61312807), (0.421875, 1.2, -0.6234375), (0.497, 1.2, -0.49699998), (0.49124512, 1.2215333, -0.49124515), (0.49006638, 1.236914, -0.4900664), (0.49263185, 1.2461426, -0.4926319), (0.49810937, 1.2492187, -0.49810934), (0.505667, 1.2461426, -0.505667), (0.51447266, 1.2369142, -0.5144727), (0.52369434, 1.2215333, -0.5236943), (0.5325, 1.2, -0.5325), (0.58187497, 1.2, -0.39374995), (0.5751374, 1.2215333, -0.38919067), (0.5737573, 1.236914, -0.3882569), (0.5767609, 1.2461426, -0.3902893), (0.5831738, 1.2492187, -0.39462888), (0.59202206, 1.2461426, -0.4006164), (0.6023315, 1.2369142, -0.40759277), (0.61312807, 1.2215333, -0.41489863), (0.6234375, 1.2, -0.421875), (0.64575, 1.2, -0.27475), (0.63827264, 1.2215333, -0.27156854), (0.6367412, 1.236914, -0.27091694), (0.6400745, 1.2461426, -0.27233517), (0.6471914, 1.2492187, -0.27536333), (0.657011, 1.2461426, -0.27954125), (0.66845214, 1.2369142, -0.28440917), (0.68043387, 1.2215333, -0.28950715), (0.691875, 1.2, -0.29437494), (0.686, 1.2, -0.14262497), (0.6780566, 1.2215333, -0.14097357), (0.6764297, 1.236914, -0.14063525), (0.67997074, 1.2461426, -0.14137149), (0.6875313, 1.2492187, -0.14294338), (0.6979629, 1.2461426, -0.14511216), (0.7101172, 1.2369142, -0.14763916), (0.7228457, 1.2215333, -0.15028548), (0.735, 1.2, -0.15281248), (0.79663086, 1.1016358, 0), (0.8417969, 1.003711, 0), (0.8840332, 0.906665, 0), (0.921875, 0.81093746, 0), (0.9538574, 0.71696776, 0), (0.9785156, 0.62519526, 0), (0.99438477, 0.53605956, 0), (1, 0.45, 0), (0.78069824, 1.1016359, 0.16231352), (0.8249609, 1.003711, 0.17151612), (0.8663525, 0.90666497, 0.18012178), (0.9034375, 0.8109375, 0.187832), (0.93478024, 0.7169677, 0.19434845), (0.9589453, 0.62519526, 0.19937256), (0.9744971, 0.5360595, 0.2026059), (0.98, 0.44999993, 0.20375), (0.73489195, 1.1016358, 0.31267762), (0.77655756, 1.003711, 0.33040524), (0.81552064, 0.90666497, 0.34698302), (0.8504297, 0.8109374, 0.36183593), (0.8799335, 0.7169677, 0.37438905), (0.90268064, 0.62519526, 0.3840674), (0.9173199, 0.53605956, 0.39029604), (0.9225, 0.45, 0.39249998), (0.6621994, 1.1016358, 0.44810486), (0.6997436, 1.003711, 0.47351074), (0.7348526, 0.9066651, 0.49726868), (0.7663086, 0.8109374, 0.5185547), (0.792894, 0.7169678, 0.5365448), (0.8133911, 0.62519526, 0.55041504), (0.8265823, 0.5360596, 0.55934143), (0.83125, 0.45000005, 0.5625), (0.5656079, 1.1016358, 0.5656079), (0.5976758, 1.003711, 0.5976758), (0.6276637, 0.906665, 0.6276637), (0.6545313, 0.81093746, 0.6545313), (0.6772388, 0.7169677, 0.6772388), (0.69474614, 0.62519526, 0.69474614), (0.7060132, 0.5360596, 0.7060132), (0.71000004, 0.45000005, 0.71000004), (0.44810486, 1.1016358, 0.6621994), (0.47351074, 1.003711, 0.6997436), (0.49726868, 0.906665, 0.7348526), (0.5185547, 0.81093746, 0.7663086), (0.5365448, 0.7169677, 0.792894), (0.55041504, 0.62519526, 0.8133911), (0.55934143, 0.5360595, 0.8265823), (0.5625, 0.45, 0.83125), (0.3126776, 1.1016359, 0.73489195), (0.33040527, 1.003711, 0.77655756), (0.34698305, 0.90666497, 0.81552064), (0.36183593, 0.81093746, 0.8504297), (0.37438905, 0.7169677, 0.8799335), (0.3840674, 0.62519526, 0.90268064), (0.39029604, 0.5360595, 0.9173199), (0.39249998, 0.44999993, 0.9225), (0.16231354, 1.1016358, 0.7806982), (0.1715161, 1.003711, 0.8249609), (0.18012178, 0.906665, 0.8663525), (0.18783203, 0.8109375, 0.9034375), (0.19434844, 0.7169677, 0.93478024), (0.19937256, 0.62519526, 0.9589453), (0.20260589, 0.5360596, 0.9744971), (0.20375, 0.45000005, 0.98), (0, 1.1016358, 0.79663086), (0, 1.003711, 0.8417969), (0, 0.9066651, 0.8840332), (0, 0.8109374, 0.921875), (0, 0.7169678, 0.9538574), (0, 0.62519526, 0.9785156), (0, 0.5360596, 0.99438477), (0, 0.45000005, 1), (-0.16231354, 1.1016359, 0.78069824), (-0.1715161, 1.003711, 0.8249609), (-0.18012178, 0.906665, 0.8663525), (-0.18783203, 0.8109375, 0.9034375), (-0.19434844, 0.7169677, 0.93478024), (-0.19937256, 0.62519526, 0.9589453), (-0.20260589, 0.5360595, 0.9744971), (-0.20375, 0.44999993, 0.98), (-0.3126776, 1.1016359, 0.73489195), (-0.33040527, 1.003711, 0.77655756), (-0.34698305, 0.90666497, 0.81552064), (-0.36183593, 0.81093746, 0.8504297), (-0.37438905, 0.7169677, 0.8799335), (-0.3840674, 0.62519526, 0.90268064), (-0.39029604, 0.5360595, 0.9173199), (-0.39249998, 0.44999993, 0.9225), (-0.44810486, 1.1016358, 0.6621994), (-0.47351074, 1.003711, 0.6997436), (-0.49726868, 0.906665, 0.7348526), (-0.5185547, 0.81093746, 0.7663086), (-0.5365448, 0.7169677, 0.792894), (-0.55041504, 0.62519526, 0.8133911), (-0.55934143, 0.5360595, 0.8265823), (-0.5625, 0.45, 0.83125), (-0.5656079, 1.1016358, 0.5656079), (-0.5976758, 1.003711, 0.5976758), (-0.6276637, 0.906665, 0.6276637), (-0.6545313, 0.81093746, 0.6545313), (-0.6772388, 0.7169677, 0.6772388), (-0.69474614, 0.62519526, 0.69474614), (-0.7060132, 0.5360596, 0.7060132), (-0.71000004, 0.45000005, 0.71000004), (-0.6621994, 1.1016358, 0.44810486), (-0.6997436, 1.003711, 0.47351074), (-0.7348526, 0.9066651, 0.49726868), (-0.7663086, 0.8109374, 0.5185547), (-0.792894, 0.7169678, 0.5365448), (-0.8133911, 0.62519526, 0.55041504), (-0.8265823, 0.5360595, 0.55934143), (-0.83125, 0.44999993, 0.5625), (-0.73489195, 1.1016358, 0.31267762), (-0.77655756, 1.003711, 0.33040524), (-0.81552064, 0.90666497, 0.34698302), (-0.8504297, 0.8109374, 0.36183593), (-0.8799335, 0.7169677, 0.37438905), (-0.90268064, 0.62519526, 0.3840674), (-0.9173199, 0.53605956, 0.39029604), (-0.9225, 0.45, 0.39249998), (-0.7806982, 1.1016358, 0.16231352), (-0.8249609, 1.003711, 0.17151612), (-0.8663525, 0.90666497, 0.18012178), (-0.9034375, 0.8109375, 0.18783206), (-0.93478024, 0.71696776, 0.19434845), (-0.9589453, 0.62519526, 0.19937256), (-0.9744971, 0.53605956, 0.2026059), (-0.98, 0.45, 0.20375), (-0.79663086, 1.1016358, 0), (-0.8417969, 1.003711, 0), (-0.8840332, 0.906665, 0), (-0.921875, 0.81093746, 0), (-0.9538574, 0.71696776, 0), (-0.9785156, 0.62519526, 0), (-0.99438477, 0.53605956, 0), (-1, 0.45, 0), (-0.78069824, 1.1016359, -0.16231358), (-0.8249609, 1.003711, -0.17151606), (-0.8663525, 0.906665, -0.18012172), (-0.9034375, 0.8109375, -0.187832), (-0.93478024, 0.7169677, -0.19434845), (-0.9589453, 0.62519526, -0.19937253), (-0.9744971, 0.5360595, -0.2026059), (-0.98, 0.44999996, -0.20374998), (-0.73489195, 1.1016358, -0.31267762), (-0.77655756, 1.003711, -0.33040524), (-0.81552064, 0.9066651, -0.34698302), (-0.8504297, 0.81093746, -0.3618359), (-0.8799335, 0.71696776, -0.374389), (-0.90268064, 0.62519526, -0.38406742), (-0.9173199, 0.53605956, -0.39029604), (-0.9225, 0.45, -0.39249998), (-0.6621994, 1.1016358, -0.44810486), (-0.6997436, 1.003711, -0.47351074), (-0.7348526, 0.906665, -0.49726874), (-0.7663086, 0.81093746, -0.5185546), (-0.792894, 0.71696776, -0.53654486), (-0.8133911, 0.62519526, -0.55041504), (-0.8265823, 0.53605956, -0.5593415), (-0.83125, 0.45, -0.56250006), (-0.5656079, 1.1016358, -0.5656079), (-0.5976758, 1.003711, -0.5976758), (-0.6276637, 0.906665, -0.6276637), (-0.6545313, 0.81093746, -0.6545313), (-0.6772388, 0.71696776, -0.67723876), (-0.69474614, 0.62519526, -0.69474614), (-0.7060132, 0.53605956, -0.70601326), (-0.71000004, 0.45, -0.7100001), (-0.44810486, 1.1016358, -0.6621994), (-0.47351074, 1.003711, -0.6997436), (-0.49726868, 0.906665, -0.7348526), (-0.5185547, 0.81093746, -0.7663086), (-0.5365448, 0.71696776, -0.79289395), (-0.55041504, 0.62519526, -0.8133911), (-0.55934143, 0.5360595, -0.8265823), (-0.5625, 0.44999996, -0.8312501), (-0.3126776, 1.1016358, -0.734892), (-0.33040527, 1.003711, -0.77655756), (-0.34698305, 0.906665, -0.8155206), (-0.36183593, 0.81093746, -0.8504297), (-0.37438905, 0.71696776, -0.8799334), (-0.3840674, 0.62519526, -0.90268064), (-0.39029604, 0.53605956, -0.91731983), (-0.39249998, 0.45, -0.92249995), (-0.16231354, 1.1016358, -0.7806982), (-0.1715161, 1.003711, -0.82496095), (-0.18012178, 0.906665, -0.8663525), (-0.18783203, 0.81093746, -0.90343755), (-0.19434844, 0.71696776, -0.9347802), (-0.19937256, 0.62519526, -0.9589453), (-0.20260589, 0.53605956, -0.97449714), (-0.20375, 0.45, -0.9800001), (0, 1.1016358, -0.79663086), (0, 1.003711, -0.8417969), (0, 0.906665, -0.88403326), (0, 0.81093746, -0.92187494), (0, 0.71696776, -0.9538575), (0, 0.62519526, -0.9785156), (0, 0.53605956, -0.9943848), (0, 0.45, -1), (0.16231354, 1.1016359, -0.7806983), (0.1715161, 1.003711, -0.82496095), (0.18012178, 0.906665, -0.8663525), (0.18783203, 0.8109375, -0.9034375), (0.19434844, 0.7169677, -0.93478024), (0.19937256, 0.62519526, -0.9589453), (0.20260589, 0.5360595, -0.9744971), (0.20375, 0.44999993, -0.98), (0.3126776, 1.1016358, -0.734892), (0.33040527, 1.003711, -0.77655756), (0.34698305, 0.906665, -0.8155206), (0.36183593, 0.81093746, -0.8504297), (0.37438905, 0.71696776, -0.8799334), (0.3840674, 0.62519526, -0.90268064), (0.39029604, 0.53605956, -0.91731983), (0.39249998, 0.45, -0.92249995), (0.44810486, 1.1016358, -0.6621994), (0.47351074, 1.003711, -0.6997436), (0.49726868, 0.906665, -0.7348526), (0.5185547, 0.81093746, -0.7663086), (0.5365448, 0.71696776, -0.79289395), (0.55041504, 0.62519526, -0.8133911), (0.55934143, 0.53605956, -0.82658225), (0.5625, 0.45, -0.83125), (0.5656079, 1.1016358, -0.5656079), (0.5976758, 1.003711, -0.5976758), (0.6276637, 0.906665, -0.6276637), (0.6545313, 0.81093746, -0.6545313), (0.6772388, 0.71696776, -0.67723876), (0.69474614, 0.62519526, -0.69474614), (0.7060132, 0.53605956, -0.70601326), (0.71000004, 0.45, -0.7100001), (0.6621994, 1.1016358, -0.44810486), (0.6997436, 1.003711, -0.47351074), (0.7348526, 0.906665, -0.49726874), (0.7663086, 0.81093746, -0.5185546), (0.792894, 0.71696776, -0.53654486), (0.8133911, 0.62519526, -0.55041504), (0.8265823, 0.5360595, -0.55934143), (0.83125, 0.44999996, -0.5625), (0.73489195, 1.1016358, -0.31267762), (0.77655756, 1.003711, -0.33040524), (0.81552064, 0.9066651, -0.34698302), (0.8504297, 0.81093746, -0.3618359), (0.8799335, 0.71696776, -0.374389), (0.90268064, 0.62519526, -0.38406742), (0.9173199, 0.53605956, -0.39029604), (0.9225, 0.45, -0.39249998), (0.7806982, 1.1016358, -0.16231358), (0.8249609, 1.003711, -0.17151606), (0.8663525, 0.906665, -0.18012172), (0.9034375, 0.8109374, -0.18783206), (0.93478024, 0.71696776, -0.19434845), (0.9589453, 0.62519526, -0.19937253), (0.9744971, 0.53605956, -0.2026059), (0.98, 0.45, -0.20375001), (0.9892578, 0.37082517, 0), (0.9609375, 0.3017578, 0), (0.92089844, 0.2423584, 0), (0.875, 0.1921875, 0), (0.82910156, 0.15080565, 0), (0.7890625, 0.117773436, 0), (0.7607422, 0.09265137, 0), (0.75, 0.075, 0), (0.96947265, 0.3708251, 0.20156126), (0.9417187, 0.3017578, 0.19579104), (0.9024805, 0.24235837, 0.18763305), (0.8575, 0.19218749, 0.17828125), (0.81251955, 0.15080567, 0.16892944), (0.7732812, 0.11777344, 0.16077149), (0.7455273, 0.09265137, 0.15500122), (0.735, 0.075, 0.1528125), (0.91259027, 0.3708252, 0.3882837), (0.88646483, 0.30175778, 0.37716797), (0.84952885, 0.24235839, 0.36145264), (0.8071875, 0.19218749, 0.3434375), (0.76484615, 0.15080565, 0.32542235), (0.72791016, 0.11777344, 0.30970705), (0.7017847, 0.09265137, 0.29859132), (0.691875, 0.07499999, 0.294375), (0.8223206, 0.37082517, 0.5564575), (0.7987793, 0.3017578, 0.54052734), (0.76549685, 0.24235839, 0.5180054), (0.72734374, 0.19218749, 0.4921875), (0.6891907, 0.15080565, 0.46636963), (0.6559082, 0.11777341, 0.44384766), (0.632367, 0.09265137, 0.42791748), (0.6234375, 0.07499999, 0.421875), (0.702373, 0.37082517, 0.702373), (0.6822657, 0.3017578, 0.6822657), (0.6538379, 0.24235839, 0.6538379), (0.62125003, 0.19218749, 0.62125003), (0.58866215, 0.15080565, 0.58866215), (0.5602344, 0.11777341, 0.5602344), (0.540127, 0.09265137, 0.540127), (0.5325, 0.07499999, 0.5325), (0.5564575, 0.37082517, 0.8223206), (0.54052734, 0.30175775, 0.7987793), (0.5180054, 0.24235833, 0.76549685), (0.4921875, 0.19218749, 0.72734374), (0.46636963, 0.15080565, 0.6891907), (0.44384766, 0.11777341, 0.6559082), (0.42791748, 0.09265137, 0.632367), (0.421875, 0.07499999, 0.6234375), (0.3882837, 0.37082517, 0.91259027), (0.37716797, 0.3017578, 0.88646483), (0.36145264, 0.24235839, 0.84952885), (0.3434375, 0.19218749, 0.8071875), (0.32542235, 0.15080565, 0.76484615), (0.30970705, 0.11777341, 0.72791016), (0.29859132, 0.09265137, 0.7017847), (0.294375, 0.07499999, 0.691875), (0.20156126, 0.37082517, 0.96947265), (0.19579104, 0.3017578, 0.9417187), (0.18763305, 0.24235845, 0.9024805), (0.17828125, 0.19218749, 0.8575), (0.16892944, 0.15080565, 0.81251955), (0.16077149, 0.11777341, 0.7732812), (0.15500122, 0.09265137, 0.7455273), (0.1528125, 0.07499999, 0.735), (0, 0.37082517, 0.9892578), (0, 0.3017578, 0.9609375), (0, 0.24235845, 0.92089844), (0, 0.19218755, 0.875), (0, 0.15080565, 0.82910156), (0, 0.11777341, 0.7890625), (0, 0.09265137, 0.7607422), (0, 0.07499999, 0.75), (-0.20156126, 0.37082517, 0.96947265), (-0.19579104, 0.3017578, 0.9417187), (-0.18763305, 0.24235833, 0.9024805), (-0.17828125, 0.19218749, 0.8575), (-0.16892944, 0.15080565, 0.81251955), (-0.16077149, 0.11777341, 0.7732812), (-0.15500122, 0.09265137, 0.7455273), (-0.1528125, 0.07499999, 0.735), (-0.3882837, 0.37082517, 0.91259027), (-0.37716797, 0.3017578, 0.88646483), (-0.36145264, 0.24235839, 0.84952885), (-0.3434375, 0.19218749, 0.8071875), (-0.32542235, 0.15080565, 0.76484615), (-0.30970705, 0.11777341, 0.72791016), (-0.29859132, 0.09265137, 0.7017847), (-0.294375, 0.07499999, 0.691875), (-0.5564575, 0.37082517, 0.8223206), (-0.54052734, 0.30175775, 0.7987793), (-0.5180054, 0.24235845, 0.76549685), (-0.4921875, 0.19218749, 0.72734374), (-0.46636963, 0.15080565, 0.6891907), (-0.44384766, 0.11777341, 0.6559082), (-0.42791748, 0.09265137, 0.632367), (-0.421875, 0.07499999, 0.6234375), (-0.702373, 0.37082517, 0.702373), (-0.6822657, 0.3017578, 0.6822657), (-0.6538379, 0.24235839, 0.6538379), (-0.62125003, 0.19218749, 0.62125003), (-0.58866215, 0.15080565, 0.58866215), (-0.5602344, 0.11777341, 0.5602344), (-0.540127, 0.09265137, 0.540127), (-0.5325, 0.07499999, 0.5325), (-0.8223206, 0.37082517, 0.5564575), (-0.7987793, 0.3017578, 0.54052734), (-0.76549685, 0.24235839, 0.5180054), (-0.72734374, 0.19218749, 0.4921875), (-0.6891907, 0.15080565, 0.46636963), (-0.6559082, 0.11777341, 0.44384766), (-0.632367, 0.09265137, 0.42791748), (-0.6234375, 0.07499999, 0.421875), (-0.91259027, 0.3708252, 0.3882837), (-0.88646483, 0.30175778, 0.37716797), (-0.84952885, 0.24235839, 0.36145264), (-0.8071875, 0.19218749, 0.3434375), (-0.76484615, 0.15080565, 0.32542235), (-0.72791016, 0.11777344, 0.30970705), (-0.7017847, 0.09265137, 0.29859132), (-0.691875, 0.07499999, 0.294375), (-0.96947265, 0.37082517, 0.20156126), (-0.9417187, 0.3017578, 0.19579104), (-0.9024805, 0.2423584, 0.18763305), (-0.8575, 0.19218749, 0.17828125), (-0.81251955, 0.15080567, 0.16892944), (-0.7732812, 0.11777344, 0.16077149), (-0.7455273, 0.09265137, 0.15500122), (-0.735, 0.075, 0.1528125), (-0.9892578, 0.37082517, 0), (-0.9609375, 0.3017578, 0), (-0.92089844, 0.2423584, 0), (-0.875, 0.1921875, 0), (-0.82910156, 0.15080565, 0), (-0.7890625, 0.117773436, 0), (-0.7607422, 0.09265137, 0), (-0.75, 0.075, 0), (-0.96947265, 0.37082514, -0.20156124), (-0.9417187, 0.3017578, -0.19579104), (-0.9024805, 0.24235839, -0.18763304), (-0.8575, 0.19218749, -0.17828125), (-0.81251955, 0.15080565, -0.16892946), (-0.7732812, 0.117773436, -0.16077149), (-0.7455273, 0.09265137, -0.15500122), (-0.735, 0.07500001, -0.15281248), (-0.91259027, 0.37082517, -0.38828373), (-0.88646483, 0.3017578, -0.37716794), (-0.84952885, 0.2423584, -0.36145264), (-0.8071875, 0.1921875, -0.3434375), (-0.76484615, 0.15080565, -0.32542235), (-0.72791016, 0.11777344, -0.30970705), (-0.7017847, 0.09265137, -0.29859132), (-0.691875, 0.075, -0.294375), (-0.8223206, 0.37082517, -0.5564575), (-0.7987793, 0.3017578, -0.54052734), (-0.76549685, 0.24235839, -0.5180054), (-0.72734374, 0.19218749, -0.4921875), (-0.6891907, 0.15080565, -0.46636963), (-0.6559082, 0.11777344, -0.44384763), (-0.632367, 0.09265137, -0.42791748), (-0.6234375, 0.07499999, -0.421875), (-0.702373, 0.37082517, -0.702373), (-0.6822657, 0.3017578, -0.6822657), (-0.6538379, 0.24235839, -0.6538379), (-0.62125003, 0.19218749, -0.62125003), (-0.58866215, 0.15080565, -0.58866215), (-0.5602344, 0.11777344, -0.5602344), (-0.540127, 0.09265137, -0.540127), (-0.5325, 0.07499999, -0.5325), (-0.5564575, 0.37082514, -0.8223206), (-0.54052734, 0.3017578, -0.79877925), (-0.5180054, 0.24235839, -0.7654968), (-0.4921875, 0.19218749, -0.72734374), (-0.46636963, 0.15080565, -0.6891907), (-0.44384766, 0.11777341, -0.6559082), (-0.42791748, 0.09265137, -0.632367), (-0.421875, 0.07499999, -0.6234375), (-0.3882837, 0.37082517, -0.91259027), (-0.37716797, 0.3017578, -0.88646483), (-0.36145264, 0.24235839, -0.84952885), (-0.3434375, 0.19218749, -0.8071875), (-0.32542235, 0.15080565, -0.76484615), (-0.30970705, 0.11777341, -0.72791016), (-0.29859132, 0.09265137, -0.7017847), (-0.294375, 0.07499999, -0.691875), (-0.20156126, 0.37082517, -0.96947265), (-0.19579104, 0.3017578, -0.9417187), (-0.18763305, 0.24235839, -0.90248054), (-0.17828125, 0.19218749, -0.8575), (-0.16892944, 0.15080565, -0.81251955), (-0.16077149, 0.11777341, -0.7732812), (-0.15500122, 0.09265137, -0.7455273), (-0.1528125, 0.07499999, -0.735), (0, 0.37082517, -0.9892578), (0, 0.3017578, -0.9609375), (0, 0.24235839, -0.9208985), (0, 0.19218749, -0.87500006), (0, 0.15080565, -0.82910156), (0, 0.11777341, -0.7890625), (0, 0.09265137, -0.7607422), (0, 0.07499999, -0.75), (0.20156126, 0.37082517, -0.96947265), (0.19579104, 0.3017578, -0.9417187), (0.18763305, 0.24235839, -0.9024804), (0.17828125, 0.19218749, -0.8575), (0.16892944, 0.15080565, -0.81251955), (0.16077149, 0.11777341, -0.7732812), (0.15500122, 0.09265137, -0.7455273), (0.1528125, 0.07499999, -0.735), (0.3882837, 0.37082517, -0.91259027), (0.37716797, 0.3017578, -0.88646483), (0.36145264, 0.24235839, -0.84952885), (0.3434375, 0.19218749, -0.8071875), (0.32542235, 0.15080565, -0.76484615), (0.30970705, 0.11777341, -0.72791016), (0.29859132, 0.09265137, -0.7017847), (0.294375, 0.07499999, -0.691875), (0.5564575, 0.37082517, -0.8223206), (0.54052734, 0.3017578, -0.79877925), (0.5180054, 0.24235839, -0.7654969), (0.4921875, 0.19218749, -0.72734374), (0.46636963, 0.15080565, -0.6891907), (0.44384766, 0.11777341, -0.6559082), (0.42791748, 0.09265137, -0.632367), (0.421875, 0.07499999, -0.6234375), (0.702373, 0.37082517, -0.702373), (0.6822657, 0.3017578, -0.6822657), (0.6538379, 0.24235839, -0.6538379), (0.62125003, 0.19218749, -0.62125003), (0.58866215, 0.15080565, -0.58866215), (0.5602344, 0.11777344, -0.5602344), (0.540127, 0.09265137, -0.540127), (0.5325, 0.07499999, -0.5325), (0.8223206, 0.37082514, -0.5564575), (0.7987793, 0.3017578, -0.54052734), (0.76549685, 0.24235839, -0.5180054), (0.72734374, 0.19218749, -0.4921875), (0.6891907, 0.15080565, -0.46636963), (0.6559082, 0.11777344, -0.44384763), (0.632367, 0.09265137, -0.42791748), (0.6234375, 0.07499999, -0.421875), (0.91259027, 0.37082517, -0.38828373), (0.88646483, 0.3017578, -0.37716794), (0.84952885, 0.2423584, -0.36145264), (0.8071875, 0.1921875, -0.3434375), (0.76484615, 0.15080565, -0.32542235), (0.72791016, 0.11777344, -0.30970705), (0.7017847, 0.09265137, -0.29859132), (0.691875, 0.075, -0.294375), (0.96947265, 0.37082517, -0.20156127), (0.9417187, 0.3017578, -0.19579104), (0.9024805, 0.2423584, -0.18763305), (0.8575, 0.1921875, -0.17828123), (0.81251955, 0.15080565, -0.16892946), (0.7732812, 0.117773436, -0.16077149), (0.7455273, 0.09265137, -0.15500122), (0.735, 0.075, -0.1528125), (0.74699706, 0.06101075, 0), (0.7330078, 0.04746094, 0), (0.7005615, 0.03479004, 0), (0.6421875, 0.0234375, 0), (0.55041504, 0.013842774, 0), (0.41777343, 0.006445313, 0), (0.23679197, 0.0016845703, 0), (0, 0, 0), (0.7320571, 0.06101075, 0.15220065), (0.7183476, 0.047460943, 0.14935035), (0.68655026, 0.03479004, 0.14273942), (0.62934375, 0.0234375, 0.1308457), (0.53940666, 0.013842776, 0.11214706), (0.40941796, 0.006445311, 0.08512134), (0.23205614, 0.0016845688, 0.048246372), (0.6891048, 0.06101075, 0.29319635), (0.6761997, 0.047460943, 0.28770557), (0.646268, 0.03479004, 0.2749704), (0.59241796, 0.0234375, 0.2520586), (0.50775784, 0.013842776, 0.2160379), (0.385396, 0.0064453185, 0.16397607), (0.21844062, 0.0016845688, 0.09294086), (0.6209414, 0.06101075, 0.42018586), (0.6093128, 0.047460943, 0.4123169), (0.5823418, 0.03479004, 0.39406586), (0.53381836, 0.0234375, 0.36123046), (0.45753247, 0.0138427615, 0.30960846), (0.34727415, 0.0064453185, 0.23499756), (0.19683334, 0.0016845763, 0.13319549), (0.530368, 0.06101072, 0.530368), (0.5204356, 0.047460914, 0.5204356), (0.4973987, 0.03479007, 0.4973987), (0.45595312, 0.0234375, 0.45595312), (0.3907947, 0.0138427615, 0.3907947), (0.29661915, 0.0064453185, 0.29661915), (0.16812232, 0.0016845763, 0.16812232), (0.42018586, 0.06101072, 0.6209414), (0.4123169, 0.047460914, 0.6093128), (0.39406586, 0.03479004, 0.5823418), (0.36123046, 0.0234375, 0.53381836), (0.30960846, 0.0138427615, 0.45753247), (0.23499756, 0.0064453185, 0.34727415), (0.13319549, 0.0016845763, 0.19683334), (0.29319635, 0.06101072, 0.6891048), (0.28770557, 0.047460914, 0.6761997), (0.2749704, 0.03479004, 0.646268), (0.2520586, 0.0234375, 0.59241796), (0.2160379, 0.0138427615, 0.50775784), (0.16397607, 0.0064453185, 0.385396), (0.09294086, 0.0016845763, 0.21844062), (0.15220065, 0.06101072, 0.7320571), (0.14935035, 0.047460914, 0.7183476), (0.1427394, 0.03479004, 0.68655026), (0.1308457, 0.0234375, 0.62934375), (0.112147056, 0.0138427615, 0.53940666), (0.08512133, 0.0064453185, 0.40941796), (0.048246365, 0.0016845763, 0.23205614), (0, 0.061010778, 0.746997), (0, 0.047460914, 0.7330078), (0, 0.03479004, 0.7005615), (0, 0.0234375, 0.6421875), (0, 0.0138427615, 0.55041504), (0, 0.0064453185, 0.41777343), (0, 0.0016845763, 0.23679197), (-0.15220065, 0.061010778, 0.7320571), (-0.14935035, 0.047460914, 0.7183476), (-0.14273942, 0.03479004, 0.68655026), (-0.1308457, 0.0234375, 0.62934375), (-0.11214706, 0.0138427615, 0.53940666), (-0.08512134, 0.0064453185, 0.40941796), (-0.048246372, 0.0016845763, 0.23205614), (-0.29319635, 0.06101072, 0.6891048), (-0.28770557, 0.047460914, 0.6761997), (-0.2749704, 0.03479004, 0.646268), (-0.2520586, 0.0234375, 0.59241796), (-0.2160379, 0.0138427615, 0.50775784), (-0.16397607, 0.0064453185, 0.385396), (-0.09294086, 0.0016845763, 0.21844062), (-0.42018586, 0.06101072, 0.6209414), (-0.4123169, 0.047460914, 0.6093128), (-0.39406586, 0.03479004, 0.5823418), (-0.36123046, 0.0234375, 0.53381836), (-0.30960846, 0.0138427615, 0.45753247), (-0.23499756, 0.0064453185, 0.34727415), (-0.13319549, 0.0016845763, 0.19683334), (-0.530368, 0.06101072, 0.530368), (-0.5204356, 0.047460914, 0.5204356), (-0.4973987, 0.03479007, 0.4973987), (-0.45595312, 0.0234375, 0.45595312), (-0.3907947, 0.0138427615, 0.3907947), (-0.29661915, 0.0064453185, 0.29661915), (-0.16812232, 0.0016845763, 0.16812232), (-0.6209414, 0.06101075, 0.42018586), (-0.6093128, 0.047460943, 0.4123169), (-0.5823418, 0.03479004, 0.39406586), (-0.53381836, 0.0234375, 0.36123046), (-0.45753247, 0.0138427615, 0.30960846), (-0.34727415, 0.0064453185, 0.23499756), (-0.19683334, 0.0016845763, 0.13319549), (-0.6891048, 0.06101075, 0.29319635), (-0.6761997, 0.047460943, 0.28770557), (-0.646268, 0.03479004, 0.2749704), (-0.59241796, 0.0234375, 0.2520586), (-0.50775784, 0.013842776, 0.2160379), (-0.385396, 0.0064453185, 0.16397607), (-0.21844062, 0.0016845688, 0.09294086), (-0.7320571, 0.06101075, 0.15220065), (-0.7183476, 0.047460943, 0.14935035), (-0.68655026, 0.03479004, 0.1427394), (-0.62934375, 0.0234375, 0.1308457), (-0.53940666, 0.013842769, 0.112147056), (-0.40941796, 0.006445311, 0.08512133), (-0.23205614, 0.0016845688, 0.048246365), (-0.74699706, 0.06101075, 0), (-0.7330078, 0.04746094, 0), (-0.7005615, 0.03479004, 0), (-0.6421875, 0.0234375, 0), (-0.55041504, 0.013842774, 0), (-0.41777343, 0.006445313, 0), (-0.23679197, 0.0016845703, 0), (-0.7320571, 0.06101075, -0.15220065), (-0.7183476, 0.047460943, -0.14935035), (-0.68655026, 0.03479004, -0.14273942), (-0.62934375, 0.0234375, -0.1308457), (-0.53940666, 0.013842776, -0.11214706), (-0.40941796, 0.006445311, -0.08512134), (-0.23205614, 0.0016845688, -0.048246372), (-0.6891048, 0.06101075, -0.29319635), (-0.6761997, 0.047460943, -0.28770557), (-0.646268, 0.03479004, -0.2749704), (-0.59241796, 0.0234375, -0.2520586), (-0.50775784, 0.013842776, -0.2160379), (-0.385396, 0.0064453185, -0.16397607), (-0.21844062, 0.0016845688, -0.09294086), (-0.6209414, 0.06101075, -0.42018586), (-0.6093128, 0.047460943, -0.4123169), (-0.5823418, 0.03479004, -0.39406586), (-0.53381836, 0.0234375, -0.36123046), (-0.45753247, 0.0138427615, -0.30960846), (-0.34727415, 0.0064453185, -0.23499756), (-0.19683334, 0.0016845763, -0.13319549), (-0.530368, 0.06101075, -0.530368), (-0.5204356, 0.047460943, -0.5204356), (-0.4973987, 0.03479004, -0.49739873), (-0.45595312, 0.0234375, -0.45595312), (-0.3907947, 0.0138427615, -0.3907947), (-0.29661915, 0.0064453185, -0.29661915), (-0.16812232, 0.0016845763, -0.16812232), (-0.42018586, 0.06101072, -0.6209414), (-0.4123169, 0.047460914, -0.6093128), (-0.39406586, 0.03479004, -0.5823418), (-0.36123046, 0.0234375, -0.53381836), (-0.30960846, 0.0138427615, -0.45753247), (-0.23499756, 0.0064453185, -0.34727415), (-0.13319549, 0.0016845763, -0.19683334), (-0.29319635, 0.06101072, -0.6891048), (-0.28770557, 0.047460914, -0.6761997), (-0.2749704, 0.03479004, -0.646268), (-0.2520586, 0.0234375, -0.59241796), (-0.2160379, 0.0138427615, -0.50775784), (-0.16397607, 0.0064453185, -0.385396), (-0.09294086, 0.0016845763, -0.21844062), (-0.15220065, 0.06101072, -0.7320571), (-0.14935035, 0.047460914, -0.7183476), (-0.1427394, 0.03479004, -0.68655026), (-0.1308457, 0.0234375, -0.62934375), (-0.112147056, 0.0138427615, -0.53940666), (-0.08512133, 0.0064453185, -0.40941796), (-0.048246365, 0.0016845763, -0.23205614), (0, 0.061010778, -0.7469971), (0, 0.047460914, -0.7330078), (0, 0.03479004, -0.7005615), (0, 0.0234375, -0.6421875), (0, 0.0138427615, -0.55041504), (0, 0.0064453185, -0.41777343), (0, 0.0016845763, -0.23679197), (0.15220065, 0.061010778, -0.7320571), (0.14935035, 0.047460914, -0.7183476), (0.14273942, 0.03479004, -0.68655026), (0.1308457, 0.0234375, -0.62934375), (0.11214706, 0.0138427615, -0.53940666), (0.08512134, 0.0064453185, -0.40941796), (0.048246372, 0.0016845763, -0.23205614), (0.29319635, 0.06101072, -0.6891048), (0.28770557, 0.047460914, -0.6761997), (0.2749704, 0.03479004, -0.646268), (0.2520586, 0.0234375, -0.59241796), (0.2160379, 0.0138427615, -0.50775784), (0.16397607, 0.0064453185, -0.385396), (0.09294086, 0.0016845763, -0.21844062), (0.42018586, 0.06101072, -0.6209414), (0.4123169, 0.047460914, -0.6093128), (0.39406586, 0.03479004, -0.5823418), (0.36123046, 0.0234375, -0.53381836), (0.30960846, 0.0138427615, -0.45753247), (0.23499756, 0.0064453185, -0.34727415), (0.13319549, 0.0016845763, -0.19683334), (0.530368, 0.06101075, -0.530368), (0.5204356, 0.047460943, -0.5204356), (0.4973987, 0.03479004, -0.49739873), (0.45595312, 0.0234375, -0.45595312), (0.3907947, 0.0138427615, -0.3907947), (0.29661915, 0.0064453185, -0.29661915), (0.16812232, 0.0016845763, -0.16812232), (0.6209414, 0.06101075, -0.42018586), (0.6093128, 0.047460943, -0.4123169), (0.5823418, 0.03479004, -0.39406586), (0.53381836, 0.0234375, -0.36123046), (0.45753247, 0.0138427615, -0.30960846), (0.34727415, 0.0064453185, -0.23499756), (0.19683334, 0.0016845763, -0.13319549), (0.6891048, 0.06101075, -0.29319635), (0.6761997, 0.047460943, -0.28770557), (0.646268, 0.03479004, -0.2749704), (0.59241796, 0.0234375, -0.2520586), (0.50775784, 0.013842776, -0.2160379), (0.385396, 0.0064453185, -0.16397607), (0.21844062, 0.0016845688, -0.09294086), (0.7320571, 0.06101075, -0.15220065), (0.7183476, 0.047460943, -0.14935035), (0.68655026, 0.03479004, -0.1427394), (0.62934375, 0.0234375, -0.1308457), (0.53940666, 0.013842776, -0.11214705), (0.40941796, 0.006445311, -0.08512133), (0.23205614, 0.0016845688, -0.048246365), (-0.8, 1.0125, 0), (-0.9241211, 1.0122805, 0), (-1.0335938, 1.0107422, 0), (-1.127832, 1.0065674, 0), (-1.2062501, 0.9984376, 0), (-1.2682617, 0.9850343, 0), (-1.3132813, 0.9650391, 0), (-1.3407227, 0.9371338, 0), (-1.35, 0.9, 0), (-0.79785156, 1.0173341, 0.049218774), (-0.9241924, 1.0171051, 0.049218774), (-1.0355072, 1.0155009, 0.049218774), (-1.1312351, 1.0111465, 0.049218774), (-1.2108154, 1.0026673, 0.049218774), (-1.2736874, 0.9886881, 0.049218774), (-1.3192902, 0.96783376, 0.049218774), (-1.3470631, 0.93872935, 0.049218774), (-1.3564453, 0.8999999, 0.049218774), (-0.7921875, 1.0300782, 0.084375024), (-0.9243805, 1.0298243, 0.084375024), (-1.0405518, 1.0280458, 0.084375024), (-1.1402069, 1.0232185, 0.084375024), (-1.2228516, 1.0138184, 0.084375024), (-1.2879913, 0.9983208, 0.084375024), (-1.3351319, 0.97520137, 0.084375024), (-1.3637787, 0.94293594, 0.084375024), (-1.3734375, 0.9, 0.084375024), (-0.7841797, 1.0480957, 0.10546875), (-0.9246464, 1.0478065, 0.10546875), (-1.0476837, 1.0457817, 0.10546875), (-1.1528912, 1.040286, 0.10546875), (-1.2398682, 1.0295837, 0.10546875), (-1.3082142, 1.0119395, 0.10546875), (-1.3575287, 0.9856179, 0.10546875), (-1.3874111, 0.94888306, 0.10546875), (-1.3974609, 0.9, 0.10546875), (-0.775, 1.06875, 0.11250001), (-0.9249511, 1.0684204, 0.11250001), (-1.0558594, 1.0661135, 0.11250001), (-1.1674316, 1.059851, 0.11250001), (-1.259375, 1.0476563, 0.11250001), (-1.3313965, 1.0275513, 0.11250001), (-1.383203, 0.99755853, 0.11250001), (-1.4145019, 0.9557006, 0.11250001), (-1.425, 0.8999999, 0.11250001), (-0.7658203, 1.0894043, 0.10546875), (-0.92525595, 1.0890346, 0.10546875), (-1.064035, 1.086445, 0.10546875), (-1.1819721, 1.0794162, 0.10546875), (-1.2788819, 1.0657288, 0.10546875), (-1.3545787, 1.043163, 0.10546875), (-1.4088776, 1.0094993, 0.10546875), (-1.4415928, 0.9625182, 0.10546875), (-1.4525391, 0.89999986, 0.10546875), (-0.7578125, 1.1074219, 0.084375024), (-0.92552185, 1.1070168, 0.084375024), (-1.071167, 1.1041809, 0.084375024), (-1.1946564, 1.0964836, 0.084375024), (-1.2958984, 1.0814941, 0.084375024), (-1.3748016, 1.0567818, 0.084375024), (-1.4312744, 1.0199158, 0.084375024), (-1.4652252, 0.9684653, 0.084375024), (-1.4765625, 0.9, 0.084375024), (-0.75214845, 1.1201661, 0.049218774), (-0.9257099, 1.1197362, 0.049218774), (-1.0762116, 1.116726, 0.049218774), (-1.2036282, 1.1085557, 0.049218774), (-1.3079346, 1.0926453, 0.049218774), (-1.3891056, 1.0664146, 0.049218774), (-1.4471161, 1.0272834, 0.049218774), (-1.4819409, 0.972672, 0.049218774), (-1.4935547, 0.9, 0.049218774), (-0.75, 1.125, 0), (-0.92578125, 1.1245606, 0), (-1.078125, 1.1214844, 0), (-1.2070312, 1.1131347, 0), (-1.3125, 1.096875, 0), (-1.3945312, 1.0700684, 0), (-1.453125, 1.0300782, 0), (-1.4882812, 0.97426754, 0), (-1.5, 0.9, 0), (-0.7521484, 1.1201661, -0.049218774), (-0.9257099, 1.1197362, -0.049218774), (-1.0762116, 1.116726, -0.049218774), (-1.2036282, 1.1085557, -0.049218774), (-1.3079345, 1.0926453, -0.049218774), (-1.3891056, 1.0664145, -0.049218774), (-1.447116, 1.0272834, -0.049218774), (-1.4819406, 0.9726719, -0.049218714), (-1.4935546, 0.8999999, -0.049218774), (-0.7578125, 1.1074219, -0.084375024), (-0.92552185, 1.1070168, -0.084375024), (-1.071167, 1.1041809, -0.084375024), (-1.1946564, 1.0964836, -0.084375024), (-1.2958984, 1.0814941, -0.084375024), (-1.3748016, 1.0567818, -0.084375024), (-1.4312744, 1.0199158, -0.084375024), (-1.4652252, 0.9684654, -0.084374964), (-1.4765625, 0.9, -0.084375024), (-0.7658203, 1.0894043, -0.10546875), (-0.92525595, 1.0890346, -0.10546875), (-1.064035, 1.086445, -0.10546875), (-1.1819721, 1.0794162, -0.10546875), (-1.2788819, 1.0657288, -0.10546875), (-1.3545787, 1.0431631, -0.10546875), (-1.4088776, 1.0094993, -0.10546875), (-1.4415928, 0.9625182, -0.10546875), (-1.4525391, 0.9, -0.10546875), (-0.77500004, 1.06875, -0.11249995), (-0.92495114, 1.0684204, -0.11249995), (-1.0558593, 1.0661134, -0.11250007), (-1.1674316, 1.059851, -0.11249995), (-1.259375, 1.0476563, -0.11249995), (-1.3313965, 1.0275513, -0.11249995), (-1.3832033, 0.9975586, -0.11249995), (-1.414502, 0.95570064, -0.11249995), (-1.4250001, 0.9, -0.11249995), (-0.7841797, 1.0480957, -0.10546875), (-0.9246464, 1.0478065, -0.10546875), (-1.0476837, 1.0457817, -0.10546875), (-1.1528912, 1.040286, -0.10546875), (-1.2398682, 1.0295837, -0.10546875), (-1.3082142, 1.0119395, -0.10546875), (-1.3575287, 0.9856178, -0.10546881), (-1.3874111, 0.94888306, -0.10546875), (-1.3974609, 0.8999999, -0.10546869), (-0.7921875, 1.0300782, -0.084375024), (-0.9243805, 1.0298243, -0.084375024), (-1.0405518, 1.0280458, -0.084375024), (-1.1402069, 1.0232185, -0.084375024), (-1.2228516, 1.0138184, -0.084375024), (-1.2879913, 0.9983209, -0.084374964), (-1.3351319, 0.9752014, -0.084374964), (-1.3637787, 0.94293594, -0.084375024), (-1.3734375, 0.9, -0.084375024), (-0.79785156, 1.0173341, -0.049218774), (-0.9241924, 1.0171051, -0.049218774), (-1.0355072, 1.0155009, -0.049218774), (-1.1312351, 1.0111465, -0.049218774), (-1.2108154, 1.0026673, -0.049218774), (-1.2736874, 0.9886881, -0.049218774), (-1.3192902, 0.9678338, -0.049218714), (-1.3470631, 0.9387294, -0.049218774), (-1.3564453, 0.9, -0.049218774), (-1.3452148, 0.8529785, 0), (-1.3304688, 0.7980469, 0), (-1.3051758, 0.7378418, 0), (-1.26875, 0.675, 0), (-1.2206055, 0.61215824, 0), (-1.1601562, 0.55195314, 0), (-1.0868164, 0.49702147, 0), (-1, 0.45, 0), (-1.3515112, 0.8514127, 0.049218774), (-1.3363266, 0.79534036, 0.049218774), (-1.3103182, 0.73431545, 0.049218774), (-1.2729126, 0.670871, 0.049218774), (-1.2235365, 0.6075398, 0.049218774), (-1.1616166, 0.5468548, 0.049218744), (-1.0865794, 0.49134877, 0.049218744), (-0.9978516, 0.44355467, 0.049218744), (-1.3681107, 0.84728503, 0.084374964), (-1.35177, 0.78820497, 0.084375024), (-1.3238754, 0.7250187, 0.084375024), (-1.2838867, 0.65998536, 0.084375024), (-1.2312638, 0.59536403, 0.084375024), (-1.1654663, 0.5334137, 0.084374994), (-1.0859543, 0.4763935, 0.084374994), (-0.9921875, 0.42656252, 0.084374994), (-1.3915789, 0.84144926, 0.10546875), (-1.3736038, 0.778117, 0.10546875), (-1.3430426, 0.711875, 0.10546875), (-1.2994019, 0.6445954, 0.10546875), (-1.2421885, 0.5781499, 0.10546875), (-1.1709092, 0.5144108, 0.10546875), (-1.0850706, 0.45524985, 0.10546875), (-0.9841797, 0.40253907, 0.10546875), (-1.4184812, 0.8347595, 0.11250001), (-1.3986328, 0.76655275, 0.11250001), (-1.3650147, 0.69680786, 0.11250001), (-1.3171875, 0.6269531, 0.11250001), (-1.2547119, 0.5584168, 0.11250001), (-1.1771485, 0.49262697, 0.11250001), (-1.0840576, 0.43101197, 0.11250001), (-0.97499996, 0.375, 0.11250001), (-1.445384, 0.8280697, 0.10546875), (-1.4236618, 0.7549885, 0.10546875), (-1.3869867, 0.6817407, 0.10546875), (-1.3349731, 0.60931087, 0.10546875), (-1.2672354, 0.5386836, 0.10546875), (-1.1833878, 0.47084314, 0.10546875), (-1.0830446, 0.40677404, 0.10546875), (-0.9658203, 0.34746093, 0.10546875), (-1.4688523, 0.8222339, 0.084375024), (-1.4454956, 0.7449005, 0.084375024), (-1.4061539, 0.66859704, 0.084375024), (-1.3504883, 0.59392095, 0.084375024), (-1.2781601, 0.5214695, 0.084374994), (-1.1888306, 0.45184025, 0.084374994), (-1.082161, 0.38563043, 0.084374994), (-0.9578124, 0.3234375, 0.084374994), (-1.4854517, 0.81810623, 0.049218774), (-1.460939, 0.73776513, 0.049218774), (-1.4197111, 0.65930027, 0.049218774), (-1.3614625, 0.5830353, 0.049218774), (-1.2858874, 0.50929374, 0.049218744), (-1.1926805, 0.43839914, 0.049218744), (-1.0815359, 0.37067515, 0.049218744), (-0.95214844, 0.30644533, 0.049218744), (-1.4917481, 0.8165405, 0), (-1.4667969, 0.7350586, 0), (-1.4248536, 0.65577394, 0), (-1.365625, 0.5789063, 0), (-1.2888184, 0.50467527, 0), (-1.1941407, 0.4333008, 0), (-1.0812988, 0.36500245, 0), (-0.95, 0.3, 0), (-1.4854515, 0.8181062, -0.049218774), (-1.4609389, 0.73776513, -0.049218774), (-1.4197111, 0.65930027, -0.049218774), (-1.3614624, 0.58303523, -0.049218774), (-1.2858874, 0.50929374, -0.049218774), (-1.1926805, 0.43839914, -0.049218744), (-1.0815359, 0.37067515, -0.049218744), (-0.95214844, 0.30644533, -0.049218744), (-1.4688523, 0.8222339, -0.084375024), (-1.4454956, 0.7449005, -0.084375024), (-1.4061539, 0.66859704, -0.084375024), (-1.3504883, 0.59392095, -0.084375024), (-1.2781601, 0.5214695, -0.084375024), (-1.1888306, 0.45184022, -0.084375024), (-1.082161, 0.38563043, -0.084374994), (-0.9578124, 0.3234375, -0.084374994), (-1.445384, 0.82806975, -0.10546875), (-1.4236618, 0.7549885, -0.10546875), (-1.3869867, 0.6817407, -0.10546875), (-1.3349731, 0.6093109, -0.10546875), (-1.2672354, 0.5386836, -0.10546875), (-1.1833878, 0.47084314, -0.10546875), (-1.0830446, 0.40677407, -0.10546872), (-0.9658203, 0.34746093, -0.10546875), (-1.4184813, 0.8347595, -0.11250001), (-1.3986329, 0.7665527, -0.11250001), (-1.3650147, 0.69680786, -0.11250001), (-1.3171875, 0.6269531, -0.11250001), (-1.2547119, 0.5584167, -0.11250001), (-1.1771485, 0.49262697, -0.11250001), (-1.0840577, 0.43101197, -0.11250001), (-0.975, 0.375, -0.11250001), (-1.3915789, 0.8414492, -0.10546875), (-1.3736038, 0.778117, -0.10546875), (-1.3430426, 0.711875, -0.10546875), (-1.2994019, 0.6445954, -0.10546875), (-1.2421885, 0.5781499, -0.10546875), (-1.1709092, 0.51441073, -0.10546875), (-1.0850706, 0.4552498, -0.10546875), (-0.9841797, 0.402539, -0.10546875), (-1.3681107, 0.84728515, -0.084374964), (-1.35177, 0.78820497, -0.084375024), (-1.3238754, 0.7250187, -0.084375024), (-1.2838867, 0.65998536, -0.084375024), (-1.2312638, 0.59536403, -0.084375024), (-1.1654663, 0.5334137, -0.084375024), (-1.0859543, 0.4763935, -0.084374994), (-0.9921875, 0.4265625, -0.084375024), (-1.3515112, 0.8514128, -0.049218774), (-1.3363266, 0.79534036, -0.049218774), (-1.3103182, 0.73431545, -0.049218774), (-1.2729126, 0.670871, -0.049218774), (-1.2235365, 0.6075398, -0.049218774), (-1.1616166, 0.54685473, -0.049218774), (-1.0865793, 0.49134874, -0.049218774), (-0.99785155, 0.44355464, -0.049218744), (0.85, 0.7125, 0), (0.9924805, 0.72729486, 0), (1.0898438, 0.7675781, 0), (1.1532227, 0.82719725, 0), (1.19375, 0.9, 0), (1.2225586, 0.9798339, 0), (1.2507813, 1.0605469, 0), (1.2895508, 1.1359863, 0), (1.35, 1.2, 0), (0.8500001, 0.6947753, 0.108281255), (0.995678, 0.7116537, 0.10539091), (1.0948792, 0.75443566, 0.09777099), (1.1591896, 0.81678015, 0.086997986), (1.2001953, 0.8923462, 0.07464844), (1.2294822, 0.97479236, 0.062298894), (1.2586365, 1.0577774, 0.05152583), (1.299244, 1.1349604, 0.043905973), (1.3628907, 1.2000002, 0.041015625), (0.85, 0.64804685, 0.18562502), (1.0041076, 0.6704177, 0.18067014), (1.1081543, 0.7197876, 0.16760743), (1.1749207, 0.7893173, 0.1491394), (1.2171874, 0.87216794, 0.12796879), (1.2477355, 0.96150047, 0.10679811), (1.2793458, 1.0504761, 0.08833009), (1.3247986, 1.1322556, 0.075267315), (1.396875, 1.2, 0.0703125), (0.85, 0.5819825, 0.23203126), (1.0160255, 0.6121188, 0.22583771), (1.1269226, 0.67080235, 0.20950928), (1.1971611, 0.75049037, 0.18642426), (1.2412108, 0.84364027, 0.15996093), (1.2735419, 0.94270885, 0.1334976), (1.3086243, 1.0401535, 0.1104126), (1.3609276, 1.1284316, 0.09408414), (1.4449219, 1.2, 0.087890625), (0.85, 0.50625, 0.2475), (1.0296875, 0.5452881, 0.24089354), (1.1484375, 0.61464846, 0.22347656), (1.2226562, 0.70598143, 0.19885254), (1.26875, 0.8109375, 0.17062497), (1.3031249, 0.92116696, 0.14239746), (1.3421874, 1.0283203, 0.11777341), (1.4023438, 1.124048, 0.10035646), (1.5, 1.2, 0.09375), (0.85, 0.43051752, 0.23203126), (1.0433494, 0.4784574, 0.22583771), (1.1699524, 0.55849457, 0.20950928), (1.2481514, 0.6614725, 0.18642426), (1.296289, 0.77823484, 0.15996093), (1.3327079, 0.8996252, 0.13349766), (1.3757508, 1.0164871, 0.1104126), (1.4437599, 1.1196642, 0.09408414), (1.5550781, 1.2, 0.087890625), (0.85, 0.36445314, 0.185625), (1.0552675, 0.4201584, 0.18067016), (1.1887207, 0.50950927, 0.16760743), (1.2703918, 0.62264556, 0.1491394), (1.3203124, 0.749707, 0.12796879), (1.3585143, 0.8808335, 0.10679811), (1.4050293, 1.0061646, 0.08833009), (1.4798889, 1.1158402, 0.075267315), (1.603125, 1.2, 0.0703125), (0.85, 0.31772465, 0.108281255), (1.0636971, 0.37892246, 0.105390936), (1.2019958, 0.4748612, 0.09777102), (1.2861229, 0.5951826, 0.086997986), (1.3373047, 0.7295288, 0.07464844), (1.3767678, 0.8675417, 0.062298894), (1.4257386, 0.9988633, 0.05152589), (1.5054436, 1.1131355, 0.043905973), (1.6371094, 1.2, 0.041015625), (0.85, 0.3, 0), (1.0668947, 0.36328125, 0), (1.2070314, 0.46171874, 0), (1.2920898, 0.5847656, 0), (1.3437499, 0.72187495, 0), (1.3836913, 0.8625001, 0), (1.4335938, 0.9960938, 0), (1.5151367, 1.1121094, 0), (1.65, 1.2, 0), (0.8500001, 0.31772462, -0.108281255), (1.0636971, 0.37892246, -0.105390936), (1.201996, 0.47486115, -0.09777099), (1.2861229, 0.5951826, -0.086997986), (1.3373048, 0.72952884, -0.07464844), (1.3767678, 0.8675417, -0.062298894), (1.4257386, 0.9988633, -0.05152589), (1.5054435, 1.1131355, -0.043905973), (1.6371093, 1.2000002, -0.041015625), (0.85, 0.3644531, -0.18562499), (1.0552675, 0.42015836, -0.18067017), (1.1887207, 0.50950927, -0.16760743), (1.2703918, 0.62264556, -0.1491394), (1.3203124, 0.749707, -0.12796879), (1.3585143, 0.8808335, -0.10679811), (1.4050293, 1.0061646, -0.08833003), (1.4798889, 1.1158402, -0.075267315), (1.603125, 1.2, -0.0703125), (0.85, 0.43051758, -0.23203126), (1.0433494, 0.47845745, -0.22583771), (1.1699524, 0.55849457, -0.20950925), (1.2481514, 0.6614725, -0.18642426), (1.296289, 0.77823484, -0.15996093), (1.3327079, 0.89962506, -0.13349766), (1.3757508, 1.0164871, -0.1104126), (1.4437599, 1.1196642, -0.09408414), (1.5550781, 1.2, -0.087890625), (0.85, 0.50624996, -0.2475), (1.0296875, 0.5452881, -0.24089354), (1.1484375, 0.6146484, -0.22347659), (1.2226562, 0.70598143, -0.19885254), (1.26875, 0.8109375, -0.17062497), (1.3031249, 0.921167, -0.14239752), (1.3421874, 1.0283203, -0.11777341), (1.4023438, 1.124048, -0.10035646), (1.5, 1.2, -0.09375), (0.85, 0.5819824, -0.23203123), (1.0160255, 0.6121187, -0.22583771), (1.1269226, 0.6708023, -0.20950931), (1.1971611, 0.7504903, -0.18642426), (1.2412108, 0.8436401, -0.15996099), (1.2735419, 0.94270885, -0.1334976), (1.3086243, 1.0401535, -0.1104126), (1.3609276, 1.1284316, -0.09408414), (1.4449219, 1.2, -0.087890625), (0.85, 0.64804685, -0.18562502), (1.0041076, 0.6704177, -0.18067014), (1.1081543, 0.7197876, -0.16760743), (1.1749207, 0.7893173, -0.1491394), (1.2171874, 0.87216794, -0.12796879), (1.2477355, 0.9615005, -0.10679805), (1.2793458, 1.0504761, -0.08833003), (1.3247986, 1.1322556, -0.075267315), (1.396875, 1.2, -0.0703125), (0.85, 0.69477534, -0.108281255), (0.995678, 0.7116537, -0.10539091), (1.0948792, 0.75443566, -0.09777099), (1.1591896, 0.81678015, -0.086997986), (1.2001953, 0.89234614, -0.07464844), (1.2294823, 0.97479224, -0.062298894), (1.2586365, 1.0577774, -0.05152583), (1.299244, 1.1349604, -0.043905973), (1.3628907, 1.2, -0.041015625), (1.3685547, 1.2123047, 0), (1.3859376, 1.2210937, 0), (1.4009765, 1.2263672, 0), (1.4124999, 1.228125, 0), (1.419336, 1.2263672, 0), (1.4203125, 1.2210938, 0), (1.4142578, 1.2123047, 0), (1.4, 1.2, 0), (1.382164, 1.2124535, 0.04031062), (1.399743, 1.2213769, 0.03845215), (1.4145377, 1.2267566, 0.035824537), (1.425458, 1.2285781, 0.032812476), (1.4314137, 1.2268274, 0.029800415), (1.4313148, 1.2214901, 0.027172804), (1.4240716, 1.2125525, 0.025314331), (1.4085937, 1.2000002, 0.024609327), (1.4180428, 1.2128454, 0.069103956), (1.436139, 1.2221236, 0.06591797), (1.4502891, 1.2277834, 0.061413527), (1.459619, 1.2297729, 0.056249976), (1.4632546, 1.2280409, 0.051086426), (1.4603211, 1.2225357, 0.046581984), (1.4499443, 1.2132059, 0.043395996), (1.43125, 1.2, 0.042187452), (1.4687679, 1.2133998, 0.086380005), (1.4875953, 1.2231795, 0.08239746), (1.5008346, 1.229235, 0.07676697), (1.5079165, 1.2314621, 0.0703125), (1.5082712, 1.2297564, 0.06385803), (1.5013299, 1.2240138, 0.05822754), (1.486523, 1.2141297, 0.054244995), (1.4632813, 1.2, 0.052734375), (1.5269165, 1.2140352, 0.09213865), (1.5465821, 1.2243897, 0.087890625), (1.5587769, 1.2308991, 0.08188474), (1.5632813, 1.2333984, 0.07500005), (1.5598755, 1.2317231, 0.068115234), (1.5483398, 1.225708, 0.06210935), (1.5284545, 1.2151887, 0.057861328), (1.5, 1.2, 0.056249976), (1.585065, 1.2146704, 0.086380005), (1.6055688, 1.2255998, 0.08239746), (1.6167191, 1.2325631, 0.07676697), (1.6186463, 1.2353348, 0.0703125), (1.61148, 1.2336895, 0.06385803), (1.5953499, 1.2274023, 0.05822754), (1.5703863, 1.2162476, 0.054244995), (1.5367187, 1.2, 0.052734375), (1.6357902, 1.2152247, 0.069103956), (1.6570251, 1.2266556, 0.06591797), (1.6672646, 1.2340147, 0.061413527), (1.6669436, 1.237024, 0.056249976), (1.6564965, 1.2354052, 0.051086426), (1.6363587, 1.2288804, 0.046581984), (1.6069648, 1.2171714, 0.043395996), (1.56875, 1.2, 0.042187452), (1.6716691, 1.2156167, 0.04031062), (1.6934212, 1.2274022, 0.03845215), (1.7030162, 1.2350416, 0.035824537), (1.7011048, 1.2382187, 0.032812476), (1.6883376, 1.2366185, 0.029800415), (1.6653649, 1.2299258, 0.027172804), (1.6328377, 1.2178247, 0.025314331), (1.5914062, 1.2, 0.024609327), (1.6852783, 1.2157655, 0), (1.7072265, 1.2276856, 0), (1.7165772, 1.235431, 0), (1.7140627, 1.2386719, 0), (1.7004151, 1.2370789, 0), (1.6763673, 1.2303224, 0), (1.6426513, 1.2180727, 0), (1.6, 1.2, 0), (1.6716691, 1.2156168, -0.04031062), (1.6934212, 1.2274022, -0.03845215), (1.7030163, 1.2350416, -0.035824537), (1.7011049, 1.2382187, -0.032812476), (1.6883376, 1.2366186, -0.029800415), (1.665365, 1.2299258, -0.027172804), (1.6328378, 1.2178248, -0.025314331), (1.5914063, 1.2000002, -0.024609327), (1.6357902, 1.2152247, -0.069103956), (1.6570251, 1.2266556, -0.06591797), (1.6672646, 1.2340147, -0.061413527), (1.6669436, 1.237024, -0.056249976), (1.6564965, 1.2354052, -0.051086426), (1.6363587, 1.2288804, -0.046581984), (1.6069648, 1.2171714, -0.043395996), (1.56875, 1.2, -0.042187452), (1.585065, 1.2146704, -0.086380005), (1.6055688, 1.2255998, -0.08239746), (1.6167191, 1.2325631, -0.07676697), (1.6186461, 1.2353348, -0.0703125), (1.61148, 1.2336895, -0.06385803), (1.5953498, 1.2274023, -0.05822754), (1.5703863, 1.2162476, -0.054244995), (1.5367187, 1.2, -0.052734375), (1.5269165, 1.2140352, -0.09213865), (1.546582, 1.2243897, -0.087890625), (1.5587769, 1.2308991, -0.08188474), (1.5632812, 1.2333984, -0.07500005), (1.5598755, 1.2317231, -0.068115234), (1.5483398, 1.225708, -0.06210935), (1.5284545, 1.2151887, -0.057861328), (1.5, 1.2, -0.056249976), (1.4687679, 1.2133998, -0.086380005), (1.4875953, 1.2231795, -0.08239746), (1.5008346, 1.229235, -0.07676697), (1.5079165, 1.2314621, -0.0703125), (1.5082712, 1.2297564, -0.06385803), (1.5013299, 1.2240138, -0.05822754), (1.486523, 1.2141297, -0.054244995), (1.4632813, 1.2, -0.052734375), (1.4180429, 1.2128454, -0.069103956), (1.436139, 1.2221236, -0.06591797), (1.4502891, 1.2277834, -0.061413527), (1.4596192, 1.2297729, -0.056249976), (1.4632547, 1.2280409, -0.051086426), (1.4603211, 1.2225357, -0.046581984), (1.4499443, 1.2132059, -0.043395996), (1.43125, 1.2, -0.042187452), (1.3821639, 1.2124535, -0.04031062), (1.3997428, 1.221377, -0.03845215), (1.4145375, 1.2267566, -0.035824537), (1.4254577, 1.2285782, -0.032812476), (1.4314135, 1.2268274, -0.029800415), (1.4313148, 1.2214903, -0.027172804), (1.4240716, 1.2125525, -0.025314331), (1.4085937, 1.2, -0.024609327), (0, 1.575, 0), (0.115039065, 1.5684083, 0), (0.17031251, 1.5503906, 0), (0.18105468, 1.523584, 0), (0.16250001, 1.490625, 0), (0.12988281, 1.4541504, 0), (0.0984375, 1.4167969, 0), (0.08339844, 1.3812011, 0), (0.1, 1.35, 0), (0.11275007, 1.5684084, 0.023521662), (0.16692355, 1.5503906, 0.034822345), (0.17745164, 1.5235841, 0.037016034), (0.1592654, 1.4906251, 0.033217072), (0.12729599, 1.4541504, 0.026539326), (0.09647452, 1.4167968, 0.020097017), (0.081732154, 1.381201, 0.017004251), (0.098, 1.3499999, 0.020375013), (0.10616391, 1.5684083, 0.0452739), (0.1571726, 1.5503906, 0.06702566), (0.16708475, 1.523584, 0.071249366), (0.14995898, 1.490625, 0.06393945), (0.11985397, 1.4541504, 0.05109024), (0.090828374, 1.4167969, 0.03869605), (0.076940835, 1.3812011, 0.032751203), (0.092250004, 1.35, 0.039250016), (0.095701925, 1.5684083, 0.06483567), (0.1416835, 1.5503906, 0.09598613), (0.15061758, 1.523584, 0.10203636), (0.135177, 1.490625, 0.09157109), (0.10803461, 1.4541504, 0.07317495), (0.081863254, 1.4167969, 0.055432916), (0.06933577, 1.3812011, 0.046929598), (0.083125, 1.35, 0.056249976), (0.0817854, 1.5684083, 0.08178544), (0.121080086, 1.5503906, 0.12108004), (0.12871362, 1.523584, 0.12871361), (0.11551563, 1.490625, 0.11551559), (0.092315674, 1.4541504, 0.092315674), (0.06994336, 1.4167969, 0.06994331), (0.05922827, 1.3812013, 0.0592283), (0.071, 1.3500001, 0.07099998), (0.064835645, 1.5684083, 0.09570193), (0.09598617, 1.5503906, 0.14168346), (0.10203638, 1.523584, 0.1506176), (0.09157104, 1.490625, 0.13517702), (0.07317495, 1.4541504, 0.10803461), (0.055432893, 1.4167969, 0.081863284), (0.046929646, 1.3812011, 0.06933582), (0.056250002, 1.35, 0.083124995), (0.045273952, 1.5684083, 0.10616386), (0.06702563, 1.5503906, 0.15717256), (0.07124935, 1.5235841, 0.16708481), (0.06393945, 1.490625, 0.14995897), (0.05109024, 1.4541504, 0.11985397), (0.038696043, 1.4167969, 0.09082842), (0.032751188, 1.3812013, 0.076940894), (0.03925, 1.35, 0.09224999), (0.023521638, 1.5684083, 0.11275005), (0.03482229, 1.5503906, 0.16692352), (0.03701606, 1.523584, 0.17745161), (0.03321704, 1.490625, 0.1592654), (0.026539322, 1.4541504, 0.12729597), (0.020097014, 1.4167969, 0.09647453), (0.017004209, 1.3812011, 0.081732154), (0.020375, 1.35, 0.09800005), (0, 1.5684083, 0.11503911), (0, 1.5503906, 0.17031252), (0, 1.523584, 0.18105471), (0, 1.490625, 0.16250002), (0, 1.4541504, 0.12988281), (0, 1.4167969, 0.09843755), (0, 1.3812011, 0.08339846), (0, 1.35, 0.100000024), (-0.023521641, 1.5684084, 0.11275005), (-0.034822296, 1.5503906, 0.16692352), (-0.037016064, 1.5235841, 0.17745161), (-0.033217043, 1.4906251, 0.1592654), (-0.026539326, 1.4541504, 0.12729597), (-0.020097017, 1.4167968, 0.09647453), (-0.01700421, 1.381201, 0.081732154), (-0.020375002, 1.3499999, 0.09800005), (-0.045273952, 1.5684083, 0.10616386), (-0.06702563, 1.5503906, 0.15717256), (-0.07124935, 1.5235841, 0.16708481), (-0.06393945, 1.490625, 0.14995897), (-0.05109024, 1.4541504, 0.11985397), (-0.038696043, 1.4167969, 0.09082842), (-0.032751188, 1.3812013, 0.076940894), (-0.03925, 1.35, 0.09224999), (-0.06483565, 1.5684083, 0.09570193), (-0.09598618, 1.5503906, 0.14168346), (-0.10203639, 1.523584, 0.1506176), (-0.09157105, 1.490625, 0.13517702), (-0.07317496, 1.4541504, 0.10803461), (-0.055432893, 1.4167969, 0.081863284), (-0.04692965, 1.3812011, 0.06933582), (-0.056250006, 1.35, 0.083124995), (-0.0817854, 1.5684083, 0.08178544), (-0.121080086, 1.5503906, 0.12108004), (-0.12871362, 1.523584, 0.12871361), (-0.11551563, 1.490625, 0.11551559), (-0.092315674, 1.4541504, 0.092315674), (-0.06994336, 1.4167969, 0.06994331), (-0.05922827, 1.3812013, 0.0592283), (-0.071, 1.3500001, 0.07099998), (-0.095701925, 1.5684083, 0.06483567), (-0.1416835, 1.5503906, 0.09598613), (-0.15061758, 1.523584, 0.10203636), (-0.135177, 1.490625, 0.09157109), (-0.10803461, 1.4541504, 0.07317495), (-0.08186325, 1.4167969, 0.055432916), (-0.069335766, 1.3812011, 0.046929598), (-0.083124995, 1.35, 0.056249976), (-0.10616391, 1.5684083, 0.0452739), (-0.1571726, 1.5503906, 0.06702566), (-0.16708475, 1.523584, 0.071249366), (-0.14995898, 1.490625, 0.06393945), (-0.11985397, 1.4541504, 0.05109024), (-0.090828374, 1.4167969, 0.03869605), (-0.076940835, 1.3812011, 0.032751203), (-0.092250004, 1.35, 0.039250016), (-0.11275007, 1.5684083, 0.023521662), (-0.16692355, 1.5503906, 0.034822345), (-0.17745164, 1.523584, 0.037016034), (-0.1592654, 1.490625, 0.033217072), (-0.12729599, 1.4541504, 0.026539326), (-0.09647453, 1.4167969, 0.020097017), (-0.081732154, 1.3812011, 0.017004251), (-0.098000005, 1.35, 0.020375013), (-0.115039065, 1.5684083, 0), (-0.17031251, 1.5503906, 0), (-0.18105468, 1.523584, 0), (-0.16250001, 1.490625, 0), (-0.12988281, 1.4541504, 0), (-0.0984375, 1.4167969, 0), (-0.08339844, 1.3812011, 0), (-0.1, 1.35, 0), (-0.11275007, 1.5684084, -0.023521662), (-0.16692355, 1.5503906, -0.034822345), (-0.17745164, 1.5235841, -0.037016034), (-0.1592654, 1.4906251, -0.033217072), (-0.12729599, 1.4541504, -0.026539326), (-0.09647452, 1.4167968, -0.020097017), (-0.081732154, 1.381201, -0.017004251), (-0.098, 1.3499999, -0.020375013), (-0.10616391, 1.5684083, -0.0452739), (-0.1571726, 1.5503906, -0.06702566), (-0.16708475, 1.523584, -0.071249366), (-0.14995898, 1.490625, -0.06393945), (-0.11985397, 1.4541504, -0.05109024), (-0.090828374, 1.4167969, -0.03869605), (-0.076940835, 1.3812011, -0.032751203), (-0.092250004, 1.35, -0.039250016), (-0.095701925, 1.5684083, -0.06483567), (-0.1416835, 1.5503906, -0.09598613), (-0.15061758, 1.523584, -0.10203636), (-0.135177, 1.490625, -0.09157109), (-0.10803461, 1.4541504, -0.07317495), (-0.081863254, 1.4167969, -0.055432916), (-0.06933577, 1.3812011, -0.046929598), (-0.083125, 1.35, -0.056249976), (-0.0817854, 1.5684083, -0.08178544), (-0.121080086, 1.5503906, -0.12108004), (-0.12871362, 1.523584, -0.12871361), (-0.11551563, 1.490625, -0.11551559), (-0.092315674, 1.4541504, -0.092315674), (-0.06994336, 1.4167969, -0.06994331), (-0.05922827, 1.3812013, -0.0592283), (-0.071, 1.3500001, -0.07099998), (-0.064835645, 1.5684083, -0.09570193), (-0.09598617, 1.5503906, -0.14168346), (-0.10203638, 1.523584, -0.1506176), (-0.09157104, 1.490625, -0.13517702), (-0.07317495, 1.4541504, -0.10803461), (-0.055432893, 1.4167969, -0.081863284), (-0.046929646, 1.3812011, -0.06933582), (-0.056250002, 1.35, -0.083124995), (-0.045273952, 1.5684083, -0.10616386), (-0.06702563, 1.5503906, -0.15717256), (-0.07124935, 1.5235839, -0.16708481), (-0.06393945, 1.490625, -0.14995897), (-0.05109024, 1.4541504, -0.11985397), (-0.038696043, 1.4167969, -0.09082842), (-0.032751188, 1.381201, -0.076940894), (-0.03925, 1.35, -0.09224999), (-0.023521638, 1.5684083, -0.11275005), (-0.03482229, 1.5503906, -0.16692352), (-0.03701606, 1.523584, -0.17745161), (-0.03321704, 1.490625, -0.1592654), (-0.026539322, 1.4541504, -0.12729597), (-0.020097014, 1.4167969, -0.09647453), (-0.017004209, 1.3812011, -0.081732154), (-0.020375, 1.35, -0.09800005), (0, 1.5684083, -0.11503911), (0, 1.5503906, -0.17031252), (0, 1.523584, -0.18105471), (0, 1.490625, -0.16250002), (0, 1.4541504, -0.12988281), (0, 1.4167969, -0.09843755), (0, 1.3812011, -0.08339846), (0, 1.35, -0.100000024), (0.023521641, 1.5684084, -0.11275005), (0.034822296, 1.5503906, -0.16692352), (0.037016064, 1.5235841, -0.17745161), (0.033217043, 1.4906251, -0.1592654), (0.026539326, 1.4541504, -0.12729597), (0.020097017, 1.4167968, -0.09647453), (0.01700421, 1.381201, -0.081732154), (0.020375002, 1.3499999, -0.09800005), (0.045273952, 1.5684083, -0.10616386), (0.06702563, 1.5503906, -0.15717256), (0.07124935, 1.5235839, -0.16708481), (0.06393945, 1.490625, -0.14995897), (0.05109024, 1.4541504, -0.11985397), (0.038696043, 1.4167969, -0.09082842), (0.032751188, 1.381201, -0.076940894), (0.03925, 1.35, -0.09224999), (0.06483565, 1.5684083, -0.09570193), (0.09598618, 1.5503906, -0.14168346), (0.10203639, 1.523584, -0.1506176), (0.09157105, 1.490625, -0.13517702), (0.07317496, 1.4541504, -0.10803461), (0.055432893, 1.4167969, -0.081863284), (0.04692965, 1.3812011, -0.06933582), (0.056250006, 1.35, -0.083124995), (0.0817854, 1.5684083, -0.08178544), (0.121080086, 1.5503906, -0.12108004), (0.12871362, 1.523584, -0.12871361), (0.11551563, 1.490625, -0.11551559), (0.092315674, 1.4541504, -0.092315674), (0.06994336, 1.4167969, -0.06994331), (0.05922827, 1.3812013, -0.0592283), (0.071, 1.3500001, -0.07099998), (0.095701925, 1.5684083, -0.06483567), (0.1416835, 1.5503906, -0.09598613), (0.15061758, 1.523584, -0.10203636), (0.135177, 1.490625, -0.09157109), (0.10803461, 1.4541504, -0.07317495), (0.08186325, 1.4167969, -0.055432916), (0.069335766, 1.3812011, -0.046929598), (0.083124995, 1.35, -0.056249976), (0.10616391, 1.5684083, -0.0452739), (0.1571726, 1.5503906, -0.06702566), (0.16708475, 1.523584, -0.071249366), (0.14995898, 1.490625, -0.06393945), (0.11985397, 1.4541504, -0.05109024), (0.090828374, 1.4167969, -0.03869605), (0.076940835, 1.3812011, -0.032751203), (0.092250004, 1.35, -0.039250016), (0.11275007, 1.5684083, -0.023521662), (0.16692355, 1.5503906, -0.034822345), (0.17745164, 1.523584, -0.037016034), (0.1592654, 1.490625, -0.033217072), (0.12729599, 1.4541504, -0.026539326), (0.09647453, 1.4167969, -0.020097017), (0.081732154, 1.3812011, -0.017004251), (0.098000005, 1.35, -0.020375013), (0.15234375, 1.3250977, 0), (0.228125, 1.3054687, 0), (0.31796876, 1.2893555, 0), (0.41250002, 1.275, 0), (0.5023438, 1.2606446, 0), (0.578125, 1.2445313, 0), (0.6304687, 1.2249024, 0), (0.65, 1.2, 0), (0.14929686, 1.3250977, 0.031040072), (0.2235625, 1.3054687, 0.046480417), (0.3116094, 1.2893555, 0.064786196), (0.40424997, 1.275, 0.08404684), (0.49229687, 1.2606447, 0.1023525), (0.5665625, 1.2445314, 0.117792964), (0.6178593, 1.2249025, 0.12845802), (0.63699996, 1.2000002, 0.13243747), (0.14053711, 1.3250977, 0.059794903), (0.21044531, 1.3054687, 0.08953905), (0.2933262, 1.2893555, 0.12480271), (0.38053125, 1.275, 0.16190624), (0.46341214, 1.2606446, 0.1971699), (0.5333203, 1.2445313, 0.22691405), (0.5816074, 1.2249024, 0.24745893), (0.599625, 1.2, 0.255125), (0.12663576, 1.3250977, 0.08569336), (0.18962893, 1.3054687, 0.12832034), (0.26431155, 1.2893555, 0.17885745), (0.34289065, 1.275, 0.23203123), (0.41757327, 1.2606444, 0.2825684), (0.48056644, 1.2445313, 0.3251953), (0.5240772, 1.2249024, 0.3546387), (0.5403125, 1.2, 0.36562502), (0.10816405, 1.3250978, 0.10816407), (0.16196877, 1.3054688, 0.16196883), (0.22575782, 1.2893555, 0.22575784), (0.292875, 1.2749999, 0.292875), (0.35666406, 1.2606444, 0.35666406), (0.41046876, 1.2445312, 0.41046876), (0.44763285, 1.2249024, 0.44763285), (0.4615, 1.2, 0.4615), (0.08569336, 1.3250977, 0.12663579), (0.12832032, 1.3054687, 0.18962896), (0.17885742, 1.2893555, 0.26431155), (0.23203124, 1.275, 0.34289062), (0.28256837, 1.2606447, 0.41757327), (0.3251953, 1.2445312, 0.48056644), (0.35463867, 1.2249024, 0.5240772), (0.365625, 1.2, 0.5403125), (0.05979492, 1.3250977, 0.14053714), (0.089539066, 1.3054687, 0.21044528), (0.12480274, 1.2893555, 0.2933262), (0.16190624, 1.2749999, 0.38053125), (0.1971699, 1.2606446, 0.46341217), (0.22691405, 1.2445313, 0.5333203), (0.24745896, 1.2249024, 0.5816074), (0.255125, 1.2, 0.599625), (0.03104004, 1.3250977, 0.14929688), (0.046480466, 1.3054687, 0.22356248), (0.064786136, 1.2893555, 0.3116094), (0.08404687, 1.2750001, 0.40424997), (0.102352545, 1.2606444, 0.49229687), (0.117792964, 1.2445314, 0.5665625), (0.12845801, 1.2249024, 0.6178593), (0.1324375, 1.2, 0.63699996), (0, 1.3250977, 0.15234375), (0, 1.3054687, 0.22812498), (0, 1.2893555, 0.31796873), (0, 1.275, 0.41250002), (0, 1.2606446, 0.5023438), (0, 1.2445313, 0.578125), (0, 1.2249024, 0.6304687), (0, 1.2, 0.65), (-0.03104004, 1.3250977, 0.14929688), (-0.04648047, 1.3054687, 0.22356248), (-0.064786136, 1.2893555, 0.3116094), (-0.08404687, 1.2750001, 0.40424997), (-0.102352545, 1.2606447, 0.49229687), (-0.117792964, 1.2445314, 0.5665625), (-0.12845801, 1.2249024, 0.6178593), (-0.1324375, 1.2000002, 0.63699996), (-0.05979492, 1.3250977, 0.14053714), (-0.089539066, 1.3054687, 0.21044528), (-0.12480274, 1.2893555, 0.2933262), (-0.16190624, 1.2749999, 0.38053125), (-0.1971699, 1.2606446, 0.46341217), (-0.22691405, 1.2445313, 0.5333203), (-0.24745896, 1.2249024, 0.5816074), (-0.255125, 1.2, 0.599625), (-0.08569336, 1.3250977, 0.12663579), (-0.12832032, 1.3054687, 0.18962896), (-0.17885742, 1.2893555, 0.26431155), (-0.23203127, 1.275, 0.34289062), (-0.2825684, 1.2606447, 0.41757327), (-0.32519534, 1.2445312, 0.48056644), (-0.3546387, 1.2249024, 0.5240772), (-0.36562502, 1.2, 0.5403125), (-0.10816405, 1.3250978, 0.10816407), (-0.16196877, 1.3054688, 0.16196883), (-0.22575782, 1.2893555, 0.22575784), (-0.292875, 1.2749999, 0.292875), (-0.35666406, 1.2606444, 0.35666406), (-0.41046876, 1.2445312, 0.41046876), (-0.44763285, 1.2249024, 0.44763285), (-0.4615, 1.2, 0.4615), (-0.12663575, 1.3250977, 0.08569336), (-0.18962891, 1.3054687, 0.12832034), (-0.26431152, 1.2893555, 0.17885745), (-0.34289065, 1.275, 0.23203123), (-0.41757327, 1.2606446, 0.28256834), (-0.48056644, 1.2445313, 0.3251953), (-0.5240772, 1.2249024, 0.3546387), (-0.5403125, 1.2, 0.36562502), (-0.14053711, 1.3250977, 0.059794903), (-0.21044531, 1.3054687, 0.08953905), (-0.2933262, 1.2893555, 0.12480271), (-0.38053125, 1.275, 0.16190624), (-0.46341214, 1.2606446, 0.1971699), (-0.5333203, 1.2445313, 0.22691405), (-0.5816074, 1.2249024, 0.24745893), (-0.599625, 1.2, 0.255125), (-0.14929688, 1.3250977, 0.031040072), (-0.22356252, 1.3054687, 0.046480417), (-0.3116094, 1.2893555, 0.064786196), (-0.40424997, 1.275, 0.08404684), (-0.49229687, 1.2606446, 0.1023525), (-0.5665625, 1.2445313, 0.117792964), (-0.6178593, 1.2249024, 0.12845802), (-0.63699996, 1.2, 0.13243747), (-0.15234375, 1.3250977, 0), (-0.228125, 1.3054687, 0), (-0.31796876, 1.2893555, 0), (-0.41250002, 1.275, 0), (-0.5023438, 1.2606446, 0), (-0.578125, 1.2445313, 0), (-0.6304687, 1.2249024, 0), (-0.65, 1.2, 0), (-0.14929686, 1.3250977, -0.031040072), (-0.2235625, 1.3054687, -0.046480417), (-0.3116094, 1.2893555, -0.064786196), (-0.40424997, 1.275, -0.08404684), (-0.49229687, 1.2606447, -0.1023525), (-0.5665625, 1.2445314, -0.117792964), (-0.6178593, 1.2249025, -0.12845802), (-0.63699996, 1.2000002, -0.13243747), (-0.14053711, 1.3250977, -0.059794903), (-0.21044531, 1.3054687, -0.08953905), (-0.2933262, 1.2893555, -0.12480271), (-0.38053125, 1.275, -0.16190624), (-0.46341214, 1.2606446, -0.1971699), (-0.5333203, 1.2445313, -0.22691405), (-0.5816074, 1.2249024, -0.24745893), (-0.599625, 1.2, -0.25512505), (-0.12663576, 1.3250977, -0.08569336), (-0.18962893, 1.3054687, -0.12832034), (-0.26431155, 1.2893555, -0.17885745), (-0.34289065, 1.275, -0.23203123), (-0.41757327, 1.2606446, -0.28256834), (-0.48056644, 1.2445313, -0.3251953), (-0.5240772, 1.2249024, -0.3546387), (-0.5403125, 1.2, -0.36562502), (-0.10816405, 1.3250978, -0.10816407), (-0.16196877, 1.3054686, -0.16196883), (-0.22575782, 1.2893555, -0.22575784), (-0.292875, 1.2749999, -0.29287505), (-0.35666406, 1.2606444, -0.35666406), (-0.41046876, 1.2445312, -0.41046882), (-0.44763285, 1.2249024, -0.4476328), (-0.4615, 1.2, -0.46149993), (-0.08569336, 1.3250977, -0.12663579), (-0.12832032, 1.3054687, -0.18962896), (-0.17885742, 1.2893555, -0.26431155), (-0.23203124, 1.275, -0.34289062), (-0.28256837, 1.2606446, -0.41757333), (-0.3251953, 1.2445313, -0.48056638), (-0.35463867, 1.2249024, -0.5240772), (-0.365625, 1.2, -0.5403125), (-0.05979492, 1.3250977, -0.14053714), (-0.089539066, 1.3054687, -0.21044528), (-0.12480274, 1.2893555, -0.29332614), (-0.16190624, 1.275, -0.3805312), (-0.1971699, 1.2606446, -0.46341217), (-0.22691405, 1.2445313, -0.5333203), (-0.24745896, 1.2249024, -0.58160734), (-0.255125, 1.2, -0.599625), (-0.03104004, 1.3250977, -0.14929688), (-0.046480466, 1.3054687, -0.22356248), (-0.064786136, 1.2893555, -0.3116094), (-0.08404687, 1.275, -0.40425003), (-0.102352545, 1.2606446, -0.49229681), (-0.117792964, 1.2445313, -0.56656253), (-0.12845801, 1.2249024, -0.61785936), (-0.1324375, 1.2, -0.63699996), (0, 1.3250977, -0.15234375), (0, 1.3054687, -0.22812498), (0, 1.2893555, -0.31796873), (0, 1.275, -0.41250002), (0, 1.2606446, -0.5023438), (0, 1.2445313, -0.578125), (0, 1.2249024, -0.6304687), (0, 1.2, -0.65), (0.03104004, 1.3250977, -0.14929688), (0.04648047, 1.3054687, -0.22356248), (0.064786136, 1.2893555, -0.3116094), (0.08404687, 1.275, -0.40425003), (0.102352545, 1.2606447, -0.49229693), (0.117792964, 1.2445314, -0.5665624), (0.12845801, 1.2249025, -0.61785924), (0.1324375, 1.2000002, -0.63699996), (0.05979492, 1.3250977, -0.14053714), (0.089539066, 1.3054687, -0.21044528), (0.12480274, 1.2893555, -0.29332614), (0.16190624, 1.275, -0.3805312), (0.1971699, 1.2606446, -0.46341217), (0.22691405, 1.2445313, -0.5333203), (0.24745896, 1.2249024, -0.58160734), (0.255125, 1.2, -0.599625), (0.08569336, 1.3250977, -0.12663579), (0.12832032, 1.3054687, -0.18962896), (0.17885742, 1.2893555, -0.26431155), (0.23203127, 1.275, -0.34289062), (0.2825684, 1.2606446, -0.41757333), (0.32519534, 1.2445313, -0.48056638), (0.3546387, 1.2249024, -0.5240772), (0.36562502, 1.2, -0.5403125), (0.10816405, 1.3250978, -0.10816407), (0.16196877, 1.3054686, -0.16196883), (0.22575782, 1.2893555, -0.22575784), (0.292875, 1.2749999, -0.29287505), (0.35666406, 1.2606444, -0.35666406), (0.41046876, 1.2445312, -0.41046882), (0.44763285, 1.2249024, -0.4476328), (0.4615, 1.2, -0.46149993), (0.12663575, 1.3250977, -0.08569336), (0.18962891, 1.3054687, -0.12832034), (0.26431152, 1.2893555, -0.17885745), (0.34289065, 1.275, -0.23203123), (0.41757327, 1.2606446, -0.28256834), (0.48056644, 1.2445313, -0.3251953), (0.5240772, 1.2249024, -0.3546387), (0.5403125, 1.2, -0.36562502), (0.14053711, 1.3250977, -0.059794903), (0.21044531, 1.3054687, -0.08953905), (0.2933262, 1.2893555, -0.12480271), (0.38053125, 1.275, -0.16190624), (0.46341214, 1.2606446, -0.1971699), (0.5333203, 1.2445313, -0.22691405), (0.5816074, 1.2249024, -0.24745893), (0.599625, 1.2, -0.25512505), (0.14929688, 1.3250977, -0.031040072), (0.22356252, 1.3054687, -0.046480417), (0.3116094, 1.2893555, -0.064786196), (0.40424997, 1.275, -0.08404684), (0.49229687, 1.2606446, -0.1023525), (0.5665625, 1.2445313, -0.117792964), (0.6178593, 1.2249024, -0.12845802), (0.63699996, 1.2, -0.13243747)] + color3f[] primvars:displayColor = [(0.5176471, 0.7529412, 0.85882354)] + float3[] primvars:normals = [(-0.9358926, -0.35228568, 1.460963e-7), (-0.97237426, -0.23342724, 6.4345286e-8), (-0.99092317, 0.13442913, -2.4171884e-9), (-0.69656414, 0.7174946, -2.8003527e-7), (-0.028833238, 0.99958426, -2.2047891e-7), (0.45322943, 0.89139396, 2.3034268e-8), (0.6887656, 0.7249842, 1.2022704e-9), (0.82036895, 0.5718345, -6.479119e-8), (0.88631415, 0.46308443, -1.7907728e-7), (-0.917694, -0.35257155, -0.1831152), (-0.9535704, -0.2336454, -0.19003469), (-0.9718069, 0.1345612, -0.1936095), (-0.682759, 0.71785784, -0.13608941), (-0.028005369, 0.99959123, -0.005752083), (0.44429165, 0.8915014, 0.08848758), (0.6752029, 0.72525257, 0.1345726), (0.8043202, 0.5721541, 0.16033949), (0.86904544, 0.46340713, 0.17324498), (-0.8637958, -0.35305566, -0.35945588), (-0.8977124, -0.23397537, -0.37332013), (-0.9149446, 0.13473812, -0.3804234), (-0.6425076, 0.7181778, -0.26721635), (-0.026394306, 0.9995894, -0.011154333), (0.41778457, 0.8917907, 0.1736822), (0.63517493, 0.72579247, 0.2641555), (0.75686806, 0.57275814, 0.31479955), (0.81791836, 0.4639795, 0.34019464), (-0.77709496, -0.3534165, -0.5207881), (-0.8076694, -0.23421556, -0.54112226), (-0.8232058, 0.13486272, -0.55149275), (-0.5779364, 0.7183653, -0.38722175), (-0.023864606, 0.99958557, -0.016099878), (0.37551516, 0.89202553, 0.2515527), (0.57113236, 0.72621095, 0.38265595), (0.680725, 0.57322127, 0.45610392), (0.73573565, 0.46441296, 0.4929641), (-0.6614404, -0.35354424, -0.66144013), (-0.68742406, -0.23429959, -0.68742406), (-0.7006428, 0.13490437, -0.70064294), (-0.49186918, 0.7184215, -0.4918691), (-0.020399626, 0.99958384, -0.020399595), (0.31948143, 0.89211166, 0.31948143), (0.48600376, 0.7263613, 0.48600376), (0.5793217, 0.5733871, 0.5793217), (0.6261698, 0.46456745, 0.62616974), (-0.52078813, -0.35341686, -0.77709484), (-0.5411222, -0.23421595, -0.8076692), (-0.5514928, 0.13486207, -0.8232059), (-0.38722193, 0.718365, -0.57793677), (-0.016099935, 0.99958557, -0.023864733), (0.2515527, 0.89202553, 0.37551522), (0.38265595, 0.72621095, 0.57113236), (0.45610392, 0.57322127, 0.680725), (0.4929641, 0.46441296, 0.7357356), (-0.35945567, -0.35305572, -0.8637959), (-0.37331998, -0.23397528, -0.8977125), (-0.38042352, 0.1347394, -0.91494435), (-0.2672159, 0.7181792, -0.6425062), (-0.011154758, 0.9995894, -0.02639476), (0.1736818, 0.8917913, 0.4177835), (0.26415554, 0.7257925, 0.6351749), (0.31479964, 0.57275796, 0.7568683), (0.34019452, 0.46397924, 0.8179186), (-0.18311514, -0.35257143, -0.917694), (-0.19003482, -0.23364548, -0.9535703), (-0.1936095, 0.13456018, -0.971807), (-0.13608891, 0.71785957, -0.6827573), (-0.0057521444, 0.9995913, -0.028005268), (0.088487215, 0.89150256, 0.44428957), (0.1345725, 0.72525257, 0.6752029), (0.16033965, 0.5721536, 0.8043204), (0.17324495, 0.46340644, 0.86904573), (-0.0032640437, -0.3558684, -0.9345303), (-0.002899469, -0.23755965, -0.9713686), (-0.0018331354, 0.12942311, -0.99158776), (-0.0006929038, 0.7149997, -0.6991244), (-0.000032221495, 0.9995669, -0.029429471), (0.000054808075, 0.89116883, 0.45367175), (0.000034354107, 0.72477525, 0.68898535), (0.000010011363, 0.5717598, 0.82042104), (0.0000013824756, 0.46307498, 0.8863191), (0.18212533, -0.3864836, -0.9041354), (0.18169373, -0.27024078, -0.9454932), (0.19083679, 0.09098867, -0.9773957), (0.13423008, 0.69815564, -0.7032503), (0.003492654, 0.99947506, -0.032207668), (-0.08910462, 0.88957334, 0.44801745), (-0.13456771, 0.7235198, 0.67706025), (-0.16024353, 0.57153535, 0.80477905), (-0.17322528, 0.46332937, 0.86909086), (0.35226846, -0.4382401, -0.8269537), (0.3583538, -0.3293187, -0.8735741), (0.38200998, 0.01827429, -0.9239775), (0.2811654, 0.6621926, -0.694584), (0.011040714, 0.9992139, -0.038074516), (-0.17744297, 0.8866021, 0.42714247), (-0.26556724, 0.72122365, 0.63977367), (-0.31501293, 0.5711408, 0.7580007), (-0.34020153, 0.46377683, 0.81803066), (0.502943, -0.47654825, -0.7210758), (0.51931345, -0.3763503, -0.7672509), (0.5595014, -0.042351563, -0.8277466), (0.429785, 0.6273649, -0.64938295), (0.022588296, 0.9988693, -0.04183333), (-0.26017496, 0.88402116, 0.38834953), (-0.38641438, 0.7192742, 0.5773461), (-0.45689023, 0.5707836, 0.6822443), (-0.49302763, 0.464108, 0.73588556), (0.6353923, -0.48589823, -0.6001496), (0.6619206, -0.38935953, -0.6405156), (0.71364504, -0.059129577, -0.6980074), (0.5572098, 0.61582327, -0.557027), (0.033437755, 0.99871284, -0.038141433), (-0.33169344, 0.88327825, 0.3313592), (-0.4915555, 0.7187512, 0.49170116), (-0.58056676, 0.5707206, 0.5807067), (-0.6262811, 0.46423414, 0.6263057), (0.7513049, -0.4657086, -0.4676071), (0.7856317, -0.36588955, -0.4989066), (0.839005, -0.02775828, -0.5434153), (0.644925, 0.63356656, -0.42739347), (0.03805714, 0.9988961, -0.02753575), (-0.38759032, 0.8846554, 0.25914976), (-0.57675004, 0.719822, 0.3862846), (-0.68202066, 0.5709788, 0.45698032), (-0.7358556, 0.46413264, 0.49304914), (0.8461496, -0.42485926, -0.32175377), (0.8843636, -0.31740385, -0.3422803), (0.9285865, 0.034115672, -0.3695447), (0.68930566, 0.6677321, -0.28105435), (0.03617519, 0.9992235, -0.015618086), (-0.42606014, 0.88728, 0.17665455), (-0.6391013, 0.7218235, 0.26555672), (-0.7577876, 0.5713582, 0.3151313), (-0.8180051, 0.4638041, 0.3402257), (0.90948564, -0.38224217, -0.16348347), (0.94780904, -0.26767734, -0.173225), (0.9781999, 0.09431328, -0.18501332), (0.7027126, 0.6982746, -0.13641022), (0.032199416, 0.9994603, -0.006501038), (-0.44776925, 0.8897191, 0.08889608), (-0.67688656, 0.7236502, 0.13473994), (-0.8047181, 0.5715851, 0.16037259), (-0.8690834, 0.46333507, 0.17324717), (0.933751, -0.357887, 0.005106619), (0.97081107, -0.23980354, 0.004492247), (0.99191797, 0.12685068, 0.0027867774), (0.70039064, 0.7137589, 0.0010427244), (0.029723188, 0.99955815, 0.000049400634), (-0.453876, 0.8910648, -0.00008044002), (-0.6890865, 0.7246791, -0.00005020276), (-0.8204449, 0.5717256, -0.0000144722735), (-0.88632137, 0.46307066, -0.0000015567771), (0.91769385, -0.3525717, 0.18311521), (0.9535704, -0.23364535, 0.19003473), (0.9718069, 0.13456134, 0.19360952), (0.682759, 0.71785784, 0.13608941), (0.028005369, 0.99959123, 0.005752083), (-0.44429165, 0.8915014, -0.08848758), (-0.6752028, 0.7252527, -0.13457255), (-0.8043203, 0.57215405, -0.16033949), (-0.86904544, 0.463407, -0.17324497), (0.86379564, -0.3530561, 0.35945597), (0.8977126, -0.23397505, 0.37331992), (0.91494465, 0.13473785, 0.3804235), (0.64250815, 0.7181772, 0.2672166), (0.026394237, 0.9995894, 0.011154284), (-0.4177845, 0.8917907, -0.1736822), (-0.63517475, 0.7257926, -0.26415545), (-0.7568682, 0.57275796, -0.31479985), (-0.8179186, 0.46397936, -0.3401946), (0.7770949, -0.3534168, 0.520788), (0.8076696, -0.23421516, 0.54112214), (0.8232059, 0.13486168, 0.55149305), (0.57793754, 0.7183641, 0.3872223), (0.02386463, 0.99958557, 0.01609984), (-0.37551495, 0.8920257, -0.2515524), (-0.5711323, 0.72621083, -0.38265607), (-0.6807252, 0.573221, -0.45610398), (-0.7357356, 0.4644131, -0.49296403), (0.6614404, -0.35354424, 0.66144013), (0.68742406, -0.23429939, 0.6874241), (0.7006428, 0.13490464, 0.7006428), (0.4918693, 0.71842104, 0.4918696), (0.020400109, 0.9995837, 0.020400073), (-0.31948105, 0.8921119, -0.31948093), (-0.48600388, 0.726361, -0.48600408), (-0.57932204, 0.57338685, -0.57932174), (-0.6261696, 0.46456787, -0.6261696), (0.5207881, -0.35341728, 0.77709454), (0.54112226, -0.23421589, 0.8076692), (0.55149287, 0.13486183, 0.8232059), (0.38722244, 0.718364, 0.57793766), (0.016100679, 0.9995855, 0.023865832), (-0.25155246, 0.8920257, -0.3755149), (-0.38265613, 0.7262106, -0.57113266), (-0.45610404, 0.5732211, -0.68072516), (-0.49296412, 0.46441314, -0.7357356), (0.3594555, -0.3530568, 0.86379546), (0.37332004, -0.23397557, 0.8977124), (0.38042337, 0.13473831, 0.9149446), (0.26721644, 0.718178, 0.6425074), (0.011155191, 0.9995894, 0.026395869), (-0.1736817, 0.8917913, -0.4177835), (-0.2641557, 0.72579217, -0.63517517), (-0.31479964, 0.57275796, -0.7568683), (-0.34019452, 0.46397927, -0.8179186), (0.18311507, -0.35257256, 0.91769356), (0.19003467, -0.23364684, 0.9535701), (0.19360933, 0.13456212, 0.97180676), (0.13608852, 0.71786076, 0.6827561), (0.0057524373, 0.9995912, 0.028006721), (-0.088487186, 0.8915026, -0.44428945), (-0.13457258, 0.72525245, -0.67520297), (-0.16033973, 0.5721536, -0.8043204), (-0.17324501, 0.4634062, -0.8690459), (1.6557584e-7, -0.35228688, 0.93589205), (8.5793715e-8, -0.23342977, 0.9723736), (1.2085954e-8, 0.13442996, 0.9909231), (-1.667481e-7, 0.7174965, 0.6965621), (-1.2339301e-7, 0.99958426, 0.028833658), (3.152059e-8, 0.8913937, -0.4532297), (3.6068102e-9, 0.72498417, -0.6887655), (-6.239154e-8, 0.5718346, -0.820369), (-2.3638195e-7, 0.46308398, -0.8863144), (-0.18311507, -0.3525726, 0.91769356), (-0.19003466, -0.23364697, 0.95357007), (-0.19360927, 0.13456194, 0.9718068), (-0.13608886, 0.71785927, 0.6827575), (-0.0057520904, 0.99959123, 0.028005049), (0.088487744, 0.8915013, -0.44429207), (0.13457261, 0.7252524, -0.67520297), (0.16033961, 0.5721541, -0.80432004), (0.17324497, 0.46340707, -0.86904544), (-0.35945565, -0.35305676, 0.8637954), (-0.37332004, -0.23397556, 0.89771235), (-0.3804234, 0.13473836, 0.9149446), (-0.26721653, 0.71817726, 0.6425082), (-0.0111547895, 0.9995894, 0.026395228), (0.1736822, 0.89179057, -0.41778472), (0.26415566, 0.7257921, -0.63517517), (0.31479955, 0.57275814, -0.75686806), (0.34019464, 0.4639796, -0.8179183), (-0.52078795, -0.35341746, 0.77709454), (-0.5411222, -0.23421572, 0.80766934), (-0.55149287, 0.13486211, 0.8232058), (-0.38722244, 0.718364, 0.57793766), (-0.01610068, 0.9995855, 0.02386584), (0.25155243, 0.8920257, -0.3755149), (0.38265613, 0.72621053, -0.57113266), (0.45610404, 0.5732211, -0.68072516), (0.49296406, 0.4644131, -0.7357356), (-0.66144025, -0.35354465, 0.66144013), (-0.687424, -0.23429945, 0.6874242), (-0.7006428, 0.13490479, 0.7006428), (-0.4918693, 0.7184211, 0.49186966), (-0.020400109, 0.9995837, 0.020400079), (0.31948105, 0.89211196, -0.31948096), (0.48600394, 0.72636104, -0.48600408), (0.57932204, 0.5733868, -0.57932174), (0.6261696, 0.46456787, -0.6261696), (-0.77709484, -0.353417, 0.5207879), (-0.8076696, -0.23421527, 0.5411221), (-0.8232057, 0.13486227, 0.551493), (-0.57793736, 0.71836436, 0.38722223), (-0.023864845, 0.99958557, 0.016099973), (0.37551498, 0.8920257, -0.2515524), (0.57113236, 0.7262109, -0.3826561), (0.6807252, 0.573221, -0.45610398), (0.7357356, 0.4644131, -0.49296403), (-0.86379564, -0.35305578, 0.35945585), (-0.8977126, -0.23397507, 0.37331992), (-0.9149444, 0.13473895, 0.3804235), (-0.6425065, 0.718179, 0.26721606), (-0.02639453, 0.9995895, 0.011154677), (0.4177834, 0.89179116, -0.17368177), (0.63517475, 0.7257926, -0.26415545), (0.7568683, 0.5727578, -0.31479988), (0.8179188, 0.46397904, -0.3401945), (-0.91769403, -0.3525713, 0.18311496), (-0.95357037, -0.23364538, 0.19003515), (-0.9718069, 0.13456184, 0.19360924), (-0.68275625, 0.7178604, 0.1360888), (-0.028005185, 0.9995913, 0.0057520666), (0.44428957, 0.89150256, -0.08848716), (0.6752027, 0.7252527, -0.13457254), (0.8043205, 0.5721535, -0.16033955), (0.86904573, 0.46340638, -0.17324504), (0.90590674, 0.42347726, -1.8577192e-7), (0.9126605, 0.40871853, -5.71847e-8), (0.92373776, 0.38302562, -4.767995e-9), (0.93877673, 0.34452638, -2.862847e-8), (0.95689565, 0.2904319, 0), (0.97616804, 0.21701623, 1.434551e-8), (0.9927777, 0.11996884, 1.6762721e-8), (0.9994003, -0.034627505, 4.8195683e-9), (0.8882805, 0.4237963, 0.17707163), (0.89491314, 0.40902945, 0.17839679), (0.9057916, 0.3833226, 0.18056932), (0.92056143, 0.34480047, 0.183519), (0.93835723, 0.29067, 0.1870739), (0.95728683, 0.21719962, 0.19085667), (0.9736017, 0.12007248, 0.19411947), (0.980103, -0.034656346, 0.19544032), (0.83606994, 0.42434266, 0.3477361), (0.8423283, 0.40956515, 0.35034192), (0.8525941, 0.38383707, 0.35461575), (0.86653364, 0.34527862, 0.3604193), (0.8833315, 0.29108894, 0.36741352), (0.9012024, 0.21752515, 0.3748561), (0.9166067, 0.12025856, 0.38127413), (0.92274207, -0.034710236, 0.38385192), (0.7520963, 0.42475265, 0.503921), (0.7577368, 0.4099678, 0.507702), (0.7669902, 0.38422415, 0.5139045), (0.779556, 0.34563896, 0.5223276), (0.7947004, 0.29140535, 0.53247947), (0.8108143, 0.21777153, 0.5432823), (0.82470626, 0.1203997, 0.55259705), (0.83024037, -0.03475148, 0.55632126), (0.64010227, 0.42489788, 0.64010227), (0.6449067, 0.41011053, 0.6449067), (0.6527887, 0.38436142, 0.65278876), (0.6634928, 0.3457668, 0.6634928), (0.67639387, 0.29151773, 0.6763939), (0.69012225, 0.21785924, 0.69012225), (0.7019586, 0.12044993, 0.7019586), (0.70667934, -0.034766305, 0.70667934), (0.50392103, 0.42475265, 0.7520963), (0.50770205, 0.40996772, 0.7577368), (0.5139046, 0.38422415, 0.7669901), (0.52232766, 0.3456389, 0.779556), (0.53247947, 0.29140526, 0.79470026), (0.5432823, 0.21777155, 0.8108144), (0.55259705, 0.120399624, 0.82470626), (0.55632126, -0.0347515, 0.8302404), (0.34773585, 0.42434272, 0.83607006), (0.3503419, 0.40956518, 0.8423283), (0.35461587, 0.38383716, 0.8525941), (0.36041933, 0.3452786, 0.86653364), (0.3674136, 0.29108885, 0.8833315), (0.37485608, 0.21752514, 0.9012024), (0.38127416, 0.12025853, 0.9166067), (0.38385186, -0.034710243, 0.92274207), (0.17707156, 0.4237964, 0.8882806), (0.17839672, 0.40902972, 0.8949131), (0.18056932, 0.3833227, 0.9057916), (0.18351904, 0.3448004, 0.9205615), (0.18707389, 0.29067, 0.93835723), (0.19085668, 0.21719964, 0.95728683), (0.19411945, 0.12007254, 0.9736017), (0.19544032, -0.034656264, 0.980103), (1.905353e-7, 0.4234773, 0.90590674), (6.671549e-8, 0.40871862, 0.9126605), (0, 0.38302562, 0.92373776), (-7.1571176e-9, 0.34452638, 0.93877673), (-7.163883e-9, 0.29043192, 0.9568957), (-1.434551e-8, 0.21701623, 0.97616804), (-2.155207e-8, 0.1199689, 0.99277765), (0, -0.034627467, 0.9994003), (-0.17707156, 0.42379627, 0.8882806), (-0.1783967, 0.40902945, 0.89491314), (-0.1805693, 0.3833226, 0.9057916), (-0.18351904, 0.3448004, 0.9205615), (-0.18707389, 0.29067, 0.93835723), (-0.19085671, 0.21719958, 0.9572868), (-0.19411947, 0.12007248, 0.9736017), (-0.19544034, -0.034656364, 0.980103), (-0.34773606, 0.42434266, 0.83606994), (-0.35034192, 0.4095651, 0.8423283), (-0.35461587, 0.38383716, 0.8525941), (-0.36041933, 0.3452786, 0.86653364), (-0.36741355, 0.29108885, 0.88333154), (-0.3748561, 0.21752512, 0.9012024), (-0.38127413, 0.120258525, 0.9166067), (-0.38385192, -0.03471027, 0.92274207), (-0.50392103, 0.42475265, 0.7520962), (-0.50770205, 0.40996772, 0.7577368), (-0.5139046, 0.38422415, 0.7669901), (-0.5223276, 0.3456389, 0.7795561), (-0.53247947, 0.29140526, 0.79470026), (-0.5432823, 0.21777155, 0.8108144), (-0.55259705, 0.12039961, 0.82470626), (-0.5563212, -0.034751505, 0.83024037), (-0.64010227, 0.42489788, 0.64010227), (-0.6449067, 0.4101106, 0.6449067), (-0.6527887, 0.38436145, 0.65278876), (-0.6634927, 0.3457668, 0.6634928), (-0.67639387, 0.29151773, 0.6763939), (-0.69012225, 0.21785922, 0.69012225), (-0.70195866, 0.12044989, 0.70195866), (-0.70667934, -0.03476631, 0.7066793), (-0.7520963, 0.42475265, 0.50392103), (-0.7577368, 0.40996784, 0.50770205), (-0.7669902, 0.38422415, 0.5139045), (-0.779556, 0.34563893, 0.5223276), (-0.79470026, 0.29140535, 0.5324794), (-0.8108144, 0.21777149, 0.5432823), (-0.82470626, 0.12039961, 0.552597), (-0.83024037, -0.03475157, 0.55632126), (-0.83607006, 0.4243427, 0.3477359), (-0.8423283, 0.40956524, 0.3503418), (-0.8525941, 0.38383707, 0.35461575), (-0.86653364, 0.34527865, 0.3604193), (-0.88333154, 0.2910889, 0.36741355), (-0.9012024, 0.2175251, 0.37485605), (-0.91660684, 0.120258585, 0.38127422), (-0.92274207, -0.03471024, 0.38385186), (-0.8882805, 0.4237964, 0.1770716), (-0.8949131, 0.4090297, 0.17839675), (-0.9057916, 0.3833226, 0.1805693), (-0.92056143, 0.3448005, 0.18351907), (-0.93835723, 0.29066995, 0.18707387), (-0.9572868, 0.21719961, 0.19085667), (-0.9736017, 0.12007251, 0.19411945), (-0.980103, -0.03465633, 0.19544032), (-0.90590674, 0.4234773, 2.0006206e-7), (-0.9126605, 0.40871853, 7.6246266e-8), (-0.9237377, 0.38302565, 1.19199886e-8), (-0.9387766, 0.34452638, -9.5428225e-9), (-0.95689565, 0.29043186, -2.1491646e-8), (-0.97616804, 0.21701622, -1.6736427e-8), (-0.99277765, 0.11996884, -1.19733725e-8), (-0.9994003, -0.034627516, 0), (-0.8882806, 0.42379627, -0.17707169), (-0.89491314, 0.40902948, -0.1783967), (-0.90579164, 0.38332266, -0.1805692), (-0.9205615, 0.3448004, -0.183519), (-0.93835723, 0.29067, -0.18707389), (-0.9572868, 0.21719964, -0.19085662), (-0.9736017, 0.12007248, -0.19411945), (-0.980103, -0.03465632, -0.1954403), (-0.83606994, 0.42434266, -0.3477361), (-0.8423282, 0.40956524, -0.3503419), (-0.8525941, 0.38383707, -0.35461575), (-0.86653376, 0.34527853, -0.36041933), (-0.88333154, 0.291089, -0.3674135), (-0.9012024, 0.21752514, -0.37485605), (-0.91660684, 0.12025859, -0.3812741), (-0.92274207, -0.034710232, -0.3838518), (-0.7520963, 0.42475265, -0.5039209), (-0.7577368, 0.4099679, -0.507702), (-0.7669902, 0.3842241, -0.51390463), (-0.7795561, 0.3456389, -0.5223276), (-0.7947002, 0.29140535, -0.53247947), (-0.8108143, 0.21777162, -0.5432823), (-0.82470626, 0.12039976, -0.552597), (-0.83024037, -0.034751654, -0.55632126), (-0.64010227, 0.42489788, -0.64010227), (-0.6449067, 0.4101106, -0.6449067), (-0.65278876, 0.38436142, -0.65278876), (-0.66349274, 0.34576672, -0.66349286), (-0.67639387, 0.2915178, -0.6763939), (-0.6901221, 0.21785945, -0.6901223), (-0.7019586, 0.120450124, -0.70195866), (-0.7066792, -0.034766544, -0.70667934), (-0.50392103, 0.42475265, -0.7520962), (-0.50770205, 0.40996766, -0.7577368), (-0.5139045, 0.38422418, -0.7669902), (-0.5223276, 0.34563878, -0.7795561), (-0.53247947, 0.2914053, -0.7947003), (-0.5432822, 0.2177717, -0.8108144), (-0.55259687, 0.12039974, -0.8247063), (-0.5563211, -0.03475152, -0.8302404), (-0.34773588, 0.42434278, -0.83606994), (-0.35034195, 0.40956512, -0.8423283), (-0.3546159, 0.38383713, -0.8525941), (-0.3604194, 0.34527847, -0.86653364), (-0.3674136, 0.29108885, -0.88333154), (-0.3748561, 0.21752529, -0.9012024), (-0.38127422, 0.12025857, -0.91660666), (-0.38385195, -0.034710135, -0.922742), (-0.17707156, 0.42379653, -0.8882805), (-0.17839673, 0.4090297, -0.8949131), (-0.18056938, 0.38332257, -0.90579164), (-0.18351908, 0.34480032, -0.9205615), (-0.18707396, 0.29066998, -0.9383572), (-0.1908568, 0.21719988, -0.9572867), (-0.1941196, 0.12007258, -0.97360164), (-0.19544047, -0.03465649, -0.9801031), (-2.7865786e-7, 0.42347735, -0.9059066), (-1.0483862e-7, 0.40871862, -0.9126605), (1.907198e-8, 0.38302538, -0.92373776), (1.43142325e-8, 0.3445263, -0.9387767), (-2.6267573e-8, 0.29043195, -0.9568957), (2.3909184e-8, 0.21701641, -0.97616804), (1.2212843e-7, 0.11996891, -0.99277765), (1.1566962e-7, -0.03462778, -0.9994003), (0.17707154, 0.4237964, -0.88828045), (0.17839678, 0.40902933, -0.8949132), (0.18056938, 0.38332248, -0.90579176), (0.18351908, 0.3448004, -0.9205615), (0.18707396, 0.29067007, -0.93835723), (0.1908568, 0.21719961, -0.9572868), (0.1941196, 0.12007239, -0.9736017), (0.19544046, -0.03465636, -0.980103), (0.34773612, 0.42434266, -0.83606994), (0.35034207, 0.40956497, -0.8423283), (0.35461587, 0.38383707, -0.8525941), (0.36041933, 0.34527847, -0.86653364), (0.36741364, 0.2910889, -0.8833315), (0.3748561, 0.21752508, -0.9012024), (0.38127428, 0.12025843, -0.9166068), (0.38385192, -0.03470998, -0.922742), (0.50392103, 0.42475265, -0.7520962), (0.50770205, 0.40996772, -0.7577368), (0.5139046, 0.3842242, -0.7669902), (0.5223276, 0.34563878, -0.779556), (0.53247947, 0.2914053, -0.7947004), (0.5432822, 0.2177716, -0.8108144), (0.5525969, 0.12039964, -0.8247063), (0.55632114, -0.034751367, -0.8302405), (0.64010227, 0.42489788, -0.64010227), (0.64490664, 0.4101106, -0.6449067), (0.6527887, 0.3843614, -0.65278876), (0.66349274, 0.34576675, -0.66349286), (0.67639387, 0.2915178, -0.6763939), (0.69012207, 0.21785933, -0.6901223), (0.70195854, 0.120450005, -0.7019587), (0.7066793, -0.034766413, -0.7066793), (0.7520963, 0.42475265, -0.503921), (0.75773674, 0.4099679, -0.507702), (0.7669901, 0.38422406, -0.51390463), (0.779556, 0.3456389, -0.5223276), (0.7947002, 0.2914054, -0.5324795), (0.8108143, 0.2177715, -0.5432823), (0.82470626, 0.12039964, -0.552597), (0.8302404, -0.034751553, -0.55632126), (0.83607006, 0.4243427, -0.3477359), (0.8423282, 0.40956533, -0.35034177), (0.85259414, 0.38383707, -0.35461578), (0.86653364, 0.3452786, -0.36041927), (0.88333154, 0.29108903, -0.3674135), (0.9012024, 0.21752512, -0.3748561), (0.9166068, 0.12025856, -0.38127422), (0.92274207, -0.034710173, -0.38385192), (0.8882805, 0.42379633, -0.17707168), (0.8949131, 0.40902972, -0.17839667), (0.90579164, 0.38332257, -0.18056919), (0.9205615, 0.3448004, -0.18351905), (0.9383572, 0.29067007, -0.18707384), (0.95728683, 0.21719961, -0.19085665), (0.9736017, 0.120072514, -0.19411945), (0.980103, -0.034656297, -0.19544032), (0.9663971, -0.25705364, -2.1779073e-8), (0.8831993, -0.46899793, -2.7672407e-8), (0.78740877, -0.61643124, -3.4710265e-8), (0.7060359, -0.7081761, -2.9813258e-8), (0.65394026, -0.75654626, 9.516693e-9), (0.64945245, -0.76040214, 2.0188043e-8), (0.76359713, -0.6456929, 4.7758224e-9), (0.927558, -0.37367925, 0), (0.94768775, -0.2572454, 0.18897848), (0.86599636, -0.46929795, 0.1726548), (0.7719683, -0.61675423, 0.15388055), (0.6921143, -0.708483, 0.13794734), (0.6409973, -0.7568365, 0.12775362), (0.6365785, -0.76070374, 0.12687568), (0.7485495, -0.646078, 0.14918764), (0.9095448, -0.37400216, 0.1812472), (0.8921337, -0.25761673, 0.37112126), (0.8150403, -0.4698697, 0.33901575), (0.72636473, -0.617356, 0.30210242), (0.6511049, -0.70904016, 0.27078494), (0.60295135, -0.7573458, 0.25075287), (0.59879404, -0.7612039, 0.24902672), (0.7043288, -0.64662486, 0.29291156), (0.8561655, -0.37446573, 0.35602793), (0.8026382, -0.25790292, 0.53782713), (0.7331411, -0.4703089, 0.49123698), (0.6532484, -0.6178158, 0.4376875), (0.5854791, -0.709463, 0.39227086), (0.54213613, -0.75772965, 0.36322746), (0.53840274, -0.7615759, 0.3607279), (0.63344544, -0.64701533, 0.4244031), (0.7702235, -0.3747979, 0.51602554), (0.6831666, -0.25800562, 0.68316656), (0.62396383, -0.47046605, 0.6239637), (0.55592304, -0.61798, 0.5559229), (0.49822104, -0.70961374, 0.498221), (0.4613238, -0.7578659, 0.4613238), (0.45814967, -0.7617072, 0.45814964), (0.53907186, -0.64715, 0.5390718), (0.6555305, -0.37491274, 0.6555305), (0.53782713, -0.25790292, 0.8026382), (0.49123707, -0.47030878, 0.7331411), (0.43768743, -0.61781585, 0.6532483), (0.39227077, -0.7094632, 0.58547896), (0.36322746, -0.75772965, 0.54213613), (0.36072794, -0.7615759, 0.5384027), (0.4244031, -0.64701533, 0.6334453), (0.51602554, -0.3747977, 0.7702235), (0.37112117, -0.25761676, 0.8921338), (0.33901566, -0.4698697, 0.81504035), (0.3021023, -0.617356, 0.7263648), (0.27078488, -0.70904005, 0.6511049), (0.25075293, -0.75734574, 0.6029514), (0.24902673, -0.76120394, 0.5987939), (0.29291156, -0.64662504, 0.7043287), (0.35602796, -0.37446553, 0.85616565), (0.18897845, -0.25724524, 0.9476877), (0.17265478, -0.46929806, 0.86599636), (0.15388049, -0.6167542, 0.7719683), (0.13794732, -0.70848286, 0.6921146), (0.12775365, -0.75683635, 0.6409975), (0.12687567, -0.7607039, 0.63657844), (0.14918761, -0.6460781, 0.74854934), (0.18124717, -0.3740025, 0.9095448), (1.2099485e-8, -0.2570536, 0.96639717), (3.609445e-8, -0.46899804, 0.8831992), (9.694934e-8, -0.6164313, 0.78740865), (6.320409e-8, -0.7081759, 0.70603603), (0, -0.756546, 0.65394044), (3.5625962e-9, -0.7604022, 0.6494524), (2.3879112e-9, -0.64569294, 0.76359713), (-7.175795e-9, -0.3736802, 0.9275576), (-0.18897846, -0.25724536, 0.94768775), (-0.17265481, -0.46929786, 0.86599636), (-0.15388049, -0.61675423, 0.77196825), (-0.13794726, -0.7084829, 0.6921144), (-0.12775363, -0.75683624, 0.6409975), (-0.12687567, -0.7607039, 0.63657844), (-0.14918761, -0.6460781, 0.74854934), (-0.18124713, -0.37400267, 0.90954465), (-0.3711212, -0.2576168, 0.8921338), (-0.3390157, -0.46986964, 0.8150403), (-0.30210245, -0.61735594, 0.72636473), (-0.27078503, -0.70904005, 0.6511049), (-0.25075296, -0.75734574, 0.60295147), (-0.24902673, -0.7612039, 0.598794), (-0.29291153, -0.64662504, 0.7043287), (-0.35602796, -0.3744656, 0.8561655), (-0.53782713, -0.2579029, 0.80263823), (-0.49123693, -0.47030893, 0.73314095), (-0.4376875, -0.61781573, 0.65324837), (-0.3922709, -0.7094629, 0.58547914), (-0.3632275, -0.75772965, 0.54213613), (-0.36072794, -0.7615759, 0.5384027), (-0.42440307, -0.64701533, 0.6334454), (-0.51602554, -0.37479776, 0.7702235), (-0.68316656, -0.25800568, 0.68316656), (-0.62396383, -0.47046623, 0.6239638), (-0.5559229, -0.61797994, 0.555923), (-0.49822104, -0.70961356, 0.4982211), (-0.4613238, -0.7578659, 0.4613238), (-0.45814964, -0.7617072, 0.45814967), (-0.5390718, -0.64715, 0.53907186), (-0.6555305, -0.37491277, 0.6555305), (-0.80263823, -0.25790295, 0.53782713), (-0.7331411, -0.4703088, 0.49123704), (-0.6532484, -0.61781573, 0.4376875), (-0.585479, -0.70946294, 0.39227083), (-0.5421361, -0.75772965, 0.3632274), (-0.5384027, -0.7615759, 0.3607279), (-0.63344544, -0.6470153, 0.42440316), (-0.7702235, -0.37479785, 0.51602554), (-0.8921338, -0.2576167, 0.37112117), (-0.8150403, -0.46986964, 0.3390157), (-0.7263648, -0.61735594, 0.30210236), (-0.6511049, -0.70904, 0.27078488), (-0.6029513, -0.7573458, 0.2507528), (-0.59879404, -0.7612039, 0.24902672), (-0.7043288, -0.6466248, 0.29291156), (-0.8561655, -0.3744657, 0.35602796), (-0.9476877, -0.25724524, 0.18897845), (-0.8659964, -0.46929792, 0.17265481), (-0.7719683, -0.61675423, 0.15388054), (-0.6921144, -0.7084829, 0.13794734), (-0.6409973, -0.7568365, 0.1277536), (-0.6365785, -0.76070386, 0.12687567), (-0.74854946, -0.646078, 0.14918761), (-0.9095449, -0.37400216, 0.1812472), (-0.96639717, -0.25705364, 0), (-0.8831992, -0.46899796, 8.422036e-9), (-0.78740877, -0.61643124, 7.181433e-9), (-0.7060359, -0.7081761, 1.5502893e-8), (-0.6539402, -0.75654626, 2.0222974e-8), (-0.64945245, -0.76040214, 2.0188043e-8), (-0.76359713, -0.6456929, 2.3879112e-9), (-0.927558, -0.37367928, -2.3919322e-9), (-0.9476876, -0.25724533, -0.18897843), (-0.86599636, -0.46929798, -0.17265482), (-0.77196825, -0.6167541, -0.15388054), (-0.6921145, -0.70848286, -0.13794737), (-0.6409974, -0.7568365, -0.12775366), (-0.6365785, -0.7607039, -0.12687568), (-0.74854934, -0.6460781, -0.14918762), (-0.9095449, -0.37400216, -0.18124716), (-0.8921337, -0.25761685, -0.37112123), (-0.8150403, -0.46986973, -0.33901566), (-0.7263648, -0.6173559, -0.3021024), (-0.65110505, -0.70904005, -0.270785), (-0.6029513, -0.7573458, -0.2507529), (-0.59879404, -0.76120394, -0.24902682), (-0.7043287, -0.64662486, -0.29291156), (-0.8561655, -0.37446585, -0.35602796), (-0.8026382, -0.25790313, -0.5378271), (-0.7331411, -0.4703089, -0.49123695), (-0.6532484, -0.6178158, -0.4376875), (-0.5854791, -0.70946294, -0.39227083), (-0.542136, -0.75772977, -0.3632274), (-0.53840274, -0.7615758, -0.36072794), (-0.6334456, -0.6470151, -0.42440328), (-0.7702235, -0.37479797, -0.5160255), (-0.68316644, -0.25800604, -0.68316644), (-0.6239637, -0.4704662, -0.6239638), (-0.5559229, -0.61797994, -0.55592304), (-0.49822104, -0.7096136, -0.4982211), (-0.46132368, -0.7578661, -0.46132365), (-0.45814967, -0.7617071, -0.45814958), (-0.539072, -0.64714986, -0.53907186), (-0.6555305, -0.3749129, -0.65553045), (-0.537827, -0.2579033, -0.80263805), (-0.49123698, -0.470309, -0.733141), (-0.43768755, -0.61781555, -0.6532485), (-0.39227092, -0.70946294, -0.58547914), (-0.36322743, -0.75772965, -0.5421361), (-0.36072803, -0.7615759, -0.5384027), (-0.4244032, -0.6470153, -0.63344544), (-0.51602554, -0.37479776, -0.7702235), (-0.37112117, -0.25761685, -0.8921337), (-0.33901578, -0.46986964, -0.8150403), (-0.30210254, -0.6173558, -0.7263648), (-0.270785, -0.70904016, -0.6511049), (-0.25075293, -0.75734574, -0.6029514), (-0.24902673, -0.76120394, -0.5987939), (-0.29291156, -0.64662504, -0.7043287), (-0.35602796, -0.37446553, -0.85616565), (-0.1889785, -0.2572454, -0.9476877), (-0.17265487, -0.4692977, -0.8659965), (-0.15388064, -0.61675406, -0.77196836), (-0.13794746, -0.7084832, -0.6921143), (-0.12775369, -0.7568364, -0.6409974), (-0.12687567, -0.7607039, -0.63657844), (-0.14918761, -0.6460781, -0.74854934), (-0.1812473, -0.3740015, -0.90954506), (3.8718355e-8, -0.2570538, -0.9663971), (5.5344813e-8, -0.46899778, -0.88319933), (1.256751e-7, -0.6164311, -0.7874089), (7.274435e-8, -0.70817614, -0.7060358), (-3.56876e-9, -0.75654626, -0.6539402), (-3.5625962e-9, -0.7604022, -0.6494524), (-2.3879112e-9, -0.64569294, -0.76359713), (9.567729e-9, -0.37367833, -0.9275584), (0.18897854, -0.25724527, -0.94768775), (0.17265482, -0.46929798, -0.86599624), (0.15388069, -0.6167541, -0.7719683), (0.13794747, -0.7084829, -0.6921145), (0.12775369, -0.7568364, -0.64099747), (0.12687567, -0.7607039, -0.63657844), (0.14918761, -0.6460781, -0.74854934), (0.18124728, -0.37400174, -0.90954506), (0.37112123, -0.2576167, -0.8921338), (0.3390157, -0.46986964, -0.8150403), (0.30210236, -0.6173559, -0.7263648), (0.27078488, -0.70904016, -0.6511049), (0.25075296, -0.75734574, -0.60295147), (0.24902673, -0.7612039, -0.598794), (0.29291153, -0.64662504, -0.7043287), (0.35602796, -0.3744656, -0.8561655), (0.537827, -0.2579031, -0.80263823), (0.4912371, -0.47030878, -0.7331411), (0.4376875, -0.61781555, -0.6532485), (0.39227077, -0.7094631, -0.58547896), (0.36322746, -0.75772965, -0.5421361), (0.36072803, -0.7615759, -0.5384027), (0.42440316, -0.64701533, -0.6334454), (0.51602554, -0.37479782, -0.7702235), (0.68316644, -0.2580059, -0.68316656), (0.6239637, -0.47046608, -0.62396383), (0.555923, -0.6179799, -0.555923), (0.49822104, -0.70961374, -0.49822098), (0.46132368, -0.7578661, -0.46132365), (0.45814967, -0.7617072, -0.45814958), (0.539072, -0.64714986, -0.5390719), (0.65553045, -0.3749128, -0.65553045), (0.8026382, -0.2579031, -0.5378271), (0.7331411, -0.4703089, -0.49123698), (0.6532484, -0.6178157, -0.43768743), (0.5854791, -0.70946306, -0.39227083), (0.542136, -0.75772977, -0.3632274), (0.53840274, -0.7615759, -0.36072794), (0.63344556, -0.6470151, -0.42440322), (0.7702235, -0.37479794, -0.5160255), (0.8921337, -0.25761682, -0.37112123), (0.8150403, -0.46986976, -0.33901563), (0.7263648, -0.61735594, -0.3021024), (0.651105, -0.70904, -0.27078494), (0.60295135, -0.7573458, -0.25075287), (0.59879404, -0.7612039, -0.24902679), (0.7043288, -0.6466248, -0.2929116), (0.85616547, -0.37446573, -0.35602793), (0.9476877, -0.2572453, -0.18897846), (0.86599636, -0.46929798, -0.17265481), (0.77196825, -0.6167542, -0.15388057), (0.6921145, -0.7084829, -0.13794737), (0.64099747, -0.75683635, -0.12775367), (0.6365785, -0.76070386, -0.12687567), (0.74854934, -0.64607805, -0.14918762), (0.9095449, -0.37400216, -0.18124722), (0.87862027, -0.47752106, 3.790797e-9), (0.54895055, -0.8358548, 6.0972893e-10), (0.2836181, -0.9589373, -2.0877116e-9), (0.1502603, -0.98864645, -1.0391148e-9), (0.08135559, -0.9966852, -2.9658204e-10), (0.041908804, -0.9991215, -4.447427e-10), (0.017303105, -0.99985033, -7.4116574e-11), (7.4116054e-11, -1, -7.8748306e-11), (0.8615472, -0.47771809, 0.17181972), (0.5381448, -0.83600605, 0.107210115), (0.2779811, -0.95899034, 0.055355724), (0.14726415, -0.9886624, 0.029323576), (0.07973269, -0.9966898, 0.015875824), (0.04107439, -0.9991227, 0.008177205), (0.016961332, -0.9998505, 0.0033748283), (0.81086755, -0.4782254, 0.33733407), (0.5061226, -0.83639467, 0.21043748), (0.26133332, -0.9591161, 0.108633064), (0.13843021, -0.98869914, 0.057541836), (0.07494749, -0.99670076, 0.031152925), (0.038608525, -0.99912554, 0.016046872), (0.0159424, -0.9998509, 0.0066242646), (0.72939706, -0.47863543, 0.48876187), (0.45498493, -0.8367085, 0.30480772), (0.23485038, -0.9592166, 0.15731767), (0.12439223, -0.9887283, 0.08332465), (0.06734533, -0.99670935, 0.045111), (0.034691118, -0.9991279, 0.023236908), (0.014323316, -0.9998514, 0.009592943), (0.62079144, -0.47878593, 0.6207914), (0.38712177, -0.8368235, 0.38712168), (0.19979146, -0.95925313, 0.19979142), (0.10581948, -0.9887388, 0.10581948), (0.057289332, -0.9967125, 0.05728933), (0.029510284, -0.99912876, 0.029510284), (0.012183255, -0.9998515, 0.012183255), (0.48876193, -0.47863516, 0.72939706), (0.3048076, -0.83670855, 0.45498466), (0.15731755, -0.9592168, 0.23485012), (0.08332467, -0.9887283, 0.124392234), (0.04511104, -0.99670935, 0.067345314), (0.023236902, -0.999128, 0.034691095), (0.0095928935, -0.9998514, 0.014323341), (0.33733416, -0.47822526, 0.8108677), (0.21043734, -0.8363949, 0.50612235), (0.1086329, -0.95911616, 0.26133293), (0.05754186, -0.98869914, 0.13843024), (0.03115295, -0.99670076, 0.07494749), (0.016046833, -0.99912554, 0.03860847), (0.0066242013, -0.999851, 0.01594243), (0.17181955, -0.477718, 0.8615472), (0.10721004, -0.836006, 0.53814507), (0.05535562, -0.9589904, 0.2779807), (0.029323597, -0.9886625, 0.14726426), (0.015875814, -0.9966898, 0.07973271), (0.0081771705, -0.9991227, 0.04107432), (0.0033748276, -0.9998504, 0.01696134), (-6.444348e-8, -0.47752103, 0.8786203), (-5.731455e-8, -0.8358543, 0.5489515), (1.789467e-9, -0.95893747, 0.28361773), (4.4533488e-10, -0.98864645, 0.15026036), (0, -0.9966852, 0.081355594), (5.1886645e-10, -0.9991214, 0.04190872), (1.1117486e-10, -0.99985033, 0.017303115), (-0.1718196, -0.47771767, 0.86154735), (-0.107210115, -0.8360057, 0.5381454), (-0.05535563, -0.9589904, 0.27798072), (-0.02932359, -0.9886625, 0.14726426), (-0.015875814, -0.9966898, 0.07973271), (-0.0081771705, -0.9991227, 0.041074317), (-0.003374829, -0.9998505, 0.016961344), (-0.3373341, -0.4782251, 0.8108677), (-0.2104374, -0.83639467, 0.5061226), (-0.10863291, -0.95911616, 0.26133293), (-0.057541866, -0.98869914, 0.13843024), (-0.031152952, -0.99670076, 0.07494749), (-0.016046835, -0.99912554, 0.038608465), (-0.006624202, -0.9998509, 0.01594243), (-0.48876193, -0.47863522, 0.72939706), (-0.3048076, -0.83670855, 0.45498464), (-0.15731752, -0.95921665, 0.23485011), (-0.08332467, -0.9887283, 0.124392234), (-0.04511104, -0.99670935, 0.067345314), (-0.023236902, -0.9991279, 0.034691095), (-0.009592894, -0.9998514, 0.014323339), (-0.62079144, -0.4787859, 0.6207914), (-0.38712177, -0.8368235, 0.38712168), (-0.19979146, -0.95925325, 0.19979142), (-0.10581948, -0.9887388, 0.10581948), (-0.05728933, -0.9967125, 0.057289332), (-0.029510284, -0.99912876, 0.029510284), (-0.012183255, -0.9998515, 0.012183255), (-0.72939706, -0.47863537, 0.48876187), (-0.45498493, -0.8367085, 0.30480772), (-0.23485038, -0.9592166, 0.15731767), (-0.12439223, -0.9887283, 0.08332465), (-0.06734533, -0.99670935, 0.045111008), (-0.034691118, -0.999128, 0.023236908), (-0.0143233165, -0.9998514, 0.009592943), (-0.81086755, -0.47822532, 0.3373341), (-0.5061226, -0.83639467, 0.21043746), (-0.26133335, -0.9591161, 0.10863305), (-0.1384302, -0.9886991, 0.057541836), (-0.07494748, -0.9967007, 0.031152934), (-0.03860851, -0.99912554, 0.01604688), (-0.015942398, -0.999851, 0.0066242637), (-0.8615472, -0.47771806, 0.1718197), (-0.5381448, -0.83600605, 0.107210115), (-0.27798107, -0.9589902, 0.0553557), (-0.1472642, -0.9886625, 0.029323587), (-0.0797327, -0.9966899, 0.015875828), (-0.041074373, -0.9991227, 0.008177203), (-0.01696133, -0.9998504, 0.003374827), (-0.87862027, -0.47752106, -5.054396e-9), (-0.54895055, -0.8358548, 6.0972893e-10), (-0.2836181, -0.9589373, 2.385956e-9), (-0.1502603, -0.98864645, -5.492464e-9), (-0.08135559, -0.9966852, -1.6756886e-8), (-0.041908797, -0.9991214, -1.02661435e-8), (-0.017303105, -0.99985033, 9.264572e-11), (-0.86154723, -0.47771794, -0.17181973), (-0.5381448, -0.83600605, -0.107210115), (-0.2779811, -0.95899034, -0.055355724), (-0.14726415, -0.9886624, -0.029323576), (-0.07973269, -0.9966898, -0.015875824), (-0.04107439, -0.9991227, -0.008177205), (-0.016961332, -0.9998505, -0.0033748283), (-0.8108676, -0.4782253, -0.33733416), (-0.5061226, -0.83639467, -0.21043748), (-0.26133332, -0.9591161, -0.108633064), (-0.13843021, -0.98869914, -0.057541836), (-0.07494749, -0.99670076, -0.031152925), (-0.038608525, -0.99912554, -0.016046872), (-0.0159424, -0.9998509, -0.0066242646), (-0.72939706, -0.47863543, -0.48876193), (-0.45498505, -0.83670837, -0.30480787), (-0.23485054, -0.9592166, -0.15731774), (-0.1243922, -0.9887283, -0.083324574), (-0.06734533, -0.99670935, -0.045111), (-0.034691118, -0.9991279, -0.023236908), (-0.014323316, -0.9998514, -0.009592943), (-0.62079144, -0.47878602, -0.6207914), (-0.38712204, -0.8368233, -0.38712195), (-0.19979168, -0.9592531, -0.19979164), (-0.105819374, -0.9887389, -0.10581937), (-0.057289332, -0.9967125, -0.05728933), (-0.029510284, -0.99912876, -0.029510284), (-0.012183255, -0.9998515, -0.012183255), (-0.48876196, -0.4786353, -0.729397), (-0.30480778, -0.8367085, -0.4549848), (-0.15731762, -0.95921665, -0.23485029), (-0.083324604, -0.9887283, -0.1243922), (-0.04511104, -0.99670935, -0.067345314), (-0.023236902, -0.999128, -0.034691095), (-0.0095928935, -0.9998514, -0.014323341), (-0.33733416, -0.47822526, -0.8108677), (-0.21043734, -0.8363949, -0.50612235), (-0.1086329, -0.95911616, -0.26133293), (-0.05754186, -0.98869914, -0.13843024), (-0.03115295, -0.99670076, -0.07494749), (-0.016046833, -0.99912554, -0.03860847), (-0.0066242013, -0.999851, -0.01594243), (-0.17181978, -0.47771752, -0.86154735), (-0.10721005, -0.8360062, -0.5381445), (-0.05535562, -0.9589904, -0.2779807), (-0.029323597, -0.9886625, -0.14726426), (-0.015875814, -0.9966898, -0.07973271), (-0.0081771705, -0.9991227, -0.04107432), (-0.0033748276, -0.9998504, -0.01696134), (6.8234364e-8, -0.47752005, -0.87862086), (5.975345e-8, -0.8358548, -0.5489505), (-1.789467e-9, -0.95893747, -0.28361773), (-4.4533488e-10, -0.98864645, -0.15026036), (0, -0.9966852, -0.081355594), (-5.1886645e-10, -0.9991214, -0.04190872), (-1.1117486e-10, -0.99985033, -0.017303115), (0.17181984, -0.47771728, -0.8615476), (0.10721014, -0.83600587, -0.538145), (0.05535563, -0.9589904, -0.27798072), (0.02932359, -0.9886625, -0.14726426), (0.015875814, -0.9966898, -0.07973271), (0.0081771705, -0.9991227, -0.041074317), (0.003374829, -0.9998505, -0.016961344), (0.3373341, -0.4782251, -0.8108677), (0.2104374, -0.83639467, -0.5061226), (0.10863291, -0.95911616, -0.26133293), (0.057541866, -0.98869914, -0.13843024), (0.031152952, -0.99670076, -0.07494749), (0.016046835, -0.99912554, -0.038608465), (0.006624202, -0.9998509, -0.01594243), (0.48876196, -0.4786353, -0.72939694), (0.30480775, -0.8367085, -0.45498478), (0.15731758, -0.95921665, -0.23485023), (0.0833246, -0.9887283, -0.1243922), (0.04511104, -0.99670935, -0.067345314), (0.023236902, -0.9991279, -0.034691095), (0.009592894, -0.9998514, -0.014323339), (0.62079144, -0.47878596, -0.62079144), (0.38712204, -0.8368233, -0.3871219), (0.19979165, -0.95925313, -0.19979164), (0.10581937, -0.9887389, -0.10581937), (0.05728933, -0.9967125, -0.057289332), (0.029510284, -0.99912876, -0.029510284), (0.012183255, -0.9998515, -0.012183255), (0.72939694, -0.47863543, -0.48876187), (0.45498502, -0.83670837, -0.30480787), (0.23485054, -0.9592166, -0.15731776), (0.1243922, -0.9887283, -0.08332458), (0.06734533, -0.99670935, -0.045111008), (0.034691118, -0.999128, -0.023236908), (0.0143233165, -0.9998514, -0.009592943), (0.8108676, -0.47822532, -0.3373341), (0.5061226, -0.83639467, -0.21043746), (0.26133335, -0.9591161, -0.10863305), (0.13843018, -0.9886991, -0.057541825), (0.07494748, -0.9967007, -0.031152915), (0.03860852, -0.99912554, -0.01604687), (0.015942398, -0.999851, -0.0066242637), (0.8615472, -0.47771797, -0.1718197), (0.5381448, -0.83600605, -0.107210115), (0.27798107, -0.9589902, -0.0553557), (0.14726418, -0.9886625, -0.029323583), (0.0797327, -0.9966899, -0.015875824), (0.04107439, -0.9991227, -0.008177205), (0.01696133, -0.9998504, -0.003374827), (0.0017910257, -0.9999984, 0), (0.008008945, -0.99996793, 2.3820592e-9), (0.029197065, -0.99957365, 9.523482e-9), (0.07356174, -0.9972906, 2.3795088e-9), (0.15690331, -0.987614, -2.3785747e-9), (0.30916163, -0.9510095, -1.2857333e-7), (0.56821513, -0.82288, -3.715786e-7), (0.8722378, -0.48908204, -3.1032386e-7), (0.99748534, -0.070873536, -4.0682938e-8), (0.0017824449, -0.97365195, 0.22803208), (0.007981459, -0.97538435, 0.22036716), (0.029047247, -0.97513115, 0.21971695), (0.07317643, -0.9727366, 0.2200654), (0.15596545, -0.9620427, 0.22393872), (0.30606085, -0.92219985, 0.23637728), (0.5557996, -0.78855157, 0.26319808), (0.838242, -0.4602595, 0.29242346), (0.9538364, -0.06498623, 0.2932114), (0.0016459558, -0.8521179, 0.5233473), (0.007459973, -0.8646519, 0.502316), (0.027218927, -0.8646606, 0.5016186), (0.06867745, -0.8614024, 0.5032588), (0.14581504, -0.8464777, 0.5120678), (0.28099412, -0.7957766, 0.536453), (0.48767558, -0.6510382, 0.5816543), (0.6961363, -0.35982344, 0.6212257), (0.78451973, -0.04754041, 0.6182788), (0.0010506777, -0.51338625, 0.858157), (0.005139824, -0.56163484, 0.82736915), (0.019360593, -0.560995, 0.82759285), (0.049097665, -0.5554036, 0.83013034), (0.102588594, -0.5350783, 0.8385505), (0.1882295, -0.4793632, 0.8571934), (0.29835513, -0.36060175, 0.88371414), (0.39407274, -0.18626343, 0.900007), (0.44546494, -0.022890082, 0.8950067), (-0.00021211403, 0.08656356, 0.99624634), (-0.00011271898, 0.001569491, 0.9999988), (0.00082780846, 0.0038505257, 0.99999225), (0.0024554238, 0.008222952, 0.9999632), (0.0033981542, 0.0162242, 0.9998626), (-0.00068276835, 0.02756521, 0.9996198), (-0.016060319, 0.032395408, 0.999346), (-0.031301368, 0.016775863, 0.9993692), (-0.02239698, 0.0010510503, 0.9997486), (-0.0014355276, 0.6119695, 0.7908801), (-0.0059562144, 0.56333214, 0.8262091), (-0.021746637, 0.56457955, 0.82509214), (-0.054847542, 0.5607731, 0.8261509), (-0.11491316, 0.542145, 0.8323904), (-0.21268314, 0.48881647, 0.846064), (-0.34241465, 0.3706681, 0.8633408), (-0.44943595, 0.18620548, 0.87369037), (-0.47959995, 0.017639425, 0.87731), (-0.0021205496, 0.8772934, 0.47994992), (-0.009456718, 0.8650009, 0.5016812), (-0.03566986, 0.86469036, 0.5010371), (-0.09102668, 0.8582311, 0.5051272), (-0.19226754, 0.8325194, 0.5195618), (-0.35814887, 0.75586486, 0.5480854), (-0.57436156, 0.57632977, 0.5813371), (-0.74637496, 0.29174125, 0.59817344), (-0.7999116, 0.025900932, 0.59955865), (-0.002412789, 0.9770872, 0.21282549), (-0.010922773, 0.97539395, 0.2201986), (-0.041352443, 0.97460985, 0.22005825), (-0.10610732, 0.9690354, 0.22296107), (-0.22631806, 0.94589263, 0.23252381), (-0.42733392, 0.86840475, 0.25151357), (-0.6911696, 0.66880006, 0.27384472), (-0.896451, 0.33977452, 0.28448), (-0.9583842, 0.028671024, 0.2840383), (-0.0024883056, 0.99999684, -3.9217507e-8), (-0.011293192, 0.9999362, 0), (-0.04270196, 0.99908787, 2.3868287e-9), (-0.10967163, 0.99396783, -5.0237933e-8), (-0.23457088, 0.97209907, -4.5220082e-7), (-0.44487253, 0.89559394, -7.965233e-7), (-0.7219697, 0.6919246, -0.0000012954072), (-0.9361626, 0.35156757, -0.0000017958048), (-0.9995758, 0.02912688, -0.0000018083155), (-0.002412789, 0.97708726, -0.21282548), (-0.010922771, 0.97539395, -0.22019857), (-0.041352443, 0.9746098, -0.22005826), (-0.106107354, 0.96903545, -0.22296105), (-0.22631823, 0.94589263, -0.2325237), (-0.42733407, 0.86840457, -0.25151345), (-0.6911699, 0.66879994, -0.27384457), (-0.89645106, 0.3397745, -0.2844797), (-0.9583842, 0.02867106, -0.28403816), (-0.0021205493, 0.87729335, -0.47994983), (-0.009456718, 0.8650009, -0.5016812), (-0.035669863, 0.86469036, -0.5010371), (-0.09102671, 0.8582311, -0.5051272), (-0.19226773, 0.8325199, -0.519561), (-0.3581494, 0.7558655, -0.54808414), (-0.57436264, 0.5763301, -0.58133566), (-0.7463765, 0.29174194, -0.5981713), (-0.7999131, 0.025901165, -0.59955686), (-0.0014355263, 0.61196893, -0.79088056), (-0.0059561385, 0.5633314, -0.8262096), (-0.021746667, 0.5645791, -0.8250923), (-0.054847486, 0.56077224, -0.82615143), (-0.114912756, 0.54214406, -0.832391), (-0.21268283, 0.4888165, -0.84606403), (-0.34241474, 0.37066782, -0.8633409), (-0.44943598, 0.1862054, -0.8736904), (-0.47959998, 0.017639784, -0.87731), (-0.00021211238, 0.08656278, -0.9962464), (-0.00011248365, 0.0015691994, -0.99999875), (0.0008277782, 0.003849293, -0.99999225), (0.0024551721, 0.008222867, -0.9999632), (0.0033981944, 0.016223986, -0.9998626), (-0.00068287423, 0.027565388, -0.9996197), (-0.016061671, 0.03239651, -0.999346), (-0.031302236, 0.016776066, -0.9993692), (-0.022397457, 0.0010512322, -0.99974865), (0.0010506742, -0.513385, -0.8581578), (0.0051399795, -0.56163454, -0.82736945), (0.019360654, -0.56099534, -0.82759243), (0.04909738, -0.5554036, -0.83013034), (0.10258831, -0.5350777, -0.8385508), (0.1882296, -0.47936282, -0.85719365), (0.29835454, -0.36060062, -0.8837147), (0.3940712, -0.18626295, -0.9000078), (0.4454639, -0.022889761, -0.89500725), (0.0016459558, -0.85211796, -0.52334726), (0.007459973, -0.864652, -0.50231594), (0.027218927, -0.8646606, -0.5016186), (0.06867745, -0.8614024, -0.50325876), (0.14581476, -0.8464778, -0.51206774), (0.28099394, -0.7957772, -0.5364523), (0.48767638, -0.6510389, -0.58165294), (0.69613665, -0.3598235, -0.6212252), (0.7845195, -0.047540363, -0.61827904), (0.0017824449, -0.97365195, -0.22803205), (0.007981458, -0.97538435, -0.22036715), (0.029047243, -0.97513115, -0.21971692), (0.07317643, -0.9727366, -0.2200654), (0.15596533, -0.9620427, -0.22393888), (0.3060604, -0.92219985, -0.23637785), (0.55579937, -0.78855157, -0.2631985), (0.8382422, -0.46025938, -0.29242367), (0.9538364, -0.064986326, -0.2932113), (0.98349696, 0.18092425, 6.67424e-8), (0.9456259, 0.32525605, 5.0055636e-8), (0.8942702, 0.44752732, 7.148294e-9), (0.8294695, 0.5585521, -4.762485e-9), (0.7495171, 0.661985, -1.0232434e-7), (0.6530095, 0.75734967, -9.7519994e-8), (0.54010105, 0.84160024, 9.751037e-8), (0.47523314, 0.8798599, 1.4784744e-7), (0.94157934, 0.17399153, 0.28836673), (0.9053649, 0.3145876, 0.28521743), (0.85721934, 0.4348447, 0.27583548), (0.7971839, 0.5448768, 0.26001388), (0.7228232, 0.64770114, 0.24085231), (0.63195, 0.7418323, 0.22433001), (0.5243177, 0.8229762, 0.21863434), (0.46011922, 0.856403, 0.23423083), (0.77843845, 0.14570199, 0.61057734), (0.74912816, 0.26736656, 0.606071), (0.7129901, 0.3747568, 0.5926234), (0.67014605, 0.4764021, 0.5691618), (0.6161827, 0.5739136, 0.5393905), (0.54604584, 0.66277015, 0.5124156), (0.4571868, 0.73394686, 0.50229716), (0.39344624, 0.74213666, 0.542617), (0.44786814, 0.08545561, 0.8900065), (0.43201402, 0.15951367, 0.8876482), (0.4147396, 0.2277936, 0.88096607), (0.39658368, 0.29613495, 0.86892205), (0.3732474, 0.36558017, 0.8526649), (0.33807963, 0.4303131, 0.8369784), (0.28564703, 0.4771429, 0.8311079), (0.21595149, 0.41346782, 0.88453895), (-0.0142073715, -0.0023450057, 0.9998964), (-0.011885904, -0.0051494823, 0.99991614), (-0.009420872, -0.007436175, 0.99992794), (-0.007206506, -0.008581326, 0.99993724), (-0.0056931493, -0.008097778, 0.999951), (-0.0059391796, -0.006440946, 0.9999616), (-0.009125824, -0.006739945, 0.9999357), (-0.07354393, -0.14552891, 0.98661673), (-0.4679387, -0.09171293, 0.8789893), (-0.4450605, -0.17672996, 0.87788814), (-0.41781262, -0.2545414, 0.87214744), (-0.38953793, -0.3269476, 0.8610258), (-0.3592133, -0.3938431, 0.8460812), (-0.32368037, -0.45096642, 0.8317814), (-0.28011188, -0.4896567, 0.8256959), (-0.29540482, -0.58624345, 0.7543571), (-0.7845653, -0.15593858, 0.60011697), (-0.7431593, -0.3012405, 0.5974684), (-0.687015, -0.42978486, 0.58591413), (-0.62395287, -0.53998214, 0.56489134), (-0.5576889, -0.6316981, 0.5384613), (-0.48941723, -0.703884, 0.514799), (-0.41973525, -0.75401896, 0.50525016), (-0.39751273, -0.79557925, 0.4572059), (-0.94018984, -0.18823588, 0.28391972), (-0.887481, -0.36448428, 0.28200844), (-0.8111646, -0.5166578, 0.27400073), (-0.7235078, -0.6394732, 0.2600198), (-0.63409984, -0.73396164, 0.24334651), (-0.5486296, -0.8040602, 0.22911313), (-0.4697352, -0.85410726, 0.22327036), (-0.4354043, -0.8764636, 0.20551078), (-0.9804628, -0.19670461, -0.0000016673475), (-0.92442995, -0.38135192, -0.0000010725124), (-0.8418857, -0.5396559, -4.1057254e-7), (-0.74680173, -0.66504675, -2.455806e-7), (-0.65090233, -0.7591615, -9.1221395e-8), (-0.5611923, -0.8276854, 4.79021e-9), (-0.48063096, -0.87692297, -4.7837267e-9), (-0.44415656, -0.8959492, -1.0156945e-8), (-0.9401897, -0.18823612, -0.28391957), (-0.8874812, -0.36448383, -0.28200835), (-0.8111648, -0.51665777, -0.2740006), (-0.7235079, -0.6394734, -0.26001972), (-0.6341001, -0.73396164, -0.2433464), (-0.5486295, -0.8040602, -0.22911286), (-0.46973515, -0.85410726, -0.22327027), (-0.4354043, -0.8764636, -0.2055108), (-0.78456646, -0.1559388, -0.6001154), (-0.7431601, -0.30124044, -0.59746736), (-0.6870152, -0.42978486, -0.5859138), (-0.6239529, -0.539982, -0.5648913), (-0.55768895, -0.63169783, -0.5384615), (-0.48941702, -0.703884, -0.51479936), (-0.4197351, -0.7540189, -0.5052504), (-0.39751273, -0.79557914, -0.45720604), (-0.46793893, -0.0917128, -0.8789892), (-0.44506076, -0.17673005, -0.87788796), (-0.41781265, -0.25454152, -0.8721474), (-0.38953787, -0.32694745, -0.8610259), (-0.35921317, -0.39384282, -0.8460814), (-0.32368022, -0.45096633, -0.8317815), (-0.28011185, -0.48965684, -0.82569575), (-0.29540503, -0.5862435, -0.754357), (-0.01420815, -0.0023448465, -0.9998963), (-0.011886849, -0.00514981, -0.99991614), (-0.009421063, -0.007436295, -0.99992794), (-0.0072066598, -0.00858147, -0.99993724), (-0.005693403, -0.008098022, -0.99995095), (-0.0059392233, -0.006441142, -0.9999617), (-0.009126172, -0.0067405584, -0.9999356), (-0.073544435, -0.14552973, -0.98661655), (0.44786724, 0.08545593, -0.89000696), (0.43201357, 0.15951355, -0.88764846), (0.41473946, 0.2277936, -0.8809662), (0.39658362, 0.2961349, -0.868922), (0.3732473, 0.36557993, -0.8526651), (0.3380793, 0.43031266, -0.8369787), (0.28564677, 0.47714245, -0.83110833), (0.21595132, 0.41346765, -0.8845391), (0.7784382, 0.14570187, -0.6105776), (0.74912816, 0.26736644, -0.60607105), (0.71299005, 0.3747568, -0.5926234), (0.6701461, 0.47640216, -0.56916183), (0.6161827, 0.57391346, -0.5393905), (0.54604566, 0.66276985, -0.51241606), (0.45718658, 0.7339464, -0.50229794), (0.3934461, 0.7421361, -0.5426179), (0.9415793, 0.1739914, -0.28836656), (0.905365, 0.31458747, -0.28521731), (0.85721934, 0.4348447, -0.27583548), (0.79718375, 0.5448768, -0.26001388), (0.72282326, 0.64770097, -0.2408523), (0.63194996, 0.74183244, -0.22433001), (0.52431756, 0.8229764, -0.21863446), (0.46011943, 0.85640293, -0.23423108), (-0.107703485, 0.99418306, 1.2826949e-7), (-0.24932975, 0.9684186, 7.650557e-8), (-0.5462708, 0.83760875, 2.3956346e-9), (-0.7906947, 0.6122107, -5.495479e-8), (-0.90932196, 0.4160933, -3.8115138e-7), (-0.9396051, 0.3422605, -6.5067775e-7), (-0.91463155, 0.40428832, -3.202727e-7), (-0.8147783, 0.57977265, -1.934516e-7), (-0.6486518, 0.7610854, -5.2492965e-7), (-0.10457451, 0.9346017, 0.33997595), (-0.23221053, 0.91330385, 0.3345959), (-0.50492734, 0.8031818, 0.3161443), (-0.7408693, 0.6055517, 0.29055065), (-0.8603084, 0.4272938, 0.27800998), (-0.8850471, 0.35854357, 0.2968805), (-0.8465205, 0.41085783, 0.3385243), (-0.73879176, 0.5615154, 0.37267575), (-0.5810893, 0.7227462, 0.3741299), (-0.08446494, 0.72873986, 0.6795615), (-0.16852409, 0.72131395, 0.67179304), (-0.3584897, 0.6670912, 0.6530501), (-0.5508695, 0.5524037, 0.62561405), (-0.6669303, 0.4310546, 0.60777956), (-0.6861248, 0.37438953, 0.6237511), (-0.63285875, 0.39893183, 0.6635835), (-0.528555, 0.4889496, 0.6939437), (-0.41166726, 0.6005742, 0.6854493), (-0.034180645, 0.3855277, 0.92206293), (-0.053436194, 0.39579597, 0.9167825), (-0.10595249, 0.40063772, 0.91008985), (-0.19069983, 0.38922653, 0.9011861), (-0.2796363, 0.35597488, 0.89167565), (-0.32198086, 0.32642272, 0.88869375), (-0.3081771, 0.32430068, 0.8943467), (-0.2619882, 0.34771782, 0.9002525), (-0.21065092, 0.39906287, 0.8923985), (0.044149693, -0.024226665, 0.99873114), (0.09204957, 0.0006217157, 0.9957542), (0.18540555, 0.05067691, 0.9813545), (0.23288992, 0.12319866, 0.96466804), (0.20387127, 0.17463173, 0.96329653), (0.12819687, 0.1877263, 0.97381955), (0.05559666, 0.17390418, 0.9831919), (0.01211929, 0.13529555, 0.9907312), (0.001837681, 0.109996155, 0.9939303), (0.13500845, -0.4214371, 0.89675164), (0.23583218, -0.3840489, 0.8926867), (0.43481666, -0.28737304, 0.853435), (0.5697295, -0.14533044, 0.8088803), (0.59543717, -0.035706963, 0.8026079), (0.52536315, 0.0013242351, 0.8508771), (0.4025757, -0.034614727, 0.914732), (0.2856654, -0.14942014, 0.94660914), (0.21877116, -0.26809773, 0.9382232), (0.21501637, -0.73302263, 0.64532614), (0.34796673, -0.6848563, 0.64022726), (0.6016662, -0.53734535, 0.59098035), (0.77118564, -0.3376679, 0.5396787), (0.8243287, -0.19565809, 0.53122497), (0.78963536, -0.16607264, 0.59067416), (0.6821829, -0.25399786, 0.68564683), (0.5202894, -0.45591953, 0.72210544), (0.38581926, -0.62999505, 0.6739804), (0.264048, -0.91005254, 0.31950444), (0.4112529, -0.8551811, 0.31549418), (0.68427616, -0.6715076, 0.2843301), (0.8618913, -0.43882817, 0.25411215), (0.9255308, -0.2848665, 0.24948695), (0.9190785, -0.2719894, 0.28516045), (0.8431161, -0.41091976, 0.346843), (0.65194446, -0.6659096, 0.3626745), (0.4567365, -0.8317773, 0.31549692), (0.27867126, -0.9603866, 1.1859811e-7), (0.42936242, -0.90313226, 1.8505828e-7), (0.7058826, -0.7083288, 3.033082e-7), (0.884223, -0.46706498, 3.155761e-7), (0.9502087, -0.3116142, 3.1874384e-7), (0.95203173, -0.30599946, 1.9328608e-7), (0.8867718, -0.46220732, -2.6300015e-7), (0.68626773, -0.727349, -0.0000010029387), (0.46993366, -0.8827017, -0.0000014788092), (0.26404807, -0.9100524, -0.3195043), (0.4112528, -0.8551811, -0.3154941), (0.6842762, -0.6715076, -0.28433), (0.86189145, -0.4388281, -0.25411218), (0.92553085, -0.28486645, -0.249487), (0.9190785, -0.27198917, -0.28516057), (0.8431161, -0.41091964, -0.34684315), (0.65194476, -0.66590935, -0.36267442), (0.45673633, -0.8317776, -0.3154964), (0.21501635, -0.7330224, -0.6453263), (0.34796658, -0.6848562, -0.64022756), (0.60166603, -0.5373451, -0.59098065), (0.7711856, -0.3376678, -0.53967905), (0.8243286, -0.195658, -0.53122526), (0.78963524, -0.1660725, -0.59067434), (0.6821832, -0.253998, -0.68564653), (0.5202898, -0.45591995, -0.72210497), (0.38581976, -0.629996, -0.6739793), (0.13500838, -0.42143685, -0.8967517), (0.23583217, -0.3840488, -0.8926868), (0.43481672, -0.2873731, -0.8534349), (0.56972957, -0.14533053, -0.8088802), (0.5954372, -0.03570706, -0.80260783), (0.52536386, 0.0013239954, -0.8508767), (0.4025762, -0.034614913, -0.91473174), (0.28566557, -0.14942035, -0.946609), (0.21877117, -0.2680977, -0.93822324), (0.044149656, -0.024226697, -0.9987311), (0.092049554, 0.00062163745, -0.9957543), (0.18540569, 0.050676666, -0.9813545), (0.23289, 0.123198636, -0.9646679), (0.20387132, 0.17463158, -0.96329665), (0.1281967, 0.1877263, -0.9738195), (0.055596724, 0.17390431, -0.9831919), (0.012119287, 0.13529554, -0.9907312), (0.0018376936, 0.109996155, -0.9939303), (-0.03418079, 0.38552755, -0.92206305), (-0.05343632, 0.39579576, -0.9167825), (-0.10595241, 0.4006377, -0.91008985), (-0.19069976, 0.38922653, -0.9011861), (-0.27963635, 0.35597482, -0.89167565), (-0.32198146, 0.32642296, -0.88869345), (-0.30817762, 0.3243009, -0.89434636), (-0.26198834, 0.34771782, -0.90025234), (-0.21065094, 0.3990634, -0.8923981), (-0.08446487, 0.72873956, -0.6795619), (-0.16852406, 0.72131366, -0.67179334), (-0.35848957, 0.6670912, -0.6530502), (-0.5508693, 0.5524036, -0.6256142), (-0.6669303, 0.43105468, -0.6077793), (-0.6861254, 0.3743897, -0.62375027), (-0.63285935, 0.3989317, -0.66358304), (-0.5285552, 0.48894975, -0.6939434), (-0.41166762, 0.60057384, -0.68544936), (-0.1045743, 0.93460184, -0.33997604), (-0.23221041, 0.91330385, -0.33459592), (-0.5049273, 0.8031818, -0.31614432), (-0.7408692, 0.6055518, -0.29055062), (-0.86030823, 0.42729422, -0.2780098), (-0.88504714, 0.3585435, -0.29688054), (-0.8465206, 0.41085738, -0.3385245), (-0.73879164, 0.56151557, -0.3726759), (-0.58109015, 0.7227452, -0.37413046), (-0.5051496, 0.86303174, -4.603233e-8), (-0.39921612, 0.91685677, 0.0000012564138), (-0.26007763, 0.9655877, 0.0000011922366), (-0.0016138816, 0.9999986, 7.576116e-7), (0.65602213, 0.75474167, 3.8098105e-7), (0.9702792, -0.24198806, -7.4266865e-7), (0.7215899, -0.69232076, 5.960956e-7), (0.6446201, -0.764503, 0.0000014623852), (-0.45579445, 0.82433057, 0.33575356), (-0.35844636, 0.8921837, 0.27481705), (-0.23092178, 0.95615363, 0.18012604), (-0.0019826882, 0.99996, -0.008727595), (0.45810995, 0.76991546, -0.4442584), (0.7646135, -0.087167025, -0.6385672), (0.6338453, -0.59204197, -0.49772123), (0.5953778, -0.7126568, -0.37100616), (-0.33033586, 0.7067808, 0.6255711), (-0.2598714, 0.82007927, 0.5098401), (-0.16711314, 0.93037844, 0.3262957), (-0.016584055, 0.9997943, -0.011675963), (0.19697703, 0.8073589, -0.556212), (0.3988103, 0.186484, -0.897872), (0.4140515, -0.33283585, -0.84722), (0.44461516, -0.5452054, -0.7106815), (-0.17383918, 0.5149748, 0.8393932), (-0.14038512, 0.70350444, 0.6966876), (-0.095217854, 0.8888056, 0.44828358), (-0.031950526, 0.9992188, 0.023253063), (0.045566812, 0.8541048, -0.51810086), (0.14296326, 0.41211432, -0.8998462), (0.18555735, -0.032592874, -0.9820928), (0.2519652, -0.29741138, -0.9209017), (0.0058022435, 0.22480544, 0.9743864), (0.0057990337, 0.50970554, 0.8603294), (-0.0020528482, 0.81530267, 0.57903147), (-0.028720114, 0.99628794, 0.08115096), (-0.044640962, 0.8961458, -0.4415086), (-0.025324516, 0.5949191, -0.80338645), (-0.008022338, 0.26805556, -0.9633701), (0.062187504, -0.0013517477, -0.9980636), (0.20443548, -0.17399761, 0.96329176), (0.20503001, 0.17468965, 0.9630401), (0.16096906, 0.6574995, 0.73605937), (0.0025579927, 0.98821783, 0.15303293), (-0.106596336, 0.9326548, -0.34466228), (-0.14620793, 0.74769384, -0.6477477), (-0.16715601, 0.5517154, -0.8171102), (-0.11940694, 0.3340465, -0.9349626), (0.3688925, -0.5794352, 0.72675514), (0.42723304, -0.27718797, 0.86060375), (0.45986184, 0.34604776, 0.81778854), (0.09514157, 0.96822315, 0.23128323), (-0.14942555, 0.9618938, -0.22898106), (-0.23235105, 0.8651087, -0.44452193), (-0.28202137, 0.7734597, -0.5676478), (-0.2743611, 0.65483195, -0.7042167), (0.44243348, -0.8267058, 0.3475772), (0.56483287, -0.6755207, 0.4739575), (0.81624055, 0.050422534, 0.5755074), (0.3103089, 0.92368084, 0.22477122), (-0.17046581, 0.979612, -0.10630959), (-0.28230888, 0.9344485, -0.21704325), (-0.34397477, 0.8977339, -0.2752363), (-0.36683396, 0.8614918, -0.35109055), (0.4534927, -0.8912599, -8.14229e-7), (0.58373886, -0.81194144, 4.1871743e-7), (0.99860513, -0.052799623, 0.0000011603693), (0.44454923, 0.8957544, 7.7026164e-7), (-0.17512672, 0.984546, 4.0387707e-7), (-0.29774264, 0.95464617, 7.9510465e-7), (-0.36143178, 0.93239856, 4.9177686e-7), (-0.39164993, 0.9201143, 0.0000010168383), (0.44243237, -0.8267068, -0.34757674), (0.564831, -0.6755226, -0.47395673), (0.816241, 0.05042102, -0.575507), (0.31031132, 0.9236798, -0.22477183), (-0.17046468, 0.9796124, 0.10630803), (-0.28230977, 0.93444794, 0.21704406), (-0.34397402, 0.89773446, 0.27523583), (-0.36683413, 0.8614922, 0.3510895), (0.36889273, -0.57943696, -0.72675383), (0.4272328, -0.2771897, -0.8606032), (0.45986146, 0.34604695, -0.8177891), (0.09514204, 0.9682226, -0.23128517), (-0.14942604, 0.96189374, 0.22898087), (-0.23235092, 0.8651092, 0.44452125), (-0.28202158, 0.7734601, 0.5676472), (-0.27436113, 0.654832, 0.7042165), (0.20443547, -0.17399736, -0.9632918), (0.20503, 0.17468953, -0.9630401), (0.16096929, 0.6574993, -0.7360594), (0.002557546, 0.98821795, -0.15303186), (-0.106596306, 0.9326548, 0.34466228), (-0.14620784, 0.7476936, 0.647748), (-0.16715607, 0.55171514, 0.81711024), (-0.11940695, 0.3340465, 0.9349626), (0.0058022537, 0.2248052, -0.97438645), (0.0057987575, 0.50970626, -0.86032903), (-0.0020526843, 0.8153024, -0.57903194), (-0.028720193, 0.99628806, -0.08115047), (-0.044641085, 0.8961459, 0.44150844), (-0.025324583, 0.5949191, 0.8033865), (-0.008022356, 0.26805556, 0.9633701), (0.062187504, -0.0013517477, 0.9980636), (-0.17383936, 0.5149746, -0.83939326), (-0.1403852, 0.7035043, -0.69668764), (-0.095217854, 0.88880587, -0.4482832), (-0.031950545, 0.99921894, -0.023253102), (0.0455669, 0.8541047, 0.51810104), (0.1429635, 0.41211346, 0.89984655), (0.18555734, -0.032592878, 0.9820928), (0.2519652, -0.29741138, 0.9209017), (-0.33033612, 0.7067791, -0.62557274), (-0.2598707, 0.820079, -0.5098407), (-0.1671134, 0.9303778, -0.32629755), (-0.016583055, 0.9997943, 0.011676684), (0.19697759, 0.8073575, 0.5562137), (0.3988103, 0.18648459, 0.89787185), (0.41405162, -0.33283484, 0.8472203), (0.4446163, -0.5452047, 0.7106814), (-0.4557966, 0.8243289, -0.33575475), (-0.35844645, 0.8921834, -0.27481773), (-0.23092192, 0.9561536, -0.180126), (-0.0019832999, 0.99995995, 0.008726127), (0.45810995, 0.7699157, 0.44425797), (0.7646139, -0.08715944, 0.6385677), (0.63384664, -0.59204, 0.49772188), (0.595379, -0.712655, 0.37100783), (8.9226926e-10, 1, 1.6730048e-10), (0.19274756, 0.9812483, -0.0000016834352), (0.6968385, 0.7172281, -6.7318234e-7), (0.9979445, -0.06408474, 2.7392838e-7), (0.8154188, -0.57887155, 7.5312283e-7), (0.75488806, -0.65585375, 3.564917e-9), (0.85006696, -0.5266746, -9.718267e-7), (0.9989515, 0.045780413, 2.414329e-7), (0.68058974, 0.7326647, 0.0000014459107), (0.18900704, 0.9812658, 0.037335742), (0.68351567, 0.7172796, 0.13533752), (0.978871, -0.064130254, 0.19416222), (0.7995835, -0.57928103, 0.15842843), (0.7400767, -0.6563213, 0.14672744), (0.8334586, -0.5272186, 0.16549161), (0.97978836, 0.045689985, 0.1947489), (0.66711146, 0.7330045, 0.13291575), (0.1777067, 0.98133653, 0.07347742), (0.64338714, 0.7177037, 0.26637277), (0.9218981, -0.06427045, 0.38206443), (0.75254124, -0.580108, 0.31169942), (0.6963348, -0.6571592, 0.28854758), (0.78436404, -0.5281168, 0.32536998), (0.9226139, 0.045425184, 0.38304052), (0.6277716, 0.7333317, 0.26101255), (0.15963224, 0.9813987, 0.10664874), (0.57857823, 0.71809053, 0.38677293), (0.82950866, -0.06439326, 0.5547693), (0.6767265, -0.5807776, 0.45248032), (0.62606466, -0.65782344, 0.41870195), (0.705381, -0.5288227, 0.4720003), (0.8301346, 0.045176696, 0.55572987), (0.5646658, 0.7335267, 0.37827384), (0.13566503, 0.98142236, 0.13566507), (0.4920022, 0.7182394, 0.492002), (0.70563716, -0.064440615, 0.705637), (0.575504, -0.5810252, 0.575504), (0.53242296, -0.6580666, 0.532423), (0.6000313, -0.5290804, 0.6000304), (0.7063888, 0.045073573, 0.70638746), (0.48054788, 0.7335859, 0.48054704), (0.10664865, 0.9813987, 0.15963234), (0.38677278, 0.7180911, 0.5785776), (0.5547694, -0.06439305, 0.82950866), (0.45248005, -0.5807777, 0.6767267), (0.41870204, -0.65782326, 0.6260648), (0.4720006, -0.5288225, 0.7053809), (0.5557306, 0.045177177, 0.83013403), (0.37827453, 0.73352635, 0.5646657), (0.07347565, 0.9813366, 0.17770709), (0.26637137, 0.71770483, 0.6433864), (0.38206425, -0.064267844, 0.92189825), (0.31169993, -0.580108, 0.75254095), (0.2885474, -0.65715927, 0.6963348), (0.32536823, -0.5281168, 0.78436476), (0.38303974, 0.045423154, 0.92261446), (0.26101393, 0.7333311, 0.62777174), (0.037335936, 0.98126566, 0.18900713), (0.13533743, 0.71728015, 0.68351513), (0.19416253, -0.06413121, 0.9788708), (0.15842864, -0.5792816, 0.7995832), (0.14672746, -0.65632164, 0.74007636), (0.16549161, -0.5272191, 0.8334582), (0.1947485, 0.045688678, 0.97978854), (0.13291556, 0.733004, 0.66711223), (0.0000016828366, 0.9812484, 0.19274776), (6.731825e-7, 0.71722794, 0.6968386), (-2.6307993e-7, -0.064084455, 0.9979445), (-7.5071677e-7, -0.57887155, 0.8154188), (2.6142725e-8, -0.65585375, 0.75488806), (0.0000010482356, -0.5266747, 0.85006684), (-1.386955e-7, 0.045780577, 0.9989515), (-0.0000013446597, 0.7326647, 0.6805897), (-0.03733598, 0.98126566, 0.18900697), (-0.13533746, 0.71728015, 0.6835152), (-0.1941625, -0.06412988, 0.9788709), (-0.1584287, -0.57928103, 0.7995835), (-0.14672759, -0.6563211, 0.74007684), (-0.16549174, -0.5272185, 0.8334586), (-0.19474849, 0.045690544, 0.9797884), (-0.13291535, 0.73300475, 0.66711134), (-0.07347738, 0.98133653, 0.17770675), (-0.26637203, 0.7177047, 0.64338624), (-0.38206396, -0.06426812, 0.9218985), (-0.31169918, -0.5801079, 0.7525413), (-0.28854746, -0.657159, 0.696335), (-0.32536927, -0.5281168, 0.78436434), (-0.3830396, 0.04542219, 0.9226145), (-0.26101264, 0.73333097, 0.62777233), (-0.10664866, 0.98139876, 0.15963235), (-0.38677278, 0.7180911, 0.5785776), (-0.5547694, -0.06439305, 0.8295086), (-0.4524801, -0.58077776, 0.67672664), (-0.4187021, -0.6578234, 0.6260648), (-0.47200066, -0.5288225, 0.7053809), (-0.5557307, 0.045177188, 0.83013403), (-0.37827453, 0.7335264, 0.5646657), (-0.13566503, 0.98142236, 0.13566506), (-0.49200222, 0.7182394, 0.49200192), (-0.7056372, -0.06444061, 0.7056369), (-0.5755041, -0.58102524, 0.575504), (-0.53242296, -0.6580667, 0.5324229), (-0.6000314, -0.5290804, 0.6000303), (-0.70638895, 0.04507358, 0.7063872), (-0.48054796, 0.73358595, 0.48054692), (-0.15963222, 0.9813987, 0.10664874), (-0.5785782, 0.71809053, 0.38677293), (-0.82950866, -0.06439322, 0.5547692), (-0.67672664, -0.5807776, 0.45248032), (-0.6260647, -0.65782344, 0.4187019), (-0.7053809, -0.5288227, 0.4720002), (-0.8301346, 0.045176707, 0.55572987), (-0.56466573, 0.73352677, 0.37827387), (-0.17770708, 0.9813366, 0.073475674), (-0.6433873, 0.71770376, 0.2663721), (-0.921898, -0.06427016, 0.38206473), (-0.7525408, -0.58010805, 0.31170008), (-0.6963345, -0.6571595, 0.2885475), (-0.78436446, -0.5281169, 0.32536918), (-0.9226137, 0.04542617, 0.38304093), (-0.62777084, 0.73333174, 0.261014), (-0.18900721, 0.98126566, 0.037335698), (-0.68351567, 0.7172796, 0.13533749), (-0.97887087, -0.06413154, 0.19416219), (-0.7995832, -0.57928157, 0.1584284), (-0.74007624, -0.6563218, 0.14672734), (-0.83345807, -0.5272193, 0.16549148), (-0.9797884, 0.04568807, 0.19474892), (-0.66711223, 0.73300385, 0.13291596), (-0.19274756, 0.9812483, 0.0000016834352), (-0.6968385, 0.7172281, 6.70511e-7), (-0.9979445, -0.06408474, -2.7121624e-7), (-0.8154188, -0.5788715, -7.531228e-7), (-0.75488806, -0.65585375, -3.564917e-9), (-0.85006696, -0.5266746, 9.694389e-7), (-0.9989515, 0.045780413, -2.414329e-7), (-0.6805898, 0.73266464, -0.0000014459106), (-0.18900704, 0.9812658, -0.037335742), (-0.68351567, 0.7172796, -0.13533752), (-0.978871, -0.064130254, -0.19416222), (-0.7995835, -0.57928103, -0.15842843), (-0.7400767, -0.6563213, -0.14672744), (-0.8334586, -0.5272186, -0.16549161), (-0.97978836, 0.045689985, -0.1947489), (-0.66711146, 0.7330045, -0.13291575), (-0.1777067, 0.98133653, -0.07347742), (-0.64338714, 0.7177037, -0.26637277), (-0.9218981, -0.06427045, -0.38206443), (-0.75254124, -0.580108, -0.31169942), (-0.6963348, -0.6571592, -0.28854758), (-0.78436404, -0.5281168, -0.32536998), (-0.9226139, 0.045425184, -0.38304052), (-0.6277716, 0.7333317, -0.26101255), (-0.15963224, 0.9813987, -0.10664874), (-0.57857823, 0.71809053, -0.38677293), (-0.82950866, -0.06439326, -0.5547693), (-0.6767265, -0.5807776, -0.45248032), (-0.62606466, -0.65782344, -0.41870195), (-0.705381, -0.5288227, -0.4720003), (-0.8301346, 0.045176696, -0.55572987), (-0.5646658, 0.7335267, -0.37827384), (-0.13566503, 0.98142236, -0.13566507), (-0.4920022, 0.7182394, -0.492002), (-0.70563716, -0.064440615, -0.705637), (-0.575504, -0.5810252, -0.575504), (-0.53242296, -0.6580666, -0.532423), (-0.6000313, -0.5290804, -0.6000304), (-0.7063888, 0.045073573, -0.70638746), (-0.48054788, 0.7335859, -0.48054704), (-0.10664865, 0.9813987, -0.15963234), (-0.38677257, 0.7180909, -0.578578), (-0.55476946, -0.064392865, -0.8295085), (-0.45248035, -0.58077806, -0.6767263), (-0.41870204, -0.65782326, -0.6260648), (-0.47200122, -0.5288222, -0.70538074), (-0.5557305, 0.045175914, -0.8301342), (-0.37827376, 0.7335267, -0.56466585), (-0.07347565, 0.9813366, -0.17770709), (-0.26637158, 0.7177042, -0.6433869), (-0.3820642, -0.064271234, -0.9218981), (-0.31169972, -0.58010864, -0.7525404), (-0.2885474, -0.65715927, -0.6963348), (-0.3253684, -0.5281164, -0.78436506), (-0.38303965, 0.04542857, -0.9226142), (-0.26101372, 0.73333144, -0.62777126), (-0.037335936, 0.98126566, -0.18900713), (-0.13533783, 0.71728, -0.6835153), (-0.1941624, -0.06413106, -0.9788709), (-0.15842813, -0.5792819, -0.799583), (-0.14672746, -0.65632164, -0.74007636), (-0.16549103, -0.5272189, -0.8334584), (-0.19474864, 0.045687478, -0.97978854), (-0.13291623, 0.7330042, -0.6671117), (-0.0000016828366, 0.9812484, -0.19274776), (-6.731825e-7, 0.71722794, -0.6968386), (2.6307993e-7, -0.064084455, -0.9979445), (7.5071677e-7, -0.57887155, -0.8154188), (-2.6142725e-8, -0.65585375, -0.75488806), (-0.0000010482356, -0.5266747, -0.85006684), (1.386955e-7, 0.045780577, -0.9989515), (0.0000013446597, 0.7326647, -0.6805897), (0.03733598, 0.98126566, -0.18900697), (0.13533787, 0.71727985, -0.68351537), (0.19416241, -0.064129725, -0.9788709), (0.15842819, -0.5792813, -0.79958344), (0.14672759, -0.6563211, -0.74007684), (0.16549118, -0.5272182, -0.8334589), (0.19474863, 0.045689315, -0.9797884), (0.132916, 0.733005, -0.6671109), (0.07347738, 0.98133653, -0.17770675), (0.2663722, 0.7177042, -0.6433867), (0.38206393, -0.0642715, -0.9218983), (0.31169903, -0.5801087, -0.7525408), (0.28854746, -0.657159, -0.696335), (0.3253694, -0.5281164, -0.78436464), (0.3830395, 0.045427576, -0.92261434), (0.26101243, 0.7333314, -0.6277719), (0.10664866, 0.98139876, -0.15963235), (0.3867726, 0.71809083, -0.578578), (0.5547695, -0.064392865, -0.82950854), (0.45248038, -0.580778, -0.6767263), (0.4187021, -0.6578234, -0.6260648), (0.47200122, -0.5288222, -0.7053807), (0.5557306, 0.045175903, -0.8301342), (0.3782737, 0.7335268, -0.5646658), (0.13566503, 0.98142236, -0.13566506), (0.49200222, 0.7182394, -0.49200192), (0.7056372, -0.06444061, -0.7056369), (0.5755041, -0.58102524, -0.575504), (0.53242296, -0.6580667, -0.5324229), (0.6000314, -0.5290804, -0.6000303), (0.70638895, 0.04507358, -0.7063872), (0.48054796, 0.73358595, -0.48054692), (0.15963222, 0.9813987, -0.10664874), (0.5785782, 0.71809053, -0.38677293), (0.82950866, -0.06439322, -0.5547692), (0.67672664, -0.5807776, -0.45248032), (0.6260647, -0.65782344, -0.4187019), (0.7053809, -0.5288227, -0.4720002), (0.8301346, 0.045176707, -0.55572987), (0.56466573, 0.73352677, -0.37827387), (0.17770708, 0.9813366, -0.073475674), (0.6433873, 0.71770376, -0.2663721), (0.921898, -0.06427016, -0.38206473), (0.7525408, -0.58010805, -0.31170008), (0.6963345, -0.6571595, -0.2885475), (0.78436446, -0.5281169, -0.32536918), (0.9226137, 0.04542617, -0.38304093), (0.62777084, 0.73333174, -0.261014), (0.18900721, 0.98126566, -0.037335698), (0.68351567, 0.7172796, -0.13533749), (0.97887087, -0.06413154, -0.19416219), (0.7995832, -0.57928157, -0.1584284), (0.74007624, -0.6563218, -0.14672734), (0.83345807, -0.5272193, -0.16549148), (0.9797884, 0.04568807, -0.19474892), (0.66711223, 0.73300385, -0.13291596), (0.33647203, 0.9416935, 5.5666607e-7), (0.2115325, 0.9773709, 4.4486672e-8), (0.16253793, 0.9867023, 1.0080086e-8), (0.15419593, 0.98804027, -1.8145579e-7), (0.18447568, 0.98283714, -4.384953e-7), (0.28459966, 0.95864654, -4.836031e-7), (0.6016766, 0.7987398, -3.6386794e-7), (0.78685325, 0.61714023, -2.8694413e-7), (0.32965332, 0.94181097, 0.06573245), (0.20724328, 0.9774166, 0.04131659), (0.15925072, 0.98672783, 0.031741086), (0.15108939, 0.98806155, 0.030106066), (0.18077661, 0.9828647, 0.036011472), (0.27893066, 0.9587031, 0.055551816), (0.58989877, 0.798878, 0.11753036), (0.7713502, 0.6174936, 0.15401436), (0.30995998, 0.94196606, 0.12893672), (0.1948347, 0.97748244, 0.08103961), (0.14970824, 0.98676795, 0.0622618), (0.14203265, 0.98809844, 0.059061352), (0.16993946, 0.98291826, 0.07065565), (0.26222664, 0.95882916, 0.10901231), (0.5548774, 0.79929954, 0.23071925), (0.7257349, 0.6180932, 0.30210885), (0.27863663, 0.9420741, 0.1867027), (0.17512202, 0.9775296, 0.117337205), (0.13455157, 0.9867974, 0.0901498), (0.12764585, 0.98812616, 0.08551827), (0.1527194, 0.9829595, 0.10231005), (0.23565777, 0.9589288, 0.15786345), (0.4988652, 0.7996477, 0.33421078), (0.65269715, 0.618541, 0.4374855), (0.23709348, 0.9421111, 0.23709334), (0.14900297, 0.977546, 0.14900297), (0.11447898, 0.9868075, 0.114479), (0.108599044, 0.9881359, 0.10859852), (0.12992647, 0.98297423, 0.12992588), (0.20048228, 0.95896494, 0.20048234), (0.4244744, 0.7997768, 0.42447463), (0.5555229, 0.6186991, 0.555523), (0.18670268, 0.9420741, 0.27863652), (0.117337205, 0.9775296, 0.17512205), (0.090149686, 0.9867973, 0.13455185), (0.08551753, 0.9881262, 0.12764537), (0.102310106, 0.98295945, 0.1527197), (0.15786377, 0.95892864, 0.23565823), (0.33421066, 0.799648, 0.49886495), (0.4374855, 0.6185409, 0.6526972), (0.12893729, 0.9419661, 0.30995998), (0.08103962, 0.97748256, 0.19483477), (0.062262107, 0.98676795, 0.14970835), (0.05906102, 0.98809844, 0.14203288), (0.07065488, 0.98291826, 0.16993988), (0.10901207, 0.95882916, 0.26222697), (0.23071913, 0.79929954, 0.5548774), (0.30210862, 0.6180931, 0.725735), (0.06573251, 0.94181085, 0.3296537), (0.04131657, 0.97741663, 0.20724331), (0.03174123, 0.9867278, 0.15925042), (0.030106543, 0.9880615, 0.15108994), (0.036011595, 0.9828646, 0.18077661), (0.055551767, 0.9587031, 0.2789306), (0.1175304, 0.79887766, 0.5898992), (0.1540144, 0.6174937, 0.7713502), (-4.710251e-7, 0.94169337, 0.33647215), (8.897335e-10, 0.9773709, 0.21153255), (1.1858925e-9, 0.9867023, 0.16253765), (3.6528357e-7, 0.98804027, 0.15419619), (5.619148e-7, 0.982837, 0.18447575), (2.1261862e-7, 0.95864636, 0.28459984), (8.972085e-8, 0.79873973, 0.6016767), (1.855242e-7, 0.61714077, 0.7868528), (-0.06573242, 0.9418109, 0.32965338), (-0.04131657, 0.97741663, 0.20724331), (-0.031741224, 0.9867278, 0.15925042), (-0.030106403, 0.98806155, 0.15108922), (-0.036011633, 0.9828647, 0.18077669), (-0.05555191, 0.958703, 0.27893126), (-0.1175303, 0.7988781, 0.58989877), (-0.15401426, 0.6174946, 0.7713495), (-0.12893674, 0.94196606, 0.30995992), (-0.08103961, 0.97748244, 0.19483474), (-0.062262096, 0.9867679, 0.14970835), (-0.059061237, 0.9880985, 0.14203244), (-0.07065547, 0.9829183, 0.16993985), (-0.10901238, 0.958829, 0.26222724), (-0.23071909, 0.7992998, 0.55487716), (-0.3021086, 0.61809355, 0.72573465), (-0.18670268, 0.9420741, 0.27863654), (-0.117337205, 0.9775296, 0.17512205), (-0.09014968, 0.9867973, 0.13455185), (-0.08551754, 0.98812634, 0.12764537), (-0.10231011, 0.98295945, 0.1527197), (-0.15786377, 0.95892864, 0.23565821), (-0.33421066, 0.799648, 0.49886495), (-0.4374855, 0.61854094, 0.65269727), (-0.23709352, 0.94211113, 0.23709331), (-0.14900301, 0.977546, 0.14900295), (-0.114479005, 0.9868075, 0.114478976), (-0.10859883, 0.9881359, 0.10859853), (-0.12992634, 0.98297423, 0.12992612), (-0.20048232, 0.9589648, 0.20048249), (-0.4244744, 0.7997768, 0.4244745), (-0.555523, 0.618699, 0.5555229), (-0.27863666, 0.9420741, 0.18670274), (-0.17512205, 0.9775296, 0.11733723), (-0.13455158, 0.9867973, 0.09014981), (-0.12764554, 0.98812616, 0.08551806), (-0.1527194, 0.9829595, 0.10231005), (-0.23565802, 0.95892876, 0.15786362), (-0.4988652, 0.7996477, 0.3342108), (-0.65269715, 0.618541, 0.4374855), (-0.30995995, 0.941966, 0.12893742), (-0.19483466, 0.97748244, 0.081039704), (-0.14970823, 0.9867679, 0.06226183), (-0.1420328, 0.98809844, 0.059061017), (-0.16993994, 0.9829183, 0.07065503), (-0.262227, 0.95882916, 0.10901179), (-0.5548775, 0.7992996, 0.23071888), (-0.725735, 0.6180932, 0.30210856), (-0.32965356, 0.94181085, 0.06573253), (-0.20724328, 0.97741663, 0.04131659), (-0.15925072, 0.98672783, 0.031741086), (-0.15108976, 0.9880615, 0.030106138), (-0.180777, 0.9828647, 0.036011536), (-0.2789308, 0.9587031, 0.05555181), (-0.5898989, 0.79887795, 0.117530376), (-0.7713502, 0.61749357, 0.15401433), (-0.33647203, 0.9416935, -5.560713e-7), (-0.2115325, 0.9773709, -4.5672984e-8), (-0.16253795, 0.9867023, -1.0080086e-8), (-0.15419593, 0.98804027, 1.8145579e-7), (-0.18447568, 0.98283714, 4.384953e-7), (-0.2845997, 0.9586465, 4.836032e-7), (-0.6016766, 0.7987398, 3.613757e-7), (-0.78685325, 0.61714023, 2.8694413e-7), (-0.32965332, 0.94181097, -0.06573245), (-0.20724328, 0.9774166, -0.04131659), (-0.15925072, 0.98672783, -0.031741086), (-0.15108939, 0.98806155, -0.030106066), (-0.18077661, 0.9828647, -0.036011472), (-0.27893066, 0.9587031, -0.055551816), (-0.5898987, 0.7988781, -0.117530346), (-0.77135015, 0.6174937, -0.1540143), (-0.30995998, 0.94196606, -0.12893672), (-0.1948347, 0.97748244, -0.08103961), (-0.14970824, 0.98676795, -0.0622618), (-0.14203258, 0.98809844, -0.05906112), (-0.16993965, 0.98291826, -0.07065542), (-0.26222685, 0.95882916, -0.10901228), (-0.5548773, 0.7992997, -0.23071918), (-0.72573453, 0.6180934, -0.30210885), (-0.2786364, 0.94207406, -0.1867036), (-0.1751212, 0.9775297, -0.11733827), (-0.134551, 0.9867974, -0.090150006), (-0.12764557, 0.98812616, -0.08551806), (-0.15271942, 0.9829595, -0.10231004), (-0.23565805, 0.95892876, -0.15786363), (-0.49886516, 0.79964775, -0.3342109), (-0.65269697, 0.6185411, -0.43748552), (-0.23709412, 0.9421108, -0.23709397), (-0.14900313, 0.97754604, -0.14900313), (-0.114478625, 0.9868077, -0.11447865), (-0.108598776, 0.9881359, -0.108598776), (-0.12992606, 0.9829743, -0.12992603), (-0.20048244, 0.95896494, -0.20048249), (-0.4244746, 0.7997766, -0.42447463), (-0.5555229, 0.6186991, -0.555523), (-0.18670358, 0.942074, -0.27863628), (-0.11733826, 0.9775297, -0.17512126), (-0.090149954, 0.98679733, -0.13455106), (-0.085518, 0.9881262, -0.12764552), (-0.10231006, 0.9829595, -0.15271944), (-0.15786366, 0.9589287, -0.23565808), (-0.33421087, 0.79964787, -0.4988652), (-0.43748543, 0.6185412, -0.65269697), (-0.12893729, 0.9419661, -0.30995998), (-0.08103962, 0.97748244, -0.19483477), (-0.06226183, 0.98676795, -0.14970826), (-0.05906101, 0.98809844, -0.14203277), (-0.070655026, 0.9829182, -0.16993995), (-0.10901188, 0.95882916, -0.26222706), (-0.23071897, 0.79929966, -0.5548772), (-0.3021086, 0.61809343, -0.72573483), (-0.06573251, 0.94181085, -0.3296537), (-0.041316595, 0.97741663, -0.20724331), (-0.03174109, 0.9867278, -0.15925066), (-0.030106157, 0.9880614, -0.15108973), (-0.036011536, 0.9828647, -0.18077695), (-0.05555184, 0.9587031, -0.2789308), (-0.117530435, 0.7988778, -0.5898991), (-0.15401453, 0.61749345, -0.7713504), (4.710251e-7, 0.94169337, -0.33647215), (-8.897335e-10, 0.9773709, -0.21153255), (-2.9647312e-10, 0.9867023, -0.16253792), (-2.1169842e-7, 0.9880403, -0.15419592), (-4.580763e-7, 0.98283714, -0.18447569), (-3.8414285e-7, 0.9586464, -0.28459966), (-2.0187194e-7, 0.7987398, -0.60167664), (-1.6078765e-7, 0.61714035, -0.7868532), (0.06573242, 0.9418109, -0.32965338), (0.04131659, 0.9774165, -0.20724331), (0.03174109, 0.9867278, -0.15925066), (0.030106083, 0.98806155, -0.15108933), (0.03601149, 0.9828647, -0.18077666), (0.05555186, 0.9587031, -0.2789308), (0.117530294, 0.79887825, -0.5898982), (0.15401432, 0.6174946, -0.7713495), (0.12893674, 0.94196606, -0.30995992), (0.08103962, 0.97748244, -0.19483477), (0.06226183, 0.9867679, -0.14970826), (0.05906113, 0.9880985, -0.1420325), (0.07065543, 0.98291826, -0.16993973), (0.10901229, 0.95882905, -0.262227), (0.23071909, 0.7992998, -0.55487704), (0.3021085, 0.6180939, -0.7257344), (0.18670356, 0.942074, -0.27863628), (0.11733827, 0.9775297, -0.17512126), (0.09014996, 0.98679733, -0.13455105), (0.08551802, 0.9881262, -0.12764554), (0.10231007, 0.9829595, -0.15271945), (0.15786366, 0.9589287, -0.23565808), (0.33421087, 0.79964775, -0.49886525), (0.43748543, 0.6185411, -0.65269697), (0.23709412, 0.94211084, -0.23709391), (0.14900315, 0.9775459, -0.14900309), (0.11447865, 0.9868077, -0.11447863), (0.1085988, 0.9881359, -0.10859876), (0.12992609, 0.98297435, -0.12992604), (0.20048247, 0.9589648, -0.20048249), (0.42447466, 0.7997766, -0.42447466), (0.55552304, 0.618699, -0.5555229), (0.2786364, 0.94207394, -0.18670362), (0.17512122, 0.9775296, -0.117338285), (0.13455102, 0.9867974, -0.090150006), (0.12764555, 0.98812616, -0.08551805), (0.15271942, 0.9829595, -0.10231004), (0.23565806, 0.95892876, -0.15786365), (0.49886516, 0.79964775, -0.33421093), (0.65269697, 0.6185411, -0.43748552), (0.30995995, 0.941966, -0.12893742), (0.19483466, 0.97748244, -0.081039704), (0.14970823, 0.9867679, -0.06226183), (0.1420328, 0.98809844, -0.059061017), (0.16993994, 0.9829183, -0.07065503), (0.262227, 0.95882916, -0.10901179), (0.5548774, 0.7992996, -0.23071878), (0.7257347, 0.61809343, -0.3021086), (0.32965356, 0.94181085, -0.06573253), (0.20724328, 0.97741663, -0.04131659), (0.15925072, 0.98672783, -0.031741086), (0.15108976, 0.9880615, -0.030106138), (0.180777, 0.9828647, -0.036011536), (0.2789308, 0.9587031, -0.05555181), (0.5898988, 0.79887795, -0.11753034), (0.7713502, 0.61749375, -0.1540143)] ( + interpolation = "vertex" + ) + texCoord2f[] primvars:st = [(2, 2), (2, 1.9875), (2, 1.9749999), (2, 1.9624999), (2, 1.9499998), (2, 1.9374998), (2, 1.9249997), (2, 1.9124997), (2, 1.8999996), (1.875, 2), (1.875, 1.9875), (1.875, 1.9749999), (1.875, 1.9624999), (1.875, 1.9499998), (1.875, 1.9374998), (1.875, 1.9249997), (1.875, 1.9124997), (1.875, 1.8999996), (1.75, 2), (1.75, 1.9875), (1.75, 1.9749999), (1.75, 1.9624999), (1.75, 1.9499998), (1.75, 1.9374998), (1.75, 1.9249997), (1.75, 1.9124997), (1.75, 1.8999996), (1.625, 2), (1.625, 1.9875), (1.625, 1.9749999), (1.625, 1.9624999), (1.625, 1.9499998), (1.625, 1.9374998), (1.625, 1.9249997), (1.625, 1.9124997), (1.625, 1.8999996), (1.5, 2), (1.5, 1.9875), (1.5, 1.9749999), (1.5, 1.9624999), (1.5, 1.9499998), (1.5, 1.9374998), (1.5, 1.9249997), (1.5, 1.9124997), (1.5, 1.8999996), (1.375, 2), (1.375, 1.9875), (1.375, 1.9749999), (1.375, 1.9624999), (1.375, 1.9499998), (1.375, 1.9374998), (1.375, 1.9249997), (1.375, 1.9124997), (1.375, 1.8999996), (1.25, 2), (1.25, 1.9875), (1.25, 1.9749999), (1.25, 1.9624999), (1.25, 1.9499998), (1.25, 1.9374998), (1.25, 1.9249997), (1.25, 1.9124997), (1.25, 1.8999996), (1.125, 2), (1.125, 1.9875), (1.125, 1.9749999), (1.125, 1.9624999), (1.125, 1.9499998), (1.125, 1.9374998), (1.125, 1.9249997), (1.125, 1.9124997), (1.125, 1.8999996), (1, 2), (1, 1.9875), (1, 1.9749999), (1, 1.9624999), (1, 1.9499998), (1, 1.9374998), (1, 1.9249997), (1, 1.9124997), (1, 1.8999996), (1, 2), (1, 1.9875), (1, 1.9749999), (1, 1.9624999), (1, 1.9499998), (1, 1.9374998), (1, 1.9249997), (1, 1.9124997), (1, 1.8999996), (0.875, 2), (0.875, 1.9875), (0.875, 1.9749999), (0.875, 1.9624999), (0.875, 1.9499998), (0.875, 1.9374998), (0.875, 1.9249997), (0.875, 1.9124997), (0.875, 1.8999996), (0.75, 2), (0.75, 1.9875), (0.75, 1.9749999), (0.75, 1.9624999), (0.75, 1.9499998), (0.75, 1.9374998), (0.75, 1.9249997), (0.75, 1.9124997), (0.75, 1.8999996), (0.625, 2), (0.625, 1.9875), (0.625, 1.9749999), (0.625, 1.9624999), (0.625, 1.9499998), (0.625, 1.9374998), (0.625, 1.9249997), (0.625, 1.9124997), (0.625, 1.8999996), (0.5, 2), (0.5, 1.9875), (0.5, 1.9749999), (0.5, 1.9624999), (0.5, 1.9499998), (0.5, 1.9374998), (0.5, 1.9249997), (0.5, 1.9124997), (0.5, 1.8999996), (0.375, 2), (0.375, 1.9875), (0.375, 1.9749999), (0.375, 1.9624999), (0.375, 1.9499998), (0.375, 1.9374998), (0.375, 1.9249997), (0.375, 1.9124997), (0.375, 1.8999996), (0.25, 2), (0.25, 1.9875), (0.25, 1.9749999), (0.25, 1.9624999), (0.25, 1.9499998), (0.25, 1.9374998), (0.25, 1.9249997), (0.25, 1.9124997), (0.25, 1.8999996), (0.125, 2), (0.125, 1.9875), (0.125, 1.9749999), (0.125, 1.9624999), (0.125, 1.9499998), (0.125, 1.9374998), (0.125, 1.9249997), (0.125, 1.9124997), (0.125, 1.8999996), (0, 2), (0, 1.9875), (0, 1.9749999), (0, 1.9624999), (0, 1.9499998), (0, 1.9374998), (0, 1.9249997), (0, 1.9124997), (0, 1.8999996), (2, 2), (2, 1.9875), (2, 1.9749999), (2, 1.9624999), (2, 1.9499998), (2, 1.9374998), (2, 1.9249997), (2, 1.9124997), (2, 1.8999996), (1.875, 2), (1.875, 1.9875), (1.875, 1.9749999), (1.875, 1.9624999), (1.875, 1.9499998), (1.875, 1.9374998), (1.875, 1.9249997), (1.875, 1.9124997), (1.875, 1.8999996), (1.75, 2), (1.75, 1.9875), (1.75, 1.9749999), (1.75, 1.9624999), (1.75, 1.9499998), (1.75, 1.9374998), (1.75, 1.9249997), (1.75, 1.9124997), (1.75, 1.8999996), (1.625, 2), (1.625, 1.9875), (1.625, 1.9749999), (1.625, 1.9624999), (1.625, 1.9499998), (1.625, 1.9374998), (1.625, 1.9249997), (1.625, 1.9124997), (1.625, 1.8999996), (1.5, 2), (1.5, 1.9875), (1.5, 1.9749999), (1.5, 1.9624999), (1.5, 1.9499998), (1.5, 1.9374998), (1.5, 1.9249997), (1.5, 1.9124997), (1.5, 1.8999996), (1.375, 2), (1.375, 1.9875), (1.375, 1.9749999), (1.375, 1.9624999), (1.375, 1.9499998), (1.375, 1.9374998), (1.375, 1.9249997), (1.375, 1.9124997), (1.375, 1.8999996), (1.25, 2), (1.25, 1.9875), (1.25, 1.9749999), (1.25, 1.9624999), (1.25, 1.9499998), (1.25, 1.9374998), (1.25, 1.9249997), (1.25, 1.9124997), (1.25, 1.8999996), (1.125, 2), (1.125, 1.9875), (1.125, 1.9749999), (1.125, 1.9624999), (1.125, 1.9499998), (1.125, 1.9374998), (1.125, 1.9249997), (1.125, 1.9124997), (1.125, 1.8999996), (1, 2), (1, 1.9875), (1, 1.9749999), (1, 1.9624999), (1, 1.9499998), (1, 1.9374998), (1, 1.9249997), (1, 1.9124997), (1, 1.8999996), (1, 2), (1, 1.9875), (1, 1.9749999), (1, 1.9624999), (1, 1.9499998), (1, 1.9374998), (1, 1.9249997), (1, 1.9124997), (1, 1.8999996), (0.875, 2), (0.875, 1.9875), (0.875, 1.9749999), (0.875, 1.9624999), (0.875, 1.9499998), (0.875, 1.9374998), (0.875, 1.9249997), (0.875, 1.9124997), (0.875, 1.8999996), (0.75, 2), (0.75, 1.9875), (0.75, 1.9749999), (0.75, 1.9624999), (0.75, 1.9499998), (0.75, 1.9374998), (0.75, 1.9249997), (0.75, 1.9124997), (0.75, 1.8999996), (0.625, 2), (0.625, 1.9875), (0.625, 1.9749999), (0.625, 1.9624999), (0.625, 1.9499998), (0.625, 1.9374998), (0.625, 1.9249997), (0.625, 1.9124997), (0.625, 1.8999996), (0.5, 2), (0.5, 1.9875), (0.5, 1.9749999), (0.5, 1.9624999), (0.5, 1.9499998), (0.5, 1.9374998), (0.5, 1.9249997), (0.5, 1.9124997), (0.5, 1.8999996), (0.375, 2), (0.375, 1.9875), (0.375, 1.9749999), (0.375, 1.9624999), (0.375, 1.9499998), (0.375, 1.9374998), (0.375, 1.9249997), (0.375, 1.9124997), (0.375, 1.8999996), (0.25, 2), (0.25, 1.9875), (0.25, 1.9749999), (0.25, 1.9624999), (0.25, 1.9499998), (0.25, 1.9374998), (0.25, 1.9249997), (0.25, 1.9124997), (0.25, 1.8999996), (0.125, 2), (0.125, 1.9875), (0.125, 1.9749999), (0.125, 1.9624999), (0.125, 1.9499998), (0.125, 1.9374998), (0.125, 1.9249997), (0.125, 1.9124997), (0.125, 1.8999996), (0, 2), (0, 1.9875), (0, 1.9749999), (0, 1.9624999), (0, 1.9499998), (0, 1.9374998), (0, 1.9249997), (0, 1.9124997), (0, 1.8999996), (2, 1.9), (2, 1.7875), (2, 1.6750001), (2, 1.5625001), (2, 1.4500002), (2, 1.3375002), (2, 1.2250003), (2, 1.1125003), (2, 1.0000004), (1.875, 1.9), (1.875, 1.7875), (1.875, 1.6750001), (1.875, 1.5625001), (1.875, 1.4500002), (1.875, 1.3375002), (1.875, 1.2250003), (1.875, 1.1125003), (1.875, 1.0000004), (1.75, 1.9), (1.75, 1.7875), (1.75, 1.6750001), (1.75, 1.5625001), (1.75, 1.4500002), (1.75, 1.3375002), (1.75, 1.2250003), (1.75, 1.1125003), (1.75, 1.0000004), (1.625, 1.9), (1.625, 1.7875), (1.625, 1.6750001), (1.625, 1.5625001), (1.625, 1.4500002), (1.625, 1.3375002), (1.625, 1.2250003), (1.625, 1.1125003), (1.625, 1.0000004), (1.5, 1.9), (1.5, 1.7875), (1.5, 1.6750001), (1.5, 1.5625001), (1.5, 1.4500002), (1.5, 1.3375002), (1.5, 1.2250003), (1.5, 1.1125003), (1.5, 1.0000004), (1.375, 1.9), (1.375, 1.7875), (1.375, 1.6750001), (1.375, 1.5625001), (1.375, 1.4500002), (1.375, 1.3375002), (1.375, 1.2250003), (1.375, 1.1125003), (1.375, 1.0000004), (1.25, 1.9), (1.25, 1.7875), (1.25, 1.6750001), (1.25, 1.5625001), (1.25, 1.4500002), (1.25, 1.3375002), (1.25, 1.2250003), (1.25, 1.1125003), (1.25, 1.0000004), (1.125, 1.9), (1.125, 1.7875), (1.125, 1.6750001), (1.125, 1.5625001), (1.125, 1.4500002), (1.125, 1.3375002), (1.125, 1.2250003), (1.125, 1.1125003), (1.125, 1.0000004), (1, 1.9), (1, 1.7875), (1, 1.6750001), (1, 1.5625001), (1, 1.4500002), (1, 1.3375002), (1, 1.2250003), (1, 1.1125003), (1, 1.0000004), (1, 1.9), (1, 1.7875), (1, 1.6750001), (1, 1.5625001), (1, 1.4500002), (1, 1.3375002), (1, 1.2250003), (1, 1.1125003), (1, 1.0000004), (0.875, 1.9), (0.875, 1.7875), (0.875, 1.6750001), (0.875, 1.5625001), (0.875, 1.4500002), (0.875, 1.3375002), (0.875, 1.2250003), (0.875, 1.1125003), (0.875, 1.0000004), (0.75, 1.9), (0.75, 1.7875), (0.75, 1.6750001), (0.75, 1.5625001), (0.75, 1.4500002), (0.75, 1.3375002), (0.75, 1.2250003), (0.75, 1.1125003), (0.75, 1.0000004), (0.625, 1.9), (0.625, 1.7875), (0.625, 1.6750001), (0.625, 1.5625001), (0.625, 1.4500002), (0.625, 1.3375002), (0.625, 1.2250003), (0.625, 1.1125003), (0.625, 1.0000004), (0.5, 1.9), (0.5, 1.7875), (0.5, 1.6750001), (0.5, 1.5625001), (0.5, 1.4500002), (0.5, 1.3375002), (0.5, 1.2250003), (0.5, 1.1125003), (0.5, 1.0000004), (0.375, 1.9), (0.375, 1.7875), (0.375, 1.6750001), (0.375, 1.5625001), (0.375, 1.4500002), (0.375, 1.3375002), (0.375, 1.2250003), (0.375, 1.1125003), (0.375, 1.0000004), (0.25, 1.9), (0.25, 1.7875), (0.25, 1.6750001), (0.25, 1.5625001), (0.25, 1.4500002), (0.25, 1.3375002), (0.25, 1.2250003), (0.25, 1.1125003), (0.25, 1.0000004), (0.125, 1.9), (0.125, 1.7875), (0.125, 1.6750001), (0.125, 1.5625001), (0.125, 1.4500002), (0.125, 1.3375002), (0.125, 1.2250003), (0.125, 1.1125003), (0.125, 1.0000004), (0, 1.9), (0, 1.7875), (0, 1.6750001), (0, 1.5625001), (0, 1.4500002), (0, 1.3375002), (0, 1.2250003), (0, 1.1125003), (0, 1.0000004), (2, 1.9), (2, 1.7875), (2, 1.6750001), (2, 1.5625001), (2, 1.4500002), (2, 1.3375002), (2, 1.2250003), (2, 1.1125003), (2, 1.0000004), (1.875, 1.9), (1.875, 1.7875), (1.875, 1.6750001), (1.875, 1.5625001), (1.875, 1.4500002), (1.875, 1.3375002), (1.875, 1.2250003), (1.875, 1.1125003), (1.875, 1.0000004), (1.75, 1.9), (1.75, 1.7875), (1.75, 1.6750001), (1.75, 1.5625001), (1.75, 1.4500002), (1.75, 1.3375002), (1.75, 1.2250003), (1.75, 1.1125003), (1.75, 1.0000004), (1.625, 1.9), (1.625, 1.7875), (1.625, 1.6750001), (1.625, 1.5625001), (1.625, 1.4500002), (1.625, 1.3375002), (1.625, 1.2250003), (1.625, 1.1125003), (1.625, 1.0000004), (1.5, 1.9), (1.5, 1.7875), (1.5, 1.6750001), (1.5, 1.5625001), (1.5, 1.4500002), (1.5, 1.3375002), (1.5, 1.2250003), (1.5, 1.1125003), (1.5, 1.0000004), (1.375, 1.9), (1.375, 1.7875), (1.375, 1.6750001), (1.375, 1.5625001), (1.375, 1.4500002), (1.375, 1.3375002), (1.375, 1.2250003), (1.375, 1.1125003), (1.375, 1.0000004), (1.25, 1.9), (1.25, 1.7875), (1.25, 1.6750001), (1.25, 1.5625001), (1.25, 1.4500002), (1.25, 1.3375002), (1.25, 1.2250003), (1.25, 1.1125003), (1.25, 1.0000004), (1.125, 1.9), (1.125, 1.7875), (1.125, 1.6750001), (1.125, 1.5625001), (1.125, 1.4500002), (1.125, 1.3375002), (1.125, 1.2250003), (1.125, 1.1125003), (1.125, 1.0000004), (1, 1.9), (1, 1.7875), (1, 1.6750001), (1, 1.5625001), (1, 1.4500002), (1, 1.3375002), (1, 1.2250003), (1, 1.1125003), (1, 1.0000004), (1, 1.9), (1, 1.7875), (1, 1.6750001), (1, 1.5625001), (1, 1.4500002), (1, 1.3375002), (1, 1.2250003), (1, 1.1125003), (1, 1.0000004), (0.875, 1.9), (0.875, 1.7875), (0.875, 1.6750001), (0.875, 1.5625001), (0.875, 1.4500002), (0.875, 1.3375002), (0.875, 1.2250003), (0.875, 1.1125003), (0.875, 1.0000004), (0.75, 1.9), (0.75, 1.7875), (0.75, 1.6750001), (0.75, 1.5625001), (0.75, 1.4500002), (0.75, 1.3375002), (0.75, 1.2250003), (0.75, 1.1125003), (0.75, 1.0000004), (0.625, 1.9), (0.625, 1.7875), (0.625, 1.6750001), (0.625, 1.5625001), (0.625, 1.4500002), (0.625, 1.3375002), (0.625, 1.2250003), (0.625, 1.1125003), (0.625, 1.0000004), (0.5, 1.9), (0.5, 1.7875), (0.5, 1.6750001), (0.5, 1.5625001), (0.5, 1.4500002), (0.5, 1.3375002), (0.5, 1.2250003), (0.5, 1.1125003), (0.5, 1.0000004), (0.375, 1.9), (0.375, 1.7875), (0.375, 1.6750001), (0.375, 1.5625001), (0.375, 1.4500002), (0.375, 1.3375002), (0.375, 1.2250003), (0.375, 1.1125003), (0.375, 1.0000004), (0.25, 1.9), (0.25, 1.7875), (0.25, 1.6750001), (0.25, 1.5625001), (0.25, 1.4500002), (0.25, 1.3375002), (0.25, 1.2250003), (0.25, 1.1125003), (0.25, 1.0000004), (0.125, 1.9), (0.125, 1.7875), (0.125, 1.6750001), (0.125, 1.5625001), (0.125, 1.4500002), (0.125, 1.3375002), (0.125, 1.2250003), (0.125, 1.1125003), (0.125, 1.0000004), (0, 1.9), (0, 1.7875), (0, 1.6750001), (0, 1.5625001), (0, 1.4500002), (0, 1.3375002), (0, 1.2250003), (0, 1.1125003), (0, 1.0000004), (2, 1), (2, 0.925), (2, 0.85), (2, 0.77500004), (2, 0.70000005), (2, 0.62500006), (2, 0.5500001), (2, 0.47500008), (2, 0.4000001), (1.875, 1), (1.875, 0.925), (1.875, 0.85), (1.875, 0.77500004), (1.875, 0.70000005), (1.875, 0.62500006), (1.875, 0.5500001), (1.875, 0.47500008), (1.875, 0.4000001), (1.75, 1), (1.75, 0.925), (1.75, 0.85), (1.75, 0.77500004), (1.75, 0.70000005), (1.75, 0.62500006), (1.75, 0.5500001), (1.75, 0.47500008), (1.75, 0.4000001), (1.625, 1), (1.625, 0.925), (1.625, 0.85), (1.625, 0.77500004), (1.625, 0.70000005), (1.625, 0.62500006), (1.625, 0.5500001), (1.625, 0.47500008), (1.625, 0.4000001), (1.5, 1), (1.5, 0.925), (1.5, 0.85), (1.5, 0.77500004), (1.5, 0.70000005), (1.5, 0.62500006), (1.5, 0.5500001), (1.5, 0.47500008), (1.5, 0.4000001), (1.375, 1), (1.375, 0.925), (1.375, 0.85), (1.375, 0.77500004), (1.375, 0.70000005), (1.375, 0.62500006), (1.375, 0.5500001), (1.375, 0.47500008), (1.375, 0.4000001), (1.25, 1), (1.25, 0.925), (1.25, 0.85), (1.25, 0.77500004), (1.25, 0.70000005), (1.25, 0.62500006), (1.25, 0.5500001), (1.25, 0.47500008), (1.25, 0.4000001), (1.125, 1), (1.125, 0.925), (1.125, 0.85), (1.125, 0.77500004), (1.125, 0.70000005), (1.125, 0.62500006), (1.125, 0.5500001), (1.125, 0.47500008), (1.125, 0.4000001), (1, 1), (1, 0.925), (1, 0.85), (1, 0.77500004), (1, 0.70000005), (1, 0.62500006), (1, 0.5500001), (1, 0.47500008), (1, 0.4000001), (1, 1), (1, 0.925), (1, 0.85), (1, 0.77500004), (1, 0.70000005), (1, 0.62500006), (1, 0.5500001), (1, 0.47500008), (1, 0.4000001), (0.875, 1), (0.875, 0.925), (0.875, 0.85), (0.875, 0.77500004), (0.875, 0.70000005), (0.875, 0.62500006), (0.875, 0.5500001), (0.875, 0.47500008), (0.875, 0.4000001), (0.75, 1), (0.75, 0.925), (0.75, 0.85), (0.75, 0.77500004), (0.75, 0.70000005), (0.75, 0.62500006), (0.75, 0.5500001), (0.75, 0.47500008), (0.75, 0.4000001), (0.625, 1), (0.625, 0.925), (0.625, 0.85), (0.625, 0.77500004), (0.625, 0.70000005), (0.625, 0.62500006), (0.625, 0.5500001), (0.625, 0.47500008), (0.625, 0.4000001), (0.5, 1), (0.5, 0.925), (0.5, 0.85), (0.5, 0.77500004), (0.5, 0.70000005), (0.5, 0.62500006), (0.5, 0.5500001), (0.5, 0.47500008), (0.5, 0.4000001), (0.375, 1), (0.375, 0.925), (0.375, 0.85), (0.375, 0.77500004), (0.375, 0.70000005), (0.375, 0.62500006), (0.375, 0.5500001), (0.375, 0.47500008), (0.375, 0.4000001), (0.25, 1), (0.25, 0.925), (0.25, 0.85), (0.25, 0.77500004), (0.25, 0.70000005), (0.25, 0.62500006), (0.25, 0.5500001), (0.25, 0.47500008), (0.25, 0.4000001), (0.125, 1), (0.125, 0.925), (0.125, 0.85), (0.125, 0.77500004), (0.125, 0.70000005), (0.125, 0.62500006), (0.125, 0.5500001), (0.125, 0.47500008), (0.125, 0.4000001), (0, 1), (0, 0.925), (0, 0.85), (0, 0.77500004), (0, 0.70000005), (0, 0.62500006), (0, 0.5500001), (0, 0.47500008), (0, 0.4000001), (2, 1), (2, 0.925), (2, 0.85), (2, 0.77500004), (2, 0.70000005), (2, 0.62500006), (2, 0.5500001), (2, 0.47500008), (2, 0.4000001), (1.875, 1), (1.875, 0.925), (1.875, 0.85), (1.875, 0.77500004), (1.875, 0.70000005), (1.875, 0.62500006), (1.875, 0.5500001), (1.875, 0.47500008), (1.875, 0.4000001), (1.75, 1), (1.75, 0.925), (1.75, 0.85), (1.75, 0.77500004), (1.75, 0.70000005), (1.75, 0.62500006), (1.75, 0.5500001), (1.75, 0.47500008), (1.75, 0.4000001), (1.625, 1), (1.625, 0.925), (1.625, 0.85), (1.625, 0.77500004), (1.625, 0.70000005), (1.625, 0.62500006), (1.625, 0.5500001), (1.625, 0.47500008), (1.625, 0.4000001), (1.5, 1), (1.5, 0.925), (1.5, 0.85), (1.5, 0.77500004), (1.5, 0.70000005), (1.5, 0.62500006), (1.5, 0.5500001), (1.5, 0.47500008), (1.5, 0.4000001), (1.375, 1), (1.375, 0.925), (1.375, 0.85), (1.375, 0.77500004), (1.375, 0.70000005), (1.375, 0.62500006), (1.375, 0.5500001), (1.375, 0.47500008), (1.375, 0.4000001), (1.25, 1), (1.25, 0.925), (1.25, 0.85), (1.25, 0.77500004), (1.25, 0.70000005), (1.25, 0.62500006), (1.25, 0.5500001), (1.25, 0.47500008), (1.25, 0.4000001), (1.125, 1), (1.125, 0.925), (1.125, 0.85), (1.125, 0.77500004), (1.125, 0.70000005), (1.125, 0.62500006), (1.125, 0.5500001), (1.125, 0.47500008), (1.125, 0.4000001), (1, 1), (1, 0.925), (1, 0.85), (1, 0.77500004), (1, 0.70000005), (1, 0.62500006), (1, 0.5500001), (1, 0.47500008), (1, 0.4000001), (1, 1), (1, 0.925), (1, 0.85), (1, 0.77500004), (1, 0.70000005), (1, 0.62500006), (1, 0.5500001), (1, 0.47500008), (1, 0.4000001), (0.875, 1), (0.875, 0.925), (0.875, 0.85), (0.875, 0.77500004), (0.875, 0.70000005), (0.875, 0.62500006), (0.875, 0.5500001), (0.875, 0.47500008), (0.875, 0.4000001), (0.75, 1), (0.75, 0.925), (0.75, 0.85), (0.75, 0.77500004), (0.75, 0.70000005), (0.75, 0.62500006), (0.75, 0.5500001), (0.75, 0.47500008), (0.75, 0.4000001), (0.625, 1), (0.625, 0.925), (0.625, 0.85), (0.625, 0.77500004), (0.625, 0.70000005), (0.625, 0.62500006), (0.625, 0.5500001), (0.625, 0.47500008), (0.625, 0.4000001), (0.5, 1), (0.5, 0.925), (0.5, 0.85), (0.5, 0.77500004), (0.5, 0.70000005), (0.5, 0.62500006), (0.5, 0.5500001), (0.5, 0.47500008), (0.5, 0.4000001), (0.375, 1), (0.375, 0.925), (0.375, 0.85), (0.375, 0.77500004), (0.375, 0.70000005), (0.375, 0.62500006), (0.375, 0.5500001), (0.375, 0.47500008), (0.375, 0.4000001), (0.25, 1), (0.25, 0.925), (0.25, 0.85), (0.25, 0.77500004), (0.25, 0.70000005), (0.25, 0.62500006), (0.25, 0.5500001), (0.25, 0.47500008), (0.25, 0.4000001), (0.125, 1), (0.125, 0.925), (0.125, 0.85), (0.125, 0.77500004), (0.125, 0.70000005), (0.125, 0.62500006), (0.125, 0.5500001), (0.125, 0.47500008), (0.125, 0.4000001), (0, 1), (0, 0.925), (0, 0.85), (0, 0.77500004), (0, 0.70000005), (0, 0.62500006), (0, 0.5500001), (0, 0.47500008), (0, 0.4000001), (2, 0.4), (2, 0.35), (2, 0.29999998), (2, 0.24999999), (2, 0.19999999), (2, 0.14999999), (2, 0.099999994), (2, 0.049999993), (1.875, 0.4), (1.875, 0.35), (1.875, 0.29999998), (1.875, 0.24999999), (1.875, 0.19999999), (1.875, 0.14999999), (1.875, 0.099999994), (1.875, 0.049999993), (1.875, -7.450581e-9), (1.75, 0.4), (1.75, 0.35), (1.75, 0.29999998), (1.75, 0.24999999), (1.75, 0.19999999), (1.75, 0.14999999), (1.75, 0.099999994), (1.75, 0.049999993), (1.75, -7.450581e-9), (1.625, 0.4), (1.625, 0.35), (1.625, 0.29999998), (1.625, 0.24999999), (1.625, 0.19999999), (1.625, 0.14999999), (1.625, 0.099999994), (1.625, 0.049999993), (1.625, -7.450581e-9), (1.5, 0.4), (1.5, 0.35), (1.5, 0.29999998), (1.5, 0.24999999), (1.5, 0.19999999), (1.5, 0.14999999), (1.5, 0.099999994), (1.5, 0.049999993), (1.5, -7.450581e-9), (1.375, 0.4), (1.375, 0.35), (1.375, 0.29999998), (1.375, 0.24999999), (1.375, 0.19999999), (1.375, 0.14999999), (1.375, 0.099999994), (1.375, 0.049999993), (1.375, -7.450581e-9), (1.25, 0.4), (1.25, 0.35), (1.25, 0.29999998), (1.25, 0.24999999), (1.25, 0.19999999), (1.25, 0.14999999), (1.25, 0.099999994), (1.25, 0.049999993), (1.25, -7.450581e-9), (1.125, 0.4), (1.125, 0.35), (1.125, 0.29999998), (1.125, 0.24999999), (1.125, 0.19999999), (1.125, 0.14999999), (1.125, 0.099999994), (1.125, 0.049999993), (1.125, -7.450581e-9), (1, 0.4), (1, 0.35), (1, 0.29999998), (1, 0.24999999), (1, 0.19999999), (1, 0.14999999), (1, 0.099999994), (1, 0.049999993), (1, -7.450581e-9), (1, 0.4), (1, 0.35), (1, 0.29999998), (1, 0.24999999), (1, 0.19999999), (1, 0.14999999), (1, 0.099999994), (1, 0.049999993), (0.875, 0.4), (0.875, 0.35), (0.875, 0.29999998), (0.875, 0.24999999), (0.875, 0.19999999), (0.875, 0.14999999), (0.875, 0.099999994), (0.875, 0.049999993), (0.875, -7.450581e-9), (0.75, 0.4), (0.75, 0.35), (0.75, 0.29999998), (0.75, 0.24999999), (0.75, 0.19999999), (0.75, 0.14999999), (0.75, 0.099999994), (0.75, 0.049999993), (0.75, -7.450581e-9), (0.625, 0.4), (0.625, 0.35), (0.625, 0.29999998), (0.625, 0.24999999), (0.625, 0.19999999), (0.625, 0.14999999), (0.625, 0.099999994), (0.625, 0.049999993), (0.625, -7.450581e-9), (0.5, 0.4), (0.5, 0.35), (0.5, 0.29999998), (0.5, 0.24999999), (0.5, 0.19999999), (0.5, 0.14999999), (0.5, 0.099999994), (0.5, 0.049999993), (0.5, -7.450581e-9), (0.375, 0.4), (0.375, 0.35), (0.375, 0.29999998), (0.375, 0.24999999), (0.375, 0.19999999), (0.375, 0.14999999), (0.375, 0.099999994), (0.375, 0.049999993), (0.375, -7.450581e-9), (0.25, 0.4), (0.25, 0.35), (0.25, 0.29999998), (0.25, 0.24999999), (0.25, 0.19999999), (0.25, 0.14999999), (0.25, 0.099999994), (0.25, 0.049999993), (0.25, -7.450581e-9), (0.125, 0.4), (0.125, 0.35), (0.125, 0.29999998), (0.125, 0.24999999), (0.125, 0.19999999), (0.125, 0.14999999), (0.125, 0.099999994), (0.125, 0.049999993), (0.125, -7.450581e-9), (0, 0.4), (0, 0.35), (0, 0.29999998), (0, 0.24999999), (0, 0.19999999), (0, 0.14999999), (0, 0.099999994), (0, 0.049999993), (0, -7.450581e-9), (2, 0.4), (2, 0.35), (2, 0.29999998), (2, 0.24999999), (2, 0.19999999), (2, 0.14999999), (2, 0.099999994), (2, 0.049999993), (1.875, 0.4), (1.875, 0.35), (1.875, 0.29999998), (1.875, 0.24999999), (1.875, 0.19999999), (1.875, 0.14999999), (1.875, 0.099999994), (1.875, 0.049999993), (1.875, -7.450581e-9), (1.75, 0.4), (1.75, 0.35), (1.75, 0.29999998), (1.75, 0.24999999), (1.75, 0.19999999), (1.75, 0.14999999), (1.75, 0.099999994), (1.75, 0.049999993), (1.75, -7.450581e-9), (1.625, 0.4), (1.625, 0.35), (1.625, 0.29999998), (1.625, 0.24999999), (1.625, 0.19999999), (1.625, 0.14999999), (1.625, 0.099999994), (1.625, 0.049999993), (1.625, -7.450581e-9), (1.5, 0.4), (1.5, 0.35), (1.5, 0.29999998), (1.5, 0.24999999), (1.5, 0.19999999), (1.5, 0.14999999), (1.5, 0.099999994), (1.5, 0.049999993), (1.5, -7.450581e-9), (1.375, 0.4), (1.375, 0.35), (1.375, 0.29999998), (1.375, 0.24999999), (1.375, 0.19999999), (1.375, 0.14999999), (1.375, 0.099999994), (1.375, 0.049999993), (1.375, -7.450581e-9), (1.25, 0.4), (1.25, 0.35), (1.25, 0.29999998), (1.25, 0.24999999), (1.25, 0.19999999), (1.25, 0.14999999), (1.25, 0.099999994), (1.25, 0.049999993), (1.25, -7.450581e-9), (1.125, 0.4), (1.125, 0.35), (1.125, 0.29999998), (1.125, 0.24999999), (1.125, 0.19999999), (1.125, 0.14999999), (1.125, 0.099999994), (1.125, 0.049999993), (1.125, -7.450581e-9), (1, 0.4), (1, 0.35), (1, 0.29999998), (1, 0.24999999), (1, 0.19999999), (1, 0.14999999), (1, 0.099999994), (1, 0.049999993), (1, -7.450581e-9), (1, 0.4), (1, 0.35), (1, 0.29999998), (1, 0.24999999), (1, 0.19999999), (1, 0.14999999), (1, 0.099999994), (1, 0.049999993), (0.875, 0.4), (0.875, 0.35), (0.875, 0.29999998), (0.875, 0.24999999), (0.875, 0.19999999), (0.875, 0.14999999), (0.875, 0.099999994), (0.875, 0.049999993), (0.875, -7.450581e-9), (0.75, 0.4), (0.75, 0.35), (0.75, 0.29999998), (0.75, 0.24999999), (0.75, 0.19999999), (0.75, 0.14999999), (0.75, 0.099999994), (0.75, 0.049999993), (0.75, -7.450581e-9), (0.625, 0.4), (0.625, 0.35), (0.625, 0.29999998), (0.625, 0.24999999), (0.625, 0.19999999), (0.625, 0.14999999), (0.625, 0.099999994), (0.625, 0.049999993), (0.625, -7.450581e-9), (0.5, 0.4), (0.5, 0.35), (0.5, 0.29999998), (0.5, 0.24999999), (0.5, 0.19999999), (0.5, 0.14999999), (0.5, 0.099999994), (0.5, 0.049999993), (0.5, -7.450581e-9), (0.375, 0.4), (0.375, 0.35), (0.375, 0.29999998), (0.375, 0.24999999), (0.375, 0.19999999), (0.375, 0.14999999), (0.375, 0.099999994), (0.375, 0.049999993), (0.375, -7.450581e-9), (0.25, 0.4), (0.25, 0.35), (0.25, 0.29999998), (0.25, 0.24999999), (0.25, 0.19999999), (0.25, 0.14999999), (0.25, 0.099999994), (0.25, 0.049999993), (0.25, -7.450581e-9), (0.125, 0.4), (0.125, 0.35), (0.125, 0.29999998), (0.125, 0.24999999), (0.125, 0.19999999), (0.125, 0.14999999), (0.125, 0.099999994), (0.125, 0.049999993), (0.125, -7.450581e-9), (0, 0.4), (0, 0.35), (0, 0.29999998), (0, 0.24999999), (0, 0.19999999), (0, 0.14999999), (0, 0.099999994), (0, 0.049999993), (0, -7.450581e-9), (1, 1), (1, 0.9375), (1, 0.875), (1, 0.8125), (1, 0.75), (1, 0.6875), (1, 0.625), (1, 0.5625), (1, 0.5), (0.9375, 1), (0.9375, 0.9375), (0.9375, 0.875), (0.9375, 0.8125), (0.9375, 0.75), (0.9375, 0.6875), (0.9375, 0.625), (0.9375, 0.5625), (0.9375, 0.5), (0.875, 1), (0.875, 0.9375), (0.875, 0.875), (0.875, 0.8125), (0.875, 0.75), (0.875, 0.6875), (0.875, 0.625), (0.875, 0.5625), (0.875, 0.5), (0.8125, 1), (0.8125, 0.9375), (0.8125, 0.875), (0.8125, 0.8125), (0.8125, 0.75), (0.8125, 0.6875), (0.8125, 0.625), (0.8125, 0.5625), (0.8125, 0.5), (0.75, 1), (0.75, 0.9375), (0.75, 0.875), (0.75, 0.8125), (0.75, 0.75), (0.75, 0.6875), (0.75, 0.625), (0.75, 0.5625), (0.75, 0.5), (0.6875, 1), (0.6875, 0.9375), (0.6875, 0.875), (0.6875, 0.8125), (0.6875, 0.75), (0.6875, 0.6875), (0.6875, 0.625), (0.6875, 0.5625), (0.6875, 0.5), (0.625, 1), (0.625, 0.9375), (0.625, 0.875), (0.625, 0.8125), (0.625, 0.75), (0.625, 0.6875), (0.625, 0.625), (0.625, 0.5625), (0.625, 0.5), (0.5625, 1), (0.5625, 0.9375), (0.5625, 0.875), (0.5625, 0.8125), (0.5625, 0.75), (0.5625, 0.6875), (0.5625, 0.625), (0.5625, 0.5625), (0.5625, 0.5), (0.5, 1), (0.5, 0.9375), (0.5, 0.875), (0.5, 0.8125), (0.5, 0.75), (0.5, 0.6875), (0.5, 0.625), (0.5, 0.5625), (0.5, 0.5), (0.5, 1), (0.5, 0.9375), (0.5, 0.875), (0.5, 0.8125), (0.5, 0.75), (0.5, 0.6875), (0.5, 0.625), (0.5, 0.5625), (0.5, 0.5), (0.4375, 1), (0.4375, 0.9375), (0.4375, 0.875), (0.4375, 0.8125), (0.4375, 0.75), (0.4375, 0.6875), (0.4375, 0.625), (0.4375, 0.5625), (0.4375, 0.5), (0.375, 1), (0.375, 0.9375), (0.375, 0.875), (0.375, 0.8125), (0.375, 0.75), (0.375, 0.6875), (0.375, 0.625), (0.375, 0.5625), (0.375, 0.5), (0.3125, 1), (0.3125, 0.9375), (0.3125, 0.875), (0.3125, 0.8125), (0.3125, 0.75), (0.3125, 0.6875), (0.3125, 0.625), (0.3125, 0.5625), (0.3125, 0.5), (0.25, 1), (0.25, 0.9375), (0.25, 0.875), (0.25, 0.8125), (0.25, 0.75), (0.25, 0.6875), (0.25, 0.625), (0.25, 0.5625), (0.25, 0.5), (0.1875, 1), (0.1875, 0.9375), (0.1875, 0.875), (0.1875, 0.8125), (0.1875, 0.75), (0.1875, 0.6875), (0.1875, 0.625), (0.1875, 0.5625), (0.1875, 0.5), (0.125, 1), (0.125, 0.9375), (0.125, 0.875), (0.125, 0.8125), (0.125, 0.75), (0.125, 0.6875), (0.125, 0.625), (0.125, 0.5625), (0.125, 0.5), (0.0625, 1), (0.0625, 0.9375), (0.0625, 0.875), (0.0625, 0.8125), (0.0625, 0.75), (0.0625, 0.6875), (0.0625, 0.625), (0.0625, 0.5625), (0.0625, 0.5), (0, 1), (0, 0.9375), (0, 0.875), (0, 0.8125), (0, 0.75), (0, 0.6875), (0, 0.625), (0, 0.5625), (0, 0.5), (1, 0.5), (1, 0.4375), (1, 0.375), (1, 0.3125), (1, 0.25), (1, 0.1875), (1, 0.125), (1, 0.0625), (1, 0), (0.9375, 0.5), (0.9375, 0.4375), (0.9375, 0.375), (0.9375, 0.3125), (0.9375, 0.25), (0.9375, 0.1875), (0.9375, 0.125), (0.9375, 0.0625), (0.9375, 0), (0.875, 0.5), (0.875, 0.4375), (0.875, 0.375), (0.875, 0.3125), (0.875, 0.25), (0.875, 0.1875), (0.875, 0.125), (0.875, 0.0625), (0.875, 0), (0.8125, 0.5), (0.8125, 0.4375), (0.8125, 0.375), (0.8125, 0.3125), (0.8125, 0.25), (0.8125, 0.1875), (0.8125, 0.125), (0.8125, 0.0625), (0.8125, 0), (0.75, 0.5), (0.75, 0.4375), (0.75, 0.375), (0.75, 0.3125), (0.75, 0.25), (0.75, 0.1875), (0.75, 0.125), (0.75, 0.0625), (0.75, 0), (0.6875, 0.5), (0.6875, 0.4375), (0.6875, 0.375), (0.6875, 0.3125), (0.6875, 0.25), (0.6875, 0.1875), (0.6875, 0.125), (0.6875, 0.0625), (0.6875, 0), (0.625, 0.5), (0.625, 0.4375), (0.625, 0.375), (0.625, 0.3125), (0.625, 0.25), (0.625, 0.1875), (0.625, 0.125), (0.625, 0.0625), (0.625, 0), (0.5625, 0.5), (0.5625, 0.4375), (0.5625, 0.375), (0.5625, 0.3125), (0.5625, 0.25), (0.5625, 0.1875), (0.5625, 0.125), (0.5625, 0.0625), (0.5625, 0), (0.5, 0.5), (0.5, 0.4375), (0.5, 0.375), (0.5, 0.3125), (0.5, 0.25), (0.5, 0.1875), (0.5, 0.125), (0.5, 0.0625), (0.5, 0), (0.5, 0.5), (0.5, 0.4375), (0.5, 0.375), (0.5, 0.3125), (0.5, 0.25), (0.5, 0.1875), (0.5, 0.125), (0.5, 0.0625), (0.5, 0), (0.4375, 0.5), (0.4375, 0.4375), (0.4375, 0.375), (0.4375, 0.3125), (0.4375, 0.25), (0.4375, 0.1875), (0.4375, 0.125), (0.4375, 0.0625), (0.4375, 0), (0.375, 0.5), (0.375, 0.4375), (0.375, 0.375), (0.375, 0.3125), (0.375, 0.25), (0.375, 0.1875), (0.375, 0.125), (0.375, 0.0625), (0.375, 0), (0.3125, 0.5), (0.3125, 0.4375), (0.3125, 0.375), (0.3125, 0.3125), (0.3125, 0.25), (0.3125, 0.1875), (0.3125, 0.125), (0.3125, 0.0625), (0.3125, 0), (0.25, 0.5), (0.25, 0.4375), (0.25, 0.375), (0.25, 0.3125), (0.25, 0.25), (0.25, 0.1875), (0.25, 0.125), (0.25, 0.0625), (0.25, 0), (0.1875, 0.5), (0.1875, 0.4375), (0.1875, 0.375), (0.1875, 0.3125), (0.1875, 0.25), (0.1875, 0.1875), (0.1875, 0.125), (0.1875, 0.0625), (0.1875, 0), (0.125, 0.5), (0.125, 0.4375), (0.125, 0.375), (0.125, 0.3125), (0.125, 0.25), (0.125, 0.1875), (0.125, 0.125), (0.125, 0.0625), (0.125, 0), (0.0625, 0.5), (0.0625, 0.4375), (0.0625, 0.375), (0.0625, 0.3125), (0.0625, 0.25), (0.0625, 0.1875), (0.0625, 0.125), (0.0625, 0.0625), (0.0625, 0), (0, 0.5), (0, 0.4375), (0, 0.375), (0, 0.3125), (0, 0.25), (0, 0.1875), (0, 0.125), (0, 0.0625), (0, 0), (0.5, 0), (0.5, 0.1125), (0.5, 0.225), (0.5, 0.33749998), (0.5, 0.45), (0.5, 0.5625), (0.5, 0.675), (0.5, 0.7875), (0.5, 0.90000004), (0.5625, 0), (0.5625, 0.1125), (0.5625, 0.225), (0.5625, 0.33749998), (0.5625, 0.45), (0.5625, 0.5625), (0.5625, 0.675), (0.5625, 0.7875), (0.5625, 0.90000004), (0.625, 0), (0.625, 0.1125), (0.625, 0.225), (0.625, 0.33749998), (0.625, 0.45), (0.625, 0.5625), (0.625, 0.675), (0.625, 0.7875), (0.625, 0.90000004), (0.6875, 0), (0.6875, 0.1125), (0.6875, 0.225), (0.6875, 0.33749998), (0.6875, 0.45), (0.6875, 0.5625), (0.6875, 0.675), (0.6875, 0.7875), (0.6875, 0.90000004), (0.75, 0), (0.75, 0.1125), (0.75, 0.225), (0.75, 0.33749998), (0.75, 0.45), (0.75, 0.5625), (0.75, 0.675), (0.75, 0.7875), (0.75, 0.90000004), (0.8125, 0), (0.8125, 0.1125), (0.8125, 0.225), (0.8125, 0.33749998), (0.8125, 0.45), (0.8125, 0.5625), (0.8125, 0.675), (0.8125, 0.7875), (0.8125, 0.90000004), (0.875, 0), (0.875, 0.1125), (0.875, 0.225), (0.875, 0.33749998), (0.875, 0.45), (0.875, 0.5625), (0.875, 0.675), (0.875, 0.7875), (0.875, 0.90000004), (0.9375, 0), (0.9375, 0.1125), (0.9375, 0.225), (0.9375, 0.33749998), (0.9375, 0.45), (0.9375, 0.5625), (0.9375, 0.675), (0.9375, 0.7875), (0.9375, 0.90000004), (1, 0), (1, 0.1125), (1, 0.225), (1, 0.33749998), (1, 0.45), (1, 0.5625), (1, 0.675), (1, 0.7875), (1, 0.90000004), (0, 0), (0, 0.1125), (0, 0.225), (0, 0.33749998), (0, 0.45), (0, 0.5625), (0, 0.675), (0, 0.7875), (0, 0.90000004), (0.0625, 0), (0.0625, 0.1125), (0.0625, 0.225), (0.0625, 0.33749998), (0.0625, 0.45), (0.0625, 0.5625), (0.0625, 0.675), (0.0625, 0.7875), (0.0625, 0.90000004), (0.125, 0), (0.125, 0.1125), (0.125, 0.225), (0.125, 0.33749998), (0.125, 0.45), (0.125, 0.5625), (0.125, 0.675), (0.125, 0.7875), (0.125, 0.90000004), (0.1875, 0), (0.1875, 0.1125), (0.1875, 0.225), (0.1875, 0.33749998), (0.1875, 0.45), (0.1875, 0.5625), (0.1875, 0.675), (0.1875, 0.7875), (0.1875, 0.90000004), (0.25, 0), (0.25, 0.1125), (0.25, 0.225), (0.25, 0.33749998), (0.25, 0.45), (0.25, 0.5625), (0.25, 0.675), (0.25, 0.7875), (0.25, 0.90000004), (0.3125, 0), (0.3125, 0.1125), (0.3125, 0.225), (0.3125, 0.33749998), (0.3125, 0.45), (0.3125, 0.5625), (0.3125, 0.675), (0.3125, 0.7875), (0.3125, 0.90000004), (0.375, 0), (0.375, 0.1125), (0.375, 0.225), (0.375, 0.33749998), (0.375, 0.45), (0.375, 0.5625), (0.375, 0.675), (0.375, 0.7875), (0.375, 0.90000004), (0.4375, 0), (0.4375, 0.1125), (0.4375, 0.225), (0.4375, 0.33749998), (0.4375, 0.45), (0.4375, 0.5625), (0.4375, 0.675), (0.4375, 0.7875), (0.4375, 0.90000004), (0.5, 0), (0.5, 0.1125), (0.5, 0.225), (0.5, 0.33749998), (0.5, 0.45), (0.5, 0.5625), (0.5, 0.675), (0.5, 0.7875), (0.5, 0.90000004), (0.5, 0.9), (0.5, 0.91249996), (0.5, 0.92499995), (0.5, 0.93749994), (0.5, 0.9499999), (0.5, 0.9624999), (0.5, 0.9749999), (0.5, 0.9874999), (0.5, 0.9999999), (0.5625, 0.9), (0.5625, 0.91249996), (0.5625, 0.92499995), (0.5625, 0.93749994), (0.5625, 0.9499999), (0.5625, 0.9624999), (0.5625, 0.9749999), (0.5625, 0.9874999), (0.5625, 0.9999999), (0.625, 0.9), (0.625, 0.91249996), (0.625, 0.92499995), (0.625, 0.93749994), (0.625, 0.9499999), (0.625, 0.9624999), (0.625, 0.9749999), (0.625, 0.9874999), (0.625, 0.9999999), (0.6875, 0.9), (0.6875, 0.91249996), (0.6875, 0.92499995), (0.6875, 0.93749994), (0.6875, 0.9499999), (0.6875, 0.9624999), (0.6875, 0.9749999), (0.6875, 0.9874999), (0.6875, 0.9999999), (0.75, 0.9), (0.75, 0.91249996), (0.75, 0.92499995), (0.75, 0.93749994), (0.75, 0.9499999), (0.75, 0.9624999), (0.75, 0.9749999), (0.75, 0.9874999), (0.75, 0.9999999), (0.8125, 0.9), (0.8125, 0.91249996), (0.8125, 0.92499995), (0.8125, 0.93749994), (0.8125, 0.9499999), (0.8125, 0.9624999), (0.8125, 0.9749999), (0.8125, 0.9874999), (0.8125, 0.9999999), (0.875, 0.9), (0.875, 0.91249996), (0.875, 0.92499995), (0.875, 0.93749994), (0.875, 0.9499999), (0.875, 0.9624999), (0.875, 0.9749999), (0.875, 0.9874999), (0.875, 0.9999999), (0.9375, 0.9), (0.9375, 0.91249996), (0.9375, 0.92499995), (0.9375, 0.93749994), (0.9375, 0.9499999), (0.9375, 0.9624999), (0.9375, 0.9749999), (0.9375, 0.9874999), (0.9375, 0.9999999), (1, 0.9), (1, 0.91249996), (1, 0.92499995), (1, 0.93749994), (1, 0.9499999), (1, 0.9624999), (1, 0.9749999), (1, 0.9874999), (1, 0.9999999), (0, 0.9), (0, 0.91249996), (0, 0.92499995), (0, 0.93749994), (0, 0.9499999), (0, 0.9624999), (0, 0.9749999), (0, 0.9874999), (0, 0.9999999), (0.0625, 0.9), (0.0625, 0.91249996), (0.0625, 0.92499995), (0.0625, 0.93749994), (0.0625, 0.9499999), (0.0625, 0.9624999), (0.0625, 0.9749999), (0.0625, 0.9874999), (0.0625, 0.9999999), (0.125, 0.9), (0.125, 0.91249996), (0.125, 0.92499995), (0.125, 0.93749994), (0.125, 0.9499999), (0.125, 0.9624999), (0.125, 0.9749999), (0.125, 0.9874999), (0.125, 0.9999999), (0.1875, 0.9), (0.1875, 0.91249996), (0.1875, 0.92499995), (0.1875, 0.93749994), (0.1875, 0.9499999), (0.1875, 0.9624999), (0.1875, 0.9749999), (0.1875, 0.9874999), (0.1875, 0.9999999), (0.25, 0.9), (0.25, 0.91249996), (0.25, 0.92499995), (0.25, 0.93749994), (0.25, 0.9499999), (0.25, 0.9624999), (0.25, 0.9749999), (0.25, 0.9874999), (0.25, 0.9999999), (0.3125, 0.9), (0.3125, 0.91249996), (0.3125, 0.92499995), (0.3125, 0.93749994), (0.3125, 0.9499999), (0.3125, 0.9624999), (0.3125, 0.9749999), (0.3125, 0.9874999), (0.3125, 0.9999999), (0.375, 0.9), (0.375, 0.91249996), (0.375, 0.92499995), (0.375, 0.93749994), (0.375, 0.9499999), (0.375, 0.9624999), (0.375, 0.9749999), (0.375, 0.9874999), (0.375, 0.9999999), (0.4375, 0.9), (0.4375, 0.91249996), (0.4375, 0.92499995), (0.4375, 0.93749994), (0.4375, 0.9499999), (0.4375, 0.9624999), (0.4375, 0.9749999), (0.4375, 0.9874999), (0.4375, 0.9999999), (0.5, 0.9), (0.5, 0.91249996), (0.5, 0.92499995), (0.5, 0.93749994), (0.5, 0.9499999), (0.5, 0.9624999), (0.5, 0.9749999), (0.5, 0.9874999), (0.5, 0.9999999), (1, 1), (1, 0.875), (1, 0.75), (1, 0.625), (1, 0.5), (1, 0.375), (1, 0.25), (1, 0.125), (1, 0), (0.9375, 1), (0.9375, 0.875), (0.9375, 0.75), (0.9375, 0.625), (0.9375, 0.5), (0.9375, 0.375), (0.9375, 0.25), (0.9375, 0.125), (0.9375, 0), (0.875, 1), (0.875, 0.875), (0.875, 0.75), (0.875, 0.625), (0.875, 0.5), (0.875, 0.375), (0.875, 0.25), (0.875, 0.125), (0.875, 0), (0.8125, 1), (0.8125, 0.875), (0.8125, 0.75), (0.8125, 0.625), (0.8125, 0.5), (0.8125, 0.375), (0.8125, 0.25), (0.8125, 0.125), (0.8125, 0), (0.75, 1), (0.75, 0.875), (0.75, 0.75), (0.75, 0.625), (0.75, 0.5), (0.75, 0.375), (0.75, 0.25), (0.75, 0.125), (0.75, 0), (0.6875, 1), (0.6875, 0.875), (0.6875, 0.75), (0.6875, 0.625), (0.6875, 0.5), (0.6875, 0.375), (0.6875, 0.25), (0.6875, 0.125), (0.6875, 0), (0.625, 1), (0.625, 0.875), (0.625, 0.75), (0.625, 0.625), (0.625, 0.5), (0.625, 0.375), (0.625, 0.25), (0.625, 0.125), (0.625, 0), (0.5625, 1), (0.5625, 0.875), (0.5625, 0.75), (0.5625, 0.625), (0.5625, 0.5), (0.5625, 0.375), (0.5625, 0.25), (0.5625, 0.125), (0.5625, 0), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.5, 1), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.4375, 1), (0.4375, 0.875), (0.4375, 0.75), (0.4375, 0.625), (0.4375, 0.5), (0.4375, 0.375), (0.4375, 0.25), (0.4375, 0.125), (0.4375, 0), (0.375, 1), (0.375, 0.875), (0.375, 0.75), (0.375, 0.625), (0.375, 0.5), (0.375, 0.375), (0.375, 0.25), (0.375, 0.125), (0.375, 0), (0.3125, 1), (0.3125, 0.875), (0.3125, 0.75), (0.3125, 0.625), (0.3125, 0.5), (0.3125, 0.375), (0.3125, 0.25), (0.3125, 0.125), (0.3125, 0), (0.25, 1), (0.25, 0.875), (0.25, 0.75), (0.25, 0.625), (0.25, 0.5), (0.25, 0.375), (0.25, 0.25), (0.25, 0.125), (0.25, 0), (0.1875, 1), (0.1875, 0.875), (0.1875, 0.75), (0.1875, 0.625), (0.1875, 0.5), (0.1875, 0.375), (0.1875, 0.25), (0.1875, 0.125), (0.1875, 0), (0.125, 1), (0.125, 0.875), (0.125, 0.75), (0.125, 0.625), (0.125, 0.5), (0.125, 0.375), (0.125, 0.25), (0.125, 0.125), (0.125, 0), (0.0625, 1), (0.0625, 0.875), (0.0625, 0.75), (0.0625, 0.625), (0.0625, 0.5), (0.0625, 0.375), (0.0625, 0.25), (0.0625, 0.125), (0.0625, 0), (0, 0.875), (0, 0.75), (0, 0.625), (0, 0.5), (0, 0.375), (0, 0.25), (0, 0.125), (0, 0), (1, 1), (1, 0.875), (1, 0.75), (1, 0.625), (1, 0.5), (1, 0.375), (1, 0.25), (1, 0.125), (1, 0), (0.9375, 1), (0.9375, 0.875), (0.9375, 0.75), (0.9375, 0.625), (0.9375, 0.5), (0.9375, 0.375), (0.9375, 0.25), (0.9375, 0.125), (0.9375, 0), (0.875, 1), (0.875, 0.875), (0.875, 0.75), (0.875, 0.625), (0.875, 0.5), (0.875, 0.375), (0.875, 0.25), (0.875, 0.125), (0.875, 0), (0.8125, 1), (0.8125, 0.875), (0.8125, 0.75), (0.8125, 0.625), (0.8125, 0.5), (0.8125, 0.375), (0.8125, 0.25), (0.8125, 0.125), (0.8125, 0), (0.75, 1), (0.75, 0.875), (0.75, 0.75), (0.75, 0.625), (0.75, 0.5), (0.75, 0.375), (0.75, 0.25), (0.75, 0.125), (0.75, 0), (0.6875, 1), (0.6875, 0.875), (0.6875, 0.75), (0.6875, 0.625), (0.6875, 0.5), (0.6875, 0.375), (0.6875, 0.25), (0.6875, 0.125), (0.6875, 0), (0.625, 1), (0.625, 0.875), (0.625, 0.75), (0.625, 0.625), (0.625, 0.5), (0.625, 0.375), (0.625, 0.25), (0.625, 0.125), (0.625, 0), (0.5625, 1), (0.5625, 0.875), (0.5625, 0.75), (0.5625, 0.625), (0.5625, 0.5), (0.5625, 0.375), (0.5625, 0.25), (0.5625, 0.125), (0.5625, 0), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.5, 1), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.4375, 1), (0.4375, 0.875), (0.4375, 0.75), (0.4375, 0.625), (0.4375, 0.5), (0.4375, 0.375), (0.4375, 0.25), (0.4375, 0.125), (0.4375, 0), (0.375, 1), (0.375, 0.875), (0.375, 0.75), (0.375, 0.625), (0.375, 0.5), (0.375, 0.375), (0.375, 0.25), (0.375, 0.125), (0.375, 0), (0.3125, 1), (0.3125, 0.875), (0.3125, 0.75), (0.3125, 0.625), (0.3125, 0.5), (0.3125, 0.375), (0.3125, 0.25), (0.3125, 0.125), (0.3125, 0), (0.25, 1), (0.25, 0.875), (0.25, 0.75), (0.25, 0.625), (0.25, 0.5), (0.25, 0.375), (0.25, 0.25), (0.25, 0.125), (0.25, 0), (0.1875, 1), (0.1875, 0.875), (0.1875, 0.75), (0.1875, 0.625), (0.1875, 0.5), (0.1875, 0.375), (0.1875, 0.25), (0.1875, 0.125), (0.1875, 0), (0.125, 1), (0.125, 0.875), (0.125, 0.75), (0.125, 0.625), (0.125, 0.5), (0.125, 0.375), (0.125, 0.25), (0.125, 0.125), (0.125, 0), (0.0625, 1), (0.0625, 0.875), (0.0625, 0.75), (0.0625, 0.625), (0.0625, 0.5), (0.0625, 0.375), (0.0625, 0.25), (0.0625, 0.125), (0.0625, 0), (0, 0.875), (0, 0.75), (0, 0.625), (0, 0.5), (0, 0.375), (0, 0.25), (0, 0.125), (0, 0), (1, 1), (1, 0.875), (1, 0.75), (1, 0.625), (1, 0.5), (1, 0.375), (1, 0.25), (1, 0.125), (1, 0), (0.9375, 1), (0.9375, 0.875), (0.9375, 0.75), (0.9375, 0.625), (0.9375, 0.5), (0.9375, 0.375), (0.9375, 0.25), (0.9375, 0.125), (0.9375, 0), (0.875, 1), (0.875, 0.875), (0.875, 0.75), (0.875, 0.625), (0.875, 0.5), (0.875, 0.375), (0.875, 0.25), (0.875, 0.125), (0.875, 0), (0.8125, 1), (0.8125, 0.875), (0.8125, 0.75), (0.8125, 0.625), (0.8125, 0.5), (0.8125, 0.375), (0.8125, 0.25), (0.8125, 0.125), (0.8125, 0), (0.75, 1), (0.75, 0.875), (0.75, 0.75), (0.75, 0.625), (0.75, 0.5), (0.75, 0.375), (0.75, 0.25), (0.75, 0.125), (0.75, 0), (0.6875, 1), (0.6875, 0.875), (0.6875, 0.75), (0.6875, 0.625), (0.6875, 0.5), (0.6875, 0.375), (0.6875, 0.25), (0.6875, 0.125), (0.6875, 0), (0.625, 1), (0.625, 0.875), (0.625, 0.75), (0.625, 0.625), (0.625, 0.5), (0.625, 0.375), (0.625, 0.25), (0.625, 0.125), (0.625, 0), (0.5625, 1), (0.5625, 0.875), (0.5625, 0.75), (0.5625, 0.625), (0.5625, 0.5), (0.5625, 0.375), (0.5625, 0.25), (0.5625, 0.125), (0.5625, 0), (0.5, 1), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.5, 1), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.4375, 1), (0.4375, 0.875), (0.4375, 0.75), (0.4375, 0.625), (0.4375, 0.5), (0.4375, 0.375), (0.4375, 0.25), (0.4375, 0.125), (0.4375, 0), (0.375, 1), (0.375, 0.875), (0.375, 0.75), (0.375, 0.625), (0.375, 0.5), (0.375, 0.375), (0.375, 0.25), (0.375, 0.125), (0.375, 0), (0.3125, 1), (0.3125, 0.875), (0.3125, 0.75), (0.3125, 0.625), (0.3125, 0.5), (0.3125, 0.375), (0.3125, 0.25), (0.3125, 0.125), (0.3125, 0), (0.25, 1), (0.25, 0.875), (0.25, 0.75), (0.25, 0.625), (0.25, 0.5), (0.25, 0.375), (0.25, 0.25), (0.25, 0.125), (0.25, 0), (0.1875, 1), (0.1875, 0.875), (0.1875, 0.75), (0.1875, 0.625), (0.1875, 0.5), (0.1875, 0.375), (0.1875, 0.25), (0.1875, 0.125), (0.1875, 0), (0.125, 1), (0.125, 0.875), (0.125, 0.75), (0.125, 0.625), (0.125, 0.5), (0.125, 0.375), (0.125, 0.25), (0.125, 0.125), (0.125, 0), (0.0625, 1), (0.0625, 0.875), (0.0625, 0.75), (0.0625, 0.625), (0.0625, 0.5), (0.0625, 0.375), (0.0625, 0.25), (0.0625, 0.125), (0.0625, 0), (0, 1), (0, 0.875), (0, 0.75), (0, 0.625), (0, 0.5), (0, 0.375), (0, 0.25), (0, 0.125), (0, 0), (1, 1), (1, 0.875), (1, 0.75), (1, 0.625), (1, 0.5), (1, 0.375), (1, 0.25), (1, 0.125), (1, 0), (0.9375, 1), (0.9375, 0.875), (0.9375, 0.75), (0.9375, 0.625), (0.9375, 0.5), (0.9375, 0.375), (0.9375, 0.25), (0.9375, 0.125), (0.9375, 0), (0.875, 1), (0.875, 0.875), (0.875, 0.75), (0.875, 0.625), (0.875, 0.5), (0.875, 0.375), (0.875, 0.25), (0.875, 0.125), (0.875, 0), (0.8125, 1), (0.8125, 0.875), (0.8125, 0.75), (0.8125, 0.625), (0.8125, 0.5), (0.8125, 0.375), (0.8125, 0.25), (0.8125, 0.125), (0.8125, 0), (0.75, 1), (0.75, 0.875), (0.75, 0.75), (0.75, 0.625), (0.75, 0.5), (0.75, 0.375), (0.75, 0.25), (0.75, 0.125), (0.75, 0), (0.6875, 1), (0.6875, 0.875), (0.6875, 0.75), (0.6875, 0.625), (0.6875, 0.5), (0.6875, 0.375), (0.6875, 0.25), (0.6875, 0.125), (0.6875, 0), (0.625, 1), (0.625, 0.875), (0.625, 0.75), (0.625, 0.625), (0.625, 0.5), (0.625, 0.375), (0.625, 0.25), (0.625, 0.125), (0.625, 0), (0.5625, 1), (0.5625, 0.875), (0.5625, 0.75), (0.5625, 0.625), (0.5625, 0.5), (0.5625, 0.375), (0.5625, 0.25), (0.5625, 0.125), (0.5625, 0), (0.5, 1), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.5, 1), (0.5, 0.875), (0.5, 0.75), (0.5, 0.625), (0.5, 0.5), (0.5, 0.375), (0.5, 0.25), (0.5, 0.125), (0.5, 0), (0.4375, 1), (0.4375, 0.875), (0.4375, 0.75), (0.4375, 0.625), (0.4375, 0.5), (0.4375, 0.375), (0.4375, 0.25), (0.4375, 0.125), (0.4375, 0), (0.375, 1), (0.375, 0.875), (0.375, 0.75), (0.375, 0.625), (0.375, 0.5), (0.375, 0.375), (0.375, 0.25), (0.375, 0.125), (0.375, 0), (0.3125, 1), (0.3125, 0.875), (0.3125, 0.75), (0.3125, 0.625), (0.3125, 0.5), (0.3125, 0.375), (0.3125, 0.25), (0.3125, 0.125), (0.3125, 0), (0.25, 1), (0.25, 0.875), (0.25, 0.75), (0.25, 0.625), (0.25, 0.5), (0.25, 0.375), (0.25, 0.25), (0.25, 0.125), (0.25, 0), (0.1875, 1), (0.1875, 0.875), (0.1875, 0.75), (0.1875, 0.625), (0.1875, 0.5), (0.1875, 0.375), (0.1875, 0.25), (0.1875, 0.125), (0.1875, 0), (0.125, 1), (0.125, 0.875), (0.125, 0.75), (0.125, 0.625), (0.125, 0.5), (0.125, 0.375), (0.125, 0.25), (0.125, 0.125), (0.125, 0), (0.0625, 1), (0.0625, 0.875), (0.0625, 0.75), (0.0625, 0.625), (0.0625, 0.5), (0.0625, 0.375), (0.0625, 0.25), (0.0625, 0.125), (0.0625, 0), (0, 1), (0, 0.875), (0, 0.75), (0, 0.625), (0, 0.5), (0, 0.375), (0, 0.25), (0, 0.125), (0, 0)] ( + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 9, 10, 1, 1, 10, 11, 2, 2, 11, 12, 3, 3, 12, 13, 4, 4, 13, 14, 5, 5, 14, 15, 6, 6, 15, 16, 7, 7, 16, 17, 8, 9, 18, 19, 10, 10, 19, 20, 11, 11, 20, 21, 12, 12, 21, 22, 13, 13, 22, 23, 14, 14, 23, 24, 15, 15, 24, 25, 16, 16, 25, 26, 17, 18, 27, 28, 19, 19, 28, 29, 20, 20, 29, 30, 21, 21, 30, 31, 22, 22, 31, 32, 23, 23, 32, 33, 24, 24, 33, 34, 25, 25, 34, 35, 26, 27, 36, 37, 28, 28, 37, 38, 29, 29, 38, 39, 30, 30, 39, 40, 31, 31, 40, 41, 32, 32, 41, 42, 33, 33, 42, 43, 34, 34, 43, 44, 35, 36, 45, 46, 37, 37, 46, 47, 38, 38, 47, 48, 39, 39, 48, 49, 40, 40, 49, 50, 41, 41, 50, 51, 42, 42, 51, 52, 43, 43, 52, 53, 44, 45, 54, 55, 46, 46, 55, 56, 47, 47, 56, 57, 48, 48, 57, 58, 49, 49, 58, 59, 50, 50, 59, 60, 51, 51, 60, 61, 52, 52, 61, 62, 53, 54, 63, 64, 55, 55, 64, 65, 56, 56, 65, 66, 57, 57, 66, 67, 58, 58, 67, 68, 59, 59, 68, 69, 60, 60, 69, 70, 61, 61, 70, 71, 62, 63, 72, 73, 64, 64, 73, 74, 65, 65, 74, 75, 66, 66, 75, 76, 67, 67, 76, 77, 68, 68, 77, 78, 69, 69, 78, 79, 70, 70, 79, 80, 71, 81, 90, 91, 82, 82, 91, 92, 83, 83, 92, 93, 84, 84, 93, 94, 85, 85, 94, 95, 86, 86, 95, 96, 87, 87, 96, 97, 88, 88, 97, 98, 89, 90, 99, 100, 91, 91, 100, 101, 92, 92, 101, 102, 93, 93, 102, 103, 94, 94, 103, 104, 95, 95, 104, 105, 96, 96, 105, 106, 97, 97, 106, 107, 98, 99, 108, 109, 100, 100, 109, 110, 101, 101, 110, 111, 102, 102, 111, 112, 103, 103, 112, 113, 104, 104, 113, 114, 105, 105, 114, 115, 106, 106, 115, 116, 107, 108, 117, 118, 109, 109, 118, 119, 110, 110, 119, 120, 111, 111, 120, 121, 112, 112, 121, 122, 113, 113, 122, 123, 114, 114, 123, 124, 115, 115, 124, 125, 116, 117, 126, 127, 118, 118, 127, 128, 119, 119, 128, 129, 120, 120, 129, 130, 121, 121, 130, 131, 122, 122, 131, 132, 123, 123, 132, 133, 124, 124, 133, 134, 125, 126, 135, 136, 127, 127, 136, 137, 128, 128, 137, 138, 129, 129, 138, 139, 130, 130, 139, 140, 131, 131, 140, 141, 132, 132, 141, 142, 133, 133, 142, 143, 134, 135, 144, 145, 136, 136, 145, 146, 137, 137, 146, 147, 138, 138, 147, 148, 139, 139, 148, 149, 140, 140, 149, 150, 141, 141, 150, 151, 142, 142, 151, 152, 143, 144, 153, 154, 145, 145, 154, 155, 146, 146, 155, 156, 147, 147, 156, 157, 148, 148, 157, 158, 149, 149, 158, 159, 150, 150, 159, 160, 151, 151, 160, 161, 152, 162, 171, 172, 163, 163, 172, 173, 164, 164, 173, 174, 165, 165, 174, 175, 166, 166, 175, 176, 167, 167, 176, 177, 168, 168, 177, 178, 169, 169, 178, 179, 170, 171, 180, 181, 172, 172, 181, 182, 173, 173, 182, 183, 174, 174, 183, 184, 175, 175, 184, 185, 176, 176, 185, 186, 177, 177, 186, 187, 178, 178, 187, 188, 179, 180, 189, 190, 181, 181, 190, 191, 182, 182, 191, 192, 183, 183, 192, 193, 184, 184, 193, 194, 185, 185, 194, 195, 186, 186, 195, 196, 187, 187, 196, 197, 188, 189, 198, 199, 190, 190, 199, 200, 191, 191, 200, 201, 192, 192, 201, 202, 193, 193, 202, 203, 194, 194, 203, 204, 195, 195, 204, 205, 196, 196, 205, 206, 197, 198, 207, 208, 199, 199, 208, 209, 200, 200, 209, 210, 201, 201, 210, 211, 202, 202, 211, 212, 203, 203, 212, 213, 204, 204, 213, 214, 205, 205, 214, 215, 206, 207, 216, 217, 208, 208, 217, 218, 209, 209, 218, 219, 210, 210, 219, 220, 211, 211, 220, 221, 212, 212, 221, 222, 213, 213, 222, 223, 214, 214, 223, 224, 215, 216, 225, 226, 217, 217, 226, 227, 218, 218, 227, 228, 219, 219, 228, 229, 220, 220, 229, 230, 221, 221, 230, 231, 222, 222, 231, 232, 223, 223, 232, 233, 224, 225, 234, 235, 226, 226, 235, 236, 227, 227, 236, 237, 228, 228, 237, 238, 229, 229, 238, 239, 230, 230, 239, 240, 231, 231, 240, 241, 232, 232, 241, 242, 233, 243, 252, 253, 244, 244, 253, 254, 245, 245, 254, 255, 246, 246, 255, 256, 247, 247, 256, 257, 248, 248, 257, 258, 249, 249, 258, 259, 250, 250, 259, 260, 251, 252, 261, 262, 253, 253, 262, 263, 254, 254, 263, 264, 255, 255, 264, 265, 256, 256, 265, 266, 257, 257, 266, 267, 258, 258, 267, 268, 259, 259, 268, 269, 260, 261, 270, 271, 262, 262, 271, 272, 263, 263, 272, 273, 264, 264, 273, 274, 265, 265, 274, 275, 266, 266, 275, 276, 267, 267, 276, 277, 268, 268, 277, 278, 269, 270, 279, 280, 271, 271, 280, 281, 272, 272, 281, 282, 273, 273, 282, 283, 274, 274, 283, 284, 275, 275, 284, 285, 276, 276, 285, 286, 277, 277, 286, 287, 278, 279, 288, 289, 280, 280, 289, 290, 281, 281, 290, 291, 282, 282, 291, 292, 283, 283, 292, 293, 284, 284, 293, 294, 285, 285, 294, 295, 286, 286, 295, 296, 287, 288, 297, 298, 289, 289, 298, 299, 290, 290, 299, 300, 291, 291, 300, 301, 292, 292, 301, 302, 293, 293, 302, 303, 294, 294, 303, 304, 295, 295, 304, 305, 296, 297, 306, 307, 298, 298, 307, 308, 299, 299, 308, 309, 300, 300, 309, 310, 301, 301, 310, 311, 302, 302, 311, 312, 303, 303, 312, 313, 304, 304, 313, 314, 305, 306, 315, 316, 307, 307, 316, 317, 308, 308, 317, 318, 309, 309, 318, 319, 310, 310, 319, 320, 311, 311, 320, 321, 312, 312, 321, 322, 313, 313, 322, 323, 314, 324, 333, 334, 325, 325, 334, 335, 326, 326, 335, 336, 327, 327, 336, 337, 328, 328, 337, 338, 329, 329, 338, 339, 330, 330, 339, 340, 331, 331, 340, 341, 332, 333, 342, 343, 334, 334, 343, 344, 335, 335, 344, 345, 336, 336, 345, 346, 337, 337, 346, 347, 338, 338, 347, 348, 339, 339, 348, 349, 340, 340, 349, 350, 341, 342, 351, 352, 343, 343, 352, 353, 344, 344, 353, 354, 345, 345, 354, 355, 346, 346, 355, 356, 347, 347, 356, 357, 348, 348, 357, 358, 349, 349, 358, 359, 350, 351, 360, 361, 352, 352, 361, 362, 353, 353, 362, 363, 354, 354, 363, 364, 355, 355, 364, 365, 356, 356, 365, 366, 357, 357, 366, 367, 358, 358, 367, 368, 359, 360, 369, 370, 361, 361, 370, 371, 362, 362, 371, 372, 363, 363, 372, 373, 364, 364, 373, 374, 365, 365, 374, 375, 366, 366, 375, 376, 367, 367, 376, 377, 368, 369, 378, 379, 370, 370, 379, 380, 371, 371, 380, 381, 372, 372, 381, 382, 373, 373, 382, 383, 374, 374, 383, 384, 375, 375, 384, 385, 376, 376, 385, 386, 377, 378, 387, 388, 379, 379, 388, 389, 380, 380, 389, 390, 381, 381, 390, 391, 382, 382, 391, 392, 383, 383, 392, 393, 384, 384, 393, 394, 385, 385, 394, 395, 386, 387, 396, 397, 388, 388, 397, 398, 389, 389, 398, 399, 390, 390, 399, 400, 391, 391, 400, 401, 392, 392, 401, 402, 393, 393, 402, 403, 394, 394, 403, 404, 395, 405, 414, 415, 406, 406, 415, 416, 407, 407, 416, 417, 408, 408, 417, 418, 409, 409, 418, 419, 410, 410, 419, 420, 411, 411, 420, 421, 412, 412, 421, 422, 413, 414, 423, 424, 415, 415, 424, 425, 416, 416, 425, 426, 417, 417, 426, 427, 418, 418, 427, 428, 419, 419, 428, 429, 420, 420, 429, 430, 421, 421, 430, 431, 422, 423, 432, 433, 424, 424, 433, 434, 425, 425, 434, 435, 426, 426, 435, 436, 427, 427, 436, 437, 428, 428, 437, 438, 429, 429, 438, 439, 430, 430, 439, 440, 431, 432, 441, 442, 433, 433, 442, 443, 434, 434, 443, 444, 435, 435, 444, 445, 436, 436, 445, 446, 437, 437, 446, 447, 438, 438, 447, 448, 439, 439, 448, 449, 440, 441, 450, 451, 442, 442, 451, 452, 443, 443, 452, 453, 444, 444, 453, 454, 445, 445, 454, 455, 446, 446, 455, 456, 447, 447, 456, 457, 448, 448, 457, 458, 449, 450, 459, 460, 451, 451, 460, 461, 452, 452, 461, 462, 453, 453, 462, 463, 454, 454, 463, 464, 455, 455, 464, 465, 456, 456, 465, 466, 457, 457, 466, 467, 458, 459, 468, 469, 460, 460, 469, 470, 461, 461, 470, 471, 462, 462, 471, 472, 463, 463, 472, 473, 464, 464, 473, 474, 465, 465, 474, 475, 466, 466, 475, 476, 467, 468, 477, 478, 469, 469, 478, 479, 470, 470, 479, 480, 471, 471, 480, 481, 472, 472, 481, 482, 473, 473, 482, 483, 474, 474, 483, 484, 475, 475, 484, 485, 476, 486, 495, 496, 487, 487, 496, 497, 488, 488, 497, 498, 489, 489, 498, 499, 490, 490, 499, 500, 491, 491, 500, 501, 492, 492, 501, 502, 493, 493, 502, 503, 494, 495, 504, 505, 496, 496, 505, 506, 497, 497, 506, 507, 498, 498, 507, 508, 499, 499, 508, 509, 500, 500, 509, 510, 501, 501, 510, 511, 502, 502, 511, 512, 503, 504, 513, 514, 505, 505, 514, 515, 506, 506, 515, 516, 507, 507, 516, 517, 508, 508, 517, 518, 509, 509, 518, 519, 510, 510, 519, 520, 511, 511, 520, 521, 512, 513, 522, 523, 514, 514, 523, 524, 515, 515, 524, 525, 516, 516, 525, 526, 517, 517, 526, 527, 518, 518, 527, 528, 519, 519, 528, 529, 520, 520, 529, 530, 521, 522, 531, 532, 523, 523, 532, 533, 524, 524, 533, 534, 525, 525, 534, 535, 526, 526, 535, 536, 527, 527, 536, 537, 528, 528, 537, 538, 529, 529, 538, 539, 530, 531, 540, 541, 532, 532, 541, 542, 533, 533, 542, 543, 534, 534, 543, 544, 535, 535, 544, 545, 536, 536, 545, 546, 537, 537, 546, 547, 538, 538, 547, 548, 539, 540, 549, 550, 541, 541, 550, 551, 542, 542, 551, 552, 543, 543, 552, 553, 544, 544, 553, 554, 545, 545, 554, 555, 546, 546, 555, 556, 547, 547, 556, 557, 548, 549, 558, 559, 550, 550, 559, 560, 551, 551, 560, 561, 552, 552, 561, 562, 553, 553, 562, 563, 554, 554, 563, 564, 555, 555, 564, 565, 556, 556, 565, 566, 557, 567, 576, 577, 568, 568, 577, 578, 569, 569, 578, 579, 570, 570, 579, 580, 571, 571, 580, 581, 572, 572, 581, 582, 573, 573, 582, 583, 574, 574, 583, 584, 575, 576, 585, 586, 577, 577, 586, 587, 578, 578, 587, 588, 579, 579, 588, 589, 580, 580, 589, 590, 581, 581, 590, 591, 582, 582, 591, 592, 583, 583, 592, 593, 584, 585, 594, 595, 586, 586, 595, 596, 587, 587, 596, 597, 588, 588, 597, 598, 589, 589, 598, 599, 590, 590, 599, 600, 591, 591, 600, 601, 592, 592, 601, 602, 593, 594, 603, 604, 595, 595, 604, 605, 596, 596, 605, 606, 597, 597, 606, 607, 598, 598, 607, 608, 599, 599, 608, 609, 600, 600, 609, 610, 601, 601, 610, 611, 602, 603, 612, 613, 604, 604, 613, 614, 605, 605, 614, 615, 606, 606, 615, 616, 607, 607, 616, 617, 608, 608, 617, 618, 609, 609, 618, 619, 610, 610, 619, 620, 611, 612, 621, 622, 613, 613, 622, 623, 614, 614, 623, 624, 615, 615, 624, 625, 616, 616, 625, 626, 617, 617, 626, 627, 618, 618, 627, 628, 619, 619, 628, 629, 620, 621, 630, 631, 622, 622, 631, 632, 623, 623, 632, 633, 624, 624, 633, 634, 625, 625, 634, 635, 626, 626, 635, 636, 627, 627, 636, 637, 628, 628, 637, 638, 629, 630, 639, 640, 631, 631, 640, 641, 632, 632, 641, 642, 633, 633, 642, 643, 634, 634, 643, 644, 635, 635, 644, 645, 636, 636, 645, 646, 637, 637, 646, 647, 638, 648, 657, 658, 649, 649, 658, 659, 650, 650, 659, 660, 651, 651, 660, 661, 652, 652, 661, 662, 653, 653, 662, 663, 654, 654, 663, 664, 655, 655, 664, 665, 656, 657, 666, 667, 658, 658, 667, 668, 659, 659, 668, 669, 660, 660, 669, 670, 661, 661, 670, 671, 662, 662, 671, 672, 663, 663, 672, 673, 664, 664, 673, 674, 665, 666, 675, 676, 667, 667, 676, 677, 668, 668, 677, 678, 669, 669, 678, 679, 670, 670, 679, 680, 671, 671, 680, 681, 672, 672, 681, 682, 673, 673, 682, 683, 674, 675, 684, 685, 676, 676, 685, 686, 677, 677, 686, 687, 678, 678, 687, 688, 679, 679, 688, 689, 680, 680, 689, 690, 681, 681, 690, 691, 682, 682, 691, 692, 683, 684, 693, 694, 685, 685, 694, 695, 686, 686, 695, 696, 687, 687, 696, 697, 688, 688, 697, 698, 689, 689, 698, 699, 690, 690, 699, 700, 691, 691, 700, 701, 692, 693, 702, 703, 694, 694, 703, 704, 695, 695, 704, 705, 696, 696, 705, 706, 697, 697, 706, 707, 698, 698, 707, 708, 699, 699, 708, 709, 700, 700, 709, 710, 701, 702, 711, 712, 703, 703, 712, 713, 704, 704, 713, 714, 705, 705, 714, 715, 706, 706, 715, 716, 707, 707, 716, 717, 708, 708, 717, 718, 709, 709, 718, 719, 710, 711, 720, 721, 712, 712, 721, 722, 713, 713, 722, 723, 714, 714, 723, 724, 715, 715, 724, 725, 716, 716, 725, 726, 717, 717, 726, 727, 718, 718, 727, 728, 719, 729, 738, 739, 730, 730, 739, 740, 731, 731, 740, 741, 732, 732, 741, 742, 733, 733, 742, 743, 734, 734, 743, 744, 735, 735, 744, 745, 736, 736, 745, 746, 737, 738, 747, 748, 739, 739, 748, 749, 740, 740, 749, 750, 741, 741, 750, 751, 742, 742, 751, 752, 743, 743, 752, 753, 744, 744, 753, 754, 745, 745, 754, 755, 746, 747, 756, 757, 748, 748, 757, 758, 749, 749, 758, 759, 750, 750, 759, 760, 751, 751, 760, 761, 752, 752, 761, 762, 753, 753, 762, 763, 754, 754, 763, 764, 755, 756, 765, 766, 757, 757, 766, 767, 758, 758, 767, 768, 759, 759, 768, 769, 760, 760, 769, 770, 761, 761, 770, 771, 762, 762, 771, 772, 763, 763, 772, 773, 764, 765, 774, 775, 766, 766, 775, 776, 767, 767, 776, 777, 768, 768, 777, 778, 769, 769, 778, 779, 770, 770, 779, 780, 771, 771, 780, 781, 772, 772, 781, 782, 773, 774, 783, 784, 775, 775, 784, 785, 776, 776, 785, 786, 777, 777, 786, 787, 778, 778, 787, 788, 779, 779, 788, 789, 780, 780, 789, 790, 781, 781, 790, 791, 782, 783, 792, 793, 784, 784, 793, 794, 785, 785, 794, 795, 786, 786, 795, 796, 787, 787, 796, 797, 788, 788, 797, 798, 789, 789, 798, 799, 790, 790, 799, 800, 791, 792, 801, 802, 793, 793, 802, 803, 794, 794, 803, 804, 795, 795, 804, 805, 796, 796, 805, 806, 797, 797, 806, 807, 798, 798, 807, 808, 799, 799, 808, 809, 800, 810, 819, 820, 811, 811, 820, 821, 812, 812, 821, 822, 813, 813, 822, 823, 814, 814, 823, 824, 815, 815, 824, 825, 816, 816, 825, 826, 817, 817, 826, 827, 818, 819, 828, 829, 820, 820, 829, 830, 821, 821, 830, 831, 822, 822, 831, 832, 823, 823, 832, 833, 824, 824, 833, 834, 825, 825, 834, 835, 826, 826, 835, 836, 827, 828, 837, 838, 829, 829, 838, 839, 830, 830, 839, 840, 831, 831, 840, 841, 832, 832, 841, 842, 833, 833, 842, 843, 834, 834, 843, 844, 835, 835, 844, 845, 836, 837, 846, 847, 838, 838, 847, 848, 839, 839, 848, 849, 840, 840, 849, 850, 841, 841, 850, 851, 842, 842, 851, 852, 843, 843, 852, 853, 844, 844, 853, 854, 845, 846, 855, 856, 847, 847, 856, 857, 848, 848, 857, 858, 849, 849, 858, 859, 850, 850, 859, 860, 851, 851, 860, 861, 852, 852, 861, 862, 853, 853, 862, 863, 854, 855, 864, 865, 856, 856, 865, 866, 857, 857, 866, 867, 858, 858, 867, 868, 859, 859, 868, 869, 860, 860, 869, 870, 861, 861, 870, 871, 862, 862, 871, 872, 863, 864, 873, 874, 865, 865, 874, 875, 866, 866, 875, 876, 867, 867, 876, 877, 868, 868, 877, 878, 869, 869, 878, 879, 870, 870, 879, 880, 871, 871, 880, 881, 872, 873, 882, 883, 874, 874, 883, 884, 875, 875, 884, 885, 876, 876, 885, 886, 877, 877, 886, 887, 878, 878, 887, 888, 879, 879, 888, 889, 880, 880, 889, 890, 881, 891, 900, 901, 892, 892, 901, 902, 893, 893, 902, 903, 894, 894, 903, 904, 895, 895, 904, 905, 896, 896, 905, 906, 897, 897, 906, 907, 898, 898, 907, 908, 899, 900, 909, 910, 901, 901, 910, 911, 902, 902, 911, 912, 903, 903, 912, 913, 904, 904, 913, 914, 905, 905, 914, 915, 906, 906, 915, 916, 907, 907, 916, 917, 908, 909, 918, 919, 910, 910, 919, 920, 911, 911, 920, 921, 912, 912, 921, 922, 913, 913, 922, 923, 914, 914, 923, 924, 915, 915, 924, 925, 916, 916, 925, 926, 917, 918, 927, 928, 919, 919, 928, 929, 920, 920, 929, 930, 921, 921, 930, 931, 922, 922, 931, 932, 923, 923, 932, 933, 924, 924, 933, 934, 925, 925, 934, 935, 926, 927, 936, 937, 928, 928, 937, 938, 929, 929, 938, 939, 930, 930, 939, 940, 931, 931, 940, 941, 932, 932, 941, 942, 933, 933, 942, 943, 934, 934, 943, 944, 935, 936, 945, 946, 937, 937, 946, 947, 938, 938, 947, 948, 939, 939, 948, 949, 940, 940, 949, 950, 941, 941, 950, 951, 942, 942, 951, 952, 943, 943, 952, 953, 944, 945, 954, 955, 946, 946, 955, 956, 947, 947, 956, 957, 948, 948, 957, 958, 949, 949, 958, 959, 950, 950, 959, 960, 951, 951, 960, 961, 952, 952, 961, 962, 953, 954, 963, 964, 955, 955, 964, 965, 956, 956, 965, 966, 957, 957, 966, 967, 958, 958, 967, 968, 959, 959, 968, 969, 960, 960, 969, 970, 961, 961, 970, 971, 962, 972, 980, 981, 973, 973, 981, 982, 974, 974, 982, 983, 975, 975, 983, 984, 976, 976, 984, 985, 977, 977, 985, 986, 978, 978, 986, 987, 979, 979, 987, 988, 980, 989, 990, 981, 981, 990, 991, 982, 982, 991, 992, 983, 983, 992, 993, 984, 984, 993, 994, 985, 985, 994, 995, 986, 986, 995, 996, 987, 987, 996, 997, 989, 998, 999, 990, 990, 999, 1000, 991, 991, 1000, 1001, 992, 992, 1001, 1002, 993, 993, 1002, 1003, 994, 994, 1003, 1004, 995, 995, 1004, 1005, 996, 996, 1005, 1006, 998, 1007, 1008, 999, 999, 1008, 1009, 1000, 1000, 1009, 1010, 1001, 1001, 1010, 1011, 1002, 1002, 1011, 1012, 1003, 1003, 1012, 1013, 1004, 1004, 1013, 1014, 1005, 1005, 1014, 1015, 1007, 1016, 1017, 1008, 1008, 1017, 1018, 1009, 1009, 1018, 1019, 1010, 1010, 1019, 1020, 1011, 1011, 1020, 1021, 1012, 1012, 1021, 1022, 1013, 1013, 1022, 1023, 1014, 1014, 1023, 1024, 1016, 1025, 1026, 1017, 1017, 1026, 1027, 1018, 1018, 1027, 1028, 1019, 1019, 1028, 1029, 1020, 1020, 1029, 1030, 1021, 1021, 1030, 1031, 1022, 1022, 1031, 1032, 1023, 1023, 1032, 1033, 1025, 1034, 1035, 1026, 1026, 1035, 1036, 1027, 1027, 1036, 1037, 1028, 1028, 1037, 1038, 1029, 1029, 1038, 1039, 1030, 1030, 1039, 1040, 1031, 1031, 1040, 1041, 1032, 1032, 1041, 1042, 1034, 1043, 1044, 1035, 1035, 1044, 1045, 1036, 1036, 1045, 1046, 1037, 1037, 1046, 1047, 1038, 1038, 1047, 1048, 1039, 1039, 1048, 1049, 1040, 1040, 1049, 1050, 1041, 1041, 1050, 1051, 1052, 1060, 1061, 1053, 1053, 1061, 1062, 1054, 1054, 1062, 1063, 1055, 1055, 1063, 1064, 1056, 1056, 1064, 1065, 1057, 1057, 1065, 1066, 1058, 1058, 1066, 1067, 1059, 1059, 1067, 1068, 1060, 1069, 1070, 1061, 1061, 1070, 1071, 1062, 1062, 1071, 1072, 1063, 1063, 1072, 1073, 1064, 1064, 1073, 1074, 1065, 1065, 1074, 1075, 1066, 1066, 1075, 1076, 1067, 1067, 1076, 1077, 1069, 1078, 1079, 1070, 1070, 1079, 1080, 1071, 1071, 1080, 1081, 1072, 1072, 1081, 1082, 1073, 1073, 1082, 1083, 1074, 1074, 1083, 1084, 1075, 1075, 1084, 1085, 1076, 1076, 1085, 1086, 1078, 1087, 1088, 1079, 1079, 1088, 1089, 1080, 1080, 1089, 1090, 1081, 1081, 1090, 1091, 1082, 1082, 1091, 1092, 1083, 1083, 1092, 1093, 1084, 1084, 1093, 1094, 1085, 1085, 1094, 1095, 1087, 1096, 1097, 1088, 1088, 1097, 1098, 1089, 1089, 1098, 1099, 1090, 1090, 1099, 1100, 1091, 1091, 1100, 1101, 1092, 1092, 1101, 1102, 1093, 1093, 1102, 1103, 1094, 1094, 1103, 1104, 1096, 1105, 1106, 1097, 1097, 1106, 1107, 1098, 1098, 1107, 1108, 1099, 1099, 1108, 1109, 1100, 1100, 1109, 1110, 1101, 1101, 1110, 1111, 1102, 1102, 1111, 1112, 1103, 1103, 1112, 1113, 1105, 1114, 1115, 1106, 1106, 1115, 1116, 1107, 1107, 1116, 1117, 1108, 1108, 1117, 1118, 1109, 1109, 1118, 1119, 1110, 1110, 1119, 1120, 1111, 1111, 1120, 1121, 1112, 1112, 1121, 1122, 1114, 1123, 1124, 1115, 1115, 1124, 1125, 1116, 1116, 1125, 1126, 1117, 1117, 1126, 1127, 1118, 1118, 1127, 1128, 1119, 1119, 1128, 1129, 1120, 1120, 1129, 1130, 1121, 1121, 1130, 1131, 1132, 1140, 1141, 1133, 1133, 1141, 1142, 1134, 1134, 1142, 1143, 1135, 1135, 1143, 1144, 1136, 1136, 1144, 1145, 1137, 1137, 1145, 1146, 1138, 1138, 1146, 1147, 1139, 1139, 1147, 1148, 1140, 1149, 1150, 1141, 1141, 1150, 1151, 1142, 1142, 1151, 1152, 1143, 1143, 1152, 1153, 1144, 1144, 1153, 1154, 1145, 1145, 1154, 1155, 1146, 1146, 1155, 1156, 1147, 1147, 1156, 1157, 1149, 1158, 1159, 1150, 1150, 1159, 1160, 1151, 1151, 1160, 1161, 1152, 1152, 1161, 1162, 1153, 1153, 1162, 1163, 1154, 1154, 1163, 1164, 1155, 1155, 1164, 1165, 1156, 1156, 1165, 1166, 1158, 1167, 1168, 1159, 1159, 1168, 1169, 1160, 1160, 1169, 1170, 1161, 1161, 1170, 1171, 1162, 1162, 1171, 1172, 1163, 1163, 1172, 1173, 1164, 1164, 1173, 1174, 1165, 1165, 1174, 1175, 1167, 1176, 1177, 1168, 1168, 1177, 1178, 1169, 1169, 1178, 1179, 1170, 1170, 1179, 1180, 1171, 1171, 1180, 1181, 1172, 1172, 1181, 1182, 1173, 1173, 1182, 1183, 1174, 1174, 1183, 1184, 1176, 1185, 1186, 1177, 1177, 1186, 1187, 1178, 1178, 1187, 1188, 1179, 1179, 1188, 1189, 1180, 1180, 1189, 1190, 1181, 1181, 1190, 1191, 1182, 1182, 1191, 1192, 1183, 1183, 1192, 1193, 1185, 1194, 1195, 1186, 1186, 1195, 1196, 1187, 1187, 1196, 1197, 1188, 1188, 1197, 1198, 1189, 1189, 1198, 1199, 1190, 1190, 1199, 1200, 1191, 1191, 1200, 1201, 1192, 1192, 1201, 1202, 1194, 1203, 1204, 1195, 1195, 1204, 1205, 1196, 1196, 1205, 1206, 1197, 1197, 1206, 1207, 1198, 1198, 1207, 1208, 1199, 1199, 1208, 1209, 1200, 1200, 1209, 1210, 1201, 1201, 1210, 1211, 1212, 1220, 1221, 1213, 1213, 1221, 1222, 1214, 1214, 1222, 1223, 1215, 1215, 1223, 1224, 1216, 1216, 1224, 1225, 1217, 1217, 1225, 1226, 1218, 1218, 1226, 1227, 1219, 1219, 1227, 1228, 1220, 1229, 1230, 1221, 1221, 1230, 1231, 1222, 1222, 1231, 1232, 1223, 1223, 1232, 1233, 1224, 1224, 1233, 1234, 1225, 1225, 1234, 1235, 1226, 1226, 1235, 1236, 1227, 1227, 1236, 1237, 1229, 1238, 1239, 1230, 1230, 1239, 1240, 1231, 1231, 1240, 1241, 1232, 1232, 1241, 1242, 1233, 1233, 1242, 1243, 1234, 1234, 1243, 1244, 1235, 1235, 1244, 1245, 1236, 1236, 1245, 1246, 1238, 1247, 1248, 1239, 1239, 1248, 1249, 1240, 1240, 1249, 1250, 1241, 1241, 1250, 1251, 1242, 1242, 1251, 1252, 1243, 1243, 1252, 1253, 1244, 1244, 1253, 1254, 1245, 1245, 1254, 1255, 1247, 1256, 1257, 1248, 1248, 1257, 1258, 1249, 1249, 1258, 1259, 1250, 1250, 1259, 1260, 1251, 1251, 1260, 1261, 1252, 1252, 1261, 1262, 1253, 1253, 1262, 1263, 1254, 1254, 1263, 1264, 1256, 1265, 1266, 1257, 1257, 1266, 1267, 1258, 1258, 1267, 1268, 1259, 1259, 1268, 1269, 1260, 1260, 1269, 1270, 1261, 1261, 1270, 1271, 1262, 1262, 1271, 1272, 1263, 1263, 1272, 1273, 1265, 1274, 1275, 1266, 1266, 1275, 1276, 1267, 1267, 1276, 1277, 1268, 1268, 1277, 1278, 1269, 1269, 1278, 1279, 1270, 1270, 1279, 1280, 1271, 1271, 1280, 1281, 1272, 1272, 1281, 1282, 1274, 1283, 1284, 1275, 1275, 1284, 1285, 1276, 1276, 1285, 1286, 1277, 1277, 1286, 1287, 1278, 1278, 1287, 1288, 1279, 1279, 1288, 1289, 1280, 1280, 1289, 1290, 1281, 1281, 1290, 1291, 1292, 1301, 1302, 1293, 1293, 1302, 1303, 1294, 1294, 1303, 1304, 1295, 1295, 1304, 1305, 1296, 1296, 1305, 1306, 1297, 1297, 1306, 1307, 1298, 1298, 1307, 1308, 1299, 1299, 1308, 1309, 1300, 1301, 1310, 1311, 1302, 1302, 1311, 1312, 1303, 1303, 1312, 1313, 1304, 1304, 1313, 1314, 1305, 1305, 1314, 1315, 1306, 1306, 1315, 1316, 1307, 1307, 1316, 1317, 1308, 1308, 1317, 1318, 1309, 1310, 1319, 1320, 1311, 1311, 1320, 1321, 1312, 1312, 1321, 1322, 1313, 1313, 1322, 1323, 1314, 1314, 1323, 1324, 1315, 1315, 1324, 1325, 1316, 1316, 1325, 1326, 1317, 1317, 1326, 1327, 1318, 1319, 1328, 1329, 1320, 1320, 1329, 1330, 1321, 1321, 1330, 1331, 1322, 1322, 1331, 1332, 1323, 1323, 1332, 1333, 1324, 1324, 1333, 1334, 1325, 1325, 1334, 1335, 1326, 1326, 1335, 1336, 1327, 1328, 1337, 1338, 1329, 1329, 1338, 1339, 1330, 1330, 1339, 1340, 1331, 1331, 1340, 1341, 1332, 1332, 1341, 1342, 1333, 1333, 1342, 1343, 1334, 1334, 1343, 1344, 1335, 1335, 1344, 1345, 1336, 1337, 1346, 1347, 1338, 1338, 1347, 1348, 1339, 1339, 1348, 1349, 1340, 1340, 1349, 1350, 1341, 1341, 1350, 1351, 1342, 1342, 1351, 1352, 1343, 1343, 1352, 1353, 1344, 1344, 1353, 1354, 1345, 1346, 1355, 1356, 1347, 1347, 1356, 1357, 1348, 1348, 1357, 1358, 1349, 1349, 1358, 1359, 1350, 1350, 1359, 1360, 1351, 1351, 1360, 1361, 1352, 1352, 1361, 1362, 1353, 1353, 1362, 1363, 1354, 1355, 1364, 1365, 1356, 1356, 1365, 1366, 1357, 1357, 1366, 1367, 1358, 1358, 1367, 1368, 1359, 1359, 1368, 1369, 1360, 1360, 1369, 1370, 1361, 1361, 1370, 1371, 1362, 1362, 1371, 1372, 1363, 1373, 1382, 1383, 1374, 1374, 1383, 1384, 1375, 1375, 1384, 1385, 1376, 1376, 1385, 1386, 1377, 1377, 1386, 1387, 1378, 1378, 1387, 1388, 1379, 1379, 1388, 1389, 1380, 1380, 1389, 1390, 1381, 1382, 1391, 1392, 1383, 1383, 1392, 1393, 1384, 1384, 1393, 1394, 1385, 1385, 1394, 1395, 1386, 1386, 1395, 1396, 1387, 1387, 1396, 1397, 1388, 1388, 1397, 1398, 1389, 1389, 1398, 1399, 1390, 1391, 1400, 1401, 1392, 1392, 1401, 1402, 1393, 1393, 1402, 1403, 1394, 1394, 1403, 1404, 1395, 1395, 1404, 1405, 1396, 1396, 1405, 1406, 1397, 1397, 1406, 1407, 1398, 1398, 1407, 1408, 1399, 1400, 1409, 1410, 1401, 1401, 1410, 1411, 1402, 1402, 1411, 1412, 1403, 1403, 1412, 1413, 1404, 1404, 1413, 1414, 1405, 1405, 1414, 1415, 1406, 1406, 1415, 1416, 1407, 1407, 1416, 1417, 1408, 1409, 1418, 1419, 1410, 1410, 1419, 1420, 1411, 1411, 1420, 1421, 1412, 1412, 1421, 1422, 1413, 1413, 1422, 1423, 1414, 1414, 1423, 1424, 1415, 1415, 1424, 1425, 1416, 1416, 1425, 1426, 1417, 1418, 1427, 1428, 1419, 1419, 1428, 1429, 1420, 1420, 1429, 1430, 1421, 1421, 1430, 1431, 1422, 1422, 1431, 1432, 1423, 1423, 1432, 1433, 1424, 1424, 1433, 1434, 1425, 1425, 1434, 1435, 1426, 1427, 1436, 1437, 1428, 1428, 1437, 1438, 1429, 1429, 1438, 1439, 1430, 1430, 1439, 1440, 1431, 1431, 1440, 1441, 1432, 1432, 1441, 1442, 1433, 1433, 1442, 1443, 1434, 1434, 1443, 1444, 1435, 1436, 1445, 1446, 1437, 1437, 1446, 1447, 1438, 1438, 1447, 1448, 1439, 1439, 1448, 1449, 1440, 1440, 1449, 1450, 1441, 1441, 1450, 1451, 1442, 1442, 1451, 1452, 1443, 1443, 1452, 1453, 1444, 1454, 1463, 1464, 1455, 1455, 1464, 1465, 1456, 1456, 1465, 1466, 1457, 1457, 1466, 1467, 1458, 1458, 1467, 1468, 1459, 1459, 1468, 1469, 1460, 1460, 1469, 1470, 1461, 1461, 1470, 1471, 1462, 1463, 1472, 1473, 1464, 1464, 1473, 1474, 1465, 1465, 1474, 1475, 1466, 1466, 1475, 1476, 1467, 1467, 1476, 1477, 1468, 1468, 1477, 1478, 1469, 1469, 1478, 1479, 1470, 1470, 1479, 1480, 1471, 1472, 1481, 1482, 1473, 1473, 1482, 1483, 1474, 1474, 1483, 1484, 1475, 1475, 1484, 1485, 1476, 1476, 1485, 1486, 1477, 1477, 1486, 1487, 1478, 1478, 1487, 1488, 1479, 1479, 1488, 1489, 1480, 1481, 1490, 1491, 1482, 1482, 1491, 1492, 1483, 1483, 1492, 1493, 1484, 1484, 1493, 1494, 1485, 1485, 1494, 1495, 1486, 1486, 1495, 1496, 1487, 1487, 1496, 1497, 1488, 1488, 1497, 1498, 1489, 1490, 1499, 1500, 1491, 1491, 1500, 1501, 1492, 1492, 1501, 1502, 1493, 1493, 1502, 1503, 1494, 1494, 1503, 1504, 1495, 1495, 1504, 1505, 1496, 1496, 1505, 1506, 1497, 1497, 1506, 1507, 1498, 1499, 1508, 1509, 1500, 1500, 1509, 1510, 1501, 1501, 1510, 1511, 1502, 1502, 1511, 1512, 1503, 1503, 1512, 1513, 1504, 1504, 1513, 1514, 1505, 1505, 1514, 1515, 1506, 1506, 1515, 1516, 1507, 1508, 1517, 1518, 1509, 1509, 1518, 1519, 1510, 1510, 1519, 1520, 1511, 1511, 1520, 1521, 1512, 1512, 1521, 1522, 1513, 1513, 1522, 1523, 1514, 1514, 1523, 1524, 1515, 1515, 1524, 1525, 1516, 1517, 1526, 1527, 1518, 1518, 1527, 1528, 1519, 1519, 1528, 1529, 1520, 1520, 1529, 1530, 1521, 1521, 1530, 1531, 1522, 1522, 1531, 1532, 1523, 1523, 1532, 1533, 1524, 1524, 1533, 1534, 1525, 1535, 1544, 1545, 1536, 1536, 1545, 1546, 1537, 1537, 1546, 1547, 1538, 1538, 1547, 1548, 1539, 1539, 1548, 1549, 1540, 1540, 1549, 1550, 1541, 1541, 1550, 1551, 1542, 1542, 1551, 1552, 1543, 1544, 1553, 1554, 1545, 1545, 1554, 1555, 1546, 1546, 1555, 1556, 1547, 1547, 1556, 1557, 1548, 1548, 1557, 1558, 1549, 1549, 1558, 1559, 1550, 1550, 1559, 1560, 1551, 1551, 1560, 1561, 1552, 1553, 1562, 1563, 1554, 1554, 1563, 1564, 1555, 1555, 1564, 1565, 1556, 1556, 1565, 1566, 1557, 1557, 1566, 1567, 1558, 1558, 1567, 1568, 1559, 1559, 1568, 1569, 1560, 1560, 1569, 1570, 1561, 1562, 1571, 1572, 1563, 1563, 1572, 1573, 1564, 1564, 1573, 1574, 1565, 1565, 1574, 1575, 1566, 1566, 1575, 1576, 1567, 1567, 1576, 1577, 1568, 1568, 1577, 1578, 1569, 1569, 1578, 1579, 1570, 1571, 1580, 1581, 1572, 1572, 1581, 1582, 1573, 1573, 1582, 1583, 1574, 1574, 1583, 1584, 1575, 1575, 1584, 1585, 1576, 1576, 1585, 1586, 1577, 1577, 1586, 1587, 1578, 1578, 1587, 1588, 1579, 1580, 1589, 1590, 1581, 1581, 1590, 1591, 1582, 1582, 1591, 1592, 1583, 1583, 1592, 1593, 1584, 1584, 1593, 1594, 1585, 1585, 1594, 1595, 1586, 1586, 1595, 1596, 1587, 1587, 1596, 1597, 1588, 1589, 1598, 1599, 1590, 1590, 1599, 1600, 1591, 1591, 1600, 1601, 1592, 1592, 1601, 1602, 1593, 1593, 1602, 1603, 1594, 1594, 1603, 1604, 1595, 1595, 1604, 1605, 1596, 1596, 1605, 1606, 1597, 1598, 1607, 1608, 1599, 1599, 1608, 1609, 1600, 1600, 1609, 1610, 1601, 1601, 1610, 1611, 1602, 1602, 1611, 1612, 1603, 1603, 1612, 1613, 1604, 1604, 1613, 1614, 1605, 1605, 1614, 1615, 1606, 1616, 1625, 1626, 1617, 1617, 1626, 1627, 1618, 1618, 1627, 1628, 1619, 1619, 1628, 1629, 1620, 1620, 1629, 1630, 1621, 1621, 1630, 1631, 1622, 1622, 1631, 1632, 1623, 1623, 1632, 1633, 1624, 1625, 1634, 1635, 1626, 1626, 1635, 1636, 1627, 1627, 1636, 1637, 1628, 1628, 1637, 1638, 1629, 1629, 1638, 1639, 1630, 1630, 1639, 1640, 1631, 1631, 1640, 1641, 1632, 1632, 1641, 1642, 1633, 1634, 1643, 1644, 1635, 1635, 1644, 1645, 1636, 1636, 1645, 1646, 1637, 1637, 1646, 1647, 1638, 1638, 1647, 1648, 1639, 1639, 1648, 1649, 1640, 1640, 1649, 1650, 1641, 1641, 1650, 1651, 1642, 1643, 1652, 1653, 1644, 1644, 1653, 1654, 1645, 1645, 1654, 1655, 1646, 1646, 1655, 1656, 1647, 1647, 1656, 1657, 1648, 1648, 1657, 1658, 1649, 1649, 1658, 1659, 1650, 1650, 1659, 1660, 1651, 1652, 1661, 1662, 1653, 1653, 1662, 1663, 1654, 1654, 1663, 1664, 1655, 1655, 1664, 1665, 1656, 1656, 1665, 1666, 1657, 1657, 1666, 1667, 1658, 1658, 1667, 1668, 1659, 1659, 1668, 1669, 1660, 1661, 1670, 1671, 1662, 1662, 1671, 1672, 1663, 1663, 1672, 1673, 1664, 1664, 1673, 1674, 1665, 1665, 1674, 1675, 1666, 1666, 1675, 1676, 1667, 1667, 1676, 1677, 1668, 1668, 1677, 1678, 1669, 1670, 1679, 1680, 1671, 1671, 1680, 1681, 1672, 1672, 1681, 1682, 1673, 1673, 1682, 1683, 1674, 1674, 1683, 1684, 1675, 1675, 1684, 1685, 1676, 1676, 1685, 1686, 1677, 1677, 1686, 1687, 1678, 1679, 1688, 1689, 1680, 1680, 1689, 1690, 1681, 1681, 1690, 1691, 1682, 1682, 1691, 1692, 1683, 1683, 1692, 1693, 1684, 1684, 1693, 1694, 1685, 1685, 1694, 1695, 1686, 1686, 1695, 1696, 1687, 1697, 1706, 1707, 1698, 1698, 1707, 1708, 1699, 1699, 1708, 1709, 1700, 1700, 1709, 1710, 1701, 1701, 1710, 1711, 1702, 1702, 1711, 1712, 1703, 1703, 1712, 1713, 1704, 1704, 1713, 1714, 1705, 1706, 1715, 1716, 1707, 1707, 1716, 1717, 1708, 1708, 1717, 1718, 1709, 1709, 1718, 1719, 1710, 1710, 1719, 1720, 1711, 1711, 1720, 1721, 1712, 1712, 1721, 1722, 1713, 1713, 1722, 1723, 1714, 1715, 1724, 1725, 1716, 1716, 1725, 1726, 1717, 1717, 1726, 1727, 1718, 1718, 1727, 1728, 1719, 1719, 1728, 1729, 1720, 1720, 1729, 1730, 1721, 1721, 1730, 1731, 1722, 1722, 1731, 1732, 1723, 1724, 1733, 1734, 1725, 1725, 1734, 1735, 1726, 1726, 1735, 1736, 1727, 1727, 1736, 1737, 1728, 1728, 1737, 1738, 1729, 1729, 1738, 1739, 1730, 1730, 1739, 1740, 1731, 1731, 1740, 1741, 1732, 1733, 1742, 1743, 1734, 1734, 1743, 1744, 1735, 1735, 1744, 1745, 1736, 1736, 1745, 1746, 1737, 1737, 1746, 1747, 1738, 1738, 1747, 1748, 1739, 1739, 1748, 1749, 1740, 1740, 1749, 1750, 1741, 1742, 1751, 1752, 1743, 1743, 1752, 1753, 1744, 1744, 1753, 1754, 1745, 1745, 1754, 1755, 1746, 1746, 1755, 1756, 1747, 1747, 1756, 1757, 1748, 1748, 1757, 1758, 1749, 1749, 1758, 1759, 1750, 1751, 1760, 1761, 1752, 1752, 1761, 1762, 1753, 1753, 1762, 1763, 1754, 1754, 1763, 1764, 1755, 1755, 1764, 1765, 1756, 1756, 1765, 1766, 1757, 1757, 1766, 1767, 1758, 1758, 1767, 1768, 1759, 1760, 1769, 1770, 1761, 1761, 1770, 1771, 1762, 1762, 1771, 1772, 1763, 1763, 1772, 1773, 1764, 1764, 1773, 1774, 1765, 1765, 1774, 1775, 1766, 1766, 1775, 1776, 1767, 1767, 1776, 1777, 1768, 1778, 1787, 1788, 1779, 1779, 1788, 1789, 1780, 1780, 1789, 1790, 1781, 1781, 1790, 1791, 1782, 1782, 1791, 1792, 1783, 1783, 1792, 1793, 1784, 1784, 1793, 1794, 1785, 1785, 1794, 1795, 1786, 1787, 1796, 1797, 1788, 1788, 1797, 1798, 1789, 1789, 1798, 1799, 1790, 1790, 1799, 1800, 1791, 1791, 1800, 1801, 1792, 1792, 1801, 1802, 1793, 1793, 1802, 1803, 1794, 1794, 1803, 1804, 1795, 1796, 1805, 1806, 1797, 1797, 1806, 1807, 1798, 1798, 1807, 1808, 1799, 1799, 1808, 1809, 1800, 1800, 1809, 1810, 1801, 1801, 1810, 1811, 1802, 1802, 1811, 1812, 1803, 1803, 1812, 1813, 1804, 1805, 1814, 1815, 1806, 1806, 1815, 1816, 1807, 1807, 1816, 1817, 1808, 1808, 1817, 1818, 1809, 1809, 1818, 1819, 1810, 1810, 1819, 1820, 1811, 1811, 1820, 1821, 1812, 1812, 1821, 1822, 1813, 1814, 1823, 1824, 1815, 1815, 1824, 1825, 1816, 1816, 1825, 1826, 1817, 1817, 1826, 1827, 1818, 1818, 1827, 1828, 1819, 1819, 1828, 1829, 1820, 1820, 1829, 1830, 1821, 1821, 1830, 1831, 1822, 1823, 1832, 1833, 1824, 1824, 1833, 1834, 1825, 1825, 1834, 1835, 1826, 1826, 1835, 1836, 1827, 1827, 1836, 1837, 1828, 1828, 1837, 1838, 1829, 1829, 1838, 1839, 1830, 1830, 1839, 1840, 1831, 1832, 1841, 1842, 1833, 1833, 1842, 1843, 1834, 1834, 1843, 1844, 1835, 1835, 1844, 1845, 1836, 1836, 1845, 1846, 1837, 1837, 1846, 1847, 1838, 1838, 1847, 1848, 1839, 1839, 1848, 1849, 1840, 1841, 1850, 1851, 1842, 1842, 1851, 1852, 1843, 1843, 1852, 1853, 1844, 1844, 1853, 1854, 1845, 1845, 1854, 1855, 1846, 1846, 1855, 1856, 1847, 1847, 1856, 1857, 1848, 1848, 1857, 1858, 1849, 1859, 1868, 1869, 1860, 1860, 1869, 1870, 1861, 1861, 1870, 1871, 1862, 1862, 1871, 1872, 1863, 1863, 1872, 1873, 1864, 1864, 1873, 1874, 1865, 1865, 1874, 1875, 1866, 1866, 1875, 1876, 1867, 1868, 1877, 1878, 1869, 1869, 1878, 1879, 1870, 1870, 1879, 1880, 1871, 1871, 1880, 1881, 1872, 1872, 1881, 1882, 1873, 1873, 1882, 1883, 1874, 1874, 1883, 1884, 1875, 1875, 1884, 1885, 1876, 1877, 1886, 1887, 1878, 1878, 1887, 1888, 1879, 1879, 1888, 1889, 1880, 1880, 1889, 1890, 1881, 1881, 1890, 1891, 1882, 1882, 1891, 1892, 1883, 1883, 1892, 1893, 1884, 1884, 1893, 1894, 1885, 1886, 1895, 1896, 1887, 1887, 1896, 1897, 1888, 1888, 1897, 1898, 1889, 1889, 1898, 1899, 1890, 1890, 1899, 1900, 1891, 1891, 1900, 1901, 1892, 1892, 1901, 1902, 1893, 1893, 1902, 1903, 1894, 1895, 1904, 1905, 1896, 1896, 1905, 1906, 1897, 1897, 1906, 1907, 1898, 1898, 1907, 1908, 1899, 1899, 1908, 1909, 1900, 1900, 1909, 1910, 1901, 1901, 1910, 1911, 1902, 1902, 1911, 1912, 1903, 1904, 1913, 1914, 1905, 1905, 1914, 1915, 1906, 1906, 1915, 1916, 1907, 1907, 1916, 1917, 1908, 1908, 1917, 1918, 1909, 1909, 1918, 1919, 1910, 1910, 1919, 1920, 1911, 1911, 1920, 1921, 1912, 1913, 1922, 1923, 1914, 1914, 1923, 1924, 1915, 1915, 1924, 1925, 1916, 1916, 1925, 1926, 1917, 1917, 1926, 1927, 1918, 1918, 1927, 1928, 1919, 1919, 1928, 1929, 1920, 1920, 1929, 1930, 1921, 1922, 1931, 1932, 1923, 1923, 1932, 1933, 1924, 1924, 1933, 1934, 1925, 1925, 1934, 1935, 1926, 1926, 1935, 1936, 1927, 1927, 1936, 1937, 1928, 1928, 1937, 1938, 1929, 1929, 1938, 1939, 1930, 1950, 1941, 1940, 1941, 1950, 1951, 1942, 1942, 1951, 1952, 1943, 1943, 1952, 1953, 1944, 1944, 1953, 1954, 1945, 1945, 1954, 1955, 1946, 1946, 1955, 1956, 1947, 1947, 1956, 1957, 1948, 1959, 1950, 1949, 1950, 1959, 1960, 1951, 1951, 1960, 1961, 1952, 1952, 1961, 1962, 1953, 1953, 1962, 1963, 1954, 1954, 1963, 1964, 1955, 1955, 1964, 1965, 1956, 1956, 1965, 1966, 1957, 1968, 1959, 1958, 1959, 1968, 1969, 1960, 1960, 1969, 1970, 1961, 1961, 1970, 1971, 1962, 1962, 1971, 1972, 1963, 1963, 1972, 1973, 1964, 1964, 1973, 1974, 1965, 1965, 1974, 1975, 1966, 1977, 1968, 1967, 1968, 1977, 1978, 1969, 1969, 1978, 1979, 1970, 1970, 1979, 1980, 1971, 1971, 1980, 1981, 1972, 1972, 1981, 1982, 1973, 1973, 1982, 1983, 1974, 1974, 1983, 1984, 1975, 1986, 1977, 1976, 1977, 1986, 1987, 1978, 1978, 1987, 1988, 1979, 1979, 1988, 1989, 1980, 1980, 1989, 1990, 1981, 1981, 1990, 1991, 1982, 1982, 1991, 1992, 1983, 1983, 1992, 1993, 1984, 1995, 1986, 1985, 1986, 1995, 1996, 1987, 1987, 1996, 1997, 1988, 1988, 1997, 1998, 1989, 1989, 1998, 1999, 1990, 1990, 1999, 2000, 1991, 1991, 2000, 2001, 1992, 1992, 2001, 2002, 1993, 2004, 1995, 1994, 1995, 2004, 2005, 1996, 1996, 2005, 2006, 1997, 1997, 2006, 2007, 1998, 1998, 2007, 2008, 1999, 1999, 2008, 2009, 2000, 2000, 2009, 2010, 2001, 2001, 2010, 2011, 2002, 2012, 2004, 2003, 2004, 2012, 2013, 2005, 2005, 2013, 2014, 2006, 2006, 2014, 2015, 2007, 2007, 2015, 2016, 2008, 2008, 2016, 2017, 2009, 2009, 2017, 2018, 2010, 2010, 2018, 2019, 2011, 2030, 2021, 2020, 2021, 2030, 2031, 2022, 2022, 2031, 2032, 2023, 2023, 2032, 2033, 2024, 2024, 2033, 2034, 2025, 2025, 2034, 2035, 2026, 2026, 2035, 2036, 2027, 2027, 2036, 2037, 2028, 2039, 2030, 2029, 2030, 2039, 2040, 2031, 2031, 2040, 2041, 2032, 2032, 2041, 2042, 2033, 2033, 2042, 2043, 2034, 2034, 2043, 2044, 2035, 2035, 2044, 2045, 2036, 2036, 2045, 2046, 2037, 2048, 2039, 2038, 2039, 2048, 2049, 2040, 2040, 2049, 2050, 2041, 2041, 2050, 2051, 2042, 2042, 2051, 2052, 2043, 2043, 2052, 2053, 2044, 2044, 2053, 2054, 2045, 2045, 2054, 2055, 2046, 2057, 2048, 2047, 2048, 2057, 2058, 2049, 2049, 2058, 2059, 2050, 2050, 2059, 2060, 2051, 2051, 2060, 2061, 2052, 2052, 2061, 2062, 2053, 2053, 2062, 2063, 2054, 2054, 2063, 2064, 2055, 2066, 2057, 2056, 2057, 2066, 2067, 2058, 2058, 2067, 2068, 2059, 2059, 2068, 2069, 2060, 2060, 2069, 2070, 2061, 2061, 2070, 2071, 2062, 2062, 2071, 2072, 2063, 2063, 2072, 2073, 2064, 2075, 2066, 2065, 2066, 2075, 2076, 2067, 2067, 2076, 2077, 2068, 2068, 2077, 2078, 2069, 2069, 2078, 2079, 2070, 2070, 2079, 2080, 2071, 2071, 2080, 2081, 2072, 2072, 2081, 2082, 2073, 2084, 2075, 2074, 2075, 2084, 2085, 2076, 2076, 2085, 2086, 2077, 2077, 2086, 2087, 2078, 2078, 2087, 2088, 2079, 2079, 2088, 2089, 2080, 2080, 2089, 2090, 2081, 2081, 2090, 2091, 2082, 2092, 2084, 2083, 2084, 2092, 2093, 2085, 2085, 2093, 2094, 2086, 2086, 2094, 2095, 2087, 2087, 2095, 2096, 2088, 2088, 2096, 2097, 2089, 2089, 2097, 2098, 2090, 2090, 2098, 2099, 2091, 2110, 2101, 2100, 2101, 2110, 2111, 2102, 2102, 2111, 2112, 2103, 2103, 2112, 2113, 2104, 2104, 2113, 2114, 2105, 2105, 2114, 2115, 2106, 2106, 2115, 2116, 2107, 2107, 2116, 2117, 2108, 2119, 2110, 2109, 2110, 2119, 2120, 2111, 2111, 2120, 2121, 2112, 2112, 2121, 2122, 2113, 2113, 2122, 2123, 2114, 2114, 2123, 2124, 2115, 2115, 2124, 2125, 2116, 2116, 2125, 2126, 2117, 2128, 2119, 2118, 2119, 2128, 2129, 2120, 2120, 2129, 2130, 2121, 2121, 2130, 2131, 2122, 2122, 2131, 2132, 2123, 2123, 2132, 2133, 2124, 2124, 2133, 2134, 2125, 2125, 2134, 2135, 2126, 2137, 2128, 2127, 2128, 2137, 2138, 2129, 2129, 2138, 2139, 2130, 2130, 2139, 2140, 2131, 2131, 2140, 2141, 2132, 2132, 2141, 2142, 2133, 2133, 2142, 2143, 2134, 2134, 2143, 2144, 2135, 2146, 2137, 2136, 2137, 2146, 2147, 2138, 2138, 2147, 2148, 2139, 2139, 2148, 2149, 2140, 2140, 2149, 2150, 2141, 2141, 2150, 2151, 2142, 2142, 2151, 2152, 2143, 2143, 2152, 2153, 2144, 2155, 2146, 2145, 2146, 2155, 2156, 2147, 2147, 2156, 2157, 2148, 2148, 2157, 2158, 2149, 2149, 2158, 2159, 2150, 2150, 2159, 2160, 2151, 2151, 2160, 2161, 2152, 2152, 2161, 2162, 2153, 2164, 2155, 2154, 2155, 2164, 2165, 2156, 2156, 2165, 2166, 2157, 2157, 2166, 2167, 2158, 2158, 2167, 2168, 2159, 2159, 2168, 2169, 2160, 2160, 2169, 2170, 2161, 2161, 2170, 2171, 2162, 2172, 2164, 2163, 2164, 2172, 2173, 2165, 2165, 2173, 2174, 2166, 2166, 2174, 2175, 2167, 2167, 2175, 2176, 2168, 2168, 2176, 2177, 2169, 2169, 2177, 2178, 2170, 2170, 2178, 2179, 2171, 2190, 2181, 2180, 2181, 2190, 2191, 2182, 2182, 2191, 2192, 2183, 2183, 2192, 2193, 2184, 2184, 2193, 2194, 2185, 2185, 2194, 2195, 2186, 2186, 2195, 2196, 2187, 2187, 2196, 2197, 2188, 2199, 2190, 2189, 2190, 2199, 2200, 2191, 2191, 2200, 2201, 2192, 2192, 2201, 2202, 2193, 2193, 2202, 2203, 2194, 2194, 2203, 2204, 2195, 2195, 2204, 2205, 2196, 2196, 2205, 2206, 2197, 2208, 2199, 2198, 2199, 2208, 2209, 2200, 2200, 2209, 2210, 2201, 2201, 2210, 2211, 2202, 2202, 2211, 2212, 2203, 2203, 2212, 2213, 2204, 2204, 2213, 2214, 2205, 2205, 2214, 2215, 2206, 2217, 2208, 2207, 2208, 2217, 2218, 2209, 2209, 2218, 2219, 2210, 2210, 2219, 2220, 2211, 2211, 2220, 2221, 2212, 2212, 2221, 2222, 2213, 2213, 2222, 2223, 2214, 2214, 2223, 2224, 2215, 2226, 2217, 2216, 2217, 2226, 2227, 2218, 2218, 2227, 2228, 2219, 2219, 2228, 2229, 2220, 2220, 2229, 2230, 2221, 2221, 2230, 2231, 2222, 2222, 2231, 2232, 2223, 2223, 2232, 2233, 2224, 2235, 2226, 2225, 2226, 2235, 2236, 2227, 2227, 2236, 2237, 2228, 2228, 2237, 2238, 2229, 2229, 2238, 2239, 2230, 2230, 2239, 2240, 2231, 2231, 2240, 2241, 2232, 2232, 2241, 2242, 2233, 2244, 2235, 2234, 2235, 2244, 2245, 2236, 2236, 2245, 2246, 2237, 2237, 2246, 2247, 2238, 2238, 2247, 2248, 2239, 2239, 2248, 2249, 2240, 2240, 2249, 2250, 2241, 2241, 2250, 2251, 2242, 2252, 2244, 2243, 2244, 2252, 2253, 2245, 2245, 2253, 2254, 2246, 2246, 2254, 2255, 2247, 2247, 2255, 2256, 2248, 2248, 2256, 2257, 2249, 2249, 2257, 2258, 2250, 2250, 2258, 2259, 2251, 2260, 2269, 2270, 2261, 2261, 2270, 2271, 2262, 2262, 2271, 2272, 2263, 2263, 2272, 2273, 2264, 2264, 2273, 2274, 2265, 2265, 2274, 2275, 2266, 2266, 2275, 2276, 2267, 2267, 2276, 2277, 2268, 2269, 2278, 2279, 2270, 2270, 2279, 2280, 2271, 2271, 2280, 2281, 2272, 2272, 2281, 2282, 2273, 2273, 2282, 2283, 2274, 2274, 2283, 2284, 2275, 2275, 2284, 2285, 2276, 2276, 2285, 2286, 2277, 2278, 2287, 2288, 2279, 2279, 2288, 2289, 2280, 2280, 2289, 2290, 2281, 2281, 2290, 2291, 2282, 2282, 2291, 2292, 2283, 2283, 2292, 2293, 2284, 2284, 2293, 2294, 2285, 2285, 2294, 2295, 2286, 2287, 2296, 2297, 2288, 2288, 2297, 2298, 2289, 2289, 2298, 2299, 2290, 2290, 2299, 2300, 2291, 2291, 2300, 2301, 2292, 2292, 2301, 2302, 2293, 2293, 2302, 2303, 2294, 2294, 2303, 2304, 2295, 2296, 2305, 2306, 2297, 2297, 2306, 2307, 2298, 2298, 2307, 2308, 2299, 2299, 2308, 2309, 2300, 2300, 2309, 2310, 2301, 2301, 2310, 2311, 2302, 2302, 2311, 2312, 2303, 2303, 2312, 2313, 2304, 2305, 2314, 2315, 2306, 2306, 2315, 2316, 2307, 2307, 2316, 2317, 2308, 2308, 2317, 2318, 2309, 2309, 2318, 2319, 2310, 2310, 2319, 2320, 2311, 2311, 2320, 2321, 2312, 2312, 2321, 2322, 2313, 2314, 2323, 2324, 2315, 2315, 2324, 2325, 2316, 2316, 2325, 2326, 2317, 2317, 2326, 2327, 2318, 2318, 2327, 2328, 2319, 2319, 2328, 2329, 2320, 2320, 2329, 2330, 2321, 2321, 2330, 2331, 2322, 2323, 2332, 2333, 2324, 2324, 2333, 2334, 2325, 2325, 2334, 2335, 2326, 2326, 2335, 2336, 2327, 2327, 2336, 2337, 2328, 2328, 2337, 2338, 2329, 2329, 2338, 2339, 2330, 2330, 2339, 2340, 2331, 2341, 2350, 2351, 2342, 2342, 2351, 2352, 2343, 2343, 2352, 2353, 2344, 2344, 2353, 2354, 2345, 2345, 2354, 2355, 2346, 2346, 2355, 2356, 2347, 2347, 2356, 2357, 2348, 2348, 2357, 2358, 2349, 2350, 2359, 2360, 2351, 2351, 2360, 2361, 2352, 2352, 2361, 2362, 2353, 2353, 2362, 2363, 2354, 2354, 2363, 2364, 2355, 2355, 2364, 2365, 2356, 2356, 2365, 2366, 2357, 2357, 2366, 2367, 2358, 2359, 2368, 2369, 2360, 2360, 2369, 2370, 2361, 2361, 2370, 2371, 2362, 2362, 2371, 2372, 2363, 2363, 2372, 2373, 2364, 2364, 2373, 2374, 2365, 2365, 2374, 2375, 2366, 2366, 2375, 2376, 2367, 2368, 2377, 2378, 2369, 2369, 2378, 2379, 2370, 2370, 2379, 2380, 2371, 2371, 2380, 2381, 2372, 2372, 2381, 2382, 2373, 2373, 2382, 2383, 2374, 2374, 2383, 2384, 2375, 2375, 2384, 2385, 2376, 2377, 2386, 2387, 2378, 2378, 2387, 2388, 2379, 2379, 2388, 2389, 2380, 2380, 2389, 2390, 2381, 2381, 2390, 2391, 2382, 2382, 2391, 2392, 2383, 2383, 2392, 2393, 2384, 2384, 2393, 2394, 2385, 2386, 2395, 2396, 2387, 2387, 2396, 2397, 2388, 2388, 2397, 2398, 2389, 2389, 2398, 2399, 2390, 2390, 2399, 2400, 2391, 2391, 2400, 2401, 2392, 2392, 2401, 2402, 2393, 2393, 2402, 2403, 2394, 2395, 2404, 2405, 2396, 2396, 2405, 2406, 2397, 2397, 2406, 2407, 2398, 2398, 2407, 2408, 2399, 2399, 2408, 2409, 2400, 2400, 2409, 2410, 2401, 2401, 2410, 2411, 2402, 2402, 2411, 2412, 2403, 2404, 2413, 2414, 2405, 2405, 2414, 2415, 2406, 2406, 2415, 2416, 2407, 2407, 2416, 2417, 2408, 2408, 2417, 2418, 2409, 2409, 2418, 2419, 2410, 2410, 2419, 2420, 2411, 2411, 2420, 2421, 2412, 2422, 2431, 2432, 2423, 2423, 2432, 2433, 2424, 2424, 2433, 2434, 2425, 2425, 2434, 2435, 2426, 2426, 2435, 2436, 2427, 2427, 2436, 2437, 2428, 2428, 2437, 2438, 2429, 2429, 2438, 2439, 2430, 2431, 2440, 2441, 2432, 2432, 2441, 2442, 2433, 2433, 2442, 2443, 2434, 2434, 2443, 2444, 2435, 2435, 2444, 2445, 2436, 2436, 2445, 2446, 2437, 2437, 2446, 2447, 2438, 2438, 2447, 2448, 2439, 2440, 2449, 2450, 2441, 2441, 2450, 2451, 2442, 2442, 2451, 2452, 2443, 2443, 2452, 2453, 2444, 2444, 2453, 2454, 2445, 2445, 2454, 2455, 2446, 2446, 2455, 2456, 2447, 2447, 2456, 2457, 2448, 2449, 2458, 2459, 2450, 2450, 2459, 2460, 2451, 2451, 2460, 2461, 2452, 2452, 2461, 2462, 2453, 2453, 2462, 2463, 2454, 2454, 2463, 2464, 2455, 2455, 2464, 2465, 2456, 2456, 2465, 2466, 2457, 2458, 2467, 2468, 2459, 2459, 2468, 2469, 2460, 2460, 2469, 2470, 2461, 2461, 2470, 2471, 2462, 2462, 2471, 2472, 2463, 2463, 2472, 2473, 2464, 2464, 2473, 2474, 2465, 2465, 2474, 2475, 2466, 2467, 2476, 2477, 2468, 2468, 2477, 2478, 2469, 2469, 2478, 2479, 2470, 2470, 2479, 2480, 2471, 2471, 2480, 2481, 2472, 2472, 2481, 2482, 2473, 2473, 2482, 2483, 2474, 2474, 2483, 2484, 2475, 2476, 2485, 2486, 2477, 2477, 2486, 2487, 2478, 2478, 2487, 2488, 2479, 2479, 2488, 2489, 2480, 2480, 2489, 2490, 2481, 2481, 2490, 2491, 2482, 2482, 2491, 2492, 2483, 2483, 2492, 2493, 2484, 2485, 2494, 2495, 2486, 2486, 2495, 2496, 2487, 2487, 2496, 2497, 2488, 2488, 2497, 2498, 2489, 2489, 2498, 2499, 2490, 2490, 2499, 2500, 2491, 2491, 2500, 2501, 2492, 2492, 2501, 2502, 2493, 2503, 2512, 2513, 2504, 2504, 2513, 2514, 2505, 2505, 2514, 2515, 2506, 2506, 2515, 2516, 2507, 2507, 2516, 2517, 2508, 2508, 2517, 2518, 2509, 2509, 2518, 2519, 2510, 2510, 2519, 2520, 2511, 2512, 2521, 2522, 2513, 2513, 2522, 2523, 2514, 2514, 2523, 2524, 2515, 2515, 2524, 2525, 2516, 2516, 2525, 2526, 2517, 2517, 2526, 2527, 2518, 2518, 2527, 2528, 2519, 2519, 2528, 2529, 2520, 2521, 2530, 2531, 2522, 2522, 2531, 2532, 2523, 2523, 2532, 2533, 2524, 2524, 2533, 2534, 2525, 2525, 2534, 2535, 2526, 2526, 2535, 2536, 2527, 2527, 2536, 2537, 2528, 2528, 2537, 2538, 2529, 2530, 2539, 2540, 2531, 2531, 2540, 2541, 2532, 2532, 2541, 2542, 2533, 2533, 2542, 2543, 2534, 2534, 2543, 2544, 2535, 2535, 2544, 2545, 2536, 2536, 2545, 2546, 2537, 2537, 2546, 2547, 2538, 2539, 2548, 2549, 2540, 2540, 2549, 2550, 2541, 2541, 2550, 2551, 2542, 2542, 2551, 2552, 2543, 2543, 2552, 2553, 2544, 2544, 2553, 2554, 2545, 2545, 2554, 2555, 2546, 2546, 2555, 2556, 2547, 2548, 2557, 2558, 2549, 2549, 2558, 2559, 2550, 2550, 2559, 2560, 2551, 2551, 2560, 2561, 2552, 2552, 2561, 2562, 2553, 2553, 2562, 2563, 2554, 2554, 2563, 2564, 2555, 2555, 2564, 2565, 2556, 2557, 2566, 2567, 2558, 2558, 2567, 2568, 2559, 2559, 2568, 2569, 2560, 2560, 2569, 2570, 2561, 2561, 2570, 2571, 2562, 2562, 2571, 2572, 2563, 2563, 2572, 2573, 2564, 2564, 2573, 2574, 2565, 2566, 2575, 2576, 2567, 2567, 2576, 2577, 2568, 2568, 2577, 2578, 2569, 2569, 2578, 2579, 2570, 2570, 2579, 2580, 2571, 2571, 2580, 2581, 2572, 2572, 2581, 2582, 2573, 2573, 2582, 2583, 2574] + uniform token subdivisionScheme = "none" + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 0, -1, 0), (0, 1, 0, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/particles/baseVFX.usda b/project_templates/sample_scene/content/particles/baseVFX.usda new file mode 100644 index 00000000..afa07ed1 --- /dev/null +++ b/project_templates/sample_scene/content/particles/baseVFX.usda @@ -0,0 +1,12 @@ +#usda 1.0 +( + defaultPrim = "VFX" +) + +def VFXInstance "VFX" +{ + double3 direction = (0, 1, 0) + double2 pullSpeed = (0.20000000298023224, 0.20000000298023224) + double2 rotationSpeed = (0.20000000298023224, 0.20000000298023224) +} + diff --git a/project_templates/sample_scene/content/physics/default-physmat.usda b/project_templates/sample_scene/content/physics/default-physmat.usda new file mode 100644 index 00000000..166e03c1 --- /dev/null +++ b/project_templates/sample_scene/content/physics/default-physmat.usda @@ -0,0 +1,10 @@ +#usda 1.0 +( + defaultPrim = "PhysicsMaterial" +) + +def PhysicsMaterial "PhysicsMaterial" +{ + string materialName = "Default" +} + diff --git a/project_templates/sample_scene/content/scenes/main.nausd_scene b/project_templates/sample_scene/content/scenes/main.nausd_scene new file mode 100644 index 00000000..beeca88b --- /dev/null +++ b/project_templates/sample_scene/content/scenes/main.nausd_scene @@ -0,0 +1,80 @@ +#nausd_scene 1.0 + +def "NauAssetMesh" ( + displayName = "Plane" + prepend references = @../meshes/plane.usda.nausd@ +) +{ + asset Material:assign = @../materials/Black.nausd@ + matrix4d xformOp:transform = ( (4, 0, 0, 0), (0, 1, 0, 0), (0, 0, 4, 0), (0, -1.6799999475479126, -3.0399999618530273, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} + +def "NauAssetMesh1" ( + displayName = "ITMO" + prepend references = @../meshes/itmo.usd.nausd@ +) +{ + asset Material:assign = @../materials/White.nausd@ + matrix4d xformOp:transform = ( (-6.556707887739321e-8, -1.5, 0, 0), (-1.5, 6.556707887739321e-8, 1.3113415775478643e-7, 0), (-1.3113415775478643e-7, 5.732056607252352e-15, -1.5, 0), (3, 0.31662893295288086, -7.044347763061523, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} + +def NauComponent "nau__scene__DirectionalLightComponent" ( + displayName = "DirectionalLight" +) +{ + bool castShadows = 1 + float colorBlue = 1 + float colorGreen = 1 + float colorRed = 1 + custom string componentTypeName = "nau::scene::DirectionalLightComponent" + float intensity = 1 + string uid = "2ea1ce0b-4927-11f1-8ba0-d85ed3ae0e43" + matrix4d xformOp:transform = ( (0.6684818267822266, -0.743728518486023, 0, 0), (0.743728518486023, 0.6684818267822266, 0, 0), (0, 0, 1, 0), (-10, 8.316632270812988, -13.044347763061523, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} + +def "NauAssetMesh2" ( + displayName = "Cube" + prepend references = @../meshes/cube.usda.nausd@ +) +{ + matrix4d xformOp:transform = ( (0.9215924143791199, 0, -0.3881590664386749, 0), (0, 1, 0, 0), (0.3881590664386749, 0, 0.9215924143791199, 0), (-5, -1.68337082862854, -6.044347763061523, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + + def "NauAssetMesh" ( + displayName = "OtherCube" + prepend references = @../meshes/cube.usda.nausd@ + ) + { + asset Material:assign = @../materials/Black.nausd@ + matrix4d xformOp:transform = ( (0.1054065078496933, 0, 0.4887632131576538, 0), (0, 0.5, 0, 0), (-0.4887632131576538, -0, 0.1054065078496933, 0), (0, 1, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + } +} + +def "NauAssetMesh3" ( + displayName = "NauAssetMesh" + prepend references = @../meshes/sphere.usda.nausd@ +) +{ + asset Material:assign = @../materials/Rusted.nausd@ + matrix4d xformOp:transform = ( (-4.371138828673793e-8, 0, 1, 0), (0, 1, 0, 0), (-1, 0, -4.371138828673793e-8, 0), (5, -0.6833710670471191, -6.044347763061523, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + + def NauComponent "MyMover" ( + displayName = "MyMover" + kind = "component" + ) + { + float amplitude = 0.3 + string axis = "Y" + custom string componentTypeName = "MyMover" + float frequency = 2 + float phase = 0.5 + string uid = "306fdb04-492a-11f1-8ba0-d85ed3ae0e43" + matrix4d xformOp:transform = ( (-4.371138828673784e-8, 0, -0.999999999999998, 0), (0, 1, 0, 0), (0.999999999999998, 0, -4.371138828673784e-8, 0), (-5.911330955663584, -2.364340305328369, 5.058046346015125, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + } +} diff --git a/project_templates/sample_scene/content/shaders/include/ColorSpaceUtility.hlsl b/project_templates/sample_scene/content/shaders/include/ColorSpaceUtility.hlsl new file mode 100644 index 00000000..445d4bf1 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/ColorSpaceUtility.hlsl @@ -0,0 +1,161 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY +// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR +// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. +// +// Developed by Minigraph +// +// Author: James Stanard +// + +#pragma warning( disable : 3571 ) + +#ifndef __COLOR_SPACE_UTILITY_HLSLI__ +#define __COLOR_SPACE_UTILITY_HLSLI__ + +// +// Gamma ramps and encoding transfer functions +// +// Agnostic to color space though usually tightly coupled. For instance, sRGB is both a +// color space (defined by three basis vectors and a white point) and a gamma ramp. Gamma +// ramps are designed to reduce perceptual error when compressing floats to small integer +// values. More precision is needed in darker gradients as the human eye is more sensitive +// to contrast with dark values. A logarithmic curve is often used. +// + +// sRGB is both a color space and a transfer function or "gamma ramp". (It's not a true gamma +// curve, which have been deprecated along with CRT displays.) sRGB is what almost all 8 bpc +// textures use, and when passed to an LCD monitor they look right. sRGB textures must be +// linearized for physically correct rendering, and the linear results need to be re-encoded +// with the sRGB ramp for display. +float3 LinearToSRGB( float3 x ) +{ + // Approximately pow(x, 1.0 / 2.2) + return select(x < 0.0031308, 12.92 * x, 1.055 * pow(x, 1.0 / 2.4) - 0.055); +} + +float3 SRGBToLinear( float3 x ) +{ + // Approximately pow(x, 2.2) + return select(x < 0.04045, x / 12.92, pow((x + 0.055) / 1.055, 2.4)); +} + +// These functions avoid pow() to efficiently approximate sRGB with an error < 0.4%. +float3 LinearToSRGB_Fast( float3 x ) +{ + return select(x < 0.0031308, 12.92 * x, 1.13005 * sqrt(x - 0.00228) - 0.13448 * x + 0.005719); +} + +float3 SRGBToLinear_Fast( float3 x ) +{ + return select(x < 0.04045, x / 12.92, -7.43605 * x - 31.24297 * sqrt(-0.53792 * x + 1.279924) + 35.34864); +} + +float3 accurateSRGBToLinear(in float3 x ) {return SRGBToLinear(x);} +float3 accurateLinearToSRGB(in float3 x ) {return LinearToSRGB(x);} +// The OETF recommended for content shown on HDTVs. This "gamma ramp" may increase contrast as +// appropriate for viewing in a dark environment. +float3 LinearToREC709( float3 x ) +{ + return select(x < 0.0181, 4.5 * x, 1.0993 * pow(x, 0.45) - 0.0993); +} + +float3 REC709ToLinear( float3 x ) +{ + return select(x < 0.08145, x / 4.5, pow((x + 0.0993) / 1.0993, 1.0 / 0.45)); +} + +// This is the new HDR transfer function, also called "PQ" for perceptual quantizer. +float3 LinearToREC2084(float3 L) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Lp = pow(L, m1); + return pow((c1 + c2 * Lp) / (1 + c3 * Lp), m2); +} + +float3 REC2084ToLinear(float3 N) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Np = pow(N, 1 / m2); + return pow(max(Np - c1, 0) / (c2 - c3 * Np), 1 / m1); +} + +// +// Color space conversions +// +// These assume linear (not gamma-encoded) values. A color space conversion is a change +// of basis (like in Linear Algebra). Since a color space is defined by three vectors-- +// the basis vectors--changing space involves a matrix-vector multiplication. Note that +// changing the color space may result in colors that are "out of bounds" because some +// color spaces have larger gamuts than others. When converting some colors from a wide +// gamut to small gamut, negative values may result, which are inexpressible in that new +// color space. +// +// It would be ideal to build a color pipeline which never throws away inexpressible (but +// perceivable) colors. This means using a color space that is as wide as possible. The +// XYZ color space is the neutral, all-encompassing color space, but it has the unfortunate +// property of having negative values (specifically in X and Z). To correct this, a further +// transformation can be made to X and Z to make them always positive. They can have their +// precision needs reduced by dividing by Y, allowing X and Z to be packed into two UNORM8s. +// This color space is called YUV for lack of a better name. +// + +// Note: Rec.709 and sRGB share the same color primaries and white point. Their only difference +// is the transfer curve used. + +float3 REC709toREC2020( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.627402, 0.329292, 0.043306, + 0.069095, 0.919544, 0.011360, + 0.016394, 0.088028, 0.895578 + }; + return mul(ConvMat, RGB709); +} + +float3 REC2020toREC709(float3 RGB2020) +{ + const float3x3 ConvMat = + { + 1.660496, -0.587656, -0.072840, + -0.124547, 1.132895, -0.008348, + -0.018154, -0.100597, 1.118751 + }; + return mul(ConvMat, RGB2020); +} + +float3 REC709toDCIP3( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.822458, 0.177542, 0.000000, + 0.033193, 0.966807, 0.000000, + 0.017085, 0.072410, 0.910505 + }; + return mul(ConvMat, RGB709); +} + +float3 DCIP3toREC709( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 1.224947, -0.224947, 0.000000, + -0.042056, 1.042056, 0.000000, + -0.019641, -0.078651, 1.098291 + }; + return mul(ConvMat, RGB709); +} + +#endif // __COLOR_SPACE_UTILITY_HLSLI__ \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/atmosphere_params.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/atmosphere_params.hlsli new file mode 100644 index 00000000..63bdf67e --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/atmosphere_params.hlsli @@ -0,0 +1,107 @@ +#ifndef ATMOSPHERE_PARAMETERS +#define ATMOSPHERE_PARAMETERS 1 + +#include "atmosphere/definitions.hlsli" +#include "atmosphere/definitions_units.hlsli" + +/* +

Atmosphere parameters

+ +

Using the above types, we can now define the parameters of our atmosphere +model. We start with the definition of density profiles, which are needed for +parameters that depend on the altitude: +*/ + +/* +The atmosphere parameters are then defined by the following struct: +*/ + +//this is const buffer <> CPU. so it must be aligned to float4! +struct AtmosphereParameters { + // The solar irradiance at the top of the atmosphere. + IrradianceSpectrum solar_irradiance; + // The sun's angular radius. Warning: the implementation uses approximations + // that are valid only if this angle is smaller than 0.1 radians. + Angle sun_angular_radius; + + // The scattering coefficient of air molecules at the altitude where their + // density is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'rayleigh_scattering' times 'rayleigh_density' at this altitude. + ScatteringSpectrum rayleigh_scattering; + // The density profile of air molecules, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile rayleigh_density; + Number rayleigh_density_altitude_exp_term; + + // The scattering coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'mie_scattering' times 'mie_density' at this altitude. + ScatteringSpectrum mie_scattering; + // The density profile of aerosols, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile mie_density; + Number mie_density_altitude_exp_term;//todo: make more sophisticated + + // The extinction coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The extinction coefficient at altitude h is equal to + // 'mie_extinction' times 'mie_density' at this altitude. + ScatteringSpectrum mie_extinction; + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols forward weight. + Number mie_forward_scattering_weight; + + //second mie layer + Number mie2_strength,//can be bigger than 1. making it relative to 'common mie' + mie2_altitude,//where (and below) strength is 1 + mie2_density_altitude_exp_term;// + Number padding; + // The extinction coefficient of molecules that absorb light (e.g. ozone) at + // the altitude where their density is maximum, as a function of wavelength. + // The extinction coefficient at altitude h is equal to + // 'absorption_extinction' times 'absorption_density' at this altitude. + ScatteringSpectrum absorption_extinction; + Length absorption_density_max_alt;//absorption profile part + + // The average albedo of the ground. + DimensionlessSpectrum ground_albedo; + // The cosine of the maximum Sun zenith angle for which atmospheric scattering + // must be precomputed (for maximum precision, use the smallest Sun zenith + // angle yielding negligible sky light radiance values. For instance, for the + // Earth case, 102 degrees is a good choice - yielding mu_s_min = -0.2). + Number mu_s_min;//to be removed + + // precalced + DimensionlessSpectrum mie_extrapolation_coef; + Number multiple_scattering_factor; + + // The distance between the planet center and the bottom of the atmosphere. + Length bottom_radius; + // The distance between the planet center and the top of the atmosphere. + Length top_radius; + + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols. + Number mie_phase_function_forward_g; + Number mie_phase_function_backward_g; + + //float2(1.0 + g * g, - 2.0 * g)*pow(2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); + //optimized mie phase coef + float4 mie_phase_consts; + // The density profile of air molecules that absorb light (e.g. ozone), i.e. + // a function from altitude to dimensionless values between 0 (null density) + // and 1 (maximum density). + //DensityProfile absorption_density; + float2 absorption_density_linear_term0; + float2 absorption_density_linear_term1; + + //https://en.wikipedia.org/wiki/Kruithof_curve + //5500 kelvin + Kruithof effect results in (0.5764705882352941,0.6274509803921569, 1) + // full moon lux brighntess is way darker + DimensionlessSpectrum moon_color;//(0.5764705882352941,0.6274509803921569, 1)*.25 by default. That affects sky and moon + Number sunBrightness;//this is 10 by default. that affects everything, sky and sun +}; + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/definitions.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/definitions.hlsli new file mode 100644 index 00000000..ba0e6d62 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/definitions.hlsli @@ -0,0 +1,53 @@ +#ifndef ATMOSPHERE_DEFINITIONS +#define ATMOSPHERE_DEFINITIONS 1 +#define Length float +#define Wavelength float +#define Angle float +#define SolidAngle float +#define Power float +#define LuminousPower float +#define Number float +#define InverseLength float +#define Area float +#define Volume float +#define NumberDensity float +#define Irradiance float +#define Radiance float +#define SpectralPower float +#define SpectralIrradiance float +#define SpectralRadiance float +#define SpectralRadianceDensity float +#define ScatteringCoefficient float +#define InverseSolidAngle float +#define LuminousIntensity float +#define Luminance float +#define Illuminance float + +// A generic function from Wavelength to some other type. +#define AbstractSpectrum float3 +// A function from Wavelength to Number. +#define DimensionlessSpectrum float3 +// A function from Wavelength to SpectralPower. +#define PowerSpectrum float3 +// A function from Wavelength to SpectralIrradiance. +#define IrradianceSpectrum float3 +// A function from Wavelength to SpectralRadiance. +#define RadianceSpectrum float3 +// A function from Wavelength to SpectralRadianceDensity. +#define RadianceDensitySpectrum float3 +// A function from Wavelength to ScaterringCoefficient. +#define ScatteringSpectrum float3 + +// A position in 3D (3 length values). +#define Position float3 +// A unit direction vector in 3D (3 unitless values). +#define Direction float3 +// A vector of 3 luminance values. +#define Luminance3 float3 +// A vector of 3 illuminance values. +#define Illuminance3 float3 + +#define SKIES_SEPARATE_SINGLE_SCATTERING 1 +#define COMBINED_SCATTERING_TEXTURES 1 + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/definitions_units.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/definitions_units.hlsli new file mode 100644 index 00000000..d1532d02 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/definitions_units.hlsli @@ -0,0 +1,96 @@ +#ifndef ATMOSPHERE_DEFINITIONS_UNITS +#define ATMOSPHERE_DEFINITIONS_UNITS 1 + +#include "atmosphere/definitions.hlsli" +#include "hardware_defines.hlsli" + +struct SamplerTexture2D +{ + Texture2D tex; + SamplerState tex_smp; +}; +struct SamplerTexture3D +{ + Texture3D tex; + SamplerState tex_smp; +}; +SamplerTexture2D from_texture2d(Texture2D tex, SamplerState tex_smp){ SamplerTexture2D r;r.tex=tex;r.tex_smp = tex_smp;return r;} +SamplerTexture3D from_texture3d(Texture3D tex, SamplerState tex_smp){ SamplerTexture3D r;r.tex=tex;r.tex_smp = tex_smp;return r;} + +#define SamplerTexture2DFromName(a) from_texture2d(a, a##_samplerstate) +#define SamplerTexture3DFromName(a) from_texture3d(a, a##_samplerstate) +#define TransmittanceTexture SamplerTexture2D +#define AbstractScatteringTexture SamplerTexture3D +#define PreparedSkiesScatteringTexture SamplerTexture2D +#define PreparedScatteringTexture SamplerTexture3D +#define ReducedScatteringTexture SamplerTexture3D +#define ScatteringTexture SamplerTexture3D +#define ScatteringDensityTexture SamplerTexture3D +#define IrradianceTexture SamplerTexture2D +#define MultipleScatteringTexture SamplerTexture2D + +#define IN(t) t +#define OUT(t) out t +#define INOUT(t) inout t +#define INLINE +#define G_UNUSED(a) +#define assert(a) +#define vec2 float2 +#define vec4 float4 +#define vec3 float3 +#define TEMPLATE(a) +#define TEMPLATE_ARGUMENT(a) +DimensionlessSpectrum DimensionlessSpectrumFromTexture(float4 a) {return a.xyz;} +AbstractSpectrum AbstractSpectrumFromTexture(float4 a) {return a.xyz;} +IrradianceSpectrum IrradianceSpectrumFromTexture(float4 a) {return a.xyz;} + +float mod(float a, float b) {return fmod(a,b);} + +float4 sample_texture(SamplerTexture2D ts, float2 uv) +{ + return ts.tex.SampleLevel(ts.tex_smp, uv, 0); +} + +float4 sample_texture(SamplerTexture3D ts, float3 uv) +{ + return ts.tex.SampleLevel(ts.tex_smp, uv, 0); +} + +/* +

Physical units

+ +

We can then define the units for our six base physical quantities: +meter (m), nanometer (nm), radian (rad), steradian (sr), watt (watt) and lumen +(lm): +*/ + +static const Length meter = 1.0; +static const Wavelength nm = 1.0; +static const Angle rad = 1.0; +static const SolidAngle sr = 1.0; +static const Power watt = 1.0; +static const LuminousPower lm = 1.0; + +/* +

From which we can derive the units for some derived physical quantities, +as well as some derived units (kilometer km, kilocandela kcd, degree deg): +*/ + +static const Length km = 1000.0 * meter; +static const Area m2 = meter * meter; +static const Volume m3 = meter * meter * meter; +static const Angle pi = PI * rad; +static const Angle deg = pi / 180.0; +static const Irradiance watt_per_square_meter = watt / m2; +static const Radiance watt_per_square_meter_per_sr = watt / (m2 * sr); +static const SpectralIrradiance watt_per_square_meter_per_nm = watt / (m2 * nm); +static const SpectralRadiance watt_per_square_meter_per_sr_per_nm = + watt / (m2 * sr * nm); +static const SpectralRadianceDensity watt_per_cubic_meter_per_sr_per_nm = + watt / (m3 * sr * nm); +static const LuminousIntensity cd = lm / sr; +static const LuminousIntensity kcd = 1000.0 * cd; +static const Luminance cd_per_square_meter = cd / m2; +static const Luminance kcd_per_square_meter = kcd / m2; + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/functions.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/functions.hlsli new file mode 100644 index 00000000..eab570b4 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/functions.hlsli @@ -0,0 +1,777 @@ +#ifndef ATMOSPHERE_FUNCTIONS_HLSLI_INCLUDED +#define ATMOSPHERE_FUNCTIONS_HLSLI_INCLUDED 1 +//only parametrization and lut transmittance is used from Eric Bruneton code. +//we can reimplement it ofc +/** + * Copyright (c) 2017 Eric Bruneton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * Precomputed Atmospheric Scattering + * Copyright (c) 2008 INRIA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atmosphere/transmittance.hlsli" +#include "atmosphere/texture_sizes.hlsli" +//#include "atmosphere/preparedScattering2.hlsl" +#include "hardware_defines.hlsli" + +INLINE Number GetTextureCoordFromUnitRange(Number x, int texture_size) +{ + return 0.5 / Number(texture_size) + x * (1.0 - 1.0 / Number(texture_size)); +} + +INLINE Number GetUnitRangeFromTextureCoord(Number u, int texture_size) +{ + return saturate(u / (1.0 - 1.0 / Number(texture_size)) - 0.5 / (Number(texture_size) - 1.0));//we saturate just in case, due to numeric instabilities +} + +INLINE vec2 GetTransmittanceTextureUvFromRMu(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon. + Length rho = + SafeSqrt(r * r - atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon). + Length d = DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Number x_mu = (d - d_min) / (d_max - d_min); + Number x_r = rho / H; + return vec2(GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)); +} + +/* +

and the inverse mapping follows immediately: +*/ + +INLINE void GetRMuFromTransmittanceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon, from which we can compute r: + Length rho = H * x_r; + // due to float precision, sqrt(0 + x*x) can produce value lower than x, so we need to acknowledge that + r = rho > 0 ? sqrt(rho * rho + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius) : atmosphere_p.bottom_radius; + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon) - + // from which we can recover mu: + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Length d = d_min + x_mu * (d_max - d_min); + mu = d == 0.0 * meter ? Number(1.0) : (H * H - rho * rho - d * d) / (2.0 * r * d); + mu = ClampCosine(mu); +} + +/* +

It is now easy to define a fragment shader function to precompute a texel of +the transmittance texture: +*/ + +DimensionlessSpectrum GetTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + vec2 uv = GetTransmittanceTextureUvFromRMu(atmosphere_p, r, mu); + return DimensionlessSpectrumFromTexture(sample_texture(transmittance_texture, uv)); +} + +DimensionlessSpectrum GetTransmittance( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu, Length d, bool ray_r_mu_intersects_ground) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + assert(d >= 0.0 * meter); + + Length r_d = ClampRadius(atmosphere_p, sqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_d = ClampCosine((r * mu + d) / r_d); + + if (ray_r_mu_intersects_ground) { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, -mu_d) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, -mu))); + } else { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, mu_d))); + } +} + +DimensionlessSpectrum GetTransmittanceToSun( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu_s) +{ + Number sin_theta_h = atmosphere_p.bottom_radius / r; + Number cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0)); + return GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu_s) * + smoothstep(-sin_theta_h * atmosphere_p.sun_angular_radius / rad, + sin_theta_h * atmosphere_p.sun_angular_radius / rad, + mu_s - cos_theta_h); +} + +Length DistanceToNearestAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu, bool ray_r_mu_intersects_ground) +{ + if (ray_r_mu_intersects_ground) { + return DistanceToBottomAtmosphereBoundary(atmosphere_p, r, mu); + } else { + return DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + } +} + +INLINE InverseSolidAngle RayleighPhaseFunction(Number nu) +{ + InverseSolidAngle k = 3.0 / (16.0 * PI * sr); + return k * (1.0 + nu * nu); +} + +float2 GetMiePhaseConsts(Number g); + +#if 0 +INLINE float MiePhaseFunctionDivideByRayleigh(Number g, Number nu) +{ + return MiePhaseFunctionDivideByRayleighOptimized(float4(GetMiePhaseConsts(g)*pow(0.5,-1./1.5), GetMiePhaseConsts(-0.25*g)*pow(0.5,-1./1.5)), nu); + //float k = 2.0 * (1.0 - g * g) / (2.0 + g * g);//this is constantant + //float phase = 1.0 + g * g - 2.0 * g * nu;//this is nother two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + //return k / (phase*sqrt(phase));//pow(1.5) +} + +//only for reference +//https://arxiv.org/pdf/1812.00799.pdf +//ON SAMPLING OF SCATTERING PHASE FUNCTIONS +//CORNETTE SHANKS PHASE +INLINE InverseSolidAngle MiePhaseCornetteShanksFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//full Drain phase function +INLINE InverseSolidAngle MiePhaseDrainFunction(Number g, Number nu) +{ + float alpha = 1.0; + InverseSolidAngle k = 3.0 / (4.0 * PI * sr) * (1.0 - g * g) / (3 + alpha*(1.0 + 2.0*g * g)); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + alpha*nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//http://www.csroc.org.tw/journal/JOC25-3/JOC25-3-2.pdf +//Zhang function +INLINE InverseSolidAngle MiePhaseZhangFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase)) + g*nu*1.0/(4.0*PI * sr); +} + +#endif +INLINE float SafePow(Number a, Number b) {return a != 0 ? pow(a, b) : 0;} +INLINE float2 GetMiePhaseConsts(Number g, Number weight) +{ + return float2(1.0 + g * g, - 2.0 * g)*SafePow(weight*2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); +} + +INLINE float2 GetMiePhaseConsts(Number g) { return GetMiePhaseConsts(g, 1); } + +INLINE float MiePhaseFunctionDivideByRayleighOptimized(float4 mie_phase_consts, Number nu) +{ + float forward_phase = mie_phase_consts.x + mie_phase_consts.y*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + float backward_phase = mie_phase_consts.z + mie_phase_consts.w*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + return pow(forward_phase, -1.5) + pow(backward_phase, -1.5);//it is faster than rcp(phase*sqrt(phase)) or phase*phase*rsqrt(phase) on Xb1+ +} + + +INLINE RadianceSpectrum GetPhasedRadianceOptimized(float4 mie_phase_consts, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return (scattering + single_mie_scattering * + MiePhaseFunctionDivideByRayleighOptimized(mie_phase_consts, nu)) * RayleighPhaseFunction(nu); +} + +INLINE RadianceSpectrum GetPhasedRadiance(IN(AtmosphereParameters) atmosphere_p, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return GetPhasedRadianceOptimized(atmosphere_p.mie_phase_consts, scattering, single_mie_scattering, nu); +} + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s); + +vec2 GetIrradianceTextureUvFromRMuS(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + Number x_r = (r - atmosphere_p.bottom_radius) / + (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + Number x_mu_s = mu_s * 0.5 + 0.5; + return vec2(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT)); +} + +/* +

The inverse mapping follows immediately: +*/ + +void GetRMuSFromIrradianceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu_s) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT); + r = atmosphere_p.bottom_radius + + x_r * (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + mu_s = ClampCosine(2.0 * x_mu_s - 1.0); +} +/* +

Lookup

+ +

Thanks to these precomputed textures, we can now get the ground irradiance +with a single texture lookup: +*/ + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s) +{ + vec2 uv = GetIrradianceTextureUvFromRMuS(atmosphere_p, r, mu_s); + return IrradianceSpectrumFromTexture(sample_texture(irradiance_texture, uv)); +} + +//rendering part +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoef( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + // Algebraically this can never be negative, but rounding errors can produce + // that effect for sufficiently short view rays. + return (scattering.w / max(scattering.x, 1e-4f)) * extrapolateMieCoef;//betaRMie = (betaR.x / betaR); +} + +IrradianceSpectrum GetExtrapolatedSingleMieScatteringDS( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + return IrradianceSpectrumFromTexture(scattering) * GetExtrapolatedSingleMieScatteringCoef(extrapolateMieCoef, scattering); +} +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoefConst( + IN(AtmosphereParameters) atmosphere_p) +{ + return (atmosphere_p.rayleigh_scattering.x / atmosphere_p.mie_scattering.x) * + (atmosphere_p.mie_scattering / atmosphere_p.rayleigh_scattering);//constant` +} + +#ifdef COMBINED_SCATTERING_TEXTURES +IrradianceSpectrum GetExtrapolatedSingleMieScattering( + IN(AtmosphereParameters) atmosphere_p, IN(vec4) scattering) +{ + return GetExtrapolatedSingleMieScatteringDS(GetExtrapolatedSingleMieScatteringCoefConst(atmosphere_p), scattering); +} + +#endif + +/* +

We can then retrieve all the scattering components (Rayleigh + multiple +scattering on one side, and single Mie scattering on the other side) with the +following function, based on +GetScattering (we duplicate +some code here, instead of using two calls to GetScattering, to +make sure that the texture coordinates computation is shared between the lookups +in scattering_texture and +single_mie_scattering_texture): +*/ + +#define SKIES_PREPARED_SHORT_PART (112./128.) +#define SKIES_PREPARED_SHORT_PART_SQ (SKIES_PREPARED_SHORT_PART*SKIES_PREPARED_SHORT_PART) +float scattering_DistToTc_m(float d, float2 dist_to_prepared_tc) {return sqrt(saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y));} +float scattering_DistToTc_Km(float d, float2 dist_to_prepared_tc) {return scattering_DistToTc_m(d*1000, dist_to_prepared_tc);}//fixme: +float scattering_DistToTc_Long(float d, float4 dist_to_prepared_tc) +{ + float shortDistTc = saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y); + float longDistTc = saturate(d*dist_to_prepared_tc.z + dist_to_prepared_tc.w); + return sqrt(shortDistTc < SKIES_PREPARED_SHORT_PART_SQ ? shortDistTc : longDistTc); +} +float scattering_TcToDist_Km(float tcX, float4 dist_to_prepared_tc) +{ + float tc = (tcX*tcX); + return 0.001*(tc < SKIES_PREPARED_SHORT_PART_SQ ? (tc-dist_to_prepared_tc.y)/dist_to_prepared_tc.x : (tc-dist_to_prepared_tc.w)/dist_to_prepared_tc.z); +} + +#define SKIES_LOWER_SPACE_PART 0.8 +float scattering_viewZtoTc(float viewZ) +{ + //return acos(viewZ)*(-1./PI) + 1; + return SKIES_LOWER_SPACE_PART + (viewZ < 0 ? SKIES_LOWER_SPACE_PART : (1-SKIES_LOWER_SPACE_PART))*viewZ; +} +float scattering_tcToViewZ(float tcY) +{ + //return cos(-PI*(tcY-1)); + float2 maddP = tcY= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + result += ComputeScatteringForIrradiance(atmosphere_p, transmittance_texture, RAY_SAMPLE_COUNT, r, omega, omega_s) * + omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum GetMultipleScattering(IN(AtmosphereParameters) atmosphere_p, IN(MultipleScatteringTexture) multiple_scattering_approx, + Length r, Number mu) +{ + float MultiScatteringLUTRes = SKIES_MULTIPLE_SCATTERING_APPROX; + float2 uv = saturate(float2(mu*0.5f + 0.5f, (r - atmosphere_p.bottom_radius) / (atmosphere_p.top_radius - atmosphere_p.bottom_radius))); + uv = float2(GetTextureCoordFromUnitRange(uv.x, MultiScatteringLUTRes), GetTextureCoordFromUnitRange(uv.y, MultiScatteringLUTRes)); + + return IrradianceSpectrumFromTexture(sample_texture(multiple_scattering_approx, uv)); +} + +struct SingleScatteringResult +{ + IrradianceSpectrum L; // Scattered light (luminance) + IrradianceSpectrum ray,mie,ms; + DimensionlessSpectrum Transmittance; // Transmittance in [0,1] (unitless) +}; + +INLINE SingleScatteringResult IntegrateScatteredLuminanceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) multiple_scattering_approx, + IN(Position) worldPos, IN(Direction) worldDir, Number shadow_offset,//only for shadows + float sampleCountIni, bool variableSampleCount, float2 rayMarchMinMaxSPP, + Length r, Number mu, Number nu, Number mu_s, + bool ray_intersects_ground,//RayIntersectsGround(atmosphere_p, r, mu) + float tMaxMax = 9000000.0f) +{ + SingleScatteringResult result; + result.L = result.ray = result.mie = result.ms = IrradianceSpectrum(0,0,0); + float start_distance = 0; + #if ORIGIN_CAN_BE_IN_SPACE + result.Transmittance = DimensionlessSpectrum(1,1,1); + //just skip distance befroe atmosphere. + //it is totally fine to render atmosphere from space without this defines on. + //it is just produces better quality in such case + if (r > atmosphere_p.top_radius) + { + Length rmu = r*mu; + Length distance_to_top_atmosphere_boundary = -rmu - + sqrt(rmu * rmu - r * r + atmosphere_p.top_radius * atmosphere_p.top_radius); + if (distance_to_top_atmosphere_boundary > 0.0 * meter) { + start_distance = distance_to_top_atmosphere_boundary; + } else { + // If the view ray does not intersect the atmosphere_p, simply return 0. + return result; + } + } + #endif + + // Compute next intersection with atmosphere or ground + float tMax = DistanceToNearestAtmosphereBoundary(atmosphere_p, r, mu, ray_intersects_ground) - start_distance; + tMax = min(tMax, tMaxMax); + + // Sample count + float sampleCount = sampleCountIni; + float sampleCountFloor = sampleCountIni-1; + float tMaxFloor = tMax; + if (variableSampleCount) + { + sampleCount = lerp(rayMarchMinMaxSPP.x, rayMarchMinMaxSPP.y, saturate(tMax*0.01)); + sampleCountFloor = floor(sampleCount); + tMaxFloor = tMax * sampleCountFloor / sampleCount; // rescale tMax to map to the last entire step segment. + } + // Phase functions + //const Number uniformPhase = 1.0 / (4.0 * PI); + Number RayleighPhaseValue = RayleighPhaseFunction(nu); + Number MiePhaseValue = RayleighPhaseValue*MiePhaseFunctionDivideByRayleighOptimized(atmosphere_p.mie_phase_consts, nu); + + // Ray march the atmosphere to integrate optical depth + IrradianceSpectrum L = IrradianceSpectrum(0.0f,0.0f,0.0f); + DimensionlessSpectrum throughput = DimensionlessSpectrum(1.0,1.0,1.0); + float t = 0.0f; + float tPrev = 0.0; + const float sampleSegmentT = 0.5f; + float invSampleCountFloor = 1.0f/sampleCountFloor; + Position curWorldPos = worldPos; + for (float s = 0.0f, e = sampleCount*invSampleCountFloor; s < e; s += invSampleCountFloor) + { + float dt; + if (variableSampleCount) + { + float t0 = s * s; + float t1 = s + invSampleCountFloor; + // Non linear distribution of sample within the range. + t1 = t1 * t1; + // Make t0 and t1 world space distances. + t0 = tMaxFloor * t0; + t1 = t1 > 1.0f ? tMax : tMaxFloor * t1; + t = t0 + (t1 - t0)*sampleSegmentT; + dt = t1 - t0; + } + else + { + float newT = tMax * saturate(s + sampleSegmentT*invSampleCountFloor); + dt = newT - t; + t = newT; + } + Length d = t + start_distance; + Length r_d = ClampRadius(atmosphere_p, SafeSqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d); + + G_UNUSED(curWorldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + Position curWorldPos = worldPos + (d + shadow_offset*dt) * worldDir; + float shadow = getShadow(curWorldPos, d, r_d, mu_s_d); +#endif + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, r_d-atmosphere_p.bottom_radius, curWorldPos); + + const float3 sampleOpticalDepth = medium.extinction * dt; + const float3 sampleTransmittance = exp(-sampleOpticalDepth); + + float3 transmittanceToSun = GetTransmittanceToSun( atmosphere_p, transmittance_texture, r_d, mu_s_d); + + + G_UNUSED(worldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + transmittanceToSun *= finalShadowFromShadowTerm(shadow); +#endif + float3 PhaseTimesScattering = medium.scatteringMie * MiePhaseValue + medium.scatteringRay * RayleighPhaseValue; + + // Dual scattering for multi scattering + + float3 multiScatteredLuminance = GetMultipleScattering(atmosphere_p, multiple_scattering_approx, r_d, mu_s_d); + + #if ORIGIN_CAN_BE_IN_SPACE && SHADOWMAP_ENABLED + multiScatteredLuminance *= shadow; + #endif + + float3 S = (transmittanceToSun * PhaseTimesScattering + multiScatteredLuminance * medium.scattering); + + // When using the power serie to accumulate all sattering order, serie r must be <1 for a serie to converge. + // Under extreme coefficient, MultiScatAs1 can grow larger and thus result in broken visuals. + // The way to fix that is to use a proper analytical integration as proposed in slide 28 of http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + // However, it is possible to disable as it can also work using simple power serie sum unroll up to 5th order. The rest of the orders has a really low contribution. + + // See slide 28 at http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + float3 Sint = (S - S * sampleTransmittance) / medium.extinction; // integrate along the current step segment + L += throughput * Sint; // accumulate and also take into account the transmittance from previous steps + + float3 rayS = medium.scatteringRay*transmittanceToSun; + float3 raySint = (rayS - rayS * sampleTransmittance) / medium.extinction; + result.ray += throughput * raySint; + + float3 mieS = medium.scatteringMie*transmittanceToSun; + float3 mieSint = (mieS - mieS * sampleTransmittance) / medium.extinction; + result.mie += throughput * mieSint; + + float3 msS = multiScatteredLuminance * medium.scattering; + float3 msSint = (msS - msS * sampleTransmittance) / medium.extinction; + result.ms += throughput * msSint; + + throughput = throughput*sampleTransmittance; + tPrev = t; + } + + result.L = L; + result.Transmittance = throughput; + return result; +} + +IrradianceSpectrum ComputeIndirectIrradianceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const int SAMPLE_COUNT = 8; + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + Number nu = dot(omega, omega_s); + SingleScatteringResult ss = IntegrateScatteredLuminanceMS( + atmosphere_p, + transmittance_texture, + ms_texture, + float3(0,0,0),float3(0,0,0),0,//shadows + 32, true, float2(16,16), + r, omega.z, nu, mu_s, + false); + result += ss.L * omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum ComputeIndirectIrradianceTextureMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + IN(vec2) frag_coord) +{ + Length r; + Number mu_s; + GetRMuSFromIrradianceTextureUv( + atmosphere_p, frag_coord / vec2(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT), r, mu_s); + //return ComputeIndirectIrradianceSingle(atmosphere_p, transmittance_texture, r, mu_s, 32, 32); + return ComputeIndirectIrradianceMS(atmosphere_p, + transmittance_texture, ms_texture, r, mu_s); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/preparedScattering2.hlsl b/project_templates/sample_scene/content/shaders/include/atmosphere/preparedScattering2.hlsl new file mode 100644 index 00000000..b91fdff7 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/preparedScattering2.hlsl @@ -0,0 +1,30 @@ +#ifndef SKIES_PREPARED_SCATTERING +#define SKIES_PREPARED_SCATTERING 1 + + +#include "atmosphere/transmittance.hlsli" +#include "atmosphere/texture_sizes.hlsli" + +vec4 getPreparedCombinedScattering(IN(PreparedScatteringTexture) preparedScattering, IN(vec2) prepared_tc, float layer) +{ + return sample_texture(preparedScattering, float3(prepared_tc.x, prepared_tc.y, layer)); +} + +float getInscatterLerpParam(vec2 viewdirXYNorm, vec2 sundirXYNorm) +{ + //remapped(0.5-0.5*dot(viewdirXYNorm, sundirXYNorm)) + float inscatterLerp = dot(viewdirXYNorm, sundirXYNorm); + return inscatterLerp*(-0.5*((SKIES_OPTIMIZATION_NUM_LAYERS-1.)/(SKIES_OPTIMIZATION_NUM_LAYERS))) + 0.5; +} + +vec4 getPreparedCombinedScatteringXYZ(IN(PreparedScatteringTexture) preparedScattering, float3 viewdir, float3 sundir, vec2 prepared_tc) +{ + return getPreparedCombinedScattering(preparedScattering, prepared_tc, getInscatterLerpParam(normalize(viewdir.xy), normalize(sundir.xy))); +} + +DimensionlessSpectrum getPreparedTransmittanceFromUV(IN(TransmittanceTexture) preparedTransmittance, IN(vec2) prepared_tc) +{ + return DimensionlessSpectrumFromTexture(sample_texture(preparedTransmittance, prepared_tc)); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/statistical_clouds_shadow.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/statistical_clouds_shadow.hlsli new file mode 100644 index 00000000..7bd0c54d --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/statistical_clouds_shadow.hlsli @@ -0,0 +1,16 @@ +#ifndef STATISTICAL_CLOUDS_SHADOW_HLSLI +#define STATISTICAL_CLOUDS_SHADOW_HLSLI 1 + float getCloudsLength(float r, float mu, float clouds_bottom_radius_sq, float clouds_top_radius_sq) + { + float rmu = r * mu; + float rSq = r*r; + float rmuSq = (rmu*rmu - rSq); + float2 discriminant_bottom_top = float2(rmuSq + clouds_bottom_radius_sq, rmuSq + clouds_top_radius_sq); + float2 sqDiscr = sqrt(max(float2(0,0), discriminant_bottom_top)); + float2 dist_to_bottom = discriminant_bottom_top.x < 0 ? float2(0,0) : max(float2(0,0), float2(-rmu, -rmu) + float2(-sqDiscr.x, sqDiscr.x)); + float2 dist_to_top = discriminant_bottom_top.y < 0 ? float2(0,0) : max(float2(0,0), float2(-rmu, -rmu) + float2(-sqDiscr.y, sqDiscr.y)); + float len = max(0.f, max(dist_to_top.x, dist_to_top.y) - max(dist_to_bottom.x, dist_to_bottom.y)); + len += max(0.f, min(dist_to_bottom.x, dist_to_bottom.y) - min(dist_to_top.x, dist_to_top.y)); + return len; + } +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/texture_sizes.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/texture_sizes.hlsli new file mode 100644 index 00000000..11735aa4 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/texture_sizes.hlsli @@ -0,0 +1,17 @@ +#ifndef SKIES_TEXTURE_SIZES +#define SKIES_TEXTURE_SIZES 1 +#ifndef TRANSMITTANCE_TEXTURE_SIZE_DEFINED +#define TRANSMITTANCE_TEXTURE_SIZE_DEFINED 1 +static const int TRANSMITTANCE_TEXTURE_WIDTH = 256; +static const int TRANSMITTANCE_TEXTURE_HEIGHT = 64; +#endif +static const int SCATTERING_TEXTURE_MU_SIZE = 128; +static const int SCATTERING_TEXTURE_NU_SIZE = 8; +static const int IRRADIANCE_TEXTURE_WIDTH = 64; +static const int IRRADIANCE_TEXTURE_HEIGHT = 16; +static const int SKIES_OPTIMIZATION_NUM_LAYERS = 5;//actually 3 is also working fine +static const int SKIES_MULTIPLE_SCATTERING_APPROX = 32; +static const int SKIES_LUT_SIZE_W = 192; +static const int SKIES_LUT_SIZE_H = 108; + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/atmosphere/transmittance.hlsli b/project_templates/sample_scene/content/shaders/include/atmosphere/transmittance.hlsli new file mode 100644 index 00000000..4bffd85b --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/atmosphere/transmittance.hlsli @@ -0,0 +1,340 @@ +#ifndef ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED +#define ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED 1 +/** + * Copyright (c) 2017 Eric Bruneton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * Precomputed Atmospheric Scattering + * Copyright (c) 2008 INRIA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atmosphere\atmosphere_params.hlsli" + +/* +

They use the following utility functions to avoid NaNs due to floating point +values slightly outside their theoretical bounds: +*/ +INLINE Number ClampCosine(Number mu) { + return clamp(mu, Number(-1.0), Number(1.0)); +} + +INLINE Length ClampDistance(Length d) { + return max(d, 0.0 * meter); +} + +INLINE Length ClampRadius(IN(AtmosphereParameters) atmosphere_p, Length r) { + return clamp(r, atmosphere_p.bottom_radius, atmosphere_p.top_radius); +} + +INLINE Length SafeSqrt(Area a) { + return sqrt(max(a, 0.0 * m2)); +} + +/* +

Transmittance

+ +

As the light travels from a point $\bp$ to a point $\bq$ in the atmosphere_p, +it is partially absorbed and scattered out of its initial direction because of +the air molecules and the aerosol particles. Thus, the light arriving at $\bq$ +is only a fraction of the light from $\bp$, and this fraction, which depends on +wavelength, is called the +transmittance. The +following sections describe how we compute it, how we store it in a precomputed +texture, and how we read it back. + +

Computation

+ +

For 3 aligned points $\bp$, $\bq$ and $\br$ inside the atmosphere_p, in this +order, the transmittance between $\bp$ and $\br$ is the product of the +transmittance between $\bp$ and $\bq$ and between $\bq$ and $\br$. In +particular, the transmittance between $\bp$ and $\bq$ is the transmittance +between $\bp$ and the nearest intersection $\bi$ of the half-line $[\bp,\bq)$ +with the top or bottom atmosphere_p boundary, divided by the transmittance between +$\bq$ and $\bi$ (or 0 if the segment $[\bp,\bq]$ intersects the ground): + + + + + + + + + + + + + + + + + + + + + + + + p + q + i + o + r + ?=cos(?) + x + z + + +

Also, the transmittance between $\bp$ and $\bq$ and between $\bq$ and $\bp$ +are the same. Thus, to compute the transmittance between arbitrary points, it +is sufficient to know the transmittance between a point $\bp$ in the atmosphere_p, +and points $\bi$ on the top atmosphere_p boundary. This transmittance depends on +only two parameters, which can be taken as the radius $r=\Vert\bo\bp\Vert$ and +the cosine of the "view zenith angle", +$\mu=\bo\bp\cdot\bp\bi/\Vert\bo\bp\Vert\Vert\bp\bi\Vert$. To compute it, we +first need to compute the length $\Vert\bp\bi\Vert$, and we need to know when +the segment $[\bp,\bi]$ intersects the ground. + +

Distance to the top atmosphere_p boundary
+ +

A point at distance $d$ from $\bp$ along $[\bp,\bi)$ has coordinates +$[d\sqrt{1-\mu^2}, r+d\mu]^\top$, whose squared norm is $d^2+2r\mu d+r^2$. +Thus, by definition of $\bi$, we have +$\Vert\bp\bi\Vert^2+2r\mu\Vert\bp\bi\Vert+r^2=r_{\mathrm{top}}^2$, +from which we deduce the length $\Vert\bp\bi\Vert$: +*/ + +INLINE Length DistanceToTopAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.top_radius * atmosphere_p.top_radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +INLINE Length DistanceToSomeAtmosphereBoundary(Length r, Number mu, Length radius) { + if (r > radius) + return 0; + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + radius * radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +/* +

We will also need, in the other sections, the distance to the bottom +atmosphere_p boundary, which can be computed in a similar way (this code assumes +that $[\bp,\bi)$ intersects the ground): +*/ + +INLINE Length DistanceToBottomAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return ClampDistance(-r * mu - SafeSqrt(discriminant)); +} + +//return -1 if no hit +INLINE Length DistanceToBottomAtmosphereBoundarySigned(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) +{ + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return mu < 0 && discriminant >= 0 ? (-r * mu - sqrt(discriminant)) : (-1 * meter); +} + +/* +

Intersections with the ground
+ +

The segment $[\bp,\bi]$ intersects the ground when +$d^2+2r\mu d+r^2=r_{\mathrm{bottom}}^2$ has a solution with $d \ge 0$. This +requires the discriminant $r^2(\mu^2-1)+r_{\mathrm{bottom}}^2$ to be positive, +from which we deduce the following function: +*/ + +INLINE bool RayIntersectsGround(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + return mu < 0.0 && r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius >= 0.0 * m2; +} + +/* +

Transmittance to the top atmosphere_p boundary
+ +

We can now compute the transmittance between $\bp$ and $\bi$. From its +definition and the +Beer-Lambert law, +this involves the integral of the number density of air molecules along the +segment $[\bp,\bi]$, as well as the integral of the number density of aerosols +and the integral of the number density of air molecules that absorb light +(e.g. ozone) - along the same segment. These 3 integrals have the same form and, +when the segment $[\bp,\bi]$ does not intersect the ground, they can be computed +numerically with the help of the following auxilliary function (using the trapezoidal rule): +*/ + +INLINE Number GetMieDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + //return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude));//todo: exp2 + return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude)) + +atmosphere_p.mie2_strength * saturate(exp(atmosphere_p.mie2_density_altitude_exp_term * max(0., altitude-atmosphere_p.mie2_altitude)));//todo: exp2 +} + +INLINE Number GetRayDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(exp(atmosphere_p.rayleigh_density_altitude_exp_term * altitude));//todo exp2 +} + +INLINE Number GetAbsDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(altitude < atmosphere_p.absorption_density_max_alt ? + atmosphere_p.absorption_density_linear_term0.x * altitude + atmosphere_p.absorption_density_linear_term0.y: + atmosphere_p.absorption_density_linear_term1.x * altitude + atmosphere_p.absorption_density_linear_term1.y); +} + +struct MediumSampleRGB +{ + DimensionlessSpectrum scattering; + DimensionlessSpectrum extinction; + + DimensionlessSpectrum scatteringMie; + DimensionlessSpectrum scatteringRay; +}; + +INLINE MediumSampleRGB SampleMediumFull(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos)//worldPos is for other volumetrics +{ + G_UNUSED(worldPos); + Number densityMie = GetMieDensity(atmosphere_p, altitude); + Number densityRay = GetRayDensity(atmosphere_p, altitude); + Number densityAbs = GetAbsDensity(atmosphere_p, altitude); + + MediumSampleRGB s; + + s.scatteringMie = densityMie * atmosphere_p.mie_scattering; + s.scatteringRay = densityRay * atmosphere_p.rayleigh_scattering; + s.extinction = densityMie * atmosphere_p.mie_extinction + s.scatteringRay + densityAbs * atmosphere_p.absorption_extinction; + DimensionlessSpectrum msScattering = DimensionlessSpectrum(0,0,0); + #if CUSTOM_SKIES_FOG + getSkiesCustomFog(s.scatteringMie, s.scatteringRay, msScattering, s.extinction, altitude, worldPos);//todo: add fixed phase fog + #endif + s.scattering = s.scatteringMie + s.scatteringRay + msScattering; + return s; +} + +INLINE void SampleMedium(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos, + OUT(DimensionlessSpectrum) scattering, OUT(DimensionlessSpectrum) extinction) +{ + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, altitude, worldPos); + scattering = medium.scattering; + extinction = medium.extinction; +} +/* +

With this function the transmittance between $\bp$ and $\bi$ is now easy to +compute (we continue to assume that the segment does not intersect the ground): +*/ + +INLINE DimensionlessSpectrum ComputeTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, Length r, Number mu, Length maxDist, int SAMPLE_COUNT, + IN(Position) worldPos, IN(Direction) worldDir//only for custom fog + ) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + + Length dist = min(maxDist, DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu)); + Length dx = dist / Number(SAMPLE_COUNT); + // Integration loop. + //generic loop, works for any medium + DimensionlessSpectrum sampleScattering, sampleExtinction; + SampleMedium(atmosphere_p, r - atmosphere_p.bottom_radius, worldPos, sampleScattering, sampleExtinction); + DimensionlessSpectrum extinction = sampleExtinction*0.5; + for (int i = 1; i < SAMPLE_COUNT; ++i) + { + Length d_i = Number(i) * dx; + // Distance between the current sample point and the planet center. + Length r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r); + SampleMedium(atmosphere_p, r_i - atmosphere_p.bottom_radius, worldPos + worldDir*d_i, sampleScattering, sampleExtinction); + extinction += sampleExtinction; + } + SampleMedium(atmosphere_p, sqrt(dist * dist + 2.0 * r * mu * dist + r * r) - atmosphere_p.bottom_radius, worldPos + worldDir*dist, + sampleScattering, sampleExtinction); + extinction += sampleExtinction*0.5; + return exp(-dx*extinction); +} + +/* +

Precomputation

+ +

The above function is quite costly to evaluate, and a lot of evaluations are +needed to compute single and multiple scattering. Fortunately this function +depends on only two parameters and is quite smooth, so we can precompute it in a +small 2D texture to optimize its evaluation. + +

For this we need a mapping between the function parameters $(r,\mu)$ and the +texture coordinates $(u,v)$, and vice-versa, because these parameters do not +have the same units and range of values. And even if it was the case, storing a +function $f$ from the $[0,1]$ interval in a texture of size $n$ would sample the +function at $0.5/n$, $1.5/n$, ... $(n-0.5)/n$, because texture samples are at +the center of texels. Therefore, this texture would only give us extrapolated +function values at the domain boundaries ($0$ and $1$). To avoid this we need +to store $f(0)$ at the center of texel 0 and $f(1)$ at the center of texel +$n-1$. This can be done with the following mapping from values $x$ in $[0,1]$ to +texture coordinates $u$ in $[0.5/n,1-0.5/n]$ - and its inverse: +*/ +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/clustered/point_light.hlsli b/project_templates/sample_scene/content/shaders/include/clustered/point_light.hlsli new file mode 100644 index 00000000..25f197e6 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/clustered/point_light.hlsli @@ -0,0 +1,130 @@ +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "pbr.hlsli" +#include "ColorSpaceUtility.hlsl" +#include "shader_global.hlsli" +#include "atmosphere/functions.hlsli" +#include "punctualLightsMath.hlsli" + +#define TEX_ID_MULTIPLIER (1 << 5) +#define MAX_OMNI_LIGHTS 256 +#define MAX_SPOT_LIGHTS 256 + +#define DYNAMIC_LIGHTS_SSS 1 +#define LAMBERT_LIGHT 1 +#define DYNAMIC_LIGHTS_EARLY_EXIT 1 + +struct RenderOmniLight +{ + float4 posRadius; + float4 colorFlags; + float4 direction__tex_scale; + float4 boxR0; + float4 boxR1; + float4 boxR2; + float4 posRelToOrigin_cullRadius; +}; + +struct RenderSpotLight +{ + float4 lightPosRadius; + float4 lightColorAngleScale; //AngleScale sign bit contains contact_shadow bit + float4 lightDirectionAngleOffset; + float4 texId_scale; +}; + +GLOBAL_CBUFFER(LightConstBuffer) : register(b0) +{ + float4x4 mvp; + float4x4 globtm_inv; + float4 screen_pos_to_texcoord; + float4 world_view_pos; +}; + + +/* TODO: support Photometry +Texture2DArray photometry_textures_tex : register(t4); +SamplerState photometry_textures_tex_samplerstate : register(s4); +*/ + + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +/* TODO: support Photometry +half2 getPhotometryTexCoords(half3 lightDir, half3 dir, float zoom, bool rotate) +{ + half3 side = abs(lightDir.x) < 0.707106781186548 + ? half3(1, 0, 0) + : half3(0, 0, 1); + half3 forward = normalize(cross(side, lightDir)); + side = cross(lightDir, forward); +#if USE_OCTAHEDRAL_MAPPING + half2 tc = octahedral_mapping(half3(dot(side, dir), dot(lightDir, dir), dot(forward, dir)), zoom, rotate); +#else + half phi = atan2(dot(forward, dir), dot(side, dir)); + half2 tc = half2(phi / (2 * M_PI), acosFast4(dot(lightDir, dir)) / M_PI * zoom); +#endif + return tc; +} + +float getPhotometryValue(float3 light_dir, float3 dir, float zoom, bool rotated, float texId) +{ + half2 tc = getPhotometryTexCoords(light_dir, dir, zoom, rotated); + BRANCH + if (any(or(tc < 0, tc > 1))) + return 0; + float3 photometry = tex3Dlod( + photometry_textures_tex, + half4(tc, texId, 0)).rgb; + return SRGBToLinear_Fast(photometry.r).r; +} +*/ + +half applyPhotometryIntensity(float3 lightToWorldDir, float3 lightDir, float texId, float texScale_rotation, float currentAttenuation) +{ + return currentAttenuation; +// ##if photometry_textures_tex != NULL +// ##if photometry_textures_tex != NULL + //bool rotated = texScale_rotation < 0; + //float zoom = abs(texScale_rotation); + // BRANCH + //if (texId < 0 || currentAttenuation < 0.0001) + // return currentAttenuation; + //return getPhotometryValue(lightDir, lightToWorldDir, zoom, rotated, texId) * currentAttenuation; +// ##else +} + + +// from http://advances.realtimerendering.com/other/2016/naughty_dog/index.html +// http://advances.realtimerendering.com/other/2016/naughty_dog/NaughtyDog_TechArt_Final.pdf +half calc_micro_shadow(half NoL, half AO) +{ + return (half) saturate(abs(NoL) + half(2.0) * pow2(AO) - half(1.0)); +} + +float3x3 axis_matrix(float3 right, float3 up, float3 forward) +{ + float3 xaxis = right; + float3 yaxis = up; + float3 zaxis = forward; + return float3x3( + xaxis.x, yaxis.x, zaxis.x, + xaxis.y, yaxis.y, zaxis.y, + xaxis.z, yaxis.z, zaxis.z + ); +} + +float3 tangent_to_world(float3 vec, float3 tangentZ) +{ + float3 up = abs(tangentZ.z) < 0.999 ? float3(0, 0, 1) : float3(1, 0, 0); + float3 tangentX = normalize(cross(up, tangentZ)); + float3 tangentY = cross(tangentZ, tangentX); + return tangentX * vec.x + tangentY * vec.y + tangentZ * vec.z; +} + +float2 screen_pos_to_tc(float2 screen_pos) +{ + return screen_pos * screen_pos_to_texcoord.xy + screen_pos_to_texcoord.zw; +} diff --git a/project_templates/sample_scene/content/shaders/include/clustered/punctualLightsMath.hlsli b/project_templates/sample_scene/content/shaders/include/clustered/punctualLightsMath.hlsli new file mode 100644 index 00000000..cdd2ebf3 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/clustered/punctualLightsMath.hlsli @@ -0,0 +1,134 @@ +#include "fast_shader_trig.hlsli" + + //Window1 from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + float smoothDistanceAtt ( float squaredDistance, float invSqrAttRadius ) + { + float factor = squaredDistance * invSqrAttRadius ; + float smoothFactor = saturate (1.0f - factor * factor ); + return smoothFactor * smoothFactor; + } + + float getDistanceAtt ( float sqrDist, float invSqrAttRadius ) + { + float attenuation = rcp(max(sqrDist, 0.0001)); + attenuation = saturate(attenuation * smoothDistanceAtt ( sqrDist, invSqrAttRadius )); + return attenuation; + } + float getAngleAtt ( float3 normalizedLightVector, float3 lightDir, float lightAngleScale , float lightAngleOffset) + { + // On the CPU + // float lightAngleScale = 1.0f / max (0.001f, ( cosInner - cosOuter )); + // float lightAngleOffset = -cosOuter * angleScale ; + + float cd = dot ( lightDir , normalizedLightVector ); + float attenuation = saturate (cd * lightAngleScale + lightAngleOffset ); + // smooth the transition + return attenuation * attenuation ; + } + + +// A right disk is a disk oriented to always face the lit surface . +// Solid angle of a sphere or a right disk is 2 PI (1 - cos( subtended angle )). +// Subtended angle sigma = arcsin (r / d) for a sphere +// and sigma = atan (r / d) for a right disk +// sinSigmaSqr = sin( subtended angle )^2, it is (r^2 / d^2) for a sphere +// and (r^2 / ( r^2 + d ^2) ) for a disk +// cosTheta is not clamped +float illuminanceSphereOrDisk ( float cosTheta , float sinSigmaSqr ) +{ + float sinTheta = sqrt (1.0f - cosTheta * cosTheta ); + + float illuminance = 0.0f; + // Note : Following test is equivalent to the original formula . + // There is 3 phase in the curve : cosTheta > sqrt ( sinSigmaSqr ), + // cosTheta > -sqrt ( sinSigmaSqr ) and else it is 0 + // The two outer case can be merge into a cosTheta * cosTheta > sinSigmaSqr + // and using saturate ( cosTheta ) instead . + if ( cosTheta * cosTheta > sinSigmaSqr ) + { + illuminance = sinSigmaSqr * saturate ( cosTheta ); + } + else + { + float x = sqrt (1.0f / sinSigmaSqr - 1.0f); // For a disk this simplify to x = d / r + float y = -x * ( cosTheta / sinTheta ); + float sinThetaSqrtY = sinTheta * sqrt (1.0f - y * y); + illuminance = ( cosTheta * acosFast4 (y) - x * sinThetaSqrtY ) * sinSigmaSqr + atan (sinThetaSqrtY / x); + illuminance /= PI; + } + return max ( illuminance , 0.0f); +} + +float illuminanceSphereAttenuation ( float3 worldNormal, float3 dirToLight, float lightRadius, float sqrDist) +{ + // Sphere evaluation + float cosTheta = clamp ( dot ( worldNormal, dirToLight), -0.999, 0.999) ; // Clamp to avoid edge case + // We need to prevent the object penetrating into the surface + // and we must avoid divide by 0, thus the 0.9999 f + + float sqrLightRadius = lightRadius * lightRadius ; + float sinSigmaSqr = min( sqrLightRadius / sqrDist, 0.9999f); + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ); + return illuminance; +} + + +float illuminanceDiskAttenuation ( float3 worldNormal, float3 dirToLight, float3 planeNormal, float lightRadius, float sqrDist) +{ + // Disk evaluation + float cosTheta = dot ( worldNormal, dirToLight); + float sqrLightRadius = lightRadius * lightRadius ; + // Do not let the surface penetrate the light + float sinSigmaSqr = sqrLightRadius / ( sqrLightRadius + max ( sqrLightRadius , sqrDist )); + // Multiply by saturate ( dot ( planeNormal , -dirToLight)) to better match ground truth . + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ) * saturate ( dot( planeNormal , -dirToLight)); + return illuminance; +} + +void spot_light_params(float3 worldPos, float4 pos_and_radius, float3 light_direction, float lightAngleScale, float lightAngleOffset, out half geomAttenuation, out float3 dirFromLight, out float3 point2light) +{ + point2light = pos_and_radius.xyz-worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float rcpDistFromLight = rsqrt(0.0000001+distSqFromLight); + dirFromLight = point2light*rcpDistFromLight; + float invSqrRad = rcp(pow2(pos_and_radius.w)); + + geomAttenuation = getDistanceAtt( distSqFromLight, invSqrRad ); + geomAttenuation = geomAttenuation*getAngleAtt ( -dirFromLight, light_direction, lightAngleScale, lightAngleOffset); +} + +half areaSphereNormalization( float len, float lightSize, float m ) +{ + // Compute the normalization factors. + // Note: just using sphere normalization (todo: come up with proper disk/plane normalization) + half dist = saturate(lightSize / len); + half normFactor = m / ( m + 0.5 * dist ); + return normFactor * normFactor; +} + +half3 areaSphereLight(half3 R, half3 L, half m, half lightSize) +{ + // Intersect the sphere. + half3 centerDir = L - dot(L, R) * R; + L = L - centerDir * saturate( lightSize / (length(centerDir)+1e-6) ); + return L.xyz; +} + +half4 SphereAreaLightIntersection( half3 N, half3 V, half3 L, half ggx_alpha, half lightSize ) +{ + half4 lightVec = half4(L.xyz, 1.0f); + half3 R = reflect(V, N); + + lightVec.xyz = areaSphereLight(R, L, ggx_alpha, lightSize); + + // Normalize. + half len = max(length( lightVec.xyz ), 1e-6); + lightVec.xyz /= len; + + // Energy normalization + lightVec.w = areaSphereNormalization( len, lightSize, ggx_alpha ); + + return lightVec; +} + + diff --git a/project_templates/sample_scene/content/shaders/include/common_types.hlsli b/project_templates/sample_scene/content/shaders/include/common_types.hlsli new file mode 100644 index 00000000..8aa64c30 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/common_types.hlsli @@ -0,0 +1,17 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; diff --git a/project_templates/sample_scene/content/shaders/include/cs_common.hlsli b/project_templates/sample_scene/content/shaders/include/cs_common.hlsli new file mode 100644 index 00000000..93fc9fad --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/cs_common.hlsli @@ -0,0 +1,51 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_global.hlsli" + +static float3 CUBE_FACES_N[CUBE_FACE_COUNT] = { + UNIT_X, + -UNIT_X, + UNIT_Y, + -UNIT_Y, + UNIT_Z, + -UNIT_Z +}; +static float3 CUBE_FACES_T[CUBE_FACE_COUNT] = { + -UNIT_Z, + UNIT_Z, + UNIT_X, + UNIT_X, + UNIT_X, + -UNIT_X +}; +static float3 CUBE_FACES_B[CUBE_FACE_COUNT] = { + -UNIT_Y, + -UNIT_Y, + UNIT_Z, + -UNIT_Z, + -UNIT_Y, + -UNIT_Y +}; + +float2 GetUV(uint2 id, uint2 imageSize) +{ + const float2 pixelSize = 1.0f / imageSize; + return pixelSize * id + pixelSize * 0.5; +} + +float3 GetCubeDirection(uint curFaceIndex, float2 uv) +{ + const float2 xy = uv * 2.0 - 1.0; + + const float3 normal = CUBE_FACES_N[curFaceIndex]; + const float3 tangent = CUBE_FACES_T[curFaceIndex]; + const float3 binormal = CUBE_FACES_B[curFaceIndex]; + + return normalize(normal + xy.x * tangent + xy.y * binormal); +} + +float CosThetaWorld(float3 N, float3 v) +{ + return max(dot(N, v), 0.0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/csm.hlsli b/project_templates/sample_scene/content/shaders/include/csm.hlsli new file mode 100644 index 00000000..28cd79bb --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/csm.hlsli @@ -0,0 +1,204 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "hardware_defines.hlsli" + +#ifndef CSM_HLSL +#define CSM_HLSL 1 + +#ifndef NUM_CASCADES + #define NUM_CASCADES 4 +#endif + +#define shadow2D(a, uv) a.SampleCmpLevelZero(csmSampler, (uv).xy, (uv).z) +#define shadow2DArray(a, uv) a.SampleCmpLevelZero(csmSampler, (uv).xyz, (uv).w) + +// inc "./csm_shadow_tc.hlsl" +#ifndef shadow_array_supported +#define shadow_array_supported 0 +#endif + +#ifndef MIN_SHADOW_SIZE + #define MIN_SHADOW_SIZE 512 +#endif + +#define HALF (float3(0.5-2./MIN_SHADOW_SIZE, 0.5-2./MIN_SHADOW_SIZE, 0.5))//0.5-2/512 (512 is our smallest cascade size) + +#ifndef LAST_CASCADE +#define LAST_CASCADE NUM_CASCADES +#endif + +SYSTEM_CBUFFER(CSMBuffer) : register(b3) +{ + float4 pcf_lerp; + float4 shadow_cascade_tm_transp[24]; + float4 shadow_cascade_tc_mul_offset[6]; +} + +float get_csm_shadow_effect( uint cascade_id, float3 t0, float3 t1, float3 t2, float3 t3, float3 t4, float3 t5 ) +{ + float csmEffect = 0; + csmEffect = (LAST_CASCADE==6 && cascade_id == LAST_CASCADE-1) ? max3(abs(t5.x), abs(t5.y), abs(t5.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==5 && cascade_id == LAST_CASCADE-1) ? max3(abs(t4.x), abs(t4.y), abs(t4.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==4 && cascade_id == LAST_CASCADE-1) ? max3(abs(t3.x), abs(t3.y), abs(t3.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==3 && cascade_id == LAST_CASCADE-1) ? max3(abs(t2.x), abs(t2.y), abs(t2.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==2 && cascade_id == LAST_CASCADE-1) ? max3(abs(t1.x), abs(t1.y), abs(t1.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==1 && cascade_id == LAST_CASCADE-1) ? max3(abs(t0.x), abs(t0.y), abs(t0.z))*2 : csmEffect; + return csmEffect; +} + +float3 get_csm_shadow_tc(float3 pointToEye, float sel_scale, out uint cascade_id, out float csmEffect, out float3 tlast) +{ + pointToEye = -pointToEye; + //to be moved out to const buffer + float3 t0,t1,t2,t3,t4,t5; + t0 = pointToEye.x*shadow_cascade_tm_transp[4*0+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*0+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*0+2].xyz + + shadow_cascade_tm_transp[4*0+3].xyz; + #if NUM_CASCADES>1 + t1 = pointToEye.x*shadow_cascade_tm_transp[4*1+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*1+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*1+2].xyz + + shadow_cascade_tm_transp[4*1+3].xyz; + #endif + #if NUM_CASCADES>2 + t2 = pointToEye.x*shadow_cascade_tm_transp[4*2+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*2+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*2+2].xyz + + shadow_cascade_tm_transp[4*2+3].xyz; + #endif + #if NUM_CASCADES>3 + t3 = pointToEye.x*shadow_cascade_tm_transp[4*3+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*3+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*3+2].xyz + + shadow_cascade_tm_transp[4*3+3].xyz; + #endif + #if NUM_CASCADES>4 + t4 = pointToEye.x*shadow_cascade_tm_transp[4*4+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*4+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*4+2].xyz + + shadow_cascade_tm_transp[4*4+3].xyz; + #endif + #if NUM_CASCADES>5 + t5 = pointToEye.x*shadow_cascade_tm_transp[4*5+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*5+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*5+2].xyz + + shadow_cascade_tm_transp[4*5+3].xyz; + #endif + + tlast = float3(0, 0, 0); + #if NUM_CASCADES==2 + tlast = t1; + #elif NUM_CASCADES==3 + tlast = t2; + #elif NUM_CASCADES==4 + tlast = t3; + #elif NUM_CASCADES==5 + tlast = t4; + #elif NUM_CASCADES==6 + tlast = t5; + #endif + float3 use_half = sel_scale * HALF; + bool b5 = NUM_CASCADES > 5 && all(abs(t5) 4 && all(abs(t4) 3 && all(abs(t3) 2 && all(abs(t2) 1 && all(abs(t1) + +float3 diffuseLambert( float3 diffuseColor ) +{ + return diffuseColor;//division by PI omitted intentionally, lightColor is divided by Pi +} + +//linearRoughness - perceptual linear roughness +float3 diffuseBurley( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + float FD90 = 0.5 + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return diffuseColor * ( FdV * FdL );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//from moving FrostBite to PBR, energy conservative burley diffuse +float diffuseBurleyFixedFresnel( float linearRoughness, float NoV, float NoL, float VoH ) +{ + float energyBias = 0.5; + float energyFactor = (0.45f * linearRoughness - 0.475f) * linearRoughness + 1.0f; + float FD90 = energyBias + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return ( FdV * FdL * energyFactor);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float3 diffuseBurleyFixed( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + return diffuseColor * diffuseBurleyFixedFresnel( linearRoughness, NoV, NoL, VoH);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float diffuseChanFresnel( float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + // Since we use CoD fitting, need to invert/convert our roughness parametrization to + // their glossiness parametrization 'g' + float ggx_alpha = linear_roughness*linear_roughness; + float a2 = ggx_alpha*ggx_alpha; + float g = saturate( (1.0 / 18.0) * log2( 2 / a2 - 1 ) ); + + float f0 = VoH + pow5(1 - VoH); + // This factor tunes the enery boost at grazing angle for low roughness material. + // It creates energy ring at grazing angle for smooth dieletric material + // The higher the value 'rimScale' is, the lower the energy boost will be + // The default value from Chan is 0.75. + // Setting the value to 1.0 get rid off this energy boost. + const float rimScale = 0.75f; + float f1 = (1.0 - rimScale * pow5(1.0 - NoL)) * (1.0 - rimScale * pow5(1.0 - NoV)); + + // Rough (f0) to smooth f1 response interpolation + float fd = lerp( f0, f1, saturate( 2.2 * g - 0.5 ) ); + + // Retro reflectivity contribution. + float fb = ( (34.5 * g - 59 ) * g + 24.5 ) * VoH * exp2( -max( 73.2 * g - 21.2, 8.9 ) * sqrt( NoH ) ); + // allow to fade our rough retro reflectivity + fb *= retroReflectivityWeight; + return ( fd + fb ); +} + +float3 diffuseChan( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + return diffuseColor * diffuseChanFresnel(linear_roughness, NoV, NoL, VoH, NoH, retroReflectivityWeight); +} + +float3 diffuseOrenNayar( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH ) +{ + float VoL = 2 * VoH - 1; + float m = linear_roughness * linear_roughness; + float m2 = m * m; + float C1 = 1 - 0.5 * m2 *rcp(m2 + 0.33); + float Cosri = VoL - NoV * NoL; + + float C2 = 0.45 * m2 * rcp(m2 + 0.09) * ( Cosri >= 0 ? Cosri * rcp(max(NoL, NoV)) : 0 ); + return diffuseColor * (C1 + C2); + //float C2 = 0.45 * m2 * rcp(m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NoL / NoV ) : NoL ); + //return diffuseColor * ( NoL * C1 + C2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// N is the normal direction +// V is the view vector +// NdotV is the cosine angle between the view vector and the normal +float3 getDiffuseDominantDir ( float3 N, float3 V, float saturated_NdotV, float ggx_alpha) +{ + float a = 1.02341f * ggx_alpha - 1.51174f; + float b = -0.511705f * ggx_alpha + 0.755868f; + float lerpFactor = saturate (( saturated_NdotV* a + b) * ggx_alpha); + // The result is not normalized as we fetch in a cubemap + return lerp (N, V, lerpFactor ); +} + + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/envi_brdf.hlsli b/project_templates/sample_scene/content/shaders/include/envi_brdf.hlsli new file mode 100644 index 00000000..6eaa79be --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/envi_brdf.hlsli @@ -0,0 +1,44 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef ENVI_BRDF_HLSL +#define ENVI_BRDF_HLSL 1 + +#ifndef INV_MIN_IOR +#define INV_MIN_IOR 50.0h +#endif + +//--------------- +// EnvBRDF +//--------------- + +half2 get_EnvBRDF_AB_Approx( half linear_roughness, half NoV ) +{ + // [ Lazarov 2013, "Getting More Physical in Call of Duty: Black Ops II" ] + // Adaptation to fit our G term. + const half4 c0 = { -1.h, -0.0275h, -0.572h, 0.022h }; + const half4 c1 = { 1.h, 0.0425h, 1.04h, -0.04h }; + half4 r = linear_roughness * c0 + c1; + half a004 = min( r.x * r.x, exp2( -9.28h * NoV ) ) * r.x + r.y; + return half2( -1.04h, 1.04h ) * a004 + r.zw; +} + +half3 EnvBRDFApprox( half3 specularColor, half linear_roughness, half NoV ) +{ + // [ Lazarov 2013, "Getting More Physical in Call of Duty: Black Ops II" ] + // Adaptation to fit our G term. + half2 AB = get_EnvBRDF_AB_Approx( linear_roughness, NoV ); + return specularColor * AB.x + AB.yyy*saturate(INV_MIN_IOR*specularColor.g); +} + + +half EnvBRDFApproxNonmetal( half linear_roughness, half NoV ) +{ + // Same as EnvBRDFApprox( 0.04, roughness, NoV ) + const half2 c0 = { -1.h, -0.0275h }; + const half2 c1 = { 1.h, 0.0425h }; + half2 r = linear_roughness * c0 + c1; + return min( r.x * r.x, exp2( -9.28h * NoV ) ) * r.x + r.y; +} + +#endif diff --git a/project_templates/sample_scene/content/shaders/include/fast_shader_trig.hlsli b/project_templates/sample_scene/content/shaders/include/fast_shader_trig.hlsli new file mode 100644 index 00000000..53cc7f7e --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/fast_shader_trig.hlsli @@ -0,0 +1,57 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef SHADER_FAST_MATH_INC_FX +#define SHADER_FAST_MATH_INC_FX +// +// Trigonometric functions +// +#define fsl_PI 3.1415926535897932384626433f +#define fsl_HALF_PI (0.5f * 3.1415926535897932384626433f) + +// 4th order polynomial approximation +// 4 VGRP, 16 ALU Full Rate +// 7 * 10^-5 radians precision +// Reference : Handbook of Mathematical Functions (chapter : Elementary Transcendental Functions), M. Abramowitz and I.A. Stegun, Ed. +float acosFast4(float inX) +{ + float x1 = abs(inX); + float x2 = x1 * x1; + float x3 = x2 * x1; + float s; + + s = -0.2121144f * x1 + 1.5707288f; + s = 0.0742610f * x2 + s; + s = -0.0187293f * x3 + s; + s = sqrt(1.0f - x1) * s; + + // acos function mirroring + // check per platform if compiles to a selector - no branch neeeded + return inX >= 0.0f ? s : fsl_PI - s; +} + +// 4th order polynomial approximation +// 4 VGRP, 16 ALU Full Rate +// 7 * 10^-5 radians precision +float asinFast4(float inX) +{ + float x = inX; + + // asin is offset of acos + return fsl_HALF_PI - acosFast4(x); +} + +// 4th order hyperbolical approximation +// 4 VGRP, 12 ALU Full Rate +// 7 * 10^-5 radians precision +// Reference : Efficient approximations for the arctangent function, Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006 +float atanFast4(float inX) +{ + float x = inX; + return x*(-0.1784f * abs(x) - 0.0663f * x * x + 1.0301f); +} + +#undef fsl_PI +#undef fsl_HALF_PI + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/gbuffer_base.hlsli b/project_templates/sample_scene/content/shaders/include/gbuffer_base.hlsli new file mode 100644 index 00000000..354875c4 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/gbuffer_base.hlsli @@ -0,0 +1,243 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + +bool isEmissiveShader(float material) +{ + return material == SHADING_EMISSIVE; +} + +struct ProcessedGbuffer +{ + half3 diffuseColor; + half3 specularColor; + half3 translucencyColor; + half roughness, linearRoughness; + float3 normal; + + half metallness; + half translucency; // either translucent or metallic + + half extracted_albedo_ao; // custom + half ao; // custom + half shadow; + half3 emissionColor; + half emission_part; + float material; +}; + +struct UnpackedGbuffer +{ + half3 albedo; + half smoothness; + float3 normal; + + half metallness; // either translucent or metallic or emission + half translucency; // either translucent or metallic or emission + half emission_part; // either translucent or metallic or emission + + half ao; // either ao, or emission + half emission_strength; // either ao, or emission + half shadow; + float material; + float outline; +}; + +struct PackedGbuffer +{ + half4 albedo_ao; + float4 normal_smoothness_material; + half2 metallTranslucency_shadow; // processed +}; +// Spheremap Transform +float2 encodeNormal(float3 n) +{ + half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5)); + enc = enc*0.5+0.5; + return enc; +} +float3 decodeNormal(float2 enc) +{ + float4 nn = float4(enc.xy,0,0)*float4(2,2,0,0) + float4(-1,-1,1,-1); + half l = dot(nn.xyz,-nn.xyw); + nn.z = l; + nn.xy *= sqrt(l); + return (nn.xyz * 2 + half3(0,0,-1)); +} +half luminance(half3 col) +{ + return dot(col, half3(0.299, 0.587, 0.114)); +} +half decode_albedo_ao(half3 albedo) +{ + return saturate(luminance(albedo) * (1 / 0.04)) * 0.9 + 0.1; // anything darker than charcoal is not physical possible, and is shadow +} +PackedGbuffer pack_gbuffer(UnpackedGbuffer gbuffer) +{ + PackedGbuffer gbuf; + half metallnessOrTranslucency = gbuffer.metallness; + metallnessOrTranslucency = isEmissiveShader(gbuffer.material) ? gbuffer.emission_part : metallnessOrTranslucency; + + float3 normal_smoothness = float3(encodeNormal(gbuffer.normal.xyz), max(gbuffer.smoothness, 1.0 / 127)); + half material = gbuffer.material * (1.f / 3.0); + gbuf.normal_smoothness_material = float4(normal_smoothness, material); + gbuf.albedo_ao = half4(gbuffer.albedo, isEmissiveShader(gbuffer.material) ? gbuffer.emission_strength * (1.0f / MAX_EMISSION) : gbuffer.ao); + // gbuf.albedo_ao = half4(pow(gbuffer.albedo, 1/2.2), gbuffer.ao); + // gbuf.metallTranslucency_shadow = (floor(metallnessOrTranslucency*15)*16+floor(gbuffer.shadow*15))*(1.0/255.0); + gbuf.metallTranslucency_shadow = float2(metallnessOrTranslucency, gbuffer.shadow); + return gbuf; +} + +void unpackNormalSmoothness(float3 normal_smoothness, out float3 normal, out half smoothness) +{ + normal = decodeNormal(normal_smoothness.xy); + smoothness = abs(normal_smoothness.z); +} + +void unpackGbufferNormalSmoothness(PackedGbuffer gbuf, out float3 normal, out half smoothness) +{ + unpackNormalSmoothness(gbuf.normal_smoothness_material.xyz, normal, smoothness); +} + +UnpackedGbuffer unpackGbuffer(PackedGbuffer gbuf) +{ + UnpackedGbuffer gbuffer; + + gbuffer.material = floor(gbuf.normal_smoothness_material.w * 3.f); + // half metallTranslucency_shadow = gbuf.metallTranslucency_shadow.x*(255.0/16.0); + // half shadow = frac(metallTranslucency_shadow)*(16.0/15.0); + // half metallnessOrTranslucency = floor(metallTranslucency_shadow)*(1./15); + half shadow = gbuf.metallTranslucency_shadow.y; + half metallnessOrTranslucency = gbuf.metallTranslucency_shadow.x; + gbuffer.albedo = gbuf.albedo_ao.xyz; + unpackGbufferNormalSmoothness(gbuf, gbuffer.normal, gbuffer.smoothness); + + gbuffer.emission_part = isEmissiveShader(gbuffer.material) ? metallnessOrTranslucency : 0; + gbuffer.metallness = metallnessOrTranslucency; + gbuffer.translucency = 0; + gbuffer.ao = isEmissiveShader(gbuffer.material) ? 1 : gbuf.albedo_ao.w; + gbuffer.emission_strength = isEmissiveShader(gbuffer.material) ? gbuf.albedo_ao.w * MAX_EMISSION : 0; + gbuffer.shadow = shadow; + // gbuffer.diffuseColor = albedo*(1-gbuffer.metallness); + // half fresnel0Dielectric = 0.04f;//lerp(0.16f,0.01f, smoothness);//sqr((1.0 - refractiveIndex)/(1.0 + refractiveIndex)) for dielectrics; + // gbuffer.specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), albedo, gbuffer.metallness); + return gbuffer; +} +ProcessedGbuffer processGbuffer(UnpackedGbuffer gbuf) +{ + ProcessedGbuffer gbuffer; + gbuffer.material = gbuf.material; + gbuffer.normal = gbuf.normal; + gbuffer.linearRoughness = 1 - gbuf.smoothness; + gbuffer.roughness = max(1e-4, gbuffer.linearRoughness * gbuffer.linearRoughness); + gbuffer.metallness = gbuf.metallness; + gbuffer.translucency = gbuf.translucency; // due to 2 bit encoding *0.75 is correct + gbuffer.emissionColor = gbuf.emission_strength * gbuf.albedo; + gbuffer.emission_part = gbuf.emission_part; + gbuffer.extracted_albedo_ao = decode_albedo_ao(gbuf.albedo); + gbuffer.diffuseColor = gbuf.albedo - gbuffer.metallness * gbuf.albedo; //*(1-met) + gbuffer.shadow = gbuf.shadow; + gbuffer.translucencyColor = gbuffer.diffuseColor * gbuffer.translucency; + + half fresnel0Dielectric = 0.04f; // + (gbuf.material == SHADING_NORMAL ? 0.2 * (1-gbuf.shadow) : 0);//lerp(0.16f,0.01f, roughness);//sqr((1.0 - refractiveIndex)/(1.0 + refractiveIndex)) for dielectrics; + fresnel0Dielectric = lerp(fresnel0Dielectric, 0.01f, gbuffer.roughness * gbuffer.translucency); + fresnel0Dielectric *= (1 - gbuffer.translucency); + gbuffer.specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), gbuf.albedo, gbuffer.metallness); + gbuffer.ao = gbuf.ao; + return gbuffer; +} + +void init_gbuffer(out UnpackedGbuffer result) +{ + result.albedo = result.normal = 0; + result.smoothness = result.metallness = result.translucency = 0; + result.emission_part = result.emission_strength = 0; + result.ao = result.shadow = 1; + result.material = SHADING_NORMAL; +} +void init_albedo(inout UnpackedGbuffer result, half3 albedo) +{ + result.albedo.xyz = albedo; +} +void init_smoothness(inout UnpackedGbuffer result, half smoothness) +{ + result.smoothness = smoothness; +} + +void init_normal(inout UnpackedGbuffer result, float3 norm) +{ + result.normal = norm; +} + +void init_metalness(inout UnpackedGbuffer result, half metal) +{ + result.metallness = metal; +} +void init_translucency(inout UnpackedGbuffer result, half translucency) +{ + result.translucency = translucency; +} + +void init_ao(inout UnpackedGbuffer result, half ao) +{ + result.ao = ao; +} +void init_shadow(inout UnpackedGbuffer result, half shadow) +{ + result.shadow = shadow; +} +void init_material(inout UnpackedGbuffer result, float material) +{ + result.material = material; +} +void init_emission(inout UnpackedGbuffer result, float emission_strength) +{ + result.emission_strength = emission_strength; +} +void init_emission_part(inout UnpackedGbuffer result, float emission_part) +{ + result.emission_part = emission_part; +} + +struct GBUFFER_OUTPUT +{ + half4 albedo_ao : SV_Target0; + float4 normal_smoothness_material : SV_Target1; + half4 metallTranslucency_shadow : SV_Target2; +}; + +GBUFFER_OUTPUT write_gbuffer(PackedGbuffer gbuf) +{ + GBUFFER_OUTPUT gbufOut; + gbufOut.albedo_ao = gbuf.albedo_ao; + gbufOut.normal_smoothness_material = gbuf.normal_smoothness_material; + gbufOut.metallTranslucency_shadow = half4(gbuf.metallTranslucency_shadow,0,0); + return gbufOut; +} + +GBUFFER_OUTPUT encode_gbuffer_raw(UnpackedGbuffer gbuffer) +{ + return write_gbuffer(pack_gbuffer(gbuffer)); +} + +#define encode_gbuffer(a,b) encode_gbuffer_raw(a) + +half3 perturb_normal(half3 localNorm, half3 N, float3 p, float2 uv) +{ + // get edge vectors of the pixel triangle + float3 dp1 = ddx(p); + float3 dp2 = ddy(p); + float2 duv1 = ddx(uv); + float2 duv2 = ddy(uv); + + // solve the linear system + float3 dp2perp = cross(N, dp2); + float3 dp1perp = cross(dp1, N); + float3 T = dp2perp * duv1.x + dp1perp * duv2.x; + float3 B = dp2perp * duv1.y + dp1perp * duv2.y; + + // construct a scale-invariant frame + float invmax = rsqrt(max(dot(T, T), dot(B, B))); + return half3(localNorm.z * N + (localNorm.x * invmax) * T + (localNorm.y * invmax) * B); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/gbuffer_read.hlsli b/project_templates/sample_scene/content/shaders/include/gbuffer_read.hlsli new file mode 100644 index 00000000..87e0a671 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/gbuffer_read.hlsli @@ -0,0 +1,25 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "gbuffer_base.hlsli" + +Texture2D albedo_gbuf: register(t0); +Texture2D normal_gbuf: register(t1); +Texture2D material_gbuf: register(t2); +Texture2D depth_gbuf: register(t3); + +SamplerState default_sampler : register(s0); + +PackedGbuffer readPackedGbuffer(float2 tc) +{ + PackedGbuffer gbuf; + gbuf.albedo_ao = albedo_gbuf.SampleLevel(default_sampler, tc, 0); + gbuf.normal_smoothness_material = normal_gbuf.SampleLevel(default_sampler, tc, 0); + gbuf.metallTranslucency_shadow = material_gbuf.SampleLevel(default_sampler, tc, 0).xy; + return gbuf; +} + +ProcessedGbuffer readProcessedGbuffer(float2 tc) +{ + return processGbuffer(unpackGbuffer(readPackedGbuffer(tc))); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/hardware_defines.hlsli b/project_templates/sample_scene/content/shaders/include/hardware_defines.hlsli new file mode 100644 index 00000000..f70f776e --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/hardware_defines.hlsli @@ -0,0 +1,270 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef HARDWARE_DEFINES_HEADER +#define HARDWARE_DEFINES_HEADER 1 + + + +#if _HARDWARE_METAL +#define BGRA_SWIZZLE(a) a.zyxw +#define BGR_SWIZZLE(a) a.zyx +#endif +#ifndef BGRA_SWIZZLE +#define BGRA_SWIZZLE(a) a +#endif +#ifndef BGR_SWIZZLE +#define BGR_SWIZZLE(a) a +#endif + +#ifndef SHADER_COMPILER_HLSL2021 +#define SHADER_COMPILER_HLSL2021 1 +#endif + +#define GPU_TARGET 1 +#define PI 3.14159265f +#define PIh 3.14159265h + +#define EPSILON 0.000001 +#define UNIT_X float3(1.0, 0.0, 0.0) +#define UNIT_Y float3(0.0, 1.0, 0.0) +#define UNIT_Z float3(0.0, 0.0, 1.0) + +#define HAS_REVERSEBITS 1 +#define SEPARATE_SAMPLER_OBJECT 1 +#define double doubles_are_not_supported_by_some_gpus +#define double2 doubles_are_not_supported_by_some_gpus +#define double3 doubles_are_not_supported_by_some_gpus +#define double4 doubles_are_not_supported_by_some_gpus + +#define fixed half +#define fixed2 half2 +#define fixed3 half3 +#define fixed4 half4 + +float max3(float a, float b, float c) +{ + return max(a, max(b, c)); +} +float min3(float a, float b, float c) +{ + return min(a, min(b, c)); +} +#define INVARIANT(x) x + +float max3(float3 a) +{ + return max3(a.x, a.y, a.z); +} +float max4(float a, float b, float c, float d) +{ + return max(max(a, d), max(b, c)); +} +float min4(float a, float b, float c, float d) +{ + return min(min(a, d), min(b, c)); +} + +#define PRECISE precise +#define SQRT_SAT(x) sqrt(saturate(x)) +#define VS_OUT_POSITION(name) float4 name:SV_POSITION; +#define tex2Dgrad(a, uv, dx, dy) a.SampleGrad(a##_samplerstate, (uv).xy, dx, dy) +#define tex2Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xy, (uv).w) +#define tex3Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, (uv).w) +#define texCUBElod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, uv.w) +#define texCUBEArraylod(a, uv, lod) a.SampleLevel(a##_samplerstate, (uv).xyzw, lod) +#define tex2Dproj(a, uv) a.Sample(a##_samplerstate, (uv).xy/(uv).w) +#define tex2D(a, uv) a.Sample(a##_samplerstate, uv) +#define tex3D(a, uv) a.Sample(a##_samplerstate, uv) +#define texCUBE(a, uv) a.Sample(a##_samplerstate, uv) +#define textureGather(a, tc) a.Gather(a##_samplerstate, tc) +#define texelFetchOffset(a, tc, lod, ofs) a.Load(int3(tc, lod), ofs) +#define textureOffset(a, tc, ofs) a.Sample(a##_samplerstate, tc, ofs) +#define textureLodOffset(a, tc, lod, ofs) a.SampleLevel(a##_samplerstate, tc, lod, ofs) + +#define CLAMP_BORDER(a, name, val) +#define LOOP [loop] +#define UNROLL [unroll] +#define BRANCH [branch] +#define FLATTEN [flatten] + +#define EMPTY_STRUCT(name) struct name {} +#define DECLARE_UNUSED_MEMBER +#define RETURN_EMPTY_STRUCT(name) +#define INIT_EMPTY_STRUCT(name) + +#define HW_USE_SCREEN_POS +#define GET_SCREEN_POS(vs_pos) vs_pos +#ifndef TEXELFETCH_DEFINED +#define TEXELFETCH_DEFINED 1 + +#define CHECK_TEXTURE2D +#define CHECK_TEXTURE2D_EXPR(a, tc) 0 +#define CHECK_TEXTURE2DARRAY +#define CHECK_TEXTURE3D +#define CHECK_BUFFER(file, ln, name) +#define CHECK_BUFFER_EXPR(a, tc) 0 +#define CHECK_STRUCTURED_BUFFER(file, ln, name) +#define CHECK_STRUCTURED_BUFFER_EXPR(a, tc) 0 +#define CHECK_STENCIL +float4 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float3 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float2 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float4 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float4 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +#define texelFetch(a, tc, lod) texelFetchBase(a, tc, lod, _FILE_, __LINE__, -1) + +float4 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float3 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float2 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(StructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(RWStructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +uint loadBufferBase(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +#define loadBuffer(a, tc) loadBufferBase(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer2(a, tc) loadBuffer2Base(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer3(a, tc) loadBuffer3Base(a, tc, _FILE_, __LINE__, get_name_##a) +#define loadBuffer4(a, tc) loadBuffer4Base(a, tc, _FILE_, __LINE__, -1) +void storeBufferBase(RWByteAddressBuffer a, int tc, uint value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store(tc, value); +} +void storeBuffer2Base(RWByteAddressBuffer a, int tc, uint2 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store2(tc, value); +} +void storeBuffer3Base(RWByteAddressBuffer a, int tc, uint3 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store3(tc, value); +} +void storeBuffer4Base(RWByteAddressBuffer a, int tc, uint4 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store4(tc, value); +} +#define storeBuffer(a, tc, value) storeBufferBase(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer2(a, tc, value) storeBuffer2Base(a, tc, value, _FILE_, __LINE__, get_name_##a) +#define storeBuffer3(a, tc, value) storeBuffer3Base(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer4(a, tc, value) storeBuffer4Base(a, tc, value, _FILE_, __LINE__, -1) +#define structuredBufferAt(a, tc) a[uint((CHECK_STRUCTURED_BUFFER_EXPR(a, tc), tc))] +#define bufferAt(a, tc) a[uint((CHECK_BUFFER_EXPR(a, tc), tc))] +#define texture2DAt(a, tc) a[int2((CHECK_TEXTURE2D_EXPR(a, tc), tc))] +#endif + +uint stencilFetchBase(Texture2D a, int2 tc, int file, int ln, int name) +{ + CHECK_STENCIL; + return a[tc].g; +} +#define stencilFetch(a, tc) stencilFetchBase(a, tc, _FILE_, __LINE__, get_name_##a) + +#if !SHADER_COMPILER_HLSL2021 +#define select(a, b, c) a ? b : c +#define or(a, b) a || b +#endif + +half3 h3nanofilter(half3 val) +{ +#if HALF_PRECISION + return min(val, 65504.h); +#else + return select(isfinite(dot(val, val)).xxx, val, half3(0, 0, 0)); +#endif +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/in_out.hlsli b/project_templates/sample_scene/content/shaders/include/in_out.hlsli new file mode 100644 index 00000000..e2bac6f2 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/in_out.hlsli @@ -0,0 +1,85 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct VsInput +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; +}; + +struct VsVFXOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; + int frameID : TEXCOORD1; + int columns : TEXCOORD2; + int rows : TEXCOORD3; +}; + +struct VsInputLit +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 tangent : TANGENT; +}; + +struct VsOutputLit +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; +}; + +struct VsOutputLitForward +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; + float3 worldPos : TEXCOORD1; + float4 color : COLOR; +}; + +struct VsInputZPrepass +{ + float3 position : POSITION; +}; + +struct VsInputZPrepassSkinned +{ + float3 position : POSITION; + float4 boneWeights : BLENDWEIGHT; + uint4 boneIndices : BLENDINDICES; +}; + +struct VsOutputGBuff +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float3 tangent : TANGENT; + float2 texCoord : TEXCOORD; + float3 p2e : TEXCOORD1; +}; + +struct VsOutputZPrepass +{ + float4 position : SV_Position; + nointerpolation uint4 uid : TEXCOORD0; +}; + +struct VsOutputResolve +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; diff --git a/project_templates/sample_scene/content/shaders/include/pbr.hlsli b/project_templates/sample_scene/content/shaders/include/pbr.hlsli new file mode 100644 index 00000000..c8c1db1f --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/pbr.hlsli @@ -0,0 +1,235 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef __BRDF_COMMON__ +#define __BRDF_COMMON__ + +#include +#include +#include + +// Diffuse model +#define DIFFUSE_LAMBERT 0 +#define DIFFUSE_OREN_NAYAR 1 +#define DIFFUSE_BURLEY 2 +#define DIFFUSE_BURLEY_FIXED 3 +#define DIFFUSE_CHAN 4 + +#ifndef BRDF_DIFFUSE +#define BRDF_DIFFUSE DIFFUSE_BURLEY_FIXED//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_LAMBERT// +#endif + +// Microfacet distribution function + +#define SPEC_D_BLINN 0 +#define SPEC_D_BECKMANN 1 +#define SPEC_D_GGX 2 + +#ifndef BRDF_SPEC_D +#define BRDF_SPEC_D SPEC_D_GGX +#endif + +// Geometric attenuation or shadowing +#define SPEC_G_IMPLICIT 0 +#define SPEC_G_NEUMANN 1 +#define SPEC_G_KELEMEN 2 +#define SPEC_G_SHLICK 3 +#define SPEC_G_SMITH_GGX 4 +#define SPEC_G_SMITH_CORRELATED 5 +#define SPEC_G_SMITH_CORRELATED_APPROX 6 + +#ifndef BRDF_SPEC_G +#define BRDF_SPEC_G SPEC_G_SMITH_CORRELATED +#endif + +// Fresnel +#define SPEC_F_NONE 0 +#define SPEC_F_SHLICK 1 +#define SPEC_F_FRESNEL 2 +#ifndef BRDF_SPEC_F +#define BRDF_SPEC_F SPEC_F_SHLICK +#endif + +// Sheen +#ifndef SHEEN_SPECULAR +#define SHEEN_SPECULAR 0 +#endif + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + //#error call different BRDF_diffuse, with NoH + return 0; +#endif +} + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH, float NoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + return diffuseChan( diffuseColor, linearRoughness*linearRoughness, NoV, NoL, VoH, NoH); +#endif +} + +float BRDF_distribution(float ggx_alpha, float NoH) +{ +#if BRDF_SPEC_D == SPEC_D_BLINN + return distributionBlinn( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_BECKMANN + return distributionBeckmann( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_GGX + return distributionGGX( ggx_alpha, NoH ); +#endif +} + +// Vis = G / (4*NoL*NoV) +float BRDF_geometricVisibility(float ggx_alpha, float NoV, float NoL, float VoH) +{ +#if BRDF_SPEC_G == SPEC_G_IMPLICIT + return geometryImplicit(); +#elif BRDF_SPEC_G == SPEC_G_NEUMANN + return geometryNeumann( NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_KELEMEN + return geometryKelemen( VoH ); +#elif BRDF_SPEC_G == SPEC_G_SHLICK + return geometrySchlick( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_GGX + return geometrySmith( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED + return geometrySmithCorrelated( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED_APPROX + return geometrySmithCorrelatedApprox( ggx_alpha, NoV, NoL ); +#endif +} + +float3 BRDF_fresnel(float3 specularColor, float VoH) +{ +#if BRDF_SPEC_F == 0 + return fresnelNone( specularColor ); +#elif BRDF_SPEC_F == 1 + return fresnelSchlick( specularColor, VoH ); +#elif BRDF_SPEC_F == 2 + return fresnelFresnel( specularColor, VoH ); +#endif +} + +float3 BRDF_specular(float ggx_alpha, float NoV, float NoL, float VoH, float NoH, half sheenStrength, half3 sheenColor) +{ + float D = BRDF_distribution(ggx_alpha, NoH); + float G = BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH); + float3 result = D * G; + + return result; +} + +//from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr_v2.pdf (original version had bug in code!) +float computeSpecOcclusion(float saturated_NdotV, float AO, float ggx_alpha) +{ + return saturate(pow(saturated_NdotV + AO, exp2(-16.0 * ggx_alpha - 1.0)) - 1 + AO); +} +//ggx_alpha = linearRoughness*linearRoughness + +// ggx_alpha = linearRoughness*linearRoughness +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ +#if SPECULAR_DISABLED && BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert(baseDiffuseColor); +#else + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(normal, H)); + float VoH = saturate(dot(view, H)); + half3 diffuse = BRDF_diffuse(baseDiffuseColor, linearRoughness, NoV, NoL, VoH); +#if !SPECULAR_DISABLED + float3 specular = BRDF_specular(ggx_alpha, NoV, NoL, VoH, NoH, translucency, sheenColor) * specularStrength; + float3 F = BRDF_fresnel(specularColor, VoH); + return (diffuse + F * specular); +#else + return diffuse; +#endif +#endif +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, sheenColor, translucency) * NoL; +} + +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0); +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0) * NoL; +} + +// //////////// TODO: NAU-1797 Unify code above with other parts (for example see distributionGGX in specular_brdf.hlsli) +uint ReverseBits32(uint bits) +{ + bits = (bits << 16) | (bits >> 16); + bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1); + bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2); + bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4); + bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); + return bits; +} + +float2 Hammersley(uint i, uint N) +{ + const float E1 = frac(float(i) / N); + const float E2 = ReverseBits32(i) * 2.3283064365386963e-10; + return float2(E1, E2); +} + +float3 ImportanceSampleGGX(float2 E, float a2) +{ + const float phi = 2.0 * PI * E.x; + const float cosTheta = sqrt((1.0 - E.y) / (1.0 + (a2 - 1.0) * E.y)); + const float sinTheta = sqrt(1.0 - cosTheta * cosTheta); + + float3 H; + H.x = sinTheta * cos(phi); + H.y = sinTheta * sin(phi); + H.z = cosTheta; + + return H; +} + +float D_GGX(float a2, float NoH) +{ + const float d = (NoH * a2 - NoH) * NoH + 1.0; + return a2 / (PI * d * d); +} + +float ImportancePdfGGX(float cosTheta, float a2) +{ + return cosTheta * D_GGX(a2, cosTheta); +} + +float SpecularPdf(float NoH, float a2, float VoH) +{ + return ImportancePdfGGX(NoH, a2) / max(4.0 * VoH, 0.000001); +} + +float Luminance(float3 color) +{ + return dot(color, float3(0.2126, 0.7152, 0.0722)); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/shader_global.hlsli b/project_templates/sample_scene/content/shaders/include/shader_global.hlsli new file mode 100644 index 00000000..cb8f76b1 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/shader_global.hlsli @@ -0,0 +1,67 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#ifndef SHADER_GLOBAL_HLSL +#define SHADER_GLOBAL_HLSL 1 + +#include "hardware_defines.hlsli" + +float pow2(float a) {return a*a;} +float pow4(float a) {return pow2(a*a);} +float pow8(float a) {return pow4(a*a);} +float2 pow2_vec2(float2 a) {return a*a;} +float3 pow2_vec3(float3 a) {return a*a;} +float4 pow2_vec4(float4 a) {return a*a;} + +float2 pow2(float2 a) {return a*a;} +float3 pow2(float3 a) {return a*a;} +float4 pow2(float4 a) {return a*a;} +float4 pow4(float4 a) {return pow2(a*a);} +float4 pow8(float4 a) {return pow4(a*a);} +float4 pow16(float4 a) {return pow8(a*a);} +float pow5(float a) {float v = a*a; v*=v; return v*a;} + +half pow2h(half a) {return a*a;} +half pow4h(half a) {return pow2h(a*a);} +half pow5h(half a){half a4=a*a; a4*=a4; return a4*a;} + +float clampedPow(float X,float Y) { return pow(max(abs(X),0.000001f),Y); } + +float3 TangentToWorld(float3 v, float3x3 TBN) +{ + return mul(TBN, v); +} + +float3x3 GetTBN(float3 N) +{ + float3x3 TBN; + + float3 T = cross(N, UNIT_Y); + T = lerp(cross(N, UNIT_X), T, step(EPSILON, dot(T, T))); + T = normalize(T); + + const float3 B = normalize(cross(N, T)); + + return float3x3( // TODO: NAU-1797 think about this transpose, refactor + float3(T.x, B.x, N.x), + float3(T.y, B.y, N.y), + float3(T.z, B.z, N.z)); +} + +float3x3 GetTBN(float3 N, float3 T) +{ + T = normalize(T - dot(T, N) * N); + const float3 B = cross(N, T); + + return float3x3( // TODO: NAU-1797 think about this transpose, refactor + float3(T.x, B.x, N.x), + float3(T.y, B.y, N.y), + float3(T.z, B.z, N.z)); +} + +float linearize_z(float rawDepth, float2 decode_depth) +{ + return rcp(decode_depth.x + decode_depth.y * rawDepth); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/include/specular_brdf.hlsli b/project_templates/sample_scene/content/shaders/include/specular_brdf.hlsli new file mode 100644 index 00000000..1f2e6ae8 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/include/specular_brdf.hlsli @@ -0,0 +1,164 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef SPECULAR_BRDF_HLSL +#define SPECULAR_BRDF_HLSL 1 + +#include + +// Microfacet specular = D*G*F / (4*NoL*NoV) = D*Vis*F +// Vis = G / (4*NoL*NoV) + +#ifndef INV_MIN_IOR +#define INV_MIN_IOR 50.0h +#endif + +// [Blinn 1977, "Models of light reflection for computer synthesized pictures"] +float distributionBlinn( float ggx_alpha, float NoH ) +{ + float m2 = ggx_alpha * ggx_alpha; + float n2 = 1 / m2 - 1; + return (n2+1) * clampedPow( NoH, n2*2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float distributionBeckmann( float ggx_alpha, float NoH ) +{ + float m2 = ggx_alpha * ggx_alpha; + float NoH2 = NoH * NoH; + return exp( (NoH2 - 1) / (m2 * NoH2) ) / (m2 * NoH2 * NoH2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// GGX / Trowbridge-Reitz +float distributionGGX( float ggx_alpha, float NoH ) +{ + float alpha2 = ggx_alpha * ggx_alpha; + float d = ( NoH * alpha2 - NoH ) * NoH + 1; // 2 mad + return alpha2 / max(1e-8, d*d );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// Anisotropic GGX, Disney +float distributionGGXaniso( float ggx_alphaX, float ggx_alphaY, float NoH, float3 H, float3 X, float3 Y ) +{ + float XoH = dot( X, H ); + float YoH = dot( Y, H ); + float d = XoH*XoH / pow2(ggx_alphaX) + YoH*YoH / pow2(ggx_alphaY) + NoH*NoH; + return 1 / max(1e-8, ggx_alphaX*ggx_alphaY * d*d );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//Ashikhmin +//https://knarkowicz.wordpress.com/2018/01/04/cloth-shading/ +float distributionCloth(float ggx_alpha, float NoH) +{ + float r2 = ggx_alpha * ggx_alpha; + float cos2h = NoH * NoH; + float sin2h = 1. - cos2h; + float sin4h = sin2h * sin2h; + return (sin4h + 4. * exp(-cos2h / (sin2h * r2))) / ((1. + 4. * r2) * sin4h);// division by Pi is ommited +} + +float geometryImplicit() +{ + return 0.25; +} + +float geometryNeumann( float NoV, float NoL ) +{ + return rcp( 4 * max( NoL, NoV ) +1e-5); +} + +float geometryCookTorrance(float NoH, float NoL, float NoV, float VoH, float ggx_alpha) +{ + float NdotL_clamped= max(NoL, 0.0); + float NdotV_clamped= max(NoV, 0.0); + float NoH_dov_VdotH = 2*NoH / VoH; + return min( min( NoH_dov_VdotH * NdotV_clamped, NoH_dov_VdotH * NdotL_clamped), 1.0); +} + +// [Kelemen 2001, "A microfacet based coupled specular-matte brdf model with importance sampling"] +float geometryKelemen( float VoH ) +{ + return rcp( 4 * VoH * VoH ); +} + +float geometrySchlick( float ggx_alpha, float NoV, float NoL ) +{ + float k = pow2( ggx_alpha ) * 0.5; + float geometrySchlickV = NoV * (1 - k) + k; + float geometrySchlickL = NoL * (1 - k) + k; + return 0.25 / ( geometrySchlickV * geometrySchlickL ); +} + +// Smith term for GGX +float geometrySmith( float ggx_alpha, float NoV, float NoL ) +{ + float a2 = pow2( ggx_alpha ); + + float geometrySmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 ); + float geometrySmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 ); + return rcp( geometrySmithV * geometrySmithL ); +} + +// Appoximation of correlated Smith term for GGX/Heitz +float geometrySmithCorrelated( float ggx_alpha, float NoV, float NoL ) +{ + float a2 = pow2( ggx_alpha ); + float geometrySmithV = NoL * sqrt (NoV*(NoV - NoV * a2) + a2 ); + float geometrySmithL = NoV * sqrt (NoL*(NoL - NoL * a2) + a2 ); + //float a = ggx_alpha; + //float geometrySmithV = NoL * ( NoV * ( 1 - a ) + a ); + //float geometrySmithL = NoV * ( NoL * ( 1 - a ) + a ); + return (0.5 * rcp( geometrySmithV + geometrySmithL )); +} + +// Appoximation of joint Smith term for GGX +// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"] +float geometrySmithCorrelatedApprox( float ggx_alpha, float NoV, float NoL ) +{ + float geometrySmithV = NoL * ( NoV * ( 1 - ggx_alpha ) + ggx_alpha ); + float geometrySmithL = NoV * ( NoL * ( 1 - ggx_alpha ) + ggx_alpha ); + return 0.5 * rcp( geometrySmithV + geometrySmithL ); +} + +//Ashikhmin +//https://knarkowicz.wordpress.com/2018/01/04/cloth-shading/ +float geometryCloth(float NoV, float NoL) +{ + return 1. / (4. * (NoL+ NoV - NoL * NoV)); +} + +float3 fresnelNone( float3 specularColor ) +{ + return specularColor; +} + +float3 fresnelSchlick( float3 specularColor, float VoH ) +{ + float Fc = pow5( 1 - VoH ); + + // Anything less than 2% is physically impossible and is instead considered to be shadowing + return saturate( INV_MIN_IOR * specularColor.g ) * Fc + (1 - Fc) * specularColor; + +} + +float3 F_SchlickRoughness(float3 F0, float VoH, float roughness) +{ + const float Fc = pow5(1 - VoH); + float invRough = 1.0 - roughness; + return F0 + (max(float3(invRough, invRough, invRough), F0) - F0) * Fc; +} + +float3 fresnelFresnel( float3 specularColor, float VoH ) +{ + float3 SpecularColorSqrt = sqrt( clamp( float3(0, 0, 0), float3(0.99, 0.99, 0.99), specularColor ) ); + float3 n = ( 1 + SpecularColorSqrt ) / ( 1 - SpecularColorSqrt ); + float3 g = sqrt( n*n + VoH*VoH - 1 ); + return 0.5 * pow2_vec3( (g - VoH) / (g + VoH) ) * ( 1 + pow2_vec3( ((g+VoH)*VoH - 1) / ((g-VoH)*VoH + 1) ) ); +} + +float3 getRoughReflectionVec(float3 R, float3 normal, float ggx_alpha)//alpha = pow2(linear_roughness) +{ + return lerp( normal, R, (1 - ggx_alpha) * ( sqrt(1 - ggx_alpha) + ggx_alpha ) ); +} + +#endif diff --git a/project_templates/sample_scene/content/shaders/meta/billboards.blk b/project_templates/sample_scene/content/shaders/meta/billboards.blk new file mode 100644 index 00000000..4fa76d12 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/billboards.blk @@ -0,0 +1,21 @@ +compile_configs { + config { + stage:t="vs" + entry:t="billboardsVS" + } + config { + stage:t="ps" + entry:t="billboardsPS" + } +} + +input_layout { + +} + +permutations { + permutation { + name:t="default" + defines {} + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/cs_gen_irradiance_map.blk b/project_templates/sample_scene/content/shaders/meta/cs_gen_irradiance_map.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/cs_gen_irradiance_map.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/cs_gen_reflection_map.blk b/project_templates/sample_scene/content/shaders/meta/cs_gen_reflection_map.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/cs_gen_reflection_map.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/cs_panorama_to_cubemap.blk b/project_templates/sample_scene/content/shaders/meta/cs_panorama_to_cubemap.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/cs_panorama_to_cubemap.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/cs_pixel_data_extraction.blk b/project_templates/sample_scene/content/shaders/meta/cs_pixel_data_extraction.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/cs_pixel_data_extraction.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/debug_lights_shader.blk b/project_templates/sample_scene/content/shaders/meta/debug_lights_shader.blk new file mode 100644 index 00000000..97847331 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/debug_lights_shader.blk @@ -0,0 +1,26 @@ +compile_configs { + config { + stage:t="vs" + entry:t="debug_point_lights_vs" + } + config { + stage:t="ps" + entry:t="debug_point_lights_ps" + } + config { + stage:t="vs" + entry:t="debug_spot_lights_vs" + } + config { + stage:t="ps" + entry:t="debug_spot_lights_ps" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/debug_renderer_line_shader.blk b/project_templates/sample_scene/content/shaders/meta/debug_renderer_line_shader.blk new file mode 100644 index 00000000..a661f593 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/debug_renderer_line_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/debug_renderer_mesh_shader.blk b/project_templates/sample_scene/content/shaders/meta/debug_renderer_mesh_shader.blk new file mode 100644 index 00000000..a661f593 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/debug_renderer_mesh_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/deferred_resolve.blk b/project_templates/sample_scene/content/shaders/meta/deferred_resolve.blk new file mode 100644 index 00000000..974c1731 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/deferred_resolve.blk @@ -0,0 +1,21 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/grid.blk b/project_templates/sample_scene/content/shaders/meta/grid.blk new file mode 100644 index 00000000..7b1ed944 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/grid.blk @@ -0,0 +1,21 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { + +} + +permutations { + permutation { + name:t="default" + defines {} + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/imgui.blk b/project_templates/sample_scene/content/shaders/meta/imgui.blk new file mode 100644 index 00000000..ee3d91ae --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/imgui.blk @@ -0,0 +1,44 @@ +compile_configs { + config { + stage:t="vs" + entry:t="imgui_vs" + } + config { + stage:t="ps" + entry:t="imgui_ps" + } +} + +input_layout { + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="POSITION" + type:t="VSDT_FLOAT2" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="TEXCOORD" + type:t="VSDT_FLOAT2" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="COLOR" + type:t="VSDT_E3DCOLOR" + } + } +} + +permutations { + permutation { + name:t="regular" + defines {} + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/multi_tex.blk b/project_templates/sample_scene/content/shaders/meta/multi_tex.blk new file mode 100644 index 00000000..75b56cb0 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/multi_tex.blk @@ -0,0 +1,24 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="gbuffer" + defines { + define:t="GBUFFER_VARIANT=1" + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/outline_calculation.blk b/project_templates/sample_scene/content/shaders/meta/outline_calculation.blk new file mode 100644 index 00000000..be8c45e1 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/outline_calculation.blk @@ -0,0 +1,28 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMainJumpFloodInit" + } + config { + stage:t="ps" + entry:t="PSMainJumpFloodStep" + } + config { + stage:t="ps" + entry:t="PSMainJumpFloodResult" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines {} + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/point_lights_shader.blk b/project_templates/sample_scene/content/shaders/meta/point_lights_shader.blk new file mode 100644 index 00000000..3b4f5503 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/point_lights_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="deferred_lights_vs" + } + config { + stage:t="ps" + entry:t="deferred_lights_ps" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/postFX_shader.blk b/project_templates/sample_scene/content/shaders/meta/postFX_shader.blk new file mode 100644 index 00000000..0783ba26 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/postFX_shader.blk @@ -0,0 +1,38 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines {} + } + permutation { + name:t="Uncharted" + defines { + define:t="USE_UNCHARTED_TONEMAP=1" + } + } + permutation { + name:t="Filmic" + defines { + define:t="USE_FILMIC_TONEMAP=1" + } + } + permutation { + name:t="Reinhard" + defines { + define:t="USE_UNCHARTED_TONEMAP=1" + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/postFX_skybox.blk b/project_templates/sample_scene/content/shaders/meta/postFX_skybox.blk new file mode 100644 index 00000000..191dd10e --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/postFX_skybox.blk @@ -0,0 +1,20 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines {} + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/spot_lights_shader.blk b/project_templates/sample_scene/content/shaders/meta/spot_lights_shader.blk new file mode 100644 index 00000000..3b4f5503 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/spot_lights_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="deferred_lights_vs" + } + config { + stage:t="ps" + entry:t="deferred_lights_ps" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/standard.blk b/project_templates/sample_scene/content/shaders/meta/standard.blk new file mode 100644 index 00000000..b53580f9 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/standard.blk @@ -0,0 +1,30 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="instanced" + defines { + define_inst:t="INSTANCED=1" + } + } + permutation { + name:t="emissive" + defines { + define_emissive:t="EMISSIVE=1" + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/standard_skinned.blk b/project_templates/sample_scene/content/shaders/meta/standard_skinned.blk new file mode 100644 index 00000000..a661f593 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/standard_skinned.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/standard_translucent.blk b/project_templates/sample_scene/content/shaders/meta/standard_translucent.blk new file mode 100644 index 00000000..bb006d5b --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/standard_translucent.blk @@ -0,0 +1,24 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="instanced" + defines { + define_inst:t="INSTANCED=1" + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/textured.blk b/project_templates/sample_scene/content/shaders/meta/textured.blk new file mode 100644 index 00000000..9369676f --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/textured.blk @@ -0,0 +1,55 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } + config { + stage:t="ps" + entry:t="PSMainColored" + } +} + +input_layout { + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="POSITION" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=1 + vsd_reg { + semantic_name:t="NORMAL" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=2 + vsd_reg { + semantic_name:t="TEXCOORD" + type:t="VSDT_FLOAT2" + } + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="gbuffer" + defines { + define:t="GBUFFER_VARIANT=1" + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/texturedInstanced.blk b/project_templates/sample_scene/content/shaders/meta/texturedInstanced.blk new file mode 100644 index 00000000..47652255 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/texturedInstanced.blk @@ -0,0 +1,38 @@ +compile_configs { + config { + stage:t="vs" + entry:t="zprepassInstancedVSMain" + } + config { + stage:t="vs" + entry:t="zprepassSkinnedVSMain" + } + config { + stage:t="vs" + entry:t="outlineMaskSkinnedVSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } + config { + stage:t="ps" + entry:t="zprepassPSMain" + } + config { + stage:t="vs" + entry:t="outlineMaskVSMain" + } + config { + stage:t="ps" + entry:t="outlineMaskPSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/meta/vfx.blk b/project_templates/sample_scene/content/shaders/meta/vfx.blk new file mode 100644 index 00000000..e03da71b --- /dev/null +++ b/project_templates/sample_scene/content/shaders/meta/vfx.blk @@ -0,0 +1,45 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="POSITION" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=1 + vsd_reg { + semantic_name:t="NORMAL" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=2 + vsd_reg { + semantic_name:t="TEXCOORD" + type:t="VSDT_FLOAT2" + } + } +} + +permutations { + permutation { + name:t="Regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/content/shaders/src/billboards.hlsl b/project_templates/sample_scene/content/shaders/src/billboards.hlsl new file mode 100644 index 00000000..732fc7df --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/billboards.hlsl @@ -0,0 +1,60 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(GlobalBuffer) : register(b0) +{ + float4x4 vp; +}; + +SYSTEM_CBUFFER(BillboardBuffer) : register(b1) +{ + float3 worldPosition; + float scPercentSize; + uint4 uid; + float4 aspectRatio; +}; + +struct VsOutput +{ + float4 position : SV_POSITION; + float2 texCoord : TEXCOORD0; + nointerpolation uint4 uid : TEXCOORD1; +}; + +VsOutput billboardsVS(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + output.texCoord = float2(id & 1, (id & 2) >> 1); + output.position = mul(vp, float4(worldPosition, 1.0f)); + output.position = output.position / output.position.w; // to ndc we go + + float2 offset = output.texCoord * float2(2*scPercentSize, -2*scPercentSize) + float2(-scPercentSize, scPercentSize); + offset.y *= aspectRatio.x; + output.position.xy += offset; + + output.uid = uid; + + return output; +} + + +struct PsOutput +{ + float4 color : SV_Target0; + uint4 uid : SV_Target1; +}; + +PsOutput billboardsPS(VsOutput input) +{ + PsOutput output; + output.color = tex.Sample(sampl, input.texCoord); + output.uid = input.uid; + clip(output.color.a - 0.01f); + return output; +} diff --git a/project_templates/sample_scene/content/shaders/src/cs_gen_irradiance_map.hlsl b/project_templates/sample_scene/content/shaders/src/cs_gen_irradiance_map.hlsl new file mode 100644 index 00000000..16c0fa10 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/cs_gen_irradiance_map.hlsl @@ -0,0 +1,59 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "cs_common.hlsli" + +#define SAMPLE_DELTA 0.05 + +TextureCube environmentCubemap : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D irradiance_map_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; +}; + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const float2 uv = GetUV(dispatchThreadID.xy, uint2(faceSize, faceSize)); + + const float3 N = GetCubeDirection(faceIndex, uv); + + const float3x3 TBN = GetTBN(N); + + uint sampleCount = 0; + float3 irradiance = float3(0.0, 0.0, 0.0); + + for (float phi = 0.0; phi < 2.0 * PI; phi += SAMPLE_DELTA) + { + for (float theta = 0.0; theta < 0.5 * PI; theta += SAMPLE_DELTA) + { + const float3 tangentDirection = float3( + sin(theta) * cos(phi), + sin(theta) * sin(phi), + cos(theta)); + + const float3 worldDirection = TangentToWorld(tangentDirection, TBN); + + irradiance += environmentCubemap.SampleLevel(texSampler, worldDirection, 5).rgb + * cos(theta) * sin(theta); + + ++sampleCount; + } + } + + irradiance = PI * irradiance / float(sampleCount); + + irradiance_map_face[dispatchThreadID.xy] = float4(irradiance, 1.0f); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/cs_gen_reflection_map.hlsl b/project_templates/sample_scene/content/shaders/src/cs_gen_reflection_map.hlsl new file mode 100644 index 00000000..37699ddb --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/cs_gen_reflection_map.hlsl @@ -0,0 +1,78 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "cs_common.hlsli" +#include "pbr.hlsli" + +#define SAMPLE_COUNT 2048 +#define MAX_LUMINANCE 25.0 + +TextureCube environmentCubemap : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D reflection_map_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; + float roughness; +}; + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const uint2 imageSize = uint2(faceSize, faceSize); + const float2 uv = GetUV(dispatchThreadID.xy, imageSize); + + const float3 N = GetCubeDirection(faceIndex, uv); + const float3 V = N; + + const float3x3 TBN = GetTBN(N); + + const float a = roughness * roughness; + const float a2 = max(a * a, EPSILON); + + float3 result = float3(0.0, 0.0, 0.0); + float totalWeight = 0.0; + + for (uint i = 0; i < SAMPLE_COUNT; ++i) + { + const float2 Xi = Hammersley(i, SAMPLE_COUNT); + + const float3 H = TangentToWorld(ImportanceSampleGGX(Xi, a2), TBN); + + const float3 L = -reflect(V, H); + + const float NoL = CosThetaWorld(N, L); + const float NoH = CosThetaWorld(N, H); + const float VoH = max(dot(V, H), 0.0); + + if (NoL > 0.0) + { + const float pdf = SpecularPdf(NoH, a2, VoH); + + const float saTexel = 4.0 * PI / (6.0 * imageSize.x * imageSize.y); + const float saSample = 1.0 / (float(SAMPLE_COUNT) * pdf + EPSILON); + + const float lod = roughness == 0.0 ? 0.0 : 0.5 * log2(saSample / saTexel); + + float3 irradiance = environmentCubemap.SampleLevel(texSampler, L, lod).rgb; + irradiance /= max(Luminance(irradiance) / MAX_LUMINANCE, 1.0); + + result += irradiance * NoL; + totalWeight += NoL; + } + } + + result /= totalWeight; + + reflection_map_face[dispatchThreadID.xy] = float4(result, 1.0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/cs_panorama_to_cubemap.hlsl b/project_templates/sample_scene/content/shaders/src/cs_panorama_to_cubemap.hlsl new file mode 100644 index 00000000..bdb62b81 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/cs_panorama_to_cubemap.hlsl @@ -0,0 +1,42 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "cs_common.hlsli" + +Texture2D panorama_texture : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D cubemap_texture_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; +}; + +float2 ComputePanoramaTexCoord(float3 direction) +{ + const float2 inverseAtan = float2(0.1591, 0.3183); + + return float2(atan2(direction.z, direction.x), asin(-direction.y)) * inverseAtan + 0.5; +} + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const float2 uv = GetUV(dispatchThreadID.xy, uint2(faceSize, faceSize)); + + const float3 direction = GetCubeDirection(faceIndex, uv); + + const float2 panoramaTexCoord = ComputePanoramaTexCoord(direction); + + float4 panoramaSample = panorama_texture.SampleLevel(texSampler, panoramaTexCoord, 0); + + cubemap_texture_face[dispatchThreadID.xy] = panoramaSample; +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/cs_pixel_data_extraction.hlsl b/project_templates/sample_scene/content/shaders/src/cs_pixel_data_extraction.hlsl new file mode 100644 index 00000000..d1192f9e --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/cs_pixel_data_extraction.hlsl @@ -0,0 +1,26 @@ +#include "shader_defines.h" +#include "common_types.hlsli" + +RWStructuredBuffer ResultBuffer : register(u0); + +Texture2D UIDTexture : register(t0); +Texture2D DepthTexture : register(t1); + +GLOBAL_CBUFFER(CoordBuffer) : register(b0) +{ + int2 viewportCoords; +}; + +[numthreads(1, 1, 1)] +void CSMain(uint3 DTid : SV_DispatchThreadID) +{ + uint4 guid = UIDTexture.Load(int3(viewportCoords, 0)); + float depth = DepthTexture.Load(int3(viewportCoords, 0)); + + PixelData result; + + result.uid = guid; + result.depth = depth; + + ResultBuffer[0] = result; +} diff --git a/project_templates/sample_scene/content/shaders/src/debug_lights_shader.hlsl b/project_templates/sample_scene/content/shaders/src/debug_lights_shader.hlsl new file mode 100644 index 00000000..01e52caf --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/debug_lights_shader.hlsl @@ -0,0 +1,77 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "clustered/point_light.hlsli" + +struct VsInput +{ + float3 pos : POSITION; +}; + +struct VsOutput +{ + VS_OUT_POSITION(pos) +}; + +SYSTEM_CBUFFER(OmniLights) : + register(b1) +{ + uint4 omni_lights_count; + RenderOmniLight omni_lights_cb[MAX_OMNI_LIGHTS]; +}; + +VsOutput debug_point_lights_vs(VsInput input, uint omni_light_index : SV_InstanceID) +{ + VsOutput output; + RenderOmniLight ol = omni_lights_cb[omni_light_index]; + float4 pos_and_radius = ol.posRadius; + float3 worldPos = pos_and_radius.xyz + input.pos.xyz * pos_and_radius.w * 1.15; + output.pos = mul(mvp, float4(worldPos, 1)); + return output; +} + +float4 debug_point_lights_ps(VsOutput input) : + SV_Target +{ + return float4(1, 0, 0, 0); +} + +SYSTEM_CBUFFER(SpotLights) : register(b1) +{ + uint4 spot_lights_count; + RenderSpotLight spot_lights_cb[MAX_SPOT_LIGHTS]; +} + +VsOutput debug_spot_lights_vs(VsInput input, uint spot_light_index : SV_InstanceID) +{ + VsOutput output; + RenderSpotLight sl = spot_lights_cb[spot_light_index]; + float4 pos_and_radius = sl.lightPosRadius; + float4 color_and_attenuation = sl.lightColorAngleScale; + color_and_attenuation.w = abs(color_and_attenuation.w); + float4 dir_angle = sl.lightDirectionAngleOffset; + const float lightAngleScale = color_and_attenuation.a; + const float lightAngleOffset = dir_angle.a; + float2 texId_scale = sl.texId_scale.xy; + float cosOuter = -lightAngleOffset / lightAngleScale; + float halfTan = sqrt(1 / (cosOuter * cosOuter) - 1); + float3 ofs; + if (dot(input.pos, input.pos) > 0) + { + ofs = tangent_to_world(normalize(float3(input.pos.xy * halfTan, input.pos.z)), dir_angle.xyz); + } + else + { + ofs = float3(0, 0, 0); + } + float4 worldPos = float4(pos_and_radius.xyz + ofs.xyz * (pos_and_radius.w / cosOuter), 1); + output.pos = mul(mvp, worldPos); + return output; +} + +float4 debug_spot_lights_ps(VsOutput input) : SV_Target +{ + return float4(1, 0, 0, 0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/debug_renderer_line_shader.hlsl b/project_templates/sample_scene/content/shaders/src/debug_renderer_line_shader.hlsl new file mode 100644 index 00000000..3d5f6e78 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/debug_renderer_line_shader.hlsl @@ -0,0 +1,40 @@ +#include "shader_defines.h" + +struct ConstantData +{ + float4x4 WorldViewProj; + float4 Color; +}; + +SYSTEM_CBUFFER(SceneBuffer) : register(b0) +{ + ConstantData ConstData; +}; + +struct VS_IN +{ + float4 pos : POSITION0; + float4 col : COLOR0; +}; + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 col : COLOR; +}; + +PS_IN VSMain( VS_IN input ) +{ + PS_IN output = (PS_IN)0; + + output.pos = mul(ConstData.WorldViewProj, float4(input.pos.xyz, 1.0f)); + output.col = input.col; + + return output; +} + +float4 PSMain( PS_IN input ) : SV_Target +{ + float4 col = input.col; + return col; +} diff --git a/project_templates/sample_scene/content/shaders/src/debug_renderer_mesh_shader.hlsl b/project_templates/sample_scene/content/shaders/src/debug_renderer_mesh_shader.hlsl new file mode 100644 index 00000000..15a3b5a8 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/debug_renderer_mesh_shader.hlsl @@ -0,0 +1,41 @@ +#include "shader_defines.h" + +struct ConstantData +{ + float4x4 WorldViewProj; + float4x4 Transform; + float4 Color; +}; + +SYSTEM_CBUFFER(SceneBuffer) : register(b0) +{ + ConstantData ConstData; +}; + +struct VS_MESH_IN +{ + float4 pos : POSITION0; +}; + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 col : COLOR; +}; + + +PS_IN VSMain( VS_MESH_IN input ) +{ + PS_IN output = (PS_IN)0; + + output.pos = mul(ConstData.WorldViewProj, mul(ConstData.Transform, float4(input.pos.xyz, 1.0f))); + output.col = ConstData.Color; + + return output; +} + +float4 PSMain( PS_IN input ) : SV_Target +{ + float4 col = input.col; + return col; +} diff --git a/project_templates/sample_scene/content/shaders/src/deferred_resolve.hlsl b/project_templates/sample_scene/content/shaders/src/deferred_resolve.hlsl new file mode 100644 index 00000000..887a94f5 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/deferred_resolve.hlsl @@ -0,0 +1,92 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "in_out.hlsli" +#include "gbuffer_read.hlsli" +#include "pbr.hlsli" +#include "csm.hlsli" + +#define DIELECTRIC_F0 float3(0.04, 0.04, 0.04) + +TextureCube irradianceMap: register(t4); +TextureCube reflectionMap: register(t5); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 globtm_inv; + float4 worldViewPos; + float4 lightDirection; + float4 lightColorIntensity; + float4 envIntensity; +}; + +VsOutputResolve VSMain(uint id : SV_VertexID) +{ + VsOutputResolve output = (VsOutputResolve)0; + + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + + return output; +} + +half3 getSkyReflection(float linearRoughness, float3 roughReflection, float NoV) +{ + const float lod = linearRoughness * (REFLECTION_MAP_MIP_COUNT - 1); + return reflectionMap.SampleLevel(default_sampler, roughReflection, lod).rgb; +} + +float4 PSMain(VsOutputResolve input) : SV_Target +{ + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, input.texCoord, 0).x; + if(rawDepth == 0) + { + return float4(0,0,0,1); + } + + ProcessedGbuffer gbuffer = readProcessedGbuffer(input.texCoord); + + // depth / viewpos + float4 farpos = float4(input.texCoord.x * 2 - 1, (1 - input.texCoord.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + float3 pointToEye = worldViewPos.xyz - worldPos.xyz; + + float3 view = normalize(pointToEye); + + // lights + float3 lightDir = normalize(lightDirection.xyz); + + // todo: (is needed?????) replace metallic surfaces with albedo of their specular value + half3 specularColor = gbuffer.specularColor; + gbuffer.diffuseColor = lerp(gbuffer.diffuseColor, gbuffer.specularColor, gbuffer.metallness); + + float NoL = saturate(dot(gbuffer.normal, lightDir)) + 1e-5; + float NdotV = dot(gbuffer.normal, view); + float NoV = abs(NdotV) + 1e-5; + float ggx_alpha = gbuffer.linearRoughness * gbuffer.linearRoughness; + + half shadowTerm = get_csm_shadow(pointToEye, 1.0f).x; + half3 lightColor = lightColorIntensity.rgb * lightColorIntensity.a; + + const float3 irradiance = irradianceMap.Sample(default_sampler, gbuffer.normal).rgb * envIntensity.x; + + const float3 F0 = lerp(DIELECTRIC_F0, gbuffer.diffuseColor, gbuffer.metallness); + + const float3 kS = F_SchlickRoughness(F0, NoV, gbuffer.linearRoughness); + const float3 kD = lerp(float3(1.0, 1.0, 1.0) - kS, float3(0.0, 0.0, 0.0), gbuffer.metallness); + + half3 envAmbientDiffuseLighting = half3(kD * irradiance) * gbuffer.diffuseColor * gbuffer.ao; + + const float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float3 roughR = getRoughReflectionVec(reflectionVec, gbuffer.normal, ggx_alpha); + + half3 enviBRDF = EnvBRDFApprox(specularColor, gbuffer.roughness, NoV); + half3 envAmbientReflection = getSkyReflection(gbuffer.linearRoughness, roughR, NoV) * enviBRDF * gbuffer.ao; + + half3 result = standardBRDF( NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, gbuffer.extracted_albedo_ao, lightDir, view, gbuffer.normal) * shadowTerm * lightColor + + envAmbientDiffuseLighting + envAmbientReflection + gbuffer.emissionColor; + + return float4(float3(result), 1.0f); +} diff --git a/project_templates/sample_scene/content/shaders/src/grid.hlsl b/project_templates/sample_scene/content/shaders/src/grid.hlsl new file mode 100644 index 00000000..1c570517 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/grid.hlsl @@ -0,0 +1,78 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4 worldViewPos; + float4x4 vp; +} + + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 worldPos : TEXCOORD0; +}; + + + +PS_IN VSMain(uint id : SV_VertexID ) +{ + PS_IN output = (PS_IN)0; + + float2 inds = float2(id & 1, (id & 2) >> 1); + float2 xy = inds * float2(2, -2) + float2(-1, 1); + output.worldPos = float4(xy.x * 10000, 0, xy.y * 10000, 1.0f); + + output.pos = mul(vp, output.worldPos); + + return output; +} + + +float gridTextureGradBox(in float2 p, in float2 ddx, in float2 ddy) +{ + const float N = 100.0f; + // filter kernel + float2 w = max(abs(ddx), abs(ddy)) + 0.01f; + p += 0.5f / N; // middle line offset + + float2 a = p + 0.5 * w; + float2 b = p - 0.5 * w; + float2 i = (floor(a) + min(frac(a) * N, 1.0) - + floor(b) - min(frac(b) * N, 1.0)) / (N * w); + return (1.0 - i.x) * (1.0 - i.y); +} + + +float4 PSMain( PS_IN input ) : SV_Target +{ + float level = log10(abs(worldViewPos.y)); + float alpha = level < 1.0f ? 0.0f : 1.0f - frac(level); + + level = clamp(floor(level), 0.0f, 4.0f); + + float2 uv = input.worldPos.xz; + float2 dx = ddx(uv); + float2 dy = ddy(uv); + + float scale0 = pow(0.1f, level); + float t0 = 1.0f - gridTextureGradBox(uv * scale0, dx * scale0, dy * scale0); + + float scale1 = pow(0.1f, level-1); + float t1 = 1.0f - gridTextureGradBox(uv * scale1, dx * scale1, dy * scale1); + + float t = lerp(t0, t1, alpha); + float3 color = float3(0.3f, 0.3f, 0.3f); + + float g = 0.01 * pow(10.0f, level); + if (abs(input.worldPos.x) < g) + color = float3(0.8f, 0.0f, 0.0f); + if (abs(input.worldPos.z) < g) + color = float3(0.0f, 0.0f, 0.8f); + + return float4(color, t); +} diff --git a/project_templates/sample_scene/content/shaders/src/imgui.hlsl b/project_templates/sample_scene/content/shaders/src/imgui.hlsl new file mode 100644 index 00000000..4f9291ce --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/imgui.hlsl @@ -0,0 +1,43 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +struct VsInput +{ + float2 pos : POSITION; + float2 uv : TEXCOORD0; + float4 col : COLOR0; +}; + +struct VsOutput +{ + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 col : COLOR0; +}; + + +VsOutput imgui_vs(VsInput v) +{ + VsOutput o; + o.pos = mul(mvp, float4(v.pos.xy, 0.f, 1.f)); + o.uv = v.uv; + o.col = v.col.bgra; // dagor supports vertex color in BGRA format, but ImGui supplies it as RGBA + return o; +} + + +float4 imgui_ps(VsOutput i) : SV_Target +{ + return i.col * tex.Sample(sampl, i.uv); +} + diff --git a/project_templates/sample_scene/content/shaders/src/multi_tex.hlsl b/project_templates/sample_scene/content/shaders/src/multi_tex.hlsl new file mode 100644 index 00000000..300e48f4 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/multi_tex.hlsl @@ -0,0 +1,100 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +Texture2D tex1 : register(t0); +Texture2D tex2 : register(t1); + +SamplerState sampl1 : register(s0); +SamplerState sampl2 : register(s1); + +#ifndef GBUFFER_VARIANT + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; +cbuffer PropertyBuffer : register(b1) +{ + float blendFactor; +}; + +VsOutput VSMain(VsInput input) +{ + VsOutput output; + + const float3 LightPos = {0, 15, -30}; + + const float3 lightVec = normalize(LightPos - input.position); + const float diffuse = saturate(max(dot(lightVec, input.normal), 0.2) * 1.3); + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.color = float4(diffuse, diffuse, diffuse, 1.0f); + + output.texCoord = input.texCoord; + + return output; +} + +float4 PSMain(VsOutput input) : SV_Target +{ + const float4 color1 = tex1.Sample(sampl1, input.texCoord); + const float4 color2 = tex2.Sample(sampl2, input.texCoord); + const float4 result = lerp(color1, color2, blendFactor); + + return result * input.color; +} + +#else + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4 worldViewPos; +}; +cbuffer PropertyBuffer : register(b1) +{ + float blendFactor; +}; + +VsOutputGBuff VSMain(VsInput input) +{ + VsOutputGBuff output; + + float3 pos = input.position; + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = input.normal; + output.texCoord = input.texCoord; + output.p2e = worldViewPos.xyz - pos; + + return output; +} + +#include "gbuffer_base.hlsli" + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + float4 screenpos = input.position; + UnpackedGbuffer result; + init_gbuffer(result); + + const float4 color1 = tex1.Sample(sampl1, input.texCoord); + const float4 color2 = tex2.Sample(sampl2, input.texCoord); + + half4 albedo = half4(lerp(color1, color2, blendFactor)); + + half4 normal_smoothness = half4(0, 1, 0, 1); + float3 normal; + normal.xyz = (normal_smoothness.xyz * 2 - 1); + init_albedo(result, albedo.xyz); + init_smoothness(result, normal_smoothness.a); + init_normal(result, perturb_normal(normal, normalize(input.norm), input.p2e, input.texCoord)); + + init_metalness(result, 0); + init_ao(result, 1); + return encode_gbuffer(result, screenpos); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/outline_calculation.hlsl b/project_templates/sample_scene/content/shaders/src/outline_calculation.hlsl new file mode 100644 index 00000000..3944febf --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/outline_calculation.hlsl @@ -0,0 +1,178 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +// Heavily inspired by https://bgolus.medium.com/the-quest-for-very-wide-outlines-ba82ed442cd9 + +#include "shader_defines.h" +#include "in_out.hlsli" + +GLOBAL_CBUFFER(PropertyBuffer) : register(b0) +{ + uint screenWidth; + uint screenHeight; + float jumpStepWidth; + float4 outlineColor; +}; + +VsOutput VSMain(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + // TODO: Rewrite to use only one triangle in future + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + output.color = float4(output.texCoord, 1, 0.5); + + return output; +} + +// just inside the precision of a R16G16_SNorm to keep encoded range 1.0 >= and > -1.0 +#define SNORM16_MAX_FLOAT_MINUS_EPSILON ((float)(32768 - 2) / (float)(32768 - 1)) + +#define FLOOD_NULL_POS -1.0 +#define FLOOD_NULL_POS_FLOAT2 float2(FLOOD_NULL_POS, FLOOD_NULL_POS) + +Texture2D outline_tex : register(t0); +SamplerState sampl : register(s0); + +float2 PSMainJumpFloodInit(VsOutput input) : + SV_Target +{ + float2 sceneUV = input.texCoord.xy; + // integer pixel position + int2 uvInt = sceneUV * int2(screenWidth, screenHeight); + + // sample silhouette texture for sobel + half3x3 values; + [unroll] for (int u = 0; u < 3; u++) + { + [unroll] for (int v = 0; v < 3; v++) + { + uint2 sampleUV = clamp(uvInt + int2(u - 1, v - 1), int2(0, 0), int2(screenWidth, screenHeight)); + values[u][v] = 1 - outline_tex.Load(int3(sampleUV, 0)).r; + } + } + // calculate output position for this pixel + float2 outPos = sceneUV; + + // interior, return position + if (values._m11 > 0.99) + { + return outPos; + } + + // exterior, return no position + if (values._m11 < 0.01) + { + return FLOOD_NULL_POS_FLOAT2; + } + + // sobel to estimate edge direction + float2 dir = -float2( + values[0][0] + values[0][1] * 2.0 + values[0][2] - values[2][0] - values[2][1] * 2.0 - values[2][2], + values[0][0] + values[1][0] * 2.0 + values[2][0] - values[0][2] - values[1][2] * 2.0 - values[2][2]); + + // if dir length is small, this is either a sub pixel dot or line + // no way to estimate sub pixel edge, so output position + if (abs(dir.x) <= 0.005 && abs(dir.y) <= 0.005) + return outPos; + + // normalize direction + dir = normalize(dir); + + // sub pixel offset + float2 offset = dir * (1.0 - values._m11); + + // output encoded offset position + return uvInt + offset; +} + +float2 PSMainJumpFloodStep(VsOutput input) : + SV_Target +{ + float2 sceneUV = input.texCoord.xy; + // integer pixel position + int2 uvInt = sceneUV * int2(screenWidth, screenHeight); + + // initialize best distance at infinity + const float maxDist = (screenWidth + screenHeight) * (screenWidth + screenHeight); + float bestDist = maxDist; + float2 bestCoord; + + // jump samples + [unroll] for (int u = -1; u <= 1; u++) + { + [unroll] for (int v = -1; v <= 1; v++) + { + // calculate offset sample position + int2 offsetUV = uvInt + int2(u, v) * jumpStepWidth; + + // .Load() acts funny when sampling outside of bounds, so don't + offsetUV = clamp(offsetUV, int2(0, 0), int2(screenWidth, screenHeight)); + + // decode position from buffer + float2 offsetPos = outline_tex.Load(int3(offsetUV, 0)).rg; + + // the offset from current position + float2 disp = uvInt - offsetPos * int2(screenWidth, screenHeight); + + // square distance + float dist = dot(disp, disp); + + // if offset position isn't a null position or is closer than the best + // set as the new best and store the position + if (offsetPos.y != FLOOD_NULL_POS && dist < bestDist) + { + bestDist = dist; + bestCoord = offsetPos; + } + } + } + + // if not valid best distance output null position, otherwise output encoded position + return maxDist == bestDist ? FLOOD_NULL_POS_FLOAT2 : bestCoord; +} + +Texture2D outlineMask_tex : register(t1); + +float4 PSMainJumpFloodResult(VsOutput input) : + SV_Target +{ + float2 sceneUV = input.texCoord.xy; + // integer pixel position + int2 uvInt = sceneUV * int2(screenWidth, screenHeight); + + // load encoded position + float2 encodedPos = outline_tex.Load(int3(uvInt, 0)).rg; + float isInside = outlineMask_tex.Load(int3(uvInt, 0)).r; + + // early out if outside + if (isInside < 0.9) + return half4(0, 0, 0, 0); + // early out if null position + if (encodedPos.y == -1) + return half4(0, 0, 0, 0); + + // decode closest position + float2 nearestPos = encodedPos* int2(screenWidth, screenHeight); + + // current pixel position + float2 currentPos = uvInt; + + // distance in pixels to closest position + half dist = length(nearestPos - currentPos); + + // calculate outline + // + 1.0 is because encoded nearest position is half a pixel inset + // not + 0.5 because we want the anti-aliased edge to be aligned between pixels + // distance is already in pixels, so this is already perfectly anti-aliased! + half outline = clamp(jumpStepWidth - dist + 1.0, 0, jumpStepWidth); + + half outlineAlpha = outline/jumpStepWidth; + + // apply outline to alpha + half4 col = outlineColor; + col.a *= outlineAlpha; + + return col; +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/point_lights_shader.hlsl b/project_templates/sample_scene/content/shaders/src/point_lights_shader.hlsl new file mode 100644 index 00000000..c177cf6c --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/point_lights_shader.hlsl @@ -0,0 +1,271 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "clustered/point_light.hlsli" + +struct VsInput +{ + float3 pos : POSITION; +}; + +struct VsOutput +{ + VS_OUT_POSITION(pos) + float4 pos_and_radius : TEXCOORD1; + float4 color_and_attenuation : TEXCOORD2; + float3 worldPos : TEXCOORD3; + float3 worldPos2 : TEXCOORD4; +#if OMNI_SHADOWS + float4 shadow_tc_to_atlas : TEXCOORD3; +#endif +}; + +SYSTEM_CBUFFER(Lights) : + register(b1) +{ + uint4 omni_lights_count; + RenderOmniLight omni_lights_cb[MAX_OMNI_LIGHTS]; +}; + + +#include "gbuffer_read.hlsli" + +float readGbufferDepth(float2 tc) +{ + return depth_gbuf.SampleLevel(default_sampler, float4(tc, 0, 0).xy, float4(tc, 0, 0).w).r; +} + +half3 perform_point_light(float3 worldPos, float3 view, float NoV, ProcessedGbuffer gbuffer, half3 specularColor, half dynamicLightsSpecularStrength, half ao, float4 pos_and_radius, float4 color_and_attenuation, float4 shadowTcToAtlas, float2 screenpos) +{ +#if DYNAMIC_LIGHTS_EARLY_EXIT + #define EXIT_STATEMENT return 0 +#endif + + float3 point2light = pos_and_radius.xyz - worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float ggx_alpha = max(1e-4, pow2(gbuffer.linearRoughness)); + +#if LAMBERT_LIGHT + float radius2 = pow2(pos_and_radius.w); + #if DYNAMIC_LIGHTS_EARLY_EXIT + bool shouldExit = distSqFromLight >= radius2; + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + EXIT_STATEMENT; + #endif + float invSqrRad = rcp(radius2); + float attenuation = smoothDistanceAtt(distSqFromLight, invSqrRad) * color_and_attenuation.w; + + float3 lightDir = point2light * rsqrt(0.0000001 + distSqFromLight); + float NoL = saturate(dot(gbuffer.normal, lightDir)); + half shadowTerm = attenuation; // no shadows + shadowTerm *= calc_micro_shadow(NoL, ao); + + #if OMNI_SHADOWS + shadowTerm *= getOmniShadow(shadowTcToAtlas, pos_and_radius, worldPos, NoL, screenpos); + #endif + + #if !DYNAMIC_LIGHTS_SPECULAR + half3 lightBRDF = diffuseLambert(gbuffer.diffuseColor) * (NoL * shadowTerm) * color_and_attenuation.xyz; + #else + half3 diffuse = diffuseLambert(gbuffer.diffuseColor); + + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(gbuffer.normal, H)); + float VoH = saturate(dot(view, H)); + float D = BRDF_distribution(ggx_alpha, NoH) * dynamicLightsSpecularStrength; + float G = NoL > 0 ? BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH) : 0; + float3 F = BRDF_fresnel(specularColor, VoH); + half3 result = (diffuse + (D * G) * F) * NoL; + #if DYNAMIC_LIGHTS_SSS + if (isSubSurfaceShader(gbuffer.material)) + result += (foliageSSS(NoL, view, lightDir) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + #endif + half3 lightBRDF = result * shadowTerm * color_and_attenuation.xyz; + #endif +#else + float NoL = dot(gbuffer.normal, point2light); + float invSqrRad = rcp(pow2(pos_and_radius.w)); + float attenuation = getDistanceAtt(distSqFromLight, invSqrRad) * color_and_attenuation.w; + float rcpDistFromLight = rsqrt(0.0000001 + distSqFromLight); + NoL *= rcpDistFromLight; + attenuation *= calc_micro_shadow(NoL, ao); + + #if DYNAMIC_LIGHTS_EARLY_EXIT + bool shouldExit = min(attenuation, NoL) <= 0; + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + EXIT_STATEMENT; + #endif + + #if OMNI_SHADOWS + attenuation *= getOmniShadow(shadowTcToAtlas, pos_and_radius, worldPos, NoL, screenpos); + #endif + + float3 lightDir = point2light * rcpDistFromLight; + half3 result = standardBRDF(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, lightDir, view, gbuffer.normal, gbuffer.translucencyColor, gbuffer.translucency); + #if !DYNAMIC_LIGHTS_EARLY_EXIT + result = NoL > 0 ? result : 0; + #endif + #if DYNAMIC_LIGHTS_SSS + if (isSubSurfaceShader(gbuffer.material)) + result += (foliageSSS(NoL, view, lightDir) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + #endif + half3 lightBRDF = result * attenuation * color_and_attenuation.xyz; +#endif + + return lightBRDF; +#if DYNAMIC_LIGHTS_EARLY_EXIT + #undef EXIT_STATEMENT +#endif +} + +half getOmniLightFade(RenderOmniLight ol, float3 worldPos) +{ + float3 boxPos = half3(ol.boxR0.w, ol.boxR1.w, ol.boxR2.w); + float3 boxDiff = worldPos - boxPos; + float3 box = 2 * (ol.boxR0.xyz * boxDiff.x + ol.boxR1.xyz * boxDiff.y + ol.boxR2.xyz * boxDiff.z); + box = saturate(abs(box)); + const float FADEOUT_DIST = 0.05; + box = 1 - box; + float fadeout = min3(box.x, box.y, box.z); + float fadelimit = FADEOUT_DIST; + return fadeout <= fadelimit ? fadeout / fadelimit : 1; +} + +#include "ColorSpaceUtility.hlsl" +#include "fast_shader_trig.hlsli" + +float3 inv_octahedral_mapping(float2 tc, float zoom, bool rotate) +{ + tc = (tc * 2 - 1) / zoom; + if (rotate) + tc = float2(tc.x - tc.y, tc.x + tc.y) / 2; + float3 dir = float3(tc.xy, 1.0 - (abs(tc.x) + abs(tc.y))); + if (dir.z < 0) + dir.xy = float2(-(abs(dir.y) - 1) * sign(dir.x), -(abs(dir.x) - 1) * sign(dir.y)); + return normalize(dir); +} + +half2 octahedral_mapping(half3 co, float zoom, bool rotate) +{ + co /= dot(half3(1, 1, 1), abs(co)); + +#if SHADER_COMPILER_HLSL2021 + co.xy = co.y < 0.0 ? (1.0 - abs(co.zx)) * (select(co.xz < 0, float2(-1, -1), float2(1, 1))) : co.xz; +#else + co.xy = co.y < 0.0 ? (1.0 - abs(co.zx)) * (co.xz < 0 ? float2(-1, -1) : float2(1, 1)) : co.xz; +#endif + + if (rotate) + { + float tempX = co.x; + co.x = (co.x + co.y); + co.y = (co.y - tempX); + } + co.x *= zoom; + co.y *= zoom; + return co.xy * 0.5 + 0.5; +} + +half getOmniLightIntensity(RenderOmniLight ol, float3 worldPos) +{ + return 1; +} + +float4 getFinalColor(RenderOmniLight ol, float3 worldPos) +{ + return ol.colorFlags * getOmniLightFade(ol, worldPos) * getOmniLightIntensity(ol, worldPos); +} + +VsOutput deferred_lights_vs(VsInput input, uint omni_light_index : SV_InstanceID) +{ + VsOutput output; + RenderOmniLight ol = omni_lights_cb[omni_light_index]; + float4 pos_and_radius = ol.posRadius; + float3 worldPos = pos_and_radius.xyz + input.pos.xyz * pos_and_radius.w * 1.15; + float4 color_and_attenuation = getFinalColor(ol, worldPos); + output.pos = mul(mvp, float4(worldPos, 1)); + output.color_and_attenuation = color_and_attenuation; + output.pos_and_radius = pos_and_radius; + output.worldPos = worldPos; + output.worldPos2 = worldPos - world_view_pos.xyz; +#if OMNI_SHADOWS + output.shadow_tc_to_atlas = getOmniLightShadowData(index); +#endif +#if LIGHT_LIMIT_SIZE + output.pos_and_radius.w = min(output.pos_and_radius.w, LIGHT_LIMIT_SIZE); +#endif + return output; +} + + + +float4 deferred_lights_ps(VsOutput input) : + SV_Target +{ + float4 screenpos = GET_SCREEN_POS(input.pos); + half3 result; + float3 view; + float2 tc; + float dist, w; + { + tc = screen_pos_to_tc(screenpos.xy); + + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, tc, 0).x; + float4 farpos = float4(tc.x * 2 - 1, (1 - tc.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + + float3 pointToEye = worldPos.xyz - world_view_pos.xyz; + + float4 pos_and_radius = input.pos_and_radius; +#if OMNI_SHADOWS + float4 shadowTcToAtlas = input.shadow_tc_to_atlas; +#else + float4 shadowTcToAtlas = float4(0, 0, 0, 0); +#endif + float3 moveFromPos = pos_and_radius.xyz - worldPos.xyz; + view = 0; + dist = 0; + + bool shouldExit = dot(moveFromPos, moveFromPos) > pos_and_radius.w * pos_and_radius.w; +#if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); +#endif + BRANCH + if (!shouldExit) + { + ProcessedGbuffer gbuffer = readProcessedGbuffer(tc); + + float distSq = dot(pointToEye, pointToEye); + float invRsqrt = rsqrt(distSq); + view = pointToEye * invRsqrt; + dist = rcp(invRsqrt); + float NdotV = dot(gbuffer.normal, view); + float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float NoV = abs(NdotV) + 1e-5; + + half dynamicLightsSpecularStrength = gbuffer.extracted_albedo_ao; + half ssao = 1; // fixme: we should use SSAO here! + half enviAO = gbuffer.ao * ssao; // we still modulate by albedo color, so we don't need micro AO + half pointLightsFinalAO = (enviAO * 0.5 + 0.5); + half specularAOcclusion = computeSpecOcclusion(saturate(NdotV), enviAO, gbuffer.linearRoughness * gbuffer.linearRoughness); // dice spec occlusion + half3 specularColor = gbuffer.specularColor * (specularAOcclusion * gbuffer.extracted_albedo_ao); + + float4 color_and_attenuation = input.color_and_attenuation; + result = perform_point_light(worldPos.xyz, view, NoV, gbuffer, gbuffer.specularColor, dynamicLightsSpecularStrength, gbuffer.ao, pos_and_radius, color_and_attenuation, shadowTcToAtlas, screenpos.xy); + result *= pointLightsFinalAO; + + return float4(result, 1); + } + } + + return float4(0, 0, 0, 0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/postFX_shader.hlsl b/project_templates/sample_scene/content/shaders/src/postFX_shader.hlsl new file mode 100644 index 00000000..8c59172a --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/postFX_shader.hlsl @@ -0,0 +1,121 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "in_out.hlsli" + +Texture2D frame_tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(PropertyBuffer) : register(b0) +{ + float exposure; +}; + +VsOutput VSMain(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + //TODO: Rewrite to use only one triangle in future + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + output.color = float4(output.texCoord, 1, 0.5); + + return output; +} + +float3 ReinhardMain(float3 texColor) +{ + float3 retColor = texColor / (texColor + 1); // Reinhard + // retColor = pow(retColor,1.0f/2.2f); // Gamma + return retColor; +} + +#include +float3 FilmicMain(float3 texColor) +{ + float3 x = max(0, texColor - 0.004); // Filmic Curve + float3 retColor = (x * (6.2 * x + .5)) / (x * (6.2 * x + 1.7) + 0.06); + // retColor = pow(retColor,2.2f); // Gamma + return retColor; +} +float3 Uncharted2Tonemap(float3 x) +{ + float A = 0.15; + float B = 0.50; + float C = 0.10; + float D = 0.20; + float E = 0.02; + float F = 0.30; + float W = 11.2; + + return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F; +} + +float3 UnchartedMain(float3 texColor) +{ + float ExposureBias = 2.0f; + float3 curr = Uncharted2Tonemap(ExposureBias * texColor); + float3 W = 5; + float3 whiteScale = 1.0f / Uncharted2Tonemap(W); + float3 color = curr * whiteScale; + + return color; +} +// #define tonemap FilmicMain +half grainFromUV(float2 uv) +{ + return frac(sin(uv.x + uv.y * 543.31) * 493013.0); +} +#define tex2Dlod(tex, sampler, uv) tex.SampleLevel(sampler, (uv).xy, (uv).w) + +#if USE_UNCHARTED_TONEMAP +#define tonemap(color) UnchartedMain(color) +#elif USE_FILMIC_TONEMAP +#define tonemap(color) FilmicMain(color) +#elif USE_REINHARD_TONEMAP +#define tonemap(color) ReinhardMain(color) +#else +#define tonemap(color) (color) +#endif + +half3 sampleSceneColor(float2 tc) +{ + return tex2Dlod(frame_tex, sampl, float4(tc, 0, 0)).xyz; +} +float4 PSMain(VsOutput input) : + SV_Target +{ +// #define USE_COLOR_FRINGE 1 +// #define USE_GRAIN_JITTER 1 +#if USE_COLOR_FRINGE + float2 screenPos = input.texCoord.xy * 2 - 1; + float2 sceneUVJitter = float2(0.0, 0.0); + #if USE_GRAIN_JITTER + float2 sceneUV = input.texCoord.xy; + float grainRandomFull = 1.1; + half grain = grainFromUV(sceneUV + grainRandomFull); + float grainIntensity = 1; + float2 grainUV = sceneUV + 0.5 / float2(1920, 1080); + sceneUV = lerp(sceneUV, grainUV.xy, (1.0 - grain * grain) * grainIntensity); + sceneUVJitter = sceneUV.xy - input.texCoord.xy; + #else + float2 sceneUV = input.texCoord.xy; + #endif + + float3 chromatic_aberration_params = float3(0.1, 0.1, 0.15); + float2 caScale = chromatic_aberration_params.xy; + float caStartOffset = chromatic_aberration_params.z; + + float4 uvRG; + uvRG = screenPos.xyxy - sign(screenPos.xy).xyxy * saturate(abs(screenPos.xy) - caStartOffset).xyxy * caScale.xxyy; + uvRG = uvRG * 0.5 + 0.5; + + half3 frame = sampleSceneColor(uvRG.xy + sceneUVJitter.xy); + frame.g = sampleSceneColor(uvRG.zw + sceneUVJitter.xy).g; + frame.b = sampleSceneColor(sceneUV).b; +#else + half3 frame = sampleSceneColor(input.texCoord); // fixed exposure of 0.25! +#endif + return tonemap(frame * exposure).rgbr; // we write to srgb, so accurateLinearToSRGB not needed +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/postFX_skybox.hlsl b/project_templates/sample_scene/content/shaders/src/postFX_skybox.hlsl new file mode 100644 index 00000000..e286d27f --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/postFX_skybox.hlsl @@ -0,0 +1,46 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +struct VsOutputSkybox +{ + float4 position : SV_Position; + float3 texCoord : TEXCOORD; +}; + +TextureCube environmentCubemap : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 viewMatrix; + float4x4 projectionMatrix; +}; + +VsOutputSkybox VSMain(uint id : SV_VertexID) +{ + VsOutputSkybox output = (VsOutputSkybox)0; + + const float3 position = float3( + ((id & 0x4) == 0) ? 1.0 : -1.0, + ((id & 0x2) == 0) ? 1.0 : -1.0, + ((id & 0x1) == 0) ? 1.0 : -1.0); + + output.texCoord = position; + + float4 viewPositionDiscardTranslation = mul(viewMatrix, float4(position, 0.0f)); + float4 projectedPosition = mul(projectionMatrix, viewPositionDiscardTranslation); + projectedPosition.z = 0.0f; // since we use ReverseZ, otherwise set to .w + + output.position = projectedPosition; + + return output; +} + +float4 PSMain(VsOutputSkybox input) : SV_Target +{ + float4 sky = environmentCubemap.Sample(sampl, input.texCoord); + sky.a = 0; + return sky; +} diff --git a/project_templates/sample_scene/content/shaders/src/spot_lights_shader.hlsl b/project_templates/sample_scene/content/shaders/src/spot_lights_shader.hlsl new file mode 100644 index 00000000..5b44d8b5 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/spot_lights_shader.hlsl @@ -0,0 +1,248 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "ColorSpaceUtility.hlsl" +#include "clustered/point_light.hlsli" + +struct VsOutput +{ + VS_OUT_POSITION(pos) + nointerpolation float3 id_texId_scale : TEXCOORD0; + float4 pos_and_radius : TEXCOORD1; + float4 color_and_attenuation : TEXCOORD2; + float4 dir_angle : TEXCOORD3; +}; + +struct VsInput +{ + float3 pos : POSITION; +}; + +SYSTEM_CBUFFER(Lights) : register(b1) +{ + uint4 spot_lights_count; + RenderSpotLight spot_lights_cb[MAX_SPOT_LIGHTS]; +} + +VsOutput deferred_lights_vs(VsInput input, uint spot_light_index : SV_InstanceID) +{ + VsOutput output; + RenderSpotLight sl = spot_lights_cb[spot_light_index]; + float4 pos_and_radius = sl.lightPosRadius; + float4 color_and_attenuation = sl.lightColorAngleScale; + color_and_attenuation.w = abs(color_and_attenuation.w); + float4 dir_angle = sl.lightDirectionAngleOffset; + const float lightAngleScale = color_and_attenuation.a; + const float lightAngleOffset = dir_angle.a; + float2 texId_scale = sl.texId_scale.xy; + float cosOuter = -lightAngleOffset / lightAngleScale; + float halfTan = sqrt(1 / (cosOuter * cosOuter) - 1); + float3 ofs; + if (dot(input.pos, input.pos) > 0) + { + ofs = tangent_to_world(normalize(float3(input.pos.xy * halfTan, input.pos.z)), dir_angle.xyz); + } + else + { + ofs = float3(0, 0, 0); + } + + float4 worldPos = float4(pos_and_radius.xyz + ofs.xyz * (pos_and_radius.w / cosOuter), 1); + output.id_texId_scale = float3(spot_light_index, texId_scale); + output.pos = mul(mvp, worldPos); + output.color_and_attenuation = color_and_attenuation; + output.pos_and_radius = pos_and_radius; + output.dir_angle = dir_angle; + return output; +} +// ##endif + + +#include "gbuffer_read.hlsli" + +float readGbufferDepth(float2 tc) +{ + return depth_gbuf.SampleLevel(default_sampler, float4(tc, 0, 0).xy, float4(tc, 0, 0).w).r; +} + + +float4 deferred_lights_ps(VsOutput input HW_USE_SCREEN_POS) : + SV_Target +{ + float4 screenpos = GET_SCREEN_POS(input.pos); + half3 result; + float3 view; + float2 tc; + float dist; + bool is_calculated = false; + { + tc = screen_pos_to_tc(screenpos.xy); + + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, tc, 0).x; + float4 farpos = float4(tc.x * 2 - 1, (1 - tc.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + + float3 pointToEye = worldPos.xyz - world_view_pos.xyz; + + float4 pos_and_radius = input.pos_and_radius; +#if OMNI_SHADOWS + float4 shadowTcToAtlas = input.shadow_tc_to_atlas; +#else + float4 shadowTcToAtlas = float4(0, 0, 0, 0); +#endif + float3 moveFromPos = pos_and_radius.xyz - worldPos.xyz; + view = 0; + dist = 0; + + bool shouldExit = dot(moveFromPos, moveFromPos) > pos_and_radius.w * pos_and_radius.w; +#if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); +#endif + BRANCH + if (shouldExit) + { + is_calculated = false; // discard; //discard is faster, but also fails early depth + } + else + { + ProcessedGbuffer gbuffer = readProcessedGbuffer(tc); + + float distSq = dot(pointToEye, pointToEye); + float invRsqrt = rsqrt(distSq); + view = pointToEye * invRsqrt; + dist = rcp(invRsqrt); + float NdotV = dot(gbuffer.normal, view); + float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float NoV = abs(NdotV) + 1e-5; + + half dynamicLightsSpecularStrength = gbuffer.extracted_albedo_ao; + half ssao = 1; // fixme: we should use SSAO here! + half enviAO = gbuffer.ao * ssao; // we still modulate by albedo color, so we don't need micro AO + half pointLightsFinalAO = (enviAO * 0.5 + 0.5); + half specularAOcclusion = computeSpecOcclusion(saturate(NdotV), enviAO, gbuffer.linearRoughness * gbuffer.linearRoughness); // dice spec occlusion + half3 specularColor = gbuffer.specularColor * (specularAOcclusion * gbuffer.extracted_albedo_ao); + + float4 lightPosRadius = input.pos_and_radius; + float4 lightColor = input.color_and_attenuation; + float4 lightDirection = input.dir_angle; + uint spot_light_index = input.id_texId_scale.x; + float2 texId_scale = input.id_texId_scale.yz; +#define EXIT_STATEMENT return false + + float lightAngleScale = lightColor.a; + float lightAngleOffset = lightDirection.a; + + half geomAttenuation; + float3 dirFromLight, point2light; // point2light - not normalized + spot_light_params(worldPos.xyz, lightPosRadius, lightDirection.xyz, lightAngleScale, lightAngleOffset, geomAttenuation, dirFromLight, point2light); + + float NoL = dot(gbuffer.normal, dirFromLight); + half attenuation = calc_micro_shadow(NoL, gbuffer.ao) * geomAttenuation; + float ggx_alpha = max(1e-4, gbuffer.linearRoughness * gbuffer.linearRoughness); + +#if DYNAMIC_LIGHTS_EARLY_EXIT + #if DYNAMIC_LIGHTS_SSS + bool shouldExit = attenuation <= 0; + // bool shouldExit = attenuation <= 0 || (!isSubSurfaceShader(gbuffer.material) && NoL <= 0); + #else + attenuation = saturate(attenuation * NoL); + bool shouldExit = attenuation == 0; + #endif + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + { + is_calculated = false; + } + else + { +#else + #if !DYNAMIC_LIGHTS_SSS + attenuation = saturate(attenuation * NoL); + #endif +#endif + + half spotShadow = 1; +#if SPOT_SHADOWS || defined(SPOT_CONTACT_SHADOWS_CALC) + float zbias = shadowZBias + shadowSlopeZBias / (abs(NoL) + 0.1); + float4x4 spotLightTm = getSpotLightTm(spot_light_index); + float4 lightShadowTC = mul(spotLightTm, float4(worldPos.xyz + (point2light + dirFromLight) * zbias, 1)); + if (lightShadowTC.w > 1e-6) + { + lightShadowTC.xyz /= lightShadowTC.w; + #if SPOT_SHADOWS + #ifdef SIMPLE_PCF_SHADOW + spotShadow = 1 - dynamic_shadow_sample(lightShadowTC.xy, lightShadowTC.z); + #else + #ifndef shadow_frame + float shadow_frame = 0; + #endif + spotShadow = 1 - dynamic_shadow_sample_8tap(screenpos, lightShadowTC.xy, lightShadowTC.z, 1.5 * shadowAtlasTexel.x * (0.75 + saturate(0.3 * length(point2light))), shadow_frame); + #endif + #endif + #ifdef SPOT_CONTACT_SHADOWS_CALC + SPOT_CONTACT_SHADOWS_CALC + #endif + } + attenuation *= spotShadow; +#endif + +#if DYNAMIC_LIGHTS_SSS + NoL = saturate(NoL); + // half3 lightBRDF = standardBRDF(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, dirFromLight, view, gbuffer.normal, gbuffer.translucencyColor, gbuffer.translucency); + half3 lightBRDF = diffuseLambert(gbuffer.diffuseColor) * (NoL)*lightColor.xyz; + ; + + #if USE_SSSS && SPOT_SHADOWS + BRANCH if (gbuffer.material == SHADING_SUBSURFACE) + { + SpotlightShadowDescriptor spotlightDesc = spot_lights_ssss_shadow_desc[spot_light_index]; + BRANCH if (lightShadowTC.w > 1e-6 && spotlightDesc.hasDynamic) + { + float4 ssssShadowTC = mul(spotLightTm, float4(ssssWorldPos, 1)); + ssssShadowTC /= ssssShadowTC.w; + ShadowDescriptor desc; + desc.decodeDepth = spotlightDesc.decodeDepth; + desc.meterToUvAtZfar = spotlightDesc.meterToUvAtZfar; + desc.uvMinMax = spotlightDesc.uvMinMax; + desc.shadowRange = lightPosRadius.w; + float ssssTransmittance = ssss_get_transmittance_factor( + gbuffer.translucency, tc, dynamic_light_shadows_smp, dynamic_light_shadows_size, ssssShadowTC.xyz, desc); + result += gbuffer.diffuseColor * lightColor.rgb * ssss_get_profiled_transmittance(gbuffer.normal, dirFromLight, ssssTransmittance) * geomAttenuation; + } + } + else + #endif + { + /* + BRANCH if (isSubSurfaceShader(gbuffer.material)) + lightBRDF += (foliageSSS(NoL, view, dirFromLight) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + */ + } +#else + half3 lightBRDF = standardBRDF_NO_NOL(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, dirFromLight, view, gbuffer.normal); +#endif + attenuation = applyPhotometryIntensity(-dirFromLight, lightDirection.xyz, texId_scale.x, + texId_scale.y, attenuation); + lightBRDF *= attenuation * lightColor.xyz; +#if WAVE_INTRINSICS || !DYNAMIC_LIGHTS_EARLY_EXIT + FLATTEN + if (attenuation <= 0) + lightBRDF = 0; +#endif + + result = lightBRDF * pointLightsFinalAO; + is_calculated = true; + } + } + } + if (is_calculated) + { + return float4(result, 1); + } + + return float4(0, 0, 0, 0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/content/shaders/src/standard.hlsl b/project_templates/sample_scene/content/shaders/src/standard.hlsl new file mode 100644 index 00000000..cfd7b504 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/standard.hlsl @@ -0,0 +1,101 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + +#include "in_out.hlsli" +#include "common_types.hlsli" + +#include "shader_global.hlsli" +#include "gbuffer_base.hlsli" + +Texture2D albedoTex : register(t0); +Texture2D normalTex : register(t1); +Texture2D metalRoughnessAoTex : register(t2); + +SamplerState albedoSampler : register(s0); +SamplerState normalSampler : register(s1); +SamplerState metalRoughnessAoSampler : register(s2); + +#ifndef INSTANCED + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4x4 worldMatrix; + float4x4 normalMatrix; + float4 worldViewPos; +}; + +VsOutputGBuff VSMain(VsInputLit input) +{ + VsOutputGBuff output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = normalize(mul(normalMatrix, float4(input.normal, 0.0f)).xyz); + output.tangent = normalize(mul(worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + output.texCoord.y = 1.0f - output.texCoord.y; + + return output; +} +#else // !INSTANCED + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 vp; + float4 worldViewPos; +}; + +cbuffer InstanceDataBuffer : register(b1) +{ + float4 instanceBaseID; +}; + +StructuredBuffer instanceBuffer : register(t0); + +VsOutputGBuff VSMain(VsInputLit input, uint instID : SV_InstanceID) +{ + VsOutputGBuff output; + + const uint instIdx = instanceBaseID.x + instID; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + output.norm = mul(instanceBuffer[instIdx].normalMatrix, float4(input.normal.xyz, 0.0f)).xyz; + output.tangent = normalize(mul(instanceBuffer[instIdx].worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + output.texCoord.y = 1.0f - output.texCoord.y; + + return output; +} + +#endif // !INSTANCED + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + half3 albedo = albedoTex.Sample(albedoSampler, input.texCoord).rgb; + half4 metalRoughnessAo = metalRoughnessAoTex.Sample(metalRoughnessAoSampler, input.texCoord); + + float3 tangentNormal = normalTex.Sample(normalSampler, input.texCoord).xyz * 2.0f - 1.0f; + float3 worldSpaceNormal = normalize(TangentToWorld(tangentNormal, GetTBN(input.norm, input.tangent))); + + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + + init_albedo(result, albedo); + +#ifdef EMISSIVE + init_material(result, SHADING_EMISSIVE); + init_emission(result, 0.666f); // test value +#else + init_ao(result, saturate(metalRoughnessAo.r + 0.1f)); +#endif + + init_normal(result, worldSpaceNormal); + init_smoothness(result, 1.0f - metalRoughnessAo.g); + init_metalness(result, metalRoughnessAo.b); + + return encode_gbuffer(result, screenpos); +} + diff --git a/project_templates/sample_scene/content/shaders/src/standard_skinned.hlsl b/project_templates/sample_scene/content/shaders/src/standard_skinned.hlsl new file mode 100644 index 00000000..bb5609cc --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/standard_skinned.hlsl @@ -0,0 +1,91 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +#include "shader_global.hlsli" +#include "gbuffer_base.hlsli" + +struct VsInput +{ + float3 Position : POSITION; + float3 Normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 Tangent : TANGENT; + + float4 BoneWeights : BLENDWEIGHT; + uint4 BoneIndices : BLENDINDICES; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float3 tangent : TANGENT; +}; + +Texture2D albedoTex : register(t0); +Texture2D normalTex : register(t1); +Texture2D metalRoughnessAoTex : register(t2); + +SamplerState albedoSampler : register(s0); +SamplerState normalSampler : register(s1); +SamplerState metalRoughnessAoSampler : register(s2); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + matrix vp; + matrix BonesTransforms[NAU_MAX_SKINNING_BONES_COUNT]; + matrix BonesNormalTransforms[NAU_MAX_SKINNING_BONES_COUNT]; +}; + +VsOutput VSMain(VsInput input) +{ + VsOutput output; + + float4 skinnedPos = float4(0.0, 0.0, 0.0, 0.0); + float3 skinnedNormal = float3(0.0, 0.0, 0.0); + float3 skinnedTangent = float3(0.0, 0.0, 0.0); + + [unroll] + for (int i = 0; i < 4; i++) + { + const uint boneIndex = input.BoneIndices[i]; + if (boneIndex < NAU_MAX_SKINNING_BONES_COUNT) + { + skinnedPos += input.BoneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.Position, 1.0)); + skinnedNormal += input.BoneWeights[i] * mul(BonesNormalTransforms[boneIndex], float4(input.Normal, 0.0)).xyz; + skinnedTangent += input.BoneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.Tangent.xyz, 0.0)).xyz; + } + } + + output.position = mul(vp, skinnedPos); + output.texCoord = input.texCoord; + output.normal = normalize(skinnedNormal); + output.tangent = normalize(skinnedTangent); + + return output; +} + +GBUFFER_OUTPUT PSMain(VsOutput input) +{ + half3 albedo = albedoTex.Sample(albedoSampler, input.texCoord).rgb; + half4 metalRoughnessAo = metalRoughnessAoTex.Sample(metalRoughnessAoSampler, input.texCoord); + float3 tangentNormal = normalTex.Sample(normalSampler, input.texCoord).xyz * 2.0f - 1.0f; + + float3 worldSpaceNormal = normalize(TangentToWorld(tangentNormal, GetTBN(input.normal, input.tangent))); + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + + init_albedo(result, albedo); + init_ao(result, saturate(metalRoughnessAo.r + 0.1f)); + + init_normal(result, worldSpaceNormal); + init_smoothness(result, 1.0f - metalRoughnessAo.g); + init_metalness(result, metalRoughnessAo.b); + + return encode_gbuffer(result, screenpos); +} diff --git a/project_templates/sample_scene/content/shaders/src/standard_translucent.hlsl b/project_templates/sample_scene/content/shaders/src/standard_translucent.hlsl new file mode 100644 index 00000000..c397dc01 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/standard_translucent.hlsl @@ -0,0 +1,136 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +#include "in_out.hlsli" +#include "common_types.hlsli" + +#include "shader_global.hlsli" +#include "pbr.hlsli" + +#define DIELECTRIC_F0 float3(0.04, 0.04, 0.04) + +Texture2D albedoTex : register(t0); +Texture2D normalTex : register(t1); +Texture2D metalRoughnessAoTex : register(t2); + +SamplerState albedoSampler : register(s0); +SamplerState normalSampler : register(s1); +SamplerState metalRoughnessAoSampler : register(s2); + +half luminance(half3 col) +{ + return dot(col, half3(0.299, 0.587, 0.114)); +} + +#ifndef INSTANCED + + GLOBAL_CBUFFER(SceneBuffer) : register(b0) + { + float4x4 mvp; + float4x4 worldMatrix; + float4x4 normalMatrix; + float4 worldViewPos; + }; + + cbuffer ColorBuffer : register(b1) + { + float4 color; + }; + + VsOutputLitForward VSMain(VsInputLit input) + { + VsOutputLitForward output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = normalize(mul(normalMatrix, float4(input.normal, 0.0f)).xyz); + output.tangent = normalize(mul(worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + + output.worldPos = mul(worldMatrix, float4(input.position, 1.0f)).xyz; + output.color = color; + + return output; + } + +#else // !INSTANCED + + GLOBAL_CBUFFER(SceneBuffer) : register(b0) + { + float4x4 vp; + float4 worldViewPos; + }; + + cbuffer InstanceDataBuffer : register(b1) + { + float4 instanceBaseID; + }; + + cbuffer ColorBuffer : register(b2) + { + float4 color; + }; + + StructuredBuffer instanceBuffer : register(t0); + + VsOutputLitForward VSMain(VsInputLit input, uint instID : SV_InstanceID) + { + VsOutputLitForward output; + + const uint instIdx = instanceBaseID.x + instID; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + output.norm = mul(instanceBuffer[instIdx].normalMatrix, float4(input.normal.xyz, 0.0f)).xyz; + output.tangent = normalize(mul(instanceBuffer[instIdx].worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + + output.worldPos = mul(instanceBuffer[instIdx].worldMatrix, float4(input.position, 1.0f)).xyz; + output.color = color; + + return output; + } + +#endif // !INSTANCED + +float4 PSMain(VsOutputLitForward input) : SV_Target +{ + half4 albedo = albedoTex.Sample(albedoSampler, input.texCoord); + half4 metalRoughnessAo = metalRoughnessAoTex.Sample(metalRoughnessAoSampler, input.texCoord); + float3 tangentNormal = normalTex.Sample(normalSampler, input.texCoord).xyz * 2.0f - 1.0f; + + const float3 diffuseColor = float3(albedo.rgb); + const float linearRoughness = float(metalRoughnessAo.b); // todo: NAU-1797: srgb/linear ? + const float metallness = float(metalRoughnessAo.g); + const float ao = 1.0f; + + float3 worldSpaceNormal = normalize(TangentToWorld(tangentNormal, GetTBN(input.norm, input.tangent))); + + float3 pointToEye = worldViewPos.xyz - input.worldPos; + float3 view = normalize(pointToEye); + + // lights + float3 lightDir = normalize(float3(0.5f, -0.5f, 0.0f)); // todo: NAU-1797 pass direct light dir + + float NoL = saturate(dot(worldSpaceNormal, lightDir)) + 1e-5; + float NdotV = dot(worldSpaceNormal, view); + float NoV = abs(NdotV) + 1e-5; + float ggx_alpha = linearRoughness * linearRoughness; + + half3 lightColor = half3(1.0, 1.0, 1.0); // todo: NAU-1797 pass direct light color + + const float3 reflectionVec = 2 * NdotV * worldSpaceNormal - view; + float3 roughR = getRoughReflectionVec(reflectionVec, worldSpaceNormal, ggx_alpha); + + float opacity = albedo.a; // todo: NAU-1797 make color4 material prop, pass as Per-Instance Data or as regular CB-member (non-instanced) + + half fresnel0Dielectric = 0.04f; + fresnel0Dielectric = lerp(fresnel0Dielectric, 0.01f, linearRoughness * opacity); + fresnel0Dielectric *= (1 - opacity); + half3 specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), albedo.rgb, half(metallness)); + + half specularStrength = saturate(luminance(albedo.rgb) * (1 / 0.04)) * 0.9 + 0.1; + + half3 result = standardBRDF( NoV, NoL, diffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, half3(worldSpaceNormal)) * lightColor; + + return float4(float3(result), 1.0f) * input.color; +} diff --git a/project_templates/sample_scene/content/shaders/src/textured.hlsl b/project_templates/sample_scene/content/shaders/src/textured.hlsl new file mode 100644 index 00000000..a4348b30 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/textured.hlsl @@ -0,0 +1,104 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +// Constant buffer for test local material properties. +cbuffer TestBuffer : register(b1) +{ + float4 color; +}; + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +#ifndef GBUFFER_VARIANT + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; + +VsOutput VSMain(VsInput input) +{ + const float3 LightPos = {0, 15, -30}; + const float3 lightVec = normalize(LightPos - input.position); + const float diffuse = saturate(max(dot(lightVec, input.normal), 0.2) * 1.3); + + VsOutput output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.color = float4(diffuse, diffuse, diffuse, 1.0f); + output.texCoord = input.texCoord; + + return output; +} + +float4 PSMain(VsOutput input) : + SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color; +} + +float4 PSMainColored(VsOutput input) : SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color * color; +} +#else + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4 worldViewPos; +}; + +VsOutputGBuff VSMain(VsInput input) +{ + VsOutputGBuff output; + + float3 pos = input.position; + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = input.normal; + output.p2e = worldViewPos.xyz - pos; + output.texCoord = input.texCoord; + + return output; +} + +#include "gbuffer_base.hlsli" + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + float4 screenpos = input.position; + UnpackedGbuffer result; + init_gbuffer(result); + half4 albedo_roughness = tex.Sample(sampl, input.texCoord); + albedo_roughness.a = 1; // roughness + half4 normal_smoothness = half4(0, 1, 0, 1); + float3 normal; + normal.xyz = (normal_smoothness.xyz * 2 - 1); + // init_albedo_roughness(result, albedo_roughness); + init_albedo(result, albedo_roughness.xyz); + init_smoothness(result, normal_smoothness.a); + //init_normal(result, perturb_normal(normal, normalize(input.norm), input.p2e, input.texCoord)); + init_normal(result, normalize(input.norm)); + init_metalness(result, 0); + init_ao(result, 1); + return encode_gbuffer(result, screenpos); +} + +GBUFFER_OUTPUT PSMainColored(VsOutputGBuff input) +{ + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + float4 albedo = tex.Sample(sampl, input.texCoord); + init_albedo(result, albedo.xyz); + + return encode_gbuffer(result, screenpos); +} +#endif diff --git a/project_templates/sample_scene/content/shaders/src/texturedInstanced.hlsl b/project_templates/sample_scene/content/shaders/src/texturedInstanced.hlsl new file mode 100644 index 00000000..1b005736 --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/texturedInstanced.hlsl @@ -0,0 +1,111 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "common_types.hlsli" +#include "in_out.hlsli" +#include "shader_defines.h" + + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 vp; + float4x4 mvp; + float4x4 worldMatrix; + float4x4 normalMatrix; + float4 instanceBaseID; + matrix BonesTransforms[NAU_MAX_SKINNING_BONES_COUNT]; +}; + +cbuffer ColorBuffer : register(b1) +{ + float4 color; +}; + +StructuredBuffer instanceBuffer : register(t0); + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +float4 PSMain(VsOutput input) : SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color; +} + +VsOutputZPrepass zprepassInstancedVSMain(VsInputZPrepass input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output; + + const uint instIdx = instanceBaseID.x + instID; + output.uid = instanceBuffer[instIdx].uid; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + + return output; +} + +VsOutputZPrepass zprepassSkinnedVSMain(VsInputZPrepassSkinned input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output; + + const uint instIdx = instanceBaseID.x + instID; + output.uid = instanceBuffer[instIdx].uid; + + float4 skinnedPos = float4(0.0, 0.0, 0.0, 0.0); + + for (int i = 0; i < 4; i++) + { + const uint boneIndex = input.boneIndices[i]; + if (boneIndex < NAU_MAX_SKINNING_BONES_COUNT) + { + skinnedPos += input.boneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.position, 1.0)); + } + } + + output.position = mul(vp, skinnedPos); + + return output; +} + +uint4 zprepassPSMain(VsOutputZPrepass input) : SV_Target +{ + return input.uid; +} + +VsOutputZPrepass outlineMaskVSMain(VsInputZPrepass input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output; + + const uint instIdx = instanceBaseID.x + instID; + output.uid.x = instanceBuffer[instIdx].isHighlighted; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + + return output; +} + +VsOutputZPrepass outlineMaskSkinnedVSMain(VsInputZPrepassSkinned input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output = (VsOutputZPrepass)0; + + const uint instIdx = instanceBaseID.x + instID; + output.uid.x = instanceBuffer[instIdx].isHighlighted; + + float4 skinnedPos = float4(0.0, 0.0, 0.0, 0.0); + + for (int i = 0; i < 4; i++) + { + const uint boneIndex = input.boneIndices[i]; + if (boneIndex < NAU_MAX_SKINNING_BONES_COUNT) + { + skinnedPos += input.boneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.position, 1.0)); + } + } + + output.position = mul(vp, mul(worldMatrix, skinnedPos)); + + return output; +} + +float outlineMaskPSMain(VsOutputZPrepass input) : SV_Target +{ + return input.uid.x; +} diff --git a/project_templates/sample_scene/content/shaders/src/vfx.hlsl b/project_templates/sample_scene/content/shaders/src/vfx.hlsl new file mode 100644 index 00000000..9b7b187f --- /dev/null +++ b/project_templates/sample_scene/content/shaders/src/vfx.hlsl @@ -0,0 +1,81 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +struct InstanceData +{ + float4x4 worldMatrix; + int frameID; + float4 color; + uint3 dummy; +}; + +// Structure buffer for instance (InstanceData) +StructuredBuffer instanceBuffer : register(t1); + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 view; + float4x4 projection; +}; + +GLOBAL_CBUFFER(AtlasBuffer) : register(b1) +{ + int frames_y; + int frames_x; +}; + +VsVFXOutput VSMain(VsInput input, uint instanceId : SV_InstanceID) +{ + InstanceData instanceData = instanceBuffer[instanceId]; + + float4x4 model = instanceData.worldMatrix; + + float4 origin = float4(0.0, 0.0, 0.0, 1.0); + float4 world_origin = mul(model, origin); + float4 view_origin = mul(view, world_origin); + float4 world_to_view_translation = view_origin - world_origin; + + float4 world_pos = mul(model, float4(input.position, 1.0)); + float4 view_pos = world_pos + world_to_view_translation; + float4 clip_pos = mul(projection, view_pos); + + VsVFXOutput output; + + output.position = clip_pos; + output.color = instanceData.color; + output.frameID = instanceData.frameID; + output.texCoord = input.texCoord; + //output.columns = frames_y; + //output.rows = frames_x; + + return output; +} + +float4 PSMain(VsVFXOutput input) : SV_Target +{ + int currentFrame = input.frameID; + + //int columns = input.columns; + //int rows = input.rows; + + int columns = 1; + int rows = 1; + + float frameWidth = 1.0 / columns; + float frameHeight = 1.0 / rows; + + int frameX = currentFrame % columns; + int frameY = currentFrame / columns; + + float2 frameOrigin = float2(frameX * frameWidth, (float(rows - 1 - frameY)) * frameHeight); + float2 frameUV = frameOrigin + input.texCoord * float2(frameWidth, frameHeight); + + float4 albedo = tex.Sample(sampl, frameUV); + return albedo * input.color; +} diff --git a/project_templates/sample_scene/content/textures/default.jpg b/project_templates/sample_scene/content/textures/default.jpg new file mode 100644 index 00000000..f4b322ea Binary files /dev/null and b/project_templates/sample_scene/content/textures/default.jpg differ diff --git a/project_templates/sample_scene/content/textures/default_1k_ORM.jpg b/project_templates/sample_scene/content/textures/default_1k_ORM.jpg new file mode 100644 index 00000000..d31c808a Binary files /dev/null and b/project_templates/sample_scene/content/textures/default_1k_ORM.jpg differ diff --git a/project_templates/sample_scene/content/textures/default_1k_albedo.jpg b/project_templates/sample_scene/content/textures/default_1k_albedo.jpg new file mode 100644 index 00000000..bd4a202b Binary files /dev/null and b/project_templates/sample_scene/content/textures/default_1k_albedo.jpg differ diff --git a/project_templates/sample_scene/content/textures/default_1k_grey_albedo.jpg b/project_templates/sample_scene/content/textures/default_1k_grey_albedo.jpg new file mode 100644 index 00000000..6a67a0fa Binary files /dev/null and b/project_templates/sample_scene/content/textures/default_1k_grey_albedo.jpg differ diff --git a/project_templates/sample_scene/content/textures/default_albedo_8x8.png b/project_templates/sample_scene/content/textures/default_albedo_8x8.png new file mode 100644 index 00000000..48ba1fc2 Binary files /dev/null and b/project_templates/sample_scene/content/textures/default_albedo_8x8.png differ diff --git a/project_templates/sample_scene/content/textures/default_metal_rough_8x8.png b/project_templates/sample_scene/content/textures/default_metal_rough_8x8.png new file mode 100644 index 00000000..5e820a25 Binary files /dev/null and b/project_templates/sample_scene/content/textures/default_metal_rough_8x8.png differ diff --git a/project_templates/sample_scene/content/textures/default_normal_8x8.png b/project_templates/sample_scene/content/textures/default_normal_8x8.png new file mode 100644 index 00000000..bfcaa694 Binary files /dev/null and b/project_templates/sample_scene/content/textures/default_normal_8x8.png differ diff --git a/project_templates/sample_scene/content/textures/rusted_pbr/rusted_albedo_ao.png b/project_templates/sample_scene/content/textures/rusted_pbr/rusted_albedo_ao.png new file mode 100644 index 00000000..9aac9e52 Binary files /dev/null and b/project_templates/sample_scene/content/textures/rusted_pbr/rusted_albedo_ao.png differ diff --git a/project_templates/sample_scene/content/textures/rusted_pbr/rusted_metallic_roughness.png b/project_templates/sample_scene/content/textures/rusted_pbr/rusted_metallic_roughness.png new file mode 100644 index 00000000..5e5c9bd4 Binary files /dev/null and b/project_templates/sample_scene/content/textures/rusted_pbr/rusted_metallic_roughness.png differ diff --git a/project_templates/sample_scene/content/textures/rusted_pbr/rusted_normals.png b/project_templates/sample_scene/content/textures/rusted_pbr/rusted_normals.png new file mode 100644 index 00000000..dd646d2c Binary files /dev/null and b/project_templates/sample_scene/content/textures/rusted_pbr/rusted_normals.png differ diff --git a/project_templates/sample_scene/content/textures/sample_smoke_soft.png b/project_templates/sample_scene/content/textures/sample_smoke_soft.png new file mode 100644 index 00000000..d7b8d50a Binary files /dev/null and b/project_templates/sample_scene/content/textures/sample_smoke_soft.png differ diff --git a/project_templates/sample_scene/content/textures/white_8x8.png b/project_templates/sample_scene/content/textures/white_8x8.png new file mode 100644 index 00000000..59a2ed4c Binary files /dev/null and b/project_templates/sample_scene/content/textures/white_8x8.png differ diff --git a/project_templates/sample_scene/project.nauproject b/project_templates/sample_scene/project.nauproject new file mode 100644 index 00000000..a406019b --- /dev/null +++ b/project_templates/sample_scene/project.nauproject @@ -0,0 +1,16 @@ +{ + "ProjectVersion": "1.0", + + "Engine": { + "Version": "0.1" + }, + + "ProjectName": "%%(ProjectName)%%", + "Description": "sample standalone game module", + "DefaultScene": "main", + + + "Dependencies": [ + ] + +} diff --git a/project_templates/sample_scene/resources/.gitignore b/project_templates/sample_scene/resources/.gitignore new file mode 100644 index 00000000..8eb7bccb --- /dev/null +++ b/project_templates/sample_scene/resources/.gitignore @@ -0,0 +1 @@ +!*.nsbc \ No newline at end of file diff --git a/project_templates/sample_scene/resources/Images/Arrow-default.png b/project_templates/sample_scene/resources/Images/Arrow-default.png new file mode 100644 index 00000000..56ec6117 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Arrow-default.png differ diff --git a/project_templates/sample_scene/resources/Images/Arrow-hover.png b/project_templates/sample_scene/resources/Images/Arrow-hover.png new file mode 100644 index 00000000..312d8294 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Arrow-hover.png differ diff --git a/project_templates/sample_scene/resources/Images/Arrow-pressing.png b/project_templates/sample_scene/resources/Images/Arrow-pressing.png new file mode 100644 index 00000000..212a24b0 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Arrow-pressing.png differ diff --git a/project_templates/sample_scene/resources/Images/Button-default.png b/project_templates/sample_scene/resources/Images/Button-default.png new file mode 100644 index 00000000..513aa5c0 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Button-default.png differ diff --git a/project_templates/sample_scene/resources/Images/Button-disabled.png b/project_templates/sample_scene/resources/Images/Button-disabled.png new file mode 100644 index 00000000..29d5776a Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Button-disabled.png differ diff --git a/project_templates/sample_scene/resources/Images/Button-hover.png b/project_templates/sample_scene/resources/Images/Button-hover.png new file mode 100644 index 00000000..c46acd31 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Button-hover.png differ diff --git a/project_templates/sample_scene/resources/Images/Button-pressing.png b/project_templates/sample_scene/resources/Images/Button-pressing.png new file mode 100644 index 00000000..8568a437 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Button-pressing.png differ diff --git a/project_templates/sample_scene/resources/Images/Image-placeholder.png b/project_templates/sample_scene/resources/Images/Image-placeholder.png new file mode 100644 index 00000000..9b3e5704 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Image-placeholder.png differ diff --git a/project_templates/sample_scene/resources/Images/Slider-bar-default.png b/project_templates/sample_scene/resources/Images/Slider-bar-default.png new file mode 100644 index 00000000..821cd52c Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Slider-bar-default.png differ diff --git a/project_templates/sample_scene/resources/Images/Slider-default.png b/project_templates/sample_scene/resources/Images/Slider-default.png new file mode 100644 index 00000000..d24114bc Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Slider-default.png differ diff --git a/project_templates/sample_scene/resources/Images/Slider-hover.png b/project_templates/sample_scene/resources/Images/Slider-hover.png new file mode 100644 index 00000000..4e5cdf39 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Slider-hover.png differ diff --git a/project_templates/sample_scene/resources/Images/Slider-pressing.png b/project_templates/sample_scene/resources/Images/Slider-pressing.png new file mode 100644 index 00000000..849d0f86 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/Slider-pressing.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_Camera.png b/project_templates/sample_scene/resources/Images/billbords/Banner_Camera.png new file mode 100644 index 00000000..171b23eb Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_Camera.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Bulb.png b/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Bulb.png new file mode 100644 index 00000000..8eae8b14 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Bulb.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Direct.png b/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Direct.png new file mode 100644 index 00000000..b637d455 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Direct.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Spot.png b/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Spot.png new file mode 100644 index 00000000..b92321ff Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_Light_Spot.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_Sound_Emitter.png b/project_templates/sample_scene/resources/Images/billbords/Banner_Sound_Emitter.png new file mode 100644 index 00000000..fcd11d3c Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_Sound_Emitter.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_Sound_Listener.png b/project_templates/sample_scene/resources/Images/billbords/Banner_Sound_Listener.png new file mode 100644 index 00000000..07c2bf68 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_Sound_Listener.png differ diff --git a/project_templates/sample_scene/resources/Images/billbords/Banner_VFX.png b/project_templates/sample_scene/resources/Images/billbords/Banner_VFX.png new file mode 100644 index 00000000..f6b5d054 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/billbords/Banner_VFX.png differ diff --git a/project_templates/sample_scene/resources/Images/nau_logo.png b/project_templates/sample_scene/resources/Images/nau_logo.png new file mode 100644 index 00000000..6fc6e4a4 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/nau_logo.png differ diff --git a/project_templates/sample_scene/resources/Images/nau_logo_alpha.png b/project_templates/sample_scene/resources/Images/nau_logo_alpha.png new file mode 100644 index 00000000..9c8fb0a1 Binary files /dev/null and b/project_templates/sample_scene/resources/Images/nau_logo_alpha.png differ diff --git a/project_templates/sample_scene/resources/materials/billboards.nmat_json b/project_templates/sample_scene/resources/materials/billboards.nmat_json new file mode 100644 index 00000000..41206707 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/billboards.nmat_json @@ -0,0 +1,31 @@ +{ + "name": "billboards", + "pipelines": { + "default": { + "properties": { + "sampl": 0, + "scPercentSize": 0.0, + "aspectRatio": 1.0, + "uid": [ + 0, + 0, + 0, + 0 + ], + "tex": "asset:/content/textures/default.jpg", + "worldPosition": [ + 0.0, + 0.0, + 0.0 + ] + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[billboards.default.vs.billboardsvs]", + "file:/res/shaders/cache/shader_cache.nsbc+[billboards.default.ps.billboardsps]" + ], + "cullMode": "Clockwise", + "depthMode": "Default", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/deferred_rt_debug.nmat_json b/project_templates/sample_scene/resources/materials/deferred_rt_debug.nmat_json new file mode 100644 index 00000000..3f28eb07 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/deferred_rt_debug.nmat_json @@ -0,0 +1,49 @@ +{ + "name": "postFX_test_material", + "pipelines": { + "Regular": { + "globals": [], + "properties": [ + { + "name": "sampl", + "reg": 0, + "size": 0, + "stages": [ + "Pixel" + ], + "variables": { + "sampl1": { + "count": 1, + "offset": 0, + "type": "Sampler", + "value": 0 + } + } + }, + { + "name": "tex", + "reg": 0, + "size": 0, + "stages": [ + "Pixel" + ], + "variables": { + "tex1": { + "count": 1, + "offset": 0, + "type": "Texture", + "value": "asset:/content/textures/default.jpg" + } + } + } + ], + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_test_shader.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_test_shader.ps.psmain]" + ], + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "InverseDestinationAlpha" + } + } +} diff --git a/project_templates/sample_scene/resources/materials/deffered_light.nmat_json b/project_templates/sample_scene/resources/materials/deffered_light.nmat_json new file mode 100644 index 00000000..f249347c --- /dev/null +++ b/project_templates/sample_scene/resources/materials/deffered_light.nmat_json @@ -0,0 +1,53 @@ +{ + "name": "deffered_light", + "pipelines": { + "Omnilight": { + "properties": { + "sampl": 0, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[point_lights_shader.vs.deferred_lights_vs]", + "file:/res/shaders/cache/shader_cache.nsbc+[point_lights_shader.ps.deferred_lights_ps]" + ], + "cullMode": "None", + "depthMode": "ReadOnly", + "blendMode": "Additive" + }, + "Spotlight": { + "properties": { + "sampl": 0 + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[spot_lights_shader.vs.deferred_lights_vs]", + "file:/res/shaders/cache/shader_cache.nsbc+[spot_lights_shader.ps.deferred_lights_ps]" + ], + "cullMode": "None", + "depthMode": "ReadOnly", + "blendMode": "Additive" + }, + "OmnilightDebug": { + "properties": { + "sampl": 0, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[debug_lights_shader.vs.debug_point_lights_vs]", + "file:/res/shaders/cache/shader_cache.nsbc+[debug_lights_shader.ps.debug_point_lights_ps]" + ], + "cullMode": "None", + "depthMode": "ReadOnly", + "blendMode": "Opaque" + }, + "SpotlightDebug": { + "properties": { + "sampl": 0 + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[debug_lights_shader.vs.debug_spot_lights_vs]", + "file:/res/shaders/cache/shader_cache.nsbc+[debug_lights_shader.ps.debug_spot_lights_ps]" + ], + "cullMode": "None", + "depthMode": "ReadOnly", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/embedded/debug_renderer.nmat_json b/project_templates/sample_scene/resources/materials/embedded/debug_renderer.nmat_json new file mode 100644 index 00000000..183fbc84 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/embedded/debug_renderer.nmat_json @@ -0,0 +1,32 @@ +{ + "name": "simple_debug", + + "pipelines": { + + "line": { + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[debug_renderer_line_shader.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[debug_renderer_line_shader.ps.psmain]" + ], + + "cullMode": "None", + "depthMode": "WriteOnly", + "blendMode": "Opaque", + "stencilCmpFunc": "Disabled" + }, + + "mesh": { + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[debug_renderer_mesh_shader.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[debug_renderer_mesh_shader.ps.psmain]" + ], + + "cullMode": "None", + "depthMode": "WriteOnly", + "blendMode": "Opaque", + "stencilCmpFunc": "Disabled" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/embedded/simple_debug.nmat_json b/project_templates/sample_scene/resources/materials/embedded/simple_debug.nmat_json new file mode 100644 index 00000000..154390c7 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/embedded/simple_debug.nmat_json @@ -0,0 +1,84 @@ +{ + "name": "simple_debug", + + "pipelines": { + + "default": { + + "properties": { + "albedoTex": [ + 1.0, + 0.0, + 0.0, + 1.0 + ], + + "normalTex": [ + 0.0, + 0.0, + 1.0, + 1.0 + ], + + "metalRoughnessAoTex": [ + 0.5, + 0.5, + 0.5, + 1.0 + ] + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + }, + + + "instanced": { + + "properties": { + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + + "albedoTex": [ + 1.0, + 0.0, + 0.0, + 1.0 + ], + + "normalTex": [ + 0.0, + 0.0, + 1.0, + 1.0 + ], + + "metalRoughnessAoTex": [ + 0.5, + 0.5, + 0.5, + 1.0 + ] + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/embedded/standard_opaque.nmat_json b/project_templates/sample_scene/resources/materials/embedded/standard_opaque.nmat_json new file mode 100644 index 00000000..414221ed --- /dev/null +++ b/project_templates/sample_scene/resources/materials/embedded/standard_opaque.nmat_json @@ -0,0 +1,88 @@ +{ + "name": "standard_opaque", + + "pipelines": { + + "default": { + + "properties": { + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + }, + + + "deferred": { + + "properties": { + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + }, + + + "deferredEmissive": { + + "properties": { + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + }, + + + "instanced": { + + "properties": { + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/embedded/standard_skinned.nmat_json b/project_templates/sample_scene/resources/materials/embedded/standard_skinned.nmat_json new file mode 100644 index 00000000..2a420607 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/embedded/standard_skinned.nmat_json @@ -0,0 +1,24 @@ +{ + "name": "standard_skinned", + + "pipelines": { + + "default": { + + "properties": { + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard_skinned.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard_skinned.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/embedded/standard_translucent.nmat_json b/project_templates/sample_scene/resources/materials/embedded/standard_translucent.nmat_json new file mode 100644 index 00000000..b3de50bf --- /dev/null +++ b/project_templates/sample_scene/resources/materials/embedded/standard_translucent.nmat_json @@ -0,0 +1,64 @@ +{ + "name": "standard_translucent", + + "pipelines": { + + "default": { + + "properties": { + "color": [ + 1.0, + 0.0, + 1.0, + 0.5 + ], + + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "ReadOnly", + "blendMode": "Translucent" + }, + + + "instanced": { + + "properties": { + "color": [ + 1.0, + 0.0, + 1.0, + 0.5 + ], + + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.instanced.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.instanced.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "ReadOnly", + "blendMode": "Translucent" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/embedded/standard_translucent_additive.nmat_json b/project_templates/sample_scene/resources/materials/embedded/standard_translucent_additive.nmat_json new file mode 100644 index 00000000..2f810944 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/embedded/standard_translucent_additive.nmat_json @@ -0,0 +1,64 @@ +{ + "name": "standard_translucent", + + "pipelines": { + + "default": { + + "properties": { + "color": [ + 1.0, + 0.0, + 1.0, + 0.5 + ], + + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "ReadOnly", + "blendMode": "Additive" + }, + + + "instanced": { + + "properties": { + "color": [ + 1.0, + 0.0, + 1.0, + 0.5 + ], + + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + + "albedoTex": "asset:/content/textures/default_1k_albedo.jpg", + "normalTex": "asset:/content/textures/default_normal_8x8.png", + "metalRoughnessAoTex": "asset:/content/textures/default_1k_ORM.jpg" + }, + + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.instanced.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard_translucent.instanced.ps.psmain]" + ], + + "cullMode": "CounterClockwise", + "depthMode": "ReadOnly", + "blendMode": "Additive" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/grid.nmat_json b/project_templates/sample_scene/resources/materials/grid.nmat_json new file mode 100644 index 00000000..690f67d8 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/grid.nmat_json @@ -0,0 +1,16 @@ +{ + "name": "grid", + "pipelines": { + "default": { + "properties": { + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[grid.default.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[grid.default.ps.psmain]" + ], + "cullMode": "None", + "depthMode": "ReadOnly", + "blendMode": "AlphaBlend" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/imgui.nmat_json b/project_templates/sample_scene/resources/materials/imgui.nmat_json new file mode 100644 index 00000000..5753fd2b --- /dev/null +++ b/project_templates/sample_scene/resources/materials/imgui.nmat_json @@ -0,0 +1,18 @@ +{ + "name": "imgui", + "pipelines": { + "Regular": { + "properties": { + "tex": "asset:/content/textures/default.jpg" + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[imgui.vs.imgui_vs]", + "file:/res/shaders/cache/shader_cache.nsbc+[imgui.ps.imgui_ps]" + ], + "cullMode": "None", + "depthMode": "Disabled", + "blendMode": "PremultipliedAlpha", + "isScissorsEnabled": true + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/outline_calculation.nmat_json b/project_templates/sample_scene/resources/materials/outline_calculation.nmat_json new file mode 100644 index 00000000..e4cc771f --- /dev/null +++ b/project_templates/sample_scene/resources/materials/outline_calculation.nmat_json @@ -0,0 +1,99 @@ +{ + "name": "outline_material", + "pipelines": { + "JumpFloodInit": { + "properties": { + "outlineColor": [ + 1.0, + 0.0, + 1.0, + 1.0 + ], + "screenWidth" : 0, + "screenHeight" : 0, + "jumpStepWidth" : 0, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[outline_calculation.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[outline_calculation.ps.psmainjumpfloodinit]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "Opaque" + }, + "JumpFloodStep": { + "properties": { + "outlineColor": [ + 1.0, + 0.0, + 1.0, + 1.0 + ], + "screenWidth" : 0, + "screenHeight" : 0, + "jumpStepWidth" : 0, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[outline_calculation.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[outline_calculation.ps.psmainjumpfloodstep]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "Opaque" + }, + "JumpFloodResult": { + "properties": { + "outlineColor": [ + 1.0, + 0.0, + 1.0, + 1.0 + ], + "screenWidth" : 0, + "screenHeight" : 0, + "jumpStepWidth" : 0, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[outline_calculation.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[outline_calculation.ps.psmainjumpfloodresult]" + ], + "cullMode": "None", + "depthMode": "ReadOnly", + "blendMode": "AlphaBlend" + }, + "default": { + "properties": { + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.vs.outlinemaskvsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.ps.outlinemaskpsmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "MaxBlend" + }, + "skinned": { + "properties": { + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.vs.outlinemaskskinnedvsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.ps.outlinemaskpsmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "MaxBlend" + } + } +} diff --git a/project_templates/sample_scene/resources/materials/pixel_data_extraction.nmat_json b/project_templates/sample_scene/resources/materials/pixel_data_extraction.nmat_json new file mode 100644 index 00000000..dd7e4401 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/pixel_data_extraction.nmat_json @@ -0,0 +1,11 @@ +{ + "name": "PixelDataExtraction", + "pipelines": { + "default": { + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[cs_pixel_data_extraction.cs.csmain]" + ] + } + } + } + \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/pp_deferred_resolve.nmat_json b/project_templates/sample_scene/resources/materials/pp_deferred_resolve.nmat_json new file mode 100644 index 00000000..43ca1879 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/pp_deferred_resolve.nmat_json @@ -0,0 +1,22 @@ +{ + "name": "deferred_resolve", + "pipelines": { + "Regular": { + "properties": { + "albedo_gbuf": "asset:/content/textures/white_8x8.png", + "normal_gbuf": "asset:/content/textures/white_8x8.png", + "material_gbuf": "asset:/content/textures/white_8x8.png", + "depth_gbuf": "asset:/content/textures/white_8x8.png", + "irradianceMap": "asset:/content/textures/white_8x8.png", + "reflectionMap": "asset:/content/textures/white_8x8.png", + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[deferred_resolve.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[deferred_resolve.ps.psmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Default", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/pp_tonemap.nmat_json b/project_templates/sample_scene/resources/materials/pp_tonemap.nmat_json new file mode 100644 index 00000000..96678a21 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/pp_tonemap.nmat_json @@ -0,0 +1,54 @@ +{ + "name": "tonemap_material", + "pipelines": { + "Regular": { + "properties": { + "exposure": 1, + "frame_tex": "asset:/content/textures/white_8x8.png" + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.ps.psmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "Opaque" + }, + "Uncharted": { + "properties": { + "exposure": 1, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.Uncharted.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.Uncharted.ps.psmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "Opaque" + }, + "Filmic": { + "properties": { + "exposure": 1, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.Filmic.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.Filmic.ps.psmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "Opaque" + }, + "Reinhard": { + "properties": { + "exposure": 1, + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.Reinhard.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_shader.Reinhard.ps.psmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Disabled", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/skinned_robot.nmat_inst_json b/project_templates/sample_scene/resources/materials/skinned_robot.nmat_inst_json new file mode 100644 index 00000000..1eb554a3 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/skinned_robot.nmat_inst_json @@ -0,0 +1,17 @@ +{ + "name": "skinned_robot", + + "master": "file:/content/materials/embedded/standard_skinned.nmat_json", + + "pipelines": { + + "default": { + + "properties": { + "albedoTex": "file:/content/scenes/robot/robot_albedo_ao.png", + "normalTex": "file:/content/scenes/robot/robot_nm.png", + "metalRoughnessAoTex": "file:/content/scenes/robot/robot_metal_rough.png" + } + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/skybox.nmat_json b/project_templates/sample_scene/resources/materials/skybox.nmat_json new file mode 100644 index 00000000..80db3254 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/skybox.nmat_json @@ -0,0 +1,17 @@ +{ + "name": "postFX_skybox", + "pipelines": { + "Regular": { + "properties": { + "environmentCubemap": "asset:/content/textures/white_8x8.png" + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_skybox.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[postFX_skybox.ps.psmain]" + ], + "cullMode": "Clockwise", + "depthMode": "ReadOnly", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/vfx.nmat_json b/project_templates/sample_scene/resources/materials/vfx.nmat_json new file mode 100644 index 00000000..6255ad7f --- /dev/null +++ b/project_templates/sample_scene/resources/materials/vfx.nmat_json @@ -0,0 +1,19 @@ +{ + "name": "vfx", + "pipelines": { + "default": { + "properties": { + "frames_y": 1, + "frames_x": 1, + "tex": "file:/content/textures/sample_smoke_soft.png" + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[vfx.Regular.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[vfx.Regular.ps.psmain]" + ], + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Translucent" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/materials/z_prepass.nmat_json b/project_templates/sample_scene/resources/materials/z_prepass.nmat_json new file mode 100644 index 00000000..c9503632 --- /dev/null +++ b/project_templates/sample_scene/resources/materials/z_prepass.nmat_json @@ -0,0 +1,39 @@ +{ + "name": "Z-Prepass", + "pipelines": { + "default": { + "properties": { + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.vs.zprepassinstancedvsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.ps.zprepasspsmain]" + ], + "cullMode": "Clockwise", + "depthMode": "Default", + "blendMode": "Opaque" + }, + "skinned": { + "properties": { + "instanceBaseID": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "shaders": [ + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.vs.zprepassskinnedvsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[texturedInstanced.ps.zprepasspsmain]" + ], + "cullMode": "CounterClockwise", + "depthMode": "Default", + "blendMode": "Opaque" + } + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/physics/channels.data b/project_templates/sample_scene/resources/physics/channels.data new file mode 100644 index 00000000..34a3301c --- /dev/null +++ b/project_templates/sample_scene/resources/physics/channels.data @@ -0,0 +1,11 @@ +{ + "collisionChannels": [ + { + "channel": 0, + "collisions": [ + 0 + ], + "name": "Default" + } + ] +} diff --git a/project_templates/sample_scene/resources/shaders/cache/shader_cache.nsbc b/project_templates/sample_scene/resources/shaders/cache/shader_cache.nsbc new file mode 100644 index 00000000..362bf8fa --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/cache/shader_cache.nsbc @@ -0,0 +1,16087 @@ +NauContent-Kind: nau-shader-pack +Content-Type: application/json +Content-Length: 104565 + + +{"byteCode":[{"blobOffset":0,"blobSize":14240,"shaderName":"billboards.default.vs.billboardsvs"},{"blobOffset":14240,"blobSize":12780,"shaderName":"billboards.default.ps.billboardsps"},{"blobOffset":27020,"blobSize":32528,"shaderName":"cs_gen_irradiance_map.cs.csmain"},{"blobOffset":59548,"blobSize":57888,"shaderName":"cs_gen_reflection_map.cs.csmain"},{"blobOffset":117436,"blobSize":28668,"shaderName":"cs_panorama_to_cubemap.cs.csmain"},{"blobOffset":146104,"blobSize":11512,"shaderName":"cs_pixel_data_extraction.cs.csmain"},{"blobOffset":157616,"blobSize":125580,"shaderName":"debug_lights_shader.vs.debug_point_lights_vs"},{"blobOffset":283196,"blobSize":121016,"shaderName":"debug_lights_shader.ps.debug_point_lights_ps"},{"blobOffset":404212,"blobSize":128480,"shaderName":"debug_lights_shader.vs.debug_spot_lights_vs"},{"blobOffset":532692,"blobSize":121004,"shaderName":"debug_lights_shader.ps.debug_spot_lights_ps"},{"blobOffset":653696,"blobSize":11188,"shaderName":"debug_renderer_line_shader.vs.vsmain"},{"blobOffset":664884,"blobSize":8624,"shaderName":"debug_renderer_line_shader.ps.psmain"},{"blobOffset":673508,"blobSize":11716,"shaderName":"debug_renderer_mesh_shader.vs.vsmain"},{"blobOffset":685224,"blobSize":8684,"shaderName":"debug_renderer_mesh_shader.ps.psmain"},{"blobOffset":693908,"blobSize":63052,"shaderName":"deferred_resolve.vs.vsmain"},{"blobOffset":756960,"blobSize":100668,"shaderName":"deferred_resolve.ps.psmain"},{"blobOffset":857628,"blobSize":11884,"shaderName":"grid.default.vs.vsmain"},{"blobOffset":869512,"blobSize":17228,"shaderName":"grid.default.ps.psmain"},{"blobOffset":886740,"blobSize":11744,"shaderName":"imgui.vs.imgui_vs"},{"blobOffset":898484,"blobSize":10684,"shaderName":"imgui.ps.imgui_ps"},{"blobOffset":909168,"blobSize":17036,"shaderName":"multi_tex.vs.vsmain"},{"blobOffset":926204,"blobSize":25496,"shaderName":"multi_tex.gbuffer.vs.vsmain"},{"blobOffset":951700,"blobSize":15668,"shaderName":"multi_tex.ps.psmain"},{"blobOffset":967368,"blobSize":32840,"shaderName":"multi_tex.gbuffer.ps.psmain"},{"blobOffset":1000208,"blobSize":16340,"shaderName":"outline_calculation.vs.vsmain"},{"blobOffset":1016548,"blobSize":25044,"shaderName":"outline_calculation.ps.psmainjumpfloodinit"},{"blobOffset":1041592,"blobSize":27740,"shaderName":"outline_calculation.ps.psmainjumpfloodstep"},{"blobOffset":1069332,"blobSize":20476,"shaderName":"outline_calculation.ps.psmainjumpfloodresult"},{"blobOffset":1089808,"blobSize":148244,"shaderName":"point_lights_shader.vs.deferred_lights_vs"},{"blobOffset":1238052,"blobSize":156116,"shaderName":"point_lights_shader.ps.deferred_lights_ps"},{"blobOffset":1394168,"blobSize":19708,"shaderName":"postFX_shader.vs.vsmain"},{"blobOffset":1413876,"blobSize":19740,"shaderName":"postFX_shader.Uncharted.vs.vsmain"},{"blobOffset":1433616,"blobSize":19740,"shaderName":"postFX_shader.Filmic.vs.vsmain"},{"blobOffset":1453356,"blobSize":19740,"shaderName":"postFX_shader.Reinhard.vs.vsmain"},{"blobOffset":1473096,"blobSize":21332,"shaderName":"postFX_shader.ps.psmain"},{"blobOffset":1494428,"blobSize":23668,"shaderName":"postFX_shader.Uncharted.ps.psmain"},{"blobOffset":1518096,"blobSize":22668,"shaderName":"postFX_shader.Filmic.ps.psmain"},{"blobOffset":1540764,"blobSize":23668,"shaderName":"postFX_shader.Reinhard.ps.psmain"},{"blobOffset":1564432,"blobSize":12352,"shaderName":"postFX_skybox.vs.vsmain"},{"blobOffset":1576784,"blobSize":10728,"shaderName":"postFX_skybox.ps.psmain"},{"blobOffset":1587512,"blobSize":148436,"shaderName":"spot_lights_shader.vs.deferred_lights_vs"},{"blobOffset":1735948,"blobSize":158644,"shaderName":"spot_lights_shader.ps.deferred_lights_ps"},{"blobOffset":1894592,"blobSize":39372,"shaderName":"standard.vs.vsmain"},{"blobOffset":1933964,"blobSize":44112,"shaderName":"standard.instanced.vs.vsmain"},{"blobOffset":1978076,"blobSize":39392,"shaderName":"standard.emissive.vs.vsmain"},{"blobOffset":2017468,"blobSize":45248,"shaderName":"standard.ps.psmain"},{"blobOffset":2062716,"blobSize":45900,"shaderName":"standard.instanced.ps.psmain"},{"blobOffset":2108616,"blobSize":44208,"shaderName":"standard.emissive.ps.psmain"},{"blobOffset":2152824,"blobSize":49936,"shaderName":"standard_skinned.vs.vsmain"},{"blobOffset":2202760,"blobSize":42788,"shaderName":"standard_skinned.ps.psmain"},{"blobOffset":2245548,"blobSize":53516,"shaderName":"standard_translucent.vs.vsmain"},{"blobOffset":2299064,"blobSize":58196,"shaderName":"standard_translucent.instanced.vs.vsmain"},{"blobOffset":2357260,"blobSize":64332,"shaderName":"standard_translucent.ps.psmain"},{"blobOffset":2421592,"blobSize":64848,"shaderName":"standard_translucent.instanced.ps.psmain"},{"blobOffset":2486440,"blobSize":17172,"shaderName":"textured.vs.vsmain"},{"blobOffset":2503612,"blobSize":25616,"shaderName":"textured.gbuffer.vs.vsmain"},{"blobOffset":2529228,"blobSize":14480,"shaderName":"textured.ps.psmain"},{"blobOffset":2543708,"blobSize":28956,"shaderName":"textured.gbuffer.ps.psmain"},{"blobOffset":2572664,"blobSize":15172,"shaderName":"textured.ps.psmaincolored"},{"blobOffset":2587836,"blobSize":26556,"shaderName":"textured.gbuffer.ps.psmaincolored"},{"blobOffset":2614392,"blobSize":21384,"shaderName":"texturedInstanced.vs.zprepassinstancedvsmain"},{"blobOffset":2635776,"blobSize":23384,"shaderName":"texturedInstanced.vs.zprepassskinnedvsmain"},{"blobOffset":2659160,"blobSize":23344,"shaderName":"texturedInstanced.vs.outlinemaskskinnedvsmain"},{"blobOffset":2682504,"blobSize":16276,"shaderName":"texturedInstanced.ps.psmain"},{"blobOffset":2698780,"blobSize":14440,"shaderName":"texturedInstanced.ps.zprepasspsmain"},{"blobOffset":2713220,"blobSize":21084,"shaderName":"texturedInstanced.vs.outlinemaskvsmain"},{"blobOffset":2734304,"blobSize":14080,"shaderName":"texturedInstanced.ps.outlinemaskpsmain"},{"blobOffset":2748384,"blobSize":20104,"shaderName":"vfx.Regular.vs.vsmain"},{"blobOffset":2768488,"blobSize":15912,"shaderName":"vfx.Regular.ps.psmain"}],"shaders":[{"entryPoint":"billboardsVS","name":"billboards.default.vs.billboardsvs","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_GlobalBuffer","size":64,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_GlobalBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"BillboardBuffer","size":48,"type":"CBuffer","variables":[{"flags":2,"name":"worldPosition","samplerSize":0,"size":12,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":3,"elements":0,"members":{},"name":"float3","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"scPercentSize","samplerSize":0,"size":4,"startOffset":12,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"uid","samplerSize":0,"size":16,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"uint4","rows":1,"svc":"Vector","svt":"Uint"}},{"flags":2,"name":"aspectRatio","samplerSize":0,"size":4,"startOffset":32,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"BillboardBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[]},"srcName":"billboards.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"billboardsPS","name":"billboards.default.ps.billboardsps","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"billboards.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"CSMain","name":"cs_gen_irradiance_map.cs.csmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_ConstBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"faceIndex","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"faceSize","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}}]},"dimension":"Unknown","flags":1,"name":"GB_ConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"texSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"TextureCube","flags":12,"name":"environmentCubemap","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"irradiance_map_face","numSamples":4294967295,"returnType":"Float","space":0,"type":"UavRwTyped"}],"signatureParams":[]},"srcName":"cs_gen_irradiance_map.hlsl","target":"Compute","vsd":[]},{"entryPoint":"CSMain","name":"cs_gen_reflection_map.cs.csmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_ConstBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"faceIndex","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"faceSize","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"roughness","samplerSize":0,"size":4,"startOffset":8,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_ConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"texSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"TextureCube","flags":12,"name":"environmentCubemap","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"reflection_map_face","numSamples":4294967295,"returnType":"Float","space":0,"type":"UavRwTyped"}],"signatureParams":[]},"srcName":"cs_gen_reflection_map.hlsl","target":"Compute","vsd":[]},{"entryPoint":"CSMain","name":"cs_panorama_to_cubemap.cs.csmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_ConstBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"faceIndex","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"faceSize","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}}]},"dimension":"Unknown","flags":1,"name":"GB_ConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"texSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"panorama_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"cubemap_texture_face","numSamples":4294967295,"returnType":"Float","space":0,"type":"UavRwTyped"}],"signatureParams":[]},"srcName":"cs_panorama_to_cubemap.hlsl","target":"Compute","vsd":[]},{"entryPoint":"CSMain","name":"cs_pixel_data_extraction.cs.csmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_CoordBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"viewportCoords","samplerSize":0,"size":8,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"int2","rows":1,"svc":"Vector","svt":"Int"}}]},"dimension":"Unknown","flags":1,"name":"GB_CoordBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"UIDTexture","numSamples":4294967295,"returnType":"Uint","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":0,"name":"DepthTexture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"ResultBuffer","numSamples":20,"returnType":"Mixed","space":0,"type":"UavRwStructured"}],"signatureParams":[]},"srcName":"cs_pixel_data_extraction.hlsl","target":"Compute","vsd":[]},{"entryPoint":"debug_point_lights_vs","name":"debug_lights_shader.vs.debug_point_lights_vs","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_LightConstBuffer","size":160,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"screen_pos_to_texcoord","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"world_view_pos","samplerSize":0,"size":16,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_LightConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"SB_OmniLights","size":28688,"type":"CBuffer","variables":[{"flags":0,"name":"omni_lights_count","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"uint4","rows":1,"svc":"Vector","svt":"Uint"}},{"flags":2,"name":"omni_lights_cb","samplerSize":0,"size":28672,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":28,"elements":256,"members":{"boxR0":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"boxR1":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"boxR2":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"colorFlags":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"direction__tex_scale":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"posRadius":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"posRelToOrigin_cullRadius":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},"name":"RenderOmniLight","rows":1,"svc":"Struct","svt":"Void"}}]},"dimension":"Unknown","flags":1,"name":"SB_OmniLights","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"debug_lights_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"debug_point_lights_ps","name":"debug_lights_shader.ps.debug_point_lights_ps","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"debug_lights_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"debug_spot_lights_vs","name":"debug_lights_shader.vs.debug_spot_lights_vs","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_LightConstBuffer","size":160,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"screen_pos_to_texcoord","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"world_view_pos","samplerSize":0,"size":16,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_LightConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"SB_SpotLights","size":16400,"type":"CBuffer","variables":[{"flags":0,"name":"spot_lights_count","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"uint4","rows":1,"svc":"Vector","svt":"Uint"}},{"flags":2,"name":"spot_lights_cb","samplerSize":0,"size":16384,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":16,"elements":256,"members":{"lightColorAngleScale":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"lightDirectionAngleOffset":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"lightPosRadius":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"texId_scale":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},"name":"RenderSpotLight","rows":1,"svc":"Struct","svt":"Void"}}]},"dimension":"Unknown","flags":1,"name":"SB_SpotLights","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"debug_lights_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"debug_spot_lights_ps","name":"debug_lights_shader.ps.debug_spot_lights_ps","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"debug_lights_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"debug_renderer_line_shader.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"SB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":2,"name":"ConstData","samplerSize":0,"size":80,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":20,"elements":0,"members":{"Color":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"WorldViewProj":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},"name":"ConstantData","rows":1,"svc":"Struct","svt":"Void"}}]},"dimension":"Unknown","flags":1,"name":"SB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"COLOR","stream":0}]},"srcName":"debug_renderer_line_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"debug_renderer_line_shader.ps.psmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"debug_renderer_line_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"debug_renderer_mesh_shader.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"SB_SceneBuffer","size":144,"type":"CBuffer","variables":[{"flags":2,"name":"ConstData","samplerSize":0,"size":144,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":36,"elements":0,"members":{"Color":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"Transform":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"},"WorldViewProj":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},"name":"ConstantData","rows":1,"svc":"Struct","svt":"Void"}}]},"dimension":"Unknown","flags":1,"name":"SB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"debug_renderer_mesh_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"debug_renderer_mesh_shader.ps.psmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"debug_renderer_mesh_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"deferred_resolve.vs.vsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"deferred_resolve.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"deferred_resolve.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":3,"bufferDesc":{"flags":0,"name":"SB_CSMBuffer","size":496,"type":"CBuffer","variables":[{"flags":2,"name":"pcf_lerp","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"shadow_cascade_tm_transp","samplerSize":0,"size":384,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":24,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"shadow_cascade_tc_mul_offset","samplerSize":0,"size":96,"startOffset":400,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":6,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"SB_CSMBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":128,"type":"CBuffer","variables":[{"flags":2,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"lightDirection","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"lightColorIntensity","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"envIntensity","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"default_sampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":8,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":2,"name":"csmSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedo_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normal_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"material_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":3,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"depth_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":8,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"shadow_cascade_depth_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":4,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"TextureCube","flags":12,"name":"irradianceMap","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":5,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"TextureCube","flags":12,"name":"reflectionMap","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"deferred_resolve.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"grid.default.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":0,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[]},"srcName":"grid.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"grid.default.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":2,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"vp","samplerSize":0,"size":64,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[]},"srcName":"grid.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"imgui_vs","name":"imgui.vs.imgui_vs","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":64,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":1,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":2,"semanticIndex":0,"semanticName":"COLOR","stream":0}]},"srcName":"imgui.hlsl","target":"Vertex","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT2"}]},{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]},{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"COLOR","type":"VSDT_E3DCOLOR"}]}]},{"entryPoint":"imgui_ps","name":"imgui.ps.imgui_ps","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"imgui.hlsl","target":"Pixel","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT2"}]},{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]},{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"COLOR","type":"VSDT_E3DCOLOR"}]}]},{"entryPoint":"VSMain","name":"multi_tex.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":64,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"multi_tex.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"multi_tex.gbuffer.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"multi_tex.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"multi_tex.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"PropertyBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"blendFactor","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl1","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl2","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex1","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex2","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"multi_tex.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"multi_tex.gbuffer.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"PropertyBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"blendFactor","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl1","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl2","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex1","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex2","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"multi_tex.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"outline_calculation.vs.vsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"outline_calculation.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMainJumpFloodInit","name":"outline_calculation.ps.psmainjumpfloodinit","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":32,"type":"CBuffer","variables":[{"flags":2,"name":"screenWidth","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"screenHeight","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"jumpStepWidth","samplerSize":0,"size":4,"startOffset":8,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"outlineColor","samplerSize":0,"size":16,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"outline_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"outline_calculation.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMainJumpFloodStep","name":"outline_calculation.ps.psmainjumpfloodstep","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":32,"type":"CBuffer","variables":[{"flags":2,"name":"screenWidth","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"screenHeight","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"jumpStepWidth","samplerSize":0,"size":4,"startOffset":8,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"outlineColor","samplerSize":0,"size":16,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"outline_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"outline_calculation.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMainJumpFloodResult","name":"outline_calculation.ps.psmainjumpfloodresult","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":32,"type":"CBuffer","variables":[{"flags":2,"name":"screenWidth","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"screenHeight","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"jumpStepWidth","samplerSize":0,"size":4,"startOffset":8,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"outlineColor","samplerSize":0,"size":16,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"outline_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"outlineMask_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"outline_calculation.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"deferred_lights_vs","name":"point_lights_shader.vs.deferred_lights_vs","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_LightConstBuffer","size":160,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"screen_pos_to_texcoord","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"world_view_pos","samplerSize":0,"size":16,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_LightConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"SB_Lights","size":28688,"type":"CBuffer","variables":[{"flags":0,"name":"omni_lights_count","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"uint4","rows":1,"svc":"Vector","svt":"Uint"}},{"flags":2,"name":"omni_lights_cb","samplerSize":0,"size":28672,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":28,"elements":256,"members":{"boxR0":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"boxR1":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"boxR2":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"colorFlags":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"direction__tex_scale":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"posRadius":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"posRelToOrigin_cullRadius":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},"name":"RenderOmniLight","rows":1,"svc":"Struct","svt":"Void"}}]},"dimension":"Unknown","flags":1,"name":"SB_Lights","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"point_lights_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"deferred_lights_ps","name":"point_lights_shader.ps.deferred_lights_ps","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_LightConstBuffer","size":160,"type":"CBuffer","variables":[{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"screen_pos_to_texcoord","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"world_view_pos","samplerSize":0,"size":16,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_LightConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"default_sampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedo_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normal_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"material_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":3,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"depth_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"point_lights_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"postFX_shader.vs.vsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"postFX_shader.Uncharted.vs.vsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"postFX_shader.Filmic.vs.vsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"postFX_shader.Reinhard.vs.vsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"postFX_shader.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"exposure","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"frame_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"postFX_shader.Uncharted.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"exposure","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"frame_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"postFX_shader.Filmic.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"exposure","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"frame_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"postFX_shader.Reinhard.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_PropertyBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"exposure","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_PropertyBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"frame_tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"postFX_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"postFX_skybox.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":128,"type":"CBuffer","variables":[{"flags":2,"name":"viewMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"projectionMatrix","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[]},"srcName":"postFX_skybox.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"postFX_skybox.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"TextureCube","flags":12,"name":"environmentCubemap","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"postFX_skybox.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"deferred_lights_vs","name":"spot_lights_shader.vs.deferred_lights_vs","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_LightConstBuffer","size":160,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"screen_pos_to_texcoord","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"world_view_pos","samplerSize":0,"size":16,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_LightConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"SB_Lights","size":16400,"type":"CBuffer","variables":[{"flags":0,"name":"spot_lights_count","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"uint4","rows":1,"svc":"Vector","svt":"Uint"}},{"flags":2,"name":"spot_lights_cb","samplerSize":0,"size":16384,"startOffset":16,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":16,"elements":256,"members":{"lightColorAngleScale":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"lightDirectionAngleOffset":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"lightPosRadius":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"},"texId_scale":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},"name":"RenderSpotLight","rows":1,"svc":"Struct","svt":"Void"}}]},"dimension":"Unknown","flags":1,"name":"SB_Lights","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"spot_lights_shader.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"deferred_lights_ps","name":"spot_lights_shader.ps.deferred_lights_ps","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_LightConstBuffer","size":160,"type":"CBuffer","variables":[{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"globtm_inv","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"screen_pos_to_texcoord","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"world_view_pos","samplerSize":0,"size":16,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_LightConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"default_sampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedo_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normal_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"material_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":3,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"depth_gbuf","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"spot_lights_shader.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"standard.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":208,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":3,"semanticIndex":0,"semanticName":"TANGENT","stream":0}]},"srcName":"standard.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"standard.instanced.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"InstanceDataBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"instanceBaseID","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"InstanceDataBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":160,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":3,"semanticIndex":0,"semanticName":"TANGENT","stream":0}]},"srcName":"standard.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"standard.emissive.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":208,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":3,"semanticIndex":0,"semanticName":"TANGENT","stream":0}]},"srcName":"standard.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"standard.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"albedoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"normalSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"metalRoughnessAoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normalTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"metalRoughnessAoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"standard.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"standard.instanced.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"albedoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"normalSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"metalRoughnessAoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normalTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"metalRoughnessAoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"standard.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"standard.emissive.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"albedoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"normalSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"metalRoughnessAoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normalTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"metalRoughnessAoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"standard.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"standard_skinned.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":16448,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"BonesTransforms","samplerSize":0,"size":8192,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":128,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"BonesNormalTransforms","samplerSize":0,"size":8192,"startOffset":8256,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":128,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":3,"semanticIndex":0,"semanticName":"TANGENT","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":4,"semanticIndex":0,"semanticName":"BLENDWEIGHT","stream":0},{"componentType":"Uint32","mask":15,"readWriteMask":15,"registerIndex":5,"semanticIndex":0,"semanticName":"BLENDINDICES","stream":0}]},"srcName":"standard_skinned.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"standard_skinned.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"albedoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"normalSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"metalRoughnessAoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normalTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"metalRoughnessAoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"standard_skinned.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"standard_translucent.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":208,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"ColorBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"color","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"ColorBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":3,"semanticIndex":0,"semanticName":"TANGENT","stream":0}]},"srcName":"standard_translucent.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"standard_translucent.instanced.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"InstanceDataBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"instanceBaseID","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"InstanceDataBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"ColorBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"color","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"ColorBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":160,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0},{"componentType":"Float","mask":15,"readWriteMask":7,"registerIndex":3,"semanticIndex":0,"semanticName":"TANGENT","stream":0}]},"srcName":"standard_translucent.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"standard_translucent.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":208,"type":"CBuffer","variables":[{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"albedoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"normalSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"metalRoughnessAoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normalTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"metalRoughnessAoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"standard_translucent.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"standard_translucent.instanced.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":0,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"albedoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"normalSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"metalRoughnessAoSampler","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"albedoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"normalTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":2,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"metalRoughnessAoTex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"standard_translucent.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"textured.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":64,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"textured.hlsl","target":"Vertex","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"VSMain","name":"textured.gbuffer.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":80,"type":"CBuffer","variables":[{"flags":2,"name":"mvp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldViewPos","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"textured.hlsl","target":"Vertex","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"PSMain","name":"textured.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"textured.hlsl","target":"Pixel","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"PSMain","name":"textured.gbuffer.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"textured.hlsl","target":"Pixel","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"PSMainColored","name":"textured.ps.psmaincolored","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"TestBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"color","samplerSize":0,"size":16,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"TestBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"textured.hlsl","target":"Pixel","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"PSMainColored","name":"textured.gbuffer.ps.psmaincolored","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"textured.hlsl","target":"Pixel","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"zprepassInstancedVSMain","name":"texturedInstanced.vs.zprepassinstancedvsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":8464,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"instanceBaseID","samplerSize":0,"size":16,"startOffset":256,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"BonesTransforms","samplerSize":0,"size":8192,"startOffset":272,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":128,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":160,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"texturedInstanced.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"zprepassSkinnedVSMain","name":"texturedInstanced.vs.zprepassskinnedvsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":8464,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"instanceBaseID","samplerSize":0,"size":16,"startOffset":256,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"BonesTransforms","samplerSize":0,"size":8192,"startOffset":272,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":128,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":160,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"BLENDWEIGHT","stream":0},{"componentType":"Uint32","mask":15,"readWriteMask":15,"registerIndex":2,"semanticIndex":0,"semanticName":"BLENDINDICES","stream":0}]},"srcName":"texturedInstanced.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"outlineMaskSkinnedVSMain","name":"texturedInstanced.vs.outlinemaskskinnedvsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":8464,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"instanceBaseID","samplerSize":0,"size":16,"startOffset":256,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"BonesTransforms","samplerSize":0,"size":8192,"startOffset":272,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":128,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":160,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"BLENDWEIGHT","stream":0},{"componentType":"Uint32","mask":15,"readWriteMask":15,"registerIndex":2,"semanticIndex":0,"semanticName":"BLENDINDICES","stream":0}]},"srcName":"texturedInstanced.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"texturedInstanced.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"texturedInstanced.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"zprepassPSMain","name":"texturedInstanced.ps.zprepasspsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"texturedInstanced.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"outlineMaskVSMain","name":"texturedInstanced.vs.outlinemaskvsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":8464,"type":"CBuffer","variables":[{"flags":2,"name":"vp","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"mvp","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"worldMatrix","samplerSize":0,"size":64,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"normalMatrix","samplerSize":0,"size":64,"startOffset":192,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"instanceBaseID","samplerSize":0,"size":16,"startOffset":256,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"BonesTransforms","samplerSize":0,"size":8192,"startOffset":272,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":128,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":160,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"texturedInstanced.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"outlineMaskPSMain","name":"texturedInstanced.ps.outlinemaskpsmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"texturedInstanced.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"vfx.Regular.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"GB_SceneBuffer","size":128,"type":"CBuffer","variables":[{"flags":2,"name":"view","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"projection","samplerSize":0,"size":64,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"GB_SceneBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Buffer","flags":0,"name":"instanceBuffer","numSamples":96,"returnType":"Mixed","space":0,"type":"Structured"}],"signatureParams":[{"componentType":"Float","mask":7,"readWriteMask":7,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":7,"readWriteMask":0,"registerIndex":1,"semanticIndex":0,"semanticName":"NORMAL","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"vfx.hlsl","target":"Vertex","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]},{"entryPoint":"PSMain","name":"vfx.Regular.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"GB_AtlasBuffer","size":16,"type":"CBuffer","variables":[{"flags":2,"name":"columns","samplerSize":0,"size":4,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"int","rows":1,"svc":"Scalar","svt":"Int"}},{"flags":2,"name":"rows","samplerSize":0,"size":4,"startOffset":4,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"int","rows":1,"svc":"Scalar","svt":"Int"}}]},"dimension":"Unknown","flags":1,"name":"GB_AtlasBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampl","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"tex","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"vfx.hlsl","target":"Pixel","vsd":[{"number":0,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"POSITION","type":"VSDT_FLOAT3"}]},{"number":1,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"NORMAL","type":"VSDT_FLOAT3"}]},{"number":2,"stream":"VSD_STREAM_PER_VERTEX_DATA","vsdReg":[{"semanticName":"TEXCOORD","type":"VSDT_FLOAT2"}]}]}]}DXBCNCj,.p7 DT '...SFI0ISG14(SV_VertexIDOSG1ht tSV_PositionTEXCOORDPSV04  TEXCOORDTEXCOORDbillboardsVSADB +D3ILDB$`< DXIL$BC! 3 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 82" d##ㄡL L@ +@@ s`0G89((pS 8 '!$ۨb%&mD,˲rpͰ( +AQOCH>QJL>rۈ8(DuHYXeY#!qh #Kt4-Pn?8lTQ +<e8ِe  6(".41 ,rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`30`!@C @2L &GC:ʠF + +0ʡ$ +@JʃR((B(GoZ@"gk9 syLFG,M-Llmm=271 30:Bvector X12@ E d%`0["LV`APelementIؔ}չqHscd#VpI&A`@B aFGCȮlMnj-g40A` "ha" "h8a" "h QF,?&  B@a &@8@B<@6@[  0:4<30:_11Aaq _12Qaq W"hXAX!0CWwH a8|,b0_22aq ,×"hhAX!0%C[wH c8|,b0_32aq L"hxAX!05C_wH e8|,b0_42aq l"hAX!0ECswH g6@ + +0 p 0pLLؾGa ,B`,bp`;\;8##706:329 0:4<& m @lȠh+{1c{ cY!@E!0X '@lap, + I6>L E `у,b3ss&F6F$&&G&TgfV&4cCbW6F&D#$mrb@BTXT^"0 ̍AɍM ɑ ՙ4 m[ Xf . H(M-LL̬LhĮlM(fHhD 91:07AO\T]P[PYLжȉP a texdxxX@h|@| CBK/ ~f~Hd~H䀚H`f-@NDLL kc#3V&7EFW6 &0Z\XLTX[]]Pжȉ BillboardBuffer#ڀ^\[A @_1( !MiQp!1A8 F]>h&6Ї Ԙ .RBTC4FcCaO 6 a.Jar }  B^Ɔ.B5Z66 pA0( `CP\&H6A@ \LmoaЍx܀ AopzKK{s &7A8 >dž.~QJL~qۈ8 '!$?a!P˟|n|1 PhpJq q5GaF $N;iZ̡&~pq`٨ "l # 01ܳ!8@4lTQ";́rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`#0 !Y 2L &GCJ` +0ʠJ4 +@J +ʣX3(((2(" n +gHk9yLFD oM $Efe%&,f&gl&eCLd0$   l tdHM,M̬Ln0,BYb` B466092:32 l@!6M A{c#zKK{s ap&3A`0@ 2b37U&7VF7W6A Y݅a4 Mi0P +,ĀK\T]a6 XepaX6o `; `m@ `E\a AA6`C ` g!2billboardsVS\&6A 1A 5lX;<Ѓ=>)/47 Mo@a6(lX?PQDR BU5$E4A ``Y@aS6ÆE L@`5R0B*†XP0c{ 49 јK;b#1v5G7A4uintsWXYhlfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥM@إ%MхѕM K\[ܔṌչѕM lyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $Ȳ 6\B@0_ܶl;/TQQCImہ4\BDͰ0 <<#mpK(5=mpK(5=#mpOD4!@mILDN,$e5670a94af074f711cf095bb9cf6873b.pdbHASHg +Oq𕻜;DXIL`(DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 52" d##ㄡL L@ +`)0 1P1P ` 0 @QOCH>QJL~qۈ8 '!$?a!P˟|n|1 PhpJq q5GaF $N;iZ̡&~pq`٨ "l # 01ܳ!8@4lTQ";́rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`#0 !Y 2L &GCJ`  + ʣ((2("nfydLFD oM $Efe%&,f&gl&eCLd0$ a0(MeÀ$LfB, A 0Al04aa m @&bm Kcc{ #2eeU&GWD4A !m 1Mg ˴46)/47 AMj@X tea!@ `#  Pa ==IMku Ā`HS m AƵ6pfa85p .8*llvm.identS +]\ڛ۔hBbfW&7%0̡5M 2dx.resourcesS]Z]]]ٔCRF'F77%yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $Ȳ 6\B@0_ܶl;/TQQCImہ4\BDͰ0 <<#mpK(5=mpK(5=#mpOD4!@ma A, +4Bq] Y#t 0F c  # `pyuĈA \t]1b  G^pT b^pԈ 0vxp6:0=ЃvHx_|r@2;<̃B9=ԃ<C9=<9;=Ё ȻI"J|`  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q` `!C @2L &GCB +ʠF +J<()2("((f( q,A 0yLFG,M-Llmm=271 466099)"PsOutput,h+{1c{ caŒ-n`@,bF0A"ha00zc @a-bF0@4O4(c+k+s[6æ̍k΍C  ɴ+66 D$(E `!t"h! 0C]47:^vectord@E؀ X#Hl@``0 `4 l @E5&A  "@61@Al>7!{#6F消90Q@ BW7&GFÌ-N]ݛ[ "ha E 8  `( +L6L @ E `Ձ0},bL$`4` h 9PS +@(l@6 0 +X5Bu@ +@`P +lL30:<Nmatrixbb1@ + 0bd1@ +  E м` ++f4 ,pY,K<0` 1dd1@S  X /E ܂`Kf4 ,pY.K<0` 2fd1@   E `*kf4 ,pY8K<0` 3hd1@S  /E М`:዆f4 ,lX`AhpAxAAȽ}չM+8`Lc25VF72m`;LA@ `E `,b3kct$u&&TgfV&4cCF'D3C3$mxAXݛ\]ڛ 30BvectorQ$0`1@H0``0$0P C>>LeZI 8{ $E `!p~Ƞ܀Ȅ䀀f~H䀚H`d-OHH*+sJ+[f$122742 466092:329 &m %qBd@ `ԥ ɑ ՙXؕѽ% m[6W6F'FF1 + +K{Jcc{ #33+iڶ<-!L& U]\ ]ݛ[ ϲ ALL& ?tex@@3V?$Texture2D@V?$vector@M$03@@@@A'^&c&X̅ +kc+ +M@-g. hj* Ln. (hMpH%V%jB'F=! N09327 FL $ ĪLn.mà?6 ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց̡}͹4(4(PɕЕȕѕɡ4(LMхѕ̅ȕѕɡ4(4(1= 1} UI ՙɥȕѕɡ4(5(р4(4(4(ՙɁɑ ՙɁȕѕɡŤ4(5(̀ܽɱAͥѥ4(с̍AɍM4(ԥрԥ4(сIѥ4(4(4(ՍсX=5(5(рͥѥLY}A=M%Q%=94(ɀЕ ɑPa ==I4(ѕѥԥрԥPa ==I4(4(4(X=сɑYMԥсLY}Yѕ%4(5(X=ссX=ѥ4(4(ѹЕ ɑ􀘱ɠİȤĤ4(ѹͥѥձѠܽɱAͥѥĸ4(ѹͥѥѹͥѥѹͥѥ퀼нܕ5(4(ɀ͕сѹЕ ɑɠȨ̍AɍM镱Ȩ̍AɍM镥ɠ̍AɍM镱̍AɍM镥4(͕ѹ䁨Iѥ4(ѹͥѥ偬􀼙͕4(4(ѹԥԥ4(4(ȕɹ4(5(4(4(Սс@=5(5(рɁLY}Qɝ4(ԥрԥLY}Qɝ4(4(4(@=сɑAMX=сѥ4(5(@=с4(ѹɁЕL̅ѹЕ ɑ4(ѹԥ􀤹ѹԥ4(ѹɹĘ4(ȕɹ4(5(l9p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 Yņ RDܗ $>shaders/include":(77<68222477:27241:9029-ZilZȾ8\amXТH X Xp Lf s1A@ \ l/bi ^lHB/^b.B.`.bC06 s61s!sl@c hlHc ܆4LY}AͥѥMiL $!6,srs"') Bbm6,rrr1AH \LlD~ lmԆ\ml\C6pɔUY!6,srsa ݘݠ֐ ֐ָ oƆ!7|PBx b +!: u`'@ @OHs!b +!ԁ(: u`'fB&v2V7%؉Fllvm.module.flagsS*llvm.identSD2V'7V2FWF77EhD2V'7VBVfV67%j̽ɍ9M ̢[XKܔ.ؕͥM ]]ܔ.̡5M \[Xܔ 4*хѥM H]Z]]]ٔ4ṔAM ~yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q "Ȳ R4\BDͰv rf <0BmA5\DJM5m[A5\DJM5m[,WBa A,D5@H^)#c*^/0$ &L5 l0A8`pAz# `}iɌ)# `AQm2a$c`q1c@0b EФÌq)# `AA'!3D)#`P?w0b  AxU2c@0b Ìq)# `)3D)#`P?w0b Au$e a`1 n@ê n0 n é n nC n Ti $Ax@0b 0`Ìq) 0c@e +hL 0a&Ä0b p Ìq)#`P׬?L#`P׬?L#`Ṕ׬?L<1 3`8"oƀЃA0 +& A0pJ4cƀA0pJ4 ` @ 9 0F * ` ` @ 8  0F J c& A0R4e1H(*5H1P& 1 0 H,0BDvLO5QSTAT`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L J2" d##ㄡL L@ +f`)@DAQ A@J1 +˟VbF0 A=OCH~4B)C@0 AEsAb"QD@010P@  P@ |`@lt`z0@b&1vy7rzy(9 >rzxys`wz`0??@Bv4E0,< 0( Krt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0@!Y 2L &GC"J`$ʠ +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔDBWFF67%إ%MхѕM :dx.entryPointsS;B2VFW&77%yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q Ȳ Rځ4\BDͰf rV <0Bm@5\DJM5mA5\DJM5mILDN,$42630b1e5fc412b7cc9febcb3284d4c2.pdbHASHBc _̟2DXIL`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L J2" d##ㄡL L@ +f`)@DAQ A@J1 +˟VbF0 A=OCH~4B)C@0 AEsAb"QD@010P@  P@ |`@lt`z0@b&1vy7rzy(9 >rzxys`wz`0??@Bv4E0,< 0( Krt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0@!Y 2L &GC"J` J ʃ(B(R(!nryP yhLFD oM $Efe%&,f&gl&eCLd@$ a0(MeÀ$Lf@4ِ CCC<heBbb |چ 466099).SV_Position ц 6,q7x*zz" p6c0! A &E!&5A  3 `eL&ŵa!`srV <0Bm@5\DJM5mA5\DJM5ma NA,4QW +3Pr4x}0# ``yqʈA X_Qu2b HG!# `}R2b $TʈA  hxa-# ``2b1# ``Cc`5#`B$d@N2 B00 ` "A0 F @k A0PZ5A0PZ5b @ 8` `1H,6X0hF  cF  A0`b5DXBCbODej DTdt,ir(sDsSFI0ISG1OSG1PSV04 CSMainILDBh`'DXILhBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L W2" d##ㄡL L @` b `J1a2GeP2 +@MOCHJH+1m@#@g {fXDyIP,")QU@.B*VbF(J!2ERH+@AP Iţof"q`pypZ(|zrzr{(qw>0vxp6:0$D0p P@  P@ |`@lt`(<~ii(d$M%L> 0BDL +B F)rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 3v0P@&` ;`a ` a0 ` L0|@!@C<  y& T@ 0乀`ȣ  !Y G2L &GCFH)(b((2( +2@_A?@APAAA AAA?AAa,AAAAA@_@APA?AA2@AAA A@APA?A@APAAa,AAA@_Aa,AAA@APAAg sJghyL d!Q:+sJ #K s+j sAcc4@ oM $Efe%&,f&gl&e.͍N]ݛO\ڙ[H <2unsigned int{ 0c4Y 0 1@lG[Y[ݲp6element_countD`A@ҴAxI B@,b:h+{1c{ caaF@0 1@s_l`,bf2 `-b2 @a6 \-g (ܴH B$2p `Xe0c{ !dW6F&cFB㳈C9 X"l``0= "h@9 a6ikeVpIoA8z "@@"float3x3xX@fX@f|8|,b0p _12! \a03=60P_21! \a0%#?60_23! \a05Q60_32!! \a053S60 ()0{{sVp +0{c{sVp +l@Xau  *@+! W6ls +4Xԥ+{sK;s+#IscY!HEr!0X'Hlhla$fAnpX, 47E ` tAt6 "Y5B, @"/0pyC #+{Isc#+{kk{ssAccK48*"UYeYؕѽ5Yؕѽ%i0c{ !dW6F&cF"㳈Ca0`4Э`A8t 5 s:0tu1UBa`4@;qr QPXQ\]ڛ 稌nN(Ml. (+'ĮlMF(ĮlM&Hk`U Pf~~6aC=`C@hJ(hh +(+ KkC>C8@hJ(hhK(+ Kk>`CX2pyC #+{Isc#+C #+:c{ csAccK48*rQ 9eYɥ5ȐYؕѽ5im^ 6 &$a DPQ]ɱ~ޮȀ~~H䀚H`db~HH`dH`d6 f`iX5@%IL#' :249000849M&@RBT"@ؐ;>?J$72E ` 1 +Kr#+:zs33+Iڶ/!D.@,ll*M^YXT^БЛPYLж Ar JenvironmentCubemapʆxxX@h|@| #BM +70~f~Hʆʀ~H䀚H`f-lDN +NP+Û +kc+#3V&7EFW6 &0_]TX[LTX[]]Pж a Nirradiance_map_facedxxX@h|@|&AB @Mԃ49000/2 +2<:2" 179& m `1B#@d lbfJ`gm`,q0"PPїQPն A 2CUBE_FACES_B6 - U } M} PpY[A0Am n`@gJ(hhK%K"h 4` 6b. PPїQPԗ E hA-l^@*//' 0l[苾./:CUBE_FACES_N.1ض!F]Aht\d&Bm`c4FC  U } M}QLci88p*2 +*r ǶH qpT3T%Te4T4E"3Am !Љ X@pQO@@@K! 3*K{s0L@@6 l`o// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "cs_common.hlsli" + +#define SAMPLE_DELTA 0.05 + +TextureCube environmentCubemap : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D irradiance_map_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; +}; + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const float2 uv = GetUV(dispatchThreadID.xy, uint2(faceSize, faceSize)); + + const float3 N = GetCubeDirection(faceIndex, uv); + + const float3x3 TBN = GetTBN(N); + + uint sampleCount = 0; + float3 irradiance = float3(0.0, 0.0, 0.0); + + for (float phi = 0.0; phi < 2.0 * PI; phi += SAMPLE_DELTA) + { + for (float theta = 0.0; theta < 0.5 * PI; theta += SAMPLE_DELTA) + { + const float3 tangentDirection = float3( + sin(theta) * cos(phi), + sin(theta) * sin(phi), + cos(theta)); + + const float3 worldDirection = TangentToWorld(tangentDirection, TBN); + + irradiance += environmentCubemap.SampleLevel(texSampler, worldDirection, 5).rgb + * cos(theta) * sin(theta); + + ++sampleCount; + } + } + + irradiance = PI * irradiance / float(sampleCount); + + irradiance_map_face[dispatchThreadID.xy] = float4(irradiance, 1.0f); +}6.\shaders\include\cs_common.hlsliDd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAa$m Dd-LM,m-MAAa..m Č-ndJ(hhikJ(hkʉ dA) A) A)+A)+A)KA)KAoAa..m Č-ndJ(hhjkJ(hkʉ dA)KA)KA) A) A) A) AoAa..m Č-ndJ(hhKhkJ(hkʉ dA)+A)+A)KA)KA)+A)+AoAA-N䨌 +.͍N$.͍N$-l*M,AaAdmČ-N. m*M $ $-l*MlADN . m*M D$ d. m*M DƥfAAA-n䨌nN(Ml. .͍dN(l,ɍ Č-N.AaAdmČ-N/DD$fAAdmČ-nM- dJ(hhikN(l,ɍ kAdmČ-n.̍dJ(hhjkN(l,ɍ kAdmČ-nD,M- dJ(hhKhkN(l,ɍ kAADN M--M M- d/D.̍d/%DD,M--eAAA-dm +.M Ō-nĉČ-n.AaADN - ʼn.&eAoA4pC #+Jsc#+B # +"+3Ks+sAccKc&// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef HARDWARE_DEFINES_HEADER +#define HARDWARE_DEFINES_HEADER 1 + + + +#if _HARDWARE_METAL +#define BGRA_SWIZZLE(a) a.zyxw +#define BGR_SWIZZLE(a) a.zyx +#endif +#ifndef BGRA_SWIZZLE +#define BGRA_SWIZZLE(a) a +#endif +#ifndef BGR_SWIZZLE +#define BGR_SWIZZLE(a) a +#endif + +#ifndef SHADER_COMPILER_HLSL2021 +#define SHADER_COMPILER_HLSL2021 1 +#endif + +#define GPU_TARGET 1 +#define PI 3.14159265f +#define PIh 3.14159265h + +#define EPSILON 0.000001 +#define UNIT_X float3(1.0, 0.0, 0.0) +#define UNIT_Y float3(0.0, 1.0, 0.0) +#define UNIT_Z float3(0.0, 0.0, 1.0) + +#define HAS_REVERSEBITS 1 +#define SEPARATE_SAMPLER_OBJECT 1 +#define double doubles_are_not_supported_by_some_gpus +#define double2 doubles_are_not_supported_by_some_gpus +#define double3 doubles_are_not_supported_by_some_gpus +#define double4 doubles_are_not_supported_by_some_gpus + +#define fixed half +#define fixed2 half2 +#define fixed3 half3 +#define fixed4 half4 + +float max3(float a, float b, float c) +{ + return max(a, max(b, c)); +} +float min3(float a, float b, float c) +{ + return min(a, min(b, c)); +} +#define INVARIANT(x) x + +float max3(float3 a) +{ + return max3(a.x, a.y, a.z); +} +float max4(float a, float b, float c, float d) +{ + return max(max(a, d), max(b, c)); +} +float min4(float a, float b, float c, float d) +{ + return min(min(a, d), min(b, c)); +} + +#define PRECISE precise +#define SQRT_SAT(x) sqrt(saturate(x)) +#define VS_OUT_POSITION(name) float4 name:SV_POSITION; +#define tex2Dgrad(a, uv, dx, dy) a.SampleGrad(a##_samplerstate, (uv).xy, dx, dy) +#define tex2Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xy, (uv).w) +#define tex3Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, (uv).w) +#define texCUBElod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, uv.w) +#define texCUBEArraylod(a, uv, lod) a.SampleLevel(a##_samplerstate, (uv).xyzw, lod) +#define tex2Dproj(a, uv) a.Sample(a##_samplerstate, (uv).xy/(uv).w) +#define tex2D(a, uv) a.Sample(a##_samplerstate, uv) +#define tex3D(a, uv) a.Sample(a##_samplerstate, uv) +#define texCUBE(a, uv) a.Sample(a##_samplerstate, uv) +#define textureGather(a, tc) a.Gather(a##_samplerstate, tc) +#define texelFetchOffset(a, tc, lod, ofs) a.Load(int3(tc, lod), ofs) +#define textureOffset(a, tc, ofs) a.Sample(a##_samplerstate, tc, ofs) +#define textureLodOffset(a, tc, lod, ofs) a.SampleLevel(a##_samplerstate, tc, lod, ofs) + +#define CLAMP_BORDER(a, name, val) +#define LOOP [loop] +#define UNROLL [unroll] +#define BRANCH [branch] +#define FLATTEN [flatten] + +#define EMPTY_STRUCT(name) struct name {} +#define DECLARE_UNUSED_MEMBER +#define RETURN_EMPTY_STRUCT(name) +#define INIT_EMPTY_STRUCT(name) + +#define HW_USE_SCREEN_POS +#define GET_SCREEN_POS(vs_pos) vs_pos +#ifndef TEXELFETCH_DEFINED +#define TEXELFETCH_DEFINED 1 + +#define CHECK_TEXTURE2D +#define CHECK_TEXTURE2D_EXPR(a, tc) 0 +#define CHECK_TEXTURE2DARRAY +#define CHECK_TEXTURE3D +#define CHECK_BUFFER(file, ln, name) +#define CHECK_BUFFER_EXPR(a, tc) 0 +#define CHECK_STRUCTURED_BUFFER(file, ln, name) +#define CHECK_STRUCTURED_BUFFER_EXPR(a, tc) 0 +#define CHECK_STENCIL +float4 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float3 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float2 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float4 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float4 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +#define texelFetch(a, tc, lod) texelFetchBase(a, tc, lod, _FILE_, __LINE__, -1) + +float4 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float3 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float2 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(StructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(RWStructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +uint loadBufferBase(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +#define loadBuffer(a, tc) loadBufferBase(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer2(a, tc) loadBuffer2Base(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer3(a, tc) loadBuffer3Base(a, tc, _FILE_, __LINE__, get_name_##a) +#define loadBuffer4(a, tc) loadBuffer4Base(a, tc, _FILE_, __LINE__, -1) +void storeBufferBase(RWByteAddressBuffer a, int tc, uint value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store(tc, value); +} +void storeBuffer2Base(RWByteAddressBuffer a, int tc, uint2 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store2(tc, value); +} +void storeBuffer3Base(RWByteAddressBuffer a, int tc, uint3 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store3(tc, value); +} +void storeBuffer4Base(RWByteAddressBuffer a, int tc, uint4 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store4(tc, value); +} +#define storeBuffer(a, tc, value) storeBufferBase(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer2(a, tc, value) storeBuffer2Base(a, tc, value, _FILE_, __LINE__, get_name_##a) +#define storeBuffer3(a, tc, value) storeBuffer3Base(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer4(a, tc, value) storeBuffer4Base(a, tc, value, _FILE_, __LINE__, -1) +#define structuredBufferAt(a, tc) a[uint((CHECK_STRUCTURED_BUFFER_EXPR(a, tc), tc))] +#define bufferAt(a, tc) a[uint((CHECK_BUFFER_EXPR(a, tc), tc))] +#define texture2DAt(a, tc) a[int2((CHECK_TEXTURE2D_EXPR(a, tc), tc))] +#endif + +uint stencilFetchBase(Texture2D a, int2 tc, int file, int ln, int name) +{ + CHECK_STENCIL; + return a[tc].g; +} +#define stencilFetch(a, tc) stencilFetchBase(a, tc, _FILE_, __LINE__, get_name_##a) + +#if !SHADER_COMPILER_HLSL2021 +#define select(a, b, c) a ? b : c +#define or(a, b) a || b +#endif + +half3 h3nanofilter(half3 val) +{ +#if HALF_PRECISION + return min(val, 65504.h); +#else + return select(isfinite(dot(val, val)).xxx, val, half3(0, 0, 0)); +#endif +} + +#endif ZYW[YZYۛX [=xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPI3s#+3B +"*:bz +bBbbjP!+3Ks+B +"*:bz +bBbbiPhPIsc#+A # +"+3Ks+sAccKiPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  K3c{  S S+sS kPhP@ c3{ACA c3 Kٓ+s S kP@ c3{ACA c3 Kٓ+s{AC S KkP@ c3{ACA c3 KC c3 S  Q +s Q kPhP0c{ c k+#zC1c{ b1c{ J+s{Ci C CJaq1KaJkPhP0c{  +s;+szzc#C1c{ c1c{ rJiPkP+sicCrbKiPkPhP0c{ 9*rB1c{ qJiPkP1c{ riPhP1c{ {CqbrJJiPa+C{CqbrJJab+C)Jbzrb!{CbJIIiPq{k cK+CJiPhP{s1c{ q{k cK+C{CqbJIiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ 9*rB1c{ qb1c{ JiPkPq{k cK+Ci!{CbqJQqJiP{s1c{ {CqbJiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ aKs+ K+C1c{  #*Cc1c{ !+{#+"+CKiPkP+sC!+{#+"+CsY!+{#+"+CsQ #*CKiPkPhP)s#K3 otʸʄʸ\\\\ʸʸʸ\ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBB\Y[țXYB‹J[X[\X[X]^[X[\XX[Y^ ٛ H[Z[][X[\X[XX[Y +\XZY[HH\XZY[\[\H_B_KB [[ۛ +HS +ؚKBYY[PPїQPSMYY[WPPQSԗTVNYY[PPQSW՗QPTVH MYY[HTQRPWSԗQPTVH NYY[TSUғWSԗQPTVHMLYY[TSUғWSWSSH LBYY[SPWSRSїГSSH NBYY[RQїӓTSLYY[RQWQSTULYY[HSWQSTғ YBYY[ӓPӗPQTQȑWYY[TUQӗPQTQȔWBHY[[\B +ț[ؚKBYY[TQQWR +^ +^YY[TQQ +^ +TQQWR +^JB[X[\X[XZYYY[\^؛]HY\ٗ]ZۛXPY\YHTQQӓPӗPQTQVN؛]HY\ٗ]ZT]YPY\YHTQQTUQӗPQTQVNBH[[HۛXPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]ۛXPY\Y^NH_BH[[HT]YPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]T]YPY\Y^NH_B_BH\ [[\B ӛ[ؚKBYY[ГP +\Y [X[Y +\YȈ[X[YYY[ГP +\Y [X[Y +ГP +\Y [X[YJBYY[ӓPאPQ[X[Y +ȘXYГPӓPӗPQTQ [X[YJYY[TUQאPQ[X[Y +ȘXYГPTUQӗPQTQ [X[YJBHY [[!& +Ax067AP }|L &5AP |dž>&>?C?61A(4 xӆ>,>c րΑЛPY>BDD>C> LҀ 6 Q";lLd B"'2A05 (>ZB CEcQ1!o"aa |Hl 6/ax_ |{l@F6 Ȭ" YEP#F3(fh* U9"AB,m.n +M,,h\8숐#`4q "#]/%@w424E `Ky20(Pg7.@D%@ÙCg :9$72q "&P^޸zpq82normal  Bp"i'z]YݸzqP8"binormalDNa 8K<8q "#'0f0 2|g`0A΀иX8.sampleCountD!T1 API #K s+ "8q "5b*l.l\@M(Ml.m\q^\\ልͮͥ퍬Ō-lnaͮ%̍nJ@\\ eNn̅,ͭlnJ0"s{+si Ks3Jc+s +k+2<:20)A{X!s+K{s2<062)|!sC #+kz#+cԇ2<:)X"s˃+ rs{ K{s"!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q C`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqmp UDT:P `>r&! <D@3,=8;?8m pK,DITmpOD4!@m5\qMTD~q۶ & A0@`0x 3l&$1 @5όq`@jbB `@ [h  aƀ8d@ [` aX piу`T@&  +Ʉ@0& 1a `@ ^ PaƀHd@ ^ Ha1@^h:0V0C+43p&+ `83a `L4c1@Dh<`1 @51@Df<^0F =&  0 ӌ= +vjXPM4c 0F A[f 5AMF AZ& A0@С< J>3D=%|& K,L6H1 ڠ5Aτ` L>3D=%|& K6Lf 1 AM3a1g1XDaAf 6`AMF P& +L&03a e?ª?  @*`Ä0b H> +?0a e??cĞ d??L#`ØCA ؓA0@aU@ ؓA0@U@ `@ }0aPa1XP!"bƀ@8=Df 4ؓ_`όH%|&  LF 0l(3a"g0τ0b IP ?0c@3{2b IP ?0a Bj?Ԃ?L# `p,BPHɈ 4# `G  +A>|& A0@R] ؓA0@R] `@ `Ana@ό`0{b$  >|& +.L&0 3ag0!τ0b WKAk`ĞAL03aX1g1@&@qJ1 @=1@&@qH0F ;Aw& A0@nBtb pF _Сzf 2`1@&@]1 ` 1 ̠`Bم4 +e*RJa`(? +F  >}f 1P1@'pp1 `@ Xaƀ A0@z"wA `@ a1@'p_1 Ѐ`@1 `BQQ*%aP=*%a@A0@Ăy@ pF =& A0@By@A `@ aaƀA0@y  (F zf 5t10&,1 A>3p:A3l`! 8F )}0f 6t0B 3c@2b XC5 pct0d `@ & A0̢& S@> phYL#`HAL#`ą"3h: ?>?L#`"C Lnq??Ì 0a&00 |f 9ptτ`$ K>3l:pgτ`C"0l3ag1@/`x 1 Ȁ`@ x%HXa1@/\x l0* f :ht1@/\ z1 @<όy#  CLÌ B L,  ALÌA 8#`Ƭ3  !LÄ0b h0+?0c@Igƀ07`@ р&Naƀ0Fሠ%oƀ0Fj fB0F ) Zlf 1P1@4n1 Ȁ`@ Ұ&Va1@4jz0L1 xP`Ig0%3aԌj}f <p3a1g1@5p 1 Ȁ`@ ָ'da1@5l 0F BX0%bƀ7g =7!O q 2`#Q>B߼U>Bm>By>B>B>B>B>B>B%>BA>By>B>B>B >B=>BM>BY>Ru>R}>R>R>R>R>R>R1>RE>R}>R>R>R >RA>RQ>R >b]#v^#v[_#n`@#b@#^[c@#d@#h@#6Oq@#6[p@#6q@#6[t@#v[u@#v_/K?[k9#ٺ `|&0ܷ 7ngÝmp6`|&0ܻ9YsN#MUD UDd*Ad*AtwMm4PHcMDNQ?DE/Paq!4(H3T@$He I>R qM6 Q OmE@V Q OmE@Ж Q _HmE@ض!Q _ۃ W,0Ԗf,0Ե mkC[\8pX8Y8[Y8Лi@Oh@#̳C5Oi@#̳C5_[4 0BD0BDpL1> STAT `GDXIL BC! > #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L S2" d##ㄡL L @` b `e ˟VbF1GspͰ(h +`@OY1  45\=sU#0BTcU +9F@0D0P@ 0 + P@ |`@lt`(蛉 Ɓa dhAAHƁA PQxHF!0hI"J|` Trt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 4v0p@&`C ;` a ` c0 `A L000!`s' !C< y, `@0ـ G2L &GCj`(րB(2("(b(`,AAA A@APAAA?AA?A2AA@A AAAAAa,A@_@AP@APAAAAAAA2@_AAAAA2@APAAAAAA q"gȜyLFD oM $Efe%&,f&gl&eCLm`p  m AP*sK{sk+s+k 6D!! p6A ԀS\YZXW[ܗYX&ڴa!" (gCPMȀ  } ՙMlB\A !&fT6 @oY7A5`b6VFV7A0 qM4id4e@,ll*Ml`X Ȁi`ÐAl0P Bl6 D 6 4 C 4 s@DL.m l[XM D2/76&tex_store:  ` +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔDBWFF67EP7CRF'F77%.dx.countersS>yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q @`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqmp UDT:P `>r! <D@3,98;?8m pK,DITmpOD4!@m[5\qMTD~qۦ mni_ù6py8yq~mnioùvpy!8yqmp UDT:P `>r! <D@3,98;?8m pK,DITmpOD4!@m[5\qMTD~qۦ 6H$%|,c31g`@ &uA!10B! |cg`@ &x@@@`o %|l0c" +"&># `0,BP $ |c  $ DŽ >fP⒏ A| cJ&,pA#`/C|f +c*YLJa `(. +*V%* %aP=*%aP=*@10d'!10'@ψ $>|F  }0 P  `>t0v|F  ~`@ ;0S@>#`?dI0b Y$ 6@ |lcC:-p`00ALJg8"p 6 e)(!SRB>weD@#1g@ 8 ȉAZ-DXBCV`afjwCo DTdt,SFI0ISG1OSG1PSV04 CSMainILDB`32DXILBC! *2 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L _2" d##ㄡL L @` b `J1a2GePB +PS@z(E7 ?a!+! +e!'!$?a!PPfR, @Q ( +EQOCH>QJL~qۈ(ĦX +qG ?a!F+1m#BQb)Pp (P29@38C8<->C=C9B=C9=8;;C8 +L:g"q`pypYZ(|zrR{(qw>0vxp6:0n?4ҴQEADhP֛)gY@B-0rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 5v0@&` ;`0a ` e0 ` L000!`ȃg !O@C< y. d@ 0` ' `C@H2L &GCGH)@r((b((2( +2@_A?@APAAA AAA?AAa,AAAAA@_@APA?AA2@AAA A@APA?A@APAAa,AAA@_Aa,AAA@APAABgHurgy(L d!Q:+s+3c+K{sj sAcc4@ oM $Efe%&,f&gl&e.͍N]ݛO\ڙ[H <2unsigned int{ 0c4V` E ,X  Aax-'aSVVF5VF!͍nA`PLoZ$M!@Bh+{1c{ caaF@0 1@scP0Y1( "h9V E ,B+`Oh9 @a-b V `jm0AP`Z$! `h @:9pj K1c{ ca;60`8|,b3p W"h@0W @a8|,b3p ×"h@0W @b8|,b3p ,L"hDA0W @c8|,b3p <"hLA0W @d6$w{ +P +Dk΍nZA*Hbdk΍nZ*HbaU`I ԁ`&`,b3\aF'CȮlMnj-Dg4E[ `60 0&A B(,X`q6p 4Xԥ+{sK;s+#IscY!T᐀E!0X'T᐀lx|a$vA~X.47E `0 Aā6 P"Y5B.Bf@"90pyC #+{Isc#+{kk{ssAccK48*"UYeYؕѽ5Yؕѽ%imn6 &@ցs @ tTF7T'VF&W6F=9*+#J+K{s + !+{j"J!+{j"09¦a<ă:<"*//' ,, i{X5P: **2 +* +Z5:8 **2 +* +Z5:X  \^^ʸ\ @?4訄8?GetTBN@@YA?AV?$matrix@M$02$02@@V?$vector@M$02@@@ZW0MĪ  2Dn./shaders/include\pbr.hlsli$*Hammersley429< 179& $ -9l%VM@IIDh *++J#UfW&7W&F77#A r4@KX (p @CvVFGv&FF? +s;+szzc# + !+{j"!i Kj"!0¦dbLĄ?x3 pJj{ s+ +kc+;:¢$хMaeYؕѽ5Yؕѽ55imMĪ (@ D6CosThetaWorld<9*27962 &179&  ffiX5;p@e +l-ĽW\X[PVPSSSb۶majJ'$C,@<PRܛ]X67902(2#, & öm0UPdQ%g,}ae555iH ( 8 @`Tז6VF1akKs s+ +j!+{j" lfiX5%mQ@p4:bz +bJ:+s+3c+K{sj sAcc4j .@. :=>HKDNXZ\01 +Kr#+[f@$72<#79::329 $m uqd@DʦM } ՙ$ m[ (`"VwV67`Ƚ՝ } ՙ4 m[ Tf&VF7T'VG NlNǮlMnj-g8r!I H0 .Mͭ̍nN- hꇄ NlN ĮlMf(hh268292SamplerState `B 0 ЕMTMMхѕm[8 $WfV6Fe6VFOꊪ NLǮlMnj-g!<`@=+3c+K{sj 2 +!*ã+!!+{j" +ڶ!<@fJ(hhi@6&A@`0?bP6 U } M}Qm[ @ 3T%Te4T4%m7uh#PPїQPԗ E ضoAot\b(,b< @&Bm7~C U } M} PpYMy@A Lay:X*2 +*rr öHu0x3T%Te4T43Am `@gJ(hhEf ?=0 PPїQP A0-ȇ|@0*//* pl[P'<>:CUBE_FACES_T.2ٶyA~$؋0Հڸ@pЏQO@@@]! 3*K{s0L@@6 ` +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "cs_common.hlsli" +#include "pbr.hlsli" + +#define SAMPLE_COUNT 2048 +#define MAX_LUMINANCE 25.0 + +TextureCube environmentCubemap : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D reflection_map_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; + float roughness; +}; + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const uint2 imageSize = uint2(faceSize, faceSize); + const float2 uv = GetUV(dispatchThreadID.xy, imageSize); + + const float3 N = GetCubeDirection(faceIndex, uv); + const float3 V = N; + + const float3x3 TBN = GetTBN(N); + + const float a = roughness * roughness; + const float a2 = max(a * a, EPSILON); + + float3 result = float3(0.0, 0.0, 0.0); + float totalWeight = 0.0; + + for (uint i = 0; i < SAMPLE_COUNT; ++i) + { + const float2 Xi = Hammersley(i, SAMPLE_COUNT); + + const float3 H = TangentToWorld(ImportanceSampleGGX(Xi, a2), TBN); + + const float3 L = -reflect(V, H); + + const float NoL = CosThetaWorld(N, L); + const float NoH = CosThetaWorld(N, H); + const float VoH = max(dot(V, H), 0.0); + + if (NoL > 0.0) + { + const float pdf = SpecularPdf(NoH, a2, VoH); + + const float saTexel = 4.0 * PI / (6.0 * imageSize.x * imageSize.y); + const float saSample = 1.0 / (float(SAMPLE_COUNT) * pdf + EPSILON); + + const float lod = roughness == 0.0 ? 0.0 : 0.5 * log2(saSample / saTexel); + + float3 irradiance = environmentCubemap.SampleLevel(texSampler, L, lod).rgb; + irradiance /= max(Luminance(irradiance) / MAX_LUMINANCE, 1.0); + + result += irradiance * NoL; + totalWeight += NoL; + } + } + + result /= totalWeight; + + reflection_map_face[dispatchThreadID.xy] = float4(result, 1.0); +}@D.\shaders\include\cs_common.hlsliDd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAa$m Dd-LM,m-MAAa..m Č-ndJ(hhikJ(hkʉ dA) A) A)+A)+A)KA)KAoAa..m Č-ndJ(hhjkJ(hkʉ dA)KA)KA) A) A) A) AoAa..m Č-ndJ(hhKhkJ(hkʉ dA)+A)+A)KA)KA)+A)+AoAA-N䨌 +.͍N$.͍N$-l*M,AaAdmČ-N. m*M $ $-l*MlADN . m*M D$ d. m*M DƥfAAA-n䨌nN(Ml. .͍dN(l,ɍ Č-N.AaAdmČ-N/DD$fAAdmČ-nM- dJ(hhikN(l,ɍ kAdmČ-n.̍dJ(hhjkN(l,ɍ kAdmČ-nD,M- dJ(hhKhkN(l,ɍ kAADN M--M M- d/D.̍d/%DD,M--eAAA-dm +.M Ō-nĉČ-n.AaADN - ʼn.&eAo@"%B2pC #+Jsc#+"K33+#3sAccKL// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef DIFFUSE_BRDF_HLSL +#define DIFFUSE_BRDF_HLSL 1 + +#include + +float3 diffuseLambert( float3 diffuseColor ) +{ + return diffuseColor;//division by PI omitted intentionally, lightColor is divided by Pi +} + +//linearRoughness - perceptual linear roughness +float3 diffuseBurley( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + float FD90 = 0.5 + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return diffuseColor * ( FdV * FdL );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//from moving FrostBite to PBR, energy conservative burley diffuse +float diffuseBurleyFixedFresnel( float linearRoughness, float NoV, float NoL, float VoH ) +{ + float energyBias = 0.5; + float energyFactor = (0.45f * linearRoughness - 0.475f) * linearRoughness + 1.0f; + float FD90 = energyBias + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return ( FdV * FdL * energyFactor);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float3 diffuseBurleyFixed( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + return diffuseColor * diffuseBurleyFixedFresnel( linearRoughness, NoV, NoL, VoH);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float diffuseChanFresnel( float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + // Since we use CoD fitting, need to invert/convert our roughness parametrization to + // their glossiness parametrization 'g' + float ggx_alpha = linear_roughness*linear_roughness; + float a2 = ggx_alpha*ggx_alpha; + float g = saturate( (1.0 / 18.0) * log2( 2 / a2 - 1 ) ); + + float f0 = VoH + pow5(1 - VoH); + // This factor tunes the enery boost at grazing angle for low roughness material. + // It creates energy ring at grazing angle for smooth dieletric material + // The higher the value 'rimScale' is, the lower the energy boost will be + // The default value from Chan is 0.75. + // Setting the value to 1.0 get rid off this energy boost. + const float rimScale = 0.75f; + float f1 = (1.0 - rimScale * pow5(1.0 - NoL)) * (1.0 - rimScale * pow5(1.0 - NoV)); + + // Rough (f0) to smooth f1 response interpolation + float fd = lerp( f0, f1, saturate( 2.2 * g - 0.5 ) ); + + // Retro reflectivity contribution. + float fb = ( (34.5 * g - 59 ) * g + 24.5 ) * VoH * exp2( -max( 73.2 * g - 21.2, 8.9 ) * sqrt( NoH ) ); + // allow to fade our rough retro reflectivity + fb *= retroReflectivityWeight; + return ( fd + fb ); +} + +float3 diffuseChan( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + return diffuseColor * diffuseChanFresnel(linear_roughness, NoV, NoL, VoH, NoH, retroReflectivityWeight); +} + +float3 diffuseOrenNayar( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH ) +{ + float VoL = 2 * VoH - 1; + float m = linear_roughness * linear_roughness; + float m2 = m * m; + float C1 = 1 - 0.5 * m2 *rcp(m2 + 0.33); + float Cosri = VoL - NoV * NoL; + + float C2 = 0.45 * m2 * rcp(m2 + 0.09) * ( Cosri >= 0 ? Cosri * rcp(max(NoL, NoV)) : 0 ); + return diffuseColor * (C1 + C2); + //float C2 = 0.45 * m2 * rcp(m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NoL / NoV ) : NoL ); + //return diffuseColor * ( NoL * C1 + C2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// N is the normal direction +// V is the view vector +// NdotV is the cosine angle between the view vector and the normal +float3 getDiffuseDominantDir ( float3 N, float3 V, float saturated_NdotV, float ggx_alpha) +{ + float a = 1.02341f * ggx_alpha - 1.51174f; + float b = -0.511705f * ggx_alpha + 0.755868f; + float lerpFactor = saturate (( saturated_NdotV* a + b) * ggx_alpha); + // The result is not normalized as we fetch in a cubemap + return lerp (N, V, lerpFactor ); +} + + +#endifA ZYW[YW]ڗ [5xyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3)rJ"2BbbjP!+3Ks+)rJ"2BbbiPhPI3s#+3IrjJrJzjP!+3Ks+IrjJrJzqAkP)s#K3kPhPxyiiiiiiiiiiiiiiiiPxy)r"2jPxyiiiiiiiiiiiiiiiiPhP@ c39+*r"2 + +{CA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiP{sA c3iqAciqAciqAcqAiP{sA c3qAcqAcqAciqAiPA c3aKs+ {;Cs+QYiPA c3 iKsCsQsc)ÃAiqAQqzIIQsYsiP+sA c3AiqAcqAIQ YsѻiPkPhP@ c3)r"2 +{CA c3+c zc{cA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiPA c3 9+*r"2 + +{CaKs+ {;Cs+cqzIiP+s+c zc{Q rY rS +CIrjJrJzR+c zc{s9KiPkPhPhP@ c3)r"2 +{szsk+ cCA c3aKs+ {;Cs+cA c3qzIiPkPyy +k+ )r"2 +{Cqa{;Cs+cqzIiP{sA c3iqAciqAiP{sA c3qAcqAiPA c3aKs+ {;Cs+QYiP+siKsCsQsc)ÃAiqAQqzIIQsYsiPkPhP)s#K3kP Ȋ \ʸʾ\Ҙ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYRUTQQSRQQTYY[RUTQQSRQQHLBBBHRUTWSUSYY[БTUSJX +H^]YY[БUSJX +H^^HYYHYБTUSQYY[БTUSJX +HXHYYHYБUSQYY[БUSJX +HXHYYBHYRQSTS LLYY[RQSTS L HLHYYBYY[TUQHLYY[TȌK MLMMYYY[TȌK MLMM ZBYY[HTӓ LLYY[HS[ J   LJYY[HSW[ + H  LJYY[HS՗[ +  H LJBYY[RԗTUTPHLYY[TTTUTPSדRHLYY[[[[[W\ٗ\ܛ]ٗX[[\\YY[[[ [[W\ٗ\ܛ]ٗX[[\\YY[[[ [[W\ٗ\ܛ]ٗX[[\\YY[[[ [[W\ٗ\ܛ]ٗX[[\\BYY[Y^ZYYY[Y^ ZLYY[Y^ ZLYY[Y^ ZMB[H[ [H [ [XJ^\]H[J H[ XJNB_[H[ [H [ [XJ^\]H[J H[ XJNB_YY[HUTR +^ +^B[H[ [ HXJ^\]H[ J  HK H^NB_[H[ [H [ [ [YJ^\]H[J[J Y + H[ XJNB_[H[ [H [ [ [YJ^\]H[J[J Y + H[ XJNB_BYY[TPT\X\YYY[TT +^ +\\]\] +^JJYY[STUғ[X[Y +[ [X[ΔTUғNYY[] љ\J H  Y^ +HTX[ّ\J\X[]] J] ^  Y^JYY[] J H] +HTX[S]J\X[]] J] ^ J]]JYY[] J H] +HTX[S]J\X[]] J] ^ J]]JYY[]PPJ H] +HTX[S]J\X[]] J] ^ H]JYY[]PPQ\XJ H Y +HTX[S]J\X[]] J] ^ YJYY[] ܛJ H] +HTX[J\X[]] J] ^ J]]JYY[] J H] +HTX[J\X[]] H]JYY[] J H] +HTX[J\X[]] H]JYY[]PPJ H] +HTX[J\X[]] H]JYY[]]\QZJ X +HQZJ\X[]] XJYY[]^Qړ\J   ț\ +H [J + Y + ț\JYY[]]\ٓ\J  ț\ +HTX[J\X[]]  ț\JYY[]]\ٓ\J   ț\ +HTX[S]J\X[]]   ț\JBYY[SPԗГQJ [X[ ][JYY[\WYY[HVYY[TȖ\ZWYY[SUȖ[][WBYY[HQUT[X[Y +\[X[^_YY[QSTWSTWSQPTYY[TUWQUT[X[YJYY[HSWQUT[X[YJBYY[WTԐTQTYY[QԐTQ\ +\HYUVQQQSQYY[UVQQQSHLBYY[RUUT QYY[RUUT WJ X +LYY[RUUT QTPVYY[RUUT QYY[RҗPQY[  [X[YJYY[RҗPQWJ X +LYY[RTUTїPQY[  [X[YJYY[RTUTїPQWJ X +LYY[RUPS[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [݌H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ Q\X[H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[ ]^QP\ +U]\ Q\X[݌H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[ ]^QP\ +U]\ Q\X[H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[]^QP\ +U]\ Q\X[H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [݌H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_YY[]^QJ  Y +]^QP\J   ȗQS SS HKLJB[ [PYP\PY[H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_[ [PYP\PY[݌H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_[ [PYP\PY[H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_[[PYP\PY[H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_B][PYP\PYO]H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_B][PYP\\]\PYO]H H HY[ H H[X[YJRTUTїPQY[  [X[YN\]HXNB_B][PYP\\]\PYO]H H HY[ H H[X[YJRTUTїPQY[  [X[YN\]HXNB_B][PYP\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PY܌P\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B][PYP\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PY܌P\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_YY[[PYJ X +[PYP\J  ȗQS SS HKLJYY[[PY J X +[PYP\J  ȗQS SS HKLJYY[[PY J X +[PY܌P\J  ȗQS SS Yݗ[X[HXJYY[[PY J X +[PYP\J  ȗQS SS HKLJ[ݛ\PYP\ԕP]Y\ܜPYH H H]][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_[ݛ\PYP\ԕP]Y\ܜPYH H H] ][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_[ݛ\PY܌P\ԕP]Y\ܜPYH H H] ][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_[ݛ\PYP\ԕP]Y\ܜPYH H H] ][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_YY[ݛ\PYJ  ][]Y +ݛ\PYP\J  ][] ȗQS SS HKLJYY[ݛ\PY J  ][]Y +ݛ\PYP\J  ][] ȗQS SS Yݗ[X[HXJYY[ݛ\PY J  ][]Y +ݛ\PY܌P\J  ][] ȗQS SS HKLJYY[ݛ\PY J  ][]Y +ݛ\PYP\J  ][] ȗQS SS HKLJYY[\]\PY\J X +HV] +RTUTїPQWJ X + XJJWYY[XY\J X +HV] +RҗPQWJ X + XJJWYY[]]\ QJ X +HV +RUUT WJ X + XJJWHYYBB]]XQP\ +U]\ O]H H  HY[ H H[X[YJHRUPN\]HXNB_YY[]XQJ X +]XQP\J  ȗQS SS Yݗ[X[HXJBHHRQSTS LLYY[\[J  X +HXYY[țJ X +HXHYYBZ ڌ[ۛY] +Z ][J^HRTPTғS\]H[] MM ZNH\Y\]\[JڜY[] +] ][J  ] Z +  LJNHYYB_BHYE\ ZYW[Y [{xyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3"2zjjzrjP!+3Ks+"2zjjzrjPhPIsc#+!K33+#3sAccKiPIsc#+ᙃ+c #3sAccKiPIsc#+)sK#3sAccKiPhPxy!J33+i{#+ckP!+3Ks+!J22*b +j*iP!+3Ks+!J22*z*rr + +iP!+3Ks+!J22*b*iP!+3Ks+!J22*b*2J*"iP!+3Ks+!J22*B +riPhPI3s#+3"2"J22*jP!+3Ks+"2"J22*!J22*b*2J*"zy!J22*z*rr + +zy!J22*b*zy!J22*z*rr + +zy!J22*b*zy!J22*b +j*zyiP)s#K3kPhPxyiJ{3 +!KKK{s1sK{skPhP!+3Ks+*"bJrriP!+3Ks+*"*Zj +rriP!+3Ks+*"::iPhPI3s#+3"2*"jP!+3Ks+"2*"*"::jP)s#K3kPhPxy9*{k+K +s K{syC #{Ks;kP!+3Ks+*:JjbJJiP!+3Ks+*:r*j +rriP!+3Ks+*:Z*b*j*riP!+3Ks+*:BbJZiP!+3Ks+*:jJB::iP!+3Ks+*:jJBz*b +*"iP!+3Ks+*:jJBz*b +*" +ziPhPI3s#+3"2*:jP!+3Ks+"2*:*:jJBz*b +*"jP)s#K3kPhPxy1+s+ckP!+3Ks+*2rzr*iP!+3Ks+*2BbJZiP!+3Ks+*22*r*biPI3s#+3"2*2jP!+3Ks+"2*2*2BbJZjP)s#K3kPhPxyB++skPI3s#+3B**r*b +jP!+3Ks+B**r*b +iP)s#K3kPhP0c{ "2"K33+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCJiPkPI3"2"J22*!J22*b +j*jP+s!K33+c +k+C!K33+zc{IiP)cK3"2"J22*!J22*z*rr + +jP+s!K33+{+ss + C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*jP+s!K33+c+C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*2J*"jP+s!K33+c+3J+#C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*B +rjPyy){ cc!K33++s"2"K33+cKCqzCjP+siP)s#K3kPkPhP0c{ "2"K33+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCJiPkPI3"2"J22*!J22*b +j*jP+s!K33+c +k+C!K33+zc{IiP)cK3"2"J22*!J22*z*rr + +jP+s!K33+{+ss + C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*jP+s!K33+c+C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*2J*"jP+s!K33+c+3J+#C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*B +rjP+s!K33+B sC!K33+zc{caKs+ z;Cs+SaKs+ z;Cs+cqzbqzcbzCbqzCJiP)s#K3kPkPhP0c{ "2"KKK{sC1c{ 9; +cC c1c{ qzCJiPkPI3"2*"*"bJrrjP+s!KKK{sbKssC9; +cC cqzCIiP)cK3"2*"*"*Zj +rrjP+s!KKK{s* ssC9; +cC cqzCIiP)cK3"2*"*"::jP+s!KKK{s;:B9; +cC cqzCIiP)s#K3kPkPhPxyJ9yAQqzcRqzJiP0c{ "2:+{k+KJKKcKC1c{ 9; +cC c1c{ qzb1c{ qzcb1c{ zCJiPkPI3"2*:*:JjbJJjP+s9+{k+KjcKKCIiP)cK3"2*:*:r*j +rrjP+s9+{k+s*k ssCqzbqzcIiP)cK3"2*:*:Z*b*j*rjP+s9+{k+[*c+k+sCzCIiP)cK3"2*:*:BbJZjP+s9+{k+˛CcK9; +cC cqzbqzcIiP)cK3"2*:*:jJB::jP+s9+{k+˛jKCC9; +cC cqzbqzcIiP)cK3"2*:*:jJBz*b +*"jP+s9+{k+˛jKCz+c +#C9; +cC cqzbqzcIiP)cK3"2*:*:jJBz*b +*" +zjP+s9+{k+˛jKCz+c +# {C9; +cC cqzbqzcIiP)s#K3kPkPhP0c{ "22+s+cC1c{ +c zc{c1c{ zCJiPkPI3"2*2iP+s1+s+cszs+C+c zc{IiP)cK3"2*2iP+s1+s+cCcK+c zc{czCIiP)cK3"2*2iP+s1+s+c3+s+cC+c zc{czCIiP)s#K3kPkPhP0c{ "2+c C1c{ 9; +cC c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCbA c3C++s+s;CcA c3C++szc{KiPkP1c{ !"2"KKK{sC9; +cC cqzCJiP1c{ 9"2:+{k+KJKKcKC9; +cC cqzbqzcbzCJiP1c{ +c!Q9iPhP+s+ciPkPhPxy1{kAyys1{K+s{k{k{s+s{c{ #{yy{+r{+j{Ks;2{K+{q#3AyK;Ks c+K{sA #;Is{#+ IiP0c{ {k++{cK{sC1c{  +#r"{b1c{  zb1c{ 9; +cC KiPkP+s +C{C +#r"{Y zb)ÃAiqQ9; +cC iqIIiY zJiPkPxy9; +cC aKs+ z;Cs+SaKs+ z;Cs+kPhPxy9; +cC aKs+ z;Cs+SaKs+ z;Cs+kP@ c3 s# #"2rzrzbB1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cc1c{ C++szc{c1c{  sc+sKiPkPI3*b +"J +b*"11"2"J22*!J22*b +j*jP+s!K33+c +k+C +#J33+zc{KiP)c+kP1c{ Aq{k cK+CK+YaK;C#JKiP1c{ qzC +C!{Cq{k ccAJIiP1c{ zC +C!{CK+cAJIiPA c3!K33+"2"K33+C +#J33+zc{caKs+ z;Cs+cqzbqzcbzCJiPI3 *b +"J +b*"jP1c{ +c "2+c C9; +cC cqzbqzcbzCbqzCb sc+scC++szc{KQ+c +s;CiP1c{ 1"22+s+cC+c zc{czCJiP+sA!K33+Y1Q+c KiP)c+kP+s!K33+iP)s#K3kP)s#K3kPkPhP@ c3 s# #"2B1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cc1c{ C++szc{c1c{  sc+sKiPkP+s s# #"2rzrzbBqzbqzcb +#J33+zc{c9; +cC caKs+ z;Cs+c+c zc{c+c +s;CcaK;C#JcK+cq{k ccC++szc{c sc+sKQqzciPkPhP@ c3 s# #"2rzrzbB1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cKiPkP+s s# #"2rzrzbBqzbqzcb +#J33+zc{c9; +cC caKs+ z;Cs+c+c zc{c+c +s;CcaK;C#JcK+cq{k cc1c{ AaaIaIiPkPhP@ c3 s# #"2B1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cKiPkP+s s# #"2rzrzbBqzbqzcb +#J33+zc{c9; +cC caKs+ z;Cs+c+c zc{c+c +s;CcaK;C#JcK+cq{k cc1c{ AaaIaIQqzciPkPhPxyyyyyyyyyyyyyz"zq +jɹrK3{#+ {+KCyC+ A1{) kc+++!KKK{s;:Is+c #3sAccKKiPKs*++JAKsKKiPkPKAKIAKIiPKAAK1IIAAK1 + + + + + + +JIiPKAAK1IIAAK1JIiPKAAK11111JIAAK13111IIiPKAAK11212JIAAK13212IIiP+sKiPkPhP0c{ A +kk+c+CKsIcKsqJiPkP{s1c{ )1 C1c{ CIKyqJiP{s1c{ )*++JAIKQqɱ)kiP+s1c{ A)a)IiPkPhP0c{ Ij{ s+ +kc+;:B1c{ )b1c{  IiPkP{s1c{ CKqQJQ)riP{s1c{ {B+ CAqi)rKyAqYA iqIQ)rKIiP{s1c{ KsB+ Cqi{B+ Q{B+ KiPhP1c{ AiPArKsB+ Q{CCKKiPArKsB+ QKsCCKKiPAr{B+ iPiP+sAiPkPhP0c{ !::B1c{  a1c{ qzCJiPkP{s1c{ !AqzCQ iqzCJQqzCYqiP+s yAJQ!Q!KiPkPhP0c{ Ij{ s+"3;:B1c{ {B+ c1c{  IiPkP+s{B+ Q!::B a{B+ KiPkPhP0c{ +c "3C1c{ qzCb1c{  a1c{ zCJiPkP+sIj{ s+"3;:BqzCb Iyi CqQzCbqIiPkPhP0c{ akKs s+C1c{ {c{KiPkP+s!{C{c{c1c{ AqaqaqIIiPkPhP)s#K3 H \ʸ\Ҹ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBHYRQӓPSYY[RQӓPHLBH[YZ]\YY[ٜ [HB[۝ [HX +Ȟ\]HJN_[ [HX +Ȟ\]۝ JJXN_[[HX +Ȟ\] JJXN_[ ۝̗]٘ [ HX +Ȟ\]HJN_[ ۝̗] [ HX +Ȟ\]HJN_[ ۝̗] [ HX +Ȟ\]HJN_B[ ۝ [ HX +Ȟ\]HJN_[ ۝ [ HX +Ȟ\]HJN_[ ۝ [ HX +Ȟ\]HJN_[  [ HX +Ȟ\]۝ JJXN_[ [ HX +Ȟ\] JJXN_[ ] [ HX +Ȟ\]JJXN_[] [HX +Ȟ[HHJJ\]JN_BZ۝  +ZHX +Ȟ\]HJN_Z  +ZHX +Ȟ\]۝ JJXN_Z]  +ZHXZHMOJHJO\]HJN_B[[X\[[HV +\]J[J +V + LY +KVH_B[ UY՛[  [ SJ^\]H[ + ]NB_B[ Q[ SJ^[ NB[ HȘ HSWVNH[ʘ HSV +  ]JTӓ  + UJJNHۛ\[[^ +UNB؛[ Hۛ\[[^ʘ UJNB\][ + ѓSPUKM ZH[Z\\ \Yݛ\[ +   ^ +K[ +K K K^ +K[ +  ^JNB_B[ Q[  [ UJ^Hۛ\[[^ +H  + S + +SN؛[ HȘ UNB\][ + ѓSPUKM ZH[Z\\ \Yݛ\[ +   ^ +K[ +K K K^ +K[ +  ^JNB_B[[[Y\^ٗ[\Q [ YYYZJ^\] +YYY  +YYYK +\QZNB_BHYaFhe5FV&7Ǖ6VGV5W6V&%&Gf6ǖ-^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@x\|^^@@@z@TT@^@PhTޘTެR@z@TT^^@@z@@^@PhTޘTެRF@F@@j`\`F^^@@brnnX@D@@@@@@@D@܄P@@X@@ސ@R@@@d@z@@T@v@@@d@z@b@^@d@Z@bv@@@PdVbR@T@ȠP@ސX@dTd@Rv^^@@@@X@@@@@^^@@brlfX@D@@@@@@@D@܄P@@X@@ސ@R@@@d@z@@T@v@@@ސd@z@ސ@T@ސv@@@P@Pސd@Z@bR@^@Pd@T@ސdR@R@^@Pd@T@ސd@T@ސd@Rv^^@@@@X@@@@@^^@@^@Z@܎P@@X@@ސ@R@@@d@z@@T@v@@@@z@P@ސ@T@d@Z@ސ@R@T@ސ@V@bv^^@d@@@@d@^@PbZpX@T@Rv^^@@@@X@@@@@^^@@X@@܎P@@°X@@²X@@ސX@f@X@f@X@f@@R@@@ސ@z@P@X@@Rv@@@ސ@z@P@X@@Rv@@@@z@ސTސ@^@dP°R@V@ސTސ@^@dP²R@V@ސTސv@@@b@^@PbZpX@°T²@T@T@Rv^^@@@@X@@@@@^^^^t^^\\^d`bp^`b^`h^Z^@܆P@X@@ސR@@@d@@@@z@@T@v@@@d@z@ސ@T@ސv@@@d@z@b\@Z@dv@@@h@z@d@T@dv@@@Ph@V@h\@T@PZd@^@Pd@T@dRRR@^@PPb\@V@h\@T@dR@T@hRv^^@@@@@@PR@@@`\djv@P@@ެX@@ޘ@R@@@P@h@T@P@ޘX@ެ@R@VbZjRv@֨P@ސX@@ޘX@@ެX@@ސX@@R@@@蘾z@PޘX@`\`Rv@@@謾z@PެX@`\`Rv@@@ސ쾬@z@dTސ@^@ސv@@@P@P@ސ쾬@T@謾X@ސ쾬@T@蘾RX@b\`Rv^^@@d``bX@D@@@@Z@@@@@D@P@@ސ@R@@@P@h@T@ސ@T@ސ@Rv@P@@X@@ެX@@ޘ@R@@@@z@dP@@R@T@`\jv@@@֬@z@ެ@T@Pb@Z@R@V@v@@@֘@z@ޘ@T@Pb@Z@R@V@v@@@`\dj@^@P@֬@T@֘@Rv^^@@@@@P@@X@@ެX@@ޘ@R@@@d@z@dP@@Rv@@@Ь@z@ެ@V@P@ެ@T@Pެ@Z@ެ@T@dR@V@d@Rv@@@И@z@ޘ@V@P@ޘ@T@Pޘ@Z@ޘ@T@dR@V@d@Rv@@@P@Ь@T@И@Rv^^@@@@@@@^@ІP@@X@@ެX@@ޘ@R@@@d@z@dP@@Rv@@@Ь@z@ޘ@T@@PެTPެ@Z@ެ@T@dR@V@d@Rv@@@И@z@ެ@T@@PޘTPޘ@Z@ޘ@T@dR@V@d@Rv@@^^@@z@v@@^^@Ь@z@ޘ@T@P@ެ@T@P@b@Z@@R@V@@Rv@@^^@И@z@ެ@T@P@ޘ@T@P@b@Z@@R@V@@Rv@@@P`\j@T@P@Ь@V@И@RRv^^@@@@@@@^^@@d`bhX@D@@Z@@@Z@D@ІȂP@@X@@ެX@@ޘ@R@@@Ь@z@ޘ@T@P@ެ@T@P@b@Z@@R@V@@Rv@@@И@z@ެ@T@P@ޘ@T@P@b@Z@@R@V@@Rv@@@`\j@T@P@Ь@V@И@Rv^^^^t^^\\^d`bp^`b^`h^Z^@P@ެX@@ޘR@@@b\@^@Ph\@T@PޘV@ެ@Z@ޘ@T@ެRRvf@؜P@f@@R@@@vf@ئP@f@X@@ސ@R@@@@z@jP@b@Z@ސ@Rv@@@@^^@@@@dJ@@@@@@@@@@@@@P@@T@\@R@T@@V@Pb@Z@R@T@v@@f@֤Pf@`X@@ސX@@R@@@@@@@z@jPb@Z@ސRv@@@@@@z@b\`@Z@v@@@@@`@V@PPfPX@X@RX@`R@Z@`R@T@vf@،P@f@X@@ސ@R@@f@@z@P@P@fP`X@`X@`RX@fP`\rrX@`\rrX@`\rrRX@@R@Rv@@f@@z@P@b@V@@R@^@P@b@Z@@Rv@@f@@z@P@T@V@ސTސ@Z@b@Rv@@@`\j@T@dfP@P@Z@ސR@^@P@V@ސR@R@T@P@b@V@dfP@PPVސRTސ@Z@bR@^@PPZސRTސ@V@bR@R@Rvf@ФܬPf@X@f@X@@R^^@z@dPR@@@P@X@X@Pb@Z@R@T@P@Pb@Z@R@V@@R@RvF66r#<".:(77<2689222..242727:9.272941:2.:9029902/2494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠРР0'v6V֠РҠV66VVננV66V27VV֠נBvBVV6GWFV66VV37VV26VB6bV6R7WF"2FV&2V&נננҠР22F4Ŕ"6ҠР0BVfV2T%Te4T5TDbӠ0BVfV24Ud5T%T5%45UӠ0BVfV2T%TUde4T5U#CӠ0BVfV$%D4Te4T5U#Ӡ0BVfV"UdT4De4T5UR#Ӡ0BVfV"UdT4DՔ5TDӠР0BVfVT5t%T45TD#ӠР0BVfV2Dt$Ӡ0BVfV2DtUԔ45dU2Ӡ0BVfVUԔ45Bc֠Р0BVfVr$%TedT$%Udr$ՠ0BVfV25EU%TedT$%Ud2%ՠР0fFVf5V7V7נР2Ɩ"6ҠР0BVfV2E%tdń2נ0BVfV2E%td2E%tdńҠРV66VV3FV&EVfV6ננ26GW'R6GǦ3G'veVvr&&TgfV&%Wf2E%tdr$%TedT$%UdӠ26GW'R6GǦ3G'veVv27GW&TgfV&%Wf2E%td25EU%TedT$%UdӠРƖV"6w&&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uFr&&TgfV&%WfӠנРƖV"677GW&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uF27GW&TgfV&%WfӠננР0R6W5V7V7נР4Ɩ"6ҠР0BVfV24D'WfV'Wf72V֠0BVfV24D'WfV24D'WfVҠР0BVfVr$5$TedT$V2&VgfV&24Dr$%TedT$%UdVҠ0BVfV25EU5$TedT$V2&VgfV&24D25EU%TedT$%UdVҠР0RFf5V7V7AZ(PВg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ K䂏 ɘILot3A mDM(Mm&m&4` Ml&q!A7 4A34 LԠ &cPmXФNXML&;; L  } ՙMl&y'h&g'O&n4@4946<P Lk&u!h2*ph78` _Jl TJT6 h"*a@ʆLAU6 j&gAxVPC.*7(fnP*XޠU"A3dE؃Y\\YYѸtXG=: 0&imageSize .`\: DW +id DޡW \^T^"0[%ïC P "zu([sȌ%KsQ2 X%C p{k c[f`zXuHvu<%û Ks{k c Bk.i\:̋0 %Cd.0.Bd$ @TDF"_ &0 2k. l\:}d%i0A8!W6WF7.@FFX3.totalWeightDСd6AڸW9 &5.BD%$B`Vq "*q2%b%D˔hK!/SwAФa+CHf\JLIF_@MZR`6.@$'l$T/Z]ظX"sinThetaDrBgJ5 K ) 0``7.B&|<3 X% +r.i\H@ D|g@6`!p`i\H`}}ppzC +j#A_7q "6K )CVq "c2%K )`\ZLI&= b6 DgJ7!jS @Y͸-KY ) Gf6.@dVFsaTexelDfo? F6.@dVF*irradianceDftQ0`1&7.B.D$ ICV/llvm.dbg.cuSpfFVVbv67EfFVF7%Kdx.source.contentsS)YqD2V'7VBVfV67%l̽ɍ9M v[XKܔLؕͥM ]]ܔ@M̡5M \[XܔT,хѥMNEUṔAM ZyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q M`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqm pHD_ܶEl;/TQQCIm6\B@0ܶQH;/D0! a ptmC5\< Qmۄ4\Ma~qa L} 0Aa P$&IL 71Apb  `,&YL h1Ab `/& +hL |1Ab be5& +lLژ (1Axc `=&zL 1Ac D&@L 02Ahdؑ #G&@L1 c2AdH &M&L6 m2APd 0'# `@)+$P +0a$` +0a$p +0a * *  c?2?܂  Ä0bp _-t*`0&0b /P0?0c@A  0C0Ä0b /P/?0c@|;ʈ  0C0Ä0b /P,?0c@|;ʈ  @C0ÄpP3D;)}f 0wA0@3X" wA0@3X  f 1ށWj0ό!; |& A0@5hA" $tF )֠& 1 1@`v1 `\F 1ؠ& A0@6P! 3l+$1 @r!όq`@b `@ vXAZaƀ8e@ vPAZaX0piC`]@&  Ʉ@0& 1a `@ yx`8aƀHe@ yp`0a1@D^0V0/43pP.+ `=3a `L4c1@1 @r1@0F `&  "Qӌ= +0jX PM4c 0F H9f 5\F H9& A0@aRa J>3D=%|& K,L6H1 ڠrAτ` L>3D=%|& K6Lf 1 \3a1g1X$^aAf 6`\F  : U& +L&03a ?Ԃ?c 0b KP f?0a ?Ԃl?L#`h@3H ??L#`Dh@  /1C-@Ì1Hˈ  /!C-0Ä0b KP c?0a1  |1@&B0J1 ΀ |1@&0H0F  l!6& A0xZw w f 4ሠoƀ@1 |n>& [hXgτ`" B>)B|& L#`jë30#/#`Dj  :8pÄ0b MB!iAtLv03aX1g1@'X(8h1 ΀ |1@'V(8f0F  >& $k#/6H0L3aAgτ`B L>)|& L# `E;DpHˈ De`I A>|& A0@yAb A0@¶y! `@ aPa18,atbƀ@ +ф@0,3c@  pq=0Ì:1 ҀC`@ f 41@D.p>j1 B`@ aƀXA0@B| tF Zf 7x^%f 7(^b 7 +L(*4~PLb@ aƀpUA0@b~A tF  vf 5`1@.r?0F  Z& A0@"~A"4@%Vf@ aƀ L%Vf X A>3hJ̈ Du1J̈  zHÌ1J̈  zHÌqKLp3D^H/3Uy/3%;c@E13b H_0x?0c@E1SAZ܌a1SIPZ~1SAJPC3^K̈  JPÌqKLmq3^KL-@ o3^KL0@ {q/3#`y-!3]d/3|/3ЄN5|/3܄N5;c@Ď ?ĩ?wDT7c@EDT:a8c@DT:ag13b Hlp?0c@E1sP3iX*2|f 8XA0@fX4"XA0@f#P5 'jƴό`53b m?0c@F5c gƀX 3ȉ12 9Q3F1 V#rf, A9Q3F1 V rfF  f rfF  ~f Ոrf,3c@DXI1 X rfF  f rfF  Ƣf ֈrfF  ʍPf װrf,3c@53b oP?0c@53b` n3c@5c!6A0@x5A0@þx `@ ,^a1@$<8Vl1 <&f@ ,Za1@$<8V0l(`، AYL#`q `@ €7B`1@0 ȅ&0,IL#`| x.@0b z?0c@ȁ+  \Ä0b z?0a,so t +`ANg τ`! B> aτ`0g3c@Ё+ ~bτ0b H}?0c@Ё+  Q^Ä0b H}?0a R&?j?p`>Q6#`G{C  A^ Ä0b H}?0c@e3b H}?0a Rg?셮2?L# `ȇ^: 3@>Q6#`G^1c@e3b }?0c@A+  C_Ìfi3b }?0a r)?4?L#`ǚ}3p>6#`܇}  C_@Ä0bp M}Ec30>6#`G~3T %?;?xP +0!܆z +0 M#`䇉a3DxX͈  _Ìd0o3b H~?0c@G6o3b H~?0c@܌ &?3nZ͈  hÌZ͈  hÌ٬#`lj3dg}11c@7+hB Loߌ +i0+,13D(|Agƀȍl-τ`gƀȍg-F>3oTh17|f 񀃱xA0hF51  ml3c@X1 f.3c@A) +`j1 @f03c@A +`C "XaV> D) +~0+{!"`VYbƀoV +@xG0F lf Pf1xkE/ӈ؈`ƀ0`4!& !0Fa1@Fx _R1 F`@ A7|@a1@Ft _0F tf tF t& A0@hD! ``@ ɍAX5\cƀ@.HؐόA +u0+ 44h +`F@Y3a1g1@DG~r^1 F`@ <pa1@DGzr0l  P0l0L6|f Sfa3aذ0F 1f 5`1@L0h0F 0& Suόq +٬#` a3,3*$ T@ T@ R&c??l0b Hl?0c@  ezÄ0b Hl?0a; f 7@XF 10#f 7x^nt f 7(^e0`1@LhT1 `A`@ 3!=aƀXA0@dpa `@ 3= a0cό + :f0(3a &c?G?k0b q?0a &a?G?L#`Ikz B@"2c@3+g!O ai+`]Ӵ>Bߺ>B߼>B>B!>B->B9>BE>BY>B}>B뻙>B>B>B>B>B +>B +>B +>B +>RtmlwosnuxoymmԹnyoԺm{m;nnbA>bM>ba>b뷅>b뽍>bﶡ>b>b>b>b>b +>b +>b +>baH6@|&0|p`|&0ܶ mgÍ{p(@|&pYe(`|&pٸ \vngpEYsN#MUD UDdC6PMVpMvo*AtӖ0Hc E,M6obTH4 L qMTD+2 N3p fP,0g,0Ե mCa@8p[^8^8^8[B4?<joDD-OmKDH2DD-OmKDH2*DD-_HmKDH26&M̳/̳43 L 1 +43 L 15STAT `kDXIL BC! b #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L [2" d##ㄡL L @` b ` 0jn.BWBZ/nB=OCH~4B *cHaMe 0 ˟|nPː Ž.B*VbFaF!4C2h+`@AP ɀ #p `f"q`pypZ(|zrzr{(qw>0vxp6:0DD0p P@  P@ |`@lt`(<~ii`7ISD ̳;Trt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 6v0@&`C ;`@a ` g0 ` L000!`s' !@C< y* `@0ـ`  H2L &GCj`r)ہb(B(2(b(( `,AAA A@APAAA?AA?A2AA@A AAAAAa,A@_@AP@APAAAAAAA2@_AAAAA2@APAAAAAAsJghyLFD oM $Efe%&,f&gl&eCLn`x  m AP*sK{sk+s+k `0A0`@4BYb`gCL 8ɕѥ}}M 1 |Ն$& A5AH8s$56G'TgfV&7A0`B\A !&kT6 @oY7A@7`b6VFV7A0 M>jd4e@,ll*Ml`h Ȁiʀ[[6 AӔ"34` m0A( 8ax914aX56hP7 쀈\Z 30 Hs 479"tex_normLXԥM kcz| 0B(TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+|\ʂm u\vЅ e΍LnnJ +yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q I`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqm pHD_ܶAl;/TQQCIm[6\B@0ܶMH;/D0! a ptmC5\< Qm4\Ma~q` ^?DXIL`DXIL BC! | #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L \2" d##ㄡL L @` b ` 0jn.BWBZ/nB=OCH~4B *cHaMe 0 ˟|nPː Ž.B*VbFaF!4C2h+`@AP ɀ #p `f"q`pypZ(|zrzr{(qw>0vxp6:0DD0p P@  P@ |`@lt`(<~ii`7ISD ̳;Trt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 3v0P@&` ;`a ` a0 ` L0|@!@C<  y L@0䩀`ȃ g@!O@C0@,D2L &GCF(((b(`,AAA A@APAAA?AA?A2AA@A AAAAAa,A@_@AP@APAAAAAAA2@_AAAAA2@APAAAAAAsZgyGLFD oM $Efe%&,f&gl&eCLn`p a0(M mÀ$ ΀&A 014ij!&g |Ԇ& A5AH4 0`CM@ 6 @nYZ7A(CSMain0ưA1P|`xcPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q I`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqm pHD_ܶAl;/TQQCIm[6\B@0ܶMH;/D0! a ptmC5\< Qm4\Ma~q` 6H$%|,c31g`@ A!10F$V! |c{g`@ @@o %|l0c" +"&># `8BP 42 |c  $ DŽ >fP⒏ A| cJ&,pA#`ЀE:C|F  wM Xg@ f +/(*~b 7 +O(.ʂtψ 4pApUldq`XAJh VWAKh qlvqЄրXMh VPWNh w@Y@1$c Ƞ$cD  D>F106l" DA0hf#'A0hhc5 AcoX@džRψ tqx #`Z܂q +1@6B`@ :X\hKRA>#`F[ An P0b x//D`NǂD>&򱡐!>6C|'O 13b K{E:9 B0bp {E#`^4a1!2E`*ǂ!>,3bp X|XhB Gi| AǂB@ X18?R# X.cjcC >#`Аo|f +@E1xD/8Ԑ ِ`4!F`4aF `a5\5, A"}c@@>6|l0ذac:`3KP T@ T@; Y#cA3 +8A#11AmDXBC +_ 5aՓ $o DTdt,\DexeeSFI0ISG1OSG1PSV04 CSMainILDBZ`DXILZBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L e2" d##ㄡL L @` b `J1a2GeP˟VbF2GspͰ(x +(( +@QYR TP.B*VbF(J!2RH#)p #Lm00n@ PPr@ +|`0`@~~z P(Pfq`pypZ(|zrR{(qw>0vxp6:0$| 38C8<,->C=C9)=8;;C8 +>siڨ "$( +7ISD ̳;Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 2v0@@&` ;`a ` `0 `v0 C< y D@0䙀`S !C@F2L &GCFH)r(b(("( +2@_A?@APAAA AAA?AAa,AAAAA@_@APA?AA2@AAA A@APA?A@APAAa,AAA@_Aa,AAA@APAA"g syL d!q s{ k {+k sAcc4@ oM $Efe%&,f&gl&e.͍N]ݛO\ڙ[H <2unsigned int{ 0c4V` E ,BX  Aax-'aSVVF5VF!͍nA`PLmZ$M!@Bh+{1c{ caaF@0 1@scP0Y1( "h`@gJ(hhEf -",B  PPїQP A0-[Y@P*//* pl[8g&-:CUBE_FACES_T.2ٶnj +NZ$pzЇ @Љ0`QO@@@/! 3*K{s0Lo@@6 S\` // Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "cs_common.hlsli" + +Texture2D panorama_texture : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D cubemap_texture_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; +}; + +float2 ComputePanoramaTexCoord(float3 direction) +{ + const float2 inverseAtan = float2(0.1591, 0.3183); + + return float2(atan2(direction.z, direction.x), asin(-direction.y)) * inverseAtan + 0.5; +} + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const float2 uv = GetUV(dispatchThreadID.xy, uint2(faceSize, faceSize)); + + const float3 direction = GetCubeDirection(faceIndex, uv); + + const float2 panoramaTexCoord = ComputePanoramaTexCoord(direction); + + float4 panoramaSample = panorama_texture.SampleLevel(texSampler, panoramaTexCoord, 0); + + cubemap_texture_face[dispatchThreadID.xy] = panoramaSample; +}..\shaders\include\cs_common.hlsliDd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAa$m Dd-LM,m-MAAa..m Č-ndJ(hhikJ(hkʉ dA) A) A)+A)+A)KA)KAoAa..m Č-ndJ(hhjkJ(hkʉ dA)KA)KA) A) A) A) AoAa..m Č-ndJ(hhKhkJ(hkʉ dA)+A)+A)KA)KA)+A)+AoAA-N䨌 +.͍N$.͍N$-l*M,AaAdmČ-N. m*M $ $-l*MlADN . m*M D$ d. m*M DƥfAAA-n䨌nN(Ml. .͍dN(l,ɍ Č-N.AaAdmČ-N/DD$fAAdmČ-nM- dJ(hhikN(l,ɍ kAdmČ-n.̍dJ(hhjkN(l,ɍ kAdmČ-nD,M- dJ(hhKhkN(l,ɍ kAADN M--M M- d/D.̍d/%DD,M--eAAA-dm +.M Ō-nĉČ-n.AaADN - ʼn.&eAo`wA4pC #+Jsc#+B # +"+3Ks+sAccKc&// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef HARDWARE_DEFINES_HEADER +#define HARDWARE_DEFINES_HEADER 1 + + + +#if _HARDWARE_METAL +#define BGRA_SWIZZLE(a) a.zyxw +#define BGR_SWIZZLE(a) a.zyx +#endif +#ifndef BGRA_SWIZZLE +#define BGRA_SWIZZLE(a) a +#endif +#ifndef BGR_SWIZZLE +#define BGR_SWIZZLE(a) a +#endif + +#ifndef SHADER_COMPILER_HLSL2021 +#define SHADER_COMPILER_HLSL2021 1 +#endif + +#define GPU_TARGET 1 +#define PI 3.14159265f +#define PIh 3.14159265h + +#define EPSILON 0.000001 +#define UNIT_X float3(1.0, 0.0, 0.0) +#define UNIT_Y float3(0.0, 1.0, 0.0) +#define UNIT_Z float3(0.0, 0.0, 1.0) + +#define HAS_REVERSEBITS 1 +#define SEPARATE_SAMPLER_OBJECT 1 +#define double doubles_are_not_supported_by_some_gpus +#define double2 doubles_are_not_supported_by_some_gpus +#define double3 doubles_are_not_supported_by_some_gpus +#define double4 doubles_are_not_supported_by_some_gpus + +#define fixed half +#define fixed2 half2 +#define fixed3 half3 +#define fixed4 half4 + +float max3(float a, float b, float c) +{ + return max(a, max(b, c)); +} +float min3(float a, float b, float c) +{ + return min(a, min(b, c)); +} +#define INVARIANT(x) x + +float max3(float3 a) +{ + return max3(a.x, a.y, a.z); +} +float max4(float a, float b, float c, float d) +{ + return max(max(a, d), max(b, c)); +} +float min4(float a, float b, float c, float d) +{ + return min(min(a, d), min(b, c)); +} + +#define PRECISE precise +#define SQRT_SAT(x) sqrt(saturate(x)) +#define VS_OUT_POSITION(name) float4 name:SV_POSITION; +#define tex2Dgrad(a, uv, dx, dy) a.SampleGrad(a##_samplerstate, (uv).xy, dx, dy) +#define tex2Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xy, (uv).w) +#define tex3Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, (uv).w) +#define texCUBElod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, uv.w) +#define texCUBEArraylod(a, uv, lod) a.SampleLevel(a##_samplerstate, (uv).xyzw, lod) +#define tex2Dproj(a, uv) a.Sample(a##_samplerstate, (uv).xy/(uv).w) +#define tex2D(a, uv) a.Sample(a##_samplerstate, uv) +#define tex3D(a, uv) a.Sample(a##_samplerstate, uv) +#define texCUBE(a, uv) a.Sample(a##_samplerstate, uv) +#define textureGather(a, tc) a.Gather(a##_samplerstate, tc) +#define texelFetchOffset(a, tc, lod, ofs) a.Load(int3(tc, lod), ofs) +#define textureOffset(a, tc, ofs) a.Sample(a##_samplerstate, tc, ofs) +#define textureLodOffset(a, tc, lod, ofs) a.SampleLevel(a##_samplerstate, tc, lod, ofs) + +#define CLAMP_BORDER(a, name, val) +#define LOOP [loop] +#define UNROLL [unroll] +#define BRANCH [branch] +#define FLATTEN [flatten] + +#define EMPTY_STRUCT(name) struct name {} +#define DECLARE_UNUSED_MEMBER +#define RETURN_EMPTY_STRUCT(name) +#define INIT_EMPTY_STRUCT(name) + +#define HW_USE_SCREEN_POS +#define GET_SCREEN_POS(vs_pos) vs_pos +#ifndef TEXELFETCH_DEFINED +#define TEXELFETCH_DEFINED 1 + +#define CHECK_TEXTURE2D +#define CHECK_TEXTURE2D_EXPR(a, tc) 0 +#define CHECK_TEXTURE2DARRAY +#define CHECK_TEXTURE3D +#define CHECK_BUFFER(file, ln, name) +#define CHECK_BUFFER_EXPR(a, tc) 0 +#define CHECK_STRUCTURED_BUFFER(file, ln, name) +#define CHECK_STRUCTURED_BUFFER_EXPR(a, tc) 0 +#define CHECK_STENCIL +float4 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float3 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float2 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float4 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float4 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +#define texelFetch(a, tc, lod) texelFetchBase(a, tc, lod, _FILE_, __LINE__, -1) + +float4 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float3 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float2 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(StructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(RWStructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +uint loadBufferBase(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +#define loadBuffer(a, tc) loadBufferBase(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer2(a, tc) loadBuffer2Base(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer3(a, tc) loadBuffer3Base(a, tc, _FILE_, __LINE__, get_name_##a) +#define loadBuffer4(a, tc) loadBuffer4Base(a, tc, _FILE_, __LINE__, -1) +void storeBufferBase(RWByteAddressBuffer a, int tc, uint value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store(tc, value); +} +void storeBuffer2Base(RWByteAddressBuffer a, int tc, uint2 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store2(tc, value); +} +void storeBuffer3Base(RWByteAddressBuffer a, int tc, uint3 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store3(tc, value); +} +void storeBuffer4Base(RWByteAddressBuffer a, int tc, uint4 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store4(tc, value); +} +#define storeBuffer(a, tc, value) storeBufferBase(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer2(a, tc, value) storeBuffer2Base(a, tc, value, _FILE_, __LINE__, get_name_##a) +#define storeBuffer3(a, tc, value) storeBuffer3Base(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer4(a, tc, value) storeBuffer4Base(a, tc, value, _FILE_, __LINE__, -1) +#define structuredBufferAt(a, tc) a[uint((CHECK_STRUCTURED_BUFFER_EXPR(a, tc), tc))] +#define bufferAt(a, tc) a[uint((CHECK_BUFFER_EXPR(a, tc), tc))] +#define texture2DAt(a, tc) a[int2((CHECK_TEXTURE2D_EXPR(a, tc), tc))] +#endif + +uint stencilFetchBase(Texture2D a, int2 tc, int file, int ln, int name) +{ + CHECK_STENCIL; + return a[tc].g; +} +#define stencilFetch(a, tc) stencilFetchBase(a, tc, _FILE_, __LINE__, get_name_##a) + +#if !SHADER_COMPILER_HLSL2021 +#define select(a, b, c) a ? b : c +#define or(a, b) a || b +#endif + +half3 h3nanofilter(half3 val) +{ +#if HALF_PRECISION + return min(val, 65504.h); +#else + return select(isfinite(dot(val, val)).xxx, val, half3(0, 0, 0)); +#endif +} + +#endif ZYW[YZYۛX [=xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPI3s#+3B +"*:bz +bBbbjP!+3Ks+B +"*:bz +bBbbiPhPIsc#+A # +"+3Ks+sAccKiPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  K3c{  S S+sS kPhP@ c3{ACA c3 Kٓ+s S kP@ c3{ACA c3 Kٓ+s{AC S KkP@ c3{ACA c3 KC c3 S  Q +s Q kPhP0c{ c k+#zC1c{ b1c{ J+s{Ci C CJaq1KaJkPhP0c{  +s;+szzc#C1c{ c1c{ rJiPkP+sicCrbKiPkPhP0c{ 9*rB1c{ qJiPkP1c{ riPhP1c{ {CqbrJJiPa+C{CqbrJJab+C)Jbzrb!{CbJIIiPq{k cK+CJiPhP{s1c{ q{k cK+C{CqbJIiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ 9*rB1c{ qb1c{ JiPkPq{k cK+Ci!{CbqJQqJiP{s1c{ {CqbJiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ aKs+ K+C1c{  #*Cc1c{ !+{#+"+CKiPkP+sC!+{#+"+CsY!+{#+"+CsQ #*CKiPkPhP)s#K3 E_tʸʄʸ\\\\ʸʸʸ\ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBB\Y[țXYB‹J[X[\X[X]^[X[\XX[Y^ ٛ H[Z[][X[\X[XX[Y +\XZY[HH\XZY[\[\H_B_KB [[ۛ +HS +ؚKBYY[PPїQPSMYY[WPPQSԗTVNYY[PPQSW՗QPTVH MYY[HTQRPWSԗQPTVH NYY[TSUғWSԗQPTVHMLYY[TSUғWSWSSH LBYY[SPWSRSїГSSH NBYY[RQїӓTSLYY[RQWQSTULYY[HSWQSTғ YBYY[ӓPӗPQTQȑWYY[TUQӗPQTQȔWBHY[[\B +ț[ؚKBYY[TQQWR +^ +^YY[TQQ +^ +TQQWR +^JB[X[\X[XZYYY[\^؛]HY\ٗ]ZۛXPY\YHTQQӓPӗPQTQVN؛]HY\ٗ]ZT]YPY\YHTQQTUQӗPQTQVNBH[[HۛXPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]ۛXPY\Y^NH_BH[[HT]YPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]T]YPY\Y^NH_B_BH\ [[\B ӛ[ؚKBYY[ГP +\Y [X[Y +\YȈ[X[YYY[ГP +\Y [X[Y +ГP +\Y [X[YJBYY[ӓPאPQ[X[Y +ȘXYГPӓPӗPQTQ [X[YJYY[TUQאPQ[X[Y +ȘXYГPTUQӗPQTQ [X[YJBHY [[/@cCPh)BEcl BK90241:2΋SX]\\X[X[P\ًˋKY[؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ6,Qq1AP mZ5&ʵAh ؠ067AP l̆kL &JAp ؐFmkFkLqܘ L8i1nmlxc`i@HkmN̬Ln<&h{p h 6㱁ȍ LjL1p@ lydž6C=6 aap dž5=6 AhPШȒ%@|] : @O0Ik ;+J+!b + +%~PH#!b + +Lئ%BP !JUP(7?Ȍ%KY 2؃X%Bp{k c[f`U8PHu<%ŠKs{k c +- +k",Ml.m\0( DpE ˠBpanoramaTexCoordD`F2P &6VFÌ-fX6"? nٵM ]KY[[- +]KYݔ@.,̽ɍѕM)./@[X YY[ܔ`E2V'7VfVV6% ;dx.source.argsSհBbW&76%p 'dx.valverSذC2FV&FV6% 3dx.resourcesSDBWFF67EXCRF'F77%yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ?`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqmp UDT:P `>r! <D@3,98;?8m pK,DITm pO5QNNDmۂ4\ >r <>m +βT?_ Ea OA,G@ RW %R2Vv3tRr@.^  +c?$8(`0F 3c / `0F #0&J+LW 0AnaA  &8Lp 0Aa@ &;L~ 0Ahb # `q# `A0b ]DL# `0b` K(Ht0b` (Lt0b )`Ì- B +u?X?0a`3D A0a b +v?`?0c@|)Lj  `î  f3GB~ b +w?`?0a\Ԍe` +aO@" c@ TA" $SȏA0@P^& 31 38 >3l&<0F a=<\1 @`@ V! `4f 1x?F i=>\1 `V!DF i=>\0F i<Zh1 [Aό!)|f 3V!D3c@f +aA" U.g"&`0F ?tf 3V!DF >t&  P +nj* +]0dX L4c 0F Q`wf 4V!DF ɅP`w& A0@r5A `C/B3c@ +!X0V0B+< 0hƄ@0& A0@~8B UA0@~8 `@ _!|aX0kЭB`HY&  0 Մ@0& 1a `@ r@aƀXiBd@ r8a1@Lq0,3c@BXRgĒτ` U$L6H0,3c@ABXgdτ` `BČ>|& A0!`ƀhfBd@ v@`τ` `@ zXaƀA0@S `@ zXaƀdd@ za@όaM ##`pC+ Qτ0aMG߄0qM߄PtÁ@N Lu:ar`T$\{ > \ a.Ȉ B\hA> ²\[ `!d03a ?b?e 0b K #?0a<A + 0  +3t ?4?g03t&00h1L#`0:+9ÌojR5mQnRuoXn[voowmrmuзnxwo}иmnS6mZ6o\7mpԷms7nvny8mԸn8oqFW}vW}WW6`;AI <@h`M@cKHFB@_JP4&P?DE_ۃ V,0ff,0Ե mhC[8pX8[X8X8[ O5QO5Qۃ)Iq,DK,DSTAT$ `IDXIL BC! @ #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L c2" d##ㄡL L @` b `7 ?a!+! +c!'!$?a!P&10 cBOA(*`45\=sU#0BTc5G1(F `!a܀á!  @!P`$0P@  P@ |`@lt`H:f"q`pypYZ(|zrR{(qw>0vxp6:0pn?4ҴQEADH0 o&g!"v&rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 3v0`@&` ;`a ` b0 `! L000!`s@!C< y, d@G2L &GCj`R (B(r((b(`,AAA A@APAAA?AA?A2AA@A AAAAAa,A@_@AP@APAAAAAAA2@_AAAAA2@APAAAAAApgyLFD oM $Efe%&,f&gl&eCL m`l  m |h@.M.-싮 Nl`t ͆P<0HRcubemap_texture_faceLڰD3M!&ct&F!  d2`*texSamplerbb A*͛ 01 +Kr#+Û &5A b@4e@,ll*Ml`T ƀ 20`f `P$ m!p o@ch),mÀa `Cq|s@Ì-nn`P,&D M ]ݛ\47 JA z0TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+x\ʂju\sЅ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq <`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqmp UDT:P `>r! <D@3,58;?8m pK,DITm pO5QNNDm4\ >r <> ILDN,$88bfee0f276de6b9a2ccbfe1cc9b0016.pdbHASH'm湢̛̿DXIL` +`DXILH +BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L c2" d##ㄡL L @` b `7 ?a!+! +c!'!$?a!P&10 cBOA(*`45\=sU#0BTc5G1(F `!a܀á!  @!P`$0P@  P@ |`@lt`H:f"q`pypYZ(|zrR{(qw>0vxp6:0pn?4ҴQEADH0 o&g!"v&rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@:$!#EDL00 0v0@&a ` 0 n7 `av0 C< y <@ 0䉀`3@!OY D2L &GCF((b(`,AAA A@APAAA?AA?A2AA@A AAAAAa,A@_@AP@APAAAAAAA2@_AAAAA2@APAAAAAAp*gyELFD oM $Efe%&,f&gl&eCL l`\ a0(MjÀ$ p6$φ LhBH A 4Mφ l@!6 `Bd A !6Qm"146A0 a  6paPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq <`p 8yqo>mni_ù6py8yq~mnioùvpy!8yqmp UDT:P `>r! <D@3,58;?8m pK,DITm pO5QNNDm4\ >r <> a A,G@ QW %R2Vv3%W _ 0FL2 c 70F  c 7# `A dsilr0b D\$AVn@#`p#`p#``5hB\=} LpcA|cA".g-±BY@ A0V0܂)4+n + 4c8´aZZ0P A0,cI%K,  >6H$%|,c31g`@ "t(A!10 N!|,3b` ;B`(Qp7qA G~0|_N7HPƠ Qh!^!ψ L  hA>&|n!@r!@x<AS + 0  + 0  0@ #`:+8DXBCub Şĺ(, DTdt,%<%X%SFI0ISG1OSG1PSV04  CSMainILDB`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  bI`B L 2" d##ㄡL L@ +@@ s`ppJL>rۨ88J.BCJQc98˟VbF8QX8 '!$ۨb%&mDqB:9ˑGEVQc9qrq i1;<̃B9=ԃ<C9=C9) Ɓa hAAHƁAaܡ   \GLa00n@ PPr@ +|`@~z P(8fƁa hAAH́!$M%L~\Ιi Ɓa dfƁAʁDAʁH!!#qDFrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y @@0䙀`c `!Y 2L &GC" +2(B((R((r(F q"gsyLFnl . ,. N.l.mm=271 47:vector 812@ E Bd%`0["DV`@o4Y ( AaelementJؔ}չMdZL!D`T" +!,`Cpj +KscQF7ˮlMm.̭ $͍dƇL\ڙ[H  X!,dЁEXȠ0XM#,dЁl mĀ&,`ac,bK P0 ! D4`CtHб+{IscY!,tEX 0 LeZ!I (,6E `up~怎Ȅ䀀f~H䀐H`b-9*c33+c'u5E'W7FW'WF&TgfV&WFFC2pyC #+{Isc#+{kk{s˃+sAccK4{0J+c# + PFƢ.͍]ݛO\ڙ[H "h!R E ,B + "h!R "hHAT0@(B)LeZA Pa D`,bP`4~,H,X12p0b4,H`aL} @,,H60 = 0hHձ ՙXH]MՍɕ ՙUAᕱхm[s[ZRDDUGW'W1*ã+!+{sK;s+#IscY6*lta `7J"*ã+!*ã+!!+{J" +ڶ @  NU]\ [ϲ^aC @P @AQU]\Ќ U]\ PPж8_  ܂/è'  050`Ct&gbU&7at8JDebug Info Version8PiC0F@D\DF@Dܾ\DȄx؈|@@t@P`Rvdxh|@@t@P`Rvdx|@Ш@t@PbRvPȄR@t@P`R@@@@d@vvPbX@bX@bR@Pf@@t@ШȒR@@@@@h@@z@\PfPX@`RRv@@@@@@z@Ш\PfPX@`RRv@@@@؈@v@@@@@@@@\@z@v@@@@\@z@v@@@@`@z@v6A; \ʸܾ\Ҩ.// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; +wSX]\\X[X[P\ WY[؛\WY[\YW[Y[XZYZYYY[ٜ :xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPhP ;k ys+kPhPxQiPq k+ +q kPkPq k+ ++s+kPkPyy!{s;i [+q++#q k+ +Aq љ+s+KKs+CK1Kc+I+#C #+{kKc+kPkPkPPyiPhPxyzkk{sAZY s#AbbJc{iPhP!+3Ks+*2 +*zriP!+3Ks+*r*j +bzZJ*iP!+3Ks+*j +*r2 +*J*iP!+3Ks+I +"J +r*j +2 +*J*iP!+3Ks+*2b*Jzrj +2 +*J*iP!+3Ks+*2b*Jzrj +jJzriPhP!+3Ks+q +j +ZJrrJr:zr*zriPhP!+3Ks+B +"Jr:rzj +biP!+3Ks+B +"Jr:*jJJ*iP!+3Ks+i +*jJJzrq1kPhP!+3Ks+9bz +b22**2J9jP!+3Ks+ʚ*j22**2JjPhPI3#+3cckPhPxyZYyscc{iPhP!+3Ks+Jr:J2JjbBKkP!+3Ks+Jr:J2BKJr:J2JjbBKiPhPp k+ +q љC #+"+3Ks+kPkP{s+Ã) cљKs;K+9b{ c33++3KJr:J2B9bz +b22**2JJiP{s+Ã) cљKs;K+ʛ+k33++3KJr:J2Bʚ*j22**2JJiPhPIscKs+{{cI;b{ c33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCC9b{ c33++3KKiPkPhPIscKs+{{cIʛ+k33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCCʛ+k33++3KKiPkPkPhP)c+yycckPhPxyAbbzscc{iPhP!+3Ks+zr +B+3Kcq k+K+3Kq k+kP!+3Ks+zr +B+3Kcq k+Kzr +B+3Kcq k+KiPhP!+3Ks+9bz +b22*Bq k+K33+zr +B9bz +b22**2Jbq k+KiP!+3Ks+ʚ*j22*Bq k+K33+zr +Bʚ*j22**2Jbq k+KiPhP)s#K3yycc r,KC`Pa A,D1PrEPeGI Ay30&OL; q0A8`p# ``ARp4c@HS# ``Rx5a$eyՄ0b 0Y Li`0c@DghBL B0a4O1BEQ4c@DR#`PAӿ?ђhBhL 0a&Ä0b P eY֌!Mi AQ?`!?0c@PO 0c@HS#`PA$?Ғ vC&ÿ30b Ä0b Ä0b Ä0b TQ4c@dW# `A威LZ@8ru3-qMTDqMTD`,DFB@YLUDKSD S@5QQ:`5LK\ Tص5QO5QSTAT`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  I`B 2" d##ㄡL L@ +'!$%|Q1 0 T3\=@3, +1 0 !37 ?a!+! +EQ(p 0 @QOCH>QJL>rۈa(3=sA11 (QEca +a&:vy7rzy(9 >rzxyzpyHspr 0Hw6:0=ЃvHx_|r@0S;<̃B9=ԃ<C9=;B8C8 +@ +p9lj* +"BH(rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y <@0䑀`C @,2L &GCJ`J0 + ʠJ +D( @ pgryLFD oM $Efe%&,f&gl&eCLc0   l p$"2<:  Le@4BYb`gadШ&A E00ĴAx ld&C3A lmBXA Xeۆ AGHkML̬Ln0<b`C` m 20b@ Al50hg&C4A 0m@60 7depth` r`s҆A: G.MnMln܁nol6ԁA6`CaTSX 0 "@6{ +49 P+b{ #cBW5G&W(S8*llvm.identS +]\ڛ۔hBbfW&7%(̡5M 2dx.resourcesS1DBWFF67E?CRF'F77%.dx.countersSTyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq `p T;PEADD_ܶT;PEADDܶ l;/TQQCIm4\BDͰ&P rILDN,$f27b78a72e9a481ac5815ea0a7fc7b03.pdbHASH{x.HŁ^{DXIL`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  I`B 2" d##ㄡL L@ +'!$%|Q1 0 T3\=@3, +1 0 !37 ?a!+! +EQ(p 0 @QOCH>QJL>rۈa(3=sA11 (QEca +a&:vy7rzy(9 >rzxyzpyHspr 0Hw6:0=ЃvHx_|r@0S;<̃B9=ԃ<C9=;B8C8 +@ +p9lj* +"BH(rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y <@0䑀`C @, 2L &GCJ` J$ +P +2 g nyJLFD oM $Efe%&,f&gl&eCLc0  a0(MeÀ$Le00ِ CCC<o 6$C&b@MgE ن. ô 6A(jBt A !6146A0i0@a6Al(@ 00*llvm.identS +]\ڛ۔hBbfW&7%0̡5M 2dx.resourcesSK\[ܔ yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq `p T;PEADD_ܶT;PEADDܶ l;/TQQCIm4\BDͰ&P ra 0A,4\b@%0PA # ` yJiшA HRp4b 0M# ` Act5bp ,7 B0b @E$IhB&h &ÈA 0lP-fpu] 0b XQ4b XP<DXBC'rZ(l[2 DTDxSFI0ISG1`HQPOSITIONSV_InstanceIDOSG14(SV_PositionPSV04 +  POSITIONdebug_point_lights_vsCADILDB`uDXILBC! u #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 82" d##ㄡL L@ +@@ 3s`0G@$AH) HS A '!$ۨb%&mDqPrpͰ( +!BS)8bHH ađy#M 9_"1qN#MUDm4,i(aWeDcBii (]n?4H$!)rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`30 !Y 2L &GCB + F + +X@ +<J@ + +0@ +8 +P@ʃ(R((fogh(yy=sLFDL- nk-Lmm=271 30:Bvector X12@ E h 0 1@h%``0 1@h%`0 1@h%`0q element@Jؔ}չqHscdPVp@Ya&A`h @,b ƊL -͍- nnS\E |#H0'4`aj. [ !17930:E  0Y 00E 4 ( &H2`0$@X"h>A70`C `puintd@,9, Al&j;  Aphc̡ͽՑqѕɕ}ѹͱ >pj K1c{ caP0`8|,bF30 W"hHA0sH @a8|,b30 ×L"hPA0sH @b8|,bF30 ,×"hXA0sH @c8|,b30 <L"h`A0sH @d8|,bF30 L"hhA0sH @e8|,b30 \M"hpA0sH @f8|,bF30 l"hxA0sH @g8|,b30 |` +P + + + P Dk΍nZA8X7:7i`]Ia 8@9 s1@8i:bJ;Czs33+!i Kj"!ڶf@Tھx?globtm_inv@GB_LightConstBuffer@@3V?$matrix@M$03$03@@B@>ց ܘ\Y]ۛ"0 (̍ɕ}}ѽ}ѕ፽ɑ }1 ՙXؕѽ5 m[px4x :world_view_posă796//9#/3479::329 179& m 0}-- nk΍E] /179:32247:E Bt` "h:0XM#T@`0y `l$: 6 {* 0~1eB$A[[[[ДS[SЌ]ݛP жz + :omni_lights_cb|ҘI-b$` $*colorFlagsA>jb 0 E&W6FEW57V胪&6boxR0a>jb 0`!'胫&6boxR2>jb 0)`6'UF$v5V&FV7胬&6 IJKLL$  E `5671 A A[[[טДS[SLPTYS[Sж Fspot_lights_count97/34:7:))7:349 179$ m <97/3411>RenderSpotLightt1@}`)3477 30E ЌE|j0cK;C#J+K{s r;c+{23+[MY`" /kn,l4gaHB,,bL`@Z,b3P `k 97/3411))7:349 (*272)7:34: m ?229ҁZYK[YW]Z\ YY[]ڛW[ݜ [ڠ `@l[x .FA.(m[ .HA.8ȅm[ .JA.(m[ .LA.H܅m[ .NA.(m[ .PA.(m[ .^A.(l[ .`A.(l[ .bA.(m[ .dA.8m[0 .fA.X݅}}Յɕ}ѕm[@ .hA.݅}}Յɕ}ѕ}}m[P .jA.݅}}Յɕ}ѕ}}m[` .lA.8watt_per_square_meter_per_sr_per_nm@>\[ ]\XXW[]\ל\ܗ[۶""ٶb"ٶ"\\\]\W[]ܶ"\\\]\W[]ܶ"TTSUPUUTUe-Ln%m+mL셮 Nk.Mlm-m-|Eo +rjJ +r**¢*B*J:Bڶo@mj(H*苪J諩k*IhGxF *"$/",*/$m FAĒ-|Jo0K +"J +r**¢*B*J:Bڶqo,nj)h *)I+*˩)(HjjGzF`j)hꫩ* kj(H*+ +J kzF/*$m A-|Ool0uhx pȋ苿(Hh׈٨  @`QO@@@pz0A@6Dwarf VersionQXHU\ڛۆa>C 6Rxyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPIsc#+C #+"+3Ks+sAiPIsc#+C #+:c{ csAccKiPIsc#+c++#{{KsbK;CsAccKiPhPKrkPkP1c{ {zJJzriPiPhP{kPkPzzJJzrB{KiPiPhPʚ*j22*ByjsKcJ;CKiP+;K+CIiPkPKsyksKbK;C{siP*s#+{jsKcJ;CyksKbK;Cj +zjrJbJ:BiPiPhP{!+;{KsbK;CCKrIscKsyksKbK;CJs#+Jr s+K"JiPkP{yiP*s#+{jsKcJ;CycyksKbK;CzksKbK;CJs#+iP1c{ { +s# #Kycs{ +#KiP1c{ {c#z{ +s# #KsYIss{sQ{ +s# #KsQqiPys{icCic1c{ A{c#zcIIiP+syiPkPhP0c{ !+;{KsbK;CC{IsKiP +;+kPkP+s1c{ AaaaIiPkPhPʚ*j22*B{cJ;CK+;K+CIiPkPKs{bK;C{siP*s#+{cJ;C{bK;Cj +zbJ:BiPkPhP{!+;{bK;CCKrIscKs{bK;CJs#+Jr s+K"JiPkP{yiP*s#+{cJ;Cc{bK;Cۚ{bK;CJs#+iP1c{ { +s# #KcsaK;Cz +#KiP1c{ {c{ +s# ++s K{scsaK;Czc{ r;c+ c+iP{c{ +s# ++s K{ss C{c{ +s# ++s K{ssKiP1c{ !K +s;c+csaK;C#J+K{s r;c+{23+iP{s1c{ aK;C r;c+ c+{c{ +s# ++s K{ss iP{s1c{ aK;C r;c+{23+!K +s;c+s iP1c{ +K" c+cs+K" c+siP1c{ {{+iaK;C r;c+{23+yaK;C r;c+ c+iP1c{ A c3 +sCyA{{+Q{{+KiIiP1c{ y3iPI3A!{CIss{cIss{KIiPkPy3 s;+s{{c#Cq{k cK+C1c{ AIss{sQA c3 +scIss{sKIa!K +s;c+sKiPkP)c+kPkPy31c{ AaaIiPkP1c{ {c#z1c{ A{ +s# #KsYy3sQA{ +s# #Ksy{{+KaIiPys{icCic{c#zKiP+syiPkPhP0c{ !+;{bK;CC{IsK +;+kPkP+s1c{ AaaaIiP A4pC #+Jsc#+zc{ +KcKsAccc9// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY +// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR +// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. +// +// Developed by Minigraph +// +// Author: James Stanard +// + +#pragma warning( disable : 3571 ) + +#ifndef __COLOR_SPACE_UTILITY_HLSLI__ +#define __COLOR_SPACE_UTILITY_HLSLI__ + +// +// Gamma ramps and encoding transfer functions +// +// Agnostic to color space though usually tightly coupled. For instance, sRGB is both a +// color space (defined by three basis vectors and a white point) and a gamma ramp. Gamma +// ramps are designed to reduce perceptual error when compressing floats to small integer +// values. More precision is needed in darker gradients as the human eye is more sensitive +// to contrast with dark values. A logarithmic curve is often used. +// + +// sRGB is both a color space and a transfer function or "gamma ramp". (It's not a true gamma +// curve, which have been deprecated along with CRT displays.) sRGB is what almost all 8 bpc +// textures use, and when passed to an LCD monitor they look right. sRGB textures must be +// linearized for physically correct rendering, and the linear results need to be re-encoded +// with the sRGB ramp for display. +float3 LinearToSRGB( float3 x ) +{ + // Approximately pow(x, 1.0 / 2.2) + return select(x < 0.0031308, 12.92 * x, 1.055 * pow(x, 1.0 / 2.4) - 0.055); +} + +float3 SRGBToLinear( float3 x ) +{ + // Approximately pow(x, 2.2) + return select(x < 0.04045, x / 12.92, pow((x + 0.055) / 1.055, 2.4)); +} + +// These functions avoid pow() to efficiently approximate sRGB with an error < 0.4%. +float3 LinearToSRGB_Fast( float3 x ) +{ + return select(x < 0.0031308, 12.92 * x, 1.13005 * sqrt(x - 0.00228) - 0.13448 * x + 0.005719); +} + +float3 SRGBToLinear_Fast( float3 x ) +{ + return select(x < 0.04045, x / 12.92, -7.43605 * x - 31.24297 * sqrt(-0.53792 * x + 1.279924) + 35.34864); +} + +float3 accurateSRGBToLinear(in float3 x ) {return SRGBToLinear(x);} +float3 accurateLinearToSRGB(in float3 x ) {return LinearToSRGB(x);} +// The OETF recommended for content shown on HDTVs. This "gamma ramp" may increase contrast as +// appropriate for viewing in a dark environment. +float3 LinearToREC709( float3 x ) +{ + return select(x < 0.0181, 4.5 * x, 1.0993 * pow(x, 0.45) - 0.0993); +} + +float3 REC709ToLinear( float3 x ) +{ + return select(x < 0.08145, x / 4.5, pow((x + 0.0993) / 1.0993, 1.0 / 0.45)); +} + +// This is the new HDR transfer function, also called "PQ" for perceptual quantizer. +float3 LinearToREC2084(float3 L) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Lp = pow(L, m1); + return pow((c1 + c2 * Lp) / (1 + c3 * Lp), m2); +} + +float3 REC2084ToLinear(float3 N) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Np = pow(N, 1 / m2); + return pow(max(Np - c1, 0) / (c2 - c3 * Np), 1 / m1); +} + +// +// Color space conversions +// +// These assume linear (not gamma-encoded) values. A color space conversion is a change +// of basis (like in Linear Algebra). Since a color space is defined by three vectors-- +// the basis vectors--changing space involves a matrix-vector multiplication. Note that +// changing the color space may result in colors that are "out of bounds" because some +// color spaces have larger gamuts than others. When converting some colors from a wide +// gamut to small gamut, negative values may result, which are inexpressible in that new +// color space. +// +// It would be ideal to build a color pipeline which never throws away inexpressible (but +// perceivable) colors. This means using a color space that is as wide as possible. The +// XYZ color space is the neutral, all-encompassing color space, but it has the unfortunate +// property of having negative values (specifically in X and Z). To correct this, a further +// transformation can be made to X and Z to make them always positive. They can have their +// precision needs reduced by dividing by Y, allowing X and Z to be packed into two UNORM8s. +// This color space is called YUV for lack of a better name. +// + +// Note: Rec.709 and sRGB share the same color primaries and white point. Their only difference +// is the transfer curve used. + +float3 REC709toREC2020( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.627402, 0.329292, 0.043306, + 0.069095, 0.919544, 0.011360, + 0.016394, 0.088028, 0.895578 + }; + return mul(ConvMat, RGB709); +} + +float3 REC2020toREC709(float3 RGB2020) +{ + const float3x3 ConvMat = + { + 1.660496, -0.587656, -0.072840, + -0.124547, 1.132895, -0.008348, + -0.018154, -0.100597, 1.118751 + }; + return mul(ConvMat, RGB2020); +} + +float3 REC709toDCIP3( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.822458, 0.177542, 0.000000, + 0.033193, 0.966807, 0.000000, + 0.017085, 0.072410, 0.910505 + }; + return mul(ConvMat, RGB709); +} + +float3 DCIP3toREC709( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 1.224947, -0.224947, 0.000000, + -0.042056, 1.042056, 0.000000, + -0.019641, -0.078651, 1.098291 + }; + return mul(ConvMat, RGB709); +} + +#endif // __COLOR_SPACE_UTILITY_HLSLI__ҁ ZYW[YW]Z\W]Z\\\Xۜ [ٜI3s#+3 jzB** + +j**jP!+3Ks+ jzB** + +j**iPhPIsc#+ k{C++{!+3KsKK{ssAccKiPIsc#+ k{C++{!+3KsKK{ssKsAccKiPhPxQiPA k{C++ k++yAiPhPKs;C+ {+˃+c+ sq{!+3Ks+C+ k++y3y k{C++kPh{#+cs* KCC+!+3KsKK{sy3!+sK{3Kc+cCKC +q++#+#1{kP k++C !++s#ysC+ cK#+iPPyiPhPxQiPB+ k{C++ k++ +C+s!+3Ks+#C+1{cc{Ks;iPPyiPhPxyCKI{s33+r{Ii+ cK;s+#{1c{ iP k{C++ + k++kPyyB+{c I #K s+ C+{y3C+ k{C++siPI #K s++k{c J #K s+iPyyB+s; s;c  #Ks +sKs;C+Ikc+k+s K{s+ {Kk K{skPyyC  + cK#yscI3CK s;c+Ik cc+C sq #K ssiP r;c+s +s;c #KiPhPyyB+ +Ks;{+33KK+sy3 Ki{c+c+ C+ cK#+C++C+KkPyy!+sKIi KkkA ccC+{{ky3C+ k{C++Ka  1sK{sy3kPyy +c+s;CsB+ +Ks;{+33KK+s  cK#+AI) c{kPyy9 c+K;C +Ks;;Kk+9 c+K;C"+sK; CK cK#+siP +Ks;+k c+K;C +Ks;iPyyB+!+sK{3Kc+y3 Ki{c+c+cIs)s 1sK{s1{k cK#+{kPyy!Kk+sK{sc+ c++++sAqcc!+sKK s#Ai Kkk!+sKKqiPyy!*sK˃{3Kc+ c+K;C"+sKiPqk+ c+K;C"+sK +cK#+*Ã+kiPhPyyB+ +Ks;{+33KK+sy3 +{{c C+ cK#+C++C+K!+sKkPyyIi KkkA ccC+{{ky3C+ k{C++Ka  1sK{sy3kPyy +c+s;CsB+ +Ks;{+33KK+s  cK#+AI) c{kPyy9iK+ +Ks;;Kk+9iK+"+sK; CK cK#+siP +Ks;+kiK+ +Ks;iPyyB+!+sK{3Kc+y3 +{{ccIs)s 1sK{s1{k cK#+{kPyy!Kk+sK{sc+ c++++sAqcc!+sKK s#Ai Kkk!+sKKqiPyy!*sK˃{3Kc+iK+"+sKiPqk+iK+"+sK +cK#+*Ã+kyy{#{i [+i{+{CKK +#kPhPyyB+)ãKsK{s{+33KK+sy3 +{{c C+ cK#+C++C+K!+sKkPyyIi KkkA ccC+{{ky3C+ k{C++Ka  1sK{sy3kPyy +c+s;CsB+)ãKsK{s{+33KK+s  cK#+AI) c{kPyy9iK+*ãKsK{s;Kk+9iK+"+sK; CK cK#+siP +Ks;+kiK+*ãKsK{siPyyB+ k+ k++1{C+zs++kB s[C +1sK{s1{C+kPyy +{{c1{ #+K;CsiPqk+iK+2{ # +Ks;+K;CiPhPyy+{s#iK+a +kPqk+iK++s;Ccyy s+K;;+C sqi [Ks;I+c K+{9{kk{siK+;iPiK+ +cK#+cyyC++A s#+c{K+s;CIiPiK+"+sK +cK#+*Ã+kyyiPqk+ ##Ks;iPyyB+)ãKsK{s{+33KK+sy3i{c+c+C  {aK;CA)s9sy{s+K kPyyC+ cK#+C++C+K!+sKIi Kkkc  1sK{sy3 +c+s;CsiPyyB+)ãKsK{s{+33KK+s  cK#+AI) c{kPyy9 {K{s*ãKsK{s;Kk+9 {K{s"+sK; CK cK#+siP +Ks;+k {K{s*ãKsK{siPa*s;C {K{s"+sKj +cyy {K{s{3Kc+ kPhPyyB+ + ;+ c+#{y3C+9{s#siP!Jk+sK{sc++k9{s# +c+#{iPyyB+{Ks+y3C+i Kkks+sKC s;c+1{CKC k{C+K +Ks;kPyyi++{k+#A1{i Kkk+KK{sc+C+k cc+s+sKCkPyy s;c+K+c#Ks;q+;cK;Kc+[aK;C #K s+ c+s1zIs s+c1{C+kPyy) +C +c!+;++I 9{{#C{K+iK+c#Ks;ijKsiqIqiPqk+ijKsyy{++k{+#kPhPyy+ c+#kP!Jk+sK{sc++kiK+*ã {c K{s{+3iPqk+icKc+ +Ks;2 {iPhPyyB+!K s++++sC+c s++s+ s#C+{{ky3C+ k{C++siPa*s;C{{k #KiPyyB+!K s++++sC+c s++s+ s#C+{y3C+ k{C++siPa*s;C{ #KiPhPyyB+ k+ k++1{C+zs++kB s[C +1sK{s1{C+kPyy +{{csiPqk+iK+C +2sK{s2{ #:iPqk+iK+C +2sK{s [ #:iPhPyy1c{ AqY9Q9ciqQ9KQ{CqQAqi9Q9KyAqY9Q9KaqyiqIiPyyyKkK+#iK+C +{+3kP1c{ iK+C +{siPyyB+!+sK{3Kc+y3 Ki{c+c+C  {aK;CA)s9sy{s+KaIs)siPyy 1sK{s1{k cK#+{!Kk+sK{sc+ c++++sAqcc!+sKKiPyy s#Ai Kkk!+sKKqiPyy!*sK˃{3Kc+ {K{s"+sKiP1c{  {K{s"+sKbKs+ +kiP1c{  {K{s"+sKbKs+ +kiPhPyyAyy)ssK[K+#K sy;{K[K{YKC{3+kPyyY+cKsYYKC{3)33++cIsAqɡaqɑaIiPyy1cci{{saK;Cs+I ! [+kP!Jk+sK{sc++ki{{s{c{yyAqɡaqɑaIQq!+3 csB  33+[ s#i{{skPqk+sK;Cs+yyCKI!+3 csC  33+)+ˣCKs;c[ s#skPiPhP)s#K3  \ʸʸ\HYHURTQQSUғTYY[HURTQQSUғHLYY[S[]YY[U][[]YY[H[[]YY[[Y[[]YY[][]YY[S][[][]YY[S]X[]YY[H]\S[]YY[H\Y[]YY[[][[]YY[S]XQ\][]YY[H\YZX[]YY[TYZX[]YY[\\][]YY[\\[\YZX[]YY[\\TYZX[]YY[\\TYZXQ\][]YY[X]\[YXZ[]YY[H]\[Y[[]YY[S][[\]\][]YY[S][[X[]YY[H[][[X[]B HY[\Y]ڛ[U][[[Z]\KYY[H\\\][L HY]ڛ[U][S]XKYY[QZ[\ڛ[\\][L HY]ڛ[U][\\]KYY[]\\][L HY]ڛ[U][\\[\YZXKYY[H\YZX\\][L HY]ڛ[U][\\TYZXKYY[TYZX\\][L HY]ڛ[U][\\TYZXQ\]KYY[TYZXQ\]\\][L HY]ڛ[U][X]\[YXZKYY[X]\\\][LB H\]ڛH  [][]\KYY[\]ڛ[L HH[Y\]ڛ]ݛH  H[[][]\KYY[Q\]ڛ[L H]ݛț [][[X][]ٜKYY[S][[X [L H]ݛț H[][[X][]ٜKYY[H[][[X [LBYY[RRTTTUTSPUTHLYY[SPSPUTUUTHLBHY!DDt5FV&7Ǖ6VGVF6V&WEVfF6UF76ǖF@F@@bF@D^\DF@Dʾ\D@d@@dxh|@v@@@vv@f@@fxh|@v@@@vvd@ھdPdxh|@X@@R@d@v\zv\@z@v@vf@ھfPfxh|@X@@R@f@v\zv\@z@v@vF@dڜPR@ھdPX@FFRF@fڜPR@ھfPX@FFRF@ʨ@dF@Ψ@fF@ȦΨ@dF@ȦΨ@fF@ȦΨ@fF@Ψ@fF@Έ@fF@ʨ@dF@ʦΨ@dF@PR@F@PR@@F@PR@@F@F@PRF@PRF@d@dF@h@hF@f@fF@PRF@PR@ڌڨPh@R@@\v@ڌڨPh@R@@\vʦ@ʦڌڨPh@R@@\v@P@X@@R@@PXRvh@ʾPd@X@d@R@@@\\ʘP\X@X@`Rvh@ʾPf@X@f@R@@@\\ʘP\X@X@`Rv^Txf|@x^f|x|@@@@@@@@@@@t@PRX@@PRX@@PRX@@PRX@@PR@@PRtT^@@@@z@b\`v@@@@z@b\`v@@@@z@b\`v@@Ȃ@@z@b\`v@@@@z@b\`v@@@@z@b\`v^Tx|@@@@@@@@@@@X@@@@@@P@X@@X@@RtT^@@@@z@b```\`@T@v@@@d@z@@T@v@@@f@z@@T@@T@v@@@@z@@T@v@@@@z@@^@bp`\`v@@@ʾ@z@@^@dv@@@ʾ@z@@^@Pd@T@Rv@@ؒ@ʾ@z@@^@Pd@T@Rv@@ؤ@ʾ@z@@@@@^@Pd@T@@T@Rv@@ؤʈ@ƾ@z@@@@@^@Pf@T@@T@Rv@@@@z@@^@v@@@@z@b```\`@T@v@@@Ⱦʾ@z@@^@dv@@@Ⱦʾ@z@@^@dvF6$R"d902941:209822.:179494֠Q5=MA!I}U9 Q%=9M}!1M1%}%9 1U5(Q5=MA!I}U9 Q%=9M}!1M1%}%9 1U4(ɅɥѥсɅ͵х͕́ɽɥչѽ4(ܕȕсс5(4( ɥс܀ɥչѽ5(ȥ́ȕ͕ٕ4(4(Hɥѥ͕̽ɍ偘ɵͱܥѡɁܥѡ5(ѥɕɵѕɽ٥СсСݥѥ5(ɕ4(ĸHɥѥ́̽ɍсȕхСٕɥ5(ѥС́сѥ́Сݥ͍ɹ4(ȸHɥѥ́偘ɵсȕɽՍСٕɥ5(ѥС́сѥ́Сݥ͍ɁС5(յхѥɁѡɁѕɥ́ɽ٥ܥѡСɥѥ4(̸8ѡɁССɥс́ɁС́5(ɥѽ́偈͕н͕ɁɽѕɽՍ́ɥٕɽ5(С́̽݅ɕܥѡсɥɁɥѕɵͥ4(4(P!%ML=Q]I$M@I=Y%eP! =AeI%!Q =1IM9 =9QI% UQ=IMM$M4(99eaAIMM sqrt ( sinSigmaSqr ), + // cosTheta > -sqrt ( sinSigmaSqr ) and else it is 0 + // The two outer case can be merge into a cosTheta * cosTheta > sinSigmaSqr + // and using saturate ( cosTheta ) instead . + if ( cosTheta * cosTheta > sinSigmaSqr ) + { + illuminance = sinSigmaSqr * saturate ( cosTheta ); + } + else + { + float x = sqrt (1.0f / sinSigmaSqr - 1.0f); // For a disk this simplify to x = d / r + float y = -x * ( cosTheta / sinTheta ); + float sinThetaSqrtY = sinTheta * sqrt (1.0f - y * y); + illuminance = ( cosTheta * acosFast4 (y) - x * sinThetaSqrtY ) * sinSigmaSqr + atan (sinThetaSqrtY / x); + illuminance /= PI; + } + return max ( illuminance , 0.0f); +} + +float illuminanceSphereAttenuation ( float3 worldNormal, float3 dirToLight, float lightRadius, float sqrDist) +{ + // Sphere evaluation + float cosTheta = clamp ( dot ( worldNormal, dirToLight), -0.999, 0.999) ; // Clamp to avoid edge case + // We need to prevent the object penetrating into the surface + // and we must avoid divide by 0, thus the 0.9999 f + + float sqrLightRadius = lightRadius * lightRadius ; + float sinSigmaSqr = min( sqrLightRadius / sqrDist, 0.9999f); + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ); + return illuminance; +} + + +float illuminanceDiskAttenuation ( float3 worldNormal, float3 dirToLight, float3 planeNormal, float lightRadius, float sqrDist) +{ + // Disk evaluation + float cosTheta = dot ( worldNormal, dirToLight); + float sqrLightRadius = lightRadius * lightRadius ; + // Do not let the surface penetrate the light + float sinSigmaSqr = sqrLightRadius / ( sqrLightRadius + max ( sqrLightRadius , sqrDist )); + // Multiply by saturate ( dot ( planeNormal , -dirToLight)) to better match ground truth . + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ) * saturate ( dot( planeNormal , -dirToLight)); + return illuminance; +} + +void spot_light_params(float3 worldPos, float4 pos_and_radius, float3 light_direction, float lightAngleScale, float lightAngleOffset, out half geomAttenuation, out float3 dirFromLight, out float3 point2light) +{ + point2light = pos_and_radius.xyz-worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float rcpDistFromLight = rsqrt(0.0000001+distSqFromLight); + dirFromLight = point2light*rcpDistFromLight; + float invSqrRad = rcp(pow2(pos_and_radius.w)); + + geomAttenuation = getDistanceAtt( distSqFromLight, invSqrRad ); + geomAttenuation = geomAttenuation*getAngleAtt ( -dirFromLight, light_direction, lightAngleScale, lightAngleOffset); +} + +half areaSphereNormalization( float len, float lightSize, float m ) +{ + // Compute the normalization factors. + // Note: just using sphere normalization (todo: come up with proper disk/plane normalization) + half dist = saturate(lightSize / len); + half normFactor = m / ( m + 0.5 * dist ); + return normFactor * normFactor; +} + +half3 areaSphereLight(half3 R, half3 L, half m, half lightSize) +{ + // Intersect the sphere. + half3 centerDir = L - dot(L, R) * R; + L = L - centerDir * saturate( lightSize / (length(centerDir)+1e-6) ); + return L.xyz; +} + +half4 SphereAreaLightIntersection( half3 N, half3 V, half3 L, half ggx_alpha, half lightSize ) +{ + half4 lightVec = half4(L.xyz, 1.0f); + half3 R = reflect(V, N); + + lightVec.xyz = areaSphereLight(R, L, ggx_alpha, lightSize); + + // Normalize. + half len = max(length( lightVec.xyz ), 1e-6); + lightVec.xyz /= len; + + // Energy normalization + lightVec.w = areaSphereNormalization( len, lightSize, ggx_alpha ); + + return lightVec; +} + + + ZYW[YYY\ٗ [exyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3!J22*"2BbbjP!+3Ks+!J22*"2BbbiPhPIsc#+C #+:c{ csAccKiPhP0c{ !K33+c +k+C1c{ !K33+zc{IiPkP+s!K33+zc{yy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxyaKs+ z;Cs+i++ caKs+ {;Cs+kP0c{ !K33+c+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ 1"ʁqYQzCQzCQaKs+ z;Cs+iP1c{ 1"YA1"ʁiIQ{AiqzJiP1c{ 1"cYA1"ʁiIQ{AiqzcJiP+s!K33+zc{QA1"Q1"cIyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxy1{ki{Ks;1{J+{b)s+;{s+ K+c+!K33+kP0c{ !K33+c+3J+#3+s+cC1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ )s+;J qiP1c{ )s+;3 +{Aq1QaKs+ z;Cs+iq1KQaKs+ z;Cs+Yq1iP1c{ 1"ʁ)s+;J YQzCQzCQaKs+ z;Cs+iP1c{ 1"YA1"ʁiIQ{AiqzJiP1c{ 1"cYA1"ʁiIQ{AiqzcJiP+sA1"Q1"cQ)s+;3 +{Kyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhP0c{ !K33+c+3J+#C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP+s!K33+zc{Q!K33+c+3J+#3+s+cCaKs+ z;Cs+cqzbqzcbzCJyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhP0c{ !K33+B s3+s+cC1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCb1c{ +{*3c+KK˻*K;CIiPkPyyJs+++z#1KKs;cq++#{Is+{{s+y{;Cs+ k+K K{s{kPyyC+K9c{Ks+ k+K K{s99;iP1c{ 9; +cC aKs+ {;Cs+SaKs+ {;Cs+iP1c{  9; +cC S9; +cC iP1c{ 9 +CAqyqIQa{;Ay iIIiPhP1c{ 1zCY{AizCJiPyyBK1 {s+C+)s+{{ 9 Ks; s;c+1{a{{;Cs+i +K csiPyyI+ +)s+;Ks; 9 Ks; s;c+1{k{{C!K+c+Ki +K ckPyyB+AK;C+C+ c+9Kk c+;IcC+a{+C+)s+;{{Kcc+kPyyB+!+3 c c+1{kB sIqqiPyy*Ks;C+ c+{q9+K#y33CK)s+;{{siP{s1c{ Kk c+q1iP1c{ 1AqiKk c+Q{AqiqzcJIQAqiKk c+Q{AqiqzJIiPhPyyz;CA1I{k{{C1+{s+Is+{c K{skP1c{ 1#a+C1a1a +CqQ9iqIIiPhPyy*{+3c+KK{sKK{ssiP1c{ 1AAqQ9iIQ9YqIQzCQ)ÃAii CqQ9iqaqIQCqzCIIiPyy cc{{1 #+y{;C+{+3c+KKkP1Q+{*3c+KK˻*K;CiP+sA1#Y1IiPkPhP0c{ !K33+B sC1c{ !K33+zc{c1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCb1c{ +{*3c+KK˻*K;CIiPkP+s!K33+zc{Q!K33+B s3+s+cCaKs+ {;Cs+cqzbqzcbzCbqzCb+{*3c+KK˻*K;CKiPkPhP0c{ !K33+{+ss + C1c{ !K33+zc{c1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ zcQzCiiP1c{ iaKs+ {;Cs+QaKs+ {;Cs+iP1c{ iiQiiP1c{ iqQiQCiYqIiP1c{ zKzciqzQqzciPhP1c{ qQiQCiYqIQAzKzKQCi CqzcbqzJIIiP+s!K33+zc{QAYIiPyy1c{ qQiQCiYqIQzKQAzKiKsCaqzcyqzIqzcIiPyy+s!K33+zc{QAqzcQYIyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxyqIC+q{k c!K+K{skPxyIC+K++{kPxyq"{IC+{Ks+ s;c++++sC+K++{ s#C+q{k ckP0c{ 9+#J33+#zkKs s#JA1c{ qb1c{ b1c{  +#r"{b1c{ 9; +cC KiPkP1c{  q1Q9; +cC iq1iP1c{ iq1Q9; +cC Yq1iP1c{ a+3 +{ +AA +#r"{R YKQ9; +cC KiPyyB++cIq{q{k cK+# +1+CIs +k kP+sa+Aqbba+3 +{IiPkPhPhP)s#K3 ȍ0 \ʸҾ\Ҙ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYHUҗSYY[HUҗHLBHYHWSWғTYY[HWSWғH ZHYYBKKKKKKKKKKKKKKKK HQKKKKKKKKKKKKKKKKBZ YWWW +Z[[Yܗ[[ ZӛHJ^ S^ܛ L Q]Hӛ\Z\XHPțQ][HRHW HY]]ڛY[]\K؛Z  HHK  H M  H K͍   HN؛Z X HH   L  H  H HNZ H[[Yܗ[[ + +XNZH HH[ +  +  H +HK  +ӛH +H + +  +KN\]Z +HK  H H + +H +NB_BZ HQ +Z \X[ۛ Z[[Yܗ[[ ZӛHJ^ S^ܛ L Q]Hӛ\Z\XHPțQ][HRHW HY]]ڛY[]\KZ HHYWWW +[[Yܗ[[ ӛHN\]\X[ۛ +H  +HK^^\]\]JWSWғ\X[ۛYNB_BBZHQӛ[[] +Z[[Yܗ[[ ZӛHJ^ TX[HHQ + [[ ӛHJ؛Z  HHK  H M HN؛Z X HH   L HNZ H[[Yܗ[[ + +XN\]H[ +  +  H +HK  +ӛH +H + +  +KNB_BHYY!Gth5FV&7Ǖ6VGVe6G5FV&E'v6ǖF^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@^^^^@@^^F@ؾ@f\bhbjrdljfjprnrfdfphldlhffF@ؾ@P`\j@T@f\bhbjrdljfjprnrfdfphldlhffR^^@h@@@^^@h@X@bl@@@^^@n@T@b`Zj@@^^@@t@@@@@P@t@@@RX@\@@@\\@X@\@hP@ܰR@b@z@PܰRv@d@z@b@T@bv@f@z@d@T@bv@v@z@Z`\dbdbbhh@T@b@V@b\jn`ndppv@z@`\`nhdlb`@T@d@V@v@z@Z`\`bpndrf@T@f@V@v@z@Pb\`@Z@bR@T@v^^@@@^^@@@@@@@@@Z@@@@ܰ@|z@`\`@~@@t@ؾ@Z@v^^@h@@@^^@h@X@bl@@@^^@n@T@b`Zj@@@@܌hP@ܰR@@z@ܰv^^@@@@@@ؾ@Z@hPRv^^@h@@@^^@h@X@bd@@@^^@n@T@b`Zj@@@^^@@t@@@@@@X@X@\@@@X@\@X@\X@@d``l@܌hP@ܰR@@@z@ܰv@TPZ`\bnph@T@PR@Z@`\`llf@T@@T@@V@b\`f`bRvF@ؾF@ؾF6<#D902941:2.090/249494`2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf$Et$UETdT4TDT$ՠ0BVfV$Et$UETdT4TDT$ӠРРР0f$Et$UTDԠ0BVfV"t$5uT梗wנ0BVfV"t$5uT梗נ0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠Р0fFVf2DT$5T$4$#Ӡ0BVfV2DT$5T$4$#Ӡ0RFf֠Р0BVfVrUE$uTDӠ0BVfV2CS#cSc֠0BVfV2CS#cS֠Р0BVfVR5Ӡ0BVfVRDbF7Ҡ0BVfVRDbF7Ҡ0BVfVRDbF7ҠР0BVfV4%UdU$5U$D5Ӡ0BVfV2U$DU5T$$T4DӠ0BVfVBV'VBV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V&BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V6BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'VFBV'V6&WF5W&GWF%5VuW7נР0BVfVbWFf֠0BVfVbWF&f&Ӡ0BVfVbWF6f6Ӡ0BVfVbWFFfFӠР`F7bFbF"bF2Ҡנ"WFW'"2Ӡנ`FҖ6bFbF"bF2Ҡנ"WFW'ҖҖ"2Ӡנ0BVfVd$DנР`F7bF7Ҡנ"WFW'7梗Ӡנ`FGbFbF"bF2bFBҠנ"WFW'B"2Ӡנ`FҖFbFbF"bF2bFBҠנ"WFW'ҖҖBҖ"2ӠנР0BVfV%U44U'W66W֠0BVfV2%E5D2'G2FW'FWҠ0BVfVb5TE4DVbFGV3e4DӠ0BVfVBW'Ct&FRgBB2Vv$F625V&7GFWRgₗBBҠ0BVfVBW'CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%TFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%T$'FRgF2VTfWƆ625V&7GFWRgₗwFҠ0BVfVBW'C'Rg2V625V&7GFWRgₗRgrҠ0BVfVBW'CRg2V625V&7GFWRgҠ0BVfVBW7CRg2V625V&7GFWRgҠ0BVfVBW7T%TRg2V625V&7GFWRgҠ0BVfVBWGW'WvFV&B7rFV&625V&7GFWB7Ҡ0BVfVBWWfTF7df6WFB7Ff6FF7B7Ff6Ҡ0BVfVBWGW'Wdf6WFB7f62V625V&7GFWB7f6Ҡ0BVfVBWGW'WFdf6WFB7Ff62VTfWƆ625V&7GFWB7Ff6ҠР0BVfV2%$ET$VbƖҠ0BVfVՠ0BVfVR$U&ՠ0BVfV"$4%&6ՠ0BVfVbDEUeFGWՠР0BVfVRE5E%U5DV2G'W7FVנ0BVfVBT4$UUT5UDT$T$ՠ0BVfV"UDU%UE5E%U5DVҠ0BVfVDUE5E%U5DVҠР0BVfVtU5U55$UT4ՠ0BVfVrTD55$UT4b76b76נ0fFVfBUUdTD5ETdTDԠ0BVfVBUUdTD5ETdTDӠР0BVfV2T4EUEU%U$CԠ0BVfV2T4EUEU%U$CU%B7Ӡ0BVfV2T4EUEU%U$C$%ՠ0BVfV2T4EUEU%U4CԠ0BVfV2T4%TedT$bVVҠ0BVfV2T4%TedT$U%B7Ӡ0BVfV2T45E%U5DU%UD%TedT$bVVҠ0BVfV2T45E%U5DU%UD%TedT$U%B7Ӡ0BVfV2T45EU4Ԡ`FGBWWfTF7&6WBUGW'W&CcFGF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F7BWWfTF7&6WBUGW'W&CcF7F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F'BWWfTF7&6WBUGW'W&CcF'F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FBWWfTF7&6WBUGW'W&CcFF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FGBWWfTF7&6WBUGW'W&C$'cFGF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W&C$'cF7F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W&C$'cF'F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W&C$'cFF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FGBWWfTF7&6WBUGW'W6CcFGF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W6CcF7F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W6CcF'F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W6CcFF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ0BVfVBWWfTF7B7FBWWfTF7&6WB7FeTŔTҠР`FGF&TgfV&'6W"TgfV&cFGFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F7F&TgfV&'6W"TgfV&cF7FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F'F&TgfV&'6W"TgfV&cF'FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`FF&TgfV&'6W"TgfV&cFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"TgfV&SFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W2E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"u5E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7ӠנPFF&TgfV&'6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7Ӡנ0BVfVF&TgfV&B7F&TgfV&'6WB7eTŔTҠ0BVfVF&TgfV&'B7F&TgfV&'#6WB7eTŔTҠ0BVfVF&TgfV&7B7F&TgfV&7#6WB7eTŔTrVFV52Ҡ0BVfVF&TgfV&GB7F&TgfV&G#6WB7eTŔTҠ`F2G&W&TgfV&'6W"u%GWDF&W67'TgfV&FB7RFbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WB7bVWӠנ`F2G&W&TgfV&'#6W"u%GWDF&W67'TgfV&FB7RF'bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W&B7bVWӠנ`F2G&W&TgfV&7#6W"u%GWDF&W67'TgfV&FB7RF7bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W6B7bVWӠנ`F2G&W&TgfV&G#6W"u%GWDF&W67'TgfV&FB7RFGbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WFB7bVWӠנ0BVfV2G&W&TgfV&B7bVW2G&W&TgfV&'6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&'B7bVW2G&W&TgfV&'#6WB7bVWeTŔTrVFV52Ҡ0BVfV2G&W&TgfV&7B7bVW2G&W&TgfV&7#6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&GB7bVW2G&W&TgfV&G#6WB7bVWeTŔTҠ0BVfV2G'W7FW'WF&TgfV&DB7UF2T45E%U5DU%UD%TedT$U%B7B7ՠ0BVfV"VgfV&DB7UF2T4%TedT$U%B7B7ՠ0BVfVBWGW'W&CDB7F'2T4EUEU%U$CU%B7B7ՠ0RFf֠РPF2GW6fTF7&6WBUGW'W&CSF'F'B7FbVFFVҠҠ2T45EU4ĴӠ"WFW'E7rӠנ0BVfV2GW6fTF7B72GW6fTF7&6WB7eTŔTrVFV52ҠР0f2DT$5T$4$#Ӡ0BVfV2WV6F"2"2֠0BVfV&""֠0RFf֠Рf66fFW&f6bƖҠנ0fd%U44Ԡ"WFW'ҖbbSSCゖӠ0R6W֠"WFW'2WV6F6gFWBFbbƖ₇bf6Ӡ0RFf֠נР0RFfA05FV&7Ǖ6VGV'&6ǖ?^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@F@xʾ\|F@x\|F@xҾ\|^^@@F@@`F@@bF@@dF@@fF@@hF@F@@^^^^^^^^^^^^F^^@@@F@@`F@@bF@@dF@F@@F^^@@@@F@@`F@@bF@@dF@@fF@@hF@@jF@@lF@F@@F^^@F@@`F@@bF@@dF@F@@F^^@F@F@@`Ff@Pf@ʆX@@X@@ެX@@ޘX@@ސRF@@@@zz@@@@ʘP@ʆ@RvF@@zz@@@@ʞܜP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@^^F@@@X@@ސ@@@`vFf@Pf@ʆX@@X@@ެX@@ޘX@@ސX@@ސRF@@@@zz@@@@ʘP@ʆ@RvF@@zz@@@@ʞܜP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʆP@ʆX@TX@ެX@ޘX@ސX@ސRvF@P@X@@ސRF@@@@zz@@@@܄P@X@ސ@RvF@@zz@@@@܄P@X@ސ@RvF@@zz@@@@܎P@X@ސ@RvF^^@@z@@^@PhTޘTެR@ƬP@X@@ެX@@ޘX@@ސRF@@@@zz@@@@PRvF@@zz@@@@P@ެX@ޘ@RvF@@zz@@@@P@ސ@RvF@@zz@@@@P@X@ެX@ޘ@RvF@@zz@@@@P@X@ެX@ޘ@RvF@@zz@@@@ІP@X@ެX@ޘ@RvF@@zz@@@@ІȂP@X@ެX@ޘ@RvFf@Pf@X@@ސRF@@@@zz@`@@@؜P@@RvF@@zz@b@@@ئP@X@ސ@RvF@@zz@d@@@،P@X@ސ@RvFf@P@X@@ެX@@ޘX@@ސX@@ސX@@ܦX@f@܆R@@@@@@z@PX@ސRv@@@@@@z@ƬPX@ެX@ޘX@ސRv@@@@f@@z@@T@v@@@@@v^^@t^^\\^Z^^d`bh^bb^ʾξʾ޾d\@P@@@@@BR@ʦƞP@ȾX@@X@@R@@@@@PPȾ@V@X@dPZbl\`@T@@Z@b\`RR@Z@b@V@Rv^^@z@T^^@@z@Tf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@X@f@܆X@@RF@@LL@@zz@@@@@@ʘPʈʆRvF@@@@f@@z@P@V@Rv@@@@@ސ@z@PPX@RRv@@@@@ސ@z@PPX@RRv@@@@f@@z@PʈʆX@X@ެX@ޘX@ސRvF@B@@@@f@@z@PX@ެX@ޘX@ސX@ސX@X@܆R@T@v@@@@f@@z@PX@ސRv@@@@@P@V@@T@RvF@@@@@vFFf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@X@f@܆X@@R@@@@@ȄPެX@ޘX@ʈʆX@X@X@X@X@X@X@X@܆X@R@T@ޘvf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@R@@@@@ȄPެX@ޘX@ʈʆX@X@X@X@X@X@X@X@fP`X@`X@`RX@`Rvf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@R@@@@@ȄPެX@ޘX@ʈʆX@X@X@X@X@X@X@X@fP`X@`X@`RX@`R@T@ޘv^^@^^^^^^^^^^^^@t@Zbnrn@@@@@@@P@@@܎@@\R@ʄfdP@R@@@@@z@P@xx@blR@@P@||@blRv@@@@@z@PP@L@`jjjjjjjjR@xx@bR@@PP@L@`R@||@bRv@@@@@z@PP@L@`ffffffffR@xx@dR@@PP@L@`R@||@dRv@@@@@z@PP@L@`````R@xx@hR@@PP@L@`````R@||@hRv@@@@@z@PP@L@`````R@xx@pR@@PP@L@`````R@||@pRv@@@@@vd@P@X@@R@@@@@@b@z@PPR@^@Rv@@@@@@d@z@ʄfdPR@T@d\fdpf`lhfljfplrlfZb`v@@@@@dPbX@dRvf@ʦʎPd@X@@dR@@@@@@@z@d\`@T@@T@\v@@@@@@@z@PPb\`@Z@\R@^@Pb\`@V@Pd@Z@b\`R@T@\RRv@@@@@@ܨ@z@Pb\`@Z@@T@Rv@@@@f@v@@@@\@z@ܨ@T@PRv@@@@\@z@ܨ@T@PRv@@@@\@z@v@@@@@@@@@v@P@dX@@ސR@@@@@@@z@Pސ@T@d@Z@ސR@T@ސ@V@b\`v@@@@@d@^@P@T@@T@Rv@ʠ̎P@X@@dR@@@@@@T@PdX@Rv@P@ސX@@dX@@ސR@@@@@ʠ̎PސX@dR@^@Ph\`@T@ސX@`\`````bRv@Pf@R@@@@@PX@fP`\dbdlX@`\nbjdX@`\`nddRRvF6b2&,902941:29023706494{2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР0fFVf2DT$u$4Ԡ0BVfV2DT$u$4ӠР06VGV"&Gv&WEVfV66ǖ&ҠР`Fv'bF'WFW'נ`FvGbF'WFW'v'נ`FvbF'WFW'vGנ`F'v'eW6&bF''WFW'נ`F7v'eW66bF7'WFW'נ`FGv'eW6FbFG'WFW'נР`F'v'bF''WFW'נ`F7v'bF7'WFW'נ`FGv'bFG'WFW'נ`FGvGbFG'WFW'v'נ`FGvbFG'WFW'vGנ`FGvcbFG'WFW'vנ`FvWbFgFbbc"WFW'bנРfv'f'WFW'נfvGf'WFW'v'נfvWffFFF"WFW'FנР`F2WFvbFbF"WFW'v&6c’נР`F7BvVFGv&FbF7bbF77B%Ҡנ"WFW'VdžB%bӠנР`F77rTFG%bF7ҠנbF77B%ӠРbF7B2&67RDӠBV&2&67RDB2GWR5BFBBӠB&ƖWBӠР26GbF7"&ƖW2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F77rTFG%bF7bF7BҠנB&ƖWBBFB┲Ӡ26GbF7"2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F–V&WbF"vGTGbF'BV6FVEVGҠנ"WFW'"7BV6FVEVGBV6FVEVG"vGTGӠנР0RFfA(3ap͡qՑqձ}ɑͱ1t7<34:$''&! 6634929227<34:4479%#* 6634929243723)* /!)"/$)242)* /!)"/$)&41:29023706494172:9:09"##7&7"99#7&743723$'$'242$'$')274-!4777297334:23177796:29<7:4221:930:9:4:77!47730:3068030:7$30:630680306830:762:9771622;7$7477<$4:224727706<3477994422<-077*20:2437321:321093634:9930:9:4:7707730:3068030:7$30:630680306830:7$7$72:972<87$67$67$7$477<$4:224727706<3477994422<#,*;144:30:9:4:7#,30:3068030:7$30:068030680306830:27$06807$7$02:9706800<22477<$4:224727706<3477994422< 7:71#,930:9:4:7#0730:30680,30:3068,30:7$30$30,30,30:7$7:,$30:7$7:,$30:27$7$;306807$7$;30687$72:970<30680,3068,22477<$4:224727706<3477994422<9544::9501=7928917:90430:9:4:7!7:430:3068030:730:930680306830:947$730:474930:474474472:974742<8944749947477<494230:2:684:2:9730:2:<07730:7+30:7&2:97180<7&7+30:2:5790230:7$30:7&30:7+30:7$30:306830:'7:1620<7&30:'7:1620<7+30:7/7/+7:$7$72:9747477/7/+7:$'7:16227/7/+7:$'7:162227 172:22:8229:00:219237264:467902684330:2:22730:7$2:97187$7$30:2:14530:3068030:7+30:7&30:5;3068030:2:145+7+30:2:145&7&2:972:145+2:145&4:42679#30:2:4:430:3068030:7+30:7&30:0;3068030:2:4:4+7+89:7+7+7+0030:2:4:4&7&89:7&7&7&002:97182:4:4+2:4:4& 87077737920224:42679#4:30:2:4:79202230:3068030:7+30:7&30:0;3068030:2:4:4+7&89:7+7+7+0030:2:4:4&7+89:7&7&7&0030:0306830:2:4:4+7&7+0030:2:4:4&7+7&002:97182:4:4+2:4:4& 870777347:4:42679#-4:=*7290743:24)043:1774717222!)"930:2:4:79202 887<30:3068030:7+30:7&30:2:4:4+7&7+306803068030:2:4:4&7+7&30680306802:97182:4:4+2:4:4&9544::9501=7928917:90430:2:!7:430:7+30:72:9777+7&730392672309:07792:979:07730392145309:077930:7$30:17$ <:439:079806<64120729490274222729042:970:02$'$')9:0779319:0773014534930#30:7$30:3479:30:1730:47;34342:97#0<3047;3447;3447;3##303926#926309:077930:7$30):07789:89:16830309:0779307):07789:):07789:30389:777$7$2:97;/3737;/77$77$302:3423177130)3070630:30680680;40/342:97298706)306889:306830680274  ρH)J.k. lkṋL(lŅŅ,ͭkM퍬lK̍L+m-k-Lnk-L,ͭln ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(4(Ʌ5(4(4(5(5(̍5(5(Ёѕ̥̍С̡͕́́Ɂ5(5(5(4(4( 1M14(4( U } } =U9Q4( M}9Y} U 5AM} 1= -}M%i4( U 5A}9Y} }M%i4($II%9 }5A} }M%i4(H1 Q%=9}5A} }M%i4(H1 Q%=9}5A}5%A} =U9Q4(4(8U}5a}M-%99%9} =9M} =U9Q4(4(L!%9}9=I514(L!%9}5%MM%Y4(4a}5%MM%=9и5(4(1= 1} UI}AI%a }5(LeMQ5} UI}AI%aL }5(4(|}5(4( 偈4(4(LQI%9%e}%5A1ी5(LQI%9%eीLQI%9%e}%5A14(4(̡}5(5(ѕɁѱɥ}٥݁ ՙAɕLQI%9%e1= 1} UI}AI%a4(ѕɁѱɥ}٥݁Lѕ ՙAɕLQI%9%eLeMQ5} UI}AI%a4(4( ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡ ՙAɕ4(5(4(Mѕ ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡLѕ ՙAɕ4(5(5(4(͕|}5(4( 1M1偈4(4( =9 Q}ɕ᱀ɕፌ5( =9 Qɕ᱀ =9 Q}ɕ᱀4(4(1= 1} UIՙɁ =9 Q1= 1} UI}AI%a4(LeMQ5} UIՙɁ =9 QLeMQ5} UI}AI%a4(4(|}mքM6" +-T4l`($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +k&ĉ̉IɝLe0<ѓ lO(Mg'' 8 }1 ՙMg'"*z'y2*A Ҁ͔S[S6 yR*'y'lHU6*; MiL?1 5ГVq Bm0%VZU&HPYiW OXB hU\e\?q 5Vq m0&WZU&HP]iWـʫʬʭʮL &zP=i_@ IlNWec'{0z*uqQ[iW OA ̥U\ep?5@Vq ŨKKl8dUxWE\eà'!` CAL@ 6Bi**ix! ʆEOE^^%OEO^LY}%х%M0 $b0AH`ya|}yɓ}ɓy ½ )/47 BB AlX_^ddd^DfC02!`C]ɨ +" n\HA#`: PBomni_light_index De`]Ё{ +s# #K /#t#0 r&F67.@$dFhэK61.llvm.dbg.cuShfFVVbv67EfFVF7%Jdx.source.contentsSAqё114aFdx.source.definesS[XK[XQ[SX[ٔM̽ɍɝM +]\ڛ۔@O؅ٕM ZY\Y۔OʐȕͽɍM R ]\Y]]ڛA]ڥ]Z]]]ٔ]ṔAM JyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq #P D@ /qL_IV <PEAD %amp LD4B4\ bP_ܶ L;8 65mA5\DJM5m4\Ma~q,KC`Pa A,D5@Hq @1F0笙0&L; t0A8`p &)LS 0A8apX# `3Dy$CtgpL# `Tń0b AeL#`PAX[n?L# `ЁLDŽ0b Ä0b JAL#`PXM\p?L#`P܁XM\o?L#`PAXM\n?L#`PX [k?PȌсAL#`0hBL#`PXQ[t?h0b  @Ì1y& ŒсA#`PX[t?h10b @pÌ1y Ae?Pp?0a Ad?Pp?0a Ac?Pp?0agƀ  ^+` $Ӄ<, 3c@x1|f OόBV(1 <5> +|& A0(Naήf `@ SP `@ SH `@ Q*>1 >+ф0F`M `4& A0PDaM `4A& фA0Fa18C `4!& !0FaM `@ &YH2p `4!& !0FaM I>3'0b -s TLЙ0l3a A t m0b /ԁ +t& 2L#`PT_0a Ay}`A ƀτ0b 860b 95` `@ u`!p aƀ؜<F XB& A0(APA `@ uH!pa1Hd <F AYpHd1HdA ` @ tpV& 1  #3m@еmEunA&TH]fTH]64mD5nGnjgCm^gCM[PזV|&0fV|&0VV|&0&V|&0V|&06_"1qN#MUD UDd2( %b UDSTATl`DXILTBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 52" d##ㄡL L@ +f`)@DAQ A@QOCH>QJL~qۈa'!$?a!P!R 0 p &! GsDcF6(v] #YQD34HDŽ뺮P~i1IB֑rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y``,2L &GC"J` +X@ +< ʡ$J + + +4J +P@ʣDʏ(R((jf o: +yyLFD oM $Efe%&,f&gl&eCLc@   l hhH) nmN̬Ln@(BYb` ·lҘ&IJ 4$``IMf@8 6 uXmT&A2m#E&W6FEW57V6A W`{Ó  LXILjuXm,d&AR,6fposRelToOrigin_cullRadiusڀ lpi>1(4X7 xj-- nk΍n@`$.mŖvF75&6A`eua&ph نa`E`YVTھ6 H\geܾ޾&A,6:world_view_posbۀ piۆ?RpA)L`a P6aNA&`V`EV&VwFŖvF7e7Gi**iP| 6 …mXWXXfZ`3e6G6VD4A(`P 5lX[\Xra] .pzKK{s e0A `ad_ b6aq6 +04&D"mnn@x$h̥}јK;۠9:ö[666427)AP ŮLn.mJ@4!s c+u\ئH2<:)T υ.,..mnP +P ..l.lJ +u\Ѕ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq P D@ /qL_IF <PEAD %amp LD4BX4\ bP_ܶ L;8 65m@5\DJM5m[4\Ma~qILDN,$ba399dad4b7923d80a6653dfe57a5a3d.pdbHASH9Ky# +fSzZ=DXIL`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 52" d##ㄡL L@ +f`)@DAQ A@QOCH>QJL~qۈa'!$?a!P!R 0 p &! GsDcF6(v] #YQD34HDŽ뺮P~i1IB֑rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y``,2L &GC"J`  +x ʡ<(2("(B m: +yybLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$ALeB, A 0A l@!6N A!&L -͍- nnTUғ&E! &4A l:oB`iGh)$90$ B1M +jPTnذ a ci Zl LY}AͥѥM +k@<N 6,dܖCl`pml( & +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[Xܔ@CbVvD6EFW6%ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq P D@ /qL_IF <PEAD %amp LD4BX4\ bP_ܶ L;8 65m@5\DJM5m[4\Ma~qa vA,4Q\eW3PrE@f# `@uqɈA Pq2b  ^G# ``Ay2b ('%# ```@)ElR V(1B +|F ੃фMфAM A0x@ ;M!Mb18фMфAM A0xH `F`4AFa43b Q*s#`,W`, A +w m DX@ǾL>#`T_0b ,A4б13b Q-6 D +@1HEjA0PtjP!1HEj!A0PtjV!@DXBCAhd[ DTh,SFI0ISG14(SV_PositionOSG14(@SV_TargetPSV04debug_point_lights_psDDILDB`osDXILBC! fs #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@I 2" d""ㄡL L(#%90#@f3CE6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C<d 2L &GCB(2(( *2( yrLFDL- nk-Lmm=271 30:Bvector X12@ E h 0 1@h%``0 1@h%`0 1@h%`0q element@Jؔ}չqHscdPAVp@Ya&A`h @,b ƊL -͍- n nS\E |#H0'4`aA`c0AU t0dee 8 \^^ʸ^\ @Dhh8ɥ񘱽ѱаpYMf0 0bd1@B`+ff4q ,$`0bh1@3B`K&f4u ,$` 1dd1@sB`Kff4y ,$`1dh1@B`k&f4} ,$` 2fd1@B`&kff4 ,$`2fh1@3 +B`.&f4 ,$` 3hd1@s +B`6ff4 ,$`3hh1@ +B`>r8:<>PR0TPV`"v5VF7[ݴX +0 6@ @E ``, h  }1 ՙXɥ5̐ m[@[P3 *globtm_inv37147;#/3479::329 0:4<& m  jp@knL m틮 oMl~ܾ޾Ȁ䀀f~H䀚H`f-@xB/796//9Aݛٗ]ZБSЛPYЌ]ݛP ж_5H^`ŖvF75VFǢ.͍]ݛO\ڙ[H :32247=@`p,b*w00`1@; "hrs0X#T``0s@tPe I PHq*E `~Ҿ耦Ҙ怀f~H䀒H`f-@xC<<yksKbK;C#UFV&ƔvFmN*,nn4Il P{c{3b ;[=EHH)417/20E T${ÓY>EH 7= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon. + Length rho = + SafeSqrt(r * r - atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon). + Length d = DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Number x_mu = (d - d_min) / (d_max - d_min); + Number x_r = rho / H; + return vec2(GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)); +} + +/* +

and the inverse mapping follows immediately: +*/ + +INLINE void GetRMuFromTransmittanceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon, from which we can compute r: + Length rho = H * x_r; + // due to float precision, sqrt(0 + x*x) can produce value lower than x, so we need to acknowledge that + r = rho > 0 ? sqrt(rho * rho + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius) : atmosphere_p.bottom_radius; + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon) - + // from which we can recover mu: + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Length d = d_min + x_mu * (d_max - d_min); + mu = d == 0.0 * meter ? Number(1.0) : (H * H - rho * rho - d * d) / (2.0 * r * d); + mu = ClampCosine(mu); +} + +/* +

It is now easy to define a fragment shader function to precompute a texel of +the transmittance texture: +*/ + +DimensionlessSpectrum GetTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + vec2 uv = GetTransmittanceTextureUvFromRMu(atmosphere_p, r, mu); + return DimensionlessSpectrumFromTexture(sample_texture(transmittance_texture, uv)); +} + +DimensionlessSpectrum GetTransmittance( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu, Length d, bool ray_r_mu_intersects_ground) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + assert(d >= 0.0 * meter); + + Length r_d = ClampRadius(atmosphere_p, sqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_d = ClampCosine((r * mu + d) / r_d); + + if (ray_r_mu_intersects_ground) { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, -mu_d) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, -mu))); + } else { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, mu_d))); + } +} + +DimensionlessSpectrum GetTransmittanceToSun( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu_s) +{ + Number sin_theta_h = atmosphere_p.bottom_radius / r; + Number cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0)); + return GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu_s) * + smoothstep(-sin_theta_h * atmosphere_p.sun_angular_radius / rad, + sin_theta_h * atmosphere_p.sun_angular_radius / rad, + mu_s - cos_theta_h); +} + +Length DistanceToNearestAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu, bool ray_r_mu_intersects_ground) +{ + if (ray_r_mu_intersects_ground) { + return DistanceToBottomAtmosphereBoundary(atmosphere_p, r, mu); + } else { + return DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + } +} + +INLINE InverseSolidAngle RayleighPhaseFunction(Number nu) +{ + InverseSolidAngle k = 3.0 / (16.0 * PI * sr); + return k * (1.0 + nu * nu); +} + +float2 GetMiePhaseConsts(Number g); + +#if 0 +INLINE float MiePhaseFunctionDivideByRayleigh(Number g, Number nu) +{ + return MiePhaseFunctionDivideByRayleighOptimized(float4(GetMiePhaseConsts(g)*pow(0.5,-1./1.5), GetMiePhaseConsts(-0.25*g)*pow(0.5,-1./1.5)), nu); + //float k = 2.0 * (1.0 - g * g) / (2.0 + g * g);//this is constantant + //float phase = 1.0 + g * g - 2.0 * g * nu;//this is nother two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + //return k / (phase*sqrt(phase));//pow(1.5) +} + +//only for reference +//https://arxiv.org/pdf/1812.00799.pdf +//ON SAMPLING OF SCATTERING PHASE FUNCTIONS +//CORNETTE SHANKS PHASE +INLINE InverseSolidAngle MiePhaseCornetteShanksFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//full Drain phase function +INLINE InverseSolidAngle MiePhaseDrainFunction(Number g, Number nu) +{ + float alpha = 1.0; + InverseSolidAngle k = 3.0 / (4.0 * PI * sr) * (1.0 - g * g) / (3 + alpha*(1.0 + 2.0*g * g)); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + alpha*nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//http://www.csroc.org.tw/journal/JOC25-3/JOC25-3-2.pdf +//Zhang function +INLINE InverseSolidAngle MiePhaseZhangFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase)) + g*nu*1.0/(4.0*PI * sr); +} + +#endif +INLINE float SafePow(Number a, Number b) {return a != 0 ? pow(a, b) : 0;} +INLINE float2 GetMiePhaseConsts(Number g, Number weight) +{ + return float2(1.0 + g * g, - 2.0 * g)*SafePow(weight*2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); +} + +INLINE float2 GetMiePhaseConsts(Number g) { return GetMiePhaseConsts(g, 1); } + +INLINE float MiePhaseFunctionDivideByRayleighOptimized(float4 mie_phase_consts, Number nu) +{ + float forward_phase = mie_phase_consts.x + mie_phase_consts.y*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + float backward_phase = mie_phase_consts.z + mie_phase_consts.w*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + return pow(forward_phase, -1.5) + pow(backward_phase, -1.5);//it is faster than rcp(phase*sqrt(phase)) or phase*phase*rsqrt(phase) on Xb1+ +} + + +INLINE RadianceSpectrum GetPhasedRadianceOptimized(float4 mie_phase_consts, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return (scattering + single_mie_scattering * + MiePhaseFunctionDivideByRayleighOptimized(mie_phase_consts, nu)) * RayleighPhaseFunction(nu); +} + +INLINE RadianceSpectrum GetPhasedRadiance(IN(AtmosphereParameters) atmosphere_p, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return GetPhasedRadianceOptimized(atmosphere_p.mie_phase_consts, scattering, single_mie_scattering, nu); +} + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s); + +vec2 GetIrradianceTextureUvFromRMuS(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + Number x_r = (r - atmosphere_p.bottom_radius) / + (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + Number x_mu_s = mu_s * 0.5 + 0.5; + return vec2(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT)); +} + +/* +

The inverse mapping follows immediately: +*/ + +void GetRMuSFromIrradianceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu_s) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT); + r = atmosphere_p.bottom_radius + + x_r * (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + mu_s = ClampCosine(2.0 * x_mu_s - 1.0); +} +/* +

Lookup

+ +

Thanks to these precomputed textures, we can now get the ground irradiance +with a single texture lookup: +*/ + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s) +{ + vec2 uv = GetIrradianceTextureUvFromRMuS(atmosphere_p, r, mu_s); + return IrradianceSpectrumFromTexture(sample_texture(irradiance_texture, uv)); +} + +//rendering part +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoef( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + // Algebraically this can never be negative, but rounding errors can produce + // that effect for sufficiently short view rays. + return (scattering.w / max(scattering.x, 1e-4f)) * extrapolateMieCoef;//betaRMie = (betaR.x / betaR); +} + +IrradianceSpectrum GetExtrapolatedSingleMieScatteringDS( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + return IrradianceSpectrumFromTexture(scattering) * GetExtrapolatedSingleMieScatteringCoef(extrapolateMieCoef, scattering); +} +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoefConst( + IN(AtmosphereParameters) atmosphere_p) +{ + return (atmosphere_p.rayleigh_scattering.x / atmosphere_p.mie_scattering.x) * + (atmosphere_p.mie_scattering / atmosphere_p.rayleigh_scattering);//constant` +} + +#ifdef COMBINED_SCATTERING_TEXTURES +IrradianceSpectrum GetExtrapolatedSingleMieScattering( + IN(AtmosphereParameters) atmosphere_p, IN(vec4) scattering) +{ + return GetExtrapolatedSingleMieScatteringDS(GetExtrapolatedSingleMieScatteringCoefConst(atmosphere_p), scattering); +} + +#endif + +/* +

We can then retrieve all the scattering components (Rayleigh + multiple +scattering on one side, and single Mie scattering on the other side) with the +following function, based on +GetScattering (we duplicate +some code here, instead of using two calls to GetScattering, to +make sure that the texture coordinates computation is shared between the lookups +in scattering_texture and +single_mie_scattering_texture): +*/ + +#define SKIES_PREPARED_SHORT_PART (112./128.) +#define SKIES_PREPARED_SHORT_PART_SQ (SKIES_PREPARED_SHORT_PART*SKIES_PREPARED_SHORT_PART) +float scattering_DistToTc_m(float d, float2 dist_to_prepared_tc) {return sqrt(saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y));} +float scattering_DistToTc_Km(float d, float2 dist_to_prepared_tc) {return scattering_DistToTc_m(d*1000, dist_to_prepared_tc);}//fixme: +float scattering_DistToTc_Long(float d, float4 dist_to_prepared_tc) +{ + float shortDistTc = saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y); + float longDistTc = saturate(d*dist_to_prepared_tc.z + dist_to_prepared_tc.w); + return sqrt(shortDistTc < SKIES_PREPARED_SHORT_PART_SQ ? shortDistTc : longDistTc); +} +float scattering_TcToDist_Km(float tcX, float4 dist_to_prepared_tc) +{ + float tc = (tcX*tcX); + return 0.001*(tc < SKIES_PREPARED_SHORT_PART_SQ ? (tc-dist_to_prepared_tc.y)/dist_to_prepared_tc.x : (tc-dist_to_prepared_tc.w)/dist_to_prepared_tc.z); +} + +#define SKIES_LOWER_SPACE_PART 0.8 +float scattering_viewZtoTc(float viewZ) +{ + //return acos(viewZ)*(-1./PI) + 1; + return SKIES_LOWER_SPACE_PART + (viewZ < 0 ? SKIES_LOWER_SPACE_PART : (1-SKIES_LOWER_SPACE_PART))*viewZ; +} +float scattering_tcToViewZ(float tcY) +{ + //return cos(-PI*(tcY-1)); + float2 maddP = tcY= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + result += ComputeScatteringForIrradiance(atmosphere_p, transmittance_texture, RAY_SAMPLE_COUNT, r, omega, omega_s) * + omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum GetMultipleScattering(IN(AtmosphereParameters) atmosphere_p, IN(MultipleScatteringTexture) multiple_scattering_approx, + Length r, Number mu) +{ + float MultiScatteringLUTRes = SKIES_MULTIPLE_SCATTERING_APPROX; + float2 uv = saturate(float2(mu*0.5f + 0.5f, (r - atmosphere_p.bottom_radius) / (atmosphere_p.top_radius - atmosphere_p.bottom_radius))); + uv = float2(GetTextureCoordFromUnitRange(uv.x, MultiScatteringLUTRes), GetTextureCoordFromUnitRange(uv.y, MultiScatteringLUTRes)); + + return IrradianceSpectrumFromTexture(sample_texture(multiple_scattering_approx, uv)); +} + +struct SingleScatteringResult +{ + IrradianceSpectrum L; // Scattered light (luminance) + IrradianceSpectrum ray,mie,ms; + DimensionlessSpectrum Transmittance; // Transmittance in [0,1] (unitless) +}; + +INLINE SingleScatteringResult IntegrateScatteredLuminanceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) multiple_scattering_approx, + IN(Position) worldPos, IN(Direction) worldDir, Number shadow_offset,//only for shadows + float sampleCountIni, bool variableSampleCount, float2 rayMarchMinMaxSPP, + Length r, Number mu, Number nu, Number mu_s, + bool ray_intersects_ground,//RayIntersectsGround(atmosphere_p, r, mu) + float tMaxMax = 9000000.0f) +{ + SingleScatteringResult result; + result.L = result.ray = result.mie = result.ms = IrradianceSpectrum(0,0,0); + float start_distance = 0; + #if ORIGIN_CAN_BE_IN_SPACE + result.Transmittance = DimensionlessSpectrum(1,1,1); + //just skip distance befroe atmosphere. + //it is totally fine to render atmosphere from space without this defines on. + //it is just produces better quality in such case + if (r > atmosphere_p.top_radius) + { + Length rmu = r*mu; + Length distance_to_top_atmosphere_boundary = -rmu - + sqrt(rmu * rmu - r * r + atmosphere_p.top_radius * atmosphere_p.top_radius); + if (distance_to_top_atmosphere_boundary > 0.0 * meter) { + start_distance = distance_to_top_atmosphere_boundary; + } else { + // If the view ray does not intersect the atmosphere_p, simply return 0. + return result; + } + } + #endif + + // Compute next intersection with atmosphere or ground + float tMax = DistanceToNearestAtmosphereBoundary(atmosphere_p, r, mu, ray_intersects_ground) - start_distance; + tMax = min(tMax, tMaxMax); + + // Sample count + float sampleCount = sampleCountIni; + float sampleCountFloor = sampleCountIni-1; + float tMaxFloor = tMax; + if (variableSampleCount) + { + sampleCount = lerp(rayMarchMinMaxSPP.x, rayMarchMinMaxSPP.y, saturate(tMax*0.01)); + sampleCountFloor = floor(sampleCount); + tMaxFloor = tMax * sampleCountFloor / sampleCount; // rescale tMax to map to the last entire step segment. + } + // Phase functions + //const Number uniformPhase = 1.0 / (4.0 * PI); + Number RayleighPhaseValue = RayleighPhaseFunction(nu); + Number MiePhaseValue = RayleighPhaseValue*MiePhaseFunctionDivideByRayleighOptimized(atmosphere_p.mie_phase_consts, nu); + + // Ray march the atmosphere to integrate optical depth + IrradianceSpectrum L = IrradianceSpectrum(0.0f,0.0f,0.0f); + DimensionlessSpectrum throughput = DimensionlessSpectrum(1.0,1.0,1.0); + float t = 0.0f; + float tPrev = 0.0; + const float sampleSegmentT = 0.5f; + float invSampleCountFloor = 1.0f/sampleCountFloor; + Position curWorldPos = worldPos; + for (float s = 0.0f, e = sampleCount*invSampleCountFloor; s < e; s += invSampleCountFloor) + { + float dt; + if (variableSampleCount) + { + float t0 = s * s; + float t1 = s + invSampleCountFloor; + // Non linear distribution of sample within the range. + t1 = t1 * t1; + // Make t0 and t1 world space distances. + t0 = tMaxFloor * t0; + t1 = t1 > 1.0f ? tMax : tMaxFloor * t1; + t = t0 + (t1 - t0)*sampleSegmentT; + dt = t1 - t0; + } + else + { + float newT = tMax * saturate(s + sampleSegmentT*invSampleCountFloor); + dt = newT - t; + t = newT; + } + Length d = t + start_distance; + Length r_d = ClampRadius(atmosphere_p, SafeSqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d); + + G_UNUSED(curWorldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + Position curWorldPos = worldPos + (d + shadow_offset*dt) * worldDir; + float shadow = getShadow(curWorldPos, d, r_d, mu_s_d); +#endif + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, r_d-atmosphere_p.bottom_radius, curWorldPos); + + const float3 sampleOpticalDepth = medium.extinction * dt; + const float3 sampleTransmittance = exp(-sampleOpticalDepth); + + float3 transmittanceToSun = GetTransmittanceToSun( atmosphere_p, transmittance_texture, r_d, mu_s_d); + + + G_UNUSED(worldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + transmittanceToSun *= finalShadowFromShadowTerm(shadow); +#endif + float3 PhaseTimesScattering = medium.scatteringMie * MiePhaseValue + medium.scatteringRay * RayleighPhaseValue; + + // Dual scattering for multi scattering + + float3 multiScatteredLuminance = GetMultipleScattering(atmosphere_p, multiple_scattering_approx, r_d, mu_s_d); + + #if ORIGIN_CAN_BE_IN_SPACE && SHADOWMAP_ENABLED + multiScatteredLuminance *= shadow; + #endif + + float3 S = (transmittanceToSun * PhaseTimesScattering + multiScatteredLuminance * medium.scattering); + + // When using the power serie to accumulate all sattering order, serie r must be <1 for a serie to converge. + // Under extreme coefficient, MultiScatAs1 can grow larger and thus result in broken visuals. + // The way to fix that is to use a proper analytical integration as proposed in slide 28 of http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + // However, it is possible to disable as it can also work using simple power serie sum unroll up to 5th order. The rest of the orders has a really low contribution. + + // See slide 28 at http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + float3 Sint = (S - S * sampleTransmittance) / medium.extinction; // integrate along the current step segment + L += throughput * Sint; // accumulate and also take into account the transmittance from previous steps + + float3 rayS = medium.scatteringRay*transmittanceToSun; + float3 raySint = (rayS - rayS * sampleTransmittance) / medium.extinction; + result.ray += throughput * raySint; + + float3 mieS = medium.scatteringMie*transmittanceToSun; + float3 mieSint = (mieS - mieS * sampleTransmittance) / medium.extinction; + result.mie += throughput * mieSint; + + float3 msS = multiScatteredLuminance * medium.scattering; + float3 msSint = (msS - msS * sampleTransmittance) / medium.extinction; + result.ms += throughput * msSint; + + throughput = throughput*sampleTransmittance; + tPrev = t; + } + + result.L = L; + result.Transmittance = throughput; + return result; +} + +IrradianceSpectrum ComputeIndirectIrradianceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const int SAMPLE_COUNT = 8; + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + Number nu = dot(omega, omega_s); + SingleScatteringResult ss = IntegrateScatteredLuminanceMS( + atmosphere_p, + transmittance_texture, + ms_texture, + float3(0,0,0),float3(0,0,0),0,//shadows + 32, true, float2(16,16), + r, omega.z, nu, mu_s, + false); + result += ss.L * omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum ComputeIndirectIrradianceTextureMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + IN(vec2) frag_coord) +{ + Length r; + Number mu_s; + GetRMuSFromIrradianceTextureUv( + atmosphere_p, frag_coord / vec2(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT), r, mu_s); + //return ComputeIndirectIrradianceSingle(atmosphere_p, transmittance_texture, r, mu_s, 32, 32); + return ComputeIndirectIrradianceMS(atmosphere_p, + transmittance_texture, ms_texture, r, mu_s); +} + +#endif ZYW[YW]Z\]]\\^ٜ [j$̍ dj)hꋪJk*IhAa,ͭ dj)hꋪJk*Ih +$Aa$̍ J*i)*i苪Jk*I苨(ɩAa,ͭ J*i)*i苪Jk*I苨(ɩ$Aa..m dm$͍J*i)*i苪J* + DfAa..m dm$͍J*i)*i苪J ( +ĆfAa̍,ͬAa..m dm$͍dj(H*苪J諩k*I$FgAa..m dm$͍dj(H*苪J˩k*IgAa..m dm$͍$IJ*()i苪J* + ĆfAa..m dm$͍$IJ*()i苪J ( +$fAa..m dm$͍dj)h *)I+*˩)(Hj +f%l.-d$m$m Mn- ,ͭAa..m dm$͍dj)hꫩ* kj(H*+ +J dFfAa..m dm$͍dj)hꋩk*I +$&GfAa..m dm$͍dj)hꋩk*I $gAAa̍,lA8pC #+Jsc#+ +k{C++㢓 skK s+sAccK>#ifndef ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED +#define ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED 1 +/** + * Copyright (c) 2017 Eric Bruneton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * Precomputed Atmospheric Scattering + * Copyright (c) 2008 INRIA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atmosphere\atmosphere_params.hlsli" + +/* +

They use the following utility functions to avoid NaNs due to floating point +values slightly outside their theoretical bounds: +*/ +INLINE Number ClampCosine(Number mu) { + return clamp(mu, Number(-1.0), Number(1.0)); +} + +INLINE Length ClampDistance(Length d) { + return max(d, 0.0 * meter); +} + +INLINE Length ClampRadius(IN(AtmosphereParameters) atmosphere_p, Length r) { + return clamp(r, atmosphere_p.bottom_radius, atmosphere_p.top_radius); +} + +INLINE Length SafeSqrt(Area a) { + return sqrt(max(a, 0.0 * m2)); +} + +/* +

Transmittance

+ +

As the light travels from a point $\bp$ to a point $\bq$ in the atmosphere_p, +it is partially absorbed and scattered out of its initial direction because of +the air molecules and the aerosol particles. Thus, the light arriving at $\bq$ +is only a fraction of the light from $\bp$, and this fraction, which depends on +wavelength, is called the +transmittance. The +following sections describe how we compute it, how we store it in a precomputed +texture, and how we read it back. + +

Computation

+ +

For 3 aligned points $\bp$, $\bq$ and $\br$ inside the atmosphere_p, in this +order, the transmittance between $\bp$ and $\br$ is the product of the +transmittance between $\bp$ and $\bq$ and between $\bq$ and $\br$. In +particular, the transmittance between $\bp$ and $\bq$ is the transmittance +between $\bp$ and the nearest intersection $\bi$ of the half-line $[\bp,\bq)$ +with the top or bottom atmosphere_p boundary, divided by the transmittance between +$\bq$ and $\bi$ (or 0 if the segment $[\bp,\bq]$ intersects the ground): + + + + + + + + + + + + + + + + + + + + + + + + p + q + i + o + r + ?=cos(?) + x + z + + +

Also, the transmittance between $\bp$ and $\bq$ and between $\bq$ and $\bp$ +are the same. Thus, to compute the transmittance between arbitrary points, it +is sufficient to know the transmittance between a point $\bp$ in the atmosphere_p, +and points $\bi$ on the top atmosphere_p boundary. This transmittance depends on +only two parameters, which can be taken as the radius $r=\Vert\bo\bp\Vert$ and +the cosine of the "view zenith angle", +$\mu=\bo\bp\cdot\bp\bi/\Vert\bo\bp\Vert\Vert\bp\bi\Vert$. To compute it, we +first need to compute the length $\Vert\bp\bi\Vert$, and we need to know when +the segment $[\bp,\bi]$ intersects the ground. + +

Distance to the top atmosphere_p boundary
+ +

A point at distance $d$ from $\bp$ along $[\bp,\bi)$ has coordinates +$[d\sqrt{1-\mu^2}, r+d\mu]^\top$, whose squared norm is $d^2+2r\mu d+r^2$. +Thus, by definition of $\bi$, we have +$\Vert\bp\bi\Vert^2+2r\mu\Vert\bp\bi\Vert+r^2=r_{\mathrm{top}}^2$, +from which we deduce the length $\Vert\bp\bi\Vert$: +*/ + +INLINE Length DistanceToTopAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.top_radius * atmosphere_p.top_radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +INLINE Length DistanceToSomeAtmosphereBoundary(Length r, Number mu, Length radius) { + if (r > radius) + return 0; + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + radius * radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +/* +

We will also need, in the other sections, the distance to the bottom +atmosphere_p boundary, which can be computed in a similar way (this code assumes +that $[\bp,\bi)$ intersects the ground): +*/ + +INLINE Length DistanceToBottomAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return ClampDistance(-r * mu - SafeSqrt(discriminant)); +} + +//return -1 if no hit +INLINE Length DistanceToBottomAtmosphereBoundarySigned(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) +{ + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return mu < 0 && discriminant >= 0 ? (-r * mu - sqrt(discriminant)) : (-1 * meter); +} + +/* +

Intersections with the ground
+ +

The segment $[\bp,\bi]$ intersects the ground when +$d^2+2r\mu d+r^2=r_{\mathrm{bottom}}^2$ has a solution with $d \ge 0$. This +requires the discriminant $r^2(\mu^2-1)+r_{\mathrm{bottom}}^2$ to be positive, +from which we deduce the following function: +*/ + +INLINE bool RayIntersectsGround(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + return mu < 0.0 && r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius >= 0.0 * m2; +} + +/* +

Transmittance to the top atmosphere_p boundary
+ +

We can now compute the transmittance between $\bp$ and $\bi$. From its +definition and the +Beer-Lambert law, +this involves the integral of the number density of air molecules along the +segment $[\bp,\bi]$, as well as the integral of the number density of aerosols +and the integral of the number density of air molecules that absorb light +(e.g. ozone) - along the same segment. These 3 integrals have the same form and, +when the segment $[\bp,\bi]$ does not intersect the ground, they can be computed +numerically with the help of the following auxilliary function (using the trapezoidal rule): +*/ + +INLINE Number GetMieDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + //return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude));//todo: exp2 + return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude)) + +atmosphere_p.mie2_strength * saturate(exp(atmosphere_p.mie2_density_altitude_exp_term * max(0., altitude-atmosphere_p.mie2_altitude)));//todo: exp2 +} + +INLINE Number GetRayDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(exp(atmosphere_p.rayleigh_density_altitude_exp_term * altitude));//todo exp2 +} + +INLINE Number GetAbsDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(altitude < atmosphere_p.absorption_density_max_alt ? + atmosphere_p.absorption_density_linear_term0.x * altitude + atmosphere_p.absorption_density_linear_term0.y: + atmosphere_p.absorption_density_linear_term1.x * altitude + atmosphere_p.absorption_density_linear_term1.y); +} + +struct MediumSampleRGB +{ + DimensionlessSpectrum scattering; + DimensionlessSpectrum extinction; + + DimensionlessSpectrum scatteringMie; + DimensionlessSpectrum scatteringRay; +}; + +INLINE MediumSampleRGB SampleMediumFull(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos)//worldPos is for other volumetrics +{ + G_UNUSED(worldPos); + Number densityMie = GetMieDensity(atmosphere_p, altitude); + Number densityRay = GetRayDensity(atmosphere_p, altitude); + Number densityAbs = GetAbsDensity(atmosphere_p, altitude); + + MediumSampleRGB s; + + s.scatteringMie = densityMie * atmosphere_p.mie_scattering; + s.scatteringRay = densityRay * atmosphere_p.rayleigh_scattering; + s.extinction = densityMie * atmosphere_p.mie_extinction + s.scatteringRay + densityAbs * atmosphere_p.absorption_extinction; + DimensionlessSpectrum msScattering = DimensionlessSpectrum(0,0,0); + #if CUSTOM_SKIES_FOG + getSkiesCustomFog(s.scatteringMie, s.scatteringRay, msScattering, s.extinction, altitude, worldPos);//todo: add fixed phase fog + #endif + s.scattering = s.scatteringMie + s.scatteringRay + msScattering; + return s; +} + +INLINE void SampleMedium(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos, + OUT(DimensionlessSpectrum) scattering, OUT(DimensionlessSpectrum) extinction) +{ + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, altitude, worldPos); + scattering = medium.scattering; + extinction = medium.extinction; +} +/* +

With this function the transmittance between $\bp$ and $\bi$ is now easy to +compute (we continue to assume that the segment does not intersect the ground): +*/ + +INLINE DimensionlessSpectrum ComputeTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, Length r, Number mu, Length maxDist, int SAMPLE_COUNT, + IN(Position) worldPos, IN(Direction) worldDir//only for custom fog + ) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + + Length dist = min(maxDist, DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu)); + Length dx = dist / Number(SAMPLE_COUNT); + // Integration loop. + //generic loop, works for any medium + DimensionlessSpectrum sampleScattering, sampleExtinction; + SampleMedium(atmosphere_p, r - atmosphere_p.bottom_radius, worldPos, sampleScattering, sampleExtinction); + DimensionlessSpectrum extinction = sampleExtinction*0.5; + for (int i = 1; i < SAMPLE_COUNT; ++i) + { + Length d_i = Number(i) * dx; + // Distance between the current sample point and the planet center. + Length r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r); + SampleMedium(atmosphere_p, r_i - atmosphere_p.bottom_radius, worldPos + worldDir*d_i, sampleScattering, sampleExtinction); + extinction += sampleExtinction; + } + SampleMedium(atmosphere_p, sqrt(dist * dist + 2.0 * r * mu * dist + r * r) - atmosphere_p.bottom_radius, worldPos + worldDir*dist, + sampleScattering, sampleExtinction); + extinction += sampleExtinction*0.5; + return exp(-dx*extinction); +} + +/* +

Precomputation

+ +

The above function is quite costly to evaluate, and a lot of evaluations are +needed to compute single and multiple scattering. Fortunately this function +depends on only two parameters and is quite smooth, so we can precompute it in a +small 2D texture to optimize its evaluation. + +

For this we need a mapping between the function parameters $(r,\mu)$ and the +texture coordinates $(u,v)$, and vice-versa, because these parameters do not +have the same units and range of values. And even if it was the case, storing a +function $f$ from the $[0,1]$ interval in a texture of size $n$ would sample the +function at $0.5/n$, $1.5/n$, ... $(n-0.5)/n$, because texture samples are at +the center of texels. Therefore, this texture would only give us extrapolated +function values at the domain boundaries ($0$ and $1$). To avoid this we need +to store $f(0)$ at the center of texel 0 and $f(1)$ at the center of texel +$n-1$. This can be done with the following mapping from values $x$ in $[0,1]$ to +texture coordinates $u$ in $[0.5/n,1-0.5/n]$ - and its inverse: +*/ +#endif ZYW[Y[]\[[ [|Isc#+C #+"+3Ks+sAiPIsc#+C #+:c{ csAccKiPIsc#+sAccKiPIsc#+zc{ +KcKsAcciPIsc#+C #+:c{ csAccKiPIsc#+ k{C++{1sK{ssAccKiPIsc#+s ccJ;Ck +CsAccKiPhP!+3Ks+*J"jbJbJ*AIiP!+3Ks+i +zjrJbJ:BiP!+3Ks+i +zbJ:BiPhP!+3Ks+!r +jJbJ:BiP!+3Ks+a +j*bJ:BiP!+3Ks+!r +jJbJ:B* +b*JiPhP*s#+{jsKcJ;CkPkP1c{ { +#KiP1c{ {c{3b ;iP1c{ !K+K{s+ c+iP1c{ {ÓiP1c{ {ÓiP1c{ {ÓiP1c{ {*cz{K;Kscc +#KiPiPhP*s#+{cJ;CkPkP1c{ aK;Cz +#KiP1c{ aK;Czc{ r;c+ c+yy r;c+ c+K;sK{s Ks{s C #{KkP1c{ aK;C#J+K{s r;c+{23+iP1c{ +K" c+iPiPhP8bz +b22*BaJ;Czs33+K+;K+CIiPkP1c{ iiP1c{ 9c{kJsiP1c{ ++s{{+{{#iP1c{ {c#K+{iPiPhPhPxQz"z{B{{k+kP*ã+! + C{{k++ã+++;K+CIiP +kc+ +C{{k++ã++ kc+ ++;K+CIiPPyiPhPhPI3s#+3iJjP!+3Ks+iJAqɑɹəIiP)s#K3kPhPxQz"z{B{{k+kP@ c39+B{{k+ˣ*z{#CA c3aK;C#JcA c3!Kc1c{ {{kc{{c{ +KiPkPA c3K#+ CaK;C#JsKqiPA c3AaaIiPA c3AaaIiPA c31{ #q{k cK+C{CK#+caK;C#JKIiPK#+{CaK;C#Jc1{ #KiPI3*z +B*" +bj +Jr:jPA c3y C+# cj Ks;CA c3A!{CK#+c!KKa!{CaK;C#Jc!KKa!{C1{ #c!KKIa{{kc{ +KiP)c+kPA c3CK sA!{C1{ #c!KKa!{CK#+c!KKIiPA c3A c3ACKyAQiJJa {3 +A!{CaK;C#Jc!KKIyiJQ{{kKiP)s#K3kP+siPkPhP0c{ 9+B{{k+˳ +c+C1c{ aK;C"Kc1c{ !Kc1c{ {{kc{{c{ +#c1c{ +K"KiPkPA c39+B{{k+ˣ*z{#CaK;C"Kc!Kc{{kc{ +#KiP +rBjPI3A sCyCaIIIiP+siP1c{ C{{k++Û!b{#CiPC{{k++ã++ciPA c3Ac+K"cIIq;iP+s:zcJs+ 2 +CC{{k+sKqiPkPPyiPhP@ c3 c˃B{{k+Kr+sKC1c{ aK;Czzc##Jc1c{ aK;C#Jc1c{ +K"c1c{ +Û c+{ K{sc1c{ +s +s K{sKiPkP+s+s +s K{siPxyI3C{{k++ã++ qbbjPxyI3C{{k++ã++ qbbjPyy{{c{ +#+Û c+{ K{siPyy1c{ {{k C+Û c+{ K{sKiPyy +rBjPyyI3A+K"+s +s K{sqIiPyy+s+s +s K{siPyy+s9+B{{k+˳ +c+CaK;C#JcaK;Czzc##Jc{{kc{ +#c+K"KQ+s +s K{siPxy)c+kPkPhPhPxy1{kAyy # s+s+ cKk++s#+Ks;s{k{yC+{yq ;C"{;{Is#+sAkckPxyAyy # s+s+ cKk++s#+Ks;s{k{yC+{yq ;C"{;{q +;C#z;*C 2Js cs#3kP@ c3 cjK{C #{CA c3qzcbA c3 zJiPkP+sAA c3K +C CqzcJYA c3CqIQ{A zJiA c3CqIIiPkPhP0c{  Kj KC1c{ K;Cc1c{ c1c{ 1{ #KiPkP1c{  KK;CiP1c{  KiP1c{  K1{ #iP+s1c{ AiP Ksc Ksc KsciP Ksc Ksc KsciP Ksc Ksc KskPIiPkPhP0c{  s;+s{{c#C1c{ +c1c{  s;+sJiPkP1c{  C s;+srKq1c{ AaaI1c{ AaaIiP1c{  s;+sq{k cK+C{Cc s;+sJIiP1c{  s;+s{C s;+sb s;+sJiP+s s;+sQ+sY s;+sQ+sY s;+sQ+siPkPhP0c{ ++s{{C1c{ ++s{KiPkP+s++s{Q++s{{+{{#sY++s{{+{{#sѻiPkP H\ʸȸؘ\hH[YYZY\ڙ [HBU] [ݝX][\؛]K[܋ L KL[\ٗ]Wۛ]ٗX] Y[\Q]XY +[\\]\Q]X [HT\TYZHJ^[YݛH\\]\Q]X +HT\TYZN[\QݛH\]\]J H Yݛ +YݛHN\]\Qݛ +\QݛNH_B[YQ]XY +[\Q [HT\TYZHJ^[H][]]ڛHJ[\Q  LLJNH][]]ڛH\]\]J][]]ڛ +\Q]XY +\Q HT\TYZHJN\]H][]]ڛNH_[Y][Y +[ ۛ\[[^SUݛ [ [Q [[][X[ [[][ٓ\]J^ ȓZTU [[][X[HH  H[ + L  +\[H S]HJN [[][ٓ\HHS] +H[X[NB[H +[Q ۛ\[[^SUݛHN[H][]]ڛH\]\] +[][X[ +[][ٓ\HN \Z\\]ڛ[\]H][]]ڛ +H][]]ڛNH_BB H\YHHYț\Z]H]XYXZ[\YXK [H[țHZ\țH\YH TJ H  +\]YH[HJK T]YH[\Y[HH\ Y +ٛHZ\Y H\Y[HH] Y +ٛH\YZ \TY[TH\ +\]YH[H HH L +ٛHZ\Y H  + +L +H +ٛHYZ Z]H[X\Y[H[][[XZ\ٓQ +[Z] [\TY[THJ^[\Z]H\J H Z] +Z]HNB[H[][[XH N ]]]HHY\]][Zț\Y[ٛ\[[K Z\H Z\HZX]Z]\ +\TY[TH +K Z]H\ +\TY[TH +HH\HHL Z[]X\XXH[YHHZ] +Z]\TY[T\ HH\\]\] +Z]H +H]YKH +Z] +Z]\TY[THJ^H[][[XH\TY[T +\]\] +Z]HNH_H\Y^[H\J  \TY[TH H Y ћHYZ\Z[YH \[HHH  + +Z] \Z]HN[\Z]T]H\Z] +\J H H +H^NH[][[XH +Z] +HۜQ J^ +H  +\Z]T]H + +\TY[T +H]\Z]T] ^NH[][[XKTNH_\]H[ +H[][[X  YNB_B[H[][[XZ\Y][]]ڛ +[ ݛӛ\[ [ YS [[TYZ [\Q]J^ Z\H][]]ڛ[[Z]H[X + +ݛӛ\[ YS] + H KNN KNNN + [XH[HYX\Y U[Y\]ZțZ\[\]HZ\YXY H]H[H[Y]YX ZZKNNNYB[\STYZH[TYZ +[TYZN[\TY[THH[ +\STYZ \Q KNNNYN[H[][[XHH[][[XZ\ٓQ +Z] \TY[THN\]H[][[XNB_BB[H[][[XQZ][]]ڛ +[ ݛӛ\[ [ YS [ [[ӛ\[ [[TYZ [\Q]J^ QH][]]ڛ[[Z]H +ݛӛ\[ YS]N[\STYZH[TYZ +[TYZN [Z\YX\[\]Z[][\TY[TH\STYZ  +\STYZ +H[ +\STYZ \QHJN HS][X\]\] + +[[ӛ\[ H YS]J +X]H[ș[\K[H[][[XHH[][[XZ\ٓQ +Z] \TY[TH + +\]\] + +[[ӛ\[ H YS]JN\]H[][[XNB_B[[\\X[ ݛ [ Wٗ\YZ [ [Y\]ڛ [[][X[ [[][ٓ\ [ZY[[][]]ڛ [[ Y[S [[ [ []J^[ [HWٗ\YZݜ ^^ݛۜ ^N[YT[SH +[ [ [ []N[Q[SH\ + L +YT[S]NY[SH[ [Q[SN[HTTH +۝ +Wٗ\YZݜ]JNHY[[][]]ڛHYQ]XY +YT[S HTTHNY[[][]]ڛHY[[][]]ڛY][Y +H Y[S [Y\]ڛ [][X[ [][ٓ\]NB_BZH\YZ\ӛ\[[^]ڛ +[[ [[T^ [HHJ^ [\]Zۛ\[[^]ڛYݛܜK ]ZH\Z\ۛ\[[^]ڛ +ٛ[[H]\Y [[ۛ\[[^]ڛ[JZYH\]\] +[T^ [[NZۛ\QݛHH  +H +K +YHN\]ۛ\Qݛ +ۛ\QݛNB_BZ H\YZ\S +Z  Z  ZH Z[T^YJ^B H]\ZZ\KZ X]QHH  + T + +NHH X]Q +\]\] +[T^  +[X]Q\JLYM +HNBBB\] ^NB_BZ Z\Y\YS]]\]ڛ +Z  Z  Z  ZWZ Z[T^HJ^Z [UHZ + ^ H YNZ H\[ SNB[U٘ ^HH\YZ\S  WZ [T^YNB ӛ\[[^KZ[HH[ +[ +[U٘ ^H + HLYMN[U٘ ^K[NB H[Yۛ\[[^]ڛ[[U٘HH\YZ\ӛ\[[^]ڛ +[ [T^ WZHNB\][UNB_BBaDHd5FV&7Ǖ6VGVEffV7W%&Gf6ǖF$^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@x\|f@ʘP@f@ʆ@R@@@ʆv^^@@@@X@@@@@^^@Z@@@f@ʄP@f@ʆX@@X@@ެX@@ޘX@@ސ@R@@@r`@z@`\j@V@d@T@ސ@T@ސ@T@v@@@Ȭ@z@b@V@Pr`@Z@bR@T@jPb@Z@ެRv@@@Ș@z@b@V@Pr`@Z@bR@T@jPb@Z@ޘRv@@@ʆ@T@P@Ȭ@T@Ș@Rv^^@@@@X@@@@@^^@@@@X@@@@@ʄȌP@@X@@ެX@@ޘX@@ސ@R@@@@z@`\jv@@@@z@P`\hj@T@@Z@`\hnjR@T@@V@b\`v@@@r`@z@@V@d@T@ސ@T@ސ@T@v@@@Ȭ@z@b@V@Pr`@Z@bR@T@jPb@Z@ެRv@@@Ș@z@b@V@Pr`@Z@bR@T@jPb@Z@ޘRv@@@P@Ȭ@T@Ș@T@Rv^^@@@@X@@@@@f@ʄP@f@ʆX@@X@@ެX@@ޘX@@ސ@R@@@ʆ@T@ʄȌP@X@ެX@ޘX@ސRv^^@@@@X@@@@@@ʆ܌P@@X@@ެX@@ޘX@@ސX@@ސX@@ޤzbR@@^^@@@@ވ@X@@@^@@@@@@^^@@@@NN@@@@z@Tv@@@d@z@Tv@@@@z@P@Pb\`@^@bp\`R@T@dP@d@^@d@Z@b@R@Rv@@@`@z@ސ@V@jPb@Z@ސRv@@^^@@@@@@@@@@@@@\@@^^@@@@@@@@@@@@@^^@@@@@NڦN@X@@@@@@@@@^^@@@@@@@`\nj\@@^^@@@@@b\`@@@@@@\@@@@ڦ@z@`\njv@@@b@z@Pb\`@Z@ڦ@T@jPb\`@Z@ޘRR@T@Pb\`@Z@ڦ@T@jPb\`@Z@ެRRv@@^^@@P`R@@@b@@@@@@z@P@`X@bX@P@d\d@T@@Z@`\j@R@Rv@@^^@@@\@@@@z@P@Pfh\j@T@@Z@jr@R@T@@V@dh\j@R@T@ސ@T@dP@ZP@nf\d@T@@Z@db\dX@p\r@R@T@P@ސ@R@Rv@@^^@@@@@@@@@@Tz@ޤv@@@P@@V@@Rvf@ʆP@f@ʆX@@X@@ެX@@ޘX@@ސX@@ސX@@ޤzbR@@@ʆ@T@ʆ܌PX@ެX@ޘX@ސX@ސX@ޤRvf@ʞܜP@f@ʆX@@X@@ެX@@ޘX@@ސ@R@@@ޘ@z@d@T@ސ@Z@bv@@@@z@@T@v@@@d@z@@T@v@@@b@z@b@Z@`\j@T@d@TPd@V@`\ffRv@@@@z@ޘ@Z@ެ@T@ޘv@@@d@z@`\hj@T@d@T@Pd@V@`\`rR@T@P@@|z@`@~@@T@PPޘX@ެRR@t@`@Rv@@@ʆ@T@Pb@V@dRv@@^^@d@z@`\hj@T@d@T@Pd@V@`\`rR@T@@T@P@@|z@`@~@P@bX@ޘ@^@ެ@R@t@ޘ@Rv@@^^@ʆ@T@P@ޘ@T@b@V@d@Rv^^@@@@X@@@@@^^@@@@@^^@@@@@^^@@@@@@@@@@@@f@ʈ@P@f@X@f@X@@ȾX@@R@@@@z@b\`dfhb@T@@Z@b\jbbnhv@@@@z@Z`\jbbn`j@T@@V@`\njjplpv@@@@z@@PP@ȾT@@V@R@T@Rv@@^^@@@@@@@@@@@@@@@PX@X@@RvF6&r" 902941:227/1923494k2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVfRd%$Ed4Ԡ0BVfVRd%$Ed4ӠР0fFVfdՔ$ՠ0BVfVdՔ$R֠0RFf֠РҠRf'$EdԠҠРf&rVFUf'$Ed$'f–V&%VwV67ffҠנ&f"3"rTFGv&W762fBTG"67$ՠDGFBbFV'rBW&Ҡ26GfF2#sSRs###ҷӠ26GfF2C#SCCҷӠfF"–V&%VwV6722ӠfCҖ""R'Ғ"f""璷Ӡ"WFW'f&CCC"wӠנРf6Rf'$Ed'f62W6V&7&f–V&%VwV67ffҠנ&f"3"rTFGv&W762fBTG"67$ՠDGFBbFV'rBW&Ҡf&$rVFUf'$Ed$'–V&%VwV67fӠ"WFW'2W6V&7&$$䒗2FW'FWdՔ$2W6V&7&rӠנРРfRf'$Ed'VFƆf–V&%VwV67ffҠנ2V6Rf'$Ed'C"VwV67fҠ26Gf&2#sSҷӠ26Gf&2C#SҷӠf&"–V&%VwV6722Ӡ"WFW'Җ""R'Ғ"f""璷ӠנР0RFf֠AH!p͡qՑq}͡}ɥͱQ7<34:$''&! 6634929227<34:4479%#* 6634929243723) "/) *$/#242) "/) *$/#*72:1:172429/$2429/ &/$3:479297<06088707#)( *:6600098722220725730:006:17910829"270<*0272706:17& 14:=072$ ):7"230:99:30:4730:094730:<30:<30:9393<93989:39:1774974152980:764364970217971014222:9747,399/$:479297<06088707#)( *:66000987730:479:30:4730:<47479732:732:979/ &/$99::47929<29706088707#)( *:6600098772222"327:088707979:201027::177007)1:703$76)06 <30:0079:30:4730:<472:97<3093<<:7239/:7239/ &/274 k-Ln+m -L.L심,ͭlm-9 ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4( I]I}%9M}!I5( I]I}%9M}!I4(4(4(4(|!I]I}5Q15(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(4(L!I} =5A%1I}!1M14(L!I} =5A%1I}!1M1Ā4(5(4(AU}QIQ4(@%̸Ԙ5(@%̸Ԡ5(4(AM%1=94(T9%Q}a͠ĸ4(T9%Q}e͠ĸ4(T9%Q}i͠ĸ4(4( M}IYIM %QM4(LAIQ}M5A1I}= ) Q4(ՉՉ}ɕ}}ѕ}}ͽ}5(ՉɀՉ}ɕ}}ѕ}}ͽ}5(Չ̀Չ}ɕ}}ѕ}}ͽ}5(ՉрՉ}ɕ}}ѕ}}ͽ}5(4(ᕑ5(ᕑɀ4(ᕑ̀4(ᕑр4(4(с͠ссс4(5(ȕɹᡄᡈ4(5(с͠ссс4(5(ȕɹ4(5($9YI%9Qी5(4(с̀͠4(5(ȕɹ͠ీ䱀4(5(сѠсссс4(5(ȕɹᡴᡄᡈ4(5(сѠсссс4(5(ȕɹ4(5(4(@I %Mɕ͕5(LEIQ}MQीѡ̅Ʌѕ।4(XM}=UQ}A=M%Q%=9рLY}A=M%Q%=94(ЕɅٱ᱀奀LɅ|ͅхѕ٥局᱀4(Е٥L1ٕ|ͅхѕ٥局٥ܥ4(Е٥L1ٕ|ͅхѕ٥鱀٥ܥ4(Е U ٥L1ٕ|ͅхѕ٥鱀ٹܥ4(Е U Ʌ屽ٱL1ٕ|ͅхѕ٥ݱ4(Еɽ٥L|ͅхѕ٥彠٥ܥ4(Е٥L|ͅхѕ٥4(Е٥L|ͅхѕ٥4(Е U ٥L|ͅхѕ٥4(ЕɕѡɡЍѡɡ|ͅхѕЍ4(Еᕱэ=͕ѡЍͥ0͠Ѝͥ4(Еɕ=͕ѡЍͥL|ͅхѕЍͥ4(Еɕ1=͕ѡЍͥL1ٕ|ͅхѕЍͥ4(4( 15A} =II؅4(0==Alu5(T9I=11lչɽu5(I9 !lɅu5(1QQ9lѕu5(4(5AQe}MQIU QՍс5( 1I}U9UM}55 I5(HQUI9}5AQe}MQIU Q4($9%Q}5AQe}MQIU Q4(4( ]}UM}M I9}A=M5(Q}M I9}A=M}ͥ}5(Pa1Q !}%95(Pa1Q !}%94(4( ! -}QaQUI5( ! -}QaQUI}aAIЍ4( ! -}QaQUIIIe5( ! -}QaQUI5( ! -} UI4( ! -} UI}aAIЍ4( ! -}MQIU QUI} UI4( ! -}MQIU QUI} UI}aAIЍ4( ! -}MQ9 %15(рЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(̀Еᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(ɀЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(сЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(рЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(рЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ЕᕱэЍЕᕱэ ͕Ѝ|%1}|}1%9}}Ĥ4(4(р ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(̀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ɀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(с ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕ՙԥсЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕LՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕H]MՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5(ԥс ՙ ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5( ՙɡЍ ՙ ͕Ѝ|%1}|}1%9}}Ĥ4( ՙɠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4( ՙ͠Ѝ ՙ͕Ѝ|%1}|}1%9}}}}4( ՙѠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4(ؽѽɕ ՙ ͕H] ѕɕ ՙɁсЍԥс؅Օссс4( ! -} UI4(LѽɕЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥɀ؅Օссс4( ! -} UI4(LѽɕɠЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥ̀؅Օссс4( ! -} UI4(Lѽɕ͠Ѝ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥр؅Օссс4( ! -} UI4(LѽɕѠЍ؅Օ4(5(ѽɕ ՙɡЍ؅Օѽɕ ՙ ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙɠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}}}4(ѽɕ ՙ͠Ѝ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙѠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(Սɕ ՙѡЍmեѡ ! -}MQIU QUI} UI}aAIЍЍt5(ՙѡЍmեѡ ! -} UI}aAIЍЍt5(ЕɕѡЍmɠ ! -}QaQUI}aAIЍЍt5(5(4(ԥсѕэ ͕PɕԥɀЍссс4(4( ! -}MQ9 %14(ȕɹmэu4(5(ѕэЍѕэ ͕Ѝ|%1}|}1%9}}}}4(4(L!I} =5A%1I}!1M14(̕ѡ而5(ɡ5(5(4(̀͸ѕɡ̀؅4(5( 1}AI %M%=95(ȕɹ؅и4(͕5(ȕɹ̕ѡ͙ѕѡ؅؅᱀؅͠4(5(5(4(m^Fp͡qՑqɹͱ7<34:$''&! 6634929227<34:4479%#* 6634929243723/!)"'242/!)"'41:243/192349441:29:0/192349441:227/192349443272242$#/&")*242$#'"/ )242$#/*),242$#/*)/$""242$#! '43723!)"/$#242!)"/$#"$#/*)/$"$#'"/ $#/*)$#'"/ $#/*)$#/&")274172:9:4:77:17242)//!$''242)// ''242)/#,43723!)")/242!)")/")/#2742:10:207779904242)&($*242)/ ''242)""'242))$%242)$*#,242)$*')" ""242)$*')" " ((',43723!)")242!)")#)$*')" "274#92242)//'"242)/)$%242)//#)"&43723!)")/242!)")/#)/)$274)243723)")* 242)")* )27430!)"/432304377930:40934930:7+30:7&30:743!)"/$#"$#/&")2:97432629:43779243!)"/$#"$#'"/ 2:9743'2709437794093497+7&7$243!)"/$#"$#/*)2:97432:9<437794093497+7&7$243!)"/$#"$#/*)/$"2:97432:9<422437794093497+7&7$243!)"/$#"$#! 297906643227:!)"/4324:472:9727430!)"/432304377930:40934930:7+30:7&30:7$30:743!)"/$#"$#/&")2:97432629:43779243!)"/$#"$#'"/ 2:9743'2709437794093497+7&7$243!)"/$#"$#/*)2:97432:9<437794093497+7&7$243!)"/$#"$#/*)/$"2:97432:9<422437794093497+7&7$243!)"/$#"$#! 2:9743!07437794093494093497+7&7$727430:!)"/9:4:7730:3068030:743!)")/")//!$'2:979:4:77!477306807$243!)")/")// '2:979:4:77077306807$243!)")/")/#2:979:4:7#,306807$2749#7&730:!)"2:1444<30:3068030:7+30:7&30:743!)")#)&($2:972:684:243!)")#)/ '2:972:<0777+7&243!)")#)""2:972:2277$243!)")#))$2:972:145306807+7&243!)")#)$*#2:972:4:4306807+7&243!)")#)$*')" "2:972:4:792022306807+7&243!)")#)$*')" " (('2:972:4:79202 887<306807+7&27430!)"/3926309:077930:743!)")/#2:973926729:0779243!)")/#2:973921459:07797$243!)")/#2:973926#9269:07797$27430!)"9:0930:3068030:7+30:7&30:7$30:7$06392):23:406927730:"!)"/9:4:7730680730:#!)"2:1444<306807+7&730:6:"2:97:6364::8;39:42;7727:80:/774/39:4//81/;823740627702347730:6:)17730:0:02/'7:+30:'30:30682:970:02;0:02/'7:+'2<8306803068040934940934306804093494093406907092!)"//'&30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06706309277930::09243)* / !""!)"/$#"$#/&")2:97432629:24377230$7042;34:430:7$0:027:70630:7$0:027:;06432!)"/4322437794093497+7&743)* / !"309:09!)"9:09306807+7&7$7$:092<92779:0):23:30#!)"/39269:077972:97432#9:022:974327427406907092!)"#30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06706309277930::0922:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;70692779:092706907092!)"//'&30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06702:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;7063006907092!)"#30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06702:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;706307''*4<720724:47:2909979268229:4:7#,479:0/19234947:222447:44949>494949>494949>494949<###>49<####4949<###>49<####2:97430:29<47:447:79:30:3130:79:30:"22242:9730:"30679068#,30:"30:079:30:84$"79:30:9*2089:"0"79:30:47*2089:9*209*230$<47*2098$<47*20478$=9*22:9730:#,30:030:779:30:27$077$2:970$230:67902(2#,30:9*2030:02:979*20#,09*230:):09(2330:7$30:030:72:9767902(2#,7$00<7$30:40230772:977:77930274 k-Ln+mk-LM,m- ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(L!I}1= 1}!1M15(L!I}1= 1}!1M14(4(Ցɑ݅ɕ}͹ͱ4(4(сɠсɕɹ5(сѠсɕɹɠ5(с᠘сɕɹѠ5(ɀ|ٕɠɀɕɹ5(̀|ٕ̀͠ɕɹ5(р|ٕѠрɕɹ5(4(ɀɠɀɕɹ5(̀ɠ̀ɕɹ5(рɠрɕɹ5(рѠрɕɹɠ5(р᠘рɕɹѠ5(рؠрɕɹ᠄5(сՠс왱с؁􀄩ةȕɹة5(4(ɠɕɹ5(Ѡɕɹɠ5(ՠ졅􄩄퀄ѨȕɹѨ5(4(сAݡс`сdȕɹݡᡄ͡`Ęd5(4(̀PQ]ɱ̀ر̀P 94(5(ȕɹձP 9إ4(5(4(̀Q 9̀84(5(̀P 94(4(̀Pɽ͡8T9%Q}e4(P􀰕ɽ͡8T9%Q}aPѕAM%1=9ѡPP4(P􀸽ɵ镡P4(4(с̀􀸽ɵ镡ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(̀Q 9̀8̀P4(5(P􀸽ɵ镡PѡP884(с̀ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(сɥ}願сȅѡɀ}ѡ4(5(ȕɹȍ}ѡ}ѡ䁨ȅѡ4(5(4(mjFX.\shaders\include\specular_brdf.hlsli d .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$̍ d +h)HKH iAa,ͭ d +h)HKH i $AAa$m g-LM,m-ͧAA)mL,ldl-LHHFI*H*mNŨA*mFI*AAa$̍ $)+IAa,ͭ $)+I +Aa̍,ͬAAdK- $&D鍬m - Ďl. Md Ld.ύl.M .mNlNA-,mN.M.M- Č- + -Č- $AaAČ-M + - D + -lAČ-M$M$fADN Mf%&Dd-  MFE$e,.m. D,* - $͍̍.--- nM$m,. D,*AAAdKll- $&fD + dn,L. lN-̭.m .̮lL D dN,llNA-,mN.M.Mll- Č- + -Č- $AaAČ-M + - D + -lAČ- I D iADN  I$&MD I&$MD ID I$e,.m. D,* - $͍̍.--- nM$m,. D,*AAA JNL.쬬E,NA-,mN.M. Č- + -Č- $AaAČ-$ -L + - D + -lAČ-  D$ -L $D d$f'D-ADN $ -L- %L $e,.m. D,* - $͍̍.--- nM$m,. D,*AAA$-mN .m (mέ,A-,mN.M.+-m Č- + - Č- + -,Č- Č-nČ-nČ-n$ $AaAČ-  $eAČ-$ $ $eAČ-  I N + - +d$ I% N + -,+d I iADN $- % + - K + -, DL $e,.m. D,* - $͍̍.--- nM$m,. D,*AAA%h-m -ͭAnNe-Ln.mLM NlneE&&ee-,A-,mN.M.m Ō- + -Č- )AaAČ-DN + - D + -lAČ-dmN  D iAČ-d.M $dmNmAČ-d.͍ d.M Dd.MmADN e.͍ dD emN e.M DDN&%%%dDDN&Dd.͍-e,.m. D,* $m䭭-AAA-쭭N./ -m,%AaADN EfAAA-쭭N.ϩ- Č-͊Č- $AaADN Dn D- 鍉 +$d%&eAAA-쭭N.omMN.m Ō- Č-鍉Č-͊Č- Č- + -,AaAČ-ĉ썎k- - 鍉&eAČ-ĉk- - ͊&eAČ- ˊ DF  iADN - -  ˊ Dĉk-  ˊ Dĉ썎k- ,$&eAAAdk D&D$-mL,lD,l d dl-L- DL 퍬 . $ M.m d. -LA-쭭N.o Č- $AaADN Dn D D $eAAA-쭭N.oj -ml Č- + -Č-͊Č- $AaAČ-d N + - $DƥfAČ-쭭N.oj -ml + +D%d-ddmAČ-쭭N.oj -ml  D%d-ddmADN E쭭N.oj -ml +D쭭N.oj -ml $eAAAd- L MA-쭭N.o- Č- + -Č-͊Č- $AaAČ-$LN + - $eAAČ-쭭N.o- + +dd.N +D + +D$L&d$L$eAČ-쭭N.o-  dd.N D  D$L&d$L$eADN Dn 쭭N.o- +D쭭N.o- $eAAA$ /-. dMN- d- L M,NA-쭭N.o-mMN- Č- + -Č-͊Č- $AaAČ-$LN + - $eAČ-쭭N.o- + Dd.NJ + +D$L&d$L$eAČ-쭭N.o-  +Dd.NI  D$L&d$L$eAŌ-$  + -lAŌ-쭭N.o- + D +D$$ $d$ $eAŌ-쭭N.o-  +D D$$ $d$ $eADN ƥDDn 쭭N.o- +d쭭N.o- $%eAAA$ /-. D-͍d- L MAd ,ND&DʍLn.̍,  )ln-e +-. Ĩm. $ )mL,lE(l DHhNA-쭭N.o-mMN-,N Č- + -Č-͊Č- $AaAČ-쭭N.o- + D +D$ + - $d + - $eAČ-쭭N.o-  +D D$ + - $d + - $eADN ƥDDn 쭭N.o- +d쭭N.o- $eAAA%h-m -ͭAnNe-Ln.mLM NlneE&&ee-,A-쭭N.o Ō-͊Č-)AaADN $Di + D*%eAAA-nLlέͭ Č-ndl-LnM$AaADN dl-LnMnAAA-nLlέmj -ml Č-ndl-LnMČ- $AaAČ-h $ $eAA$-- ln- D$m-o.m,-$ mn.M $̍ $m$m, dm.L D d-.ADN d.N. $)+I +Ddl-LnM $Dh d%h,Ddl-LnMnAAAA-nkj -mlM ͭlnŌ-nČ- Č-D ͭln.AaAdmČ-h % )eAČ-$N $D ͭlnnADN d- Ō-n%N $N $N -&&DhlAAA-nLlέHlέ Č-ndl-LnMČ- $AaAČ-nd +l-LnMn*Nd.Nd- Č-n&Č-n%'%'%''dl-LnM$$eAČ-n $dd +l-LnMn*N$$d +l-LnMn*N$eAČ-n d.NM d I $$eADN ƥDNˮll  ) d )$D$dNˮlll )E $& )E d$&$$eAAA-n䬌N M̌l.ͪl Ō-nDČ-nM-Č- + -,% - N-ͭ,LK ͭln.AaADN LM-D% + -,Dd.N% + -,d + - $$eAAAa̍,ͬAa#9s r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplus A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰH&a"&c"&dR&fr& !Md04a +ps0ɛɆAMbC'4)9 $φNLY}AͥѥMe@,5 h6,jb'w'y'i'j'OLY}QɝMg0$ ɝII艚IlDe'l(ʠ#fB&v2V7%Fllvm.module.flagsS0*llvm.identSD2V'7V2FWF77EJx9iiD2V'7VBVfV67%j̽ɍ9M z[XKܔLؕͥM Ԥ ]]ܔM̡5M ޤ ]\Y]]ڛܔ@Nإ%MхѕM K\[ܔTyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq +P D@ /qLHP <49RCM~qa A,4@TE@50F # ``P a# ``P„0b U< L# ``P(„STAT`$DXILxBC!  #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@I 2" d""ㄡL L(#%90#@f3CE6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C<d 2L &GC(2(R((B(ʱ yZLFD oM $Efe%&,f&gl&eCLa0   @l `@,ˆ0 J3AH ÊL -͍- n n˔\]ڛH&! &2A !MTe qɔUYh&C1A mXmڪk| Hs 9 €l ƀ ٵM *dx.versionS ]]ܔC2FV&FV6%@*хѥM :dx.viewIdStateSK\[ܔ ṌչѕM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq +P D@ /qLHP <49RCM~qILDN,$cf3828015412d39ed6680a0b99e65bee.pdbHASH8(TӞh + [DXIL`'DXILBC!  #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@I 2" d""ㄡL L(#%90#@f3CE6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C<d 2L &GC(b( *2( yGLFD oM $Efe%&,f&gl&eCLa0  a0(MbÀ$!i6AX՝}}}qzKK{s H6P&IJa!(a"(`CP1 +;+ a0&ñAȴ qAD Amn`uq<fFVF7%ؕͥM &dx.valverSZY\Y۔ CbVvD6EFW6%XṔAM <yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq +P D@ /qLHP <49RCM~qa A,4@TE@50F # ``H!A RA0b T@ $!DXBCfDQ^#uIQx DT SFI0ISG1`HQPOSITIONSV_InstanceIDOSG14(SV_PositionPSV04 +  POSITIONdebug_spot_lights_vsCADILDB$`IxDXIL BC! @x #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L ;2" d##ㄡL L@ +@@ 3s`0G@$AH) HS A rT98.B*VbFq% ?a!! b!t@l ($7@Iw8ҴCM>%b4ҴQEAD>#p@Β&%ǙJ8&Dx%x L%b2)rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C <d2L &GCJ +2("(((P@ ((*R(@(JJb JJg(q2g(yysL d!#+;bK;CC #+sAcc4@ oM $Efe%&,f&gl&e@Ì-n]ݛ[ Ȍ<float{ 0b4X` E ,`  E 4` ( AaelementJؔ}չqHscd0dVp Q!&A`l,bfloat4xX@h|1@shP 0Y4( `4e0['A$`0`0 +$J 6La@ E `iel23 EV&Vw5FŖvF7e7Gj"h@x @ $@h$\\"h@P 0`C `rpuintd@,9`qP  ZYK[Y[]\ [[ [ڠ]Yݛ .̍M (+'ĮlMF*HkÐe٦`>"!@C30:<Nmatrixbb1@S +C` E М`됀pYM*f ( E Ь`됀pYM+f H /E м`됀pYM,f h /E ̂`됀pYM-f  E ܂`됀pYM.f  E `됀pYM/f  /E `됀pYM8f  /E Ќ`됀lLT\dlt|āȽ}չM+80J }չM+8@J 6 9$HA0!0ru15 +,b3`pft$ŔvF76G'TgfV&4cCF'D3C3$mCa̠ѵ}~ھ쀎䀀f~HH`fH`f-}C<12///279E `f~ܾ޾Ȁ䀀f~H䀚H`f-}C=796//9Aݛٗ]ZБSЛPYЌ]ݛP ж{=Hz`ŖvF75VFǢ.͍]ݛO\ڙ[H "h" :0`4P,b*0PE |BEt`X6lDb &AB 0"A1:yksKbK;C{szjsKcJ;C!+{J"ڶ'!T&@-- nkLTYS[S90E ЬL:a P{c{3b ;[MKf`@,Ml.닮 kn,l4/NH 7<)E X:a  ,b1@3{p{ÓYMMf`R mNI.,kM*,nn47NH%\&d&l'&A{ȁ"0 N x -- nkL hJ-) nh&JJ̍L-) HhGJ`97/34:7:A[[ДSЌ]ݛP ж a L[ט272)7:34::lightPosRadius1= @ ŖvF7&vV65V؃-$$[Q\]ڛ[[ٓ\"hb-$D ]^X["hb-$d`qim1 @ -10 A A[טДSLPTYSж E[]e-Ln%m+mL셬,-.m-nm-m -}`pAڶ-}`pAȶ-}`pA-}`pA$-}`pAڶ-}`pAڶ-}`pAd-}`pAf-}`pAҶ-}`pAζ-}`pAʾ-}`pAʾ-}`pAʾڶ-}`pA0:/2022/29/2/m p-E. LkN,m쫭L LkN L˭mGmv w@almv wamlGnv wi Lk..L쫭Lnnv w@jm Lk..L쫭LnGov wJ*i)*i苪J* +p2FV&76VGVF6V&WBWGW'W5W66ǖ6hXf@>~B<QI9M5%QQ9 }QaQUI}!%!Qm[  < 65DEU$tEUEU%UT5Um<@#PUTUUTїSTVѶ# bIRRADIANCE_TEXTURE_WIDTH>E<%II%9 }QaQUI}!%!Qm[` <`7T4EԔDTU$5m=`#`0T4TDT55DEU$t%m>h#RRSTVն BSKIES_LUT_SIZE_H>G<6;ȃ=JX^_hijklmnoxyz{|Ǩ'  &HÆ.L ĪLn.mÀ!@@6 Ն``\ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "clustered/point_light.hlsli" + +struct VsInput +{ + float3 pos : POSITION; +}; + +struct VsOutput +{ + VS_OUT_POSITION(pos) +}; + +SYSTEM_CBUFFER(OmniLights) : + register(b1) +{ + uint4 omni_lights_count; + RenderOmniLight omni_lights_cb[MAX_OMNI_LIGHTS]; +}; + +VsOutput debug_point_lights_vs(VsInput input, uint omni_light_index : SV_InstanceID) +{ + VsOutput output; + RenderOmniLight ol = omni_lights_cb[omni_light_index]; + float4 pos_and_radius = ol.posRadius; + float3 worldPos = pos_and_radius.xyz + input.pos.xyz * pos_and_radius.w * 1.15; + output.pos = mul(mvp, float4(worldPos, 1)); + return output; +} + +float4 debug_point_lights_ps(VsOutput input) : + SV_Target +{ + return float4(1, 0, 0, 0); +} + +SYSTEM_CBUFFER(SpotLights) : register(b1) +{ + uint4 spot_lights_count; + RenderSpotLight spot_lights_cb[MAX_SPOT_LIGHTS]; +} + +VsOutput debug_spot_lights_vs(VsInput input, uint spot_light_index : SV_InstanceID) +{ + VsOutput output; + RenderSpotLight sl = spot_lights_cb[spot_light_index]; + float4 pos_and_radius = sl.lightPosRadius; + float4 color_and_attenuation = sl.lightColorAngleScale; + color_and_attenuation.w = abs(color_and_attenuation.w); + float4 dir_angle = sl.lightDirectionAngleOffset; + const float lightAngleScale = color_and_attenuation.a; + const float lightAngleOffset = dir_angle.a; + float2 texId_scale = sl.texId_scale.xy; + float cosOuter = -lightAngleOffset / lightAngleScale; + float halfTan = sqrt(1 / (cosOuter * cosOuter) - 1); + float3 ofs; + if (dot(input.pos, input.pos) > 0) + { + ofs = tangent_to_world(normalize(float3(input.pos.xy * halfTan, input.pos.z)), dir_angle.xyz); + } + else + { + ofs = float3(0, 0, 0); + } + float4 worldPos = float4(pos_and_radius.xyz + ofs.xyz * (pos_and_radius.w / cosOuter), 1); + output.pos = mul(mvp, worldPos); + return output; +} + +float4 debug_spot_lights_ps(VsOutput input) : SV_Target +{ + return float4(1, 0, 0, 0); +}?.\shaders\include\ColorSpaceUtility.hlsl,Ad .O. e,)mLm͌$ D. nDlLή̥A +-md썬 $m-mm ΍L ) +)mm )*ťA +)i +d艨$i +J*D%h +$iJ* +驊 +*HJ*ȉ* ɨA$) d)ɉ( +H + Jhj +I +$ )$i($)A$ )*HJ*ȉ*h +(ʩhj +I +$*H*i)HAJ +iHj)ȉ*H()*I +ɩ%H*騨ȉʥAA̮ D,)-L. AA$MND)ld.-L AAAaN.- .L- ,m.L Dd&$AAa$̍ kIk +*h諊*)* i)Aa,ͭ kIk +*h諊*)* i)AAA(- D. n$̍ m, N.mάLĬm.mAA$m.m dMd.l  n.-. -dM$m.mdNH$mD $AdMd.l ,ͭ D,M D,l.mĮlMn$̍ $ - -͍.$̍ $ ,- D. (-AD. n$L l.̭ Dn Ln . LNM d Nln. Č-n d- $͍LA.lM Nl,m. $mĭ $ ,LnLL.,̍n$l - , $mM dm..ͮA d͍N.l. ,Ln .l$,L.-m dNή $m͌ n̥AAAdNH$mD $ dMd.l $̍ $ N.mάLĬm. MD,- D. N%d$ N ,-AdNή-m -̮ D Nl, $ . dH +,m-,o%dNH$m-$m$ D nA Nln$̍  .ln $ i-M,m D. dNH NlnDA-ͭ,L.M M-o.m,-dMNlD̍L.$̍  -ͭ,LDlnĭ D Dm썬A.  dNHD. M,m-,ϥA-n)ͭ,LmJHČ-n$AaA$N /--$DE&ADN dlf&f$F%GD$D$Dƅ&&eAAA-ndJH)ͭ,LČ-n$AaA$N /--DE&ADN dl$F%Gd&$Dƅ&%eAAA +l Ĭm.m$- % ,m,̍-$ N /- dNH. $ LNMƅĥA-n)ͭ,LmJH(lČ-n$AaADN dlf&f$F%GD$%fDd.NFF'%fDd&&'eAAA-ndJH)ͭ,L(lČ-n$AaADN dl$F%GƅfDd&EF&Dd.Nƥf&GDd$E&'G&ddedž&eAAA-n$llN.lJH)ͭ,L% Č-n$dON dJH)ͭ,L/eA-n$llN.)ͭ,LmJH% Č-n$dON )ͭ,LmJH/eA + 䩈Dl쭭̍ Md͍̍d j +-mD,- D. N-,$mL,l d͍N.l$lA$ N N.- M.. $ $ ,Ln .Mͭ̍ΥA-n)ͭ,LMh&Č-n$AaADN dl&'ƥD$&'gDƅ&&'g&eAAA-nDh&)ͭ,LČ-n$AaADN dl'ƥd&'g&$&'g$ƅ&%eAAA +-m$m ĭH +N.mάLĬm.͍$m d, D*JMLn . $.̍.MLΥA-n)ͭ,LMhHŌ-n)AaAČ--D&&fAČ-MDFf&D$FgAČ-d,dF&fAČ-dLD&f&DdFfAČ-dlDf&G&DdFfAČ-n -&eADN e,ddLD .%ddlD .M&eAAA-nDhH)ͭ,LŌ-n)AaAČ--D&&fAČ-MDFf&D$FgAČ-d,dF&fAČ-dLD&f&DdFfAČ-dlDf&G&DdFfAČ-n ʼn$M&eADN -  d,&eLdlD .$-&eAAAAdMd.l dͮLn.mAA +l $ln -ͭ,L,-m썬,.l$dMd.l dͮLn. $m$ d -A D,l.m-m $ )ͭ,L$LL.,d*m $ dMd.l $m,ͭ D,M ĮlMnA D,l.mĮlMne -, d.l $ͮl$ -N. ŮlM. -m,.鍮 -Ad -,  dMd.l -,Dl$ dMn-$L D䭎 D΍lNDl,n dAdMd.ll-̮ -LL,n- Ln + dͮL. d dMnL $ .A, d- ,ĭ,.ͮ .l-,Dl-m $L $ͭ Nln.M $ -ĭAdMd.l̥AA$ D $, D. $ dM. -ͭ -m ĭ̮LMn$.,$ͭ Nln.M EALn,.L,dMn +-m,mn. $ dMd.l -$m$l. $lmn.M +A+K dMd.l $m ĭN.$m .ln. dMd.lD$-l M-AN L. -. ĭ,.ͮ .lel,,m,-$  $̍ D+ dMNl-m$ ĬNLAN.mM-. d, D -  $̍ D -l  $.,om..ͮ +,d, -̮ ,MANl,m. ĭlDn D,,., D,$$.  $̍ D D .ll $͍ I gΥA +-mdMd.l $md, $ +M-ll $ DL-̥AAA鍮LDl&$̍ dNHd-L  d. dMN.-L.l$̍ - -͍ +,M͍-,̬LmA$m N.mάLdNή n̥AA-nDh&MhHFČ-nDH&$AaAdmČ-nodͮ)AdAFFeF&G&GffƆA&&%'&&&fA&f&F'AoADN eͮ)DH&'eAAA-nDhHFMh&Ō-nDHHF&AaAdmČ-nodͮ)AdA$&džƥƦƆFA%F$%fF'gA&'%&$%&&AoADN eͮ)DHHF&eAAA-nDh&h( jČ-nDH&$AaAdmČ-nodͮ)AdAGF%榆FAff&&g%A&F&%'AoADN eͮ)DH&'eAAA-nh( jMh&Č-nDH&$AaAdmČ-nodͮ)AdA$EF&EF&AFƆ$FƆA&&dž&Ǧ&$&G&'AoADN eͮ)DH&'eAAAa̍, kIk +*h諊*)* i)k"!B:pC #+Jsc#+ +k{C++ +k{C++ ksAccK##ifndef ATMOSPHERE_PARAMETERS +#define ATMOSPHERE_PARAMETERS 1 + +#include "atmosphere/definitions.hlsli" +#include "atmosphere/definitions_units.hlsli" + +/* +

Atmosphere parameters

+ +

Using the above types, we can now define the parameters of our atmosphere +model. We start with the definition of density profiles, which are needed for +parameters that depend on the altitude: +*/ + +/* +The atmosphere parameters are then defined by the following struct: +*/ + +//this is const buffer <> CPU. so it must be aligned to float4! +struct AtmosphereParameters { + // The solar irradiance at the top of the atmosphere. + IrradianceSpectrum solar_irradiance; + // The sun's angular radius. Warning: the implementation uses approximations + // that are valid only if this angle is smaller than 0.1 radians. + Angle sun_angular_radius; + + // The scattering coefficient of air molecules at the altitude where their + // density is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'rayleigh_scattering' times 'rayleigh_density' at this altitude. + ScatteringSpectrum rayleigh_scattering; + // The density profile of air molecules, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile rayleigh_density; + Number rayleigh_density_altitude_exp_term; + + // The scattering coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'mie_scattering' times 'mie_density' at this altitude. + ScatteringSpectrum mie_scattering; + // The density profile of aerosols, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile mie_density; + Number mie_density_altitude_exp_term;//todo: make more sophisticated + + // The extinction coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The extinction coefficient at altitude h is equal to + // 'mie_extinction' times 'mie_density' at this altitude. + ScatteringSpectrum mie_extinction; + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols forward weight. + Number mie_forward_scattering_weight; + + //second mie layer + Number mie2_strength,//can be bigger than 1. making it relative to 'common mie' + mie2_altitude,//where (and below) strength is 1 + mie2_density_altitude_exp_term;// + Number padding; + // The extinction coefficient of molecules that absorb light (e.g. ozone) at + // the altitude where their density is maximum, as a function of wavelength. + // The extinction coefficient at altitude h is equal to + // 'absorption_extinction' times 'absorption_density' at this altitude. + ScatteringSpectrum absorption_extinction; + Length absorption_density_max_alt;//absorption profile part + + // The average albedo of the ground. + DimensionlessSpectrum ground_albedo; + // The cosine of the maximum Sun zenith angle for which atmospheric scattering + // must be precomputed (for maximum precision, use the smallest Sun zenith + // angle yielding negligible sky light radiance values. For instance, for the + // Earth case, 102 degrees is a good choice - yielding mu_s_min = -0.2). + Number mu_s_min;//to be removed + + // precalced + DimensionlessSpectrum mie_extrapolation_coef; + Number multiple_scattering_factor; + + // The distance between the planet center and the bottom of the atmosphere. + Length bottom_radius; + // The distance between the planet center and the top of the atmosphere. + Length top_radius; + + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols. + Number mie_phase_function_forward_g; + Number mie_phase_function_backward_g; + + //float2(1.0 + g * g, - 2.0 * g)*pow(2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); + //optimized mie phase coef + float4 mie_phase_consts; + // The density profile of air molecules that absorb light (e.g. ozone), i.e. + // a function from altitude to dimensionless values between 0 (null density) + // and 1 (maximum density). + //DensityProfile absorption_density; + float2 absorption_density_linear_term0; + float2 absorption_density_linear_term1; + + //https://en.wikipedia.org/wiki/Kruithof_curve + //5500 kelvin + Kruithof effect results in (0.5764705882352941,0.6274509803921569, 1) + // full moon lux brighntess is way darker + DimensionlessSpectrum moon_color;//(0.5764705882352941,0.6274509803921569, 1)*.25 by default. That affects sky and moon + Number sunBrightness;//this is 10 by default. that affects everything, sky and sun +}; + +#endif! ZYW[YW]Z\YY[]ڛۜ [9I3s#+3 jzB**"*2JrJJzrjP!+3Ks+ jzB**"*2JrJJzriP!+3Ks+a*s;C1c{ kP!+3Ks+ ++c+s;C1c{ kP!+3Ks+ r;c+1c{ kP!+3Ks+zcK# r;c+1c{ kP!+3Ks+z+1c{ kP!+3Ks+akKs{z+1c{ kP!+3Ks+qk+1c{ kP!+3Ks+Ir++c*s;C1c{ kP!+3Ks+ + 1c{ kP!+3Ks+zck+1c{ kP!+3Ks+qk+#*sK1c{ kP!+3Ks+I #K s+1c{ kP!+3Ks+ +#K s+1c{ kP!+3Ks++ cz+1c{ kP!+3Ks++ cK #K s+1c{ kP!+3Ks++ c +#K s+1c{ kP!+3Ks++ c +#K s+#*sK1c{ kP!+3Ks+ +Ks;z+33KK+s1c{ kP!+3Ks+Ir++zcK# r;c+1c{ kP!+3Ks+akKs{Kr+sK1c{ kP!+3Ks+akKs s+1c{ kP!+3Ks+IbckKs s+1c{ kPhPxy 9+s+K1sK{s1{k ++c+s;C{{k+yC+˃+siP!+3Ks+  +k1c{ iPxy 1sK{s1{k ++c+s;C{qk+siP!+3Ks+!Jk+sK{sc++k1c{ iPxy 1sK{s1{k ++c+s;C{+ cz+siP!+3Ks+z++k1c{ iPxy 1sK{s1{k ++c+s;C{+ cK #K s+siP!+3Ks+I #K s++k1c{ iPxy 1sK{s1{k ++c+s;C{+ c +#K s+siP!+3Ks+ +#K s++k1c{ iPxy 1sK{s1{k ++c+s;C{+ c +#K s+#*sKsiP!+3Ks+ +#K s+#*sK˛+k1c{ iPxy 1sK{s1{k ++c+s;C{ +Ks;z+33KK+ssiP!+3Ks+ +Ks;+k1c{ iPhPxy {KK{sIs!Aa+s;C c+KqiP!+3Ks+zKK{s1c{ iPxy sK!K+K{s+{Is!AsKc+ c+KqiP!+3Ks+!J+K{s1c{ iPxy +{y3akKs s+ c+siP!+3Ks+akKs s+1c{ iPxy +{y3IcckKs s+ c+siP!+3Ks+IbckKs s+1c{ iPhP!+3Ks+ZJ** + +*Jr:b* +*Jr:iP!+3Ks+zjJr*" +*Jr:*¢*iPhP)s#K3 ȉ\ʸʸ\HYHURTQQSUғWSTYY[HURTQQSUғWSHLBH[YH]Z\ YY[]ڛۜ [HH[YZ]\YY[ٜ [HB\TX[U]\ Q^U]\ []NTX[]]]\NBN\TX[U]\ Q^U]\ []NTX[]]]\NBNTX[U]\ []]\  +U]\ [] TX[]]]\\TX[U]\ ܎ ]^]ގ ]\H]\܎\]N_TX[U]\ []]\  +U]\ [] TX[]]]\\TX[U]\ ܎ ]^]ގ ]\H]\܎\]N_BYY[TX[U]\ [SX[JX +[]]\ J H\X[]]YJYY[TX[U]\ [SX[JX +[]]\ J H\X[]]YJYY[\\[]XU]\TX[U]\ QYY[H\X]\U]\TX[U]\ QYY[\\\ZZX]\U]\TX[U]\ QYY[\\\X]\U]\TX[U]\ QYY[TYXX]\U]\TX[U]\ QYY[X]\U]\TX[U]\ QYY[X]\Q\]U]\TX[U]\ QYY[H\YZXU]\TX[U]\ QYY[HS][X]\U]\TX[U]\ QBYY[H +] +]YY[S +] +[]YY[HS +] +H[]YY[HSSQYY[WSTJXJYY[H\JXJYY[]٘ [LYY[] [MYY[] [LYY[UQSUJXJYY[UQSUWQUSJXJQZ[\ڛ[\\]QZ[\ڛ[\\][U]\[ HX +Ȟ\]H ^N_B\\\]H\\\][U]\[ HX +Ȟ\]H ^N_B\YZX\\]H\YZX\\][U]\[ HX +Ȟ\]H ^N_B[H[H [X +Ȟ\]YJXN_B[ \X[]]\TX[U]\  [ H]J^\]ݜ ]TX[S] +ݜ ]\ H LNB_B[ \X[]]\TX[U]\  [ H]J^\]ݜ ]TX[S] +ݜ ]\ H LNB_B‹JڌZ\XH[ ڌOBUXZYY[ZH[ٛ[\X\Z\XH\]]]ZٜNB[]J[ + [[[][[ + \YZ\Y + ]\YZʜ\ + ]]] +H[][[ +[[NKB]]؛SH[]HH N]]؛U][[HH N]]؛H[\HH N]]؛[Y[ȜHH N]]؛]]HH N]]؛S][[][HH NB‹J[Z]XY\]ZH[ٛ[[Y\]Z\XH\]]]ZKB]H[[Y\]H[Z[[]Z ZXY[ Yٙ\YYYNKB]]؛SZHH +H[]N]]؛H\YH HH[] +H[]N]]؛[][H HH[] +H[] +H[]N]]؛H[\HT +\N]]؛H[YH\ H  N]]؛H\YZX]\\\]\W[]H] HN]]؛TYZX]\\\]\W[]\לH] J +Ȝ\N]]؛\\[\YZX]\\\]\W[]\ܗ[H] J +[[N]]؛\\TYZX]\\\]\W[]\ל\ܗ[HO] J +Ȝ +[[N]]؛\\TYZXQ\]]\XXW[]\ל\ܗ[HO] J +Ȝ +[[N]]؛S][[\]\]H[ ȜN]]؛S][[\]\]HH +N]]؛S][[X\\\]\W[]H HN]]؛S][[X\\\]\W[]H HNBHY!ETl5FV&7Ǖ6VGVF6V&WeV6F66ǖ43723 )("/*!'/$)$!*"242 )("/*!'/$)$!*""77<02:4077072:::04:0292236"1!:277722076827:4:77<34:"1!:27 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"(6:22 98210:247<34:$' 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"41:20982:04:0249441:209822<:4949441:2098282020:24349641:2090/249494$'$"6292:2<:792#*4:02629<47:2<:42:976292<:4<6292<:4$'$"6292*4:02#62<:792629:47:2<:42:970:02:6292<:46292<:420:029:472272149044$'$"12:*04:022<:*;#6:$' 98220220982/823:4962929:90982/87:/0990982/87/029:::9027780982/8:70<790747706<0:3:7222623:4$89:0982/87/090982/87/090982/87:/090982/87:/09027:2747723:497089:990982/87:/090982/87:/09027:2780982/8:70<79:2<90724940720609729066:714227990729/74723:4290277 9822:70<0982/8923:4470982/87/0923:40<97629:240<4629/9972:9712:2<:792#*4:02:* $* /",*$"*2:2<:792#*4:02/9* $* /",*/#$8072:247220843769202<$'$"422::#6*04:022<:*;$' 98220220982/8$'1:;**23:9**6229::;<:;<29::;<:;<629:2*4:02#62<:792:;<* $* /",*$"*629/92*4:02#62<:792:;<* $* /",*/#$9027780982/8:70<790747706<0:3:7222623:4$89:0982/87/090982/87/090982/87:/090982/87:/09027:2747736;142076:2923:497$/2730:87789:<078720229:07<722275;22:099789:97970982/87:/090982/87:/00982/87:/09027:2780982/8:70<79:2<90724940720609729066:714227990729/74736;14207729:23:4470982/87/0923:40<9723:4247:0<4:2229629$$979729:!6428$:9;<72420327:9029:177786:202267:2:04:022<:2277)1:62:*04:0277 9822:70<$' 98220220982/8$'*04:022<::04:0/2<:223:4962929:90982/87:/0990982/87/01:;2:*04:022<:*;#6:0982/892:97277)1:6#62<:268/2<:2:04:0/2<:2:277)1:62:*04:02$' 98220220982/8$'*04:022<::04:0/2<:223:49629:23:4276/47213:729:90982/87:/0990982/87/029:::29:22223:4/2!68090982/889:229:29629/2!6429:/43/47213:72:970:022:*04:0277 9822:70<0982/8:04:0/2<:2/2/0<302:*04:0277 9822:70<0982/8:04:0/2<:29>222:970:022:*04:0277 9822:70<0982/8:04:0/2<:290<302:*04:0277 9822:70<0982/8:04:0/2<:2/2/277)1:62:*04:02:7$' 98220220982/8$'*04:022<::04:0/2<:223:496296294/:2/40982/87:/09629/:2/489:0<4/:2/44/:2/42:972:*04:0277 9822:70<0982/8:04:0/2<:297:9284/:2/40982/8:0:0/09024/:2/40982/8:0:0/09029/:2/23:4902709 9822:70<$' 98220220982/823:49629:76/47213:743/47213:72:9790277: 9822:70<0982/89>222:9790277 9822:70<0982/89$'$"$7274 32<34(2:177629$7274 325$92:975:30:22(79962943$'$"30:2(2:177442<<3462936292:972(2:177442<<3'842230:22(799;22(799;30:533:9979070730:82333:997:2977993:1473;1407282422<;52:9758289:8;77<792224::9094;78282''&($#'# *"$#("*!'')"*") )($'$"$7274 322(792:)09:1776293629$7274 325$93330:823332:975:8289:8;:66"4782:17$'$"$7274 322(2"47:177629362930:0680$7274 325$930680330:823332:9750680:8289:8;4::8;9173:90!!82-03:17$'$"$7274 322(2-03:1776293629$7274 325$93330:823332:975:8289:83:$9274$'$"30:02;6290629=2:970;0$'$"30:22(7996293629342:9730:3302;34:33$'$"30:22(799629=2:9722(7993$'$"30:2(2:177442<<3'842230:/879962930:709/82/8799</8799<:9907:2977993:1473;1407282422<;530:09/82/8799=/8799;:9907:2977993:1473;1407282422<;52:97;709/82;09/824:9929:07188289:879828289:877,$'$"00)1:62:(2200'842230:/8799$900)1:60:243$900)1:6430:2436292:970:243430:2432(2:177442<<3'8422/8799<34(2:177$'$"00)1:62:(22002$' 98220220982/8$900)1:60:243$900)1:6430:2436292:972:(2200'84220982/8/87990:243430:243$900)1:62$9002$' 98220220982/8$'$90022<:4900/2<:223:4962912$90022<:*;#6)$' 98220220982/823:4962929:90982/87:/0990982/87/029:99629/990982/87:/00982/87/090982/87:/0629992:9712:2<:792#*4:029$) /",*$"*2:2<:792#*4:02/9$) /",*/#$8*247220843769202<422:)#$90022<:*;$' 98220220982/8$'1:;**23:9**6229::;<:;<29::;<:;<62992*4:02#62<:792:;<$) /",*$"*629/92*4:02#62<:792:;<$) /",*/#$90982/87:/09/90982/87/090982/87:/09!6429444900/:8:848*097:286:222<:9207;2::23:7249004:404322<:2:8$900)1:62$9002$' 98220220982/8$'$90022<:4900/2<:223:496291:;2$90022<:*;#6)0982/892:97$900)1:6#62<:268/2<:24900/2<:2:2724309277)1:62"<:0702430:2423277)1:62<:07023$'10:24 2106<:9072292042:::74329790787:0:231:79:327:<979:;92:970:243;0<0:243<2<:070220220)<20$900)1:62"<:0702430:243)277)1:62<:07023$'10:242:97$900)1:6#62<:20:242"<:0702430:24232<:070230:24277)1:62"<:0702430:24279:$' 98220220982/2:970982/8<30:243<0982/80:2430982/80:2430982/8<30:247907:4323&$" *"$/",*$900)1:62"<:0702430:243$' 98220220982/8$'10:242:972"<:0702430:243)2"<:0702430:24279:0982/0:242748207:272:22066:20:24367279<34:6480:24377724207243220:24377:27:2944:4:7643:177227042430:24/:87220:2437202:802722249027343706977220:243722:2:0::22<:2794096:07799022227:2:47720:24/2<:2720772430:24/2<:272242/(" ")')/ )*242/(" ")')/ )(/(" ")')/ )*/(" ")')/ )30:0:24/9:7630:230:9//8202/=2:9789:0:0229//8202/1<9//8202/130:0:24/9:7630:230:9//8202/=2:970:24/9:7629//8202/4230:0:24/9:7/7330:230:9//8202/30:979:9:10:0229//8202/1<9//8202/130:739:10:0229//8202/1=9//8202/12:9789:979:9:1/(" ")')/ )(979:9:1739:30:0:24/179630:1,30:9//8202/30:11,12:971/(" ")')/ )(9//8202/19//8202/1<9//8202/19//8202/1242/")/ )*30:0:24/;-7130:;2:979;2:97/")/ )*;-/")/ )*/")/ );30:0:24/17;-30:2:979$30:022(,/")/ )*30:/")/ )30:/")/ )/")/ )2:97,022(<022(19792/82020:24/130::30:9:30:979/9//2:9730:0:24/9:769:979/9//0:24/;-71172/82020:24/130::30:9:30:7/9//2:9730:0:24/9:7/739:7/9//0:24/;-71277)1:62:(2022*04:0*+$'*04:022<:8202/:04:0/2<:21:2:97277)1:6#62<:268/2<:28202/:04:0/2<:2:426::6480:24 887<$' 98220220982/8$'*04:022<::04:0/2<:247:68:7:23:49$'417;49$'417:749**$900)1:&**277)1::60629:;49=:7:;49:749:7496:22<:4721774:409822793:776$721#:72$721#:720982/8923:40<902709 9822:70<0982/89:$721#:723:42<068:7<014:209822747302780628:&$900)1:633:60277)1:6277)1:6:434::277)1:623:427947:4468:723:42:468:7:>>42<22223:4/2!68090982/889:229:29629/2!642992/277)1:60:2432<41768260982/8/0982/87:/094770:2432<4172<41770<2<41770:2472:220222<72904277)1:6682*04:022<82<41772277)1:6:04:02:72:*04:02:70982/8:04:0/2<:2/2/30):04:02:70:2429420:4::8;39:428062:4272:2724439:43047:))682*04:02<41747302073:2:927:92827&:434::47:02072072477:7::2:04:023682992+2743:229227:020660:24379292299:27902277722*7292<:22327::60073;029072:9:6:4712709*2<74<:0:9720872900<064730779872247942734::8;39:428062:4272:2724439:42294:9412701294:0707754368229226:7766:87:47929*29:73:279299006<;77:4:7730)0:243047:))682*04:02<417:60:434::47:434:::434::682*04:0(2:1779:30::476(2&:476(43$721#:7:7:79:2234:733:209:23:4/20982/87:/023:420629/2!642992/30:04:02:72:*04:02:70982/8:04:0/2<:2/2/3:7/706704230;4979:30:'7:&0:027:3:7/706:74&:04:02:7:434::'7:&0982/83:7062743) " !"209406<41290;79729361:$'$"30:40)0;#)0;2630:=2:979274$'$"$900)1:66:0:2437$9002$' 98220220982/8$'*04:022<::04:0/2<:247:68:7:23:49$'417;49$'417:74629:;49=:7:;49:749:7496:22<:4721774:409822793:723:40<902709 9822:70<0982/89:$721#:720982/8923:42<068:7<014:209822747302780628:$900)1:6&$900)1:63330:434::277)1:6629<34(202<34(2:1776292(202<34(2022(2:177442<<3'84220982/8/879923:427947:4468:723:42:468:7:>>42<22223:4/2!68090982/889:229:29629/2!642992/2682#!266826:660982/8/0982/87:/0947779:3068'80628:4262<4177279:30682*04:022<868'80628:30:04:02:72:*04:02:70982/8:04:0/2<:2/2/43) " !"49:2002729030:90;2)0;302/2/:04:02:740)0;#)0;269027430(20:243260:2422(202260:243<<34(2030:60:2224023077022:64820:24392630:60:2224022:6480:2430982/8:6480:240887</2/30):04:02:7(20:243:60:222402260:243047:))682*04:0262<41747302073:2:927:92827&:434::47:02072072477:7::2:04:023682992:434:::434::682*04:02:97$900)1:66:$741$900432$' 98220220982/8$'*04:022<::04:0/2<:223:49629947:&(*'*47:&(*'29:90982/87:/0990982/87/029:9979: 322844629&(*'79: 322:204629&(*'$900)1:6:6:$900)1:60:/2022/2/60:/2022/2/60:/2022/2/989:97947:55&(*'* 32:206292:27947:44&(*' 32846292809847:247847:29:274 3202:200284047:29:6:6:0:2437$90020982/8:04:0/2<:2&(*'*900=00982/87049002:97:6$900)1:62:6480:243$' 98220220982/8$':6480:2432<::6480:240887<23:4962930::60:243**9*&$( *"$ (('30::;0:0230::3390982/87:/00982/87/090982/87:/0:;30:2:2<:792#*4:02:;<:60:243**2:2<:792#*4:02:;<:60:243**2:97$900)1:6#62<:268/2<:2:6480:240887<:9:1:430:243:6$900)1:60:22234:40$900)1:6<2277)1:6*04:0*04:0247-.:4:$'$"430:243:6:$7300:22240)$' 98220220982/8$'*04:022<::04:0/2<:2$':6480:2432<::6480:240887<$'4779629$'41779624962990732:77<799030:68:7$47600168:7:30:0140)((23:49629:629:62997647213:72$721#:720982/8930:00<430:243:6::6:6:&:6:<:6:2:6:9$900)1:630:909/90243'$ /$):6:*04:02277)1:69:48902232098224:9706<42727290982236924::::9249774:99:8792:2904<47144390982/87/023:4:923:490//70982/:70<:89:::990982/87/090982/87/04390//70982/:70<22909/90290//70982/:70>22$3:2;<97:4721::20982/868<2:972:97:62746:22<:4721774:409822793:730:0<902709 9822:70<0982/89:47213:7909/900<470<00682:730:68:7:68:7$30:68:7:#7968:7$30:0<#7904300168:768:7:2980140)((<0140)((<0:020<68:7:#7937968:70<#790<68:7:#7968:7020<7087:29:274292827:(2:1779:629:476(2629<34(202<34(2:1776292(202<34(2022(2:177442<<3'84220982/8/8799<014:209822747302780628:$900)1:6&$900)1:633277)1:6:434::277)1:630::30::(2;79:30:6827:*30:4768:7:#7968:7:#7477:7962979627930:93268:7:4768:7:#7994768:7:#730:24300168:730::930:94768:7:#7774099:4:77736824:47:2022:072796292909:0<#79:30<0<#79:::6827:2::230:;*0<0:0296827:*4768:7:#72:;*:;23:42:909/9023:4/2!68090982/8089:229:29629/2!642992/*"":7962*""79624*""9073243) " !"49:20027290477:7962979629290732:27962430:90;2)0;:796292/2/2742682#!266826:660982/8/0982/87:/09:796279:3068'80628:4262<4177279:30682*04:022<868'80628:30:04:02:72:*04:02:70982/8:04:0/2<:2/2/*""7962*""79624*""9073243) " !"49:20027290:04:02:740)0;#)0;269027430(20:243260:2422(202260:243<<34(20060:24379:640:2430:60:2224022:6480:2430982/8:6480:240887</2/43'$ /$)") " !":60:2224029027430):04:02:7(20:243:60:222402260:24+2743:229227:020660:24379292299:27902277722*7292<:22327::60073;029072:9:6:4712709*2<74<:0:9720872900<064730779872247942734::8;39:428062:4272:2724439:42294:9412701294:0707754368229226:7766:87:47929*29:73:279299006<;77:4:7729420:4::8;39:428062:4272:2724439:43047:))682*04:0262<41747302073:2:927:92827&:434::47:02072072477:7::2:04:02368299230)260:243<:04:02:3047:))682*04:0262<417:6:<:434::4730)260:242:04:02:3047:))682*04:0262<417:6:2:434::4730):60:222402260:243047:))682*04:0262<417:6:9:434::47:434:::434::682*04:0:(2;:6:&:6:*04:02:434:2:97:6$900)1:66:$741$900)$' 98220220982/8$'*04:022<::04:0/2<:2$':6480:2432<:/2<:223:4962929:90982/87:/0990982/87/029:9979:47:&(*'*79: 322844629&(*'79: 322:204629&(*'$900)1:6:6:$900)1:60:/2022/2/60:/2022/2/60:/2022/2/989:97947:55&(*'* 32:206292:27947:44&(*' 32846292809847:247847:29:274 3202:200284047:29629:7:0430:243:6:9$7300:22240)0982/8:04:0/2<:2/2<:2303090:230:90=:90:6:9&0=00982/87049002:97:6$900)1:66:$741$90022<:)$' 98220220982/8$'*04:022<::04:0/2<:2$':6480:2432<:/2<:2$'137923:46292:)#$90022<:*;0982/837921$) /",*$"*$$) /",*/#$92:976:$741$9004320982/8:04:0/2<:2992:976:$741$900)0982/8:04:0/2<:2/2<:29274 k-Ln+m+mL Nk.Mlm-|5fFVf2T4EUEU%U5U4ՠ0BVfV2T4EUEU%U5U4Ӡ0fFVfB%4ՔDE4TEUEU%U5UETdTDԠ0BVfVB%4ՔDE4TEUEU%U5UETdTDӠ0GF626GFB%4ՔDE4TEUEU%UuDD"ScӠ0GF626GFB%4ՔDE4TEUEU%UTtDbCӠ0RFf֠0GF626GF25DEU$tEUEU%UT5U#Ӡ0GF626GF25DEU$tEUEU%UT5UӠ0GF626GF$%D4TEUEU%UuDDbCӠ0GF626GF$%D4TEUEU%UTtDcӠ0GF626GF2T4EԔDTU$5R6FWƖ266r&vbV֠0GF626GF2T4TDT55DEU$t%2#Ӡ0GF626GF2T4TE5Uu#Ӡ0GF626GF2T4TE5UӠР0RFfAx!p͡qՑqѵɕqɅ͵хͱ}43723 )("/* $* /$)$!*"242 )("/* $* /$)$!*""7<34:"1!:27 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"(6:22 98210:247<34:$' 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"41:2098220982/094948*<2:27643:44<:1797042092730434709934:<:42:49:7206:79$'$"629!6426292:97168:629629$'$"23:4!6890223:42:970<222$'$"23:4!6809$' 98220220982/823:42:9716890982/87:/090982/87/0$'$"23:4089: 02:9789:0<064:04:02*04:0289:234::02936047:.187047:.847:20982/84:90906<079220720:222::73494406417727:2497:9072:22760919*9:234:094430:.8977<0317773:234:36.18072:93177;14227970223:490622:0424::9274207*04:02:04:020*7643179142;26:24:;29724:47086:22<:2072;2024:544:04:06:0776:07748790322479.18.8072.19442:20982/847:7929:2:04:02227.18072.199:2871:73::04:02227.18072.8072227.8072.19$09:09:2:04:02227.18072.89:2:04:0227.18072:209:472177.473:20642-.18.4:4:278797:60982/8:70<4422<:2:04:0222.8072.47943:227:-.18..47219:23:79342:8<348<9<2<2<9! 412=4669:270:4=46679:22<:=77428779<270774<0179=7734:76.9<20:4600:4600:460:460:460:460:460:460:460:469<9:909<0:460:460:4609<9:909<0:460:460:4641214121412141212<:117982<:2<:117982<:2<:117942<:2<:117972<:2<:92<:2<:92<:2<:<2<:2<:=2<:938 7:2:04:02227.18072.8072227.8072.1802:22*976:2:2:04:02227094:0<47949:327:75;:2:04:02227047:.1847:20982/8072479.477:2780982/8:70<*9:04:022279777<70229;14072279:209.29:.7.18.29:07:24273:2;24:4032.7.1817:.18..29:.7.18.29:.29:.18.4.29:76:24:49:2276:2:223:4.29:.18.4.29:07222275;;2:227:-.18..47219:23:729027:2780982/8:70<8 47:0:902236.18073-.18.97940-289:/>2./.78;20227692/9:9/*9<2447773.420.29:.18.4.29:/9:.29:.18.4.299/=0:4=7>/36;14222:223:4.29:.18.4.29:$'$"23:490277 9822:70<$' 98220220982/823:4962929:90982/87/029::: 01407:99::0982/87/090982/87/02:97!689029:089:1407$'$"23:4902 9822:70<23:49629:23:4043902:9729::: 01407:99::0902:97!689029:089:140782466072247:27:29179:29027:27:0982/8:70<;140726:22470409<:972:0:-.18.47219:23:7$'$"23:490277: 9822:70<$' 98220220982/823:4962929:90982/87:/029::: 01407:99::0982/87:/090982/87:/02:97!689029:089:14072:974374$'$"23:490277: 9822:70322$' 98220220982/823:4962929::: 01407:99::0982/87:/090982/87:/02:97:1407:9:89:140722$721794:4:23:728*227:-.18..47219:23:72;22/9:9/=0:4=7:>/907:774:422*49:21407:9/:/=0:4=7:>/7244236;14222:27643:177$'$"76$721#:72$' 98220220982/823:4962929:90982/87:/029:::2:97:99::0982/87:/090982/87:/096*04:027:2780982/8:70<8207;6:2:2:04:02227.18072.4#6424477072:0424::92742072629/;2629:;0:947769:24730673:262924<73497:9073:27:-.18..92669:24730673:262924<7327072:24730673:262924<73497:9:0:0791342377073:2227:*24730902:2276072;27:227:-.18..97:4721::23:72:<0726:2206<4:4:226873:27643:460<:17743:2424::9274207*0240/:2:02406:20$'$"6292224<$' 98220220982/823:4064:2:970:022<80982/8/24064:2Ց̡}͹4(Ց̡}ͱ4(Ցɹͱ4(Ց MUѥ幠ͱ4(Ց̡}ͱ4(Ցѵɕչѥ͹ͱ4(ՑչՅ15ѡͱ4(4(Pa}%}5U1Q%A1%IĀԤ4(4a}=59%}1%!QM4(4a}MA=Q}1%!QM4(4(e95% }1%!QM}MMM4(05 IQ}1%!Q4(e95% }1%!QM}I1e}a%Q4(4(ՍсH=15(5(рI4(р4(рɕѥ}}ѕ}͍4(рI4(рI4(рI4(рIQ=ɥ}ձI4(4(4(ՍсHM15(5(рAI4(р M퀼M̥сх́х}݁͡5(рɕѥ=͕4(рЕ%}͍4(4(4(1= 1} UI0 ՙɥȕѕɡ4(5(р4(рѵ}4(р̍ɕ}}ѽ}ѕ፽ɑ4(рܽɱ}٥}4(4(4(4(P==с@ѽ5(PɕɅѽ}ѕɕ}ѕȕѕɡѤ4(LMхѕѽ}ѕɕ}ѕ}ͅхѕȕѕɡѤ4(4(4(4(4}A%5(4}A%̸ؤ4(5(4(P==с@ѽ5(ɀAѽQ ɑ̀͡ɱ̀ɱс载Ƚхѕ4(5(̥̀􀄉͡ɹी4(͠İ4(耠͠Ĥ4(̀݅ɑ􀸽ɵ镡ɽ̥͡ɥ4(̥ɽ͡ɱ݅ɑ4(TM}= Q!I1}5AA%95(ɀЍ􀼍хɅ}͠ѡ̥ɥѡɱɥѡ݅ɑɥ载Ƚхѕ4(͕5(хɠѡ݅ɑɥѡ̥ɥ4(ɀЍ􀠅ɠȀ4}A%Ѡѡɱɥ4}A%载4(5(ȕɹЍ4(5(4(сAѽYՕ̀}ɱ̀ɱс载ȽхѕсЕ%4(5(ɀЍ􀜕AѽQ ɑ͡}ɱɱ载Ƚхѕ4(I9 !5(塼ɡЍЍĤ4(ȕɹ4(̀ѽЕ4(ѽ}ѕɕ}ѕ4(ѠЍЕ%ȝ4(ȕɹLI Q1}ѡѽȥ4(5(4(4(Aѽ%ѕͥ塘̀Q]ɱɱ̀ɱсЕ%сЕM}ɽхѥсɕѕՅѥ4(5(ȕɹɕѕՅѥ4(ѽ}ѕɕ}ѕ၄8U115(ѽ}ѕɕ}ѕ၄8U115(ȽхѕЕM}ɽхѥ4(с载􀄉͡ЕM}ɽхѥ4(I9 !5(Е%ɕѕՅѥĤ4(ȕɹɕѕՅѥ4(ȕɹAѽYՕɱQ]ɱɱ载ȽхѕЕ%ɕѕՅѥ4(͕5(5(4(4(ɽ鼼م͹ȕѥɕɥѡɽؼ՝}Ṡѵ5(鼼م͹ȕѥɕɥѡɽؼ՝}8՝}Q}5(}ɽ}͡ݡ81=4(5(ȕɹ̅Ʌѕ͡81ȸɠ=ĸ4(5(4(̀}ɥᡘ̀ȥѱ̀̀݅ɑ4(5(̀́ȥ4(̀́4(̀́􀘽݅ɑ4(ȕɹ͠4(͹ీ͹ీ͹ీ4(͹䱀͹䱀͹䱀4(͹豀͹豀͹5(4(5(4(̀Ѕ}ѽ}ݽɱ̀ؕ̀Ѕi4(5(̀􀄉͡Ѕi襀͠Ĥ耘͠İ4(̀Ѕa􀸽ɵ镡ɽ͡Ѕi4(̀Ѕeɽ͡ЅiЅa4(ȕɹЅaؕЅeؕ䁬Ѕiؕ4(5(4(ɀ̍ɕ}}ѽ}эɀ̍ɕ}ͥ4(5(ȕɹ̍ɕ}́̍ɕ}}ѽ}ѕ፽ɑ偬̍ɕ}}ѽ}ѕ፽ɑ4(5(ljFH.\shaders\include\clustered\punctualLightsMath.hlsli4b$m D,lk-LN.m-MAA*͍.L NLmN,ee͍̍-lE&%&eNn퍮l.LmN, NL̬AČ-d(m.m,Č-d..L(m.mČ-$n*N.N*,n$AdAČ-,lMd..L(m.m D$n*N.N*,ndAČ-d(lMd.N. % ,lMD,lM$eADN d(lMDd(lMnAAAČ-䬌(m.m,Č-d.N(mČ-$n*N.N*,n$AdAČ-$̭.. Dn - e.N(m&&%eA$̭.. d.N. %̭.. Dd(m.m,d.N(m$n*N.N*,n$%eADN $̭..mAAČ-䬌.팭,Č-nM--M) ΪlMČ-n- (MČ-- .팭lj, Č-- .팭l.AdA  dAČ-- .팭lj, $ - &ƌdm.ͭLdmL$%eAČ-- .팭lemLD$팭lj, dAAČ-d - (MM--M) ΪlM$eAČ-$̭.. d.N. e D- .팭lj, d- .팭l$eAd  N.m..ͭADN $̭.. D$̭.. dAAAA$D. ,mn $m$ ,mn M.̍ $.,o,l  -dN,l ĥAd- $팭 $ dL M$ D. ,mn $mD* %dmdN̍ $팭 $%ťAdN̍ $팭 d.- $Lnl. E,M$ dLA$̍ d.- $. E,M$ D. ,mnAd.m*-l*Nd. dN̍ $팭 $K$$mEKK&M$ dLA$̍ EKDKd K&$M$ ,mnAdm +. $md- A-$--ml +LI(mn Č-dm +. Č-d.m*-l*N$AaAČ-d.͍ +. d.N% dm +. Ddm +. $eAAČ-$--m lA鍮 D荍. l$m,..̍  M.,- M- ĥA +L $md-l $  dNή Ddm +. d.Nd.m*-l*N$Adm +. e.Nd.m*-l*N$$̍ m $$mA + 䭎Ld,l d, D L $͍ $ dm +. Ddm +. d.m*-l*NA$̍ n. d.N. dm +. $$m, ĥA$ dm +. Ddm +. d.m*-l*N$AdA$--m d.m*-l*NDd.N. dm +. $eAAmAdAČ-d.N% d.m*-l*N$,eM$ ,mn -md. -,  DAČ-$Ddm +. d.͍ +. $eAČ-d.͍ +.l*N. d.͍ +. Dd.N% $D$/eA$--m dm +. D$lm(l%/Dd.͍ +.l*N. $Dd.m*-l*Nd$. e.͍ +.l*N. /eA$--m *iAADN - $--m ,eAAA-$--ml +L,̭.. Č-nMM-Č-n,M) Č-- N*,nČ-d.N(m.AaAd +L ...ͭAČ-dm +. d- MM-,M) .%''%'''dd-  $- d,lA ĭ N̮̍ MLḽN.. $͍  dN,lA$̍ n$- ,. D,n %'''ĬAAČ-d.N) N*,n- N*,nD- N*,ndAČ-d.m*-l*N- d.N) N*,nd.N(m%''',eAČ-$--m $--ml +LI(mn dm +. d.m*-l*N$eADN $--mlAAAA-$--m(mn-̭.. Č-nMM-Č-n,M) Č-n-̭M-Č-- N*,nČ-d.N(m.AaA(mn ...ͭAČ-dm +. MM-,M) .eAČ-d.N) N*,n- N*,nD- N*,ndA  dN,l ̭N.  - AČ-d.m*-l*Nd.N) N*,nd.N) N*,nd- d.N) N*,nd.N(m$%eA. -D,d.N. -̭M- ,M) .% DL-n L΍ N ĥAČ-$--m $--ml +LI(mn dm +. d.m*-l*N$Dd.N. -̭M- ,M) .%eADN $--mlAAA- d- .L.mŌ-nM mČ-m+̍K.,nČ-n- ,Ml.͍Č-- .팭lj,Č-- .팭l䭎- -̭..͍䭎Č-n,MH) 䭎Č-n-͍N- .AaA-͍N- m+̍K.,n/OM m/OoAČ-,mn*H) -͍N- -͍N- .eAČ-Dn (mH) Dn.N&f,mn*H) .eA,MH) -͍N- NEn (mH) nAČ-$n*NN* Dn Nm+̍K.,n.%eAA-̭.. 䬌(m.m,,mn*H) $n*NN* $eA-̭.. -̭..M嬌.팭,,MH) - ,Ml.͍- .팭lj,- .팭l.eAAA- $L,l +LM--M/. Č-̍Č-- n*MČ- $AaAd  M--M/. ,lMnΥA鍮LDnn. dL M--M/. Md쭭 . N L,mn-̭ M--M/.-A- ,md.N. - n*M -eA- M(lM  dƥD,m$eADN M(lMDM(lMnAAA-l$L,l +L) -lD-l- - - n*M,Aa/A$ɍLnl dL̥A-ld̍L(M D*DDjA  d̍L(MDd.N. - n*M  e̍L(M.e%&$e'!!ADN /OoAAA-͌d +L,H,) .ɍLnl. -lĉ-lĊ-l- + -- - n*M $AaA-͌- Ϊl -͌/O$,eA-lD +ĎlŊ)eAA- Ϊl/O$L,l +L) E + -- n*M,eAAM--M̥A- -  - Ϊl/O$$&eA- Ϊl/OmAAȭL,M--M/.ͭA- Ϊl$L,l +LM--M/. ̍- n*M + - $eAADN - ΪllAAAAa#9B2pC #+Jsc#+"K33+#3sAccKL// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef DIFFUSE_BRDF_HLSL +#define DIFFUSE_BRDF_HLSL 1 + +#include + +float3 diffuseLambert( float3 diffuseColor ) +{ + return diffuseColor;//division by PI omitted intentionally, lightColor is divided by Pi +} + +//linearRoughness - perceptual linear roughness +float3 diffuseBurley( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + float FD90 = 0.5 + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return diffuseColor * ( FdV * FdL );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//from moving FrostBite to PBR, energy conservative burley diffuse +float diffuseBurleyFixedFresnel( float linearRoughness, float NoV, float NoL, float VoH ) +{ + float energyBias = 0.5; + float energyFactor = (0.45f * linearRoughness - 0.475f) * linearRoughness + 1.0f; + float FD90 = energyBias + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return ( FdV * FdL * energyFactor);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float3 diffuseBurleyFixed( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + return diffuseColor * diffuseBurleyFixedFresnel( linearRoughness, NoV, NoL, VoH);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float diffuseChanFresnel( float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + // Since we use CoD fitting, need to invert/convert our roughness parametrization to + // their glossiness parametrization 'g' + float ggx_alpha = linear_roughness*linear_roughness; + float a2 = ggx_alpha*ggx_alpha; + float g = saturate( (1.0 / 18.0) * log2( 2 / a2 - 1 ) ); + + float f0 = VoH + pow5(1 - VoH); + // This factor tunes the enery boost at grazing angle for low roughness material. + // It creates energy ring at grazing angle for smooth dieletric material + // The higher the value 'rimScale' is, the lower the energy boost will be + // The default value from Chan is 0.75. + // Setting the value to 1.0 get rid off this energy boost. + const float rimScale = 0.75f; + float f1 = (1.0 - rimScale * pow5(1.0 - NoL)) * (1.0 - rimScale * pow5(1.0 - NoV)); + + // Rough (f0) to smooth f1 response interpolation + float fd = lerp( f0, f1, saturate( 2.2 * g - 0.5 ) ); + + // Retro reflectivity contribution. + float fb = ( (34.5 * g - 59 ) * g + 24.5 ) * VoH * exp2( -max( 73.2 * g - 21.2, 8.9 ) * sqrt( NoH ) ); + // allow to fade our rough retro reflectivity + fb *= retroReflectivityWeight; + return ( fd + fb ); +} + +float3 diffuseChan( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + return diffuseColor * diffuseChanFresnel(linear_roughness, NoV, NoL, VoH, NoH, retroReflectivityWeight); +} + +float3 diffuseOrenNayar( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH ) +{ + float VoL = 2 * VoH - 1; + float m = linear_roughness * linear_roughness; + float m2 = m * m; + float C1 = 1 - 0.5 * m2 *rcp(m2 + 0.33); + float Cosri = VoL - NoV * NoL; + + float C2 = 0.45 * m2 * rcp(m2 + 0.09) * ( Cosri >= 0 ? Cosri * rcp(max(NoL, NoV)) : 0 ); + return diffuseColor * (C1 + C2); + //float C2 = 0.45 * m2 * rcp(m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NoL / NoV ) : NoL ); + //return diffuseColor * ( NoL * C1 + C2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// N is the normal direction +// V is the view vector +// NdotV is the cosine angle between the view vector and the normal +float3 getDiffuseDominantDir ( float3 N, float3 V, float saturated_NdotV, float ggx_alpha) +{ + float a = 1.02341f * ggx_alpha - 1.51174f; + float b = -0.511705f * ggx_alpha + 0.755868f; + float lerpFactor = saturate (( saturated_NdotV* a + b) * ggx_alpha); + // The result is not normalized as we fetch in a cubemap + return lerp (N, V, lerpFactor ); +} + + +#endif ZYW[YW]ڗ [5xyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3)rJ"2BbbjP!+3Ks+)rJ"2BbbiPhPI3s#+3IrjJrJzjP!+3Ks+IrjJrJzqAkP)s#K3kPhPxyiiiiiiiiiiiiiiiiPxy)r"2jPxyiiiiiiiiiiiiiiiiPhP@ c39+*r"2 + +{CA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiP{sA c3iqAciqAciqAcqAiP{sA c3qAcqAcqAciqAiPA c3aKs+ {;Cs+QYiPA c3 iKsCsQsc)ÃAiqAQqzIIQsYsiP+sA c3AiqAcqAIQ YsѻiPkPhP@ c3)r"2 +{CA c3+c zc{cA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiPA c3 9+*r"2 + +{CaKs+ {;Cs+cqzIiP+s+c zc{Q rY rS +CIrjJrJzR+c zc{s9KiPkPhPhP@ c3)r"2 +{szsk+ cCA c3aKs+ {;Cs+cA c3qzIiPkPyy +k+ )r"2 +{Cqa{;Cs+cqzIiP{sA c3iqAciqAiP{sA c3qAcqAiPA c3aKs+ {;Cs+QYiP+siKsCsQsc)ÃAiqAQqzIIQsYsiPkPhP)s#K3kP ȏ \ʸ\( \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYRQԗQWSWЗVYY[RQԗQWSWЗVK \ٛ[[\Y]ڛ\KYY[TȌK MLMML NMΌ  ̌YYY[RT +K +ȌK MLMML NMΌ  ̌YJB  țY[[[ZH^Z[]ڛ[  Ց H HSQT]Y +H WK \YZ\X\ڛ[ TY\XRțHSZY[]XQ]ڛZ]H[Y[]\\XY]Q]ڛ\ + H H\X]HHK ]Y HK[HۜQ [HVJ^B[^ HHJVNB[ H^ +^NB[ H +^NB[NBBHH LLL  +^ +HK ̍ NBH M  + +NBHH L ΍LΌ + +NBH\J H ^L + +NBB HY]ڛH[ܛ\YB Z\[ٛ\H[\[H\[ݛH \[YYYYB\]HO TH NB_B  țY[[[ZH^Z[]ڛ[  Ց H HSQT]Y +H WK \YZ\X\ڛH[H\Q [HVJ^B[HHNBB H\Hț\țH\B\]RTH HۜQ +^NB_B  țYZ\H^Z[]ڛ[  Ց H HSQT]Y +H WK \YZ\X\ڛH TY\XHYXZH^Z[]ڛٛZH]YY]ڛ TZ Ȕ TZUH [^ H HSX M[H]Q [HVJ^B[HHNB\] +J K  +H +^ +H  ͌ + + +H LYNB_BHYTRHYRTRBHY!LĄh5FV&7Ǖ6VGVƅ&Gv&WEVfV66ǖL^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@F@PR@\F@PR@\FF@F@PR@FF@F@PR@FF@d`dbF@d`db@bFF@@bF@@f\bhbjrdljF@@f\bhbjrdljF@@`\`````bF@@fPb\`X@`\`X@`\`RF@@fP`\`X@b\`X@`\`RF@@fP`\`X@`\`X@b\`RF@@bF@@bF@@ʾȾʾF@d@ʾȾʾF@f@ʾȾʾF@h@ʾȾʾF@@F@d@dF@f@fF@h@h@fP@X@@X@@R@@@@@PX@PX@RRv@fP@X@@X@@R@@@@@PX@PX@RRvF@PR@@fPf@R@@@@@fP\X@\X@\Rv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRvF@@F@PR@@PPRRF@PR@h@tvF@dPX@X@X@R@\ʎPFFX@PR\X@X@RF@dPX@R@\ʘPFFX@PR\X@PR\RF@fPX@R@\ʘPFFX@PR\X@PR\RF@PX@R@\ʘPFFX@PR\X@\RF@PX@X@R@\ʘPFFX@PR\X@RF@dPX@R@\PFFX@PR\^PR\RF@dPX@R@\PFFX@RF@fPX@R@\PFFX@RF@PX@R@\PFFX@RF@ʎPX@R@\PFFX@RF@،ОPX@X@X@R@\PfPX@RX@RF@ʞPX@X@R@\PFFX@X@RF@ʘȞPX@X@X@R@\ʘPFFX@X@X@RF@PX@X@RF@@F@@غF@@кF@@ܺF@PR@@@F@F@PRF@PRF@F@PR@F@F@@bF@dF@dPX@R@`F@dF@fF@PX@X@RF@PX@R@`F@PX@X@RF@PX@R@`F@h@،ЄPdxh|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvf@،ЄPdxf|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvd@،ЄPdxd|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRv@،ЄPdx|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvh@،ЄPdxh|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvf@،ЄPdxf|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvd@،ЄPdxd|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRv@،ЄPdx|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvh@،ЄPfxh|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvf@،ЄPfxf|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvd@،ЄPfxd|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRv@،ЄPfx|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvF@،PX@X@R@،ЄPX@X@X@X@X@ZbRh@ȄPxh|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvf@ȄPxf|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvd@ȄPxd|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRvF@ȄPX@R@ȄPX@X@X@X@ZbRF@ȄdPX@R@ȄdPX@X@X@X@ZbRF@ȄfPX@R@ȄfPX@X@X@X@ʾFFRF@ȄhPX@R@ȄhPX@X@X@X@ZbR@ʄPʂ@X@@X@@X@@X@@X@@R@PX@X@Rv@@@@\PX@Rv@ʄdPʂ@X@@X@d@X@@X@@X@@R@PX@X@Rv@@@@\dPX@Rv@ʄfPʂ@X@@X@f@X@@X@@X@@R@PX@X@Rv@@@@\fPX@Rv@ʄhPʂ@X@@X@h@X@@X@@X@@R@PX@X@Rv@@@@\hPX@RvF@ʄPX@X@R@ʄPX@X@X@X@X@ZbRF@ʄdPX@X@R@ʄdPX@X@X@X@X@ʾFFRF@ʄfPX@X@R@ʄfPX@X@X@X@X@ZbRF@ʄhPX@X@R@ʄhPX@X@X@X@X@ZbRF@ȄPX@R@¶PPPX@RX@RRF@PX@R@¶PPPX@RX@RRF@dPX@R@¶dPPdPX@RX@RRF@،ЄPdxd|@X@d@X@@X@@X@@R@@@@@v@@@@@¶ƺ\vF@،PX@R@،ЄPX@X@X@X@ʾFFRF@Bd`dbF@PX@X@R@@~@@t@F@PX@R@@@Ff@fPf@RF@@@@@@PX@ljj`h\RvF@@@@@PPPX@RR\X@X@fP`X@`X@`RRvFF6dR&\ʸ\ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYחSSӓWYY[חSSӓWBH[YYY\ٗ [OH[Y\X[ܗ [OH[YO]ڗ [OB QY\HY[YY[QQTSPPLYY[QQTדTӗSPVHLYY[QQTїPSQLYY[QQTїPSQ֗QVLYY[QQTRMBHYQQTQYY[QQTQQTїPSQ֗QV QQTדTӗSPV QQTїPSQ QQTדTӗSPV QQTїPSQ QQTSPPKHYYB HSژܛYXY\X]ڛY]ڛ[BYY[TїSLYY[TїPRSHLYY[TLBHYTQYY[TTVHYYB Q[[\H][]]ڛțZ]YYY[TWRSPLYY[TїSQUSHLYY[TRSQSLYY[TSLYY[TTSMYY[TTSГTSUHMYY[TTSГTSUWMBHYTQYY[TTTSГTSUQHYYB \ٜ[[YY[TЗїӓSLYY[TЗSHLYY[TЗїTєSLHYTЗQYY[TЗTЗSRHYYB ZY[HYRQTPSTYY[RQTPSLHYYB[ YY\[ YY\ۛ [[[Y[[ [ӛ [ [RJ^HQQTHOQQTSPPU\]YY\SXX +YY\ۛHNH[QQTHOQQTדTӗSPVT\]YY\ٓ\SX^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQV\]YY\P[Y +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQ֗QVQ\]YY\P[YQ^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTRSHܛXYY\YY\ ]R\]NHYYB_B[ YY\[ YY\ۛ [[[Y[[ [ӛ [ [ [RJ^HQQTHOQQTSPPU\]YY\SXX +YY\ۛHNH[QQTHOQQTדTӗSPVT\]YY\ٓ\SX^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQV\]YY\P[Y +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQ֗QVQ\]YY\P[YQ^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTRS\]YY\Z +YY\ۛ [[Y[[ܜ +[[Y[[ ӛ   RNHYYB_B[Y\X]ڛ[WZ [RJ^HTHOTїSS\]Y\X]ڛ[ +WZ HNH[THOTїPRSS\]Y\X]ڛPZ[ +WZ HNH[THOTV\]Y\X]ڛ +WZ HNHYYB_B UH  +ӛUJ[Y[[\ژU\X[][WZ [ӛ [ [RJ^HTHOTWRSPU\]Y[[\^R[XJNH[THOTїSQUSS\]Y[[\SY][ +ӛ HNH[THOTRSQSS\]Y[[\R[Y[ +HNH[THOTSR\]Y[[\[ +WZ ӛ HNH[THOTTSV\]Y[[\T[ +WZ ӛ HNH[THOTTSГTSUQ\]Y[[\T[Л\[] +WZ ӛ HNH[THOTTSГTSUWV\]Y[[\T[Л\[]Y +WZ ӛ HNHYYB_B[ ї\ٜ[[ \X[ۛ [RJ^HTЗHOL\]\ٜ[ӛ[ +\X[ۛHNH[TЗHOHL\]\ٜ[[ +\X[ۛ HNH[TЗHOL\]\ٜ[\ٜ[ +\X[ۛ HNHYYB_B[ \X[[WZ [ӛ [ [ [ ZZY\ Z ZYۛ\J^[HY\X]ڛWZ RN[HY[[\ژU\X[]WZ ӛ  RN[ \\H +NB\]\\NB_Bˋ[ݝX][\؛]K[܋ L KL[\ٗ]Wۛ]ٗX]ܗ ʛ\Y[]\ڛZXHYYHJ[[\]\[\ڛ[\]\]ٗ [H [WZXJ^\]\]\] +\]\]ٗ +H H JK +WZH H LJ +H H +HSNB_WZH[[Y[[ܜ +[[Y[[\B WZH[[Y[[ܜ +[[Y[[\Z ]Yїӗ[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[ [ ZYۛ [\[XX^J^HTPSQTS QQTHOQQTSPPU\]YY\SXXX\QY\ۛ\NH\Y[ Hۛ\[[^]Z +[Q\N[H\]\] +ۛ\[ RJN[H\]\] +]Z RJNZ YY\HYY\X\QY\ۛ [[Y[[ ӛ  RNHHTPSQTSQ[ \X[H\X[WZ ӛ    \[XX ZYۛ\ + +\X[\N[ Hї\ٜ[\X[ۛ RN\] +YY\ + +\X[\NH\Y\]YY\NHYYHYYB_BZ ]Y[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[ [ ZYۛ [\[XX^J^\]]Yїӗӛ  X\QY\ۛ WZ [[Y[[ \X[ۛ \X[\ [Q ]Z ۛ\[ ZYۛ \[XX^ + +NB_BZ ]Yїӗ[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[[J^\]]Yїӗӛ  X\QY\ۛ WZ [[Y[[ \X[ۛ \X[\ [Q ]Z ۛ\[ [ +  L + LNB_BZ ]Y[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[[J^\]]Yїӗӛ  X\QY\ۛ WZ [[Y[[ \X[ۛ \X[\ [Q ]Z ۛ\[ [ +  L + L + +NB_B ѓSPUKM H[YYH؛]]Z\ٛH^X[\YY\X]ڛH\X[ܗ [ZJB]T]\P܌ J]X\J^XHXHM +XHMNXH +X  ^MMMMMMMM +HL + +X  ^PPPPPPPP +HLNXH +X  L +L + +X  P +LNXH +X  Q +M + +X  L +MNXH +X    Q +N + +X    L +NN\]XNB_B[ RX[[[YJ]H H]SJ^؛[HQ H\[JZ + SN؛[H HT]\P܌ JZ + +ˌ ͌M MLYK N\][ JQ HLNB_B[ HRܛ]XTX[[ H [HLJ^؛[ZH +T +H N؛[Z]H\ +J H HK^ + J +J H H L + +HK^JN؛[\Z]H\J H Z] +Z]XNB[ N H\Z] + +ZZNKH\Z] +\ +ZZNHZ]NH\]NB_B[[H [RJ^؛[H +H H R + + +H N\]H  +T + +YNB_B[HRܛ]X[Z] [HLJ^\]Z] +J Z]XNB_B[\X[[ [H [RJ^\]HRܛ]X HL + H[ + +  LLNB_B[S][[X[ ۛ\J^\]ۛ [ +L ML  ̍LJNB_BHYLЄe5FV&7Ǖ6VGV5FV&u&6ǖ}^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@F@@bF@Dʾ\D@dP@R@@Tv@hP@R@@dPTRv@pP@R@@hPTRvd@ddPd@R@@Tvf@dfPf@R@@Tvh@dhPh@R@@Tvd@dPd@R@@Tvf@dPf@R@@Tvh@dPh@R@@Tvh@hPh@R@@dPTRvh@pPh@R@@hPTRvh@blPh@R@@pPTRv@jP@R@@@z@Tv@Tzv@@Tv@dP@R@@Tv@hP@R@@dPTRv@jP@R@hzTv@hTzhv@@hTv@ȠP@X@R@@@PPPRX`\`````bRXRv@f@ޮPf@X@ff@R@@@@@PX@Rvff@訄Pf@R@@@@ff@v@@@@f@@z@PX@Rv@@@@@z@PPX@RX@X@PX@PX@RRRv@@@@@z@PRv@@@@@f@@z@PPX@RRv@@@@@ffP@^^@t@Zbnrn@@@@X@@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RRvff@訄Pf@X@f@R@@@@@z@P@Z@PX@R@T@Rv@@@@@f@@z@PX@Rv@@@@@ffP@^^@t@Zbnrn@@@@X@@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RRv@ʾP@X@d@ʾR@@@@@Pʾ\@V@ʾ\@T@RvF6j&,902941:29:0/1923494n2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf2U4T$%$Ed4Ԡ0BVfV2U4T$%$Ed4ӠР06VGV3FV&u&6ǖӠРҔ6&f6VF2W6V&BrbBƤfBb6bԠb6rBƤfҠР0fFVfdՔ$ՠ0BVfVdՔ$R֠0RFf֠Р%Ėss"FV6f–vF"WfV6Fb&2WGW&2FV6WF6FW'W6'ՠ`FB6G'&VG&ĖbFrvbFҠנbF&rvrvӠbF&&Ӡ"WFW'&2WFv&"Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР%T6c3"BV27FGW&vfRV6F'vVF6rfW6b&"Vw2W'g6V6'ՠ`FB6G'&VG&T6bFrvbFҠנbF&rvrvӠbF$Ӡ"WFW'R$&$&$$Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נРrtB%v'&FvV"UFנ`FB6G'&VGvtbFrvbFҠנbF&rvrvӠbFB&"F֠"WFW'&SւBBBf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР6F'6rtB6Vנ`FB6G'&VGvt6bFrvbFrvbFbF7bF7bF7ҠנbFBFӠbFBFӠbFBv'rvv'rvӠ"WFW'SւrvrvBBBf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР4֖֠FG7&v6r&G'W672"C2F2FvҠ`FB6G'&VG6FbFrvbFҠנbF"'rvrvӠbF26'ӠbF2&26'ӠbF2F2&2&Ӡ"WFW'2FBR26'2&"'B"'2FBf6"6֖FWF֠נР`FrVVF'ǖ6FҠנ"WFW'"SӠנР`FrVVF'TVbFfbFҠנ"WFW'"7BfSRӠנР`FrVVF'7F&'6VbFbFbFfbFbbFrvҠנbFDF5WFӠbFDFg5WFfӠbFEfeEF"bӠ"WFW'ҖҖEfeEFDFg5WFEfeEFDF5WFӠנРTVV""Җ6&f6VF"6WF2VVF2W6V&FGW"&GfFVrF&G6V2ǖv&ՠ`FrVVF'TVVbFbҠנ"WFW'"7BbbӠנР`FrVVF'75Ɩ6bFrvbFfbFҠנbFv'rvRӠbFrVVF'75Ɩ6ffӠbFrVVF'75Ɩ6Ӡ"WFW'"SrVVF'75Ɩ6frVVF'75Ɩ6ӠנР2ՖFBW&b&rtՠ`FrVVF'7ՖFbFrvbFfbFҠנbF&v'rvӠРbFrVVF'7ՖFff2'Gfff&&ӠbFrVVF'7ՖF2'G&&Ӡ"WFW'"7rVVF'7ՖFfrVVF'7ՖFӠנРFf2&'WFWF2ՖFBW&b&rtTFנ`FrVVF'7ՖF6&'WFWFbFrvbFfbFҠנbF&v'rvӠbFrVVF'7ՖFf2'Gfff&&ӠbFrVVF'7ՖFf2'GƤ&&ӠbFrvӠbFrVVF'7ՖFffӠbFrVVF'7ՖFfӠ"WFW'R"7rVVF'7ՖFfrVVF'7ՖFӠנРFfF2ՖFBW&b&rtՠTF"C"RFV&7GFvBV6v2FvvbT6FҔ6&f6VF"6WF"$Ed4'ՠ`FrVVF'7ՖF6&'WFWF'bFrvbFfbFҠנbFrVVF'7ՖFffrvrvӠbFrVVF'7ՖFfrvrvӠ"WFW'R"7rVVF'7ՖFfrVVF'7ՖFӠנР4֖֠FG7&v6r&G'W672"C2F2FvҠ`FrVVF'7FbFfbFƔҠנ"WFW'BƴffӠנР`F7b&W6VVbF72W6V&7&Ҡנ"WFW'2W6V&7&ӠנР`F7b&W6V65Ɩ6bF72W6V&7&bFbҠנbFb4vWbӠҠGvV67B"S676Ɩ67&VF66GWF26FV&WFB"V2Fvv֠"WFW'2FW'FWdՔ$2W6V&7&rb4b42W6V&7&ӠҠנР`F7b55Ɩ6&VwV67bF7bbFbbF"VwV67Ҡנ26GbFb4vWbӠbFf'Vw"VwV67Ӡ"WFW'bbF7f'Vwf'Vwf'Vwbbb4ӠנР`F7b&W6Vf$W6VƆbF72W6V&7&bFbҠנbF72W6V&7&7'G2'G2bF7bF7㒓㒓㒓2W6V&7&ӠbF72W6V&7&7'G2W6V&7&7'GӠbF7r2'GbbӠ"WFW'Rv'eW66rbrbv'eW66rbbrbbӠנР`F7rVF'Vw&UfV6FfU6bF7"bF7&bFrvv'–V&%VwV67Ҡנ"WFW'V&&"rv2'GrvrvӠנР0RFf֠Ah79p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 Ɇ RDܗ $>shaders/include":(77<68222477:27241:9029-ZilZȾ8\amX NO$OdOd8 ɟLh'BnnDQ!? p:bJ;Czs33+ OLTOU ))7:34 2m@DUVOOX Jl U &H5A@ E'2+` +ZT"+2A@ Eu+2+$` +[T"+Z\ѕ B6՟Jl H,Z0 ` bROdeV6 !.UʬLmA*P6rչʬl(Pe\\e'+..?! lepj!p"POSITIONě $߆O& l*Yٰ ċ̋ )$90$ BD &l*?ٰɽK̋^˔\]ڛ!Q&HA@f'/2/''20 +<@yE\ݸ<0 @O`z `(97/34472q "y2ԁ :pos_and_radiusDe90XG=`jM+̍+̭..m\HČ@fL%v`- .팭lj,l\HԌpwʞ%xp@dmLn\H䌠 @ c3 +s ;#A >HfA~P s;+s! +? @C%@=d@n\(C ЅaK}]Y]ָPH=؇ 8͍KɃ outputDm8hfB&v2V7%Gllvm.module.flagsS+llvm.identSD2V'7V2FWF77E!Q2A5q8qD2V'7VBVfV67%l̽ɍ9M [XKܔOؕͥM ]]ܔ T̡5M H \[XܔU,хѥM҅]إ%MхѕM K\[ܔdyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q )@ D@8ӿ 1I%6\B@0_ܶ%H;/D0! aptm4\ bP_ܶ L;8 65mA5\DJM5m4\Ma~qV <>mβT?_ Ea jC, D6@HLWc7F   +c 0'c&L> z0A8Bap A +&*LV 0A8\apစ A c&/L^ 0A8apX & ` `@ ^8aaƀ61@l0F 腲& A0(z9f@ ^aa1@|j0F ʅVf |@!l#5 "f 1 !nP>& A0(!;a"PA0(¡;A `@ pa0+όa +acmg!τ`&  >|& A0ġ +!(`ƀЇ f@ r؃`τ` A> (`Ì (͈ (PÄ0b ; +?0aX1 ! 3ag0c 3aXa0L3a0LAL&0F Vf }`@!lF V& A0(Uh M>3?T6p03agƀ41ēτ`' 8ό{ +ac`0, @>%|f ~@!l,83c@BؘBgƀ>3?(-|f ~@!l,H3c@B، AA|?n?|0b I ?0a AAz?n?LŒ +0Pq i0b I ?0c@ 'C/Ä0b I ?0a)}f Rx<, 3c@`! B>  V> `@ .[<F`M `4a& b0F jq0F`M `4a& b0F  t0F`M `4a& b0F ຉv(0F`M `4a& b0l3c@ d dh dit& A0(䂼0"<F P5& A0(B0A `@ +%L a1H-r,Ȃ&<F y d1H-r,"& ` @ & 1 N Xv5m[5n`еnjuovжmyvn6o|wm7nn8mXUH]VHmvWHmߦWHmPHmWH}&PH}PH}PH5ma5olvmx6n{n7m~mطnwoظm^ħ!H 5mgCmiPP|&0P|&0P|&0P|&0P|&0_"1qN#MUD UDdi*AdZ*AdNn?8S$B@BdSH># N!v8>bSTAT`&DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 82" d##ㄡL L@ +f`)@DAQ A@Jb 1 0 5\=sUa*.BCQ! B"h*@ @AP ("l ``;pi0|pK8&iiqF0A%M%LJ43qLضmK@vǙJ8& _Hbrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` +X@ +0 ʡ$J + + +T< +1(2("(B ogh r yLFD oM $Efe%&,f&gl&eCLd@(  l xgH) nmN̬Ln@0BYb` ))7:34 l@!6M L[ۜTYZx&4A !MiXeF- nM.팭lj,l@P<,6flightDirectionAngleOffsetڀ `pi2$0 am@1˴mCQqA Ҁ[[6 \Fg- nkLlpY`AL:3f7A ö8 ѵ}m@:9*,57&WV6EEW7&G6A b`ѹ{c#K+{ ɃKL6 `  ! 0A 5)297/34/9"POSITION› ߆ `A a + + +* +lʒ&EL +1 cA + + +,  V.SV_Position &ĶAlaB)B*P *†6 JA&\Z 30 Hs 479sig_ld4ξXԥmpxa_pAqfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥM إ%MхѕM FK\[ܔ@ṌչѕM yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q &@ D@8ӿ 1I%6\B@0_ܶ!H;/D0! aptm[4\ bP_ܶ L;8 65m@5\DJM5mہ4\Ma~qF <> ILDN,$254c2603c842ba36d4a3b7713a716256.pdbHASH%L&B6ԣq:qbVDXIL `sDXIL BC! j #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 82" d##ㄡL L@ +f`)@DAQ A@Jb 1 0 5\=sUa*.BCQ! B"h*@ @AP ("l ``;pi0|pK8&iiqF0A%M%LJ43qLضmK@vǙJ8& _HbSrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J`  +P ʡ<(2("(B o": +yybLFD oM $Efe%&,f&gl&eCLd@( a0(MfÀ$LfB, A 0Am@8aa m @&dm "+;{bK;C#4D4A( B1m BAMg@@۰Xmf+m.m,hPTš 6,Cl@V00.SV_Position S 60A +r fFVF7%ؕͥM &dx.valverSZY\Y۔ )C"W6V'7V67%إ%MхѕM :dx.entryPointsS7yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q &@ D@8ӿ 1I%6\B@0_ܶ!H;/D0! aptm[4\ bP_ܶ L;8 65m@5\DJM5mہ4\Ma~qF <> a C, tQ0%S%W\eW3Pn4 c  ( # `c@# `AsD# `Rd)# ``Se-# ``Acf1# ``sg5ELW Ln !hB&h &pA0sф`10 v@ &<`4!F`4aF > q},3b`  )A0b )aZ G2B`'#8, +g p#`1 ` A0`\ሀ o! nX5 +cndžL>V`1!|F ;(A0`r X!NJA>|lnj1f 1 cBc6ǘN>t1ē|ā|, @> )|,@cK 0P1 O` |l c*džU A0!l!F`4AFa4F ` s؅M!Mb18$a4!F`4aFa@ &rфMфAM . A\ T2Xp@ǬM>#`P>H[0b M(бψ T9 A } t A#A0b O5tF @! 艞f @  HF @! 艞b @ 艙DXBC)Ïu~$>" ,u DTh( SFI0ISG14(SV_PositionOSG14(@SV_TargetPSV04debug_spot_lights_psDDILDB`nsDXILBC! es #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@I 2" d""ㄡL L(#%90#@f3CE6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C<d 2L &GCB(2(( *2( yrLFDL- nk-Lmm=271 30:Bvector X12@ E h 0 1@h%``0 1@h%`0 1@h%`0q element@Jؔ}չqHscdPAVp@Ya&A`h @,b FLk- n nS\E |#H0'4`aA`c0AU t +de 8 \^^ʸ^\ @Dhh8ɥ񘱽ѱаpYMf0 0bd1@B`+ff4q ,$`0bh1@3B`K&f4u ,$` 1dd1@sB`Kff4y ,$`1dh1@B`k&f4} ,$` 2fd1@B`&kff4 ,$`2fh1@3 +B`.&f4 ,$` 3hd1@s +B`6ff4 ,$`3hh1@ +B`>r8:<>PR0TPV`"v5VF7[ݴX +0 6@ @E ``, h  }1 ՙXɥ5̐ m[@[P3 *globtm_inv37147;#/3479::329 0:4<& m  jp@knL m틮 oMl~ܾ޾Ȁ䀀f~H䀚H`f-@xB/796//9Aݛٗ]ZБSЛPYЌ]ݛP ж_5H^`ŖvF75VFǢ.͍]ݛO\ڙ[H :32247=@`p,b*w00`1@; "hrs0X#T``0s@tPe I PHq*E `~Ҿ耦Ҙ怀f~H䀒H`f-@xC<<yksKbK;C#UFV&ƔvFmN*,nn4Il P{c{3b ;[=EHH)417/20E T${ÓY>EH 7= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon. + Length rho = + SafeSqrt(r * r - atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon). + Length d = DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Number x_mu = (d - d_min) / (d_max - d_min); + Number x_r = rho / H; + return vec2(GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)); +} + +/* +

and the inverse mapping follows immediately: +*/ + +INLINE void GetRMuFromTransmittanceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon, from which we can compute r: + Length rho = H * x_r; + // due to float precision, sqrt(0 + x*x) can produce value lower than x, so we need to acknowledge that + r = rho > 0 ? sqrt(rho * rho + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius) : atmosphere_p.bottom_radius; + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon) - + // from which we can recover mu: + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Length d = d_min + x_mu * (d_max - d_min); + mu = d == 0.0 * meter ? Number(1.0) : (H * H - rho * rho - d * d) / (2.0 * r * d); + mu = ClampCosine(mu); +} + +/* +

It is now easy to define a fragment shader function to precompute a texel of +the transmittance texture: +*/ + +DimensionlessSpectrum GetTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + vec2 uv = GetTransmittanceTextureUvFromRMu(atmosphere_p, r, mu); + return DimensionlessSpectrumFromTexture(sample_texture(transmittance_texture, uv)); +} + +DimensionlessSpectrum GetTransmittance( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu, Length d, bool ray_r_mu_intersects_ground) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + assert(d >= 0.0 * meter); + + Length r_d = ClampRadius(atmosphere_p, sqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_d = ClampCosine((r * mu + d) / r_d); + + if (ray_r_mu_intersects_ground) { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, -mu_d) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, -mu))); + } else { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, mu_d))); + } +} + +DimensionlessSpectrum GetTransmittanceToSun( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu_s) +{ + Number sin_theta_h = atmosphere_p.bottom_radius / r; + Number cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0)); + return GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu_s) * + smoothstep(-sin_theta_h * atmosphere_p.sun_angular_radius / rad, + sin_theta_h * atmosphere_p.sun_angular_radius / rad, + mu_s - cos_theta_h); +} + +Length DistanceToNearestAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu, bool ray_r_mu_intersects_ground) +{ + if (ray_r_mu_intersects_ground) { + return DistanceToBottomAtmosphereBoundary(atmosphere_p, r, mu); + } else { + return DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + } +} + +INLINE InverseSolidAngle RayleighPhaseFunction(Number nu) +{ + InverseSolidAngle k = 3.0 / (16.0 * PI * sr); + return k * (1.0 + nu * nu); +} + +float2 GetMiePhaseConsts(Number g); + +#if 0 +INLINE float MiePhaseFunctionDivideByRayleigh(Number g, Number nu) +{ + return MiePhaseFunctionDivideByRayleighOptimized(float4(GetMiePhaseConsts(g)*pow(0.5,-1./1.5), GetMiePhaseConsts(-0.25*g)*pow(0.5,-1./1.5)), nu); + //float k = 2.0 * (1.0 - g * g) / (2.0 + g * g);//this is constantant + //float phase = 1.0 + g * g - 2.0 * g * nu;//this is nother two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + //return k / (phase*sqrt(phase));//pow(1.5) +} + +//only for reference +//https://arxiv.org/pdf/1812.00799.pdf +//ON SAMPLING OF SCATTERING PHASE FUNCTIONS +//CORNETTE SHANKS PHASE +INLINE InverseSolidAngle MiePhaseCornetteShanksFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//full Drain phase function +INLINE InverseSolidAngle MiePhaseDrainFunction(Number g, Number nu) +{ + float alpha = 1.0; + InverseSolidAngle k = 3.0 / (4.0 * PI * sr) * (1.0 - g * g) / (3 + alpha*(1.0 + 2.0*g * g)); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + alpha*nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//http://www.csroc.org.tw/journal/JOC25-3/JOC25-3-2.pdf +//Zhang function +INLINE InverseSolidAngle MiePhaseZhangFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase)) + g*nu*1.0/(4.0*PI * sr); +} + +#endif +INLINE float SafePow(Number a, Number b) {return a != 0 ? pow(a, b) : 0;} +INLINE float2 GetMiePhaseConsts(Number g, Number weight) +{ + return float2(1.0 + g * g, - 2.0 * g)*SafePow(weight*2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); +} + +INLINE float2 GetMiePhaseConsts(Number g) { return GetMiePhaseConsts(g, 1); } + +INLINE float MiePhaseFunctionDivideByRayleighOptimized(float4 mie_phase_consts, Number nu) +{ + float forward_phase = mie_phase_consts.x + mie_phase_consts.y*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + float backward_phase = mie_phase_consts.z + mie_phase_consts.w*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + return pow(forward_phase, -1.5) + pow(backward_phase, -1.5);//it is faster than rcp(phase*sqrt(phase)) or phase*phase*rsqrt(phase) on Xb1+ +} + + +INLINE RadianceSpectrum GetPhasedRadianceOptimized(float4 mie_phase_consts, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return (scattering + single_mie_scattering * + MiePhaseFunctionDivideByRayleighOptimized(mie_phase_consts, nu)) * RayleighPhaseFunction(nu); +} + +INLINE RadianceSpectrum GetPhasedRadiance(IN(AtmosphereParameters) atmosphere_p, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return GetPhasedRadianceOptimized(atmosphere_p.mie_phase_consts, scattering, single_mie_scattering, nu); +} + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s); + +vec2 GetIrradianceTextureUvFromRMuS(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + Number x_r = (r - atmosphere_p.bottom_radius) / + (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + Number x_mu_s = mu_s * 0.5 + 0.5; + return vec2(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT)); +} + +/* +

The inverse mapping follows immediately: +*/ + +void GetRMuSFromIrradianceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu_s) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT); + r = atmosphere_p.bottom_radius + + x_r * (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + mu_s = ClampCosine(2.0 * x_mu_s - 1.0); +} +/* +

Lookup

+ +

Thanks to these precomputed textures, we can now get the ground irradiance +with a single texture lookup: +*/ + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s) +{ + vec2 uv = GetIrradianceTextureUvFromRMuS(atmosphere_p, r, mu_s); + return IrradianceSpectrumFromTexture(sample_texture(irradiance_texture, uv)); +} + +//rendering part +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoef( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + // Algebraically this can never be negative, but rounding errors can produce + // that effect for sufficiently short view rays. + return (scattering.w / max(scattering.x, 1e-4f)) * extrapolateMieCoef;//betaRMie = (betaR.x / betaR); +} + +IrradianceSpectrum GetExtrapolatedSingleMieScatteringDS( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + return IrradianceSpectrumFromTexture(scattering) * GetExtrapolatedSingleMieScatteringCoef(extrapolateMieCoef, scattering); +} +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoefConst( + IN(AtmosphereParameters) atmosphere_p) +{ + return (atmosphere_p.rayleigh_scattering.x / atmosphere_p.mie_scattering.x) * + (atmosphere_p.mie_scattering / atmosphere_p.rayleigh_scattering);//constant` +} + +#ifdef COMBINED_SCATTERING_TEXTURES +IrradianceSpectrum GetExtrapolatedSingleMieScattering( + IN(AtmosphereParameters) atmosphere_p, IN(vec4) scattering) +{ + return GetExtrapolatedSingleMieScatteringDS(GetExtrapolatedSingleMieScatteringCoefConst(atmosphere_p), scattering); +} + +#endif + +/* +

We can then retrieve all the scattering components (Rayleigh + multiple +scattering on one side, and single Mie scattering on the other side) with the +following function, based on +GetScattering (we duplicate +some code here, instead of using two calls to GetScattering, to +make sure that the texture coordinates computation is shared between the lookups +in scattering_texture and +single_mie_scattering_texture): +*/ + +#define SKIES_PREPARED_SHORT_PART (112./128.) +#define SKIES_PREPARED_SHORT_PART_SQ (SKIES_PREPARED_SHORT_PART*SKIES_PREPARED_SHORT_PART) +float scattering_DistToTc_m(float d, float2 dist_to_prepared_tc) {return sqrt(saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y));} +float scattering_DistToTc_Km(float d, float2 dist_to_prepared_tc) {return scattering_DistToTc_m(d*1000, dist_to_prepared_tc);}//fixme: +float scattering_DistToTc_Long(float d, float4 dist_to_prepared_tc) +{ + float shortDistTc = saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y); + float longDistTc = saturate(d*dist_to_prepared_tc.z + dist_to_prepared_tc.w); + return sqrt(shortDistTc < SKIES_PREPARED_SHORT_PART_SQ ? shortDistTc : longDistTc); +} +float scattering_TcToDist_Km(float tcX, float4 dist_to_prepared_tc) +{ + float tc = (tcX*tcX); + return 0.001*(tc < SKIES_PREPARED_SHORT_PART_SQ ? (tc-dist_to_prepared_tc.y)/dist_to_prepared_tc.x : (tc-dist_to_prepared_tc.w)/dist_to_prepared_tc.z); +} + +#define SKIES_LOWER_SPACE_PART 0.8 +float scattering_viewZtoTc(float viewZ) +{ + //return acos(viewZ)*(-1./PI) + 1; + return SKIES_LOWER_SPACE_PART + (viewZ < 0 ? SKIES_LOWER_SPACE_PART : (1-SKIES_LOWER_SPACE_PART))*viewZ; +} +float scattering_tcToViewZ(float tcY) +{ + //return cos(-PI*(tcY-1)); + float2 maddP = tcY= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + result += ComputeScatteringForIrradiance(atmosphere_p, transmittance_texture, RAY_SAMPLE_COUNT, r, omega, omega_s) * + omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum GetMultipleScattering(IN(AtmosphereParameters) atmosphere_p, IN(MultipleScatteringTexture) multiple_scattering_approx, + Length r, Number mu) +{ + float MultiScatteringLUTRes = SKIES_MULTIPLE_SCATTERING_APPROX; + float2 uv = saturate(float2(mu*0.5f + 0.5f, (r - atmosphere_p.bottom_radius) / (atmosphere_p.top_radius - atmosphere_p.bottom_radius))); + uv = float2(GetTextureCoordFromUnitRange(uv.x, MultiScatteringLUTRes), GetTextureCoordFromUnitRange(uv.y, MultiScatteringLUTRes)); + + return IrradianceSpectrumFromTexture(sample_texture(multiple_scattering_approx, uv)); +} + +struct SingleScatteringResult +{ + IrradianceSpectrum L; // Scattered light (luminance) + IrradianceSpectrum ray,mie,ms; + DimensionlessSpectrum Transmittance; // Transmittance in [0,1] (unitless) +}; + +INLINE SingleScatteringResult IntegrateScatteredLuminanceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) multiple_scattering_approx, + IN(Position) worldPos, IN(Direction) worldDir, Number shadow_offset,//only for shadows + float sampleCountIni, bool variableSampleCount, float2 rayMarchMinMaxSPP, + Length r, Number mu, Number nu, Number mu_s, + bool ray_intersects_ground,//RayIntersectsGround(atmosphere_p, r, mu) + float tMaxMax = 9000000.0f) +{ + SingleScatteringResult result; + result.L = result.ray = result.mie = result.ms = IrradianceSpectrum(0,0,0); + float start_distance = 0; + #if ORIGIN_CAN_BE_IN_SPACE + result.Transmittance = DimensionlessSpectrum(1,1,1); + //just skip distance befroe atmosphere. + //it is totally fine to render atmosphere from space without this defines on. + //it is just produces better quality in such case + if (r > atmosphere_p.top_radius) + { + Length rmu = r*mu; + Length distance_to_top_atmosphere_boundary = -rmu - + sqrt(rmu * rmu - r * r + atmosphere_p.top_radius * atmosphere_p.top_radius); + if (distance_to_top_atmosphere_boundary > 0.0 * meter) { + start_distance = distance_to_top_atmosphere_boundary; + } else { + // If the view ray does not intersect the atmosphere_p, simply return 0. + return result; + } + } + #endif + + // Compute next intersection with atmosphere or ground + float tMax = DistanceToNearestAtmosphereBoundary(atmosphere_p, r, mu, ray_intersects_ground) - start_distance; + tMax = min(tMax, tMaxMax); + + // Sample count + float sampleCount = sampleCountIni; + float sampleCountFloor = sampleCountIni-1; + float tMaxFloor = tMax; + if (variableSampleCount) + { + sampleCount = lerp(rayMarchMinMaxSPP.x, rayMarchMinMaxSPP.y, saturate(tMax*0.01)); + sampleCountFloor = floor(sampleCount); + tMaxFloor = tMax * sampleCountFloor / sampleCount; // rescale tMax to map to the last entire step segment. + } + // Phase functions + //const Number uniformPhase = 1.0 / (4.0 * PI); + Number RayleighPhaseValue = RayleighPhaseFunction(nu); + Number MiePhaseValue = RayleighPhaseValue*MiePhaseFunctionDivideByRayleighOptimized(atmosphere_p.mie_phase_consts, nu); + + // Ray march the atmosphere to integrate optical depth + IrradianceSpectrum L = IrradianceSpectrum(0.0f,0.0f,0.0f); + DimensionlessSpectrum throughput = DimensionlessSpectrum(1.0,1.0,1.0); + float t = 0.0f; + float tPrev = 0.0; + const float sampleSegmentT = 0.5f; + float invSampleCountFloor = 1.0f/sampleCountFloor; + Position curWorldPos = worldPos; + for (float s = 0.0f, e = sampleCount*invSampleCountFloor; s < e; s += invSampleCountFloor) + { + float dt; + if (variableSampleCount) + { + float t0 = s * s; + float t1 = s + invSampleCountFloor; + // Non linear distribution of sample within the range. + t1 = t1 * t1; + // Make t0 and t1 world space distances. + t0 = tMaxFloor * t0; + t1 = t1 > 1.0f ? tMax : tMaxFloor * t1; + t = t0 + (t1 - t0)*sampleSegmentT; + dt = t1 - t0; + } + else + { + float newT = tMax * saturate(s + sampleSegmentT*invSampleCountFloor); + dt = newT - t; + t = newT; + } + Length d = t + start_distance; + Length r_d = ClampRadius(atmosphere_p, SafeSqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d); + + G_UNUSED(curWorldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + Position curWorldPos = worldPos + (d + shadow_offset*dt) * worldDir; + float shadow = getShadow(curWorldPos, d, r_d, mu_s_d); +#endif + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, r_d-atmosphere_p.bottom_radius, curWorldPos); + + const float3 sampleOpticalDepth = medium.extinction * dt; + const float3 sampleTransmittance = exp(-sampleOpticalDepth); + + float3 transmittanceToSun = GetTransmittanceToSun( atmosphere_p, transmittance_texture, r_d, mu_s_d); + + + G_UNUSED(worldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + transmittanceToSun *= finalShadowFromShadowTerm(shadow); +#endif + float3 PhaseTimesScattering = medium.scatteringMie * MiePhaseValue + medium.scatteringRay * RayleighPhaseValue; + + // Dual scattering for multi scattering + + float3 multiScatteredLuminance = GetMultipleScattering(atmosphere_p, multiple_scattering_approx, r_d, mu_s_d); + + #if ORIGIN_CAN_BE_IN_SPACE && SHADOWMAP_ENABLED + multiScatteredLuminance *= shadow; + #endif + + float3 S = (transmittanceToSun * PhaseTimesScattering + multiScatteredLuminance * medium.scattering); + + // When using the power serie to accumulate all sattering order, serie r must be <1 for a serie to converge. + // Under extreme coefficient, MultiScatAs1 can grow larger and thus result in broken visuals. + // The way to fix that is to use a proper analytical integration as proposed in slide 28 of http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + // However, it is possible to disable as it can also work using simple power serie sum unroll up to 5th order. The rest of the orders has a really low contribution. + + // See slide 28 at http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + float3 Sint = (S - S * sampleTransmittance) / medium.extinction; // integrate along the current step segment + L += throughput * Sint; // accumulate and also take into account the transmittance from previous steps + + float3 rayS = medium.scatteringRay*transmittanceToSun; + float3 raySint = (rayS - rayS * sampleTransmittance) / medium.extinction; + result.ray += throughput * raySint; + + float3 mieS = medium.scatteringMie*transmittanceToSun; + float3 mieSint = (mieS - mieS * sampleTransmittance) / medium.extinction; + result.mie += throughput * mieSint; + + float3 msS = multiScatteredLuminance * medium.scattering; + float3 msSint = (msS - msS * sampleTransmittance) / medium.extinction; + result.ms += throughput * msSint; + + throughput = throughput*sampleTransmittance; + tPrev = t; + } + + result.L = L; + result.Transmittance = throughput; + return result; +} + +IrradianceSpectrum ComputeIndirectIrradianceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const int SAMPLE_COUNT = 8; + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + Number nu = dot(omega, omega_s); + SingleScatteringResult ss = IntegrateScatteredLuminanceMS( + atmosphere_p, + transmittance_texture, + ms_texture, + float3(0,0,0),float3(0,0,0),0,//shadows + 32, true, float2(16,16), + r, omega.z, nu, mu_s, + false); + result += ss.L * omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum ComputeIndirectIrradianceTextureMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + IN(vec2) frag_coord) +{ + Length r; + Number mu_s; + GetRMuSFromIrradianceTextureUv( + atmosphere_p, frag_coord / vec2(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT), r, mu_s); + //return ComputeIndirectIrradianceSingle(atmosphere_p, transmittance_texture, r, mu_s, 32, 32); + return ComputeIndirectIrradianceMS(atmosphere_p, + transmittance_texture, ms_texture, r, mu_s); +} + +#endif ZYW[YW]Z\]]\\^ٜ [j$̍ dj)hꋪJk*IhAa,ͭ dj)hꋪJk*Ih +$Aa$̍ J*i)*i苪Jk*I苨(ɩAa,ͭ J*i)*i苪Jk*I苨(ɩ$Aa..m dm$͍J*i)*i苪J* + DfAa..m dm$͍J*i)*i苪J ( +ĆfAa̍,ͬAa..m dm$͍dj(H*苪J諩k*I$FgAa..m dm$͍dj(H*苪J˩k*IgAa..m dm$͍$IJ*()i苪J* + ĆfAa..m dm$͍$IJ*()i苪J ( +$fAa..m dm$͍dj)h *)I+*˩)(Hj +f%l.-d$m$m Mn- ,ͭAa..m dm$͍dj)hꫩ* kj(H*+ +J dFfAa..m dm$͍dj)hꋩk*I +$&GfAa..m dm$͍dj)hꋩk*I $gAAa̍,lA8pC #+Jsc#+ +k{C++㢓 skK s+sAccK>#ifndef ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED +#define ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED 1 +/** + * Copyright (c) 2017 Eric Bruneton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * Precomputed Atmospheric Scattering + * Copyright (c) 2008 INRIA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atmosphere\atmosphere_params.hlsli" + +/* +

They use the following utility functions to avoid NaNs due to floating point +values slightly outside their theoretical bounds: +*/ +INLINE Number ClampCosine(Number mu) { + return clamp(mu, Number(-1.0), Number(1.0)); +} + +INLINE Length ClampDistance(Length d) { + return max(d, 0.0 * meter); +} + +INLINE Length ClampRadius(IN(AtmosphereParameters) atmosphere_p, Length r) { + return clamp(r, atmosphere_p.bottom_radius, atmosphere_p.top_radius); +} + +INLINE Length SafeSqrt(Area a) { + return sqrt(max(a, 0.0 * m2)); +} + +/* +

Transmittance

+ +

As the light travels from a point $\bp$ to a point $\bq$ in the atmosphere_p, +it is partially absorbed and scattered out of its initial direction because of +the air molecules and the aerosol particles. Thus, the light arriving at $\bq$ +is only a fraction of the light from $\bp$, and this fraction, which depends on +wavelength, is called the +transmittance. The +following sections describe how we compute it, how we store it in a precomputed +texture, and how we read it back. + +

Computation

+ +

For 3 aligned points $\bp$, $\bq$ and $\br$ inside the atmosphere_p, in this +order, the transmittance between $\bp$ and $\br$ is the product of the +transmittance between $\bp$ and $\bq$ and between $\bq$ and $\br$. In +particular, the transmittance between $\bp$ and $\bq$ is the transmittance +between $\bp$ and the nearest intersection $\bi$ of the half-line $[\bp,\bq)$ +with the top or bottom atmosphere_p boundary, divided by the transmittance between +$\bq$ and $\bi$ (or 0 if the segment $[\bp,\bq]$ intersects the ground): + + + + + + + + + + + + + + + + + + + + + + + + p + q + i + o + r + ?=cos(?) + x + z + + +

Also, the transmittance between $\bp$ and $\bq$ and between $\bq$ and $\bp$ +are the same. Thus, to compute the transmittance between arbitrary points, it +is sufficient to know the transmittance between a point $\bp$ in the atmosphere_p, +and points $\bi$ on the top atmosphere_p boundary. This transmittance depends on +only two parameters, which can be taken as the radius $r=\Vert\bo\bp\Vert$ and +the cosine of the "view zenith angle", +$\mu=\bo\bp\cdot\bp\bi/\Vert\bo\bp\Vert\Vert\bp\bi\Vert$. To compute it, we +first need to compute the length $\Vert\bp\bi\Vert$, and we need to know when +the segment $[\bp,\bi]$ intersects the ground. + +

Distance to the top atmosphere_p boundary
+ +

A point at distance $d$ from $\bp$ along $[\bp,\bi)$ has coordinates +$[d\sqrt{1-\mu^2}, r+d\mu]^\top$, whose squared norm is $d^2+2r\mu d+r^2$. +Thus, by definition of $\bi$, we have +$\Vert\bp\bi\Vert^2+2r\mu\Vert\bp\bi\Vert+r^2=r_{\mathrm{top}}^2$, +from which we deduce the length $\Vert\bp\bi\Vert$: +*/ + +INLINE Length DistanceToTopAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.top_radius * atmosphere_p.top_radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +INLINE Length DistanceToSomeAtmosphereBoundary(Length r, Number mu, Length radius) { + if (r > radius) + return 0; + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + radius * radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +/* +

We will also need, in the other sections, the distance to the bottom +atmosphere_p boundary, which can be computed in a similar way (this code assumes +that $[\bp,\bi)$ intersects the ground): +*/ + +INLINE Length DistanceToBottomAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return ClampDistance(-r * mu - SafeSqrt(discriminant)); +} + +//return -1 if no hit +INLINE Length DistanceToBottomAtmosphereBoundarySigned(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) +{ + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return mu < 0 && discriminant >= 0 ? (-r * mu - sqrt(discriminant)) : (-1 * meter); +} + +/* +

Intersections with the ground
+ +

The segment $[\bp,\bi]$ intersects the ground when +$d^2+2r\mu d+r^2=r_{\mathrm{bottom}}^2$ has a solution with $d \ge 0$. This +requires the discriminant $r^2(\mu^2-1)+r_{\mathrm{bottom}}^2$ to be positive, +from which we deduce the following function: +*/ + +INLINE bool RayIntersectsGround(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + return mu < 0.0 && r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius >= 0.0 * m2; +} + +/* +

Transmittance to the top atmosphere_p boundary
+ +

We can now compute the transmittance between $\bp$ and $\bi$. From its +definition and the +Beer-Lambert law, +this involves the integral of the number density of air molecules along the +segment $[\bp,\bi]$, as well as the integral of the number density of aerosols +and the integral of the number density of air molecules that absorb light +(e.g. ozone) - along the same segment. These 3 integrals have the same form and, +when the segment $[\bp,\bi]$ does not intersect the ground, they can be computed +numerically with the help of the following auxilliary function (using the trapezoidal rule): +*/ + +INLINE Number GetMieDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + //return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude));//todo: exp2 + return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude)) + +atmosphere_p.mie2_strength * saturate(exp(atmosphere_p.mie2_density_altitude_exp_term * max(0., altitude-atmosphere_p.mie2_altitude)));//todo: exp2 +} + +INLINE Number GetRayDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(exp(atmosphere_p.rayleigh_density_altitude_exp_term * altitude));//todo exp2 +} + +INLINE Number GetAbsDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(altitude < atmosphere_p.absorption_density_max_alt ? + atmosphere_p.absorption_density_linear_term0.x * altitude + atmosphere_p.absorption_density_linear_term0.y: + atmosphere_p.absorption_density_linear_term1.x * altitude + atmosphere_p.absorption_density_linear_term1.y); +} + +struct MediumSampleRGB +{ + DimensionlessSpectrum scattering; + DimensionlessSpectrum extinction; + + DimensionlessSpectrum scatteringMie; + DimensionlessSpectrum scatteringRay; +}; + +INLINE MediumSampleRGB SampleMediumFull(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos)//worldPos is for other volumetrics +{ + G_UNUSED(worldPos); + Number densityMie = GetMieDensity(atmosphere_p, altitude); + Number densityRay = GetRayDensity(atmosphere_p, altitude); + Number densityAbs = GetAbsDensity(atmosphere_p, altitude); + + MediumSampleRGB s; + + s.scatteringMie = densityMie * atmosphere_p.mie_scattering; + s.scatteringRay = densityRay * atmosphere_p.rayleigh_scattering; + s.extinction = densityMie * atmosphere_p.mie_extinction + s.scatteringRay + densityAbs * atmosphere_p.absorption_extinction; + DimensionlessSpectrum msScattering = DimensionlessSpectrum(0,0,0); + #if CUSTOM_SKIES_FOG + getSkiesCustomFog(s.scatteringMie, s.scatteringRay, msScattering, s.extinction, altitude, worldPos);//todo: add fixed phase fog + #endif + s.scattering = s.scatteringMie + s.scatteringRay + msScattering; + return s; +} + +INLINE void SampleMedium(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos, + OUT(DimensionlessSpectrum) scattering, OUT(DimensionlessSpectrum) extinction) +{ + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, altitude, worldPos); + scattering = medium.scattering; + extinction = medium.extinction; +} +/* +

With this function the transmittance between $\bp$ and $\bi$ is now easy to +compute (we continue to assume that the segment does not intersect the ground): +*/ + +INLINE DimensionlessSpectrum ComputeTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, Length r, Number mu, Length maxDist, int SAMPLE_COUNT, + IN(Position) worldPos, IN(Direction) worldDir//only for custom fog + ) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + + Length dist = min(maxDist, DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu)); + Length dx = dist / Number(SAMPLE_COUNT); + // Integration loop. + //generic loop, works for any medium + DimensionlessSpectrum sampleScattering, sampleExtinction; + SampleMedium(atmosphere_p, r - atmosphere_p.bottom_radius, worldPos, sampleScattering, sampleExtinction); + DimensionlessSpectrum extinction = sampleExtinction*0.5; + for (int i = 1; i < SAMPLE_COUNT; ++i) + { + Length d_i = Number(i) * dx; + // Distance between the current sample point and the planet center. + Length r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r); + SampleMedium(atmosphere_p, r_i - atmosphere_p.bottom_radius, worldPos + worldDir*d_i, sampleScattering, sampleExtinction); + extinction += sampleExtinction; + } + SampleMedium(atmosphere_p, sqrt(dist * dist + 2.0 * r * mu * dist + r * r) - atmosphere_p.bottom_radius, worldPos + worldDir*dist, + sampleScattering, sampleExtinction); + extinction += sampleExtinction*0.5; + return exp(-dx*extinction); +} + +/* +

Precomputation

+ +

The above function is quite costly to evaluate, and a lot of evaluations are +needed to compute single and multiple scattering. Fortunately this function +depends on only two parameters and is quite smooth, so we can precompute it in a +small 2D texture to optimize its evaluation. + +

For this we need a mapping between the function parameters $(r,\mu)$ and the +texture coordinates $(u,v)$, and vice-versa, because these parameters do not +have the same units and range of values. And even if it was the case, storing a +function $f$ from the $[0,1]$ interval in a texture of size $n$ would sample the +function at $0.5/n$, $1.5/n$, ... $(n-0.5)/n$, because texture samples are at +the center of texels. Therefore, this texture would only give us extrapolated +function values at the domain boundaries ($0$ and $1$). To avoid this we need +to store $f(0)$ at the center of texel 0 and $f(1)$ at the center of texel +$n-1$. This can be done with the following mapping from values $x$ in $[0,1]$ to +texture coordinates $u$ in $[0.5/n,1-0.5/n]$ - and its inverse: +*/ +#endif ZYW[Y[]\[[ [|Isc#+C #+"+3Ks+sAiPIsc#+C #+:c{ csAccKiPIsc#+sAccKiPIsc#+zc{ +KcKsAcciPIsc#+C #+:c{ csAccKiPIsc#+ k{C++{1sK{ssAccKiPIsc#+s ccJ;Ck +CsAccKiPhP!+3Ks+*J"jbJbJ*AIiP!+3Ks+i +zjrJbJ:BiP!+3Ks+i +zbJ:BiPhP!+3Ks+!r +jJbJ:BiP!+3Ks+a +j*bJ:BiP!+3Ks+!r +jJbJ:B* +b*JiPhP*s#+{jsKcJ;CkPkP1c{ { +#KiP1c{ {c{3b ;iP1c{ !K+K{s+ c+iP1c{ {ÓiP1c{ {ÓiP1c{ {ÓiP1c{ {*cz{K;Kscc +#KiPiPhP*s#+{cJ;CkPkP1c{ aK;Cz +#KiP1c{ aK;Czc{ r;c+ c+yy r;c+ c+K;sK{s Ks{s C #{KkP1c{ aK;C#J+K{s r;c+{23+iP1c{ +K" c+iPiPhP8bz +b22*BaJ;Czs33+K+;K+CIiPkP1c{ iiP1c{ 9c{kJsiP1c{ ++s{{+{{#iP1c{ {c#K+{iPiPhPhPxQz"z{B{{k+kP*ã+! + C{{k++ã+++;K+CIiP +kc+ +C{{k++ã++ kc+ ++;K+CIiPPyiPhPhPI3s#+3iJjP!+3Ks+iJAqɑɹəIiP)s#K3kPhPxQz"z{B{{k+kP@ c39+B{{k+ˣ*z{#CA c3aK;C#JcA c3!Kc1c{ {{kc{{c{ +KiPkPA c3K#+ CaK;C#JsKqiPA c3AaaIiPA c3AaaIiPA c31{ #q{k cK+C{CK#+caK;C#JKIiPK#+{CaK;C#Jc1{ #KiPI3*z +B*" +bj +Jr:jPA c3y C+# cj Ks;CA c3A!{CK#+c!KKa!{CaK;C#Jc!KKa!{C1{ #c!KKIa{{kc{ +KiP)c+kPA c3CK sA!{C1{ #c!KKa!{CK#+c!KKIiPA c3A c3ACKyAQiJJa {3 +A!{CaK;C#Jc!KKIyiJQ{{kKiP)s#K3kP+siPkPhP0c{ 9+B{{k+˳ +c+C1c{ aK;C"Kc1c{ !Kc1c{ {{kc{{c{ +#c1c{ +K"KiPkPA c39+B{{k+ˣ*z{#CaK;C"Kc!Kc{{kc{ +#KiP +rBjPI3A sCyCaIIIiP+siP1c{ C{{k++Û!b{#CiPC{{k++ã++ciPA c3Ac+K"cIIq;iP+s:zcJs+ 2 +CC{{k+sKqiPkPPyiPhP@ c3 c˃B{{k+Kr+sKC1c{ aK;Czzc##Jc1c{ aK;C#Jc1c{ +K"c1c{ +Û c+{ K{sc1c{ +s +s K{sKiPkP+s+s +s K{siPxyI3C{{k++ã++ qbbjPxyI3C{{k++ã++ qbbjPyy{{c{ +#+Û c+{ K{siPyy1c{ {{k C+Û c+{ K{sKiPyy +rBjPyyI3A+K"+s +s K{sqIiPyy+s+s +s K{siPyy+s9+B{{k+˳ +c+CaK;C#JcaK;Czzc##Jc{{kc{ +#c+K"KQ+s +s K{siPxy)c+kPkPhPhPxy1{kAyy # s+s+ cKk++s#+Ks;s{k{yC+{yq ;C"{;{Is#+sAkckPxyAyy # s+s+ cKk++s#+Ks;s{k{yC+{yq ;C"{;{q +;C#z;*C 2Js cs#3kP@ c3 cjK{C #{CA c3qzcbA c3 zJiPkP+sAA c3K +C CqzcJYA c3CqIQ{A zJiA c3CqIIiPkPhP0c{  Kj KC1c{ K;Cc1c{ c1c{ 1{ #KiPkP1c{  KK;CiP1c{  KiP1c{  K1{ #iP+s1c{ AiP Ksc Ksc KsciP Ksc Ksc KsciP Ksc Ksc KskPIiPkPhP0c{  s;+s{{c#C1c{ +c1c{  s;+sJiPkP1c{  C s;+srKq1c{ AaaI1c{ AaaIiP1c{  s;+sq{k cK+C{Cc s;+sJIiP1c{  s;+s{C s;+sb s;+sJiP+s s;+sQ+sY s;+sQ+sY s;+sQ+siPkPhP0c{ ++s{{C1c{ ++s{KiPkP+s++s{Q++s{{+{{#sY++s{{+{{#sѻiPkP H\ʸȸؘ\hH[YYZY\ڙ [HBU] [ݝX][\؛]K[܋ L KL[\ٗ]Wۛ]ٗX] Y[\Q]XY +[\\]\Q]X [HT\TYZHJ^[YݛH\\]\Q]X +HT\TYZN[\QݛH\]\]J H Yݛ +YݛHN\]\Qݛ +\QݛNH_B[YQ]XY +[\Q [HT\TYZHJ^[H][]]ڛHJ[\Q  LLJNH][]]ڛH\]\]J][]]ڛ +\Q]XY +\Q HT\TYZHJN\]H][]]ڛNH_[Y][Y +[ ۛ\[[^SUݛ [ [Q [[][X[ [[][ٓ\]J^ ȓZTU [[][X[HH  H[ + L  +\[H S]HJN [[][ٓ\HHS] +H[X[NB[H +[Q ۛ\[[^SUݛHN[H][]]ڛH\]\] +[][X[ +[][ٓ\HN \Z\\]ڛ[\]H][]]ڛ +H][]]ڛNH_BB H\YHHYț\Z]H]XYXZ[\YXK [H[țHZ\țH\YH TJ H  +\]YH[HJK T]YH[\Y[HH\ Y +ٛHZ\Y H\Y[HH] Y +ٛH\YZ \TY[TH\ +\]YH[H HH L +ٛHZ\Y H  + +L +H +ٛHYZ Z]H[X\Y[H[][[XZ\ٓQ +[Z] [\TY[THJ^[\Z]H\J H Z] +Z]HNB[H[][[XH N ]]]HHY\]][Zț\Y[ٛ\[[K Z\H Z\HZX]Z]\ +\TY[TH +K Z]H\ +\TY[TH +HH\HHL Z[]X\XXH[YHHZ] +Z]\TY[T\ HH\\]\] +Z]H +H]YKH +Z] +Z]\TY[THJ^H[][[XH\TY[T +\]\] +Z]HNH_H\Y^[H\J  \TY[TH H Y ћHYZ\Z[YH \[HHH  + +Z] \Z]HN[\Z]T]H\Z] +\J H H +H^NH[][[XH +Z] +HۜQ J^ +H  +\Z]T]H + +\TY[T +H]\Z]T] ^NH[][[XKTNH_\]H[ +H[][[X  YNB_B[H[][[XZ\Y][]]ڛ +[ ݛӛ\[ [ YS [[TYZ [\Q]J^ Z\H][]]ڛ[[Z]H[X + +ݛӛ\[ YS] + H KNN KNNN + [XH[HYX\Y U[Y\]ZțZ\[\]HZ\YXY H]H[H[Y]YX ZZKNNNYB[\STYZH[TYZ +[TYZN[\TY[THH[ +\STYZ \Q KNNNYN[H[][[XHH[][[XZ\ٓQ +Z] \TY[THN\]H[][[XNB_BB[H[][[XQZ][]]ڛ +[ ݛӛ\[ [ YS [ [[ӛ\[ [[TYZ [\Q]J^ QH][]]ڛ[[Z]H +ݛӛ\[ YS]N[\STYZH[TYZ +[TYZN [Z\YX\[\]Z[][\TY[TH\STYZ  +\STYZ +H[ +\STYZ \QHJN HS][X\]\] + +[[ӛ\[ H YS]J +X]H[ș[\K[H[][[XHH[][[XZ\ٓQ +Z] \TY[TH + +\]\] + +[[ӛ\[ H YS]JN\]H[][[XNB_B[[\\X[ ݛ [ Wٗ\YZ [ [Y\]ڛ [[][X[ [[][ٓ\ [ZY[[][]]ڛ [[ Y[S [[ [ []J^[ [HWٗ\YZݜ ^^ݛۜ ^N[YT[SH +[ [ [ []N[Q[SH\ + L +YT[S]NY[SH[ [Q[SN[HTTH +۝ +Wٗ\YZݜ]JNHY[[][]]ڛHYQ]XY +YT[S HTTHNY[[][]]ڛHY[[][]]ڛY][Y +H Y[S [Y\]ڛ [][X[ [][ٓ\]NB_BZH\YZ\ӛ\[[^]ڛ +[[ [[T^ [HHJ^ [\]Zۛ\[[^]ڛYݛܜK ]ZH\Z\ۛ\[[^]ڛ +ٛ[[H]\Y [[ۛ\[[^]ڛ[JZYH\]\] +[T^ [[NZۛ\QݛHH  +H +K +YHN\]ۛ\Qݛ +ۛ\QݛNB_BZ H\YZ\S +Z  Z  ZH Z[T^YJ^B H]\ZZ\KZ X]QHH  + T + +NHH X]Q +\]\] +[T^  +[X]Q\JLYM +HNBBB\] ^NB_BZ Z\Y\YS]]\]ڛ +Z  Z  Z  ZWZ Z[T^HJ^Z [UHZ + ^ H YNZ H\[ SNB[U٘ ^HH\YZ\S  WZ [T^YNB ӛ\[[^KZ[HH[ +[ +[U٘ ^H + HLYMN[U٘ ^K[NB H[Yۛ\[[^]ڛ[[U٘HH\YZ\ӛ\[[^]ڛ +[ [T^ WZHNB\][UNB_BBaDHd5FV&7Ǖ6VGVEffV7W%&Gf6ǖF$^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@x\|f@ʘP@f@ʆ@R@@@ʆv^^@@@@X@@@@@^^@Z@@@f@ʄP@f@ʆX@@X@@ެX@@ޘX@@ސ@R@@@r`@z@`\j@V@d@T@ސ@T@ސ@T@v@@@Ȭ@z@b@V@Pr`@Z@bR@T@jPb@Z@ެRv@@@Ș@z@b@V@Pr`@Z@bR@T@jPb@Z@ޘRv@@@ʆ@T@P@Ȭ@T@Ș@Rv^^@@@@X@@@@@^^@@@@X@@@@@ʄȌP@@X@@ެX@@ޘX@@ސ@R@@@@z@`\jv@@@@z@P`\hj@T@@Z@`\hnjR@T@@V@b\`v@@@r`@z@@V@d@T@ސ@T@ސ@T@v@@@Ȭ@z@b@V@Pr`@Z@bR@T@jPb@Z@ެRv@@@Ș@z@b@V@Pr`@Z@bR@T@jPb@Z@ޘRv@@@P@Ȭ@T@Ș@T@Rv^^@@@@X@@@@@f@ʄP@f@ʆX@@X@@ެX@@ޘX@@ސ@R@@@ʆ@T@ʄȌP@X@ެX@ޘX@ސRv^^@@@@X@@@@@@ʆ܌P@@X@@ެX@@ޘX@@ސX@@ސX@@ޤzbR@@^^@@@@ވ@X@@@^@@@@@@^^@@@@NN@@@@z@Tv@@@d@z@Tv@@@@z@P@Pb\`@^@bp\`R@T@dP@d@^@d@Z@b@R@Rv@@@`@z@ސ@V@jPb@Z@ސRv@@^^@@@@@@@@@@@@@\@@^^@@@@@@@@@@@@@^^@@@@@NڦN@X@@@@@@@@@^^@@@@@@@`\nj\@@^^@@@@@b\`@@@@@@\@@@@ڦ@z@`\njv@@@b@z@Pb\`@Z@ڦ@T@jPb\`@Z@ޘRR@T@Pb\`@Z@ڦ@T@jPb\`@Z@ެRRv@@^^@@P`R@@@b@@@@@@z@P@`X@bX@P@d\d@T@@Z@`\j@R@Rv@@^^@@@\@@@@z@P@Pfh\j@T@@Z@jr@R@T@@V@dh\j@R@T@ސ@T@dP@ZP@nf\d@T@@Z@db\dX@p\r@R@T@P@ސ@R@Rv@@^^@@@@@@@@@@Tz@ޤv@@@P@@V@@Rvf@ʆP@f@ʆX@@X@@ެX@@ޘX@@ސX@@ސX@@ޤzbR@@@ʆ@T@ʆ܌PX@ެX@ޘX@ސX@ސX@ޤRvf@ʞܜP@f@ʆX@@X@@ެX@@ޘX@@ސ@R@@@ޘ@z@d@T@ސ@Z@bv@@@@z@@T@v@@@d@z@@T@v@@@b@z@b@Z@`\j@T@d@TPd@V@`\ffRv@@@@z@ޘ@Z@ެ@T@ޘv@@@d@z@`\hj@T@d@T@Pd@V@`\`rR@T@P@@|z@`@~@@T@PPޘX@ެRR@t@`@Rv@@@ʆ@T@Pb@V@dRv@@^^@d@z@`\hj@T@d@T@Pd@V@`\`rR@T@@T@P@@|z@`@~@P@bX@ޘ@^@ެ@R@t@ޘ@Rv@@^^@ʆ@T@P@ޘ@T@b@V@d@Rv^^@@@@X@@@@@^^@@@@@^^@@@@@^^@@@@@@@@@@@@f@ʈ@P@f@X@f@X@@ȾX@@R@@@@z@b\`dfhb@T@@Z@b\jbbnhv@@@@z@Z`\jbbn`j@T@@V@`\njjplpv@@@@z@@PP@ȾT@@V@R@T@Rv@@^^@@@@@@@@@@@@@@@PX@X@@RvF6&r" 902941:227/1923494k2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVfRd%$Ed4Ԡ0BVfVRd%$Ed4ӠР0fFVfdՔ$ՠ0BVfVdՔ$R֠0RFf֠РҠRf'$EdԠҠРf&rVFUf'$Ed$'f–V&%VwV67ffҠנ&f"3"rTFGv&W762fBTG"67$ՠDGFBbFV'rBW&Ҡ26GfF2#sSRs###ҷӠ26GfF2C#SCCҷӠfF"–V&%VwV6722ӠfCҖ""R'Ғ"f""璷Ӡ"WFW'f&CCC"wӠנРf6Rf'$Ed'f62W6V&7&f–V&%VwV67ffҠנ&f"3"rTFGv&W762fBTG"67$ՠDGFBbFV'rBW&Ҡf&$rVFUf'$Ed$'–V&%VwV67fӠ"WFW'2W6V&7&$$䒗2FW'FWdՔ$2W6V&7&rӠנРРfRf'$Ed'VFƆf–V&%VwV67ffҠנ2V6Rf'$Ed'C"VwV67fҠ26Gf&2#sSҷӠ26Gf&2C#SҷӠf&"–V&%VwV6722Ӡ"WFW'Җ""R'Ғ"f""璷ӠנР0RFf֠AH!p͡qՑq}͡}ɥͱQ7<34:$''&! 6634929227<34:4479%#* 6634929243723) "/) *$/#242) "/) *$/#*72:1:172429/$2429/ &/$3:479297<06088707#)( *:6600098722220725730:006:17910829"270<*0272706:17& 14:=072$ ):7"230:99:30:4730:094730:<30:<30:9393<93989:39:1774974152980:764364970217971014222:9747,399/$:479297<06088707#)( *:66000987730:479:30:4730:<47479732:732:979/ &/$99::47929<29706088707#)( *:6600098772222"327:088707979:201027::177007)1:703$76)06 <30:0079:30:4730:<472:97<3093<<:7239/:7239/ &/274 k-Ln+m -L.L심,ͭlm-9 ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4( I]I}%9M}!I5( I]I}%9M}!I4(4(4(4(|!I]I}5Q15(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(4(L!I} =5A%1I}!1M14(L!I} =5A%1I}!1M1Ā4(5(4(AU}QIQ4(@%̸Ԙ5(@%̸Ԡ5(4(AM%1=94(T9%Q}a͠ĸ4(T9%Q}e͠ĸ4(T9%Q}i͠ĸ4(4( M}IYIM %QM4(LAIQ}M5A1I}= ) Q4(ՉՉ}ɕ}}ѕ}}ͽ}5(ՉɀՉ}ɕ}}ѕ}}ͽ}5(Չ̀Չ}ɕ}}ѕ}}ͽ}5(ՉрՉ}ɕ}}ѕ}}ͽ}5(4(ᕑ5(ᕑɀ4(ᕑ̀4(ᕑр4(4(с͠ссс4(5(ȕɹᡄᡈ4(5(с͠ссс4(5(ȕɹ4(5($9YI%9Qी5(4(с̀͠4(5(ȕɹ͠ీ䱀4(5(сѠсссс4(5(ȕɹᡴᡄᡈ4(5(сѠсссс4(5(ȕɹ4(5(4(@I %Mɕ͕5(LEIQ}MQीѡ̅Ʌѕ।4(XM}=UQ}A=M%Q%=9рLY}A=M%Q%=94(ЕɅٱ᱀奀LɅ|ͅхѕ٥局᱀4(Е٥L1ٕ|ͅхѕ٥局٥ܥ4(Е٥L1ٕ|ͅхѕ٥鱀٥ܥ4(Е U ٥L1ٕ|ͅхѕ٥鱀ٹܥ4(Е U Ʌ屽ٱL1ٕ|ͅхѕ٥ݱ4(Еɽ٥L|ͅхѕ٥彠٥ܥ4(Е٥L|ͅхѕ٥4(Е٥L|ͅхѕ٥4(Е U ٥L|ͅхѕ٥4(ЕɕѡɡЍѡɡ|ͅхѕЍ4(Еᕱэ=͕ѡЍͥ0͠Ѝͥ4(Еɕ=͕ѡЍͥL|ͅхѕЍͥ4(Еɕ1=͕ѡЍͥL1ٕ|ͅхѕЍͥ4(4( 15A} =II؅4(0==Alu5(T9I=11lչɽu5(I9 !lɅu5(1QQ9lѕu5(4(5AQe}MQIU QՍс5( 1I}U9UM}55 I5(HQUI9}5AQe}MQIU Q4($9%Q}5AQe}MQIU Q4(4( ]}UM}M I9}A=M5(Q}M I9}A=M}ͥ}5(Pa1Q !}%95(Pa1Q !}%94(4( ! -}QaQUI5( ! -}QaQUI}aAIЍ4( ! -}QaQUIIIe5( ! -}QaQUI5( ! -} UI4( ! -} UI}aAIЍ4( ! -}MQIU QUI} UI4( ! -}MQIU QUI} UI}aAIЍ4( ! -}MQ9 %15(рЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(̀Еᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(ɀЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(сЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(рЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(рЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ЕᕱэЍЕᕱэ ͕Ѝ|%1}|}1%9}}Ĥ4(4(р ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(̀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ɀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(с ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕ՙԥсЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕LՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕H]MՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5(ԥс ՙ ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5( ՙɡЍ ՙ ͕Ѝ|%1}|}1%9}}Ĥ4( ՙɠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4( ՙ͠Ѝ ՙ͕Ѝ|%1}|}1%9}}}}4( ՙѠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4(ؽѽɕ ՙ ͕H] ѕɕ ՙɁсЍԥс؅Օссс4( ! -} UI4(LѽɕЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥɀ؅Օссс4( ! -} UI4(LѽɕɠЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥ̀؅Օссс4( ! -} UI4(Lѽɕ͠Ѝ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥр؅Օссс4( ! -} UI4(LѽɕѠЍ؅Օ4(5(ѽɕ ՙɡЍ؅Օѽɕ ՙ ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙɠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}}}4(ѽɕ ՙ͠Ѝ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙѠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(Սɕ ՙѡЍmեѡ ! -}MQIU QUI} UI}aAIЍЍt5(ՙѡЍmեѡ ! -} UI}aAIЍЍt5(ЕɕѡЍmɠ ! -}QaQUI}aAIЍЍt5(5(4(ԥсѕэ ͕PɕԥɀЍссс4(4( ! -}MQ9 %14(ȕɹmэu4(5(ѕэЍѕэ ͕Ѝ|%1}|}1%9}}}}4(4(L!I} =5A%1I}!1M14(̕ѡ而5(ɡ5(5(4(̀͸ѕɡ̀؅4(5( 1}AI %M%=95(ȕɹ؅и4(͕5(ȕɹ̕ѡ͙ѕѡ؅؅᱀؅͠4(5(5(4(m^Fp͡qՑqɹͱ7<34:$''&! 6634929227<34:4479%#* 6634929243723/!)"'242/!)"'41:243/192349441:29:0/192349441:227/192349443272242$#/&")*242$#'"/ )242$#/*),242$#/*)/$""242$#! '43723!)"/$#242!)"/$#"$#/*)/$"$#'"/ $#/*)$#'"/ $#/*)$#/&")274172:9:4:77:17242)//!$''242)// ''242)/#,43723!)")/242!)")/")/#2742:10:207779904242)&($*242)/ ''242)""'242))$%242)$*#,242)$*')" ""242)$*')" " ((',43723!)")242!)")#)$*')" "274#92242)//'"242)/)$%242)//#)"&43723!)")/242!)")/#)/)$274)243723)")* 242)")* )27430!)"/432304377930:40934930:7+30:7&30:743!)"/$#"$#/&")2:97432629:43779243!)"/$#"$#'"/ 2:9743'2709437794093497+7&7$243!)"/$#"$#/*)2:97432:9<437794093497+7&7$243!)"/$#"$#/*)/$"2:97432:9<422437794093497+7&7$243!)"/$#"$#! 297906643227:!)"/4324:472:9727430!)"/432304377930:40934930:7+30:7&30:7$30:743!)"/$#"$#/&")2:97432629:43779243!)"/$#"$#'"/ 2:9743'2709437794093497+7&7$243!)"/$#"$#/*)2:97432:9<437794093497+7&7$243!)"/$#"$#/*)/$"2:97432:9<422437794093497+7&7$243!)"/$#"$#! 2:9743!07437794093494093497+7&7$727430:!)"/9:4:7730:3068030:743!)")/")//!$'2:979:4:77!477306807$243!)")/")// '2:979:4:77077306807$243!)")/")/#2:979:4:7#,306807$2749#7&730:!)"2:1444<30:3068030:7+30:7&30:743!)")#)&($2:972:684:243!)")#)/ '2:972:<0777+7&243!)")#)""2:972:2277$243!)")#))$2:972:145306807+7&243!)")#)$*#2:972:4:4306807+7&243!)")#)$*')" "2:972:4:792022306807+7&243!)")#)$*')" " (('2:972:4:79202 887<306807+7&27430!)"/3926309:077930:743!)")/#2:973926729:0779243!)")/#2:973921459:07797$243!)")/#2:973926#9269:07797$27430!)"9:0930:3068030:7+30:7&30:7$30:7$06392):23:406927730:"!)"/9:4:7730680730:#!)"2:1444<306807+7&730:6:"2:97:6364::8;39:42;7727:80:/774/39:4//81/;823740627702347730:6:)17730:0:02/'7:+30:'30:30682:970:02;0:02/'7:+'2<8306803068040934940934306804093494093406907092!)"//'&30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06706309277930::09243)* / !""!)"/$#"$#/&")2:97432629:24377230$7042;34:430:7$0:027:70630:7$0:027:;06432!)"/4322437794093497+7&743)* / !"309:09!)"9:09306807+7&7$7$:092<92779:0):23:30#!)"/39269:077972:97432#9:022:974327427406907092!)"#30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06706309277930::0922:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;70692779:092706907092!)"//'&30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06702:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;7063006907092!)"#30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06702:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;706307''*4<720724:47:2909979268229:4:7#,479:0/19234947:222447:44949>494949>494949>494949<###>49<####4949<###>49<####2:97430:29<47:447:79:30:3130:79:30:"22242:9730:"30679068#,30:"30:079:30:84$"79:30:9*2089:"0"79:30:47*2089:9*209*230$<47*2098$<47*20478$=9*22:9730:#,30:030:779:30:27$077$2:970$230:67902(2#,30:9*2030:02:979*20#,09*230:):09(2330:7$30:030:72:9767902(2#,7$00<7$30:40230772:977:77930274 k-Ln+mk-LM,m- ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(L!I}1= 1}!1M15(L!I}1= 1}!1M14(4(Ցɑ݅ɕ}͹ͱ4(4(сɠсɕɹ5(сѠсɕɹɠ5(с᠘сɕɹѠ5(ɀ|ٕɠɀɕɹ5(̀|ٕ̀͠ɕɹ5(р|ٕѠрɕɹ5(4(ɀɠɀɕɹ5(̀ɠ̀ɕɹ5(рɠрɕɹ5(рѠрɕɹɠ5(р᠘рɕɹѠ5(рؠрɕɹ᠄5(сՠс왱с؁􀄩ةȕɹة5(4(ɠɕɹ5(Ѡɕɹɠ5(ՠ졅􄩄퀄ѨȕɹѨ5(4(сAݡс`сdȕɹݡᡄ͡`Ęd5(4(̀PQ]ɱ̀ر̀P 94(5(ȕɹձP 9إ4(5(4(̀Q 9̀84(5(̀P 94(4(̀Pɽ͡8T9%Q}e4(P􀰕ɽ͡8T9%Q}aPѕAM%1=9ѡPP4(P􀸽ɵ镡P4(4(с̀􀸽ɵ镡ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(̀Q 9̀8̀P4(5(P􀸽ɵ镡PѡP884(с̀ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(сɥ}願сȅѡɀ}ѡ4(5(ȕɹȍ}ѡ}ѡ䁨ȅѡ4(5(4(mjFX.\shaders\include\specular_brdf.hlsli d .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$̍ d +h)HKH iAa,ͭ d +h)HKH i $AAa$m g-LM,m-ͧAA)mL,ldl-LHHFI*H*mNŨA*mFI*AAa$̍ $)+IAa,ͭ $)+I +Aa̍,ͬAAdK- $&D鍬m - Ďl. Md Ld.ύl.M .mNlNA-,mN.M.M- Č- + -Č- $AaAČ-M + - D + -lAČ-M$M$fADN Mf%&Dd-  MFE$e,.m. D,* - $͍̍.--- nM$m,. D,*AAAdKll- $&fD + dn,L. lN-̭.m .̮lL D dN,llNA-,mN.M.Mll- Č- + -Č- $AaAČ-M + - D + -lAČ- I D iADN  I$&MD I&$MD ID I$e,.m. D,* - $͍̍.--- nM$m,. D,*AAA JNL.쬬E,NA-,mN.M. Č- + -Č- $AaAČ-$ -L + - D + -lAČ-  D$ -L $D d$f'D-ADN $ -L- %L $e,.m. D,* - $͍̍.--- nM$m,. D,*AAA$-mN .m (mέ,A-,mN.M.+-m Č- + - Č- + -,Č- Č-nČ-nČ-n$ $AaAČ-  $eAČ-$ $ $eAČ-  I N + - +d$ I% N + -,+d I iADN $- % + - K + -, DL $e,.m. D,* - $͍̍.--- nM$m,. D,*AAA%h-m -ͭAnNe-Ln.mLM NlneE&&ee-,A-,mN.M.m Ō- + -Č- )AaAČ-DN + - D + -lAČ-dmN  D iAČ-d.M $dmNmAČ-d.͍ d.M Dd.MmADN e.͍ dD emN e.M DDN&%%%dDDN&Dd.͍-e,.m. D,* $m䭭-AAA-쭭N./ -m,%AaADN EfAAA-쭭N.ϩ- Č-͊Č- $AaADN Dn D- 鍉 +$d%&eAAA-쭭N.omMN.m Ō- Č-鍉Č-͊Č- Č- + -,AaAČ-ĉ썎k- - 鍉&eAČ-ĉk- - ͊&eAČ- ˊ DF  iADN - -  ˊ Dĉk-  ˊ Dĉ썎k- ,$&eAAAdk D&D$-mL,lD,l d dl-L- DL 퍬 . $ M.m d. -LA-쭭N.o Č- $AaADN Dn D D $eAAA-쭭N.oj -ml Č- + -Č-͊Č- $AaAČ-d N + - $DƥfAČ-쭭N.oj -ml + +D%d-ddmAČ-쭭N.oj -ml  D%d-ddmADN E쭭N.oj -ml +D쭭N.oj -ml $eAAAd- L MA-쭭N.o- Č- + -Č-͊Č- $AaAČ-$LN + - $eAAČ-쭭N.o- + +dd.N +D + +D$L&d$L$eAČ-쭭N.o-  dd.N D  D$L&d$L$eADN Dn 쭭N.o- +D쭭N.o- $eAAA$ /-. dMN- d- L M,NA-쭭N.o-mMN- Č- + -Č-͊Č- $AaAČ-$LN + - $eAČ-쭭N.o- + Dd.NJ + +D$L&d$L$eAČ-쭭N.o-  +Dd.NI  D$L&d$L$eAŌ-$  + -lAŌ-쭭N.o- + D +D$$ $d$ $eAŌ-쭭N.o-  +D D$$ $d$ $eADN ƥDDn 쭭N.o- +d쭭N.o- $%eAAA$ /-. D-͍d- L MAd ,ND&DʍLn.̍,  )ln-e +-. Ĩm. $ )mL,lE(l DHhNA-쭭N.o-mMN-,N Č- + -Č-͊Č- $AaAČ-쭭N.o- + D +D$ + - $d + - $eAČ-쭭N.o-  +D D$ + - $d + - $eADN ƥDDn 쭭N.o- +d쭭N.o- $eAAA%h-m -ͭAnNe-Ln.mLM NlneE&&ee-,A-쭭N.o Ō-͊Č-)AaADN $Di + D*%eAAA-nLlέͭ Č-ndl-LnM$AaADN dl-LnMnAAA-nLlέmj -ml Č-ndl-LnMČ- $AaAČ-h $ $eAA$-- ln- D$m-o.m,-$ mn.M $̍ $m$m, dm.L D d-.ADN d.N. $)+I +Ddl-LnM $Dh d%h,Ddl-LnMnAAAA-nkj -mlM ͭlnŌ-nČ- Č-D ͭln.AaAdmČ-h % )eAČ-$N $D ͭlnnADN d- Ō-n%N $N $N -&&DhlAAA-nLlέHlέ Č-ndl-LnMČ- $AaAČ-nd +l-LnMn*Nd.Nd- Č-n&Č-n%'%'%''dl-LnM$$eAČ-n $dd +l-LnMn*N$$d +l-LnMn*N$eAČ-n d.NM d I $$eADN ƥDNˮll  ) d )$D$dNˮlll )E $& )E d$&$$eAAA-n䬌N M̌l.ͪl Ō-nDČ-nM-Č- + -,% - N-ͭ,LK ͭln.AaADN LM-D% + -,Dd.N% + -,d + - $$eAAAa̍,ͬAa#9s r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplus A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰH&a"&c"&dR&fr& !Md04a +ps0ɛɆAMbC'4)9 $φNLY}AͥѥMe@,5 h6,jb'w'y'i'j'OLY}QɝMg0$ ɝII艚IlDe'l(ʠ#fB&v2V7%Fllvm.module.flagsS0*llvm.identSD2V'7V2FWF77EJx9iiD2V'7VBVfV67%j̽ɍ9M z[XKܔLؕͥM Ԥ ]]ܔM̡5M ޤ ]\Y]]ڛܔ@Nإ%MхѕM K\[ܔTyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq @ D@8ӿ 1I#Y@5\DJM5ma A,4@TE@50F # ``P  +# ``P„0b U< L# ``P(„STAT`#DXILtBC!  #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@I 2" d""ㄡL L(#%90#@f3CE6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C<d 2L &GC(2(R((B(ʱ yZLFD oM $Efe%&,f&gl&eCLa0   @l `@,ˆ0 J3AH CLk- n n˔\]ڛH&! &2A !MTe qɔUYh&C1A mXmڪk| Hs 9 €l ƀ ٵM *dx.versionS ]]ܔC2FV&FV6%@*хѥM :dx.viewIdStateSK\[ܔ ṌչѕM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq @ D@8ӿ 1I#Y@5\DJM5mILDN,$d8a030ef6274d7a56befb6764b9bb5f7.pdbHASHؠ0btץkvKDXIL`&DXILBC!  #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@I 2" d""ㄡL L(#%90#@f3CE6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C<d 2L &GC(b( *2( yGLFD oM $Efe%&,f&gl&eCLa0  a0(MbÀ$!i6AH՝}}}qzKK{s H6P&IJa!(a"(`CP1 +;+ a0&ñAȴ qAD Amn`uq<fFVF7%ؕͥM &dx.valverSZY\Y۔ CbVvD6EFW6%XṔAM <yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq @ D@8ӿ 1I#Y@5\DJM5ma A,4@TE@50F # ``H!A RA0b T@ $!DXBCMy,}Il+ DTL# $($SFI0ISG1XHQPOSITIONCOLOROSG1\HTSV_PositionCOLORPSV04 POSITIONCOLORCOLORVSMainD +DDD @ILDB<`DXIL$BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L .2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $4-P/M%L>44SL2pi0|vYh* +"B +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q P%QA$F + 3g <ySLFďLK̍LL-ͭk-Lmm=271 30:Bvector X12@ E ¢%`0[",Z`@o4h ( E <¢%`0q element@Jؔ}չqHscdPVp@Ya&A` @BX l4X@M}%9q{['Xdam4a \dl@ &A JrZ'@i04@ @6fp `*@ ` &@A[  79:002ConstantDatalȬԈpj K1c{ ca:]H #;]H `8|,bE0P_14aх ×L"h@Xt!0%#?]H b8|,bE0_24aх <L"hHAXt!05#S]H d8|,bE0P_34Qaх \M"hXAXt!0E#W]H f8|,bE0_44aх |`Tw{ +P + + + Dk΍nZA-X7:7i`]pas ,B`,bK`4q  zc{[M/8l  ^I00H"0p?ConstData@SB_SceneBuffer@@3UConstantData@@B@%60 a &†.L ĪLn.m`pQ"*;Ir3{*K{s ɆA6Oj$m Dd-L,ͭlMAAaNndm.̍(.AaAČ-M*JMmAČ-dMnAoAAa*kkHȨH +ej̭L̬L.DD,mLE &AaAdm.̍(. dm(.lAoAAaNnj+ɩAaAČ-mDi** fAČ-d DdI +fAoAAaNnj+ɩAaAČ-mDd i**iAČ-d DdIjAoAAj+ j), j+ $ $AaAj+ 䭎j+)fAA䭎m em(.M*JMČ-% m/O$,%eA䭎e $ emAADN 䭎nAAA-j), j+ $ $Dd*LAaAČ-d $ emADN dmAAaρH)J.k. lkṋL(lŅŅ,ͭkM퍬lK̍L+m-k-Lnk-L,ͭln ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(4(Ʌ5(4(4(5(5(̍5(5(Ёѕ̥̍С̡͕́́Ɂ5(5(5(4(4( 1M14(4( U } } =U9Q4( M}9Y} U 5AM} 1= -}M%i4( U 5A}9Y} }M%i4($II%9 }5A} }M%i4(H1 Q%=9}5A} }M%i4(H1 Q%=9}5A}5%A} =U9Q4(4(8U}5a}M-%99%9} =9M} =U9Q4(4(L!%9}9=I514(L!%9}5%MM%Y4(4a}5%MM%=9и5(4(1= 1} UI}AI%a }5(LeMQ5} UI}AI%aL }5(4(|}5(4( 偈4(4(LQI%9%e}%5A1ी5(LQI%9%eीLQI%9%e}%5A14(4(̡}5(5(ѕɁѱɥ}٥݁ ՙAɕLQI%9%e1= 1} UI}AI%a4(ѕɁѱɥ}٥݁Lѕ ՙAɕLQI%9%eLeMQ5} UI}AI%a4(4( ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡ ՙAɕ4(5(4(Mѕ ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡLѕ ՙAɕ4(5(5(4(͕|}5(4( 1M1偈4(4( =9 Q}ɕ᱀ɕፌ5( =9 Qɕ᱀ =9 Q}ɕ᱀4(4(1= 1} UIՙɁ =9 Q1= 1} UI}AI%a4(LeMQ5} UIՙɁ =9 QLeMQ5} UI}AI%a4(4(|}m6" +-T4l`($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +k2=ԃ=܃=C>>Le,~ l$(Mf #n3%55VV&TgfV&7A@ ?I?I@@J-0\9Lg@s` up m0F&Z%6 '11Aش H:$hbC+!3Q Ml pbq 4D4AH BBmaTuh ?DOOD??DXzbz Abc>>`>Q0 .SV_PositionڰZDZXXO!6,0=?eAP 0E[ +6B%outputD. `H: u' XэKi4u#0XG= +`0AuH#0fB&v2V7% Fllvm.module.flagsSsP*llvm.identSuD2V'7V2FWF77EhxhD2V'7VBVfV67%j̽ɍ9M [XKܔ`ؕͥM ]]ܔ$̡5M F \[Xܔ %*хѥMj'إ%MхѕM tK\[ܔ-yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa `A,DFW)]Q*#0  &L4 i0A8`p` A +&+LX# ``}iUm$BIƄ0b `Ì-m$R`q1c@hU#`P ?A (f^!3V0b `Ì-m$rbyS2c@hU#`P?A (h0g)3V0b @Ä0b JL#`P?L# `AAT̄0b @Ä0b Ä0b Ä0b Ä0b Ä0b  Ì-mA "3m&0 h L 0aAQhBL B0a& „0@  Ds`Io0a&0 h L 0aA5hBL B0a& „0@ M|f Oj`@ > +& A0 +0,83ag1@)@ڂ `@ &QHg & L}0F `*6`1@ :qc `@ Tl `@ &Uj : Ì-m A ,?A9?L#`Pt PÄ0b ,@a?0a A 3?A??L#`Pt Ä0b +ȁ)B43D0m$ +r` +Ʉ0b +ȁ)A 0 ` +{L# `)L# `)L# `)AL# `)L8c@A@8T|&06d|&0Դ  umNgmKgnJgCnGgnFgo%@4FB@STAT`DXILlBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L +2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #CGsɗ&si& ^v8ҴCM>@4FNrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P PPPPQF$F + 3RyP yLFD oM $Efe%&,f&gl&eCLc@  l d)22:32 l@e!6`pelȬ&2A 4I p6 H$Qa],&3A Uumӆ 1zs# + @ _El0PPA6 `CPa `q4a5Fi**iPP TֆX6h7h 6COLOR" Tsa `x `ue m..mP\ 7 ڀ&a `x `{a>6c}4&"mnn@L4ξh̥}m@BAF"PfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%p*хѥM إ%MхѕM РK\[ܔṌչѕM HyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$7259eca340479df7b51f1174ded22849.pdbHASHrY@Gt(IDXIL`DXILlBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L +2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #CGsɗ&si& ^v8ҴCM>@4FNrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePA$F + y@yXLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, A !p6Da5Fi**iP8 `6ڶa!*®!#.ӓh6ڷa<®!.0 tae m..mPDb ,2!#.0 ҆e 3!.0 l DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+44SLrƗ4-Pn?+ QEAD(дrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q *P%Q(PJbʠ=@|X<y`LFďLK̍LLlk-Lmm=271 30:Bvector X12@ E %`0["0Z`@o4h ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A` @B` l4X@M}%9q{['Xdam4a \dl@ &A Pj*BJrZ'Dh!0I0H `i0AU tpl؀ЛQ]7907:006WorldViewProjDhh8ɥ񘱽ѱаpYL.$`pYML.$``0bf1@s ( E B`K&f4{ 0pYML.$``1df1@ h /E ЄB`k&f4 0pYM)L.$``2ff1@s +  E ФB`.&f4 0pYM+L.$``3hf1@ +  /E ĂB`>;=?Q S@U`WY`"v5VF7[ݴ[ T 0 9!0Y\18pPɅ͙ɵ-b#tۛ"h|A8a 06 0 7 16zs# + +s+33+zs s# + ڶ 0! QO@@@pmP0A@6Dwarf Versions@QXHU\ڛI6 !V#include "shader_defines.h" + +struct ConstantData +{ + float4x4 WorldViewProj; + float4x4 Transform; + float4 Color; +}; + +SYSTEM_CBUFFER(SceneBuffer) : register(b0) +{ + ConstantData ConstData; +}; + +struct VS_MESH_IN +{ + float4 pos : POSITION0; +}; + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 col : COLOR; +}; + + +PS_IN VSMain( VS_MESH_IN input ) +{ + PS_IN output = (PS_IN)0; + + output.pos = mul(ConstData.WorldViewProj, mul(ConstData.Transform, float4(input.pos.xyz, 1.0f))); + output.col = ConstData.Color; + + return output; +} + +float4 PSMain( PS_IN input ) : SV_Target +{ + float4 col = input.col; + return col; +} +xD:\NauPrototype\samples\sceneBase\..\..\engine\core\modules\render\include\nau\shaders\shader_defines.htd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAAaN.- mAAEA-l.l -AaA-l.l dṋAdA-l ĭl -l.l -NGgṋ,d.m -m, $mn D,d-Ld .LAAAAAAd譭 ehe$̍ i)DmlͥAAa,ͭ dJ(hkʉ +ĦAa,ͭ dhkJ)jKihk*IAa,ͭ dJ)(hk*I$FAa,ͭ $IJ*()i)(hk*I$FAa,ͭ DȈh*)(hk*I&FAa,ͭ DȈh*)) kʉ +$AAa,ͭ ))kj))Kɩhkʉ +$FAAa,ͭ d +)(I) Aa,ͭ d +)(諨)ij*ɪdAa,ͭ )뫨)ij* ƬAAa,ͭ I(KȨH J( HAa,ͭ d*kKȨH J( dJAAa$͌ k nnAAdhe͍-DmlͥAAa,ͭ dJ*((+ /dAa,ͭ dJ*(( /dJ*((+ /AA-l.l -NGg-L,ͭlAaAdm N,lMGgN..M,M̬LJ, dJ*(( I(KȨH J( +eAdm N,lMGgN..d*oM̬LJ, dJ*(( e*kKȨH J( +eAA$͍-ͭ D $mM,M̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. M,M̬LJ, /eAAA$͍-ͭ D $mn*oM̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. e*oM̬LJ, /eAAAAam k nnAAi͍-DmlͥAAa,ͭ di( N, -,N, od-Aa,ͭ di( +N, -,di( N, -,AAa,ͭ I(kHȨH +-,dL̬Ldi( +I(KȨH J( -,Aa,ͭ d*kkHȨH +-,dL̬Ldi( +e*kKȨH J( -,AAa̍, k nnn!(Qha7eC%ZYK[YmH)J.e. leṋL(l,ͭeM퍬lE̍L%m-e-LnCV62/23-WXz!aa(d ?Lf!Ann4  p)22:32 l@$NPT hچa<ڀCK?KLhBp-1/1A@ I:̄K%`B&hbmpu JĆX&l'6 @06=Ai**iP!6    )/47 BrMiia P COLOR۰[EXE[XCXa-b`ol(֠XэKa64u#0XG= +`0A2outputD/ `' @O# 0XG=`z< ] ؙXݔٵձMaٵM ء[X؛][X YY[ܔ`E2V'7VfVV6%:dx.source.argsS~BbW&76%&dx.valverSC2FV&FV6% 2dx.resourcesSDBWFF67ECbVvD6EFW6%:dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa A,DFWٕ @Q*#0  &L4 0A8apሇ 1&G=L{# ``l[0c@l# `pTL#`PA?L# `AtaL#`PA˽?L# `x^tL#`PA ?L#`P? Dfc0c@|}hBL B0a& „0@  Dk$΄0hL 0a&Ä0bp PL 0a&00h1L#`A60hL 0a&Ä`%{6F `0x`1@i` :Y|& A0 -0F `2p`@΄`' `@ &Q@ & A0F! /0,h3a70F `26 0F `:6 0,3aA +n0c@|`hBL B0a& „0@  D0m +hBL B0a& „0@  Dr hBL B0a& „0@  Dw@ hBL B0a& „0@ Ma 1@H `@ _(e & A0,0*L#`0*HbL#`0C*8_0a Dp`Yg1@X2`1@Z!`1@ \`0 3a A0a @A0a A0a Ap?Ђ? -Ä0b E<@ z?0a Am?Ђx?L#`,9`0 -Ì-l&#`PЃC3D003pl AQn?y?h1`0b = ?0c@t #`P C.Ä0b = ?0a$C Ҍ! # `Ѓ-;̂3a$C ʄ0b  =;8A 0` @L# `Ѓ-;0a$C „0b  =B;8bP%G|&0XPFf|&0Ե mLgCےPd|&0Ի 5opgmDgMې`d|&0ط 6nogmmgnlgCnkgnignhgoggCo&@4FB@STAT`DXILxBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L +2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #CGsɗ&si& Gsgب "\i@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P *PPPPQQA$F + 32yyLFD oM $Efe%&,f&gl&eCLc@  l d)22:32 l@e!6`pmlȬ&2A 4I p6 H$Qa]L&ijA24b1&7A m@˛6 }c26GGF@Ġ"6l( € &0gp40 f 47"POSITIONš ׆ 6, r@l˔\]ڛ&A`BA '' BmX=x8>`< Al < 30 1Hs /62sig_stڀ()Be +Pͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJT"s˃+ rs{ K{s"A!sK+K" +A2<27:<47)t!s{s+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$a4da4621879752b2085a476044f4f273.pdbHASHF!RZG`DsDXILp`DXILXBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L +2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #CGsɗ&si& Gsgب "\i@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@ 2L &GC"%0PPePA$F + yyULFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, A !p6Da5Fi**iP8 `6ڶa!*®!#.nCqzKK{s h6ZlX,2COLORBڰ d`]X pa `(4*llvm.identS +]\ڛ۔hBbfW&7%0̡5M 2dx.resourcesS]Z]]]ٔ CRF'F77%@yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@ma A,DJfJ# ` es]A ށa1b Ƈdq$=Ȉ 4C( 0  0@ #`АA@ 0  0@ #`ФhB&h &È 4nMe0 B00 `%A0x@ +1@` 蘵g@ ;0i F 3p:}1@gԠA0x` /qc A0x 1F 7 Έ 4h 0  0@ #`РBA)&h& h1A +z u0 B00 0bp ,hB&h &Ma A0xn/1@NaقA0xr,0 3b .$ < +  pei A0x~*3F W 1@'`6ψ < #`,Pg SA0bp 9+hB&h &ÈA   $0 ΈA  $ ƈA  @$0 ÈA   $ DXBCӏG`F;>* ! DTSFI0ISG1\HTSV_PositionCOLOROSG14(@SV_TargetPSV04COLORPSMainDDDILDB`DXILBC! ~ #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L<#%9P( PRCDb"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@ 2L &GCB(2((,2("(y(LFďLK̍LLlk-Lmm=271 47float4xX@h|0c{ cdAfS `F`6 "h0PwfS a6KD< )c+k+s{sF0(&1࠺ M 0 4`Xj+ɉ"h<$col$$`$: 7 2( 0@06gdm(.Л]Q]7962;(75"float4x4xX@hX@h|8|,b 0`8|,b00_13 W "h@`hA0%;ZP @b8|,b0_23 4× "h@`hA05?ZP @d8|,b00_33 T "hHA`hA0ESZP @f8|,b0_43Q t "hXA`hA0AAAAA(B)B*B+0{{sVp +dk΍nZA,\؆YB +,bhX/L1@s B`BbMn4 `[]d  x` хM }M ՙT хх m[pH_^¨'  4 09327 8FL $ ĪLn.mq(s T41:2902/24949:1:7907:030:<7962;(730:<*09730:77)!*#")22:3292917907:0079:09:1:)$30:9$''9:1:$30:9)/$'30:76''$'47)$'47::$'::::$::::9:679:007962;(75:679:00*097630:47::9<=::::7679:00772:97:::30:47$'47::)/0230:7647::72:977 B<".:(77<2689222..242727:9.272941:2.:9029902/2494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠРР0'v6V֠РҠV66VVננV66V27VV֠נBvBVV6GWFV66VV37VV26VB6bV6R7WF"2FV&2V&נננҠР22F4Ŕ"6ҠР0BVfV2T%Te4T5TDbӠ0BVfV24Ud5T%T5%45UӠ0BVfV2T%TUde4T5U#CӠ0BVfV$%D4Te4T5U#Ӡ0BVfV"UdT4De4T5UR#Ӡ0BVfV"UdT4DՔ5TDӠР0BVfVT5t%T45TD#ӠР0BVfV2Dt$Ӡ0BVfV2DtUԔ45dU2Ӡ0BVfVUԔ45Bc֠Р0BVfVr$%TedT$%Udr$ՠ0BVfV25EU%TedT$%Ud2%ՠР0fFVf5V7V7נР2Ɩ"6ҠР0BVfV2E%tdń2נ0BVfV2E%td2E%tdńҠРV66VV3FV&EVfV6ננ26GW'R6GǦ3G'veVvr&&TgfV&%Wf2E%tdr$%TedT$%UdӠ26GW'R6GǦ3G'veVv27GW&TgfV&%Wf2E%td25EU%TedT$%UdӠРƖV"6w&&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uFr&&TgfV&%WfӠנРƖV"677GW&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uF27GW&TgfV&%WfӠננР0R6W5V7V7נР4Ɩ"6ҠР0BVfV24D'WfV'Wf72V֠0BVfV24D'WfV24D'WfVҠР0BVfVr$5$TedT$V2&VgfV&24Dr$%TedT$%UdVҠ0BVfV25EU5$TedT$V2&VgfV&24D25EU%TedT$%UdVҠР0RFf5V7V7AXvZ(PрВg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ ;0@`0A@ lA&HA~77A@ ?>l 6!a3 #mH˔\]ڛ!a&I!Ї BLgâ&q(**+zbz $Y6|hXp|P|X DL0 +;+ $цEf$h"%V"TBV&65a 6fPK90΀u#0XG= +`" n\Pc'@ @O# 0XG=`z ] ؙXݔٵձMٵM Ρ[X؛]!ء[X YY[ܔ`E2V'7VfVV6%h:dx.source.argsS{BbW&76%Ї&dx.valverS~C2FV&FV6%Jdx.typeAnnotationsSCbVvD6EFW6% :dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m[,WBa A,D#3@Y0 &# `T ÌQ#`P\? ?0c@sA (A1c@u XF?g0b UIQRe`0b EV!ÿ30g$Y3DXg AÄ0b v ?L#`Ph? ?0a A Ìq#`Ph? #?0a AÄ0b V2CA 01M 1c@AqA 01M0a$ӴA 01MN0aSTAT`3DXILBC! * #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV T rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2(((B(KA@ y^LFD oM $Efe%&,f&gl&eCLa@  Ql `@,ˆ0 J3AX Cj),͍˔\]ڛP&Ų! &3A( !MTe q,&3A ql6n2dUi5\LY}QɝMgB5Xm`P"2insts1vF6A sig_st 384H5H*llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77% .dx.countersS5yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$ad84bd6daf29a34c6e2ca74af618c192.pdbHASHm)Ln,JDXIL`=DXILBC! 4 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV T rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b(*2("(ڱyILFD oM $Efe%&,f&gl&eCLa@ a0(McÀ$ay6Ah@M5qzKK{s P6X&a!(a"(ӓh&1A mX kJ T)/02 BlX$jJ| ETacksI#+sU\ܦD2<062)Q e-L鍬mJ!sK+K" +,u\ayL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma A,D0P +T%# ``LD!ÈA T!E1b FeLRR$a# `XE1ĈA  AQ0b eP"$bDXBCxGrl=ݥBL DTSFI0ISG14(SV_VertexIDOSG1`HT SV_PositionTEXCOORDPSV04 +TEXCOORDVSMainADB3ILDB8`:DXIL BC! : #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  I`B 2"H d""ㄡL LD#%@`1RsA @19-b9peAXrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GC:EPeP#Q AJ`$ʠ k97@py9LFĊ̬LNKlͮmm=271 30:Bvector X12@ E Be%`0["TV`APelementIؔ}չqHscdVpI&A`@B aFGCȮlMnj-g4dE2H `-b€ 0Pw0  `m7A8iG &A a 0"0! 26Wаj +Ks2FV&76VGVƕVG6ǖ6hc5TGWG'U6fWFm..m4ke`279E дA\ 6pI0AKs#S6vVFF@ E `ŁPsl6 PX5f@"!"pcf_lerp\^^ʸ\  }M } M5 ՙXؕѽ5 m[?0 bshadow_cascade_tm_transpk60 > @?shadow_cascade_tm_transp@SB_CSMBuffer@@3QBV?$vector@M$03@@B-@@ FZXXYW[כ\ݚ0 )L@  +?shadow_cascade_tc_mul_offset@SB_CSMBuffer@@3QBV?$vector@M$03@@B-LA` Rۛ]W30:<Nmatrixbb1@ +BT 0bd1@ BT  E ̂C` ++f4 DpY-Q=$` 1dd1@ BT X /E C`Kf4 DpY/Q=$` 2fd1@BT  E ЌC`*kf4 DpY9Q=$` 3hd1@BT  /E ЬC`:዆f4 Dl`AhpAxAAȽ}չM+8) }չM+8) 6 O<$\AXV+P"0{(?globtm_inv@GB_SceneBuffer@@3V?$matrix@M$03$03@@B-XܽɱYA1~Ȭ怎ʄ䀀f~H䀚H`f-[>RaK;C#J+K{sɕѥ }M ՙXؕѽ5 m[>ĖvF7&FW6FG<aK;Czc{Kr+sK:+s+33+!+{j"ڶn!!P}@.ɍm..qSfFW6Ft$55VV&TgfV&4cCbW6F&D3$mb$HBKXיXe-Ln%mL̬LK,m-m@ NLǮlMnj-g8d!PI `X 'ML hꇄ NLĮlMf(hIJ,M-LΌp&u&Vg4cCBUGW'W&CdCbW6F&D3m%`%`FW&u&VgF9i +K c:3!*ã+!!+{j" +ڶn!3KP!+C:3ѡ}ՙXPɕYؕѽ5m[ @%ձ}ͅɑ +kc+ +SN @2!+3 c kc+ +kc+ + +ڶn;NC #{  #+"+C+c̡}͍}ѡ}ѕXPɕYؕѽ5m[ ` *csmSamplerܦ&AKL6829 682607)02 m `1|b&MN.,-m) U]\PX]ݛ[ $B`$X t&'F6V4cCBUGW'W6T'VdCbW6F&D3mܢ,B`\[]ڛ[S Ǧl.ͭ) hꇄ NlN ĮlMf(hZМJaA$J%b&n'~,҂-F=! ay.L ĪLn.m0EP"*;Ir3{*K{s Ɔa  dd .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$m Dd-L,ͭlMAa$m D$뭎m-MAa$m DL̬LK,m-MAa$m DNLm-MAa$m Ddlm-MAAa,ͭ (hJ*iČ-n&AA NlN $MN.,-m) ND,mL&eA NlN Ďl.ͭ) ND,mL&eAAI(kHȨH +ej̭L̬L.DD,mLE &AaAČ-M+nAČ-M*mnAČ-- (Ml.mAČ-- nM.ɍm..oAČ-.ɍm..oAoAAjNlͮ j), .͍$ Dd˪L /(AaAjNlͮ 䭎jNlͮ,fAA䭎΅ oM Č-N% $&D$ D&eA䭎m.. Č-孎΅ oM DČ-NEE&dČ-N%$&$&eAADN 䭎nAAA-l䬌nj-Ǒl. Ō--ͭ,LN ͭlnČ-nD M̌l.͍Č-*AaAdmČ- -ͭ,LN ͭlnDEȈh*)) kʉ +$&eADN Ďl.ͭ) e* ̮ ,k. LD M̌l.͍,ELlAAA-j), jNlͮ $ .Dd*LAaAdmČ-D.쎨   Le* ̮ ,k. L$ ΅ oM&oA$ E.쎨  &AdADN Č-%&eAAAJmlnH̬LL̬LD, JmlnH̬L% ΅ oM,eAA  .mAČ-,LmČ-% ΅ oMDD$%$ ΅ oM%/DD$D.쎨 $&eAČ-M m NN  M+͎,Lm.eAČ-M mM m NN M m NNnAČ-n-͍( M*m/OM m/OoAAČ-n.M--M -͍(,eAA- nAČ-n- (MM--M - (Ml./O/eAA!M%mĭ'D -l .-m dN,ll. $M ,Mdl-L.A!-ldl-LnML̬Lel-LnMnAL̬L΅,̬nlMLL̬L΅,̬nlML̬Lel-LnML̬LΥ.ͭln.eAA!- d.N. L̬LM-- (M.%d$fA!-ĉ +L̬LM-..eA!- +$Llʼn*d$fA!- + - L̬L΅-ͭ,LN ͭlnDL̬L΅-ͭ,LN ͭlnnA!A!- d-펪L 䬌klk--͍($,oA!-l- nM- nM.ɍm..EL D- nM.ɍm..%lAA!amČ-n$MN.,-m $MN.,-m) e* ,k. LL̬LM--EL D.ɍm..oA!A!amČ-nL(hJ*iL̬L΅,̬nlML̬LΥ.ͭln.eA!A!amČ-ndm +kj -mlM ͭln͊L̬L΅-ͭ,LN ͭln.eAdmČ-ndLŌ-n%$$&dmČ-n&L̬LΥ.ͭln.eAA!-l.M,̍(̬n) . -leD$MN.,-m,DL̬L΅,̬nlMDL̬L%mAA!amČ-nĎl.ͪl DDĉ +DL̬LM- .nA!-nD M +䬌N M̌l.ͪl Ěl.ͪlL̬LM- + -,eAA-l.MHNH(N el-LnML̬LE ͭln*eA!-l.M,̍Ňl. 䬌nj-Ǒl. L̬L΅-ͭ,LN ͭlnD M*D.MHDL̬L%mAA!-lDld.̍,LLH͊鍉L̬L΅,̬nlM + -L̬L΅-ͭ,LN ͭlndl-LnML̬LΥ N.l+M+- (M.L̬LM--Dd-펪L D- nMA!!a.M,̍(̬n) . d.M,̍Ňl. dL̬LΥ-mn.mMnAADN Č-Ō-nEl.$,eAAa7902941:264942'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р06VGV"&Gv&WEVfV66ǖ&ҠР0fFVf244Ԡ0BVfV244ӠР0fFVfT545DT4ՠ2BVfVT545DT4BӠ0RFf֠Р0BVfV2Fv'CRg2V6TfWƦU&266V&RgₗRg⢗Ҡ0BVfV2Fv'C$'Rg2V6TfWƦU&266V&RgₗRgrҠР6"265FvE76&Ҡ0fFVf2Fv&'5W&GWF֠0BVfV2Fv&'5W&GWFӠ0RFf֠Р0fFVfҔ5Dt5UԠ2BVfVҔ5Dt5UR#Ӡ0RFf֠Р0BVfVdbF7R"Ҕ5Dt5UR"Ҕ5Dt5URR"R#R#6V'2V6G267FV2WҠР0fFVf4E545DTԠ0BVfV4E545DTT545DT4ՠ0RFf֠Р05EU5$TedT$24$TgfV&"Wv6GW&"6ҠנbFG7fV&ӠbFG2Fv567FVEE'6%CӵӠbFG2Fv567FVE7Vff6WFeӵӠנР`FrVF565FvUffV6FRF267FVFbF7BbF7BbF7B'bF7B7bF7BGbF7BWҠנbF26VdfV6FӠ26VdfV6F4E545DTcbb267FVF4E545DT7&6BW゗&6BW㒗&6BW㢗"26VdfV6FӠ26VdfV6F4E545DTSbb267FVF4E545DT7&6BG゗&6BG㒗&6BG㢗"26VdfV6FӠ26VdfV6F4E545DTCbb267FVF4E545DT7&6B7゗&6B7㒗&6B7㢗"26VdfV6FӠ26VdfV6F4E545DT3bb267FVF4E545DT7&6B'゗&6B'㒗&6B'㢗"26VdfV6FӠ26VdfV6F4E545DT#bb267FVF4E545DT7&6B゗&6B㒗&6B㢗"26VdfV6FӠ26VdfV6F4E545DTbb267FVF4E545DT7&6B゗&6B㒗&6B㢗"26VdfV6FӠ"WFW'26VdfV6FӠנР`F7rVF565FvE7bF7FGVWbF2W57VVGRF267FVFVGbF26VdfV6FVGbF7B6GҠנFGVWFGVWӠB"VfWFVGB26G"VgfV&נbF7BBB'B7BGBWӠBFGVW悧2Fv567FVEE'6E傗נFGVW撧2Fv567FVEE'6E傗נFGVW梧2Fv567FVEE'6E"傗נ2Fv567FVEE'6E2傗Ӡ2fT545DT4ӠBFGVW悧2Fv567FVEE'6E傗נFGVW撧2Fv567FVEE'6E傗נFGVW梧2Fv567FVEE'6E"傗נ2Fv567FVEE'6E2傗Ӡ2RFf֠2fT545DT4#ӠB'FGVW悧2Fv567FVEE'6E"傗נFGVW撧2Fv567FVEE'6E"傗נFGVW梧2Fv567FVEE'6E""傗נ2Fv567FVEE'6E"2傗Ӡ2RFf֠2fT545DT43ӠB7FGVW悧2Fv567FVEE'6E2傗נFGVW撧2Fv567FVEE'6E2傗נFGVW梧2Fv567FVEE'6E2"傗נ2Fv567FVEE'6E22傗Ӡ2RFf֠2fT545DT4CӠBGFGVW悧2Fv567FVEE'6EB傗נFGVW撧2Fv567FVEE'6EB傗נFGVW梧2Fv567FVEE'6EB"傗נ2Fv567FVEE'6EB2傗Ӡ2RFf֠2fT545DT4SӠBWFGVW悧2Fv567FVEE'6ER傗נFGVW撧2Fv567FVEE'6ER傗נFGVW梧2Fv567FVEE'6ER"傗נ2Fv567FVEE'6ER2傗Ӡ2RFf֠РB6GbF7Ӡ2fT545DT4#ӠB6GBӠ2RƖfT545DT43ӠB6GB'Ӡ2RƖfT545DT4CӠB6GB7Ӡ2RƖfT545DT4SӠB6GBGӠ2RƖfT545DT4cӠB6GBWӠ2RFf֠bF7R7Wf2W57VdӠ""VT545DT4RbbƆ&6BWS7WfӠ""FT545DT4BbbƆ&6BGS7WfӠ""6T545DT42bbƆ&6B7S7WfӠ""&T545DT4"bbƆ&6B'S7WfӠ""T545DT4bbƆ&6BS7WfӠ""Ɔ&6BƒdӠРbF7BӠ267FVFT545DT4ӠРB"VBWBӠB"FBGBӠB"6B7BӠB"&B'BӠB"BBӠB"BBӠ267FVF"VR267FVFӠ267FVF"FB267FVFӠ267FVF"62267FVFӠ267FVF"&"267FVFӠ267FVF"267FVFӠР267FVF"267FVFӠР26VdfV6FrVF565FvUffV6F267FVFBBB'B7BGBWӠРB炗B炗2Fv567FVE7Vff6WF567FVF傗2Fv567FVE7Vff6WF567FVFwӠBRӠ"WFW'BӠנР0RFVfdԠР2f2Fv&'5W&GWF֠BUGW'W&C$'2Fv567FVEVGEW"Wv6GW&BӠ2R6W֠Ҡ2RFf֠BUGW'W&C2Fv567FVEVGEW"Wv6GW&BӠ2V&7&66EFW266V&"Wv6GW&2ӠР2f2Fv&'5W&GWF֠fBW744FvbF'RgbFbFFҠנ"WFW'2Fv'C$'2Fv567FVEVGEWbFGRg炗FӠנ2R6W֠fBW744FvbF'RgbFҠנ"WFW'2Fv567FVEVGEW2V6TfWƦU&266V&Rg炗Ӡנ2RFf֠Р2f2Fv&'5W&GWF֠2BVfVBW744Fv'"2BW744Fv"2ҠfrVF7f565FvbFGBVG6FvG5Ҡ2R6W֠2BVfVBW744Fv'"2BW744Fv"ҠfrVF7f565FvbF7BVG6FvG5Ҡ2RFf֠נbF'b66V&5g$VG7fV&炗ӠbF'6BVG6FvG5䂗ӠbFGb66V66bFG6b66V&5g$VG6b66V&5g$VGӠfFVfFҠBW744Fv'b66V66炗BVG6FvG5BVG6FvG5rҠBW744Fv'b66V66wBVG6FvG5BVG6FvG5rҠBW744Fv'b66V66碗BVG6FvG5BVG6FvG5rҠBW744Fv'b66V66wBVG6FvG5BVG6FvG5rӠfFB&fFҠBFVfFҠBFVfFҠӠӠf6r&Ff6ҠBW744Fv'BVG6FvG5䂗BVG6FvG5BVG6FvG5r"ҠBW744Fv'BVG6FvG5䂗B&炗7fV&wBVG6FvG5BVG6FvG5r"ҠBW744Fv'BVG6FvG5䂗B&炗7fV&wBVG6FvG5BVG6FvG5r"נӠ"WFW'2FW'FWBFr&Ff6"BBӠנҠf6rVF565FvbF7FGVWbF2W57VҠנRF267FVFӠbF2FvWdfV6FӠbF7B6GӠbF7BrVF565FvE7FGVW2W57V267FVF2FvWdfV6FB6GӠbF7&6G6G&6B6GӠeFGWՠfBcҠנf266FvrVF7f565FvBӠf"VF2FW'FW&6G6G&6G6G璗&6G6G碗BӠР"WFW'f6266Fv267FVF267FVF2"VFӠנ"WFW'f6c267FVFcӠנҠ0RFf֠A p͡qՑq͕}ɑͱQ&7<34:$''&! 6634929227<34:4479%#* 6634929243723$#/!)"/$)242$#/!)"/$)&41:2902370649430432629:30437792:974377477<$4:224727706<3477994422<409349228064093430432:9<304377930:40934930:7+30:7&30:7$30:#7$7$4093430:#2+#730:#2&#72:9743779#2+#2&477<$4:224727706<3477994422<36743#9:427(!)22<729042:9<4330:432:9<422#92630:40934930:7+30:7&30:7$30:22<930:22<179340934940934930:#22<97$7$4093430:#2+#730:#2&#72:97#2+#2&22<17477<$4:224727706<3477994422<30432:9<422304377930:40934930:7+30:7&30:7$2:9743779432:9<422#9264093497+7&7477<$4:224727706<3477994422<30:43!07#92630:40/34930:7+30:7&30:7$30:7$30:2:7231443442227"4:4322747297729::934902:4077:4934902:407730:3068040/34940/3430:030680306830:30:023030:37$7*9179:9:222<9:0:304303279;3490206$:10922<430:3043032797:422:1020*2329:20209:229:222<9:466*22:6:0236!0792:43:20272:42733:922<9:79:30:0230:02702734377:4972472970730:3229830:0232:723144<77:4:7730:31337$2<80<389:7$06;702:9342:723144312:723144342:9732313043!07304377930:40/34930:7+30:7&30:7$30:7$30:2:723144342:974377943!07#92640/3497+7&7$7$2:723144343043'2709304377930:40/34930:7+30:7&30:7$30:7&7$30:640/34940/3430:6630:618630:947&7+730:!61869494180<7&72:9743779!30:!61869494477&7+7&2:97437797&!477<$4:224727706<3477994422<'9:2706417+9:2;17'7:+9:242032227:2;179072:270302:432407:4930'30+30:0:02/'7:+30:306830:033068030:133068030:2981790:020:02/'7:+03068*2:6:97:7042292214470:02:97298'+298179274 ^k-Ln+m.KLm- ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(9Y%} I}!1M15(9Y%} I}!1M14(4($9Y}5%9}%=I5($9Y}5%9}%=I5(5(4(4( I5(4(4(ɀ} I} }ɽᡀ}ɽ՝ͱ8Y4(5(l0ɽف̰ѥ4ɕ@ͥ <́$%t5(хѥнсɁЕɵ4(ср쁴ĸԠȠȠ4(срŀĸԠĸРР4(рȁ􀰥}ɽ՝́4(Ѐ􀴥ȹȹీɠࠁ8Yȹȹ4(ȕɹɠĸРĸРЀȹ4(5(4(̀ Iɽᡀ̀ձ ɱ}ɽ՝ͱ8Y4(5(l0ɽف̰ѥ4ɕ@ͥ <́$%t5(хѥнсɁЕɵ4(ɀ 􀜕} I} }ɽᡀ}ɽ՝ͱ8Y4(ȕɹձ Ɂ  ̅Ʌѕ$9Y}5%9}%=Iձ ɹ4(5(4(4( Iɽ9х}ɽ՝ͱ8Y4(5(Ĺ IɽᡀаȽ՝ͱ8Y4(сɀ쁴ĸԠ4(сɀŀĸԠ4(ɀȁ􀰥}ɽ՝́4(ȕɹȹȹీɠࠁ8Yȹȹ4(5(4(5(l/H.\shaders\include\gbuffer_base.hlsliad .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$m Dd-L,ͭlMAAA $m-mn.ͮl +-LŌ--L.--AaADN -L.- d +)(諨)ij*ɪhAAAaNnJmlnH̬LAaA-l,̬nlMnA-ldl-LnMnA-lN.mnm,oMnA- D ͭln-ͭ,LN ͭlnnAČ-nM-mAA- .ͭlnnA- N.mnm,o,LN.mn̍M.-mAA- N.l+M+mdnA- $mdnA- d-nA-l-mn.mMnA- -mn. .LnAČ--L.-mAoAAaNn .llH̬LAaA-l$MmA- dͭlnnAČ-nM-mAA- .ͭlnn,LN.mn̍M.-m M-mn.ͭA- N.mnm,o,LN.mn̍M.-m M-mn.ͭA- -mn. .Ln,LN.mn̍M.-m M-mn.ͭAA- $m,L$M-mn.ͭA- -mn.kNm,L$M-mn.ͭA- d-nAČ--L.-mAČ-䭎-ͭlAoAAaNn*llH̬LAaA-͌$M+mAČ-M-kͭln-L.-mA-L.J.mnm,k-nNmlnAoAd +L- J.mMA-Nm썬M- Ō-n-AaA-Lm M--M //De.NEOƥfƥ&%eAm mLƥfƥfADN mlAA-nl썬M- Ō-Nm,AaAČ- Č-m/&EŌ-EE&dČ-%%%%&eA- /O/.eAEmA/Dd.N-eADN /ODDd-l%&%eAA- --m -ld-AaADN e썍-lE&'ƥ%&&%eAA- l썬+M+ -l$M-AaADN d.N. --m %M-D%&%D%d%f$-- ,LnL- d -Ln- $m-o.m, mn.M$̍ $md-AA*llH̬L.llL̬L .llH̬LL̬L.AaA*llH̬LLlA- .ͭlnIJ.mnm,L̬LΥ.ͭlnnA.ͭlnIJ.mnm,$m-mn.ͮl +-LL̬LΥ-L.--L̬LΥ-mn. .LD.ͭlnIJ.mnm,oAAČ-nM-kͭlnČ-nm썬M- L̬LM-/O/- L̬Leͭln$$F&%eA- -L.- L̬LΥ-L.- D% d&eALM-kͭln-L.- Č-M-kͭln-L.--eAL%M+ -͌L̬L%M$m-mn.ͮl +-LL̬LΥ-L.--L̬LΥ-mn.kN D% )뫨)ij*)DL̬L%-eAL%M+ -͌L̬L%M$EE&L̬L%-eAL̥.J.mnm,k-ŌM.ͭlnIJ.mnm,O%&E%fŌML̬Le-N%&%E%E&eAL̥.J.mnm,k-Č-N.ͭlnIJ.mnm,L̬Le-.eADN LlAAA- .llM-mͭlnŌ-nM-kͭln䭎Č-nM-䭎- dͭln.AaAM- l썬M- M-kͭln//eAdͭln$LlM-kͭlnE/eAAA- .llH̬LM-mͭln*llH̬LLΌ䭎Č-nM-䭎- dͭln.AaA .llM-mͭlnLM-kͭln-L.-/OM-dͭln.eAAA .llH̬L .llH̬L*llH̬LL,AaA .llH̬LL̬LnAAL̬LΥ-L.- ČMLM-kͭln-L.-Dd,eA- .J.mnm,k-L̥.J.mnm,k-OE%&eA- d-L.l .J.mnm,k-.E%%&eA- .ͭlnIJ.mnm,ČM.J.mnm,k-.E%%&eA- d-L̥.J.mnm,k-%oA- .ͭlnIJ.mnm,L̥.J.mnm,k-oAL̬L%M L%M+/OoA .llH̬LM-mͭlnLΌL̬LM-L̬Leͭln.eAAL̬LΥ-mn. .L$m-mn.ͮl +-LL̬LΥ-L.--.ͭlnIJ.mnm,DfAL̬LΥ.ͭln.ͭlnIJ.mnm,oAL̬L΅N.mnm,fAL̬L% $m-mn.ͮl +-LL̬LΥ-L.--$DL%M+nAL̬LΥ-mn.kN $m-mn.ͮl +-LL̬LΥ-L.--L%M+D)뫨)ij* DfAL̬Le-d-nAL̬L΅,̬nlM$MM%L̬LΥ.ͭln.eA- Llέ (lN.m l六L%ƌ&ƌdͭln.ee.N%DL.l.ͮ,ɍ /%dDL.l.ͮ,ɍ /%M,lN.mlnAL̬Lel-LnML-lLlέ (lN.mLlέ (lN.mLlέ (lN.m,$ML̬LΥ.ͭln.eADN L̬LnAAJmlnH̬LNmlnH̬L .llH̬LL,AaAJmlnH̬LL̬LnAL̬LΥ-L.- L̥-L.-mAL̬LM- LM-mAL̬L΅-ͭ,LN ͭln$LeͭlnnAL̬LE ͭln- %L̬L΅-ͭ,LN ͭlnDL̬L΅-ͭ,LN ͭln.eAL̬LΥ.ͭlnL̥.ͭlnnAL̬L΅N.mnm,L̅N.mnm,o DD,m, D$mdMNlAL̬LΥ-mn.mML̥-mn.kN DL%MmAL̬LΥ-mn. .LL̥-mn. .LnAL̬LΥ N.l+M+ l썬+M+ L%M-eAL̬L΅,̬nlML%M L̬LΥ.ͭlnDL%MmE%.AL̬Le-Le-nAL̬L΅N.mnm,oML̬L΅,̬nlMDL̬L΅N.mnm,oAA- Llέ (lN.m ldL̥-L.- d +)(I) ED%Le-.D&e六L%ƌ&ƌD ͭln.ee.N%DL.l.ͮ,ɍ /%dDL.l.ͮ,ɍ /%M,lN.mlnALlέ (lN.m LLlέ (lN.m&ƌL̬LE ͭlnDL̬L΅N.mnm,/eALlέ (lN.m D%L̬L΅N.mnm,/eAL̬Lel-LnML-lLlέ (lN.mLlέ (lN.mLlέ (lN.m,L%ML̬LΥ.ͭln.eAL̬L% L%mADN L̬LnAAA- $-L̬L孎 .llH̬LDl.AaADl%M DlM- fADleͭlnDlΥ.ͭlnDl΅N.mnm,fADlΥ-mn. .LDlΥ-mn.kN fADl% Dle-$fADlΥ-L.- d +)(I)iAA- $-+M % .llH̬LDl-l$M-AaADl%M/O$MmAA- $-kͭln% .llH̬LDl- dͭln.AaADleͭlndͭlnnAAA- $-M- % .llH̬LDlČ-nM-AaADlM- MmAAA- $-.ͭln% .llH̬LDl- .-AaADlΥ.ͭln.mAA- $-N.mnm,% .llH̬LDl- N.mnm,/AaADl΅N.mnm,N.mnm,oAAA- $-+ % .llH̬LDl- $-AaADl% $mAA- $-k-% .llH̬LDl- d-.AaADle-d-nAA- $--L.- % .llH̬LDlČ--L.--AaADlΥ-L.- -L.-mAA- $--mn. % .llH̬LDlČ--mn.kN-AaADlΥ-mn.kN -mn.kNmAA- $--mn. .L% .llH̬LDlČ--mn. .L.AaADlΥ-mn. .L-mn. .LnAAAaNnHȨH멊 +AaA-͌$M+ Dd*LfAČ-M-kͭln-L.- Dd*L.fA-͌.J.mnm,k-Dd*LNfAoAAHȨH멊 + +N.L̬L*llH̬LL,AaAHȨH멊 + +L쩎nAL쩎%M+ L%M+mAL쩎M-kͭln-L.- LM-kͭln-L.-mAL쩎Υ.J.mnm,k--͌L̥.J.mnm,k-&eADN L쩎nAAAHȨH멊 + +m썬L̬LK. .llH̬LL̬L.AaADN N.L̬L.llL̬LL̬L.%eAAAa,ͭ m썬L̬L%E,m썬L̬LK.%,AA-lLNNM- -lm,M-lĉČ-nČ-N.AaA䬌 ĮlMn  . N.-팭AČ-n . .eAČ-n N,.eAČ-N. .eAČ-NN,.eAAdͮ  -ͭ,Ld.oAČ-n NLdLmnʼn N&eAČ-n .LdLmn .)eAČ-n + NLD.d .LDNoAČ-nD NLD.%d .LDN%oAAdmNn$ dn,%.L.-̍L.AČ-$ͮ- Dn.N- *ED(%%eADN -lm,MED dm,MD$ͮ- /D +dm,M%D$ͮ- /DD(eAoA2pC #+Jsc#+:33++ #sAccK㜽 ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(Ցՙ}͕ͱ4(4(Pɕ}ՙȕѕɡ4(Pɕɵ}ՙȕѕɡŤ4(Pɕѕɥ}ՙȕѕɡɤ4(Pɕѡ}ՙȕѕɡͤ4(4(LMхѕձ}ͅɁȕѕɡ4(4(@ՙɁȕAՙɡɀЍ4(5(@ՙɁՙ4(ՙ}􀄱}ՙL1ٕձ}ͅɱЍ4(ՙɵ}͵ѡ}ѕɥ􀸽ɵ}ՙL1ٕձ}ͅɱЍ4(ՙхQɅͱՍ}݁͡􀴅ѕɥ}ՙL1ٕձ}ͅɱЍ4(ȕɹՙ4(5(4(@ɽ͕ՙɁȕAɽ͕ՙɡɀЍ4(5(ȕɹɽՙɡԹՙɡȕAՙɡЍ4(mF4.\shaders\include\hardware_defines.hlslid .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$̍ )H*H苨(ɩh (HAa,ͭ )H*H苨(ɩh (H +$AAAAa$ )H*H諩*Aa,ͭ DH*k*IK%,$E/Aa,ͭ DHk*IK%,$E/Aa̍,ͬAa$̍ DH*k*IKAa,ͭ DH*k*IK%,$Aa̍,ͬAa$̍ DHk*IKAa,ͭ DHk*IK%,$Aa̍,ͬAAa$̍ d +)Hk *H iIF&Aa,ͭ d +)Hk *H iIF&$Aa̍,ͬAAa,ͭ *Hꨈ +$Aa,ͭ * d%&&GƦƬAa,ͭ * d%&&GƦAAa,ͭ j* &Aa,ͭ ) Č-n%&Aa,ͭ )+ Č-n$&Aa,ͭ )K Č-n$&AAa,ͭ )hKȪHjH(j +$Aa,ͭ d*H*k* HIHh +$Aa,ͭ N Nl+LkMK,k nAa,ͭ NLNl+LkMK,k nAa,ͭ NlNl+LkMK,k nAa,ͭ NNl+LkMK,k nAAa,ͭ , -ͬAa,ͭ , L-LAa,ͭ , l-lAa,ͭ , -͌AA-- oŌ-$Č-DČ-d,AaADN - %- Ed,%eAA--mŌ-$Č-DČ-d,AaADN - %- Ed,%eAAa,ͭ $*H*)ȉ +/AA-- oŌ-n$,AaADN - o%$%$E/eAA-- Ō-$Č-DČ-dČ-,AaADN - - %,- Ed,%eAA--͍Ō-$Č-DČ-dČ-,AaADN - - %,- Ed,%eAAAa,ͭ Jh(iNl,mAa,ͭ d*Jk* +/d.Ne.N. /%Aa,ͭ j멊 i** -,Č--Lg i**iAa,ͭ OL. %Ύ ,/$e* H. %ldk. Ln../ ,/Aa,ͭ O %.$e* ̮ %ldk. Ln../..Aa,ͭ o %.$e* ̮ %ldk. Ln../O..Aa,ͭ oJ %.$e* ̮ %ldk. Ln../O.Aa,ͭ oJ(HN., %Ύ,$e* ̮ %ldk. Ln../O,Aa,ͭ ONM %.$e* %ldk. Ln../..Aa,ͭ O%.$e* %ldk. Ln..Aa,ͭ o%.$e* %ldk. Ln..Aa,ͭ oJ%.$e* %ldk. Ln..Aa,ͭ N(L%n,$(L%ldk. Ln.n,Aa,ͭ ͨn l%n퍌l.$̅- %͍nn,l.Aa,ͭ Nl%nl.$e* %ldk. Ln.nl.Aa,ͭ Nl%n퍌l.$e* ̮ %ldk. Ln.n퍌l.AAa,ͭ d) KIH +%-.-Aa,ͭ +d Aa,ͭ Iꉉ dMAa,ͭ DH*i dKL.m Aa,ͭ Ĉ) dˌ-̭AAa,ͭ *kJj +-,dNn- dAa,ͭ h)Hʩj諩IHAa,ͭ DJ髨 *kJj +-,Aa,ͭ $)ꫨ *kJj +-,AAa,ͭ jkjH iAa,ͭ 䨈kjH i +n m.n mAa$̍ ɨj鋨(ɩAa,ͭ ɨj鋨(ɩ$AAa,ͭ dhh鋪JHAa,ͭ dhh鋪JH J +%n,Aa,ͭ dhh鋪JH(HJ*(Aa,ͭ dhh鋪JhAa,ͭ dhhKȨH +,͍-,Aa,ͭ dhhKȨH J +%n,Aa,ͭ dhhkJjJKȨH +,͍-,Aa,ͭ dhhkJjJKȨH J +%n,Aa,ͭ dhhki(A- ͨn M(l NLnj-$$͍Nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JHhADN $̅- %͍nn,%eAA-n ͨn M(l NLnj-n$$͍Nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JHhADN $̅- %͍nn,%eAA-N ͨn M(l NLnj-N$$͍Nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JHhADN $̅- %͍nn,%eAA- ͨn M(l NLnj-$$͍Nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JHhADN $̅- %͍nn,%eAA- ͨn M(l NL(HN.,nj-$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JH(HJ*(kADN $̅- %͍n,%eAA-n ͨn M(l NL(HN.,nj-n$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JH(HJ*(kADN $̅- %͍n,%eAA-N ͨn M(l NL(HN.,nj-N$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JH(HJ*(kADN $̅- %͍n,%eAA- ͨn M(l NL(HN.,nj-$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JH(HJ*(kADN $̅- %͍n,%eAA- ͨn M(l Nlnj-$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JhhADN $̅- %͍n,%eAA-n ͨn M(l Nlnj-n$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JhhADN $̅- %͍n,%eAA-N ͨn M(l Nlnj-N$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JhhADN $̅- %͍n,%eAA- ͨn M(l Nlnj-$$͍nn$͍퍌$͍,$͍͍$͍-,Aadhh鋪JhhADN $̅- %͍n,%eAAa,ͭ ͨn %n, ͨn M(l %n퍌()ɩ%&AA--L̬LN(l E̬Lnj-$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $lnkAA-n-L̬LN(l E̬Lnj-n$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $lnkAA-N-L̬LN(l E̬Lnj-N$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $lnkAA--L̬LN(l E̬Lnj-$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $lnkAA.͍-L̬LN(l E̬L.͍$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $lnkAA.͍-L̬LN(l eNnNL̬L.͍$$͍n$͍,$͍͍$͍-,AadhhkJjJKȨH +,͍-,eADN $lnkAA.͍-L̬LN(l EjNnNL̬L.͍$$͍n$͍,$͍͍$͍-,AadhhkJjJKȨH +,͍-,eADN $lnkAA.͍-L̬LN(l E(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅- n,eAA.͍N-L̬LNF(l E(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅-Ln,eAA.͍n-L̬LnF(l E(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅-ln,eAA.͍-L̬LF(l E(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅-n,eAA.͍-L̬LN(l EJ(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅- n,eAA.͍N-L̬LNF(l EJ(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅-Ln,eAA.͍n-L̬LnF(l EJ(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅-ln,eAA.͍-L̬LF(l EJ(,LlnN̬L$$͍n$͍,$͍͍$͍-,AadhhKȨH +,͍-,eADN $̅-n,eAAa,ͭ -L̬L%n,-L̬LN(l %n()ɩ%&Aa,ͭ -L̬LN%n,-L̬LNF(l %n()ɩ%&Aa,ͭ -L̬Ln%n,-L̬LnF(l %n()ɩ䬌-kd$,Aa,ͭ -L̬L%n,-L̬LF(l %n()ɩ%&A- dML̬LN(l EJ(,LlnN̬L$$͍n.͍.$͍,$͍͍$͍-,AadhhKȨH +,͍-,eA$eM n.,eAA- dML̬LNF(l EJ(,LlnN̬L$$͍n.͍N.$͍,$͍͍$͍-,AadhhKȨH +,͍-,eA$eMLn.,eAA- dML̬LnF(l EJ(,LlnN̬L$$͍n.͍n.$͍,$͍͍$͍-,AadhhKȨH +,͍-,eA$eMln.,eAA- dML̬LF(l EJ(,LlnN̬L$$͍n.͍.$͍,$͍͍$͍-,AadhhKȨH +,͍-,eA$eMn.,eAAa,ͭ dML̬L%n.,dML̬LN(l %n.()ɩ%&Aa,ͭ dML̬LN%n.,dML̬LNF(l %n.()ɩ䬌-kd$,Aa,ͭ dML̬Ln%n.,dML̬LnF(l %n.()ɩ%&Aa,ͭ dML̬L%n.,dML̬LF(l %n.()ɩ%&Aa,ͭ dNnNL̬L.%n,$l.͍ehhkJjJKȨH J +%n,n,%Aa,ͭ D̬L.%n,$l.͍ehhKȨH J +%n,n,%Aa,ͭ NL(%n,$l+͍Nehh鋪JH J +%n,n,%Aa̍,ͬAA.͍dm,ͨn M(l NL.͍N$$͍Nn$͍,$͍͍$͍-,AaAdhhki(iADN $lnlAAa,ͭ dm,ͨn %n,dm,ͨn M(l %n()ɩ䬌-kd$,AAa$ $d +)Hk *H iIF&Aa,ͭ dl%Dd,$ D DdAa,ͭ M%D,$ DAa̍,ͬAA-lm-,L-l.-AaAa$ ) Jh(i*ɩADN - .Ħ-eAamADN dl%m,- ..-%.-l&%eAa̍,ͬAAAa̍,l`Aυk-Ln+m+뭎m-s ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(ՍсX%5(5(̀ͥѥ@=M%Q%=94(̀ɵ8=I514(ɀЕ ɑPa ==I4(4(4(ՍсX=5(5(рͥѥLY}Aͥѥ4(рɁ =1=I4(ɀЕ ɑPa ==I4(4(4(ՍсXYa=5(5(рͥѥLY}Aͥѥ4(рɁ =1=I4(ɀЕ ɑPa ==I4(сɅ%Pa ==I4(4(4(ՍсX%15(5(̀ͥѥ@=M%Q%=94(̀ɵ8=I514(ɀЕ ɑPa ==I4(рЅсP99Q4(4(4(ՍсX=15(5(рͥѥLY}Aͥѥ4(̀ɵ8=I514(ɀЕ ɑPa ==I4(̀ЅсP99Q4(4(4(ՍсX=1݅ɑ5(5(рͥѥLY}Aͥѥ4(̀ɵ8=I514(ɀЕ ɑPa ==I4(̀ЅсP99Q4(̀ܽɱÁPa ==I4(рɁ =1=I4(4(4(ՍсX%iAɕ5(5(̀ͥѥ@=M%Q%=94(4(4(ՍсX%iAɕM5(5(̀ͥѥ@=M%Q%=94(р]́19]%!Q4(ԥр%́19%9% M4(4(4(ՍсX= ՙ5(5(рͥѥLY}Aͥѥ4(̀ɵ8=I514(̀ЅсP99Q4(ɀЕ ɑPa ==I4(̀ɔPa ==I4(4(4(ՍсX=iAɕ5(5(рͥѥLY}Aͥѥ4(ѕѥԥрԥPa ==I4(4(4(ՍсX=Iͽٕ5(5(рͥѥLY}Aͥѥ4(ɀЕ ɑPa ==I4(4(lRC5p͡qՑqɹͱ7<34:$''&! 6634929227<34:4479%#* 6634929243723/!)"'242/!)"'41:243/192349441:29:0/192349441:227/192349443272242$#/&")*242$#'"/ )242$#/*),242$#/*)/$""242$#! '43723!)"/$#242!)"/$#"$#/*)/$"$#'"/ $#/*)$#'"/ $#/*)$#/&")274172:9:4:77:17242)//!$''242)// ''242)/#,43723!)")/242!)")/")/#2742:10:207779904242)&($*242)/ ''242)""'242))$%242)$*#,242)$*')" ""242)$*')" " ((',43723!)")242!)")#)$*')" "274#92242)//'"242)/)$%242)//#)"&43723!)")/242!)")/#)/)$274)243723)")* 242)")* )27430!)"/432304377930:40934930:7+30:7&30:743!)"/$#"$#/&")2:97432629:43779243!)"/$#"$#'"/ 2:9743'2709437794093497+7&7$243!)"/$#"$#/*)2:97432:9<437794093497+7&7$243!)"/$#"$#/*)/$"2:97432:9<422437794093497+7&7$243!)"/$#"$#! 297906643227:!)"/4324:472:9727430!)"/432304377930:40934930:7+30:7&30:7$30:743!)"/$#"$#/&")2:97432629:43779243!)"/$#"$#'"/ 2:9743'2709437794093497+7&7$243!)"/$#"$#/*)2:97432:9<437794093497+7&7$243!)"/$#"$#/*)/$"2:97432:9<422437794093497+7&7$243!)"/$#"$#! 2:9743!07437794093494093497+7&7$727430:!)"/9:4:7730:3068030:743!)")/")//!$'2:979:4:77!477306807$243!)")/")// '2:979:4:77077306807$243!)")/")/#2:979:4:7#,306807$2749#7&730:!)"2:1444<30:3068030:7+30:7&30:743!)")#)&($2:972:684:243!)")#)/ '2:972:<0777+7&243!)")#)""2:972:2277$243!)")#))$2:972:145306807+7&243!)")#)$*#2:972:4:4306807+7&243!)")#)$*')" "2:972:4:792022306807+7&243!)")#)$*')" " (('2:972:4:79202 887<306807+7&27430!)"/3926309:077930:743!)")/#2:973926729:0779243!)")/#2:973921459:07797$243!)")/#2:973926#9269:07797$27430!)"9:0930:3068030:7+30:7&30:7$30:7$06392):23:406927730:"!)"/9:4:7730680730:#!)"2:1444<306807+7&730:6:"2:97:6364::8;39:42;7727:80:/774/39:4//81/;823740627702347730:6:)17730:0:02/'7:+30:'30:30682:970:02;0:02/'7:+'2<8306803068040934940934306804093494093406907092!)"//'&30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06706309277930::09243)* / !""!)"/$#"$#/&")2:97432629:24377230$7042;34:430:7$0:027:70630:7$0:027:;06432!)"/4322437794093497+7&743)* / !"309:09!)"9:09306807+7&7$7$:092<92779:0):23:30#!)"/39269:077972:97432#9:022:974327427406907092!)"#30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06706309277930::0922:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;70692779:092706907092!)"//'&30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06702:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;7063006907092!)"#30:7+30:7&0624377906330680063409349069:07790639:0):23:43034:4930;06702:97907092!)"//'&7+7&243779306804093499:07799:0):23:434:49;706307''*4<720724:47:2909979268229:4:7#,479:0/19234947:222447:44949>494949>494949>494949<###>49<####4949<###>49<####2:97430:29<47:447:79:30:3130:79:30:"22242:9730:"30679068#,30:"30:079:30:84$"79:30:9*2089:"0"79:30:47*2089:9*209*230$<47*2098$<47*20478$=9*22:9730:#,30:030:779:30:27$077$2:970$230:67902(2#,30:9*2030:02:979*20#,09*230:):09(2330:7$30:030:72:9767902(2#,7$00<7$30:40230772:977:77930274 kk-Ln+mk-LM,m- ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(L!I}1= 1}!1M15(L!I}1= 1}!1M14(4(Ցɑ݅ɕ}͹ͱ4(4(сɠсɕɹ5(сѠсɕɹɠ5(с᠘сɕɹѠ5(ɀ|ٕɠɀɕɹ5(̀|ٕ̀͠ɕɹ5(р|ٕѠрɕɹ5(4(ɀɠɀɕɹ5(̀ɠ̀ɕɹ5(рɠрɕɹ5(рѠрɕɹɠ5(р᠘рɕɹѠ5(рؠрɕɹ᠄5(сՠс왱с؁􀄩ةȕɹة5(4(ɠɕɹ5(Ѡɕɹɠ5(ՠ졅􄩄퀄ѨȕɹѨ5(4(сAݡс`сdȕɹݡᡄ͡`Ęd5(4(̀PQ]ɱ̀ر̀P 94(5(ȕɹձP 9إ4(5(4(̀Q 9̀84(5(̀P 94(4(̀Pɽ͡8T9%Q}e4(P􀰕ɽ͡8T9%Q}aPѕAM%1=9ѡPP4(P􀸽ɵ镡P4(4(с̀􀸽ɵ镡ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(̀Q 9̀8̀P4(5(P􀸽ɵ镡PѡP884(с̀ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(сɥ}願сȅѡɀ}ѡ4(5(ȕɹȍ}ѡ}ѡ䁨ȅѡ4(5(4(m^6X.\shaders\include\specular_brdf.hlsli d .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$̍ d +h)HKH iAa,ͭ d +h)HKH i $AAa$m g-LM,m-ͧAA)mL,ldl-LHHFI*H*mNŨA*mFI*AAa$̍ $)+IAa,ͭ $)+I +Aa̍,ͬAAdK- $&D鍬m - Ďl. Md Ld.ύl.M .mNlNA-,mN.M.M- Č- + -Č- $AaAČ-M + - D + -lAČ-M$M$fADN Mf%&Dd-  MFE$e,.m. D,* - $͍̍.--- nM$m,. D,*AAAdKll- $&fD + dn,L. lN-̭.m .̮lL D dN,llNA-,mN.M.Mll- Č- + -Č- $AaAČ-M + - D + -lAČ- I D iADN  I$&MD I&$MD ID I$e,.m. D,* - $͍̍.--- nM$m,. D,*AAA JNL.쬬E,NA-,mN.M. Č- + -Č- $AaAČ-$ -L + - D + -lAČ-  D$ -L $D d$f'D-ADN $ -L- %L $e,.m. D,* - $͍̍.--- nM$m,. D,*AAA$-mN .m (mέ,A-,mN.M.+-m Č- + - Č- + -,Č- Č-nČ-nČ-n$ $AaAČ-  $eAČ-$ $ $eAČ-  I N + - +d$ I% N + -,+d I iADN $- % + - K + -, DL $e,.m. D,* - $͍̍.--- nM$m,. D,*AAA%h-m -ͭAnNe-Ln.mLM NlneE&&ee-,A-,mN.M.m Ō- + -Č- )AaAČ-DN + - D + -lAČ-dmN  D iAČ-d.M $dmNmAČ-d.͍ d.M Dd.MmADN e.͍ dD emN e.M DDN&%%%dDDN&Dd.͍-e,.m. D,* $m䭭-AAA-쭭N./ -m,%AaADN EfAAA-쭭N.ϩ- Č-͊Č- $AaADN Dn D- 鍉 +$d%&eAAA-쭭N.omMN.m Ō- Č-鍉Č-͊Č- Č- + -,AaAČ-ĉ썎k- - 鍉&eAČ-ĉk- - ͊&eAČ- ˊ DF  iADN - -  ˊ Dĉk-  ˊ Dĉ썎k- ,$&eAAAdk D&D$-mL,lD,l d dl-L- DL 퍬 . $ M.m d. -LA-쭭N.o Č- $AaADN Dn D D $eAAA-쭭N.oj -ml Č- + -Č-͊Č- $AaAČ-d N + - $DƥfAČ-쭭N.oj -ml + +D%d-ddmAČ-쭭N.oj -ml  D%d-ddmADN E쭭N.oj -ml +D쭭N.oj -ml $eAAAd- L MA-쭭N.o- Č- + -Č-͊Č- $AaAČ-$LN + - $eAAČ-쭭N.o- + +dd.N +D + +D$L&d$L$eAČ-쭭N.o-  dd.N D  D$L&d$L$eADN Dn 쭭N.o- +D쭭N.o- $eAAA$ /-. dMN- d- L M,NA-쭭N.o-mMN- Č- + -Č-͊Č- $AaAČ-$LN + - $eAČ-쭭N.o- + Dd.NJ + +D$L&d$L$eAČ-쭭N.o-  +Dd.NI  D$L&d$L$eAŌ-$  + -lAŌ-쭭N.o- + D +D$$ $d$ $eAŌ-쭭N.o-  +D D$$ $d$ $eADN ƥDDn 쭭N.o- +d쭭N.o- $%eAAA$ /-. D-͍d- L MAd ,ND&DʍLn.̍,  )ln-e +-. Ĩm. $ )mL,lE(l DHhNA-쭭N.o-mMN-,N Č- + -Č-͊Č- $AaAČ-쭭N.o- + D +D$ + - $d + - $eAČ-쭭N.o-  +D D$ + - $d + - $eADN ƥDDn 쭭N.o- +d쭭N.o- $eAAA%h-m -ͭAnNe-Ln.mLM NlneE&&ee-,A-쭭N.o Ō-͊Č-)AaADN $Di + D*%eAAA-nLlέͭ Č-ndl-LnM$AaADN dl-LnMnAAA-nLlέmj -ml Č-ndl-LnMČ- $AaAČ-h $ $eAA$-- ln- D$m-o.m,-$ mn.M $̍ $m$m, dm.L D d-.ADN d.N. $)+I +Ddl-LnM $Dh d%h,Ddl-LnMnAAAA-nkj -mlM ͭlnŌ-nČ- Č-D ͭln.AaAdmČ-h % )eAČ-$N $D ͭlnnADN d- Ō-n%N $N $N -&&DhlAAA-nLlέHlέ Č-ndl-LnMČ- $AaAČ-nd +l-LnMn*Nd.Nd- Č-n&Č-n%'%'%''dl-LnM$$eAČ-n $dd +l-LnMn*N$$d +l-LnMn*N$eAČ-n d.NM d I $$eADN ƥDNˮll  ) d )$D$dNˮlll )E $& )E d$&$$eAAA-n䬌N M̌l.ͪl Ō-nDČ-nM-Č- + -,% - N-ͭ,LK ͭln.AaADN LM-D% + -,Dd.N% + -,d + - $$eAAAa̍,ͬAa s r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplusڰ A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰnFoox8&A a<̃P6 a dža<=&N!p.SV_VertexID ͆<&Aذ|ć|}|}dž>LY}AͥѥMg@$ A.cB11AD&A ذ}}?Ddp#l( H(K0:u0Ax,outputD@E `ZG=z$`X: @OLi(a@Otacks!;sE#6667:23)[E666427)\T"s{+s{s+s^_ijl̆m4"s{+s!+3Ks+ \\܌ʜʦQ eNn%LlnJU\ܦф .ͮLnJ`u\ئQ υ.,..mnJu\ȦʦQ ϥ̍N.-͍nnJ@"yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m[,WBa A,DF 1A @_0 ,`0AX`a1# `lXU=Ìux Aѡ`pÄ0b EgAÌ3V0b E'AC@P3x\jƀ<<tƀ V\0b PÌUx A!+?,9?0a؀gƀL&$1 :?$!>3Dx Aa.?<=?0c@h#`PAO6?L#`PAO4?L#`PO2?L# `}0c@| # `}Z0a$CUԄ0b  8wMA 0dA 0d_@862m%е >RI#}STAT`9DXILBC! 0 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2(!*(2("k9yfLFD oM $Efe%&,f&gl&eCLa0  Pl `@,ˆ0 J3AX Cj),͍˔՗U]^H&! &2A 5lXi*k d\&3A Lcp}b<"TEXCOORD \׆eΪ`" BA3`CDg4XM\9:uints4@` `h *llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77%8.dx.countersS7yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$b621f84e0e14b3da4275fcaa90ffaa76.pdbHASH!NBuvDXIL(`JDXILBC! A #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b( *(2("k9yMLFD oM $Efe%&,f&gl&eCLa0 a0(McÀ$a6AhXM5q*+K" P6X&ñA @4 1U˔\]ڛ`&D3A €l(nB`&mFL"') l(j2|$O 6 !fFVF7%ؕͥM &dx.valverSZY\Y۔ CbVvD6EFW6%XṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma (A,4P0@7F   0# `P`FU9EUWE,z |LXcc$aˆA  a }_$QˈA  a }Ռ$|1b HH`eDXBCLEFPrٔ4< DT$f0qdqqSFI0ISG1`HTSV_PositionTEXCOORDOSG14(@SV_TargetPSV04 +   TEXCOORDPSMainDBDILDB`c`XDXILHcBC! X #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L z2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX0vxp6:0t&Ƙ1sQEADhS$/;iZ̡&~V bPю8{4E0,< 0(@N"J|`8y@Br" Srt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !OC < y" p@ 0`@ )2L &GCJ +F + )2((b(R(()P (Ѐ($#A1O#AaAȜ tbgȝwg 1 {A@A@A@yAL d!"+3++#+{c+sAcc4@ oM $Efe%&,f&gl&e@Ì-]ݛ[ <float{ 0b4Z` E ,Bh  E 4Bh ( E vector9S(50`4p +``0? RM+8,Q (LSP `X} P +b39S5Fe-Ln%m+뭎m-mjNlͮ\]ڛ"hXAb!6Е ɑ0c{ !dW6F&cF"㳈Cj!0`4PB`AY L0 X*0YZ1 +BWPY[0 -LiT4p`¦ta &@@@@]4D^d2FV&76VGVu&VgfV&%WF6ǖ6h| %WF%6V67WFv$VgfV&P+ #{++#;33+ + {++#;33+!+{j""̡ͽՑՙ}͕ͱ qAɽ͕ՙɑ!K33+zc{[M9C3r`9:077E М88#!1@0{;Cs+[Vpuh$ L[[Y[["ha`0PnormalqF  х-bFa v0 C'6V7V6zj$ |S\]WXW"ha`0 +aoqF h̡-bF v0%`S֖676&~l$MY[\ڛ\"ha`0"materialqF"0/:C;CC?CHLa H¦Hb8/X% Ё{+;33+cɽՙeUAɽ͕ՙUUՙir [+#;33+&VF0 90\["hXb@' `40bf`y2 v0X =C;,b t 1@:`ܾ1@3:`чqP`0E Ѐ8N$``<1@s:lXV%\%`"&d&j&pbL)1@NlFB'6 &`N%x@}}~ʾ޾ހH̀~HH̀H`d6 U0> +aL?luminance@@YA$halff@V?$vector@$halff@$02@@@Z&`Ƃ,ƁJԹՙ1~֎䀀~Ȏ䀀Ȏ䀀@ՙ1 c+#{ +{[MZC@M-kͭln-L.-m4k1rHH2066*09290E д8\(A--&A*`oA 4@\q0s @@`W6v$VgfV&&6FV67Ys [;33+szk cj{{Cs+ +ª +[+#;33+ +J +!+{j" +J +"A c33ZX;@pqyiX5@u1@0@ .llM-mͭlnS6&6FV67eCbW6F&D#dDff.bjơ/bx4 YYӛ\[ l썬M- (+'ĮlMFĮlM&Hk`iX5 1|P@@(m-mn.ͮl +-L[O\Q[\]ZYPVЗS 7=@` lT#4jq8 5DFreadPackedGbuffer܃022#:329 *2#:329 179& \¦`ck/4 psyC #+{Isc#+ksAccK49+kC #{}͵}͡eYؕѽYؕѽ55im Mƪ ڰ DFget_csm_shadow_tc샀290/1 179&   -uintd@, `@,b;`@ @< Aq U@!sھH?get_csm_shadow_effect@@YAMIV?$vector@M$02@@00000@Z7 6 &6=h ./shaders/include/hardware_defines.hlsli=max3~f6I$Un̾ھ?get_pcf_csm_shadow@@YA$halff@V?$vector@M$02@@@Zv0MǪ  D2texCSMShadowd2)0; 0633 179& & ;BiX5A6@p2pyC #+{Isc#+㚃+c #3sAccK4P2CcK;Cs+c}MI՝eYؕѽ5Y55im d!j?@?`BD &e2FV&76VGV5FV&u&6ǖ6hH vWC'(+ Hk$@UP"&r"%bXꬌN M̌l.ͪltsVF'Vw&UfV6FfU6dCbW6F&D#d030d-jcEX?~E,a2FV&76VGVUf%&Gf6ǖ6h``Sf'$Ed'G<)r"2 +{ + !+{"A c33""A c33@ȁ;lFVM@ȌĈV#@"2"7;!)" 887distributionGGX~܎VMʩG + "2:+{k+KJKKcKcI}ɥYͥe55555i1IUr 0@uVVF'7ՖF6&'WFWF19+{k+˛jKCz+c +# +jjjjZ5*@@NN۝ PVPS֪ (WIR@ #$Ede&W6VF5"22+s+c + !+{j"j0$U &2+btئ?fresnelSchlick@@YA?AV?$vector@M$02@@V1@M@Z&?nW$jP6A/DOEY_ily| ĉ +Ċ +1/29E `53b+j33+!+{j"ڶ+Ba+@ʾھ le@~ʾھ䀀f~H䀚H`f-ʸІ 900/:7325`s0~ʾƾؾ耦䀀f~H䀚H`f-K 37147;"float4x4xX@hX@h|8|,b]f0`8|,b^f00_13! W "hEh&0%{"I @b8|,b_f0_23! 4× "hEh&05"I @d8|,bdf00_33! T "hHFh&0E"I @f8|,bef0_43Q! t "hXFh&0KKKKKȌLɜLʬL0{{sVp2dk΍nZAX׆aBb!hXfP3 M+Hkj̭L̬Lhꇤ-N. ffHhκ܌ 7962;9AݛUZБX[PYЌ]ݛP жA :lightDirection34:4177#22:329 179& m ;<3+@?lightColorIntensity@GB_SceneBuffer@@3V?$vector@M$03@@Bv~lWȔ%ѕͥ1~򀎄ʄ䀀f~H䀚H`f-p c+#{:3#GUGW'W&CcW6F&cFBl$mCp6 @0 mAOXיXЌ U]\ ]ݛP PжQ_0ۛ\[יX M-L hꇄ NLĮlMf(h۴/i-L.-LΌrFW&u&Vg4cCBUGW'W&CdCbW6F&D3m`mBVGu&Vg7!+C:3!*ã+!!+{j" +ڶ#7s I!+3 c kc+#3V&7EFW6 &0dCVfVF5V&4S5V&7EFWm`n 6Fv567FVEVGEW>C #{  #+"+C+!*ã+!!+{j" +ڶ7{C-6@TڦhM ɥͽMхѕMo0 ?csmSampler@@3USamplerComparisonState@@Avth%M\YZXYS=2<::217930:I H6 'MN.,-m) hꇄ NlN ĮlMf(h蔎231708A\[]ڛ[SЌ U]\PX]ݛP PжA! +c0 ض;:@L@a,fH1BNWE]pfg|&lfm&n&o&tL'uXuF=! q +:.L ĪLn.m +sQ"*;Ir3{*K{s0` // Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "in_out.hlsli" +#include "gbuffer_read.hlsli" +#include "pbr.hlsli" +#include "csm.hlsli" + +#define DIELECTRIC_F0 float3(0.04, 0.04, 0.04) + +TextureCube irradianceMap: register(t4); +TextureCube reflectionMap: register(t5); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 globtm_inv; + float4 worldViewPos; + float4 lightDirection; + float4 lightColorIntensity; + float4 envIntensity; +}; + +VsOutputResolve VSMain(uint id : SV_VertexID) +{ + VsOutputResolve output = (VsOutputResolve)0; + + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + + return output; +} + +half3 getSkyReflection(float linearRoughness, float3 roughReflection, float NoV) +{ + const float lod = linearRoughness * (REFLECTION_MAP_MIP_COUNT - 1); + return reflectionMap.SampleLevel(default_sampler, roughReflection, lod).rgb; +} + +float4 PSMain(VsOutputResolve input) : SV_Target +{ + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, input.texCoord, 0).x; + if(rawDepth == 0) + { + return float4(0,0,0,1); + } + + ProcessedGbuffer gbuffer = readProcessedGbuffer(input.texCoord); + + // depth / viewpos + float4 farpos = float4(input.texCoord.x * 2 - 1, (1 - input.texCoord.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + float3 pointToEye = worldViewPos.xyz - worldPos.xyz; + + float3 view = normalize(pointToEye); + + // lights + float3 lightDir = normalize(lightDirection.xyz); + + // todo: (is needed?????) replace metallic surfaces with albedo of their specular value + half3 specularColor = gbuffer.specularColor; + gbuffer.diffuseColor = lerp(gbuffer.diffuseColor, gbuffer.specularColor, gbuffer.metallness); + + float NoL = saturate(dot(gbuffer.normal, lightDir)) + 1e-5; + float NdotV = dot(gbuffer.normal, view); + float NoV = abs(NdotV) + 1e-5; + float ggx_alpha = gbuffer.linearRoughness * gbuffer.linearRoughness; + + half shadowTerm = get_csm_shadow(pointToEye, 1.0f).x; + half3 lightColor = lightColorIntensity.rgb * lightColorIntensity.a; + + const float3 irradiance = irradianceMap.Sample(default_sampler, gbuffer.normal).rgb * envIntensity.x; + + const float3 F0 = lerp(DIELECTRIC_F0, gbuffer.diffuseColor, gbuffer.metallness); + + const float3 kS = F_SchlickRoughness(F0, NoV, gbuffer.linearRoughness); + const float3 kD = lerp(float3(1.0, 1.0, 1.0) - kS, float3(0.0, 0.0, 0.0), gbuffer.metallness); + + half3 envAmbientDiffuseLighting = half3(kD * irradiance) * gbuffer.diffuseColor * gbuffer.ao; + + const float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float3 roughR = getRoughReflectionVec(reflectionVec, gbuffer.normal, ggx_alpha); + + half3 enviBRDF = EnvBRDFApprox(specularColor, gbuffer.roughness, NoV); + half3 envAmbientReflection = getSkyReflection(gbuffer.linearRoughness, roughR, NoV) * enviBRDF * gbuffer.ao; + + half3 result = standardBRDF( NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, gbuffer.extracted_albedo_ao, lightDir, view, gbuffer.normal) * shadowTerm * lightColor + + envAmbientDiffuseLighting + envAmbientReflection + gbuffer.emissionColor; + + return float4(float3(result), 1.0f); +} +vp͡qՑq͵ͱ?7<34:$''&! 6634929227<34:4479%#* 6634929241:2090/24949443723/$)242/$)&43723 242 )27424290;"0:06868226276829:<:24290; 9<0:06868226276829:<=:4190/1496437239009:87922429009:8792227443723$) $242$) $"274242 &#30$) $"$) $"9:9069:02443723) 242) " 274)!*#")&:3292930:1/2930:900//:09-30:900/:732-30:290231:47:04230:3030:3030:3030:"31:"31:) 042) 0090909"31"31:) 042) 009:09:09:"31"31:) 042) 0090909"31"31:) 042) 009:09:09:"31"31:) 042) 0090909"31"31:) 042) 009:09:09:"312:97"3130290/13047:230:202::47:042::30:"31:::30:947:247:72722::779::3230::::47:2<900//:09-.<47:2<900//:09-.<47:2=900//:09-.<900//:09-.<43 )47:2<900//:09-.<47:2<900//:09-.<47:2=900//:09-.<900//:09-.<27443 ):47:2<900//:09-.<47:2<900//:09-.<47:2=900//:09-.<900//:09-.<27443 )47:2<900//:09-.<47:2<900//:09-.<47:2=900//:09-.<900//:09-.<27443 ):47:2<900//:09-.<47:2<900//:09-.<47:2=900//:09-.<900//:09-.<27443 )47:2<900//:09-.<47:2<900//:09-.<47:2=900//:09-.<900//:09-.<274:9:3043 :9:243 :9::243 :9:243 :9::243 :9:27430/063202 &76 )06609/06761 )06609:/0676 )06609/06761 )06609:/0676 )06609/0676106609: &30:042 )::1:::1:::1:042040421040420404210404204042104"31:290231:042::::<:<900/:73204.<900/:73204.:=2:97:723 &439009:87922<:2 9<900/28:/2<929:22742<:2"900/28:/2<929:682607)0268299299439009:87920632)0;30::;30:=30:422:9790; 9<900/28:/2<30::;<4220632)0;30::;30:2:97900/28:/2<6868226276829:;<274439009:87922422)0;012)0;010632/190;30:28:)0;22422)0;012)0;00632/190;3028:)0;27430:377218#'8:1/29830:928:)0;!30:37729930:9377218#'8:9377218#'806300632)0;377299<28:)0;!=28:)0;!2)0;377299;28:)0;!=28:)0;!2)0;377299<28:)0;!=28:)0;!2)0;377299;28:)0;!=28:)0;!063490637:00637:006306302062)0;28:)0;!<28:)0;!=28:)0;!92)0;28:)0;!<49<1/298;28:)0;!=28:)0;!92)0;28:)0;!<49<1/298;28:)0;!=28:)0;!2:970:027:3020606290;3047:230:2047:0430:90"31:30:930:290/147:220204290"31::93009:9:09:9-30:243:=063)0;2/190;06312720:020<0<09:9:<09:9:09:9:2:9706)0;04204212722:970630423274 k-Ln+m,̬nKLm-2I ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(%UM} I}!1M15(%UM} I}!1M14(4(Ց̡}ͱ4(4(͕̀1ѡ͕̀ Ɂ4(5(ȕɹ͕ ٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(I՝́ɍՅɁȽ՝5(͕̀ ɱ塀͕̀ ɱсI՝ͱс8Yс81сX!4(5(сԀȀX!X!I՝4(сYĀĤՠĀ8Y4(с1ĀĤՠĀ814(ȕɹ͕ ɁY1켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(ɽ٥ɽ ѕн@ Iɝ偌͕مѥٕɱ偐͕5(с͕ ɱᕑɕ͹сI՝ͱс8Yс81сX!4(5(сɝ ́4(сɝѽɁԘI՝́ԘI՝́ĸ4(с􀔹ɝ ́ȀX!X!I՝4(сYĀĤՠĀ8Y4(с1ĀĤՠĀ814(ȕɹY1ɝѽɥ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(͕̀ ɱᕑ͕̀ ɱсI՝ͱс8Yс81сX!4(5(ȕɹ͕ Ɂ͕ ɱᕑɕ͹I՝ͱ8Y81X!켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(с͕ ɕ͹с}ɽ՝ͱс8Yс81сX!с8!сȕɽIѥ٥]Ĥ4(5(Lܕ͕ ѥнٕѽٕсɁȽ՝́Ʌɥѥн5(СɁͥ́Ʌɥѥ4(с}􀰥}ɽ՝ͩ}ɽ՝4(сɀ􀜝}}4(с̅ɅѕĸɠȀɀĀ4(4(сX!ՠĀX!4(ṔѽɁչ́С偈ссɅ饹Ɂ݁Ƚ՝́ѕɥ4($сɕѕ́ɝȥсɅ饹Ɂ̵ѡɥѕɥ5(PɁС؅ՕȥMͱСݕɁСɝ偈сܥ5(Pձс؅Օɽ ́Ը4(LѥС؅ՕнĸсȥС́ɝ偈ѹ4(ссȥMԘ4(сŀĸȥMՠĸ81ĸȥMՠĸ8Y4(4(H՝н̵ѡŀȕ͕ѕѥ5(с􀰕Ű̅ɅѕȸȀԀ4(4(Hɽȕѥ٥偌ɥѥ4(с􀠀иԀ䀤иԀX!ɠᡀ̸ȀĸȰ䀤ѡ8!4(݁нɁȽ՝ȕɽȕѥ٥5(ȕɽIѥ٥]4(ȕɹ4(5(4(͕̀ ͕̀ ɱс}ɽ՝ͱс8Yс81сX!с8!сȕɽIѥ٥]Ĥ4(5(ȕɹ͕ Ɂ͕ ɕ͹}ɽ՝ͱ8Y81X!8!ȕɽIѥ٥]ѥ4(5(4(͕̀=ɕ9ɡ͕̀ ɱс}ɽ՝ͱс8Yс81сX!4(5(сX1ȀX!4(с􀰥}ɽ՝́}ɽ՝4(сɀ􀴁4(с ŀĀԀɀȍɀ̤4(с ɥX18Y814(4(с ɀԀɀȍɀ䤀 ɥ ɥȍ818Y4(ȕɹ͕ Ɂ ŀ ɤ4(с ɀԀɀȍɀ䤀 ɥ ɥİ818Y814(ȕɹ͕ Ɂ81 ŀ ɀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(8́Сɵɕѥ5(X́Сإ݁ؕѽ5(8ÝСͥݕСإ݁ؕѽɁСɵ5(͕̀Ɂ̀8̀Xс̅Ʌѕ}9Yс}4(5(сĸĘ}ĸИ4(сԘ}4(сѽɁ̅Ʌѕ̅Ʌѕ}9Y}4(Pȕձс́сɵ镑́ܕэՉ5(ȕɹ8XѽɁ4(5(4(4(mvw.\shaders\include\envi_brdf.hlsliLd .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$̍ *KH iAa,ͭ *KH i $AAa$̍ $)+IAa,ͭ $)+I +Aa̍,ͬAA奥ANHȨA奥AA-L䬌NH+H+N - -ͭ,LK ͭln- +$AaAd )L/LD&fD䨌. M  +-o.m, $ d( .OD-ll n$)IA$, .. ,NLͥAdm-͌d d%FƥFFF oAdm-͌d,d$F$ oA-͌D-ͭ,LK ͭlnDd dd,fA- $ - DDD N%E D +$$DDdD%oADN -L%$ $D$ dDEnAAA-lNH(N -ldl-LnM- -ͭ,LK ͭln- +$AaAd )L/LD&fD䨌. M  +-o.m, $ d( .OD-ll n$)IA$, .. ,NLͥA-L$H䬌NH+H+N -ͭ,LK ͭln +$eADN dl-LnMD$Hd$H%//Oe.N. %)+IJel-LnM,eAAAA- NH(N ͭ. - -ͭ,LK ͭln- +$AaAd* $lNH(N D ͭln +$Adm-Ld d%F oAdm-Ld,d$F oA-LD-ͭ,LK ͭlnDd dd,fADN - DDD N%E D +$$DDdD%oAAAa̍,ͬAa;C2pC #+Jsc#+:33+ +sAccK#// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + +bool isEmissiveShader(float material) +{ + return material == SHADING_EMISSIVE; +} + +struct ProcessedGbuffer +{ + half3 diffuseColor; + half3 specularColor; + half3 translucencyColor; + half roughness, linearRoughness; + float3 normal; + + half metallness; + half translucency; // either translucent or metallic + + half extracted_albedo_ao; // custom + half ao; // custom + half shadow; + half3 emissionColor; + half emission_part; + float material; +}; + +struct UnpackedGbuffer +{ + half3 albedo; + half smoothness; + float3 normal; + + half metallness; // either translucent or metallic or emission + half translucency; // either translucent or metallic or emission + half emission_part; // either translucent or metallic or emission + + half ao; // either ao, or emission + half emission_strength; // either ao, or emission + half shadow; + float material; + float outline; +}; + +struct PackedGbuffer +{ + half4 albedo_ao; + float4 normal_smoothness_material; + half2 metallTranslucency_shadow; // processed +}; +// Spheremap Transform +float2 encodeNormal(float3 n) +{ + half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5)); + enc = enc*0.5+0.5; + return enc; +} +float3 decodeNormal(float2 enc) +{ + float4 nn = float4(enc.xy,0,0)*float4(2,2,0,0) + float4(-1,-1,1,-1); + half l = dot(nn.xyz,-nn.xyw); + nn.z = l; + nn.xy *= sqrt(l); + return (nn.xyz * 2 + half3(0,0,-1)); +} +half luminance(half3 col) +{ + return dot(col, half3(0.299, 0.587, 0.114)); +} +half decode_albedo_ao(half3 albedo) +{ + return saturate(luminance(albedo) * (1 / 0.04)) * 0.9 + 0.1; // anything darker than charcoal is not physical possible, and is shadow +} +PackedGbuffer pack_gbuffer(UnpackedGbuffer gbuffer) +{ + PackedGbuffer gbuf; + half metallnessOrTranslucency = gbuffer.metallness; + metallnessOrTranslucency = isEmissiveShader(gbuffer.material) ? gbuffer.emission_part : metallnessOrTranslucency; + + float3 normal_smoothness = float3(encodeNormal(gbuffer.normal.xyz), max(gbuffer.smoothness, 1.0 / 127)); + half material = gbuffer.material * (1.f / 3.0); + gbuf.normal_smoothness_material = float4(normal_smoothness, material); + gbuf.albedo_ao = half4(gbuffer.albedo, isEmissiveShader(gbuffer.material) ? gbuffer.emission_strength * (1.0f / MAX_EMISSION) : gbuffer.ao); + // gbuf.albedo_ao = half4(pow(gbuffer.albedo, 1/2.2), gbuffer.ao); + // gbuf.metallTranslucency_shadow = (floor(metallnessOrTranslucency*15)*16+floor(gbuffer.shadow*15))*(1.0/255.0); + gbuf.metallTranslucency_shadow = float2(metallnessOrTranslucency, gbuffer.shadow); + return gbuf; +} + +void unpackNormalSmoothness(float3 normal_smoothness, out float3 normal, out half smoothness) +{ + normal = decodeNormal(normal_smoothness.xy); + smoothness = abs(normal_smoothness.z); +} + +void unpackGbufferNormalSmoothness(PackedGbuffer gbuf, out float3 normal, out half smoothness) +{ + unpackNormalSmoothness(gbuf.normal_smoothness_material.xyz, normal, smoothness); +} + +UnpackedGbuffer unpackGbuffer(PackedGbuffer gbuf) +{ + UnpackedGbuffer gbuffer; + + gbuffer.material = floor(gbuf.normal_smoothness_material.w * 3.f); + // half metallTranslucency_shadow = gbuf.metallTranslucency_shadow.x*(255.0/16.0); + // half shadow = frac(metallTranslucency_shadow)*(16.0/15.0); + // half metallnessOrTranslucency = floor(metallTranslucency_shadow)*(1./15); + half shadow = gbuf.metallTranslucency_shadow.y; + half metallnessOrTranslucency = gbuf.metallTranslucency_shadow.x; + gbuffer.albedo = gbuf.albedo_ao.xyz; + unpackGbufferNormalSmoothness(gbuf, gbuffer.normal, gbuffer.smoothness); + + gbuffer.emission_part = isEmissiveShader(gbuffer.material) ? metallnessOrTranslucency : 0; + gbuffer.metallness = metallnessOrTranslucency; + gbuffer.translucency = 0; + gbuffer.ao = isEmissiveShader(gbuffer.material) ? 1 : gbuf.albedo_ao.w; + gbuffer.emission_strength = isEmissiveShader(gbuffer.material) ? gbuf.albedo_ao.w * MAX_EMISSION : 0; + gbuffer.shadow = shadow; + // gbuffer.diffuseColor = albedo*(1-gbuffer.metallness); + // half fresnel0Dielectric = 0.04f;//lerp(0.16f,0.01f, smoothness);//sqr((1.0 - refractiveIndex)/(1.0 + refractiveIndex)) for dielectrics; + // gbuffer.specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), albedo, gbuffer.metallness); + return gbuffer; +} +ProcessedGbuffer processGbuffer(UnpackedGbuffer gbuf) +{ + ProcessedGbuffer gbuffer; + gbuffer.material = gbuf.material; + gbuffer.normal = gbuf.normal; + gbuffer.linearRoughness = 1 - gbuf.smoothness; + gbuffer.roughness = max(1e-4, gbuffer.linearRoughness * gbuffer.linearRoughness); + gbuffer.metallness = gbuf.metallness; + gbuffer.translucency = gbuf.translucency; // due to 2 bit encoding *0.75 is correct + gbuffer.emissionColor = gbuf.emission_strength * gbuf.albedo; + gbuffer.emission_part = gbuf.emission_part; + gbuffer.extracted_albedo_ao = decode_albedo_ao(gbuf.albedo); + gbuffer.diffuseColor = gbuf.albedo - gbuffer.metallness * gbuf.albedo; //*(1-met) + gbuffer.shadow = gbuf.shadow; + gbuffer.translucencyColor = gbuffer.diffuseColor * gbuffer.translucency; + + half fresnel0Dielectric = 0.04f; // + (gbuf.material == SHADING_NORMAL ? 0.2 * (1-gbuf.shadow) : 0);//lerp(0.16f,0.01f, roughness);//sqr((1.0 - refractiveIndex)/(1.0 + refractiveIndex)) for dielectrics; + fresnel0Dielectric = lerp(fresnel0Dielectric, 0.01f, gbuffer.roughness * gbuffer.translucency); + fresnel0Dielectric *= (1 - gbuffer.translucency); + gbuffer.specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), gbuf.albedo, gbuffer.metallness); + gbuffer.ao = gbuf.ao; + return gbuffer; +} + +void init_gbuffer(out UnpackedGbuffer result) +{ + result.albedo = result.normal = 0; + result.smoothness = result.metallness = result.translucency = 0; + result.emission_part = result.emission_strength = 0; + result.ao = result.shadow = 1; + result.material = SHADING_NORMAL; +} +void init_albedo(inout UnpackedGbuffer result, half3 albedo) +{ + result.albedo.xyz = albedo; +} +void init_smoothness(inout UnpackedGbuffer result, half smoothness) +{ + result.smoothness = smoothness; +} + +void init_normal(inout UnpackedGbuffer result, float3 norm) +{ + result.normal = norm; +} + +void init_metalness(inout UnpackedGbuffer result, half metal) +{ + result.metallness = metal; +} +void init_translucency(inout UnpackedGbuffer result, half translucency) +{ + result.translucency = translucency; +} + +void init_ao(inout UnpackedGbuffer result, half ao) +{ + result.ao = ao; +} +void init_shadow(inout UnpackedGbuffer result, half shadow) +{ + result.shadow = shadow; +} +void init_material(inout UnpackedGbuffer result, float material) +{ + result.material = material; +} +void init_emission(inout UnpackedGbuffer result, float emission_strength) +{ + result.emission_strength = emission_strength; +} +void init_emission_part(inout UnpackedGbuffer result, float emission_part) +{ + result.emission_part = emission_part; +} + +struct GBUFFER_OUTPUT +{ + half4 albedo_ao : SV_Target0; + float4 normal_smoothness_material : SV_Target1; + half4 metallTranslucency_shadow : SV_Target2; +}; + +GBUFFER_OUTPUT write_gbuffer(PackedGbuffer gbuf) +{ + GBUFFER_OUTPUT gbufOut; + gbufOut.albedo_ao = gbuf.albedo_ao; + gbufOut.normal_smoothness_material = gbuf.normal_smoothness_material; + gbufOut.metallTranslucency_shadow = half4(gbuf.metallTranslucency_shadow,0,0); + return gbufOut; +} + +GBUFFER_OUTPUT encode_gbuffer_raw(UnpackedGbuffer gbuffer) +{ + return write_gbuffer(pack_gbuffer(gbuffer)); +} + +#define encode_gbuffer(a,b) encode_gbuffer_raw(a) + +half3 perturb_normal(half3 localNorm, half3 N, float3 p, float2 uv) +{ + // get edge vectors of the pixel triangle + float3 dp1 = ddx(p); + float3 dp2 = ddy(p); + float2 duv1 = ddx(uv); + float2 duv2 = ddy(uv); + + // solve the linear system + float3 dp2perp = cross(N, dp2); + float3 dp1perp = cross(dp1, N); + float3 T = dp2perp * duv1.x + dp1perp * duv2.x; + float3 B = dp2perp * duv1.y + dp1perp * duv2.y; + + // construct a scale-invariant frame + float invmax = rsqrt(max(dot(T, T), dot(B, B))); + return half3(localNorm.z * N + (localNorm.x * invmax) * T + (localNorm.y * invmax) * B); +} ZYW[YיXYܗ\Y [d .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$m DL̬LK,lm-MAA NL$MLLD,mL&eA NLM-LLD,mL.&eA NL-L.-LLD,mLN&eA NL LLD,mLn&eAAa* Ln. ,k. LDD,mLe&eAA*llH̬LD, *llH̬LŌ-Nn,AaA*llH̬LLlAL%M+ $MLe* ̮ ,k. Ln&eALM-kͭln-L.- M-Le* ̮ ,k. Ln&eAL̥.J.mnm,k--L.-Le* ̮ ,k. Ln&/oADN LlAAAJmlnH̬LD, JmlnH̬LŌ-Nn,AaADN NmlnH̬L .llH̬LE, *llH̬Ln,%%eAo@>C4pC #+Jsc#+B # +"+3Ks+sAccKc&// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef HARDWARE_DEFINES_HEADER +#define HARDWARE_DEFINES_HEADER 1 + + + +#if _HARDWARE_METAL +#define BGRA_SWIZZLE(a) a.zyxw +#define BGR_SWIZZLE(a) a.zyx +#endif +#ifndef BGRA_SWIZZLE +#define BGRA_SWIZZLE(a) a +#endif +#ifndef BGR_SWIZZLE +#define BGR_SWIZZLE(a) a +#endif + +#ifndef SHADER_COMPILER_HLSL2021 +#define SHADER_COMPILER_HLSL2021 1 +#endif + +#define GPU_TARGET 1 +#define PI 3.14159265f +#define PIh 3.14159265h + +#define EPSILON 0.000001 +#define UNIT_X float3(1.0, 0.0, 0.0) +#define UNIT_Y float3(0.0, 1.0, 0.0) +#define UNIT_Z float3(0.0, 0.0, 1.0) + +#define HAS_REVERSEBITS 1 +#define SEPARATE_SAMPLER_OBJECT 1 +#define double doubles_are_not_supported_by_some_gpus +#define double2 doubles_are_not_supported_by_some_gpus +#define double3 doubles_are_not_supported_by_some_gpus +#define double4 doubles_are_not_supported_by_some_gpus + +#define fixed half +#define fixed2 half2 +#define fixed3 half3 +#define fixed4 half4 + +float max3(float a, float b, float c) +{ + return max(a, max(b, c)); +} +float min3(float a, float b, float c) +{ + return min(a, min(b, c)); +} +#define INVARIANT(x) x + +float max3(float3 a) +{ + return max3(a.x, a.y, a.z); +} +float max4(float a, float b, float c, float d) +{ + return max(max(a, d), max(b, c)); +} +float min4(float a, float b, float c, float d) +{ + return min(min(a, d), min(b, c)); +} + +#define PRECISE precise +#define SQRT_SAT(x) sqrt(saturate(x)) +#define VS_OUT_POSITION(name) float4 name:SV_POSITION; +#define tex2Dgrad(a, uv, dx, dy) a.SampleGrad(a##_samplerstate, (uv).xy, dx, dy) +#define tex2Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xy, (uv).w) +#define tex3Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, (uv).w) +#define texCUBElod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, uv.w) +#define texCUBEArraylod(a, uv, lod) a.SampleLevel(a##_samplerstate, (uv).xyzw, lod) +#define tex2Dproj(a, uv) a.Sample(a##_samplerstate, (uv).xy/(uv).w) +#define tex2D(a, uv) a.Sample(a##_samplerstate, uv) +#define tex3D(a, uv) a.Sample(a##_samplerstate, uv) +#define texCUBE(a, uv) a.Sample(a##_samplerstate, uv) +#define textureGather(a, tc) a.Gather(a##_samplerstate, tc) +#define texelFetchOffset(a, tc, lod, ofs) a.Load(int3(tc, lod), ofs) +#define textureOffset(a, tc, ofs) a.Sample(a##_samplerstate, tc, ofs) +#define textureLodOffset(a, tc, lod, ofs) a.SampleLevel(a##_samplerstate, tc, lod, ofs) + +#define CLAMP_BORDER(a, name, val) +#define LOOP [loop] +#define UNROLL [unroll] +#define BRANCH [branch] +#define FLATTEN [flatten] + +#define EMPTY_STRUCT(name) struct name {} +#define DECLARE_UNUSED_MEMBER +#define RETURN_EMPTY_STRUCT(name) +#define INIT_EMPTY_STRUCT(name) + +#define HW_USE_SCREEN_POS +#define GET_SCREEN_POS(vs_pos) vs_pos +#ifndef TEXELFETCH_DEFINED +#define TEXELFETCH_DEFINED 1 + +#define CHECK_TEXTURE2D +#define CHECK_TEXTURE2D_EXPR(a, tc) 0 +#define CHECK_TEXTURE2DARRAY +#define CHECK_TEXTURE3D +#define CHECK_BUFFER(file, ln, name) +#define CHECK_BUFFER_EXPR(a, tc) 0 +#define CHECK_STRUCTURED_BUFFER(file, ln, name) +#define CHECK_STRUCTURED_BUFFER_EXPR(a, tc) 0 +#define CHECK_STENCIL +float4 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float3 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float2 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float4 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float4 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +#define texelFetch(a, tc, lod) texelFetchBase(a, tc, lod, _FILE_, __LINE__, -1) + +float4 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float3 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float2 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(StructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(RWStructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +uint loadBufferBase(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +#define loadBuffer(a, tc) loadBufferBase(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer2(a, tc) loadBuffer2Base(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer3(a, tc) loadBuffer3Base(a, tc, _FILE_, __LINE__, get_name_##a) +#define loadBuffer4(a, tc) loadBuffer4Base(a, tc, _FILE_, __LINE__, -1) +void storeBufferBase(RWByteAddressBuffer a, int tc, uint value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store(tc, value); +} +void storeBuffer2Base(RWByteAddressBuffer a, int tc, uint2 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store2(tc, value); +} +void storeBuffer3Base(RWByteAddressBuffer a, int tc, uint3 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store3(tc, value); +} +void storeBuffer4Base(RWByteAddressBuffer a, int tc, uint4 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store4(tc, value); +} +#define storeBuffer(a, tc, value) storeBufferBase(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer2(a, tc, value) storeBuffer2Base(a, tc, value, _FILE_, __LINE__, get_name_##a) +#define storeBuffer3(a, tc, value) storeBuffer3Base(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer4(a, tc, value) storeBuffer4Base(a, tc, value, _FILE_, __LINE__, -1) +#define structuredBufferAt(a, tc) a[uint((CHECK_STRUCTURED_BUFFER_EXPR(a, tc), tc))] +#define bufferAt(a, tc) a[uint((CHECK_BUFFER_EXPR(a, tc), tc))] +#define texture2DAt(a, tc) a[int2((CHECK_TEXTURE2D_EXPR(a, tc), tc))] +#endif + +uint stencilFetchBase(Texture2D a, int2 tc, int file, int ln, int name) +{ + CHECK_STENCIL; + return a[tc].g; +} +#define stencilFetch(a, tc) stencilFetchBase(a, tc, _FILE_, __LINE__, get_name_##a) + +#if !SHADER_COMPILER_HLSL2021 +#define select(a, b, c) a ? b : c +#define or(a, b) a || b +#endif + +half3 h3nanofilter(half3 val) +{ +#if HALF_PRECISION + return min(val, 65504.h); +#else + return select(isfinite(dot(val, val)).xxx, val, half3(0, 0, 0)); +#endif +} + +#endifAz.\shaders\include\in_out.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAaNnj. AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAoAAaNnjAaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhAoAAaNnj멎AaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhA$͍L.,DkI(fAoAAaNnj. )AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAČ-.̍D*ȉjAoAAaNnj)AaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAoAAaNnj)M.LAaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAČ-nM mDkI(fAČ-dMDdIjAoAAaNnj. N J .lnAaAČ-nm.. Di**iAoAAaNnj. N J .lnnj-ͭAaAČ-nm.. Di**iAČ-Dͭ, nDDȉ(jA.͍Dͭ,ɍ,mlDDȉ(ɉ(ihjAoAAaNnjH̬AaAČ-m.. Dd m..mAČ-nM DI)iAČ-n.̍D*ȉjAČ-N oM DkIhAČ-nN DkI(fAoAAaNnjN J .lnAaAČ-m.. Dd m..mA-͍L-. .͍. DkIfAoAAaNnjNlͮAaAČ-m.. Dd m..mAČ-N oM DkIfAoAa>ͅk-Ln+m NLm- ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(|} I} =55=9}}5(|} I} =55=9}}5(4(Ց𐥙͕}ɑͱ4(Ցձ}ɑͱ4(Ց٥}ɑͱ4(4(͕5(%UM}15 IQ4(%UM}=I9}9eI4(%UM} UI1e4(%UM} UI1e}%a4(%UM} !94(4(I}%UM5(I}%UM%UM} UI1e}%a%UM}=I9}9eI%UM} UI1e%UM}=I9}9eI%UM} UI1e%UM}15 IQ4(5(4(4ɽсɥѥչѥ5(4(LA }} 1%994(LA }}  -5994(LA }}a4(4(I}MA }5(I}MA }LA }}a5(5(4(ɥѕՅѥɁ̡ݥ5(LA }}%5A1% %Q4(LA }}9U5994(LA }}-1594(LA }}M!1% -4(LA }}M5%Q!}a4(LA }}M5%Q!} =II1Q4(LA }}M5%Q!} =II1Q}AAI=a4(4(I}MA }5(I}MA }LA }}M5%Q!} =II1Q5(5(4(ɕ͹5(LA }}9=94(LA }}M!1% -4(LA }}IM914(I}MA }5(I}MA }LA }}M!1% -5(5(4(L5(L!9}MA U1I5(L!9}MA U1I4(5(4(̀I}͕͕̀ ɱсI՝ͱс8Yс81сX!4(5(I}%UM%UM}15 IQ5(ȕɹ͕1ѡ͕ Ɂ4(I}%UM%UM}=I9}9eI5(ȕɹ͕=ɕ9ɡ͕ ɱI՝ͱ8Y81X!4(I}%UM%UM} UI1e5(ȕɹ͕ ɱ塀͕ ɱI՝ͱ8Y81X!4(I}%UM%UM} UI1e}%a5(ȕɹ͕ ɱᕑ͕ ɱI՝ͱ8Y81X!4(I}%UM%UM} !95(ɽɁɕсI}͕ܥѡ8!5(ȕɹ4(5(5(4(̀I}͕͕̀ ɱсI՝ͱс8Yс81сX!с8!4(5(I}%UM%UM}15 IQ5(ȕɹ͕1ѡ͕ Ɂ4(I}%UM%UM}=I9}9eI5(ȕɹ͕=ɕ9ɡ͕ ɱI՝ͱ8Y81X!4(I}%UM%UM} UI1e5(ȕɹ͕ ɱ塀͕ ɱI՝ͱ8Y81X!4(I}%UM%UM} UI1e}%a5(ȕɹ͕ ɱᕑ͕ ɱI՝ͱ8Y81X!4(I}%UM%UM} !95(ȕɹ͕ ͕ ɱI՝ͩI՝ͱ8Y81X!8!4(5(5(4(сI}ɥѥс}с8!4(5(I}MA }LA }} 1%995(ȕɹɥѥ }8!4(I}MA }LA }}  -5995(ȕɹɥѥ }8!4(I}MA }LA }}a5(ȕɹɥѥa}8!4(5(5(4(X́Ш818Y4(сI}ɥYͥ塘с}с8Yс81сX!4(5(I}MA }LA }}%5A1% %Q5(ȕɹ%ѡ4(I}MA }LA }}9U5995(ȕɹ9յ8Y814(I}MA }LA }}-1595(ȕɹ-X!4(I}MA }LA }}M!1% -5(ȕɹM}8Y814(I}MA }LA }}M5%Q!}a5(ȕɹMѡ}8Y814(I}MA }LA }}M5%Q!} =II1Q5(ȕɹMѡ ɕѕ}8Y814(I}MA }LA }}M5%Q!} =II1Q}AAI=a5(ȕɹMѡ ɕѕɽᡀ}8Y814(5(5(4(̀I}ɕ͹̀ձ ɱсX!4(5(I}MA }4(ȕɹɕ͹9ձ Ɂ4(I}MA }4(ȕɹɕ͹Mձ ɱX!4(I}MA }4(ȕɹɕ͹ɕ͹ձ ɱX!4(5(5(4(̀I}ձɡс}с8Yс81сX!с8!̡Mɕѡ̡̀ ɥ4(5(сI}ɥѥ}8!4(сI}ɥYͥ塜}8Y81X!4(̀ȕձс4(4(ȕɹȕձ4(5(4(ɽ鼼ݹɽщѕѕѽͽмļ͕}ѕ}٥}ɽщѕ}ѽ}}ɸɥؕͥ՝4(сѕM=ͥс̅Ʌѕ}9Yс=с}4(5(ȕɹ̅Ʌѕݡ̅Ʌѕ}9Y=ɠظ}ĸĀ=4(5(}􀰥I՝ͩI՝5(4(}􀰥I՝ͩI՝5(̀хɑ I}9=}9=1с8Yс81͕͕̀ ɱ}I՝ͱ̀ձ ɱձMɕѡ̀ɱ̀إݱ̀ɵ̡̀ ɱсɅͱՍ4(5(LA U1I}%M 1I}%UM%UM}15 IQ5(ȕɹ͕1ѡ͕͕ ɥ4(͕5(̀ 􀸽ɵ镡إ݁ɥ4(с8!̅Ʌѕѡɵ 4(сX!̅Ʌѕѡإݱ 4(͕̀I}͕͕͕ ɱI՝ͱ8Y81X!4(LA U1I}%M 15(̀ձɁI}ձɡ}8Y81X!8!ɅͱՍ局̡ ɥձMɕѡ4(̀I}ɕ͹ձ ɱX!4(ȕɹ͕ձɥ4(͕5(ȕɹ͕4(5(5(5(4(̀хɑ Iс8Yс81͕͕̀ ɱ}I՝ͱ̀ձ ɱձMɕѡ̀ɱ̀إݱ̀ɵ̡̀ ɱсɅͱՍ4(5(ȕɹхɑ I}9=}9=18Y81͕͕ ɱ}I՝ͱձ ɱձMɕѡɱإݱɵ̡ ɱɅͱՍ奀814(5(4(̀хɑ I}9=}9=1с8Yс81͕͕̀ ɱ}I՝ͱ̀ձ ɱձMɕѡ̀ɱ̀إݱ̀ɵ4(5(ȕɹхɑ I}9=}9=18Y81͕͕ ɱ}I՝ͱձ ɱձMɕѡɱإݱɵ͠4(5(4(̀хɑ Iс8Yс81͕͕̀ ɱ}I՝ͱ̀ձ ɱձMɕѡ̀ɱ̀إݱ̀ɵ4(5(ȕɹхɑ I}9=}9=18Y81͕͕ ɱ}I՝ͱձ ɱձMɕѡɱإݱɵ͠814(5(4(P==8U܀T偌ٕܥѡѡɁ́Ɂᅵ̕ɥѥaձ}ɑͱ4(ԥсHٕ͕ Ƞԥсͥ4(5(́􀠈́ؤ́ؤ4(́􀠠́ԤĤ́Ĥ4(́􀠠̤́Ȥ́ Ȥ4(́􀠠́Ф́Ф4(́􀠠́ऀ́4(ȕɹ4(5(4(ɀ ͱԥсԥс84(5(ссŀɅѡ84(ссɀHٕ͕ Ƞȸ̔4(ȕɹɠŰɤ4(5(4(̀$хMaɀсɤ4(5(ссȸ@%4(ссQхѡĸ䥀ĸɀĸ䥤4(сс̥QхѡĸQхQх4(4(̀ 4( ̥Qх͡4( ̥Qх̥4( 􀌽Qх4(4(ȕɹ 4(5(4(с}aсɰс8!4(5(сс8!ɀ8!8!ĸ4(ȕɹɀ@%4(5(4(с$хAaсQхсɤ4(5(ȕɹQх}aɰQх4(5(4(сLձAс8!сɰсX!4(5(ȕɹ$хAa8!ɤиX!Ĥ4(5(4(с0յ̀ɥ4(5(ȕɹѡɱ͠ذȰȤ4(5(4(m}X.\shaders\include\shader_global.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAa$̍ d +)HI( iAa,ͭ d +)HI( i $AAa$m D-L.L심,ͭlm-MAA-NŌ-$,dON $L%lA-Ō-$,dON N%L%,eA-Ō-$,dON %L%,eA-NNˮlLŌ-N$,dON $L%lA-nNˮllŌ-n$,dON $L%lA-NˮlŌ-$,dON $L%lAA-NNŌ-N$,dON $L%lA-nNŌ-n$,dON $L%lA-NŌ-$,dON $L%lA-Ō-$,dON N%L%,eA-Ō-$,dON %L%,eA-.Ō-$,dON %L%,eA-Ō-$,dό-$L%lNnDN N%lAA- N - $,dON $L%lA-  - $,dON N %L%,eA-  - $,e- $'L%l$F'fDN $F%lAA-d- Ō-Ō-$+dDN - %Ll+&,%+eAA-n*̍M Ō-nĎČ-noJ)AaADN Jȉ.eAAA-no䨌J Ō-n)AaAČ-noJiAAČ-n +dLmnʼn)++eA +LeLmnʼn) +d j*ɉ*%%eA +M--M *eAAdmČ-nDM--M eLmnʼn*%eAADN Č-noI)%&-m $L쭎-mN.mmD,lMAČ-nD/AČ-n%D%%/AČ-nEDEE/%eAAA-no䨌J Ō-nĉČ-n*AaA +M--M +)D)eAdmČ-nDdLmnʼn*eAADN Č-noI)%&-m $L쭎-mN.mmD,lMAČ-nD/AČ-n%D%%/AČ-nEDEE/%eAAA--ͭ,L.MKŌ-D.쎨 Č-Nl썬심 -AaADN Dn l썬심 dl썬심 %DD.쎨 -eAAAa̍,l?2pC #+Jsc#+㚃+c #3sAccKc// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef SPECULAR_BRDF_HLSL +#define SPECULAR_BRDF_HLSL 1 + +#include + +// Microfacet specular = D*G*F / (4*NoL*NoV) = D*Vis*F +// Vis = G / (4*NoL*NoV) + +#ifndef INV_MIN_IOR +#define INV_MIN_IOR 50.0h +#endif + +// [Blinn 1977, "Models of light reflection for computer synthesized pictures"] +float distributionBlinn( float ggx_alpha, float NoH ) +{ + float m2 = ggx_alpha * ggx_alpha; + float n2 = 1 / m2 - 1; + return (n2+1) * clampedPow( NoH, n2*2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float distributionBeckmann( float ggx_alpha, float NoH ) +{ + float m2 = ggx_alpha * ggx_alpha; + float NoH2 = NoH * NoH; + return exp( (NoH2 - 1) / (m2 * NoH2) ) / (m2 * NoH2 * NoH2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// GGX / Trowbridge-Reitz +float distributionGGX( float ggx_alpha, float NoH ) +{ + float alpha2 = ggx_alpha * ggx_alpha; + float d = ( NoH * alpha2 - NoH ) * NoH + 1; // 2 mad + return alpha2 / max(1e-8, d*d );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// Anisotropic GGX, Disney +float distributionGGXaniso( float ggx_alphaX, float ggx_alphaY, float NoH, float3 H, float3 X, float3 Y ) +{ + float XoH = dot( X, H ); + float YoH = dot( Y, H ); + float d = XoH*XoH / pow2(ggx_alphaX) + YoH*YoH / pow2(ggx_alphaY) + NoH*NoH; + return 1 / max(1e-8, ggx_alphaX*ggx_alphaY * d*d );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//Ashikhmin +//https://knarkowicz.wordpress.com/2018/01/04/cloth-shading/ +float distributionCloth(float ggx_alpha, float NoH) +{ + float r2 = ggx_alpha * ggx_alpha; + float cos2h = NoH * NoH; + float sin2h = 1. - cos2h; + float sin4h = sin2h * sin2h; + return (sin4h + 4. * exp(-cos2h / (sin2h * r2))) / ((1. + 4. * r2) * sin4h);// division by Pi is ommited +} + +float geometryImplicit() +{ + return 0.25; +} + +float geometryNeumann( float NoV, float NoL ) +{ + return rcp( 4 * max( NoL, NoV ) +1e-5); +} + +float geometryCookTorrance(float NoH, float NoL, float NoV, float VoH, float ggx_alpha) +{ + float NdotL_clamped= max(NoL, 0.0); + float NdotV_clamped= max(NoV, 0.0); + float NoH_dov_VdotH = 2*NoH / VoH; + return min( min( NoH_dov_VdotH * NdotV_clamped, NoH_dov_VdotH * NdotL_clamped), 1.0); +} + +// [Kelemen 2001, "A microfacet based coupled specular-matte brdf model with importance sampling"] +float geometryKelemen( float VoH ) +{ + return rcp( 4 * VoH * VoH ); +} + +float geometrySchlick( float ggx_alpha, float NoV, float NoL ) +{ + float k = pow2( ggx_alpha ) * 0.5; + float geometrySchlickV = NoV * (1 - k) + k; + float geometrySchlickL = NoL * (1 - k) + k; + return 0.25 / ( geometrySchlickV * geometrySchlickL ); +} + +// Smith term for GGX +float geometrySmith( float ggx_alpha, float NoV, float NoL ) +{ + float a2 = pow2( ggx_alpha ); + + float geometrySmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 ); + float geometrySmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 ); + return rcp( geometrySmithV * geometrySmithL ); +} + +// Appoximation of correlated Smith term for GGX/Heitz +float geometrySmithCorrelated( float ggx_alpha, float NoV, float NoL ) +{ + float a2 = pow2( ggx_alpha ); + float geometrySmithV = NoL * sqrt (NoV*(NoV - NoV * a2) + a2 ); + float geometrySmithL = NoV * sqrt (NoL*(NoL - NoL * a2) + a2 ); + //float a = ggx_alpha; + //float geometrySmithV = NoL * ( NoV * ( 1 - a ) + a ); + //float geometrySmithL = NoV * ( NoL * ( 1 - a ) + a ); + return (0.5 * rcp( geometrySmithV + geometrySmithL )); +} + +// Appoximation of joint Smith term for GGX +// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"] +float geometrySmithCorrelatedApprox( float ggx_alpha, float NoV, float NoL ) +{ + float geometrySmithV = NoL * ( NoV * ( 1 - ggx_alpha ) + ggx_alpha ); + float geometrySmithL = NoV * ( NoL * ( 1 - ggx_alpha ) + ggx_alpha ); + return 0.5 * rcp( geometrySmithV + geometrySmithL ); +} + +//Ashikhmin +//https://knarkowicz.wordpress.com/2018/01/04/cloth-shading/ +float geometryCloth(float NoV, float NoL) +{ + return 1. / (4. * (NoL+ NoV - NoL * NoV)); +} + +float3 fresnelNone( float3 specularColor ) +{ + return specularColor; +} + +float3 fresnelSchlick( float3 specularColor, float VoH ) +{ + float Fc = pow5( 1 - VoH ); + + // Anything less than 2% is physically impossible and is instead considered to be shadowing + return saturate( INV_MIN_IOR * specularColor.g ) * Fc + (1 - Fc) * specularColor; + +} + +float3 F_SchlickRoughness(float3 F0, float VoH, float roughness) +{ + const float Fc = pow5(1 - VoH); + float invRough = 1.0 - roughness; + return F0 + (max(float3(invRough, invRough, invRough), F0) - F0) * Fc; +} + +float3 fresnelFresnel( float3 specularColor, float VoH ) +{ + float3 SpecularColorSqrt = sqrt( clamp( float3(0, 0, 0), float3(0.99, 0.99, 0.99), specularColor ) ); + float3 n = ( 1 + SpecularColorSqrt ) / ( 1 - SpecularColorSqrt ); + float3 g = sqrt( n*n + VoH*VoH - 1 ); + return 0.5 * pow2_vec3( (g - VoH) / (g + VoH) ) * ( 1 + pow2_vec3( ((g+VoH)*VoH - 1) / ((g-VoH)*VoH + 1) ) ); +} + +float3 getRoughReflectionVec(float3 R, float3 normal, float ggx_alpha)//alpha = pow2(linear_roughness) +{ + return lerp( normal, R, (1 - ggx_alpha) * ( sqrt(1 - ggx_alpha) + ggx_alpha ) ); +} + +#endif +SX]\\X[X[P\ WY[؛\WY[\YW[Y[XZYZYYY[ٜ :xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPhP ;k ys+kPhPxQiPq k+ +q kPkPq k+ ++s+kPkPyy!{s;i [+q++#q k+ +Aq љ+s+KKs+CK1Kc+I+#C #+{kKc+kPkPkPPyiPhPxyzkk{sAZY s#AbbJc{iPhP!+3Ks+*2 +*zriP!+3Ks+*r*j +bzZJ*iP!+3Ks+*j +*r2 +*J*iP!+3Ks+I +"J +r*j +2 +*J*iP!+3Ks+*2b*Jzrj +2 +*J*iP!+3Ks+*2b*Jzrj +jJzriPhP!+3Ks+q +j +ZJrrJr:zr*zriPhP!+3Ks+B +"Jr:rzj +biP!+3Ks+B +"Jr:*jJJ*iP!+3Ks+i +*jJJzrq1kPhP!+3Ks+9bz +b22**2J9jP!+3Ks+ʚ*j22**2JjPhPI3#+3cckPhPxyZYyscc{iPhP!+3Ks+Jr:J2JjbBKkP!+3Ks+Jr:J2BKJr:J2JjbBKiPhPp k+ +q љC #+"+3Ks+kPkP{s+Ã) cљKs;K+9b{ c33++3KJr:J2B9bz +b22**2JJiP{s+Ã) cљKs;K+ʛ+k33++3KJr:J2Bʚ*j22**2JJiPhPIscKs+{{cI;b{ c33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCC9b{ c33++3KKiPkPhPIscKs+{{cIʛ+k33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCCʛ+k33++3KKiPkPkPhP)c+yycckPhPxyAbbzscc{iPhP!+3Ks+zr +B+3Kcq k+K+3Kq k+kP!+3Ks+zr +B+3Kcq k+Kzr +B+3Kcq k+KiPhP!+3Ks+9bz +b22*Bq k+K33+zr +B9bz +b22**2Jbq k+KiP!+3Ks+ʚ*j22*Bq k+K33+zr +Bʚ*j22**2Jbq k+KiPhP)s#K3yycc l +-EZh}|PhI3FV&76VGVF[ yq +{{˃+{ kc+{+s+ ++{qqyqqy)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆEPaBH&5A@  6$tB&HaH!* 6%Bb)"!Q(!ڐ M  B ІDXmJHHHJȅ6$bBrSBb@BPB.!XHoJHHJȅ&6A@6ؐP N ]$DC%B)!"!*!p Ő ͐  ހ̔TPY6 %C:TBb@B;L  }M ՙMnBB=C%TB$Chr)!1*!*!`0s!!2:!"!`0Fe! hn0A@ +P6*+bFiB 6*T.bFiBR#6r DaB" +q$%F-4A@`B9#sF-4A@`B<#uF-4A@`B?#wF-4A@`Bb#yF-!9#;#=PцbCG? l@˔\]ڛ!1 B"mJhDڰ())))D&ɳA1ذP*)**)XɔUY!q&Hl6,%JJtJ$dJ%tJ! C+T3fAnFh4hC46 +^z4f6 ^XЛ[\X[ݸ- [FfxaaConsolePosPosDh,6! mD"KKKK$%܇oYp K rElr`s`Dn\m؄-30q "a^rLڦ%zhPC #{*k %;3477q "^)P0Yf`^p/a %@:L$Э@ 7q "#2_K0`6.BDED$Z&,DD؍KQ*+ +FcDFdC& I՝KHԸ^/ (K\Y]PXZQY\S]ٸ^1ȕѥYKd`\ȋĕD2= Kyx0` 5.BET?~ [Ը^`1a%@[ňе` !40/34q "6c1KsM`\ȎU< 9ȋKܸHЌKBиѱL٥ IKjA[T[]ڛ۸01A @>x!& A% dN@.M,̍Ňl.m\H/` r D$.@"x!r&f%&qa 0.BLJL \X[\ڸ3Q31 v8q "grbr` D$.ء%@I\I\ +#J33+zc{!r&o&&q!0.BLJL"q "gVbIKax`03!&f%&4a 0.BMJLh `\;691 90q "lbBP D$Ą&؁%@ɛ MKaH`\D %INppzC &&&:6/1ى%@|͉$q&t6.BTJLF"q "Vb2KH`\A"]k  +"n DP%# &3.@U? dDP `@4.@TMLJ"q "VqIa0.B$W?N" 5Zq "rqfoDre#%``4.@MDNL~ `\H/ r^\\㈍ͮͥ퍬Ō-ln;cͮ%̍nJ@;\\0;;S>>?s?\\-2<:24742)!s{+s ;2<27)A 9!s c+2<90272) +!s+{+%2<< 7707)2<$)0)(!s)s˃zKsyY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f091A8bp Q,&YL m1A8bpᘋ ¡c/&_Lܘ 1A8cp0 q=&G{L 1A8cp᠏ ±?&GL %2A8LdpP ",&GL /2A8dpሓ +CV&ǬLy 2A8epᰙ q3o&GL {3A8fp 7t&GLљ 3A8\gpဝ 1;v&GLۙ 3A8pgp ;|&GL 3A8gpp A>}&L 3A8jpᨫ QBÄ& M )4A8Vhpḡ ‘CÇ&M0 c4A8hpᘣ aG#&M? 4A8Hip0 qJ&+MX 4A8pipХ K&G8Ms 4A8iph O&>M| 4A8@jp 1R&JM 65A8pjpЩ ±S&OM e5A8jp !Z# `0p 3N@K# `@` A A98.0b a`f0 {0a$A/L# ` A A:9/0b ajP 0a$AC8(L# `0 +A A;:9„0b J>C9:_/# `C:C9L#`PC~ C )Ä0b Q>ЁR㘃9-j0 *ÌQ/-ߌ8 Dk0b ? +3Ёi `@ aphaƀ4i@ apPa1@"&n0F  v1& #!>3dOVB|& A0^! f ?pL#F  |:f ?PL#F  |a8f ?`L#F |a6& A0(hD_ `@ +v0a10%\!1 B1|1@&H1 1|1@&F0F ~4& A0(jB_  6ό +ip A>3(PO&|f PXL#,L1 D2|23aX01 D3|1@'T86D1 ҡv1@'R86B0F  ΁& A0(zBEs!D!4i@ H|a1@'P80F ‰f _BF  ?f ^A0(|Eth"hA0(|"Fth `@ +a1@'d@1 5Nj8B1 5Nj`ƀi.i@ +HAaƀHj.i@ +Axaƀ0H)@>3>\tCÌa04b Xq?0c@C54b X9?0c@CK A!:?C{?L#`PEC b;@Ä0b X9?0a A!.?C?L#`PE bQ;Ä0b X9?0a A!+?Ce `@ +hAzaƀ 'Xj@ +`Aza1@-Vl0F @0䡆Rf T¦F @ 0䡆P& A0(Gya `@ +Ad aƀ ,rj@ +Ada1@-~0F `"^@30THU1 L)3c@MAU-MY +1 T¦,baS#`Pŋ C 3DHX=R6m b%'XȠ 3aX|& !>3JAO `τ0b \h?0c@,5b \h?0a A12??L#`P̅,3K(=R6B&`)Uτ`s +0 L|& sA> 2 τ`Mg1@/t08\1 B 1@/r080F  L"p& A0(L `@ +$~aƀA0(G `@ +$~xa1@/t0\0F Lp& A0(G `@ +$~xa1@/00F 4L:& A0(M `@ +8$~Pa1@/00F  L2& A0(L `@ +$~`a1@/00F L5& Xό1m 4bQό1y  bZ n>3B/#` 1C^ÌaL/#`PyJ C^ Ä0b z x00b` zE0aXgBτ` `@ +(/^aƀA0(Tx `@ +/^8a18N=̂tcƀ؃0`4!& !0Fa1X>bAf =z10>"0,(3aPgτ0b Ep?0c@  i`Ä0b Ep?0a A?F-9?~0b Ep?0a A?F-0?LF +^Z!>B+g3ap0lL6|& f> `@ +6aƀA0(LVH `@ +y6a1XIDAE1 B`@ *Q`ƀ >3D(A/#`PHCZ3D( ,T"~!e0b @?0c@  T%"1 +N/|f Qz1@Ed _1 F`@ +6x`aƀ A0(XD"/ 7pi@ +6r@aƀȋ0 \1@E~\0F `_l#& A0(XDB |& A0X5zBDf )|f <@L3a2g18Lx#.pdƀ +|& A0>RLf ?F`M `4a& @>3XqW6|& @>)|f ?@L3a2g18NTc6dƀ +|& A0tFcLf RF`M `4a& tA>3)XqW6|& xA>)|f R@L3a2g18\>dƀ( +|& A0OZD\f UF`M `4a& A>3*XqW6|& A>)|f U@L3a2g18dDFeƀXri@ agPa1@"vؙ0F ;1 " #F`M `@ +g@aƀ >ri@ +g@haCόaopd >3Y} |& A0(p,ȥA0(pg! `@ +AlDXa1@w0F &|f `ЭA0^eE\A]EtDge' Эф0F Нf}f `حA0b'f҅\]؅tHe' حф0F ̦~f `A0fgf\]tLe' ф0F f `A0jf]^uP'f' ф0F f~f x#F f|& A0(a `@ +AmFa1h wz(nnfƀh >riĠ@  -ȥA0(-ȥA0(ħa `@ +mFa1@B|`0F ff `A0r'g]*^uXf' ф0F&aƀ >ri4&  L&0l3a&g1@B}bT1 l cF Pf A0(g9a `@ |!~mƀ ?k4!& 3>tG.g1@}j\1 l CF pff ХA0(ܧY `@ )~! oƀ ?ti4!& A0(DŽY".ȥA0(ৄY! `@ +!AoVa1X}ʦ)a1 B\10}h'1 "\1@B~Jd1 FC%\%f hn *A`@ )oTaƀ0A0ҧlewf SzM `4A& фA0Faƀ87`@ +IAtZaƀ8A0(i! `@ +9AtZXa1xH~eB&\|WTfmfmTfƀHф0F`M `@ 8q"pф0l?h>3*P~ |& τ`ýg_3aؐ/0lL6|& ~> 'TC0Ì +O/#`P  '4CÄ0b  ;8?0c@| AqB?Ng?0#"_#`PP C3L׈ 'DCÄ0b  ;4?0aG|f FDF @dgf KR όa׈ )4Ìaq*_1 9P`τ0b  +P;1?0c@D4"5b  +P;/?0c@2"5bp  3MH#"_#`pP1aeB/DŽ`&@aD%> J|& 4a +#"_6 0lH3a AAC3+A/7U|f xFD,03c@`gƀp#bF> 2# !>C|& 3L#`PQ3+H AFd?y?L#`PAgƀ62ό { |f X^, ~D>3,A/|f X؃^,83c@,`k&1 ` z@ 3c@`A"dA0(h9^F H#5& A0((9 o3c@B`gƀ4τ`g1@4R1 d`@ 6Z~0a1@4@0F h#yf AA0(H1!'EPl@ 6~0a1@p3@0F h#6f (AA0(h! `@ 6R~aRaAFa/b |f A1 a/bF:: B%>3,A/$1 ByљX0*1 dAz`όʋǂRό! z  |f P^L93aRg0fτ`gl3a060F %>Tf YHz1@P:r0F %=T& A0(@ɤB;yA0(@ɬByA0(@ɧBlF T& A0(@a `@ +P2Aaƀx`Ghl@ +P2Aaƀx`Ghx|3c@TގИLg0YLC?1">3D0 AqJ?Đ?U#46b )Cr?0a AqJ~?Đ?L#`PR1$Cgƀ`Ghl@ Qr`ƀ13 #46bp (P ֳ#4f"²1  AJ?ܐ?#4fgƀ`Gh̒ >%|f vF %Rtf /1@FС;0Lf#/fg0f3aXΈ|f lF z; +f  l3c@|g`#/fFl3a1g1@"V#?1 ja`@ \Raa1@"R#?0F ȥZƈf 10A0(r1A `@ \a`a1@"@#=1 09!dp`f#`PR*d3D`f#`ݒ t>-B-e &0 h L6 1 l!zτ`" `@ pzaaƀA0(ɕ5A `@ pjaa1@"\X>1 /F ֨& A0(‰5 `@ paaƀ 831@"X=0F 'h& A0(5".vLl@ praa1@"X#=0F `ƀ 831@"X;1 F '& A0(©5 `@ pBaf 39A0(ɬ5!1 F 'hf 39A0(i5A `@ pRaa1@"X#9".Ll@ p:af F 'f  6A0(©5A `@ pbaa1@"X#71 hb.؄F & A0( 5r `@ pzaaƀ `:1@"X60F ֨& A0(i5b!1 h"%؄F hf 6A0(ɯ5ZA `@ paa1@"PX#5&|Ml@ p2af p6A0(‰5B&Ml@ pZaa1@"X#40F `ƀ 6`:1@"X#3&€M^3c@&tf/0\> LC B0c@&t6b` 8Q0aXPg0τ`C! `@ ta(f `؄F HYa1@"d#60F `*'iAf ؄F *V +f ؄F XYeƀЉMl`@ s#}|)aƀ Ml@ sz`ƀ؉Ml@ vhf X؄F h'ZfƀrR1@4B rNJm@ vhf 1p;)A0(ډ;:1 F h'dƀ1R1@#3 `@ v& A0(ډ;*1 ZؓU1@1S=YA0(i;1 ?ؓU1@h0C=YA0( ;1 dOVVG3c@lߞ:b=Y5 ZG>3Ķ{j|f dF [hƀؒ=Y5{ό|f n d,3aXC1 lOVm@ z@f KRZ1@~Tl'f+gƀ=YA0(P1 dOVh^3c@xg'6b > J#?`3%ȭYgƀ@Enm@ |aBf S[ όáܚ|& 'f,gƀ=YA0(S21 dOV͂F>3ɪYgƀ=Y5 E>3\vRj&|& E> "5+<  A!R?Rۄ0b HJi?T "+ 3Hڈ "+ 3Hڈ "+ 3Hڈ "u+ 3Hpk#`P:4a2n#`Piaʸ|f 1PeF pZ11 Aq,όAZ|f 2Pe,3c@ʸYK1 @ PeF 8)rb)31 Aq όQۈ \!Jre0ʸgƀ(Um@ +2P$PA0(TJZ +A f sWiA0(T +ZA f sWiA0(TZA f s0WiA0(T +ZA f tH\_Pn2A|f uxWi7 BF>3: |f uWiA0R +BU͂όۈ 0.3:$n2|f uWi7K >3:*#bU͂>3:쁫ۈ T/J`*fgƀXUm@ +bWi7 PnO}f wx\F xi<1 Lb^όqڈ 98P3I0k#`PT<$L#`PT<$L|f 6A0(t*r +f `؄F Щx)90F Щx)60F Щ =1 NrF )ȩ;1 N1@B `1@B `0xr)a势 AS?{0c@X|f + TF x̉>1 ,NE@΂@>35*r 0F )y?1 R"3U3c@䊿Y= 1 Xr,8,A +o&|& G>|f ȃ\73Lv 0F 0|Q1 ~a:1@¬2`1@¬2`fόЙ9|& {L|f ؄L L|& ό1eq&gfA^gƀόq +m |f \^ X1 N zό | }!ޢ B>3)A/(1 p/z0\ XCd3c@ |f \^lj>|L!`"`$[r>3D.|X gƀ;`@ +ђ@^F X +]0F -X +Z0f b^*i8N`0< A0`Fkj1 x!` @ Zz& A0`Fk*0F z0pR9+kC #{ + !+{"A c33"!+{j"jr)K#B\YX\ّXYPVOPX\ّXY]ݛP L K^ >>BqӸ#>>b#9 >Bi#tM`]Ӻ>Btoumm#t]`]׼>Bvmе|#tm`]ߴ>Bm#t}(`]Q +>Bxn5Λ#tV*`]縡 +>BnеN#t+`] >Bzon#t-`]a >B|m5#t.`] >Bmu#t8`mӶ>Btn6͛#]V9`m׸m>BnжM#m6;`mۺ>Bvom#}<`m߼)>Bxm6~[#v=`m㻝>Bxov^[#Z`m>Bmж[!#H`mI>B{n6_'#J`m>B۽nv*#M6K`}ӹ>B4ow]/#]FL`}۵9>Bvnз;nзݛ5#}vM`}߹}>Bxm79#X`}i>Bmwi#vZ`}붩>BznзΛk#[`}>BR4n5l#u]V`H]׷>R׵nuy#um`H]۹>R6o]#u}&(`H]߻ +>R8m5~[#u)`H]} +>R׹mu[#u+`H] +>R:nԵ[#uӆ,`H]- >R׻n[#u.`H] >RR4m6}[#M8`Hmӽ=>R۵mv#]F:`Hm۵>R6nԶ[#};`Hm߷>R۷n#<`HmY>R۸n6#Ӧ>`Hm綹>R۹nv #6H`Hm>R;m~$#I`Hm}>R}mv[)#fJ`H}Ӵ>Rm7-#MK`H}׶>Runw[1A#mn4#m&M`H}ߴa>R߷n7n8#N`H}>Rymw[i#ӆZ`H}뷭>Rߺnnl#[`H}>Rb״7a5l#vM6`]׵>b5nuo#vmӆ`]۷>b׶nص[#v}(`]߹ +>b7o5^ۣ#vf)`]u +>b9mu~۩#v*`] +>b׺mصۯ#v&,`]% >b;n۴#vӦ-`] >b׼n5ۺ#v.`] >b=o6]#Mf8`mӻ5>b5mv}#]9`m׽>b۶mض[#m;`mߵ>b7n#V[`m>bznض!#I`mQ>bn6(#vJ`m>b=o7][+#MK`}ӻ>b5mw}0#]&L`}׽$>bM>bwm[8#FN`}㺥>bxownh#fZ`}뵥>b:nطm#f[`}>b߼m70#mvL`}۸ ;ӖL0xcƧ[i&;`|Z ἡHxoƧRNi:`|Z 嶅HmƧRi9`|Z iHnƧۢiF`|&0켍 {og_w`|&0m |nguX@|&pYiH`|&p5 \ng׾2Hcy@4FB@Yc:T3 b*Ad*AєpMyozknTQ/TQ(,0Q0zm + LTLn[5&?DED躭(,0Q0n + LTL^[eBd EN+BѤV`P4YUqMTD`w 1,< < 5@-/̳/̳ULoTO5QۃiH4a?DE/PatLDoTO5QۃY1UqMTD`pZD !LӘO5Q T@H08/ ?tqqMTD`<[`L̃nC=C9)=8;;C8A;C9I Ɓa hAAHƁA $D0P@ 0 + P@ |`@lt`(L 0 cXs'I^v8ҴCM>@4FBA&i(aYy"b'`"P@P{4E0,< q"9 ;D rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y``!@C +<  y0 h@0 2L &GC"J`$ʠ + +ʡ4 +@ +0@ +8ʣL 7(B(!hrJgh vg( 1yLFD oM $Efe%&,f&gl&eCLf@8  l p c+#{:3 6D!! pɵ}ՙmH"!6material_gbufFf`g@HTо6$R͡}͍}ѡ}ѕMjCr) LjPk&MN.,-m) nCqq ᰑ+3c+K{sk +ې GlF8', B)&:32 am@1 9+s+33+ d03  B YYX\X[X6 &pTڦ6  Ah8@q0A@6 7fV&7A "۠ t@u4vp900//:09 mP<"7Fv567FVE7Vff6WF7A +TA\2= 37147 u1$Q:h; s&FfVv67A +B +T)A\t&DAANB:h;[ۛ\]\]6(*PPMcwp)sKr+sK˛ ii )+†?X `@,lha0B-L@6@j),͍˔\]ڛ BAbP0 /*zz" gA  8 0p &SV_Target &l(tذ 0 !P C9\`9Ʌ0c{ a"mnn@/62sig_st<Е}ɵKs0 =\PCVͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJ\ʂP u\ȦʦP ϥ̍N.-͍nnJ]\yY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f09C=C9)=8;;C8A;C9I Ɓa hAAHƁA $D0P@ 0 + P@ |`@lt`(L 0 cXs'I^v8ҴCM>@4FBA&i(aYy"b'`"P@P{4E0,< q"9 ;D rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y``!@C +<  y0 h@0 2L &GC"J` J + +ʃ(B(qJg wB 8yLFD oM $Efe%&,f&gl&eCLf@8 a0(MhÀ$a >" p6$φdXbِ4 C4CC<bڐL CLCC<ڐT CCC< lH.!" I15\ij"2ma0A 14t `@\cb` `BCL 6 C01  `bp8( ALTSX)/47 BM +mC@LmPp 8 BU5$E4A( 4mX:p9:`; 0 +;+ 6lXP\\V  +M666427)AP ŮLn.mJ@4!s c+u\ئI2<:)!sK+K" +A2<27:<47)yY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f09&| 1X$Z@`@ 8u Dc!C@>|F  r#$>9@> A VE|,3bp L*F|(Q1XG' Z^Xψ D;Q  l>6m #6A`!>6V́+` sA>6|lP 1QX XXp 3bp X[C*hB&h &È `r 0  0@ #`݅H\&h& h1' s1 B00 `&A0BC&+1@M4fbх:fq1@4lB҂A0L&_,Pcg@ Љ F @S!qd A0Z'01F @s!5}Lc@A0h'A5F`4AF#>6ψ < B0b` QxE`E +X1g@ 0X ~фMфA1XG=bAF  R,(cB! +)B|Z!>F +A>6܃|l0 ac,g`@ w`u`e@ "ψ <1]ֈ Dk 0 3bp ~MhB&h pD>6$18LDZ'c4!F`4alhc#ؠ>6(18En,Fd4!F`4alc%02ǔ> 18F#.Xd4!F`4ac;#22 B006|lPذ18L/|d4!F`4alx!cؠg@ 07ɏфMфAcC=)|LcA0dDfcNF`4AF>v cψ `"q' 0  `*V A0L%FGF`4AFX fA>6(A +|F Y4M!MtA>6|l2ǔ> 18LWʤ>d4!F`4ac;.l|2 B006|lp18 ]dDHe4!F`4al@cؠg@ 0y!фMфAcC?)|LcA0Tn$WF`4AF>v cψ D(/È D)/È D*/p'71 G wB|5Z#`Lɴ D1c2m0b` ̜L G yB|p'W:b` δ-A3.s #`p*71 + G B|5Z#`M̈́Ĉ Dac3!1b` LH G B|p*W:0M7h c*t* t* t* tC; tC; tC; tL tL tL tCɴL725`23bp K 0 DhB!&|cg8"e`@ A\ɛфM;!Lj>F$1xtj\ąE]@t`&MA0hNf҅\]EtDGfф1x&urf]8]HthMA0hVgg]^tLfф1hu(^^eĠ@ ! z{A0h^g]*^EuTGgфMj0 |lcA0hnl^_EvdGlф0ハ|F ٝ|۱F``@ Qv&fbf@ "a``AłA0~Gm%wF`4AFa4F AA _M!MA0gnHnFfc3p/_cC ?>6 XǂA>#`01bp λ#`0aؠdžC>6 ! P񱠈M X31"fcǐ!>v 1cA2|, ~D>|,8ck&@ cA"Б3#bF>6| tT&>#` |,c3 TcAS XL|,(XǔC>1f f>6 |gG>3##~>'#A03 G8 #KX"DŽ 7##nF>3$$A0J3 >f I!<AJ8>qȐ P0 B006  |\>v.;xψ #`0)Q`G@D>2A|,Xg@ r#K >|,3b` QIR`ǂ>&G},xcA cA  X0T!ɑ G>&|l8X1nj>v f9|cj0` y! B>1b/c^D>v|, Xp&cǒ|lj>|L!X |&cǖ|f A2*fp.` @ 2jF +j)a @ 2j+ +F +j ++\€[qyBDXBC+Fj XOl. DT 'H'd'SFI0ISG14(SV_VertexIDOSG1`HTSV_PositionTEXCOORDPSV04 + TEXCOORDVSMainADD_ILDB`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Lt#%@`1RsA @19-bG ?a!F+1m#b3\=@3, +^!܁b)Ykќ#:F $4-Pn?+ QEADHtrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GC:EPeP#Q P%Q AJ`$ʠ  =@{XCyLFL.mm=271 30:Bvector X12@ E f%`0["hV`APelementIؔ}չqHscdVpI&A`@B aFGCȮlMnj-g4A` "h!! "h8!! "h> 1); + float2 xy = inds * float2(2, -2) + float2(-1, 1); + output.worldPos = float4(xy.x * 10000, 0, xy.y * 10000, 1.0f); + + output.pos = mul(vp, output.worldPos); + + return output; +} + + +float gridTextureGradBox(in float2 p, in float2 ddx, in float2 ddy) +{ + const float N = 100.0f; + // filter kernel + float2 w = max(abs(ddx), abs(ddy)) + 0.01f; + p += 0.5f / N; // middle line offset + + float2 a = p + 0.5 * w; + float2 b = p - 0.5 * w; + float2 i = (floor(a) + min(frac(a) * N, 1.0) - + floor(b) - min(frac(b) * N, 1.0)) / (N * w); + return (1.0 - i.x) * (1.0 - i.y); +} + + +float4 PSMain( PS_IN input ) : SV_Target +{ + float level = log10(abs(worldViewPos.y)); + float alpha = level < 1.0f ? 0.0f : 1.0f - frac(level); + + level = clamp(floor(level), 0.0f, 4.0f); + + float2 uv = input.worldPos.xz; + float2 dx = ddx(uv); + float2 dy = ddy(uv); + + float scale0 = pow(0.1f, level); + float t0 = 1.0f - gridTextureGradBox(uv * scale0, dx * scale0, dy * scale0); + + float scale1 = pow(0.1f, level-1); + float t1 = 1.0f - gridTextureGradBox(uv * scale1, dx * scale1, dy * scale1); + + float t = lerp(t0, t1, alpha); + float3 color = float3(1.0f, 1.0f, 1.0f); + + float g = 0.01 * pow(10.0f, level); + if (abs(input.worldPos.x) < g) + color = float3(1.0f, 0.0f, 0.0f); + if (abs(input.worldPos.z) < g) + color = float3(0.0f, 0.0f, 1.0f); + + return float4(color, t); +} +@xD:\NauPrototype\samples\sceneBase\..\..\engine\core\modules\render\include\nau\shaders\shader_defines.htd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAAaN.- mAAEA-l.l -AaA-l.l dṋAdA-l ĭl -l.l -NGgṋ,d.m -m, $mn D,d-Ld .LAAAAAAd譭 ehe$̍ i)DmlͥAAa,ͭ dJ(hkʉ +ĦAa,ͭ dhkJ)jKihk*IAa,ͭ dJ)(hk*I$FAa,ͭ $IJ*()i)(hk*I$FAa,ͭ DȈh*)(hk*I&FAa,ͭ DȈh*)) kʉ +$AAa,ͭ ))kj))Kɩhkʉ +$FAAa,ͭ d +)(I) Aa,ͭ d +)(諨)ij*ɪdAa,ͭ )뫨)ij* ƬAAa,ͭ I(KȨH J( HAa,ͭ d*kKȨH J( dJAAa$͌ k nnAAdhe͍-DmlͥAAa,ͭ dJ*((+ /dAa,ͭ dJ*(( /dJ*((+ /AA-l.l -NGg-L,ͭlAaAdm N,lMGgN..M,M̬LJ, dJ*(( I(KȨH J( +eAdm N,lMGgN..d*oM̬LJ, dJ*(( e*kKȨH J( +eAA$͍-ͭ D $mM,M̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. M,M̬LJ, /eAAA$͍-ͭ D $mn*oM̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. e*oM̬LJ, /eAAAAam k nnAAi͍-DmlͥAAa,ͭ di( N, -,N, od-Aa,ͭ di( +N, -,di( N, -,AAa,ͭ I(kHȨH +-,dL̬Ldi( +I(KȨH J( -,Aa,ͭ d*kkHȨH +-,dL̬Ldi( +e*kKȨH J( -,AAa̍, k nnn@!(Qha7eC%ZYK[YmH)J.e. leṋL(l,ͭeM퍬lE̍L%m-e-LnCV62/23-WX|8|Ї}} X6"1 DIP ͆$Pb$&GHkj̭L̬Lnp8P 6-&Z7A8 m0Pa$bB&6 a6 (MCMĄLlXb&lb00q ANlDtb}2eeU&GWD4A@ BmFbTw HOEXHHXlȂ˔\]ڛ&5A@ !mA-6,#aga"#!kAkIhdhp H  [l. EA\@!l\̅`A x bw!`n' F67.@B.XG=: 0u E[G=`z4`l' @O#0fB&v2V7%PFllvm.module.flagsSvx*llvm.identSxD2V'7V2FWF77EzhD2V'7VBVfV67%j̽ɍ9M [XKܔ$ؕͥM F ]]ܔ$̡5M P \[Xܔ%*хѥMnB'إ%MхѕM xK\[ܔ .yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<#mpK(5=mpOD4!@m[,WBa A, +DFBq]P5F0x8c 0 +c &KL8 ,r0AX`aI +# ``}1b Ie A?0?0c@X#`PL?b@b3pB pƀ +@' V0b `Ì1v A?D?0agƀ L6(1 8: > tC30b P`Ä0b PPÄ0b P0Ä0bp QHehBL B0a& „0@  DvpAq0a&0 h L 0aA\uhBL B0a& „0@ I|f O`@ &P% +& 3LVA0F `3``΄`$ `@ &SH +& LQ0F `J6`΄0b +9?0c@`#`PBp @Ä0b +9?0a$ +oP +ʌ# `B)1a$ +oP +pĄ0b L+A)BA 0P +{M# `B)L# `B)7a$ +o` +u0a@ T|&0Vd|&0Դ- ! XUD UDSTATX`DXIL@BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L %2"H d""ㄡL Lh#%`)cAe`A˟|nq9D.BCjAgs`I #GGsب "$TK7rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC%0P PPQEP QUDJFJ +(3yLFD oM $Efe%&,f&gl&eCLc0  €l `#22:32 l@e!6`pudȬ&2A Lf08$, +vp0XV6A BmP,Ӥm(n\݆ l6 D@ 6 !6e@j),͍˔՗U]^&! &ĵA ikl72e6F6A Mm0D6,ā s@A*zz" ۆe8`5a6  P0c{ 49 0јK;b#1v5G7A(uints>?PDaHAfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%p*хѥM1CbVvD6EFW6%(:dx.entryPointsS=B2VFW&77% yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<#mpK(5=mpOD4!@mILDN,$a7837464e658edc0af148005f409765e.pdbHASHtdX v^DXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L %2"H d""ㄡL Lh#%`)cAe`A˟|nq9D.BCjAgs`I #GGsب "$TK7rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@ 2L &GC%0PPePDJFJ +Pk_yWLFD oM $Efe%&,f&gl&eCLc0 a0(MdÀ$LeB, A !p6Da5e˪L /h@4 A6,De]X6\Dm8.SV_Position &A`Bx`a0"') 1mX22 01 l:46Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +Du\iyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<#mpK(5=mpOD4!@ma bA, 4JʮJn1p@1#AĿ1t # ` uȳmƈA bpTj SF 򱠁 | 3bp T&h& h1At 0  0@ #`Wy 0  0@ &91@'@3Xg@ >H +,@c$A0x +@m|F 7:# `B(2b )A(# `B(1b )A(# `B(7b )ȁ(A   +u$b +r +phDXBCp)U +KLC DT,2889SFI0ISG1`HTSV_PositionTEXCOORDOSG14(@SV_TargetPSV04 + TEXCOORDPSMainDDDILDBX0` DXIL@0BC! #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L +2" d##ㄡL L@ +@@ 3s`0G@$AH) HrS9)āAG ?a!F+1m#8{˟h@T bPH ađe#M 9 +DClTQT@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q``!Y 2L &GCJ +2("(( ((R(JJ +a#A?f o,!kA?AAĿAA?y!L d!19K#sAcc4@ oM $Efe%&,f&gl&e@Ì-n]ݛ[ Ȍ<float{ 0b4P +X` E ,B)`  E 4B)` ( AaelementJؔ}չqHscd0$Vp Q!&A`,bJfloat4xX@h|1@sI$`,bf2H `1@I$`0 1@ I$`0`( +$J 6La 0021 P!3PSMain,8-bF  $"worldPosa!z3 0 AL) @ 6f  aJgridTextureGradBoxl3422<:#027< &179&  -float2xX@d|1@sz 0Y= `y0A@i&Ap(,;`@atP l@ܽɱYA-b30qs&FfVv6t$55VV&TgfV&4cCbW6F&D3$mLAHJ30:<Nmatrixbb1@ + 0bd1@ +  E мC` ++f4 (pY,J<$` 1dd1@S  X /E ܂C`Kf4 (pY.J<$` 2fd1@   E C`*kf4 (pY8J<$` 3hd1@S  /E МC`:዆f4 (lX`AhpAxAAȽ}չM+8`J }չM+8pJ 6 Q;$TAPXV* +"0y?vp@GB_SceneBuffer@@3V?$matrix@M$03$03@@B@Pe8-b3Hm +fpAS|0B>09327 P"*;Ir3{*K{s0A?T; ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(Ց̡}͹4(4(4(1= 1} UIL ՙɥȕѕɡ4(5(рܽɱYA4(р4(5(4(4(Սс@M}%95(5($р́LY}A=M%Q%=94(рܽɱÁPa ==I4(4(4(4(4(@M}%9XM5ԥсLY}Yѕ%4(5($@M}%9с@M}%94($4(ɀ́􀘱ɠİȤĤ4(ɀ􀤹́ɠȰȤɠİĤ4(ѹܽɱÁ􀘱Ѡ䁨ĸ4(4(ѹ́ձѹܽɱAͥ4($4($ȕɹ4(5(4(4(сɥQɕɅ ᡤɀɀ᱀ɀ4(5(сс84(ѕɁɹ5(ɀ܁􀴅ᡄ͡ᥰ͡奤Ę4(Ԙ8퀼͕5(4(ɀԀ4(ɀԀ4(ɀ􀠘ɡɅ8ĸ4(ɡɅ8ĸ8ܥ4(ȕɹĸीĸ4(5(4(4(р@M5@M}%9сLY}Qɝ5(5(сٕ􀰽ܽ͡ɱYA͹䥤4(с􀰕ٕĸĸɅٕ4(4(ٕ􀌱ɡٕи4(4(ɀف􀤹ѹܽɱA͹4(ɀ􀐑٥4(ɀ􀐑٥4(4(с̍ݡĘٕ4(сĸɥQɕɅ ف̍ၨ̍偨̍4(4(с̍ŀݡĘٕĤ4(сŀĸɥQɕɅ ف̍Űၨ̍Ű偨̍Ť4(4(сЁ􀰕Ű4(̀Ɂ􀘱͠ĸĸĸ4(4(сĀݡٕ4(͡ѹܽɱA͹ी4(Ɂ􀘱͠ĸ4(͡ѹܽɱA͹襀4(Ɂ􀘱͠ĸ4(4(ȕɹѠɱХ4(5(l9p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 HĆ RDܗ $>shaders/include":(77<68222477:27241:9029-ZilZȾ8\amXL N%RB%Rb%X%\b0 DLLg3Ann< t#22:32 m@b'r"&b&tx p& Rb'b bdڀ*XTc`aЉ CLDYlb 6ga 9@ mԂ˔\]ڛ!&ɵ! BMllnppq*zz" $6U]lX`b.".ނ.`.`".b wd*Ln  T{ah x A_l/ _" n\0o'@ @O`++c 2!AEZظ9@ Pg7.@dTCЃ?u#0@7.@d\C؃? +dyD6>17V3.@ddC8KBddx DD62`7.BDrC ?q " h l\( %ol m\(`%́x0q "s@B($Тp!q "sp($n\@ + Lc1&7.@dC( KN!YE0*$0 ±#0Us B2A0fB&v2V7%Gllvm.module.flagsS}+llvm.identSD2V'7V2FWF77EpD2V'7VBVfV67%l̽ɍ9M H[XKܔ%ؕͥM b ]]ܔ`&̡5M l \[Xܔ',хѥM-إ%MхѕM K\[ܔ/yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` @; a~qf <PEAD %amp LD4B4\ bP_ܶ T;/MNDP_ܶ<;O5@m[,WBa C,D5@I R.eWrP3RFR6D>i c / `0F(~cl%8 קލx}005c&LP 0A8PapP ± +&+LW 0A8bapᘅ A c&/L^ 0A8ap A&?L %1A8Lbp@ ‘C%&JL 31A8hbp ‘C'&NL u1A8Bbp 4&iL# `m׌1# `AA4a A?h?0a$ro ҄0b Ä0b Ä0bp \u0 8{Q#`u0`# `@ PX aƀe oƀlY!f ;10,aƀ8 όan0,0c@4@!0a AQ +? ?v0b` (`Ō#`<34s4 +Y`M#`Pg@3D,s A +??z0b *p?0aS +`{0b` )3a A +?A ?{0b *?0as +c|0b` *4a A +?A"?|0b +?0aXgƀjA0pTa `@ +W Haƀe p +s@gόz0|& +0sg1@lT1 D6F Z & A0(h9A @lc@ +ZaHa1@d~T1 Ȁ D6F X& A0pb 0a 5ό(؆k >3H`&0F ]Bf 5`D6F \B& 3l mAg1@tt1 ؀1@rr0F  ; f 6D6F < & A0pA @lc@ rc03c@m0F 2>`aƀhNlc@ s!& mmg10gB1 10D03c@m!g10L1 10N0Ln``&|& A0^1 @18hRA !>3``0 DA>3؁(؆(g0Bόq +a@ `@ +~aƀhFlc@ +~a0r3c@A$ +a gƀxOlA>3``vA|f ?1@B$1 `@3c@`,gƀjA0pBB `@ aƀe @>3(&|& @>3(F|& +^A>3(f|& A0(Vbu! @Ac@ Aa1@b%PB1 D3D( `@ $f 6D3Dȁ(B|& A0p̢ 3D`B|f 7D<,3c@& +1b ^p?0c@2A9,L|& A0(B9F  tf R`0z` `0b` N^D0aXp1 N`@ +'baƀ8eA0p.Hbƀ@>@ >F ~f R`nH f TH1@"4b 1 J`@ ,la10/$f UH +1 T`@ рA,paƀ(fH`ƀPd*0\b- `- b1@40 1 J`@ ,xa1@40 l0F ) ؋x bƀhbA0`J.b/B0F ) ؋p`1H4b/". ' p 4m5Ml#tM&`]Ӹ>B״nQиnS8o[9m]йm_9naйnc:miкmm:nqкnu:oy;m{лm};nлn;oRm5[m#uM&UHFUHUHUHVH&VHFVHצVHVH&WHfWHWHWHWHvPHPHPH6PHVPHvPHPHPHPHVPHPHtDTDRqIDltDTD!RqIl4xcw=wmw=m?ħH9HumƧRmciT`|Z ո H]HmXƧ[idfe|Z ٺ \`|&pݼE \woYgD|&ҘkHs`|&ܹ4ng"ͽ۝Hӆg|&൭4mlg" ~E_$Թ_$Ժ_$Խ_$ش_$ܶ@|gEn XUD UDd@Cf Xg:T3 R Ի)C5 5oeP7]:T3 bf v  D>#(8_m,N>Rq"8STAT`DXIL|BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L &2"H d""ㄡL Lp#%f`) BR2 2Hb15\=sU1ƠrpͰ(xpsA1 )LĐÑjg!6( SNrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0`,2L &GC"%0P PPQEP PPTJ +a +f P =@{,!yLFD oM $Efe%&,f&gl&eCLc@   l h#22:32 l@e!6`udȬ&2A L&n@8٠ DLUY; mK ɴM&j`݆ l6 D@ 6 a6e@j),͍˔\]ڛ&ŵ! &6A( ikm*zz" 6RlX7H6X8`h9 0 +;+ 6lX:H;X6؀h<P sC+aF77A (insts1vFFc.kE]?PQF" +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔDBWFF67EƠ]Z]]]ٔ ṔAM []ܔyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` @; a~qV <PEAD %amp LD4BX4\ bP_ܶ T;/MNDP_ܶ <;O5@mILDN,$844de31f76af98d957feec088f2fb8d3.pdbHASHMvW/DXIL, +`DXIL +BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L &2"H d""ㄡL Lt#%f`) BR2 2Hb15\=sU1ƠrpͰ(xpsA1 )LĐÑjg!6( SN2rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0`,2L &GC"%0PPeP +A$ʠF@HKAxyVLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$ALeB, A !p6D5e m..mP<" ҆ ˆ"TEXCOORDb h6޷a8Kú!40 lad*LnPP xea!"L2B3 l DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+i c 7Fwc*^70F ̆ # `@Aաd# ``iM# ``jQ#`A6hB"k2]`# !Y!F @K%,0P1Y1bp Lp4bp h5b`  +3b` J3b` 4b` d&A0PB  @D>F |F @AP0F @IQ0F @QQ0F @YR0F Y7A0`X „2 fS>|X1 | cA0PpA0Pr!A0PtaA0Pv @>&ȁ|F >`@ _aL@cA0PAA0Pa#!g@ s8h@ s@Ȅ> ~ A0`!?18FTAC"`c`@ +1B})@BۃY A0Pa @>&|lc+g@ c@ c@ c@ c@ (18f$A L 1c +8q @ ">f10%ށ10&10%&10E&0cB:g@ !F z>& 10%'10E'1BB|F @ F @LP18,@BA0`"${0D!B| A> #!A cA%3b`  +\D`Jg@ X nP F @ 0ሠ 醖X +a^%0A0@"..؂1H/.,A0@".."1H/.-DXBCk*տc 0 " (yLFD%.mm=271 30:Bvector X12@ E %`0[" Z`@o4h ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A`@B@ lDҾX=q{['\p@Ύ[ !17930:E  0YD 00 APl&4@XM(H7E д`a6pI0yB<1@ ( !50XMl  9:S@l6 pX5By@81c{ F'cFBB+&f4 吀+Ff4 吀pY(H9$`0bh1@S +R 8 /E МC`KFf4 吀pY*H9$`1dh1@ +R x E мC`"kFf4 吀pY,H9$`2fh1@S R  /E ܂C`2Ff4 吀pY.H9$`3hh1@ R  DLT\dlt|[ݴp.&col_count +6 S8$@@~XVP"0s?mvp@GB_SceneBuffer@@3V?$matrix@M$03$03@@B8Еᑣ*ã+!+{1c{ cY6!`I X hꇄ NLĮlMf(h܃:6862SamplerState `0 ̅TMMхѕm[{zy0<è'  =`Ct&gbU&7a8|(՝$XͥMdp2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР06VGV"2FV&EVfV6&ҠРp$5$TedT$25VV&TgfV&"Wv6GW&"ҠנbFGGfӠзӠР@UGW'W&CBW"Wv6GW&BӠ0V&7EFW2"Wv6GW&2ӠР0G'W7Fb5WGננbF'64DӠbF'RgBU5$EӠbFG22$ӠзӠР0G'W7Fb5TGWGננbFG62e4DӠbF'RgBU5$EӠbFG22$ӠзӠРР`5TGWGvVe7b5WGbҠנb5TGWGӠ6VdžfbFGb6炗bbӠRgbRgӠ2b2"v&Bv&2W&G7bW&GW2&"t$b&F"VGvT2WǖV6F6"u$Ԡ"WFW'ӠנРР`FGvV7b5TGWG2eE&wVFננ"WFW'2BW2V2RgӠנРA@V%FFW5V657VV&6WUvV5&WFVV6%WFV&Ǖ6VGVV5FV&75FV&EVfV6F^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@^T@@@@@@@@@@@@@@@@@@@^^@N@@@@PttR@@@@@@@@@@@@T^^^@@PVV@@R@\F@@lF@@pF@@b`dhF@@bdpF@@jbdF@@b`F@@bdpF@@`F@@fF@@h\`F@@F@@F@^^@VV@@\F@PR@FF@PR@PR@tt@@@@@ttξ@؄@z@PRv@@@@@ttξ@ڄ@z@PRv@@@@@@؄Pttξ@R@@@@@@@@@@@@@\P؄Rv@@@@@@@@@@ڄPttξ@R@@@@@@@@@@@@@\PڄRv@@@@F@^^@^^@@\F@PX@R@FFF@PX@R@PX@RF@PR@@PX@RF@PR@@PX@RF@^^@6 BK*vs_6_0Z̡ͽՑt^^^ʄ^\\^\\^^^^^^^8hi*k+#"+;ra!$L$P$RB%V%&2A@ Ka6.&Ha x †9+s+33+ %l&^%\' ANl @' vm &3A@ M>O'b< Xl\"be 4D4AH B2m^bP}؇ KEZZKKE[*zz"ڰ[ZZ[Z'' BRMhsa9H X p 8 [E]pzKK{s $ֆ%"-b-%%Ԃ.6,.ik..ma9H X p 8 C^^l/ Et}q "zBgz$`X: u %Ai: @O#0XG=`zD`A66623)=4bcksi{#c+s1c ;">TacksI#+sC%2<:27727)?D#2<:224)P eNn̥-,()lJ u\\,Q ŮLn.mJM\1Q e-L鍬mJ@e\:Q υ.,..mndQ ..l.lJ`u\}yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q F <PEAD %amp LD4B4\ bP_ܶ T;/MNDP_ܶH;?фmW8R1~,a dA,DF @q]Q*#0 c &L2 f0A8`pH ¡&LQ # ``qs]mz$܆ADŽ0b @Ä0b t\F  dbA (cuZL#`P̹?L# `m2a Aa?4?0a$R`q2a Aq?8?0c@|# `Axݦ hC30b Y͌mz A?@?0a$c}3a A?D?0a A?D?0a A?D?0a A?D?0a A?D?0a A?D?0a A?D?0aAtM3/) DT0t"""SFI0ISG1ht}SV_PositionTEXCOORDCOLOROSG14(@SV_TargetPSV0 4TEXCOORDCOLORimgui_psDB +DDILDB`nDXILBC! e #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + c9 <yLFD%.mm=271 /9float4xX@h|0c{ cdAdS `F@6 "h0PwdS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X@j"h_P @a8|,b0p_21 $×"hDA@|A0%3R_P @c8|,b0_31A D׌"hTA@|A053V_P @e8|,b0p_41 d"hdA@|A0E3Z_P @g8|,b0 PAA(B)B*B+B,B-:7ipaLؾ…m(]I ܁,;E `p ~ʄ䀀f~HH`fH`f-C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePP,TJ +a + c9 <yLFD oM $Efe%&,f&gl&eCLb@  ql X2 Ld@4BYb`gCL\X$`C0m &0׵!6 M2kCIk;K2e6F6A( Bl BMhBx b@@kIhPHB lX2 `0a ЀӓX6gF 13Ā60A)/02 B1mX7 `b `C7`CausP4&"mnn@44ξh̥}+r{k۠ԁvC666427)AP ŮLn.mJ@4!s c+u\ئH2<:)U υ.,..mnJ!sK+K" +lu\sЅ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq F <D@3,L;8 65m4\< mpK(5=m?ILDN,$2d787990ff6aedfd5f3373081740e84a.pdbHASH-xyj_3s@JDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@<@ ybLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hQBbb dՆ /9.SV_Position Ά 6,q7x*zz" X6c0! A X =1=IMf0gai`:1C A0 +;+ ҆X o 6maP76XPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ@!sK+K" +Xu\oyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq F <D@3,L;8 65m4\< mpK(5=m?a ;A,FB)\Q)3# `iaȈA @[eY2b Ƈ\$ ʈA ad\$!ÜA c|Ռ$A |3b ,!I`$ 0  0@ F,1b|X3b HXi1b HXi0b HXi0b HXia DXBC2T(Let B DTll2T999SFI0ISG1hqxPOSITIONNORMALTEXCOORDOSG1htz SV_PositionCOLORTEXCOORDPSV0(4) 0POSITIONNORMALTEXCOORDCOLORTEXCOORDVSMainC +CBDD BpppILDB/` DXIL/BC! #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L -2" d##ㄡL L@ +@@ 3s`0G@$AH) HrS98rp A8 '!$ۨb%&mDqPrpͰ( +A!BW)8bXH qđe#M 9 +DClTQ +>rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C <d2L &GCJ +B(2(( ((JJb 1A#pbxx@yLFD.틮 mm=271 30:Bvector X12@ E B%`0["TZ`@o4Pi ( E H `1@U$`0;< ʹ҃ ´ @p`Xt T@ ?0ۛ\["h@;H 1@SB +o +`aPI0GAHa0AU tdp +lPC30:<Nmatrixbb1@ +B4 0bd1@ +B4  E ĂC` ++f4 DpYM-<$` 1dd1@s B4 X /E C`Kf4 DpYM/<$` 2fd1@ B4  E ЄC`*kf4 DpYM9<$` 3hd1@sB4  /E ФC`:዆f4 Dl\dlt|āԁȽ}չM+8pb25VF7k0Cshaders/include":(77<68222477:27241:9029-ZilZȾ8\amXࢋ Lg{1A@ ^ m4b#22:32 "m@B4Fc/B/HL a5 6 +kz` ^Fkl 6aЋS t 4D4AH Brmb`=P ^Fmm؆^^Fnpzj +bڰnԆm܆mnm"') Bm@6,kaazk`a .SV_PositionD AcòQqQ,6,zqaz1zaaYި ۸ X yGzlC= )tq:::q "&zD`47:q "F +z`H: u#0XG=`z<`(34:q ",̬nl\* ¡uacks!;sE#6667:23)XE666427)AYT"s{+s{s+s2ZE#2<:224)P eNn̥-,()lJu\\xQ ŮLn.mJM\}Q e-L鍬mJe\Q υ.,..mnQ ..l.lJ u\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q &` @; a~qv <PEAD %am p LD4B3\3~q&0 <<mpK(5=mpOD4!@m[3\TD_ܶ8R1~,a A,D6@I RF%Sr0P\eWntsAk9 0F x  +0 &L8 r0A8`pᨃ a&GL? 0A8tap a# `R}3c@`*# ``ʄ0b  Ì9$e@a-30b 0 Ì9$f0b130b E@Ä0b  +L#`P?L# `h΄0b `Ä0b AAL#`P?L# `́TЄ0b EÄ0b  +AM#`P?L#`P؁?L#`P؁?L#`PA?L#`P~?L 1 <8@!>9C|& A0p@`P10`τ`B! B> ~pCÌI Av??L#`PAa@ 8{p B4̌*#` X3GXgƀTA0 P1@B(SJ1 A0`ƀ ф0F`M `4& A0B! 4=0F`M `4a& b0F 23BaM `4A& фA0Fa18kր JaM `4A& фA0Fai 3c@ + d  d0t& @> d` dp +t& @> d d t& @> d dt& A0(aTABsP1@tH}0F 0\RAw& A0(T `@ +s!a1@xH}0F 0^RAx& A0(T `@ +s8!a1@H}0F !Q\fƀ0A0`apN!0F !Q\pb1HFp ` @ r\X( ` @ r\S( ` @ r\W( ` @ r\Wh ` @ r]X ` @ r]S g 3(Pv3m<еn8SH]3m>5o]gC]Pۖe|&0Ըa unegCndgnago`gCo@gXUD UDd;*AdB LTLSTAT`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L +2" d##ㄡL L@ +f`)@DAQ b 1 0 a b +1@QOCH>QJL~qۈa'!$?a!P"$R 0 TŐ .! Gsب "p%rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` +0 + ʡ$ʣP +1 ("(fțo,FQxD@yLFD oM $Efe%&,f&gl&eCLd@(  l x#22:32 l@e!6`q&D3A 4I 6 H$Qa]0P6A Aa6oy0a5Fi**iP\" Tֆ2(3( 2@NORMALA Ƞ ̠ 3 Pa ==IM +mPU Ƞ ̠ 6 6 ioe m..mPlB Tsa! ` ӓԆe2(3hA2 dPfCHe:<0AM hMEh̥}M\6 |~ +0 +U\A2<27)ф .ͮLnJP!sC #+kz#+c e\N%2<< 7707)B!sK+K" +A2<27:<47)t!s{s+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q #` @; a~qf <PEAD %amp LD4B؀3\3~q0 <<mpK(5=mpOD4!@m3\TD_6ILDN,$9839959aa21baffa6e7568a641b58cef.pdbHASH9nuhADXIL`8DXILBC! / #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L +2" d##ㄡL L@ +f`)@DAQ b 1 0 a b +1@QOCH>QJL~qۈa'!$?a!P"$R 0 TŐ .! Gsب "p%rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` ʠ<(2(B oE!yfLFD oM $Efe%&,f&gl&eCLd@( a0(MfÀ$LfB, A !p6Da5Fi**iPHb x6ڶa!*®!#.ӓTSӆe l *zz" A6,`օ]5#.SV_Positionš AC aVpĕ,6,X& WlX A  Al DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+# `A70#`A|F у7F `фMфAM A0 =M!Mb18i˃фMфAM A0Pa F`4AFa4l A +rA0b +2t: A v A0b ,܁s +t,[ AU zPA0b -A t{ A ~A0b .tF  Rȅ\f @ p \ȅTHF  Rȅ\pb @ p \ȅWF  RЅ\21H$HAr!` @ p ]W(A0@t!^F  R\<1H$Har!DXBC'7~X/C/c DT,T[4[P[SFI0ISG1hqxPOSITIONNORMALTEXCOORDOSG1 SV_PositionNORMALTANGENTTEXCOORDPSV0`4; DPOSITIONNORMALTEXCOORDNORMALTANGENTTEXCOORDTEXCOORDVSMainC +CBDC!C)B2C @ ILDBQ`BDXILPBC! 9 #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Lt#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $4-Pn?+ QEADHȘt2 rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPEP#Q P%QA$Fʠ + c1 @` + yRLFD.틮 mm=271 30:Bvector X12@ E h 0 1@w%``0 1@w%`0 1@w%`0q element@Jؔ}չqHscdPVp@Ya&A`w @,b Fj),͍ZYK[YW[ [ڠ6VsOutputGBuffD1@(` 76float3xX@f|1@s{ 0Y=h `4ml ` +(K 6L =pH``Xd "hPpptangentB  Е ɑ0c{ !dW6F&cF"㳈C؃=H X"$``0: L+8,< Ly0 :@ @E `́B@ @8ɔ-b>S70PA$0Pa5WG0 Tpphɵ-b`4r!Q(S(|)lB6 +X5B~ +@ +lXC30:<Nmatrixbb1@ C` E ̂`pYM-vp ( E ܂`pYM.vp H /E `pYM/vp h /E `pYM8vp  E Ќ`pYM9vp  E М`pYM:vp  /E Ь`pYM;vp  /E м`ldlt|āԁȽ}չM+8b25VF7k0C=L;`X p"0|?mvp@GB_SceneBuffer@@3V?$matrix@M$03$03@@B&\A; 2worldViewPos 6qs&FfVv6t$55VV&TgfV&4cCbW6F&D3$mnA~"VFf6F& ?blendFactor@PropertyBuffer@@3MB&@B$= tex1dxxX@h|@| mLb%!`4+Ë!*ã+!!+{j" +ڶ7A)!(@ OiCW'4cCBUGW'W&CdCbW6F&D3mnb%XB@P\X[ 682)0I0~bfʀ-MDL +LИ kc3&4S5V&7EFWmnb&hBX``ñ0*2QZ& ]U\ڛۆpDT&VwfbU&7aP ^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@D\DF@Dܾ\Dd@b@t@P`Rvd@d@t@PbRv@b@t@P`Rv@d@t@PbRvF@PʄR@t@P`R@@@@hh@vv@@t@PbR@@@@@Ȍvv@P@R@@@@@v@@@@@f@@z@`X@bjX@Zf`v@@@@@f@@z@P@Z@\Rv@@@@@@@z@PPPX@\RX@`\dR@T@b\fRv@@@@\@z@PX@hP\X@b\`RRv@@@@\@z@hPX@X@X@b\`Rv@@@@\@z@\v@@@@@vh@P@R@t@@@@@@h@b@z@b\PbX@\Rv@@@@@h@d@z@d\PdX@\Rv@@@@@h@@z@PbX@dX@ȌRv@@@@@@T@\vFPʄR@t@P`R@@@@hh@v@@@@h@Ȭvv@@t@PbR@@@@@Ȍvv莄@P@R@@@@莄@v@@@@f@@z@\v@@@@\@z@PX@hP\X@b\`RRv@@@@\@z@\v@@@@\@z@\v@@@@\d@z@Ȭ\@Z@v@@@@@vF@D\D@P莄@R@@@@h@@z@\v@@@@Ȏ@v@@@@PRv@@@@@h@b@z@b\PbX@\Rv@@@@@h@d@z@d\PdX@\Rv@@@@h@@z@hPPbX@dX@ȌRRv@@@@h@ؾ@z@hP`X@bX@`X@bRv@@@@f@v@@@@\@z@Pؾ\@T@d@Z@bRv@@@@PX@\Rv@@@@PX@ؾ\Rv@@@@PX@ľPX@P\RX@\dX@\RRv@@@@PX@`Rv@@@@PX@bRv@@@@@ʾPX@RvF6AO \ʸ\8 \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBH[YZYYY[ٜ HBH\Q[\]ZY[H[]\Z[J^\]H[]\ZHORQWQSTUNB_B\X\ّXY\^Z YY\ۛNZ \X[ۛNZ \[XXۛNZ[[ [[Y[[N[ ۛ\[NBZH[]Z\[XX HYZ\[XțH[]BZH\]WXW X[[ZH X[[ZZNZ HY[\ڛۛNZHY[\ڛ\N[H[]\ZNBNB\H\ZّXY\^Z HXNZ\[N[ ۛ\[NBZH[][ HYZ\[XțH[][țHY[\ڛ[Z\[XX HYZ\[XțH[][țHY[\ڛ[ZHY[\ڛ\ HYZ\[XțH[][țHY[\ڛ[BZH HYZH țHY[\ڛ[ZHY[\ڛ\ HYZH țHY[\ڛ[ZZN[H[]\ZN[[[[NBNB\TZّXY\^Z HXWN[ ۛ\[\[W[]\ZNZ H[]\[XXZ X\YBN Z\Y[\ۜٛ\[[ HYӛ\[[ [J^Z HHۛ\[[^ ^^ + +\J +K +KMJNHHHۘ +K +KN\]HNB_[ YYӛ\[[ HXJ^[ H[ Jۘ ^ L[ L + +[ JK KK K KKLNZH ^K ^]NHN ^J\ +[N\] ^ + +Z + KKLJNB_Z[][[X +Z ^\] Z +LN K KL MJNB_ZYYWXW +Z HX[J^\]\]\] +[][[XJX[ + +J  MJ + +K +K H[ZYZZZ[HZ\X\[ HHZ]B_TZّXY\יXYJ\ZّXYșXY\J^TZّXYșXNZH[][ܓ\[XXHșXYK[]H[][ܓ\[XXHH\Q[\]ZYʙXYK[]\Z[ +șXYKY[\ڛ\H[][ܓ\[XXNB[ ۛ\[\[H[ JYӛ\[ʙXYۛ\[ ^^ + H[ʙXY\[ H HMJNZH[]\ZHșXYK[]\Z +J Ȍ LNșXۛ\[\[W[]\ZH[ ۛ\[\[ H[]\Z[NșXKXWHZ ʙXYKX H\Q[\]ZYʙXYK[]\Z[ +șXYKY[\ڛ\ +J  HSWQSTғS +șXYK[N șXKXWHZ +ʙXYKX H̋L + șXYK[N șXK[]\[XXZHۛJ[][ܓ\[XXJLMJ͊ۛʙXYZ۝JLMJ +J ̋LM LNșXK[]\[XXZH[ J[][ܓ\[XX șXYZ]N\]șXNB_B[H\ؚӛ\[T[[ ۛ\[\[ [[ ۛ\[ [Z\[\J^ۛ\[HYYӛ\[ۛ\[\[ܜ ^^N\[HHۛ\[\[ܜ^NB_B[H\ڑXYӛ\[T[ +TZّXYșX [[ ۛ\[ [Z\[\J^H\ؚӛ\[T[ʙXۛ\[\[W[]\Z ^ ۛ\[ \[\NB_BB\ZّXYH\ڑXY +TZّXYșXYJ^H\ZّXYșXYNBșXYK[]\ZHۛʙXۛ\[\[W[]\Z +ȌYN ZH[]\[XXZHșXK[]\[XXZ۝ +LM K LN ZZH\J[]\[XXZ] +J KL LN ZH[][ܓ\[XXHۛJ[]\[XXZ] +JKLMNZZHșXK[]\[XXZ۝KNZH[][ܓ\[XXHșXK[]\[XXZ۝ NșXYKXHșXKXW؛ ^NH\ڑXYӛ\[T[ʙX șXYۛ\[ șXY\[\NBșXYKY[\ڛ\HH\Q[\]ZYʙXYK[]\Z[ +H[][ܓ\[XXNșXYK[][HH[][ܓ\[XXNșXY \[XXHNșXYKHH\Q[\]ZYʙXYK[]\Z[ +H șXKXW؛NșXYKY[\ڛ\HH\Q[\]ZYʙXYK[]\Z[ +șXKXW؛ +HSWQSTғNșXYZHZN șXY YY\ۛHHXٛ +JL˙XYK[][\N Z\ٜ[ QZ[\H [ +K L \[\\ +J H \\]]YY^ J +\\]]YY^J +ٛYZ[\N șXY\X[ۛH[ +Z \ٜ[ QZ[\ \ٜ[ QZ[\ \ٜ[ QZ[\X + HX șXYK[][\N\]șXYNB_X\ّXYXܑXYJ\ZّXYșXYJ^X\ّXYșXYNșXYK[]\ZHșXK[]\ZNșXYۛ\[HșXۛ\[NșXY [[Y[[HH H șX\[NșXY[[HH[JLY șXY [[Y[[ +șXY [[Y[[\NșXYK[][HșXK[]șXY \[XXHșX \[XX Y] XHY +M H؛\]șXYKY[\ڛۛHșXKY[\ڛ\ +șXKXNșXYKY[\ڛ\HșXKY[\ڛ\NșXYK\]WXWHYYWXWʙXKX[NșXY YY\ۛHșXKXH șXYK[][ +șXKXˋ +JLK[]JșXYZHșXZNșXY \[XXۛHșXY YY\ۛ +șXY \[XXNBZ\ٜ[ QZ[\H  +ʙXK[]\ZHORQїӓTS +JL˙XZ] +L [ +K L [[\\ +J H \\]]YY^ J +\\]]YY^J +ٛYZ[\N\ٜ[ QZ[\H[\ٜ[ QZ[\  L șXY[[ +șXY \[XX^N\ٜ[ QZ[\JJ H șXY \[XX^NșXY\X[ۛH[ +Z \ٜ[ QZ[\ \ٜ[ QZ[\ \ٜ[ QZ[\X + șXKX șXYK[][\NșXYKHșXKN\]șXYNB_B[H[יXY[H\ZّXY\\]J^\\KXH\\ۛ\[HN\\\[H\\K[][H\\ \[XXHN\\KY[\ڛ\H\\KY[\ڛ\HN\\KH\\ZHHN\\K[]\ZHRQїӓTSNB_[H[WXJ[H\ZّXY\\ Z HX[J^\\KXٛ ^HHXNB_[H[\[J[H\ZّXY\\ Z\[\J^\\\[H\[NB_B[H[ݗۛ\[J[H\ZّXY\\ [ ۛ\[J^\\ۛ\[Hۛ\NB_B[H[W[][J[H\ZّXY\\ ZH[][J^\\K[][HH[]NB_[H[\[XXJ[H\ZّXY\\ Z\[XX^J^\\ \[XXH\[XXNB_B[H[WJ[H\ZّXY\\ ZH[J^\\KHHNB_[H[ZJ[H\ZّXY\\ ZZ]J^\\ZHZNB_[H[W[]\ZJ[H\ZّXY\\ [H[]\Z[J^\\K[]\ZHH[]\ZNB_[H[WY[\ڛJ[H\ZّXY\\ [HY[\ڛ\ZJ^\\KY[\ڛ\HHY[\ڛ\NB_[H[WY[\ڛ\J[H\ZّXY\\ [HY[\ڛ\]J^\\KY[\ڛ\HHY[\ڛ\NB_B\ȑPQSTU^Z HXWȔUYN[ ۛ\[\[W[]\ZȔUY]NZ H[]\[XXZȔUYNBNB‘PQSTȝ\]יXY +TZّXYșXYJ^ȑPQSTșXSNșXSKXWHșXKXWNșXSۛ\[\[W[]\ZHșXۛ\[\[W[]\ZNșXSK[]\[XXZHZ ʙXK[]\[XXZ LN\]șXSNB_B‘PQSTHYיXYܗ\J\ZّXYșXY\J^\]ȝ\]יXY +\יXYʙXY\JNB_BYY[HYיXYJX +HYיXYܗ\JXJBZ \]ؗۛ\[ +Z Xӛ\ Z  [  [ H]J^ YHY]ݛțZ\^\Z[Y[ \ H +\N[  HY +\N[ Y] HJ]N[ Y HYJ]NB ]Z[[Y\]Y[[  \HȘ LN[ \ \HȘ +\ SN[ H \ +Y]  +\ \ +Y N[ H \ +Y]K +\ \ +YKNB ؛\HX[YK]\Z\X[Y[H][H\J[ + + U +  PJJN\]Z +Xӛ\ + + +Xӛ\  +H][^ + + + +Xӛ\K +H][^ + +PNB' ZYW[YW[ [:xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPKrkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iPiPhP{kPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPiPhP2zkPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPIs1 k+K"*zz"iPiPhPKrcJkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJkPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJ3z #kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riP1c{ {c#z*zz"iP1c{ {c{zbziPiPhPKrӂ+ kPkP1c{ {KK{szJJzriPiPhPKrӂ+ ZKss+#kPkP1c{ {KK{szJJzriP1c{ {s+*K;Cb*r"*J:BiPKs{s+Kr#K+b*r"Jr"J*iPiPhP{;33kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{  s;+s +r:*riP1c{ +z{#*zz"iP1c{ )*zz"iPiPhP{ӂ+ kPkP1c{ {KK{szKK{siPq{Ks+{c K{sKsK#*zz"iPiPhP{*{c+kPkP1c{ {KK{szKK{siP1c{ +z{#*zz"iPiP Xtʸʄʸ\\\\ʸʸʸ\ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBB\Y[țXYB‹J[X[\X[X]^[X[\XX[Y^ ٛ H[Z[][X[\X[XX[Y +\XZY[HH\XZY[\[\H_B_KB [[ۛ +HS +ؚKBYY[PPїQPSMYY[WPPQSԗTVNYY[PPQSW՗QPTVH MYY[HTQRPWSԗQPTVH NYY[TSUғWSԗQPTVHMLYY[TSUғWSWSSH LBYY[SPWSRSїГSSH NBYY[RQїӓTSLYY[RQWQSTULYY[HSWQSTғ YBYY[ӓPӗPQTQȑWYY[TUQӗPQTQȔWBHY[[\B +ț[ؚKBYY[TQQWR +^ +^YY[TQQ +^ +TQQWR +^JB[X[\X[XZYYY[\^؛]HY\ٗ]ZۛXPY\YHTQQӓPӗPQTQVN؛]HY\ٗ]ZT]YPY\YHTQQTUQӗPQTQVNBH[[HۛXPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]ۛXPY\Y^NH_BH[[HT]YPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]T]YPY\Y^NH_B_BH\ [[\B ӛ[ؚKBYY[ГP +\Y [X[Y +\YȈ[X[YYY[ГP +\Y [X[Y +ГP +\Y [X[YJBYY[ӓPאPQ[X[Y +ȘXYГPӓPӗPQTQ [X[YJYY[TUQאPQ[X[Y +ȘXYГPTUQӗPQTQ [X[YJBHY [[,̂ёPQԗUTRUŎ-6" +-T4l`(QhI3FV&76VGVF[ yq +{{˃+{ kc+{+s+ ++{qqyqqy)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆf-:h @ Y6vq E^P ͆a/.&[FHkj̭L̬Ln8 6&a.< 6 | +xPjpq$`?Ajil@5Tcp Aklb\ci 4D4AH BBmbT50 ]lFmІ]]mpzj +bڰEnmm؅mm"') Bbm@ 6,xAAvx@a .SV_Position A cr1Qaq1ȍ٠ AtTDa ڨ ް 6,jAvj@! ˵AvamƆ<rzxys`wz`0??@BvN9MF&i(aYy"b'`"PЗ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0`,2L &GCB +ʠF +Jʃ(B(!nfp,F!@y\LFD.틮 mm=271 47float4xX@h|0c{ cdAjS `F6 "h0PwjS a6KD< )c+k+s{sF0(&1࠺ M* 0 4`XP@e-Ln%m+뭎m-mt::::"position$colorω$$]ۛ 30:BvectorA 0`1@U(``03@ L+8.5 Pk0 3*0461UB28pP CL08 pqi9   +@H95D:`CPpj K1c{ ca="pP #>"pP `8|,b0P_14! ×L"hDAA0%#R"pP b8|,b0_24A! <L"hTAA05#V"pP d8|,b0P_34! \M"hdAA0E#Z"pP f8|,b0_44! |`}0 +p + + +0 p Dk΍nZ.\7:7ipa|ay DB`,b `@8\6;8#22:329 0:4<& m w0B$@\Ȍ1( G̍(lMJ L.O̬LhIhC9P 2rTexture2D >`60 u 0`ЕXPɕYؕѽ5m[~Hwv AW'4+Ó!*ã+!!+{j" +ڶ @c. -TX[]]$AP n?sampl1@@3USamplerState@@Ah̅p kc +kc+ + +ڶ , txy}0`l@6 j%23$7727 l@bC0|7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""4241:2902/249441:24::4942<:2"2929:2<:2"2<929682)02689299682)0268692943723#*#"/ '#' !*#")22:32929130:<6;1:329(729<:32992930:127217::::47$7::47::::::::79:3034:9=79:3034:1704234:947::4779:30:4320:020<7:34:147::70::::477:66;830:47::477::::77930:432432432::::279247::2792:97:::30:47::::47:)/0279:30:7726826847::27979:30:7792<68268647::27979:30::6:298777791272172:97:6:47::772#' !*#")22:32929130:<6;30:7962;1:329(729<:32992930:127217:::#:3347$7::47::::#:33:::30947::47::::477:66;830:47::477::::7647::70::::279247::279::::827962;9<=2:97:::41:23:32/2494#*#"****47:::#:3347:30:127947::47*72#:329:6443:329:679:30:7726826847::27979:30:7792<68268647::279063062706329877779127217063707:490633070706<=707:49<=440627:6:0627<447:49:6:707:4944/706:6:29:9/706706704247::747::8247::279442069:6:447:6:2:97273:329:6:127274 B0\ʸܾ\8 \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB\\\]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓNBNB\S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNBNB\՜S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNH\X[YUӓQNBNB\\\S]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\S]^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\Sћ]Y^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQN[ ݛUӓQN[ ۛӓNBNB\\\\\\^[ \]ڛTUғNBNB\\\\\Z[Y^[ \]ڛTUғN[ ؛[UYSUQNH] ؛[YYXSQQPNBNB\S\ݑPY^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]YUQN[ ]ۛUӓN[ LUӓQNBNB\S\\\\^[ \]ڛȔ\]ڛN[][]ڛH] H]UӓNBNB\S\T]Y^[ \]ڛȔ\]ڛN[ ]ۛUӓNBN$L@V%FFW5V657VV&6WUvV5&WFVV6%WFV&Ǖ6VGVV5FV&75FV&EVfV6F^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@^T@@@@@@@@@@@@@@@@@@@^^@N@@@@PttR@@@@@@@@@@@@T^^^@@PVV@@R@\F@@lF@@pF@@b`dhF@@bdpF@@jbdF@@b`F@@bdpF@@`F@@fF@@h\`F@@F@@F@^^@VV@@\F@PR@FF@PR@PR@tt@@@@@ttξ@؄@z@PRv@@@@@ttξ@ڄ@z@PRv@@@@@@؄Pttξ@R@@@@@@@@@@@@@\P؄Rv@@@@@@@@@@ڄPttξ@R@@@@@@@@@@@@@\PڄRv@@@@F@^^@^^@@\F@PX@R@FFF@PX@R@PX@RF@PR@@PX@RF@PR@@PX@RF@^^@6(BK*ps_6_0Z̡ͽՑt^^^ʄ^\\^\\^^^^^^^8hi*k+#"+;raa%\%`%bB&f&&2A@ Ma66&Ha wMgp?! H P M<܄M؄XlB,&^FJ L.O̬LnrdQ7a6  `bh7a6q!-b1Y&ȳrp `oa MĆ@.6 6As1AmCP\&I4AH MLiP ؋ ӓ!&A ذ؄___^_"') HĆE F/B/&B 46 }!d*LnX8 @ ؋Ɔ4TPAlHs!R!A: u`'@ @O#0XG=`@cM.fK6`]{c{ R!m :6q "uB#`: Pu]\\Јͮͥ퍬Ō-ln Qͮ%̍nJ\\ #a)ш eNn̅,ͭlnJ0"s{+si Ks3Jc+s +k+D2<:20)MT!s+K{sD2<062)AN!sC #+kz#+cD2<:)ZT"s˃+ rs{ K{s"\!sK+K" +E2<27:<47)jyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK,_ܶ T;/MNDP_ܶ8R1~,a /A,D5@ @ɕB%%@ 0  &GL7 j0A8`p S&G)LS # `p}FmȌ[# `p!m[2a$Huʄ0b $V-A \cPL# `g13D`u$d0`4A (jPb3a A?D?0a$f0b< mïA (lpd04a A?L?0a$hPdE o5ï o5 o5 o5C o5 o5C Dl(Q0Lk0b PÌR 0c@VhL 0a&Ä0b QP(QjpE3lu AQ?h?0c@ThBl0 h L 0aUX3DA 0agƀh3Lf,0X3aXAg0τ`! B>|& #&LFL03a Aq +?A?m 0b )?0a Aq +?A?L#`PBlC|f 70τ`' N>A 0 +x@oP0b L*A(B A 0 +w L# `B(A0a'3m@е>BD[#%>R״>RVDH#)>b׵ >bfD#->r׶ >rvD[FCDQEADPEADH,/̳80vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/syh6(MQ,DNDOrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0P EPPPRXTJ +a + 3gȏ(@ yLFD oM $Efe%&,f&gl&eCLc@  l d 2 Le@4BYb`]̆dP b <a@ɽ ՙMeBL1 !&Fc. -fB`A @c. Mf2`1 Aи \AøѽMf@4  €fP`  qg!@ `i0A Ѐj +Ks2e6F6A( B!m B1M +jBA ,&E5A Be78A9"TEXCOORD0 o0q`0s:>`2eE&wVF7A( oq0sP0A( +3hQfloatsa6G77A sig_ld4ξЕ}ɵmPHLPIJ*llvm.identS +]\ڛ۔hBbfW&7%(̡5M 2dx.resourcesS ]\Y]]ڛ Ҡ]Z]]]ٔ` ṔAM D []ܔ@yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,_ܶ T;/MNDP_6ILDN,$443c44eda6ccdeb200fc350708110878.pdbHASHD0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/syh6(MQ,DNDOrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0PP%QePTJ +a + 3b yynLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!Le@,ِ CCC<aaahgE͚ b(`CPMkB\ A . `B,man 4ܸLY}AͥѥMgP@bPDBڰ`b0d0Q'' B1Mf@84P paPc eD6i   4h 6 fod*LnPP"@Ơ 2 ` 6sa:6WPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +pu\uyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,_ܶ T;/MNDP_6a ]A,$G\)^Q)3# `0qƳmȈA Lm[2b L]$%T-# `0"y3b FhG1# ``ցҌ$q$$$_<AÔAHhB&h &È 4n@A΢D&h& h1$X `3nj%>V1| !c#&1Lj >Fp1|3b )A(# `B(0b )A(B# `B(ADXBC",ây>&FPH DT(x@ltttSFI0ISG1SV_PositionNORMALTANGENTTEXCOORDOSG1th@h@h@SV_TargetPSV04" ,NORMALTANGENTTEXCOORDTEXCOORDPSMainDCCBCDDD00077000ILDBh`0DXILhBC! ' #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Z2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX $2L &GCJ +)2((b(r(JJ +a1Ap,A?A"A"g sJǪ&;8RG@_A?AhK@yL d!icK+sAcc4@ oM $Efe%&,f&gl&e-͌]ݛZ <half{ 0b4Z` E ,h  E 4h ( E <h 8 BaG[Y[ݲ6element_countT`iPֵAI HD*=4Z 179063E ,A` "h 0XM#B$`0 L+8,1 Lc0 N0021 @Ì-n]ݛ[ Ȍ 30=@i`@,b  E ,ā,b  `ðl@R $@0781uq0c{ !dW6F&cFB㳈C=P0`1@wj`F=P0PE <l 6oM;`Xs  30:Bvector9=(50`4``0? L+8,Q (L=P `X} P +b39S5F2pyC #+{Isc#+:33+ +sAccK4922*zb&VFVP֘ $jnormal_smoothness_materialqUpYfmetallTranslucency_shadowUxY@ @6 +0 UPz./shaders/include\in_out.hlsli6VsOutputGBuffD1@s + p{k[M.( s;+s[.)+z{#[M/B)) +p)[/Ԃ) l(pAxaLP YMAVM + +443:329AO[יXYPVVU\ZّXY*72#:329albedoQU0p̵ѡ-b `HE а*H8 70E м*H8H2066E ă*Hx:092E ̃*H7/09E ԃ*HE ܃*H79:23:E *H90E *H020E *H::4E *He$&A"6Hl$VM*:M pIsK +c+#{#}eaUUՙYؕѽim0MĪ P@ U D>init_smoothness447:49 *72#:329 0633 0iX5- +c@@%-M-vF&UU6VFv$VgfV&dCbW6F&D#aFB6 0&@bB&T-hɉ}ɵQ~ľ؀~~HH̀H`db`~H䀚H`d~H䀚H`b6f`f iX5`7 +@0@'-.ͭlnpFVFV67UU6VFv$VgfV&DffjTa'xB%-G[W '-+ (+ .llH̬L- HkO*K]"273:32/;AOYיXYܗ\PVOPՑPQSTPU\ZّXYaDbcjT!,Bv,7͝\]יXY N.L̬L(+'HȨH멊 + + +*llH̬LH TZّXY"hXA.61@ + u  ,dؕѽ񠅱,b|#.0`1@  -b0$B 01oq,bTaB.@ @6 is1 &P7P ,ŦbY*]l"3:329A\יXYPVOPTZّXYPU\ZّXY.Db{jT!/BX/P\Q[\]ZY4)029 /& -bool{ @ @ l@4VM*_1@p"272706AOYӛ\[PVO]ݛP L ]ݛP `jT4LC5`Cc&0Q:`Qxpj K1c{ ca> _12 C `8|,bF6;50C> ×L"hlCP0_22 C b8|,bF7;50%C> <L"h|CP0_32C d8|,bF<;505C> \M"hCP0_42AC f8|,bF=;50EC> |`1q1qDk΍nZ{X7:7ia]7Bkv 0"XC>E `p ~ʄ䀀f~HH`fH`f-}v`@dȬ18{c#J+z:+s+33+!+{j"ڶ4!܁~pc+s#3 +{[f G̍(lMJ L.O̬LhIhH@ /U]\ ]ݛ[ ϲ`C0" @ DA]^ Ќ U]\ ]ݛP Pж1( tex2L2< 2<:2" 179& m @#("R"@4bLMхѕME 34S5V&7EFWmhdE\DPZ\X 686 682)02 m @#0#"@9y0)ƌ09327 (EL $ ĪLn.m +7"+ ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց̡}͹4(Ց}ѹͱ4(4(PɕЕŀȕѕɡ4(PɕЕɀȕѕɡŤ4(4(LMхѕ̅ŀȕѕɡ4(LMхѕ̅ɀȕѕɡŤ4(4( UI}YI%9Q5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(4(ՙɁ@ɽ ՙɁȕѕɡŤ4(5(сѽ4(4(4(X=сXM5X%сѥ4(5(X=с4(4(с̀0Á԰4(4(с̀Y􀸽ɵ镡0Áѹͥѥ4(сс͕̅ɅѕᡐѡYѹɵȤĸ̤4(4(ѹͥѥձѠѹͥѥĸ4(ѹɁ􀘱Ѡ͕͕͕ĸ4(4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ȕɹ4(5(4(р@M5X=сѥLY}Qɝ5(5(срŀЕŸL̅ŰѹЕ ɑ4(срɀЕɸL̅ɰѹЕ ɑ4(срȕձс􀰕Űɰѽɥ4(4(ȕɹȕձсѹ4(5(4(͕5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(рܽɱYA4(4(ՙɁ@ɽ ՙɁȕѕɡŤ4(5(сѽ4(4(4(X= ՙXM5X%сѥ4(5(X= ՙ4(4(̀́􀤹ѹͥѥ4(ѹͥѥձѠѹͥѥĸ4(ѹɵ􀤹ѹɵ4(ѹЕ ɑ􀤹ѹЕ ɑ4(ѹɔܽɱYA͹遴4(4(ȕɹ4(5(4(Ցՙ}͕ͱ4(4( UI}=UQAUQ@M5X= ՙѥ4(5(р̍ɕ́􀤹ѹͥѥ4(TՙɁȕձ4(}ՙɡȕձѥ4(4(срŀЕŸL̅ŰѹЕ ɑ4(срɀЕɸL̅ɰѹЕ ɑ4(4(р􀠅ѠŰɰѽɥ4(4(рɵ}͵ѡ́􀠅ѠİĤ4(̀ɵ4(ɵ􀠸ɵ}͵ѡ͹遨ȀĤ4(}ȕձѱ4(}͵ѡ͡ȕձѱɵ}͵ѡ͹4(}ɵȕձѱɉ}ɵɵɵ镡ѹɵѹɔѹЕ ɑ4(4(}х͡ȕձѱ4(}ȕձѱĤ4(ȕɹ}ՙɡȕձѱ̍ɕͥ4(5(4(m!p͡qՑqՙ}͕ͱq7<34:$''&! 6634929227<34:4479%#* 6634929241:2902/2494764)02930:0202:970206) $$9:1:(2#:32064377069:07706:092770633494093430700632066063:0924:29:0927:792060632<:120629063906390067770637/0930:0209:1:*72#:32060620637:4307006320664:29:0927:792061797063:0924:29:0927:7920617970637/094:29:0927:7920617970634:29779706379:23:4:2977970639030:02030:::49:1:2#:3206306230:707:40200632066*0929082)8208*09730:27270630063217042789:7=21212:972307270630:230:7730:21<30:30:06367:77<=7777=77<89:2:9777<=060634020672:977:760606370627060622:970:024020620<:43029:07100697:8064120729902#:3293:329*72#:3293:322#:3293:0632066'9*092<3:32920662066'9*092<4)0293:3290203:3297/09:2066'9*09230707:49302727063:329706<0<3:3297:4906302063:329020633:3707:4020630:707:490203:306270633:32906274)0293:3290203:32979:23:43 '3:3293:30627063;3:32906273:3293:32066*09290;3792066'9*092<3793:32990;3:32066*09290;30:2066'9*092<3:329902:973:42:75707:4930707:49::30706::0637:470672706707:497:4909707:4942:7#:329707:492#:3293:3::30706::0637:4:75707:493:3707:40206<=7067:4*72#:329:7#:3292#:3293:*72#:3293:323:32902063793:3707:40206;0632066*09290;3:32066*09290;<06390;312066*092900632066'9*092<3792066*0929006390;3:32066*09290;0632066'9*092<3:32066*09290;3:32906273:30627<:7#:329707:493:33:3297063:3297:43:3297/09:4)0293:3290202066'9*092<3:329206692066'9*0923:329:092<3:32974)0293:3290203:306273:32979:23:44)0293:3290203:30627; ''3:32990;903:3294377906273:3292066063392621:1298337:4892314$722314$727921:3:3299:077929806392621:1392621:1392621:06273:32920662:973:32(2#:3298#:329*72#:3293:(2#:3293:323:32902063:30203:3297063:3703:3294093493:37:43:3293490<3:3294093493:329409343:329206693:320663:329:092<3:3:092274:274397913:32977793:379:23:43:30623:3297/09:3:37/093:3292<:120627706273:30623:329437793:306273:329206693:306223:32990;3:3903:329:0927793:329437793:329:092063392621:13:30206) $/' &3:3902983334892314$722314$727921:392621:1298392621:133:3293493:329:092392621:13:329:0923:3299:077929806392621:1392621:1392621:3:306273:32920663:32973:32:973:3242443:329::*72#:329:6:6:0627:6:706:6:7:49:6:20669:6::092<:6:7/09::6:79:23:4:6:7:6:90;:6:0206) $/' 424406274::*72#:329:6:06062:6:0627<=06242447:494::*72#:329:6:0637:4:6:7:497:44244/7064::*72#:329:6:307:6:7067424420694::*72#:329:6:06320:6:20669204244/:092<4::*72#:329:6:063:092:6::092<:092424474::*72#:329:6:063:6:7424490;4::*72#:329:6:06390:6:90;90424402064::*72#:329:6:30:020:6:02060204244774::*72#:329:6:30:79:23::6:79:23:479:23:42447/09:4::*72#:329:6:30:7/09:6:7/09:7/099:1:#*#"***0630627)/02:30:707:40206)/020632066*09290;)/02:#*#"****;43:3292#:3293:#*#"****3::3:::06273:30623:::707:402063:3707:40203:::2066*09290;0633:32066*09290;2:973::#*#"****273:32/;*72#:3293:322:97;43:3293:3293:32242273:3290273:32/;0629:9/70606067606'30830::2:2217973:2426:0330222<30282<30::22<:30::;2<:762:24099302829819'2830229819230*28298:<2298:;30!28298:<2298:;79:1:0047007:330:470<89:0<7:*7:!2:97060676='0676<470*0676<470 =902941:24::494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР0G'W7Fb5WGננbF76F4DӠbF7&$ĴӠbF'BW7&GBU5$EӠзӠР0G'W7Fb5TGWGננbFG6F2e6FӠbFG2&2$ӠbF'BW7&GBU5$EӠзӠР0G'W7Fb5geTGWGננbFG6F2e6FӠbFG2&2$ӠbF'BW7&GBU5$EӠFb&VDBU5$EӠзӠР0G'W7Fb5WGǔFננbF76F4DӠbF7&$ĴӠbF'BW7&GBU5$EӠbFGBvVFBtTDӠзӠР0G'W7Fb5TGWGǔFננbFG6F2e6FӠbF7&$ĴӠbF'BW7&GBU5$EӠbF7BvVFBtTDӠзӠР0G'W7Fb5TGWGǔFg&w&G֠נbFG6F2e6FӠbF7&$ĴӠbF'BW7&GBU5$EӠbF7BvVFBtTDӠbF7r&F6BU5$EӠbFG2&2$ӠзӠР0G'W7Fb5WG%W67ננbF76F4DӠзӠР0G'W7Fb5WG%W677VF֠נbF76F4DӠbFG"VvUvF7"TDtUtDӠRFG"VF6V6"TDD4T4ӠзӠР0G'W7Fb5TGWGw$Tgf֠נbFG6F2e6FӠbF7&$ĴӠbF7BvVFBtTDӠbF'BW7&GBU5$EӠbF7'SBU5$EӠзӠР0G'W7Fb5TGWG%W67ננbFG6F2e6FӠFW&FRFGRFBU5$EӠзӠР0G'W7Fb5TGWG'U6fW֠נbFG6F2e6FӠbF'BW7&GBU5$EӠзӠA09p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 #*#"/ ' Al +-EZh}|Ph!Вg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ Bɚ ɛILhD9 "mN(MiÀ'yB'2&A>ِɞɜɆdNEdNDO6~'3:PropertyBuffer: Q9  `B'"tB'sB'dNJFdNN TRA B6yb@''U6 t*aʆaNV&i0Y2e6F6AH BmddD۰ Ԋ + I4& AUٰɮJ +̉I + "' (Jʭʜ؊( +@kIh bap\^^\ lXp\!^[rW6+2.d*Ln, AlX\j]n%WW$We2'R+B.2'2'.Qذ¹ +K Bˆa]]6 .P^R`WG7.BEhqu ' @O #0XG=:`zT`:  :6q "/,# pXG=@O#0XG=&`0A86color1DdYX4d%C0Aۛ\[\[ܸs`6 AK1wrABݸUS ut/dz ܸU9u %@Ψx0a{ cszk!: +a .f\N*28q ":3`r$b%بy  b +a + NLn\N*229q ":a6r %ڨB{0 j +!@#ͮ- o\N*ć@C9d6- '|6%Fܨ83!s +Qн@n3AX3XG="L쩎n\^*,! u ^\\3∍ͮͥ퍬Ō-lnP#7bͮ%̍nJ#\\:#`2&\\eb eNn̥-,()lJ`&v\\qb ŮLn.mJ@'N\vb e-L鍬mJ'f\b υ.,..mn*b ..l.lJ +v\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq )` !@; a~qۖ <PEAD %am +p LD4B؁3\3~qf  |f  L60F xaf `tbfF  xa& A0(D"^ 2O>3{`:13v}0 *LM1 c tbf "L|&  :1360l03a Aq?x?̌ Ap?x?L#`P[ } T&  B0c@Ǧ,Au0K,3D|x:13#`.ŒN̈ L* N̈ /!C:ÌŇBB>@'fƢ@>3|ŇE|& L6A|f  > y G>3|Ň%|& SLf 1 tbf3a1g1@'01 `2`@ +Ha1@'00F & A0(x"{ ` @ .@AԀA0r tόmpcg10'!1 RnF  !f 3D7$1 Rn,3c@䁓pc" 5ƂB>3D876|f J#! ۨ _ "*V & 8V ڶǀcho X(ǑY_g!"q$yYt",癈'⚨STAT@`DXIL(BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L V2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@Mb 1 0 c ah*@ UG ?a!F+1m#b` 4a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C8syh6(7ISD ̳;Ȭ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J`$ + ʡ<3 +0(2("( +gHq2Ǫ&;8yLFD oM $Efe%&,f&gl&eCLe@,  l AG /f@4 ͆P!AW'!p6O4A\]PYx6 DPkP`@c. -fB`A @c. Mf2`1 Aи \A <.blendFactor 0 Ġ Tca >2 `@l`0AL 6k@j),͍˔\]ڛ&! &E6A( oq spzj +b ! `2A "' o0q`0s*zz" AlX``;9 a `j`CAx}L&7A B†78A9  +o +~0 s@ +f„) †L6 + @<[XM\h̥}M]ޗۛ\Z^bAf*llvm.identS +]\ڛ۔hBbfW&7%(̡5M 2dx.resourcesS ]\Y]]ڛ Ҡ]Z]]]ٔ` ṔAM T []ܔyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq %` @; a~qۆ <PEAD %am p LD4B3\3~qV rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C8syh6(7ISD ̳;Ȭ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J` Jʠʃ(B(p*g88yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$! 4™ p6$φdXb @a m@!6 q11db`e tn 4ܸLY}AͥѥM +jPTbPXڰ`b0d0Q ' BMh@H4P paPc e<6,MA bД@kIhiaI724 6Æz0(9@A 2X 0 +;+ 6ipƠ 2 6,CA d0l KSa`{P4e<>0A + fFVF7%ؕͥM &dx.valverSZY\Y۔ )C"W6V'7V67%إ%MхѕM :dx.entryPointsS?yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq %` @; a~qۆ <PEAD %am p LD4B3\3~qV &1I|LcT&0DzM>u1!A|̹c &2C>6 |,c'J>M10ca>6ψ D  B0b HB, A#`/ A|, +c ؐ!cCG>81ő|cA0^aF vl@X:10&!0bcA" ؠǂB>6|L$`60b OM؄HˆA  ?6a) # `?؄M=$p6ˆA  ?7a"$p60b OMKÈA  ?3a*1# `?̄M=$060b OLKDXBC}& *'&Y8? DT49$:@:SFI0ISG14(SV_VertexIDOSG1htz SV_PositionCOLORTEXCOORDPSV04COLORTEXCOORDVSMainADDB3ILDB3` DXIL2BC! #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  I`B 2"H d""ㄡL LD#%@`1RsA @19-b9peAXrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GC:EPeP#Q AJ`$ʠ  @3z#Gy LFD쭎-ͭk,m-.mm=271 30:Bvector X12@ E c%`0["8V`APelementIؔ}չqHscdVpI&A`@Bp aFGCȮlMnj-g4A` "h! "h8! "h 37&WVTvF2++sC*K;C:{+33+Iڶ + 0}F n *m@ ~Ѐ䀀f-.B) )ycKs+zc{[fP 筎-ͭlMH J L.O̬LhĮlMfHh)::4/2 >! A+L1 A[[[]Ќ U]\ ]ݛP Pж؅Ua ^\X682)0I0͂@`686 682)02 m P ::4/2=l 6a< cm@˔՗U]^a&H! l~6, #A%a@`'!@ .SV_Position &DzAذ؃JKDKCK؃I'' "mX!&V$JB&%$^Uӓ~a2JDID=d5a CJȃ3 F6.BDtB hэK&9uHL l: u`'0XG=`0AXuZG=`z$`X: R#0fB&v2V7%ЅFllvm.module.flagsS^*llvm.identSpD2V'7V2FWF77er@Fdx.source.definesS[XK[XQ[SX[ٔ ̽ɍɝM +]\ڛ۔؅ٕM ZY\Y۔`*хѥM ]Z]]]ٔ$ṔAM pyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m[,WBa A,DF 1A @_0Û ,a0AX`a9# `peAÌYz A`@Ä0b 730b @P3z\jƀ<=tƀ@ VV0b  Ì19z A1?,&?0a؀gƀ@L&$1 .?&!>3z Aq?<*?0c@L#`PA#?L#`P!?L#`P?L#`P?L#`P?L#`P?L#`P?L# `` 30b L8`[0a$SUM# ``QA 0ehDŽ0b L8a[1a$SNEM# ``MA 0ehDŽ0b L8d[1azF2m&е >RI#}STAT`ADXILBC! 8 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2("( *(2("k9ymLFD oM $Efe%&,f&gl&eCLa0  Pl `@,ˆ0 J3AX Cj),͍˔՗U]^X&! &D3A 5lXi*k d\&3A Mcp}b<COLOR"ڰ bY `a@Pa ==ImkRfY cPl€ `àP"5floats,&CBc.싍\aPXԥmPi7x@*llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77%P.dx.countersS9yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$0251d52f28f0dd3fb26dfbb908bdd61f.pdbHASHQ/(?mDXIL`cDXILtBC! Z #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b((R((B(ڱ@3ySLFD oM $Efe%&,f&gl&eCLa0 a0(McÀ$a6AhXM5q*+K" X6`&ñA @4 1U˔\]ڛh&3A €l(nB`&mFL'' mX/$0a&CBkIh@Q1l`1`Al.36sPͮ%̍nJT!s+K{sM\F2<90272)AR ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma :A, +4P3tc 7F  #c # `Pde9FU0WETz |LXcs$"&$"A$"Ō$"$"Rv$"RAV$"R$"R$"1b HdDXBCUr9TWE5ˑZna DT88O`WWWSFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@ SV_TargetPSV04 $COLORTEXCOORDPSMainJumpFloodInitDDBBILDBL`>DXILLBC! 5 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L S2" d##ㄡL L@ +@@ 3s`0G@$AH) HrSArn.BWBZ/nq% ?a!! ("! BS䠪rAQOCH>QJL>rۈ@)DHisA1$$Aa☩ Ɓa hAAHƁA @!a~Lb00n@ PPr@ +|`0`@~~"pyh6(r|4&2rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`30 !@C <d2L &GCJ +"(B(((r($ʠFgh rʱEy LFD쭎-ͭk,m-.mm=271 47::vector 812@ E P 0 1@k@%``0QVVFlM[Y[[Y@IAxI (40*5(D 17947:E A` "h 0`M0H @a6 XMfZtǛ%,K float2xX@d|X12 0b4AEp֠ `6fp) BH @P@P`Xb 8* ؀TSXR]Y[=90241:24::49A::::"position4hٕѽ񘱽ѱ,b?(0`1@ "h420`p<?(0p Di@lҀ&A@ "@p?1@#pИbMn4)HH279E Ќ< PRSP +60MAVM`h@̍ɕ]ѡKs#S6vVFF E `,b3d37&WVvFFt$%W&G'TgfV&4$mށdAXbܘ\YRY gnL , H J L.O̬Lh&Ih-Ԃ6)242:E `e ~Ѐ䀀f-;B. .ycKs+zc{[f 筎-ͭlMH J L.O̬LhĮlMfHh.::4/2 > A8L1 @A[[[]Ќ U]\ ]ݛP Pжx_ a \X682)0I0@`686 682)02 m ::4/2C#2<:224)P eNn̥-,()lJu\\&Q ŮLn.mJM\+Q e-L鍬mJe\9Q υ.,..mn0fQ ..l.lJu\|yU3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(v`3" A !!ޡa>8C9:8q )0 H1Ϸ8 6dpHDܶ!l;/TQQCIm[4\BDͰv ef 9F18 0F X=f 9F1@bXTD0F `:1` ` f :F`-όAh#`P ?q0b +?0c@A + Ä0b +?0a A +??L#`PBn `Ä0b +?0a A +??L#`PBn@=3h#`B0c@́7 8P5a A ?ā)?s00b E,?0a4 +hBAAt&`agƀo4A0(h:8 .F f 8B1@Fq1 ܠQ`@ +Za1@q~0F @_& A0(ha: `@ +Z`a1@FqV0F @^& A0(h: `@ XPf 9F18G & A0(l;bF R`& A0d  `ƀ0 `4!& 3 >3x A ?A+?q0b E.?0c@A + CPÄ0b E.?0a A (??L#`PypC `CÄ0b E.?0a A (??L#`PypC CÌ1h#`PBy`A Lf +qq0c@0AF V\1 ` `@ +^HaƀpFA0(xa>P `@ +^(8a1@Vu0F @& A0(x!>P `@ +^a1@Vu0F S@r& A0(x>bF S & A0pa`ƀ0 `4!& c >3x A 2?0c@ Ì[h#`PB34 A .?A?L#`P @Ä0b /?0a A ?A7?L#`P Ä0b /?0aTs vŒ1h#`i0a A!?¯:?s00b 8 +?0a4 ytzz3h 0a1  `@ rjaƀ-4A0(aRA UF (Jax& A0(R `@ rPxa1@h(y0F (YJa& A0(ʁR `@ r@pa1@`(y0F (TJAf 9F1@b(qx0F ` +>[ >>`4ф0t0b :*Ì[h#`P`C34 A??L#`PC`ü * Ä0b : +?0a A???L#`Pê`C 0*Ä0b : +?0c@4  *Ä0b 9A((t&`xgƀo4A0(Ua UF XYV!& A0(U `@ uaa1@b`avaƀ-4A0(Vf 71@b|Xs1 Q`@ uaa@f =Pe(`ƀ؃Doƀ*EYBf PHT00P1 PR>3**01 PAT03c@.`BRA  7 +1 R T63c@ +|f TXU, v +1 RT0!ό + +P|f TUl ` g1@|z1 NQ`@ ~a10 +A1 Z!a`8"x1 Zb`:F ҇wf V#XPրEYf VHT1Hkz(bƀEA0 `@ aaƀ8FA0(F"qA ό *1 h!S ό *1 h!S`@ aƀFA0(Nbs RU.03c@܂ +|& YbƀB Ћ- -A0`V"A1 p!P` @ ȇu& 0}PPԶ3m?5mAе_׷1>B׶~W]FP]VP]PmӦPmC#>R׵ 1>R׷~]H]>[_#ua@#ua@#u[b@#]b@#}#uDsG|Z `@i[Mn9MFB@"_׹U- \~~u["_1 \~]Ĉ&p^}#<7mEh"~]f&yyobh"MfĈ&~u#HvnQh"_߶ EI-qMTD0uoWRK\ ~^ۘDEDM$5QQ:_ۺiI-qMTD0;:ofRK\ vMDED~}%5QQ:_﹥I-qMTD0}n4CM D\D\=STAT `DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L P2" d##ㄡL L@ +f`)@DAQ b A4\=䯄_6*a*.BCMQ! 2 @Q1b˟|n|AQpb8DAe0S;<̃B9=ԃ<C9=<9;=ЁC:<=< +`!a܀á!  \GEфmTQ"bLrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`g !C @2L &GC"J`$ + ʡ + +4ʫ(2("(jg( q,FyLFD oM $Efe%&,f&gl&eCLd@(  l |::4/2 Lf@4BYb`gCL  }Aɽ ՙMgBDA !6P0.screenWidth &Aж#37&WVTvF7A e56)242: 1m00@kȼѱ Mj@T 236ScpB l6  6 A `CܔȒLY}AͥѥM +lPdbPhb۰r0tPv0q'' BmX<;=`Uӓ!6, ԁ zAl`ɔUY6,(A( z@AlDal( HɅ0c{ 49 qHs1vFFc.k][S@TPU(V`Zq +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔDBWFF67E@6CbVvD6EFW6%x:dx.entryPointsSRB2VFW&77%pyU3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(v`3" A !!ޡa>8C9:8q &0 H1Ϸ8 6dpHDܶl;/TQQCIm4\BDͰf  COLORڰ b77@kIh@@30 KSxc0Aga2@&SV_Targetڰj`p60ALs fFVF7%ؕͥM &dx.valverSZY\Y۔ )C"W6V'7V67%إ%MхѕM :dx.entryPointsS7yU3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(v`3" A !!ޡa>8C9:8q &0 H1Ϸ8 6dpHDܶl;/TQQCIm4\BDͰf # `*hBX1hg Z`F OA, (A, xA <o0 A||0&A|F ?[ ??ф:3b /B((&Aoo>A 8XP A|,Hc( |, v +1!P|l+10hA^Af!10abAf"1H~(b@ "||l X@RaKcYbd "`ad "`a @ HzF 1thDXBCDimC+|b\l DT8tX```SFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@ SV_TargetPSV04 $COLORTEXCOORDPSMainJumpFloodStepDDBBILDB4V`DXILVBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L X2" d##ㄡL L@ +@@ 3s`0G@$AH) HrSArn.BWBZ/nq% ?a!! ("! BS18˟|nqQ Ž.B*VbF H!4DBh#!! t #Lm00n@ PPr@ +|`0`@~~z P(@fq`pypZ(|zrR{(qw>0vxp6:0$!۟FCDQEAD@$2rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`30 !C <d2L &GCJ +"(B(((r(JJ +aq*gQay LFD쭎-ͭk,m-.mm=271 47::vector 812@ E /P 0 1@@%``0QVVFlM[Y[[Y@IAxI /(40*_(D 17947:E  > A8L1 @A[[[]Ќ U]\ ]ݛP Pжx_ a \X682)0I0@`686 682)02 m ::4/2  pB yPC3/( A?`?0aԁ!h +@\pԌ!*#`Pۻ?0b Ìq_#`P?0b 0Ä0b Ì1*#`PA?鰅pa3;t\q؄0bp T &„`D`4#L' 4c@C7 M#`PBc3;H AA +??L#`'h#`'0bp (|B5aC +` T Ìh#`PgÿA L@AA!`0hBL B0a A +?#?@0b *?0a&gƀ6 0A>EB|f z,3a A +?A'?@0b +?0a$A +j B0c@6  ÌhF8ߌxE|3?x%:c@0b , ?0c@â + ÌA*#`P¹rt3?x#`PBs390 AA ?+?L#`Ps38, AA ?&?鰅pB3;t AQ ?-? 0b E-@?0a# oŒh#`d0a Aq ?A/? 0b -`?0a44 st@t@3L Gt|3?t G po0 C(@Ì1*#`Pû390 A!?9?L L7,0aL7,0a AQ?B=?0b E9@ +1?0a AQ?7?㰨0b E9@ +-?0c@gƀ`1 f vF1@@0~1 A `@ s`Za18B!ȅF )P`1@"@@1 A `@ th^a1hJva S0S0B`4ф0F`1@X1  `@ +vpa`a<3c@C`y g093c@C`r g1@x1  `@ +xd8a1HjVA`ƀm4A0(Xa# Sp#f ~Jtƀ7`@ +za|0aƀEA0(YUF {f& B +f ~xI0i0F lf s1@1 ȁQ`@ {pa1@1 aQ`@ {@~HaƀH-4f vF1@1 A `@ +||xa18d!PF YPa1@B1 A `@ +}!a1hl![[B`4ф0F`1@1  `@ ~a0U3c@C` gQ3c@C` g1@"$1  `@ a1HxA`ƀm4A0(Dp#[p#f ~Jtƀ7`@ aƀEA0(JrUF (~!& " +f ~xH0h0F @ ~΁f r`T1@%80F @ }Af qXT1@%sA"F @ f vF1@%l80F `" r}xʡaƀ0 `4!& !0F X ~f yF1@b%PD0 .0,X,0F x !f zF1@%pL0F R u!1 A `@ +aƀi4oƀn<!`<1 1@b&@J1 aQ`@ AXaƀ FA0(fbyA `p`<& & A0(lBzUF A& A0(lzbUF  @aƀH-4A0(lzF  & A0dB%:7yy1  FM `4A& A0(rB|!BF ȉ& 3A>3D=hf|& !>3D=h B|& A0(z~F 艑& A0p@f |F1@'F`1 a `8˜1 `8B`oƀ;@g ~xF  @bf qXT1@",Tr1 ȁQ`@ H$Zan `ƀ7`aq `aq `@ +Fbf s1@,P x1 ȁQ`@ +8a$`a1@,L l1 aQ`@ +a$XaƀH-4+tόc0Ѝ0b YP?0c@4 fCIÄ0bp XD3;`C Ä0b Zp?0c@4 hIÄ0b Y?D%Q%Q3L G%|3?t Gpo0 sLPÌ1*#`P̅2390 A11??L L7,0aL7,0a Aa0?Ԅ?0b ]P?0a Aa.??㰨0b ]AMÌ[h#`P؅53;H Aa??L# `0ɅLZ<03131c@0hL#`P8C3L Ga|3?t G po0 [㰨0b k?390 A=?Ƅ0@8o0tt  C\@㰨0b l?(390 A!:?ąɄ0b lF\@鰅0b lF\Čq_71ߌQ* h13DI0L7 L# `Fhi0c@D +A 0qkL8a|F3m=5߼_ߺ1>B׺~V]>m#t8nx5o߸0>B׼mm~]Mm~]m~]m~u#xn6߹m1>B۸~m>nn#<ߺmoжvumжvtmжv}mNж_0>Bۺm~[#=BۺFP}fC#4o5H]Y#u5u#uxmgut}oDu_U1>R׽~Hm~mӾ]ӶHm~mMӖHm~mHm~u#9۸nvߺq1>R۹~Hm>~n#|mp׶۵m׶ߴm׶߽mO_0>RۻӾHmN͛#}|no0>RۻVPH}vCH[#uDs撁۟FCDQEADPEADV&p8׸nyh}v&p8߶nhhutmFh_Y1 \~v&98ozh"Ӿ}&96oih"MmHh"M_]14~65QQ:54nSK\ ~]V05QQ:5mDEDfg4q #_۹o׹X!MDovtnV@H8>Bwa@9N4о~v^[m@9N4о~7^Y9N4~5[e@9N4~p@9N4~۝9N4~m]F`4q #_ۺӺIX!MDoH׶߽nU@H8>R:۹mU@H8>R:߸meU@H8>R}|oU@H8>R}{oU@H8>R}zouR@HSHovh!~mM 4u4_۸QE!M"M_D!M"MoD!M"M㴍E!M"M_QD!M"Mo D!M"M=N N3}v}[hD4_۷ӷ='tAu PA  u`W 6bp X&A|sA'4bp @#`Au0bp JPb T# `px gpgp 0  1LEB|,3b )pQ7!XWB EЈ (A) +qA # ` Gt|BC|%:@ȅ1PPF`4A,X19cr g @ rh!o8B@)nX$aaF @yZa@ xF \pu r!ra4!FTA !>6 +B|F  _!0n#Jt%h1h́ᑃs8s8фMA> |,X,1H$A`8(+! GnXaĠ@ u0 F`4A9_c g @ "!co8B`@'nXaaq+t"Ĉ (>!=4&8IIhB& A>B|,$AD,!B0a Gt! $L7,0b [ЄJ5Q5Q 0 f|$?3b \p17!0WB L7,0ݰ8ÈA FG,GSFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV004 (COLORTEXCOORDPSMainJumpFloodResultDDBDILDB$<` DXIL <BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L X2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX 812@ E KP 0 1@/A%``0QVVFlM[Y[[Q@IAxI K(40*(D 17947:E LA` "hA& 0`M 0H @a6 XMeZtǛ%,K half4|xX@h|H12 0b4ppP`,bfn `4ppP`0 1@MAl @ SVp%mA`77 "@  Cq +j),M ΈLl[ !17930:float{ X!8p`,bf?00E hw` +4?0p p`n0 : 0>?1E@e-Ln%m+뭎m-m@j\]ڛ"hHAYX-bDP 0 BW7&GFÌ-N]ݛ[ "hy;0`4lV6} MA@ E `,bDX00)$FA0Y ,l&j9 ` @6enL*D]:32247=@`p,bK`@/$1242:4#/(729<:329 $m  @dܐX?screenHeight@GB_PropertyBuffer@@3IBAبյMѕ]ѡ-b3fV7EWwFFt$%W&G'TgfV&4$mAh[[[ۛ"0PH?outlineColor@GB_PropertyBuffer@@3V?$vector@M$03@@BA'ѱ}ѕᑣ*ã+!+{1c{ cY6la ~ʾf~Hd~H䀚H`f-?C<c@,LMхѕM20 ̅TMMхѕm[~{Ƞѱ5ͭ}ѕ~ʚ־f~Hd~H䀚H`f-?C>(@psXy}0>09327 Cm@L $ ĪLn.mC! \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB RY][H\\Xܜˋ[ݜK[YZ][ ZYK\]]ٛ\]\^]YY[[[\XL YNBH[YZYYY[ٜ HH[YH[ [HBӓPאPQ +\]PY\ +\Y]LJ^H]ܘ\YUNH]ܘ\YRYN[Z]]UN[ [[[ۛNBNBS\TSXJ]HȔ՗U]^QJ^S\[\HS\] +NB ѓTٝ\]H\ț[ț[\Z[HY]\Y[\ ]ۛH[ +JHL + H LN[\ \]ڛH[ [\ ]ۛ +[ HL + +[ JK HL +  HLN[\ۛH[ [\ ]ۛ H KMNB\][\NB_B ZH\YZ\X\ڛțHTQהӛ\ZYHY\YH OHHK LYY[ȔӓTSWS֗SWSSWTӓ +[] +ʌ̍ H L + [] +ʌ̍ H HLJJBYY[їSHK LYY[їSԗS [ їS їSTJBU]\ [[[]\Y] +LNTX[]]\X\Y]LNB[ TSXR]Y[S\H\] +NȔUY]^[ X[YHH\ ]ۛ ^N H]Y\^\]ڛ[H H]HX[Y +H ܘ\YU ܘ\YRY]NB \X[\[]]]]\ٛܛX[Z ][]NV[ٛJHHHHJJ^V[ٛJHJJ^H] \X[YH[XJ] +H JH H H HL + H + L + H ܘ\YU ܘ\YRY]JN][]V]ז]HH H [[[] [J \X[Y LJNH_H_ XX[][\\]ڛٛZ\^[[ [HX[YNB H]\ڛ \]\]ڛ[H][]ٜW[L KNNJ^\][NH_B H]\ڛ \]\]ڛ[H][]ٜW[L  LLJ^\]їSԗSNH_B ܛXH]Z[]HYY\]ڛ[[ YHH[ J][]LL +][]LVL + +][]LזLH ][]ܖLLH ][]ܖLVL + H ][]ܖLזLK][]LL +][]VLL + +][]ܖLLH ][]LזLH ][]VLזL + H ][]ܖLזLWNB HY[H\[ ZHHYZH\\^ț[[Y ]XH]Z[]\\^HY [\\]ڛ[HJ +Y ^ +O L H +YK^ +O LMJ\][NB ۛ\[[^Y\]ڛ[YHۛ\[[^ +Y\NB \\^ț\][ ț\HY +J H ][]ٜW[LLNB [\HYț\\]ڛ[\]H] +ț\NB_B[ TSXR]]S\H\] +NȔUY]^[ X[YHH\ ]ۛ ^N H]Y\^\]ڛ[H H]HX[Y +H ܘ\YU ܘ\YRY]NB H[]Z[^XY]XHHY[]^؛[H[QHܘ\YU +ܘ\YRY] + +ܘ\YU +ܘ\YRY]N[XQHH[QN[ XۛNB Z]\X[\V[ٛJHHHKHOHHJJ^V[ٛJHHKOHJJ^ XX[]ț\\X[\]ڛ[H ț\]HH] +H J ] + +Z]]UNB [J +HY[Z\X[[\Yț[ ٛ ]ț\]H[Xʛ\] H + L + H ܘ\YU ܘ\YRY]JNB YY\]ڛ[XY\[ ț\H[[[] [J ʛ\] LJNB Zț\[X\\]ڛ[[ YHH]H ț\ +H ܘ\YU ܘ\YRY]NB \\]\Y]XY[YH +Y Y\NB Hț\\]ڛHڜ H[\]ڛțH\ZZX] \HZ[XHݛ\Z\]ڛ[Hʛ\ۜKHHїS YXQ]J^XQHYNXۛHț\NH_H_H_B H][XY]X[\[\]ڛ Z]\[\HY\]ڛ[\]H[QHOXQїSԗS XۛNB_BU]\ [[[YS]\Y] +]LNB[ TSXR]T\S\H\] +NȔUY]^[ X[YHH\ ]ۛ ^N H]Y\^\]ڛ[H H]HX[Y +H ܘ\YU ܘ\YRY]NB [HY\]ڛ[[ HYH[[[] [J J] LJN[H\\YH[[[YS] [J J] LJNB HY[[H[\YYHJ\\YKNJ\]Z +   LN HY[[H[\]ڛ[HJYۜKHOHKLJ\]Z +   LNB YY\\]ڛ[[ [Y\HHYۜ +H ܘ\YU ܘ\YRY]NB X\\^\]ڛ[[ X\HH]NB Y]XH\^\\]ڛ[ZYH[[Y\H X\\NB XX[][[[Y +H HXXX\HY[Y\\]ڛHZH\^H\]  +K XXX\]]ZH]ZK[Z\HYXH[ڙ[X]Y\^\ Y]XHH\YYH\^ ZHH\YY\Y[H]ZK[Z\YHZ[[[H[XZ]]UH Y +H  Z]]UZNBZ[[[YZH[[[ًZ]]UNB H[[[[HZXZ H[[[ۛNKJ[[[YZNB\]NB! z.\shaders\include\in_out.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAaNnj. AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAoAAaNnjAaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhAoAAaNnj멎AaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhA$͍L.,DkI(fAoAAaNnj. )AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAČ-.̍D*ȉjAoAAaNnj)AaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAoAAaNnj)M.LAaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAČ-nM mDkI(fAČ-dMDdIjAoAAaNnj. N J .lnAaAČ-nm.. Di**iAoAAaNnj. N J .lnnj-ͭAaAČ-nm.. Di**iAČ-Dͭ, nDDȉ(jA.͍Dͭ,ɍ,mlDDȉ(ɉ(ihjAoAAaNnjH̬AaAČ-m.. Dd m..mAČ-nM DI)iAČ-n.̍D*ȉjAČ-N oM DkIhAČ-nN DkI(fAoAAaNnjN J .lnAaAČ-m.. Dd m..mA-͍L-. .͍. DkIfAoAAaNnjNlͮAaAČ-m.. Dd m..mAČ-N oM DkIfAoAa@%s r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplus@ A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰDKKLĄLi&A &p6 :61AnD M;؄MDd?!l'6`2 }Aɽ ՙMibcA6a5Q,6b0A oL`D.t6k؉p@-bZ6;[Ol(ʂ--b`i \ljb``! .SV_Position $؆&&I6AH ME^^EMMbIjl苽 Uӓ6,hE_hhD}1 `2eE&wVF7AH bm:ذ؄iiE__D_Ɔ@56 5`WG7.B\CPYu ' x̍UYKZ`' X%эK^*encodedPosDn7 66FV6.@tC;u0nAdV܂ 09:q "BOP+sz r !, 9E `0@Dna< VGǖV6.@CH 2outlineAlphaDn= 06.@Cp8u' ٵM ]KY[[ +]KYݔ$*̽ɍѕMD$P[X YY[ܔ`E2V'7VfVV6%H:dx.source.argsSBbW&76%&dx.valverSC2FV&FV6%؉2dx.resourcesSDBWFF67E CbVvD6EFW6%:dx.entryPointsSyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ,P H1Ϸ8ΰLf <~4@m6\B@0_ܶ!l;/TQQCIm[4\BDͰ&0 <<mpK(5=mpO5QQ:mpS a~q,KC`Pa C, DP7@I RHe4PreWC  0F`9k#0C&L= |0A8Hap Q +&)LT 0A8hapḅ  #&.L]# `R43LX$w%bL# `ࡁb<A (p`h@3c@0b  @Ä0b JAL#`P?L#`Ṕ?L#`P?-0b 0Ä0bp 0/&0 3K-'6c@w M&1 ^BC> /!pB |w3K( A?p?0a4ATBp]5c@Dv hBL#`P޹?20b Ä0b XPCeٌ1- 0a A +??30P7c@؄paߌo;c@Dr ,h2`N 'sL#`P¬f3DO0 Aa +??L6c@Ev 1M#`P¬h3X0 A +??LF1 b n0Bτ` b,[L3aX g10) 0F p[`zf Pn18  "-ф@0 iX gƀH7`@ Vp f n18 & A0(h:xA"-[,(3c@0b E-P?0c@r  `e +3[D&0b -p?0c@r hn0b .?0c@r h n0b E.?0c@r h1n0b .?0c@r  pÄ0b .?0a A ?A?L1 b`@ ]aHaƀpA0(v= `@ ]aa1@bzy0f ".[*%`P_*%`@qF VY0bƀA0`zdA`0F VY(a1HXAd ' p 2UUUUv3mGumIm9з>BVD#>R״!>R׶)>R׸>RCHeTg"dфmTQ/TQ9,Mֳ5QQ:`?LK\ N N3؋Pӂ4 H??DEoc9Դ OO5QSTATT`DXIL<BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L U2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X AAԔa z +1@QOCH>QJL~qۈa(D0QG ?a!F+1m# t` 2a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C8:O#! ۨ "DQ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y``!C @2L &GC"J`$ + ʡ + +4ʣ` +(B(pbyyLFD oM $Efe%&,f&gl&eCLd@(  l pycKs++Û h6D!! pѱ5ͭ}ѕmH"! M@  }Aɽ ՙMgBLA !6p0.screenWidth &ٷA#37&WVTvF7A [p]Qk+J#C  ȼѱ Mj@T 3C0PTAlL &0m70 l1 Aj +KsSk3b{{#*c2e6F6A( Bm BM +nBAD,&Ea`!"TEXCOORDm۰0~Pyp|0aЃ>&SV_Target› a# ! +u0 +wyP +S0) +6T"branches4&"mnn@`4ξh̥}+b{ #cQF7QaX\XX`dafFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥM إ%MхѕM K\[ܔṌչѕM dyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q (P H1Ϸ8ΰLV <~4@m6\B@0_ܶl;/TQQCIm4\BDͰ0 <<mpK(5=mpO5QQ:mpS a~qILDN,$0f9effd81909debe99875a5138e5ecaf.pdbHASH ޾ZQ8DXIL`2DXILBC! ) #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L U2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X AAԔa z +1@QOCH>QJL~qۈa(D0QG ?a!F+1m# t` 2a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C8:O#! ۨ "DQ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y``!C @2L &GC"J` Jʠ<(2("(gHq,F!ykLFD oM $Efe%&,f&gl&eCLd@( a0(MfÀ$ 0 p6$φdXb @A l@!6B,`0چ +4768#72:6:.SV_PositionB ӆ 6,y `@bIjPXa 0`! "TEXCOORD lX3# 0@ A0 +;+ 6gb :6`" `C5`CmqpU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\V2<$)0)V ϥ̍N.-͍nnJyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q (P H1Ϸ8ΰLV <~4@m6\B@0_ܶl;/TQQCIm4\BDͰ0 <<mpK(5=mpO5QQ:mpS a~qa nC, PQDRBɕ]!a@0F c /s# `ARA<# `bA@# `bD# ``c9# ``d =#`pA3hB& 0 |L8sA'4b MPAehB4Asİm6E||; hD> v`F1B |LcA0xJ A0H 18( (A0TA‚>#`@*&h& h1X`g@A | 1H$ bA0@rab!`1H$ bA0@rab!P!@DXBCjViY +1=mC DT.778SFI0ISG1`HQPOSITIONSV_InstanceIDOSG1SV_PositionTEXCOORDPSV0d4.  DPOSITIONTEXCOORDTEXCOORDTEXCOORDTEXCOORDdeferred_lights_vsCAD +DDC%C/OILDB+`DXIL+BC! ފ #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 92" d##ㄡL L@ +@@ 3s`0G@$AH) HS A rT9.B*VbFq% ?a!! b!t@l ($7@Iw8ҴCM>%b4ҴQEAD>#p@Β&%PAJ8&txy%qLD<@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C <d2L &GCJ +B("(((P((* (Ѐ((P$Fʠ#h9=g(q2g(?_yXL d!{KsbK;CC #+sAcc4@ oM $Efe%&,f&gl&e@Ì-]ݛ[ <float{ 0b4Z` E ,h  E 4h ( E <h 8 BaG[Y[ݲ6element_countT`YPֵAI HD*44Z 179063half{ <0b40hE 4 `1@#(  @ MfZe `0`cg,bF@`%2292/34/9"VsOutput1@B +HtȾ1@ +HH77070:207E ā`"@M m[ !17930:E ¶ 0Ym00E 4¶ ( 6L  @E `с{,bf(dݛۜ"h@B 6nr0 &6%0Pa5WG6Rp60 &Q 0R QFGm.̭ $͍n)2aP0B)¦Ta &@X@؋UDVYQ[ۛS!笌(-mM(+'ĮlMfJ̍L-) ĮlMFHm2FV&76VGV5V7GW&WFFŖvF6ǖ6h`#UFV&ƔvFmN*,nn4 8l P{c{3b ;[M-%HH)417/20E B,TⰁ{ÓYM.Ă%H 74@:A uDZYK[Y Z]\YY[ٜ [ڠ`D[ 4 & D$ɦa;C;A<"26434$724f "A0,E `a~䀀f~HH`fH`f-@XĂ37147;Aۛ]WБSЛPYЌI[\P ж0X857&WV6EEW7&G` +?screen_pos_to_texcoord@GB_LightConstBuffer@@3V?$vector@M$03@@B LB-b ݛٗ]Z M. mH) nmN̬LhĮlMfHh [E,AZ0zksKbK;C{scQFGˮlMm.̭ $͍g4*E `1@Z^( "hA T0@\E], 6wM!. @ ./E `y,b3 qŖvF75VF4%ŔvF74cCbW6F&D3$m-B[[[ט"0q И_ x -- nkL hJ) nh&JJ̍L-) Hh_229ҁZYK[YW]Z\ YY[]ڛW[ݜ [ڠ0 `@l[0) 4F5(m[0Q 4H58ȅm[0a 4J5(m[0q 4L5H܅m[0 4N5(m[0 4P5(m[0 4^5(l[0 4`5(l[0 4b5(m[0 4d58m[0 4f5X݅}}Յɕ}ѕm[0 4h5݅}}Յɕ}ѕ}}m[04j5݅}}Յɕ}ѕ}}m[04l58watt_per_square_meter_per_sr_per_nm L8[@ ]\XXW[]\ל\ܗ[۶N#P#ٶNcP#ٶNP#\\\]\W[]ܶNP#\\\]\W[]ܶNP#TTSUPUUTUe-Ln%m+mL셮 Nk.Mlm-m-@ | +rjJ +r**¢*B*J:BڶaR|@mj(H*苪J諩k*Ih}G *"$/",*/$m &G2AĒ-@ |0K +"J +r**¢*B*J:Bڶa|,nj)h *)I+*˩)(HjjG`j)hꫩ* kj(H*+ +J kIG/*$m &#ȇ3A-@ |p c+#{:3#̡ͽՑqՙ}ɕͱ Qɕؕѽ񘱽ѱ,I$TD0,`p&VFu&Vg4cCBUGW'W&CdCbW6F&D3mD\$E&u&VgF8q{k c:3!*ã+!!+{j" +ڶa#1"Gi +K c:3ѕɥ}ՙXPɕYؕѽ5m[0IEѡ}ՙ ~о̀f~Hd~H䀚H`f-@ȍH"@|LMхѕMIG ձ}ͅTMMхѕm[0IeG=UQ}%MQm[u@8 ؠdqk}A1q1qa ""$b"/"#5#=#P{ 09327 EL $ ĪLn.m &eRf ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(Ցѕɕ}ѹͱ4(4(ՍсX%5(5(̀́@=M%Q%=94(4(4(ՍсX=5(5(XM}=UQ}A=M%Q%=9ͥ4(р}}Ʌ́Pa ==I4(р}}ѕՅѥPa ==I4(̀ܽɱÁPa ==I4(̀ܽɱAɀPa ==I4(<59%}M!=]M5(р̡}э}ѽ}ѱ́Pa ==I4(5(4(4(LeMQ5} UI0ͥ4(ȕѕɡŤ4(5(ԥр}}չ4(H=1с}}m5a}=59%}1%!QMu4(4(4(4(Ցՙ}ɕͱ4(4(сȕՙѡɀЍ4(5(ȕɹѡ}ՙL1ٕձ}ͅɱѠЍ局ѠЍܥ4(5(4(̀əɵ}}ѡ̀ܽɱAͱ̀إݱс8Y@ɽ͕ՙɁՙɱ̀ձ ɱ幅1MձMɕѡр}}Ʌͱр}}ѕՅѥр̡QQѱͱɀ̍ɕͥ4(5(e95% }1%!QM}I1e}a%Q5(a%Q}MQQ59Qȕɹ4(5(4(̀ɰс}}Ʌ͹遴ܽɱA͹4(сMɽ1с􀐽ѡɰѱɰѥ4(с}􀴅ĔаɠՙɹI՝ͥ4(4(05 IQ}1%!Q5(сȅɀɠ}}Ʌ͹ܥ4(e95% }1%!QM}I1e}a%Q5(̡ձс􀐥Mɽ1сȅ4(\Y}%9QI%9M% M5(̡ձс􀠈\ٕI1\ٕ ԥѡ̡ձѥ4(5(I9 !5(̡ձѥ4(a%Q}MQQ59Q4(5(сMIȍȅɤ4(сѕՅѥ̵ѡхѡMɽ1ѱMI}}ѕՅѥ4(4(̀ɁɰсѡĀMɽ1ѥ4(с81̅Ʌѕѡՙɹɵɥ4(̡QɵѕՅѥ퀀̡5(̡Qɵ􀌅}ɽ}͡ݡ814(4(<59%}M!=]M5(̡Qɵ􀜕=Mݡ̡QQѱͱ}}ɅͱܽɱAͱ81̍ɕͥ4(5(4(e95% }1%!QM}MA U1I5(̀ I􀐥͕1ѡՙɹ͕ ɥ81̡Qɵ}}ѕՅѥ4(͕5(͕̀􀐥͕1ѡՙɹ͕ ɥ4(4(̀ 􀸽ɵ镡إ݁ɥ4(с8!̅Ʌѕѡՙɹɵ 4(сX!̅Ʌѕѡإݱ 4(сI}ɥѥ}8!幅1MձMɕѡ4(с81I}ɥYͥ塜}8Y81X!4(̀I}ɕ͹ձ ɱX!4(̀ȕձс􀠐͕814(e95% }1%!QM}MMM5(MՉMəMɡՙɹѕɥ4(ȕձс􀠘MMM81إݱɥՙɹՙɹɅͱՍ 퀀ՙɹՙɹɅͱՍ Ɂ偼Ɂ5(5(̀ Iȕձс̡Qɵ}}ѕՅѥ4(5(͕5(с81􀐽ѡՙɹɵɰѥ4(сMIȍɠ}}Ʌ͹ܥ4(сѕՅѥ􀜕хѡMɽ1ѱMI}}ѕՅѥ4(сȍɽ1сѡĀMɽ1ѥ4(81ȍɽ14(ѕՅѥ􀌅}ɽ}͡ݡ814(4(e95% }1%!QM}I1e}a%Q5(̡ձс􀴥ѕՅѥ814(\Y}%9QI%9M% M5(̡ձс􀠈\ٕI1\ٕ ԥѡ̡ձѥ4(5(I9 !5(̡ձѥ4(a%Q}MQQ59Q4(5(4(<59%}M!=]M5(ѕՅѥ􀜕=Mݡ̡QQѱͱ}}ɅͱܽɱAͱ81̍ɕͥ4(5(4(̀Ɂɰсȍɽ14(̀ȕձсхɑ I8Y81ՙɹ͕ ɱ}ՙɹI՝ͱձ ɱ幅1MձMɕѡɱإݱՙɹɵՙɹɅͱՍ ɱՙɹɅͱՍ4(e95% }1%!QM}I1e}a%Q5(ȕձс81ȕձс4(5(e95% }1%!QM}MMM5(MՉMəMɡՙɹѕɥ4(ȕձс􀠘MMM81إݱɥՙɹՙɹɅͱՍ 퀀ՙɹՙɹɅͱՍ Ɂ偼Ɂ5(5(̀ IȕձсѕՅѥ}}ѕՅѥ4(5(4(ȕɹ I4(e95% }1%!QM}I1e}a%Q5(Թa%Q}MQQ59Q5(5(5(4(=1H=1с̀ܽɱAͥ4(5(̀Á􀠅͠IܱIŸܱIɸܥ4(̀ܽɱÁA4(̀ȀI遨IŸ遨䁬Iɸ遨4(̅Ʌѕ͡ᥤ4(сс=UQ}%MQ4(Ā4(сс􀴥͠ీ䱀4(сс=UQ}%MQ4(ȕɹс􀘅ссс4(5(4(Ց MUѥ幠ͱ4(Ց}͡}ɥͱ4(4(̀}хɅ}ɀЍс载Ƚхѕ4(5(ЍЍȀĤ载4(Ƚхѕ4(Ѝ􀘱ɠЍЍ䱀ЍЍ䥀4(̀Ɂ􀘱͠Ѝ局ĸ͡Ѝी͡Ѝ䥤4(ɹ4(ɹ􀘱ɠ͡ɹ䥀Ĥ̥ɹ॰͡ɹीĤ̥ɹ䥤4(ȕɹɵ镡ɥ4(5(4(ɀхɅ}̀с载Ƚхѕ4(5(􀐽ѡ͠İİĤ͡4(4(L!I} =5A%1I}!1M14(􀌽ĸ͡ᥤ̕ѡɠİĤɠİĤ而4(͕5(􀌽ĸ͡ᥤɠİĤ耘ɠİĤ而4(5(4(Ƚхѕ4(5(сЕa􀌽4(􀠌4(􀠌䁴Еa4(5(载4(䁨载4(ȕɹ偨Ԁ4(5(4(=1%ѕͥH=1с̀ܽɱAͥ4(5(ȕɹ4(5(4(р ɡH=1с̀ܽɱAͥ4(5(ȕɹ́=1ܽɱAͥ=1%ѕͥ塼ܽɱAͥ4(5(4(X=сɕ}}͡X%сѱԥс}}LY}%х%4(5(X=с4(H=1с􀼵}}m}}u4(р}}Ʌ́􀼱I4(̀ܽɱÁ}}Ʌ͹遬ѹ͹遨}}Ʌ͹܁ĸ4(р}}ѕՅѥ􀜕 ɡܽɱAͥ4(ѹ́ձѠܽɱAͱĤ4(ѹ}}ѕՅѥ􀌽}}ѕՅѥ4(ѹ}}Ʌ́}}Ʌ4(ѹܽɱÁܽɱA4(ѹܽɱAɀܽɱÁܽɱ}٥}͹4(<59%}M!=]M5(ѹ̡}э}ѽ}ѱ́􀜕=1Mх4(5(0%!Q}1%5%Q}M%i5(ѹ}}Ʌ͹܁􀴥ѹ}}Ʌ͹ܱ0%!Q}1%5%Q}M%i4(5(ȕɹ4(5(4(4(4(рɕ}}͡X=сѥ4(LY}Qɝ5(5(р̍ɕ́Q}M I9}A=Mѹͥ4(̀ȕձ4(̀إ4(ɀЍ4(сѱ4(5(Ѝ̍ɕ}}ѽ}э̍ɕ͹4(4(ссȅѡ􀐕ѡ}ՙL1ٕձ}ͅɱЍ4(р́􀘱ѠЍȀİĀЍ䥀Ȁİȅѡĸ4(рܽɱ}ɩձѵ}ٱͥ4(рܽɱÁܽɱ}ɩܽɱ}ɩ4(4(̀Q啁ܽɱA͹遴ܽɱ}٥}͹4(4(р}}Ʌ́􀤹ѹ}}Ʌ4(<59%}M!=]M5(р̡QQѱ́􀤹ѹ̡}э}ѽ}ѱ4(͕5(р̡QQѱ́􀘱Ѡ4(5(ٕ̀ɽÁ}}Ʌ͹遴ܽɱA͹4(إ݁4(с4(4(̡ձс􀐽ѡٕɽAͱٕɽAͥ}}Ʌ͹܁}}Ʌ͹4(\Y}%9QI%9M% M5(̡ձс􀠈\ٕI1\ٕ ԥѡ̡ձѥ4(5(I9 !5(̡ձѥ4(5(@ɽ͕ՙɁՙɁȕAɽ͕ՙɡЍ4(4(сMŁ􀐽ѡQ啱Q啥4(сIсѡMť4(إ݁Q啁I4(сȍIѥ4(с8Y􀐽ѡՙɹɵإݥ4(̀ȕѥYȀ8Yՙɹɵإ4(с8Y􀄉͡8YĔ4(4(幅1MձMɕѡ􀜉ՙɹɅѕ}}4(ͅ쀀ᵕܕ̡ձ͕LM=ɕ4(٥=􀜉ՙɹͅ퀀ܕѥձѕ偄ɱ̽ܕЁɽ=5(1=􀠔٥=ԀԤ4(ձ=ͥ􀌽ѕM=ͥ̅Ʌѕ8Y٥=ՙɹI՝́ՙɹI՝ͥ쀀ͥ5(̀ձ Ɂ􀜉ՙɹձ Ɂձ=ͥՙɹɅѕ}}4(4(р}}ѕՅѥ􀤹ѹ}}ѕՅѥ4(ȕձсəɵ}}ѡܽɱA͹鱀إݱ8Yՙɱՙɹձ ɱ幅1MձMɕѡՙɹ}}Ʌͱ}}ѕՅѥ̡QQѱͱ̍ɕ͹4(ȕձс1=4(4(ȕɹѠȕձѱĤ4(5(5(4(ȕɹѠ4(m4!p͡qՑq MUѥ幠ͱ7<34:173: 663492922*9729222:729:2$*22$*)'")('$""))$*** ) ',' ,$'"$*")",()')&(""$!*$# &("" ) ')'#$*)')  )* *)""! ' $$,')'$'#$"'*22722<4308::799)009280094301243723'')*$$/$)242'')*$$/$)0690722743:0929:17391777992:3406<34:<:8227949029#!97:4779922422<:4291790720;424707200686902322722228062979;27684330970664720972877922247029302799:2072972244777:9:4:40509 04:1:9297327229#!97:40779920720:0929:17779068$97:0:2:92;140227280220734:4!)*9899#!9;0:09:06612<:92072;2722707!"7479:<534:9#!2<:99:4042279806<791:27243072:2409:6922722724:4:29#!687998<30409)#!30< 88702<;<2:9721:<<;<30)#!740930< 88702<;<2:9721:<<;<*2:179042;72327:<0887029#!4:407297930409)#/9:30<2:9721:<<89:<<30)#!740/9:30<2:9721:<<<89:<30:0)#!74094730<=2:97)#!740930:02409)#!4730<=2:97409)#!*2"*#2722797727:9;777$"*9*9068<41277:9:0887802794347005274727:30409730<2:9721:<<;<30740930<2:9721:<<;<*99:2;$"):0929:177070622(792280607429304097!3030:30:630:30:130:30&8;&2:97;1&&630!74093030:30:630:30:130:30'8;'62:97;0<'81'779927727*224097:27209 77992772779010739247409 214207799292422<:4217:29171043924776900:4179:64807772:01043:277992<:6:47779:0:02::73:7927799902029:9:077:29+2777294327793604::7066::04209<:6:;140242<841247:0:77992$::622406746207794242;14229:49<42<8412:2401779*90943077992:0:99429412*,-779929:2::0606264377992::4:9:2:779:08729<73043042099406<47,0727791::90:9:2:097077072027,072-72:609442*<0702:487729222<4443<,0643,072-72224777*'&9*97799290622*+7957302:2927210729#!902:22779809072;4247:*4977<43229:2:0929:9222307!30#79:30770:2:97:6770:#30!730#!79:30770:2:97:6770:#!307$30#79:30770:2:97:6770:#30$730#79:30770:2:97:6770:#2743'')*$$/$) k-Ln+m+mL+mL .L.mm-lNQ5=MA!I}AI5QIM5(Q5=MA!I}AI5QIM4(4(Ցѵɕѥ͹ͱ4(Ցѵɕѥ}չ͹ͱ4(4(4(ѵɕɅѕ4(4(TͥСٕͱܕ݁СɅѕ́Ɂѵɕ5(\хсܥѡСѥͥɽͱܡɕ5(Ʌѕ́СсСѥՑ4(4(4(4(PѵɕɅѕ́ɕССݥՍ4(4(4(С́́сՙɁ AU̽сснф4(ՍсѵɕAɅѕ́5(P̽ɁɅсСнСѵɕ4($ɅMյ̽}Ʌ4(Pչ́ձɁȅ͹\ɹСхѥ͕́ɽ᥵ѥ5(Ссɕ؅偤С̵́́ɁСĀȅ͹4(չ}ձ}Ʌ4(4(P̍ѕɥсɁձ́сСѥՑܡɕС5(ͥ偤́᥵յՅСѽСѵɕ́չѥ5(܅ٕѡP̍ѕɥссѥՑ́Յн5(ȅ展}͍ѕɥХ́ȅ展}ͥ址сС́ѥՑ4(LѕɥMյȅ展}͍ѕɥ4(PͥɽɁձͱչѥɽѥՑн5(ͥ́؅Օ́ݕձͥ奀Ā᥵յͥ奸4(ͥAɽȅ展}ͥ4(8յɁȅ展}ͥ}ѥՑ}}ѕɵ4(4(P̍ѕɥсɽͽ́сСѥՑܡɕСɁͥ5(́᥵յՅСѽСѵɕ́չѥ5(܅ٕѡP̍ѕɥссѥՑ́Յн5(}͍ѕɥХ́}ͥ址сС́ѥՑ4(LѕɥMյ}͍ѕɥ4(PͥɽɽͽͱչѥɽѥՑн5(ͥ́؅Օ́ݕձͥ奀Ā᥵յͥ奸4(ͥAɽ}ͥ4(8յɁ}ͥ}ѥՑ}}ѕɵн逴ɕ̽ѥѕ5(4(Pѥѥсɽͽ́сСѥՑܡɕСɁͥ5(́᥵յՅСѽСѵɕ́չѥ5(܅ٕѡPѥѥссѥՑ́Յн5(}ѥѥХ́}ͥ址сС́ѥՑ4(LѕɥMյ}ѥѥ4(P嵕ɅѕɁɁС ɹѕĹ͕չѥɁС5(ɽͽ́݅ɑܕѹ4(8յɁ}݅ɑ}͍ѕɥ}ݕ4(4(̕5(8յɁ|ɕѡɁСĸсȕѥٕн4(|ѥՑܡɕݥɕѡ́4(|ͥ}ѥՑ}}ѕɵ4(8յɁ4(Pѥѥсձ́Ссͽɉс齹5(СѥՑܡɕСɁͥ偤́᥵յ́չѥ܅ٕѡ4(PѥѥссѥՑ́Յн5(ͽѥ}ѥѥХ́ͽѥ}ͥ址сС́ѥՑ4(LѕɥMյͽѥ}ѥѥ4(0ѡͽѥ}ͥ}}ͽѥɽ5(4(PٕɅСɽչ4(ͥMյɽչ}4(PͥС᥵յLչ蕹ѡɁܡѵɥ̍ѕɥ5(сɕѕɁ᥵յɕ͕ͥС̵сLչ蕹ѡ5(䥕̭偰сȅ؅Օ͹ɁхɁС5(ѡ͕Ȁɕ́́䥕}}Ȥ4(8յɁ}}нȕٕ5(4(ɕ5(ͥMյ}Ʌѥ}4(8յɁձѥ}͍ѕɥ}ѽ4(4(PхݕСсѕɁСѽСѵɕ4(0ѡѽ}Ʌ4(PхݕСсѕɁСнСѵɕ4(0ѡн}Ʌ4(4(P嵕ɅѕɁɁС ɹѕĹ͕չѥɁС5(ɽͽ͹4(8յɁ}͕}չѥ}݅ɑ}4(8յɁ}͕}չѥ}݅ɑ}4(4(ɠĸȸݡȸĸȸĸĸԤ4(ѥ镑͕5(р}͕}4(PͥɽɁձ́Ссͽɉс齹4(չѥɽѥՑнͥ́؅Օ́ݕձͥ4(Ā᥵յͥ奸4(ͥAɽͽѥ}ͥ4(ɀͽѥ}ͥ}}ѕɵ4(ɀͽѥ}ͥ}}ѕɵ4(4(鼼ܥɝܥ,եѡ}ٕ5(٥,եѡсȕձ́İ䰀Ĥ4(ձ၈ɥѕ́́܅偐ɭ5(ͥMյ}İ䰀ĤԀ偐ձѹPс̭́偄5(8յɁչ ɥѹС́́偐ձѹСсٕ́ѡ̭偄չ5(4(4(mM.\shaders\include\atmosphere\definitions.hlsli`$̍ $i + +H苨()*iAa,ͭ $i + +H苨()*i +$Aa,ͭ  Č-Aa,ͭ *̮ Č-Aa,ͭ $팭 Č-Aa,ͭ d-,팭 Č-Aa,ͭ LČ-Aa,ͭ -nLČ-Aa,ͭ ĩMLČ-Aa,ͭ $ͮLn Č-Aa,ͭ $H, Č-Aa,ͭ ꍭ Č-Aa,ͭ ĩMLm..Č-Aa,ͭ $IN.,-m Č-Aa,ͭ D*,-m Č-Aa,ͭ d +lN. LČ-Aa,ͭ d +lN.-IN.,-m Č-Aa,ͭ d +lN.M*,-m Č-Aa,ͭ d +lN.M*,-mm..Č-Aa,ͭ dj,L.l,m,̍Č-Aa,ͭ $ͮLnl-,팭 Č-Aa,ͭ -n.ɍm..Č-Aa,ͭ --m Č-Aa,ͭ $--m Č-AA$̭L.m Ĭm. L *̮ d L.̥Aa,ͭ $HlN.ln +lN Č-nA$Ĭm. L *̮ ĩMLΥAa,ͭ (m.͍lnn +lN Č-nA$Ĭm. L *̮ d +lN. LΥAa,ͭ Ln +lN Č-nA$Ĭm. L *̮ d +lN.-IN.,-m̥Aa,ͭ $IN.,-ml +lN Č-nA$Ĭm. L *̮ d +lN.M*,-m̥Aa,ͭ D*,-ml +lN Č-nA$Ĭm. L *̮ d +lN.M*,-mm..ϥAa,ͭ D*,-mm..o +lN Č-nA$Ĭm. L *̮ dj,LN.l,m,̍ΥAa,ͭ dj,L.l +lN Č-nAA$m.. $ de .l.ťAa,ͭ m.. Č-nA$-,Ml. ĮlM$ de-ln.l.ťAa,ͭ (Ml. Č-nA$ĮlM d--m .lΥAa,ͭ --mlČ-nA$ĮlM d$--m .lΥAa,ͭ $--mlČ-nAAa,ͭ dj)hk*H*k*鈩kj(H*$Aa,ͭ dI(ɩkj(H*苪Jh +$AAa̍,l'qB:pC #+Jsc#+ +k{C++"+3KsKK{ssKsAccK#ifndef ATMOSPHERE_DEFINITIONS_UNITS +#define ATMOSPHERE_DEFINITIONS_UNITS 1 + +#include "atmosphere/definitions.hlsli" +#include "hardware_defines.hlsli" + +struct SamplerTexture2D +{ + Texture2D tex; + SamplerState tex_smp; +}; +struct SamplerTexture3D +{ + Texture3D tex; + SamplerState tex_smp; +}; +SamplerTexture2D from_texture2d(Texture2D tex, SamplerState tex_smp){ SamplerTexture2D r;r.tex=tex;r.tex_smp = tex_smp;return r;} +SamplerTexture3D from_texture3d(Texture3D tex, SamplerState tex_smp){ SamplerTexture3D r;r.tex=tex;r.tex_smp = tex_smp;return r;} + +#define SamplerTexture2DFromName(a) from_texture2d(a, a##_samplerstate) +#define SamplerTexture3DFromName(a) from_texture3d(a, a##_samplerstate) +#define TransmittanceTexture SamplerTexture2D +#define AbstractScatteringTexture SamplerTexture3D +#define PreparedSkiesScatteringTexture SamplerTexture2D +#define PreparedScatteringTexture SamplerTexture3D +#define ReducedScatteringTexture SamplerTexture3D +#define ScatteringTexture SamplerTexture3D +#define ScatteringDensityTexture SamplerTexture3D +#define IrradianceTexture SamplerTexture2D +#define MultipleScatteringTexture SamplerTexture2D + +#define IN(t) t +#define OUT(t) out t +#define INOUT(t) inout t +#define INLINE +#define G_UNUSED(a) +#define assert(a) +#define vec2 float2 +#define vec4 float4 +#define vec3 float3 +#define TEMPLATE(a) +#define TEMPLATE_ARGUMENT(a) +DimensionlessSpectrum DimensionlessSpectrumFromTexture(float4 a) {return a.xyz;} +AbstractSpectrum AbstractSpectrumFromTexture(float4 a) {return a.xyz;} +IrradianceSpectrum IrradianceSpectrumFromTexture(float4 a) {return a.xyz;} + +float mod(float a, float b) {return fmod(a,b);} + +float4 sample_texture(SamplerTexture2D ts, float2 uv) +{ + return ts.tex.SampleLevel(ts.tex_smp, uv, 0); +} + +float4 sample_texture(SamplerTexture3D ts, float3 uv) +{ + return ts.tex.SampleLevel(ts.tex_smp, uv, 0); +} + +/* +

Physical units

+ +

We can then define the units for our six base physical quantities: +meter (m), nanometer (nm), radian (rad), steradian (sr), watt (watt) and lumen +(lm): +*/ + +static const Length meter = 1.0; +static const Wavelength nm = 1.0; +static const Angle rad = 1.0; +static const SolidAngle sr = 1.0; +static const Power watt = 1.0; +static const LuminousPower lm = 1.0; + +/* +

From which we can derive the units for some derived physical quantities, +as well as some derived units (kilometer km, kilocandela kcd, degree deg): +*/ + +static const Length km = 1000.0 * meter; +static const Area m2 = meter * meter; +static const Volume m3 = meter * meter * meter; +static const Angle pi = PI * rad; +static const Angle deg = pi / 180.0; +static const Irradiance watt_per_square_meter = watt / m2; +static const Radiance watt_per_square_meter_per_sr = watt / (m2 * sr); +static const SpectralIrradiance watt_per_square_meter_per_nm = watt / (m2 * nm); +static const SpectralRadiance watt_per_square_meter_per_sr_per_nm = + watt / (m2 * sr * nm); +static const SpectralRadianceDensity watt_per_cubic_meter_per_sr_per_nm = + watt / (m3 * sr * nm); +static const LuminousIntensity cd = lm / sr; +static const LuminousIntensity kcd = 1000.0 * cd; +static const Luminance cd_per_square_meter = cd / m2; +static const Luminance kcd_per_square_meter = kcd / m2; + +#endif9 ZYW[YW]Z\Y]ڛۜ [kP F@F@@b^^@@@@@@@@@@\^^@@@@^TT@T@@PR@d`bn@@@T@@@\@T@T@@@@@@@@X@@@@T@X@@@@@@@@T@@t@T@b\@@@@@@@@@@T@@@@X@@@@@@@@\@T@d\@@@@@@@@@@T@@@@X@@@@@@@@@@@T@@@@@^@@@@@@\@T@f\@@@@@@@@@@@@@T@@@@@@@@@@@@@@@T@@@@@@@@@@\@T@T@@@@@@@@@@@D@D@T@@@@@@X@X@@@@X@@T@@@@@@@@@@@T@@\@@@@@@@@@@@T@@@@X@X@X@X@X@@T@@@PX@@@@X@@@T@@@@v@@@X@X@@v@@@T@R@@@@@@@@X@@@T@X@@X@@@P@@@R@T@@@@@@@@@@@X@@@@@T@@@@@\@T@T@@@@T@@PR@d``p@@T@@@\@T@T@@@@@@@@X@@@@T@X@@@@@@@@T@@t@T@b\@@@@@@@@@@T@@@@X@@@@@@@@\@T@d\@@@@@@@@@@T@@@@X@@@@@@@@@@@T@@@@@^@@@@@@\@T@f\@@@@@@@@@@@@@T@@@@@@@@@@@@@@@T@@@@@@@@@@\@T@T@@@@@@@@@@@D@D@T@@@@@@X@X@@@@X@@T@@@@@@@@@@@T@@\@@@@@@@@@@@T@@@@X@X@X@X@X@@T@@@PX@@@@X@@@T@@@@v@@@X@X@@v@@@T@R@@@@@@@@X@@@T@X@@X@@@P@@@R@T@@@@@@@@@@@X@@@@@T@@@@@\@T^F@D^\DF@D^ʾ\D^^F@D^Ȧd\DF@Dʾ\D@@ʆȌڪP@X@@ʾR@@@`\j@^@PʾR@V@@T@Pb\`@Z@b\`@^@PʾRRv@@ʌڨʆP@X@@ʾR@@@P@^@Pb\`@Z@b\`@^@PʾRR@Z@`\j@^@PPʾR@Z@b\`RRv^^@@@@X@@@@@d@ʨʪڤPPʠR@ʾX@@@@@X@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@^^@@@@ʾ@@@@@@@@\@@@@z@Pʾ\@T@ʾ\@Z@@@@@@ʾ\ھ@T@ʾ\ھRv@@^^@@@@\@@@@z@@@@@@ʦP@T@@Z@ʾ\ھ@T@ʾ\ھRv@@^^@@@@@ʾ@@@@@PXRX@@@@@^^@@@@@@@Z@@@PXbR@@PXR\@@@@z@ʨިʄPʾX@X@Rv@@@Ⱦ@z@ʾ\@Z@v@@@Ⱦ@z@@V@v@@@@z@P@Z@ȾR@^@PȾ@Z@ȾRv@@@@z@@^@v@@@dPʆȌڪPX@RX@@@@@@@@@@@@@@ʆȌڪPX@RRv^Tx|@@@@@tT^@@褚ڨʨʪPPʠR@ʾX@@@@PdR@X@PR@X@PR@R@@P\@|z@`\`@LL@\@xz@b\`Rv@@P\@|z@`\`@LL@\@xz@b\`Rv@@@@z@ʌڨʆP\X@Rv@@@@z@ʌڨʆP\X@Rv@@^^@@@@ʾ@@@@@@@@\@@@@z@Pʾ\@T@ʾ\@Z@@@@@@ʾ\ھ@T@ʾ\ھRv@@^^@@@@X@@@@@@t@@@@z@@T@v@@^^@@@@X@P`@V@TR@@@@@@X@@@@@@@@@z@@|@`@~@P@T@@V@ʾ\ھ@T@ʾ\ھR@t@ʾ\ھv@@^^@@@@@ʾ@@@@@PXRX@@@@@^^@@@@@@@Z@@@PXbR@@PXR@Z@@^^@@@@@@t@@@Ⱦ@z@ʾ\@Z@v@@@Ⱦ@z@@V@v@@@@z@Ⱦ@V@@T@PȾ@Z@ȾRv@@@z@@zz@`\`@T@@~@Pb\`R@t@P@T@@Z@@T@@Z@@T@R@^@Pd\`@T@@T@Rv@@@z@PRv^Tx|@@@@@@@@@@@@@@@@tT^@ʨިʄP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@X@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@d@@z@ʨʪڤPʾX@X@Rv@@@ڌڨPʾPʾX@RRv@P@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@X@@X@@X@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@P@|z@`\`@T@Rv@@@@z@PʾX@P@T@@V@d\`@T@@T@@T@@V@@T@RRv@@@@z@PP@T@@V@R@^@Rv@@@PR@@@@@@P@@@@@@@@ʨިʄP@@@@@@@@@@@@ʾX@ʾX@X@ZR@^@@@@@@@@PfPbZb`X@bZb`X@bZb`RX@ʨިʄP@@@@@@@@@@@@ʾX@ʾX@X@ZRRRv@@@@@@@@@P@@@@@@@@ʨިʄP@@@@@@@@@@@@ʾX@ʾX@X@R@^@@@@@@@@PfPbZb`X@bZb`X@bZb`RX@ʨިʄP@@@@@@@@@@@@ʾX@ʾX@X@RRRv@@@ʨަP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@X@@R@@@ܾ¾@z@ʾ\ھ@^@v@@@¾@z@ZPPb\`@Z@ܾ¾@T@ܾ¾X@`\`RRv@@@ʨިʄP@@@@@@@@@@ʾX@ʾX@X@R@T@@@@@@PZܾ¾@T@ʾ\ܾ@^@X@@@@@@@@@@@@@@@@@ܾ¾@T@ʾ\ܾ@^@X@@@@@@@@@@@@@@@@@@Z@¾Rv@ʨޜʄPPʠR@ʾX@@@@@X@@X@@R@@@PR@@@@@@ʨބڂʄPʾX@X@Rv@@@@@@@@@ʨިʄPʾX@X@Rv@@@ʦȂ@РʌP@R@@ʦȂ@@z@f\`@^@Pbl\`@T@@T@Rv@@@@T@Pb\`@V@@T@Rvd@ʠʆP@RvF@`@@ʠʌ܈ʄP@X@@R@@@ʠʌ܈ʄОPhPʠʆPRTP`\jXZb\^b\jRX@ʠʆPZ`\djTRTP`\jXZb\^b\jRRX@Rv@@^^@@z@d\`@T@Pb\`@Z@@T@R@^@Pd\`@V@@T@Rv^^@@@@^^@@z@b\`@V@@T@@Z@d\`@T@@T@v^^@@@@@Pb\`@V@@T@R@V@PZd\`@T@RTX@@@@@@Z@@PXZb\jR@@^^@@^@PTPRRv^^Pb\jR^^@@^^t^^\^^bpbd\``nrr\^^@@@@@^^@@@ʦȂ@ʠʆʦP@X@@R@@ʦȂ@@z@f\`@^@Pp\`@T@@T@R@T@Pb\`@Z@@T@R@^@Pd\`@V@@T@Rv@@@@z@b\`@V@@T@@Z@d\`@T@@T@v@@@@T@Pb\`@V@@T@R@^@PTPRRv^^Pb\j^^@@@@ʦȂ@ʠʈ܌P@X@@R@@@@z@b\`v@@ʦȂ@@z@f\`@^@Ph\`@T@@T@R@T@Pb\`@Z@@T@R@^@Pf@V@TPb\`@V@d\`T@T@RRv@@@@z@b\`@V@@T@@Z@d\`@T@@T@v@@@@T@Pb\`@V@T@T@R@^@PTPRRv^^Pb\j^^t^^\\\^^djZf^djZfZd\^^@@ʦȂ@ʠʴΌP@X@@R@@ʦȂ@@z@f\`@^@Pp\`@T@@T@R@T@Pb\`@Z@@T@R@^@Pd\`@V@@T@Rv@@@@z@b\`@V@@T@@Z@d\`@T@@T@v@@@@T@Pb\`@V@@T@R@^@PTPRR@V@TTb\`^Ph\`T@T@RvF@@ʠP@X@@R@@@Bz@`@~@PX@R@t@`v@d@ʠʆP@X@@R@@@dPb\`@V@@T@X@Z@d\`@T@RTʠPTd\`@T@Pb\`@Z@@T@R@^@Pd\`@V@@T@RX@b\^Zb\jRv@d@ʠʆP@R@@@ʠʆPX@bRv@@@ʠʌ܈ʄОPh@ʾʾX@@R@@@Ⱦ@@z@ʾʾ\@V@ʾʾ\Tv^^@@@@@Pb\`@V@@T@R@V@PZd\`@T@RTX@@@@@@Z@@PXZb\jR@@@Ⱦ@z@ʾʾ\@V@ʾʾ\Tv^^@@@@@Pb\`@V@@T@R@V@PZd\`@T@RTX@@@@@@Z@@PXZb\jR@@@PȾX@Zb\jR@V@PȾX@Zb\jRv^^@@@@PTPRR@@TTPR@@bV@ʦ@ȤʞPh@ʾʾX@@ʦ@X@@ʦ@ʾʾX@@@R@@@P@V@ʾʾ@T@@@@@@ʠʌ܈ʄОPʾʾX@RR@T@РʌPRv@ʦ@ȤPPʠR@ʾX@@ʦ@X@@ʦ@ʾʾX@@@R@@@ȤʞPʾ\ʾʾX@X@ʾʾX@Rvʦ@P@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@X@@Rvd@ʨʪڤPPʠR@ʾX@@@@@X@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@z@P@Z@ʾ\ھR@^@@@@@@Pʾ\@Z@ʾ\ھRv@@@@z@@T@`\j@V@`\jv@@@dPʆȌڪPX@RX@@@@@@@@@@@@@@ʆȌڪPX@RRv^Tx|@@@@tT^@褚ꦌڒʨʪPPʠR@ʾX@@@@PdR@X@PR@X@PR@R@@P\@|z@`\`@LL@\@xz@b\`Rv@@P\@|z@`\`@LL@\@xz@b\`Rv@@@@z@ʌڨʆP\X@Rv@@@@z@ʌڨʆP\X@Rv@@@z@ʾ\ھ@V@@@@@@@T@Pʾ\@Z@ʾ\ھRv@@@z@Pd\`@T@@Z@b\`Rv^Txh@zDʾD|x^h|x|@@@@X@@@@@@@@@@@tT^ʦ@P@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@X@@R@@d@@z@ʨʪڤPʾX@X@Rv@@@ʦڌڨPʾPʾX@RRv^^@@ȦʚʦΆP@@@@@ʚʆX@PhR@R@@^^@@@@@@X@@@@@@@^^@@@@@@@\@@@P\@^@P\X@bZhRR@T@ʚʆv^^¤@z@P¤\@^@¤Rvʦ@ȦʚʦΈP@@@@@ʚʆX@PhR@R@@@ʦڌڨPR@T@ȦʚʦΆPʚʆX@Rv@ȦʚʦΆ̆P@@@@PʠR@ʾR@@@Pʾ\о\@^@ʾ\ʾ\R@T@@@@Pʾ\ʾ@^@ʾ\оRv^^F@ʦ@ȦʚʦP@@@@PʠR@ʾX@PhR@R@@@ȦʚʦΈPȦʚʦΆ̆PʾRX@RvF^Tx|@@@@@@@@P@V@@@@X@@@@@@@@R@@@X@@x@zDFʾξD|x|x^|x^|@P@@@X@@@@@@@x|x^|X@@@@@@@@@@@@@x|ξx^|@x|ʾʾξx^|RtT^F@@Pbbd\^bdp\RF@@PTR@ξިƾP@X@d@޾ȾR@@PPT޾Ⱦ\@V@޾Ⱦ\RRv@ξިƾP@X@d@޾ȾR@@ξިƾPTb```X@޾ȾRv^^t@ξިƾP@X@h@޾ȾR@@@@z@PT޾Ⱦ\@V@޾Ⱦ\Rv@@@Έ@z@PT޾Ⱦ\@V@޾Ⱦ\Rv@@@P@x@@~@@t@ΈRv@ξƨވ辖P@ưX@h@޾ȾR@@@@z@PưTưRv@@@`\``bTP@x@@~@PZ޾Ⱦ\R^޾Ⱦ\@t@PZ޾Ⱦ\R^޾Ⱦ\RvF@@`\p@ξިP@R@@^^@PRTPZb\^R@V@bv@@@@V@P@x@`@~@@t@PbZRRTv@ξƨެP@ƲR@@^^@PZTPƲZbRRv@@d@Ƞ@z@Ʋx@~@dPPb\^RX@ZbR@t@dPPb^PbZRRX@Z@Pb^PbZRZbRRv@@@ƲTȠ\@V@Ƞ\vd@ȾξP@X@@X@d@޾R@@@dPξިƾPX@޾RX@ξިPRRvd@ξȾξP@X@@X@h@ξ޾R@@@dPξިƾPX@ξ޾RX@ξިPRRv@ȨʪP@@@@PʨR@ȾʾX@@@@d@R@@@ڌڨPʾPȾʾX@RRv@ʚʦ΂P@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@ʆX@@@@@X@PR@X@PR@܈X@@@@PʦR@X@PR@ҦbR@@@@z@\X@@z@PX@܈RX@@z@܈\v@@^^@@@@@@@@@@@z@PʾX@X@Rv@@@@z@ʨޜʄPʾX@X@X@Rv@@@@z@^ʆv@@^^@@@@@@@@@@@z@ʦP`\`X`\`X`\`Rv@@Ҧb@z@P`X`X`Rv@@@@z@Pb\`Xb\`Xb\`Rv@@@@z@`\`v@@@P@@z@`v@@xz@ʆv@VVR@@@@@@@@z@P@zz@ʆ@@@zz@`R@~@`\jT@t@v@@@@@Vz@v@@@@@@z@PʾX@P@T@@V@d\`@T@@T@@T@@V@@T@RRv@@@@@@z@PP@T@@V@@T@R@^@Rv@@@@@X@v@@@@ʚPʾX@Zʾ\ھX@P`X`X`RX@X@Rv@@@@@z@PX@Rv^^@@@@@@@@@@@ʨ@z@PZ@T@Rv@@@@@ʨަ@z@ʨަPʾX@ʾX@X@Rv@@@@f@@z@ʨަ@T@v@@@@^^@@@dp@@t^^\\^d`bj^`p^ZZZZZZ^@@@@f@@z@P@Z@@T@ʨR@^@v@@@@^^@@@@@@@@@@@Vz@@T@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^^@@@@@@@@@@@@@@@^^@@@@@@@@@@X@@@@@xb@@@@@\@@@@^^@@@X@Ҧb@@@@@@@@@\@@@@^^@@@@@@@@@@@@@@@@@dp@@t^^\\^d`bj^`p^ZZZZZZ^@@@@^^@X@@@@@@@@@@@@@@@@@@@j@\@@@@@@@@@@\@@@@f@@z@v@@@@f@@z@P@Z@@T@ʨR@^@v@@@@Ҧb@Vz@@T@v@@@@@z@Tʨv@@@@^^@@@@@@ڠ@z@b\`@^@Ph\`@T@Rv@@Tzڠv@@@PR@@@@@@^^@@@@@@@@@@@@@z@ʾ\ھv@@@@@@z@v@@@@@@z@PP@T@@V@@T@R@^@Rv@@@@f@ʨަ@z@ʨަP@@@@@@@@@@@@ʾX@ʾX@X@Rv@@@@f@Ⱦ@z@PfP`X`XR@V@@T@Rv@@@@@@@z@PPȾX@܈RRv@@@@@Vz@ʨަ@T@@T@@T@ʾ\Ⱦ@^@v@@F@^^@@@@@@@@@@@ئڦP@R@TvF@ʦ@ʦΌP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@ʆX@@@@@X@PR@X@PR@܈R@@@@z@\X@@z@PX@܈RX@@z@܈\v@@^^@@@@@@@@@@@z@ʨޜʄPʾX@X@X@PʾX@X@RRv@@@@z@^ʆv@@^^@@@@@@@@@@ʦ@@z@ʦP`\`X`\`X`\`Rv@@f@@z@Pb\`Xb\`Xb\`Rv@@@Рʬ@z@РʌPRv@@@ʠʬ@z@РʬTʠʌ܈ʄОPʾ\ʾʾX@Rv@@@@z@`\`v@@@P@@z@`v@@xz@ʆv@VVR@@@@@@@@z@P@zz@ʆ@@@zz@`R@~@`\jT@t@v@@@@@Vz@v@@@@@@z@PʾX@P@T@@V@d\`@T@@T@@T@@V@@T@RRv@@@@@@z@PP@T@@V@@T@R@^@Rv@@@@ڦʤ@@z@ʚڌPʾX@Zʾ\ھX@P`X`X`RRv@@@@@f@ʞ؈@z@\@T@v@@@@@f@ʨ@z@PZʞ؈Rv@@@@f@ʨަ@z@ʨަP@ʾX@ʾX@X@Rv@@@@F@@@@@@@^^@@@@@@@@@@@@z@PfP`X`X`RX@X@X@Rv@@@@@@ʨަ@Tz@ئڦPRv@@@@F@@@@f@ʨ@z@\Κ@T@ʠʬ@V@\Τ@T@Рʬv@@@@f@ҦȘ@z@fP`X`X`Rv@@@@^^t@@@@@~@@@@^^f@ҦȘ@z@ʦPʾX@ʾξX@X@Rv@@@@f@@z@Pʨަ@T@ʨ@V@ҦȘ@T@\Rv@@@@f@@z@P@Z@@T@ʨR@^@\v@@@@^^@@@@@@@@@@@Vz@@T@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^^@@@@@@@@@@@@@@@@z@Tʨv@@@@@vʦ@ʒʦP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@@X@@X@@@@@X@@@@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@@z@@^@PRv@@@@@z@@^@PRv@@ʦ@@z@@@@@@ʦP`\`@T@ʾX`\`@T@ʾX`\`@T@ʾRv@@f@¾@z@fPPb\`@Z@@T@RX@`\`X@Rv@@@P@@z@`v@@x@@^@dv@VVR@@@@@@@z@PPR@V@`\jR@T@v@@@@@P@@z@`v@@x@d@T@v@VVR@@@@@@@@@z@PPR@V@`\jR@T@v@@@@@@f@@z@@@@@@@@@@fPPR@T@PRX@PR@T@PRX@PRRv@@@@@@Ȃ@@z@P@^@R@T@P@^@R@T@PR@T@v@@@@@@@Vz@ʦΌPʾX@ʾX@X@X@X@¾R@T@@@@@@@@\@T@@T@ʾ\v@@@@@@@@@vʦ@ʦPPʠR@ʾX@PʦΨR@ʾξX@@@X@@R@@@ҦΘ@z@v@@d@@z@PdPT`\j@V@`\jX@P@Z@ʾ\ھR@^@Pʾ\@Z@ʾ\ھRRRv@@@z@dPʆȌڪP\X@ҦΘRX@ʆȌڪP\X@ҦΘRRv@@@ʦڌڨPʾPʾξX@RRv@ʦΤ@@ʦ@v@@@@@@@@@@@@@@@@@@@@@@@^^@@@PR@@ʦ@XXv@@@v@@@@@@@@@@@^^@@@`Xb@PRv@ʦΤ@ʦȘʚP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@PʦΨR@ʾξX@@@@PR@ȠX@PR@ȈX@@X^^@@@@@@@ʆX@@ʦʆX@d@Кܚ𦠠X@@@@@X@@X@@X@@X@@@@@X^^PʾX@X@R@@@@@@z@r``````\`R@@ʦΤ@v@@\@z@\@z@\@z@\@z@ʦP`X`X`Rv@@@@z@`v@@F@@@\@z@PbXbXbRv@@^^@@@@\@@^^@@@@@@@@@@@@\@@^^@@@@@@@@@@@P@|@ʾ\R@@@@@@@@z@Tv@@@@@ʾ޾ʾ@z@Z@Z@@@@@@P@T@@Z@@T@@V@ʾ\@T@ʾ\Rv@@@@@Pʾ޾ʾ@|@`\`@T@R@@@@@@@@z@ʾ޾ʾv@@@@@@@@@@@@^^@@@@@@@@@ʾX@@@`\@@@@@@@v@@@@@@@@F@@^^@@@@@@@@@@@z@ʨޜʄPʾX@X@X@R@Z@v@@@z@PX@Rv@@^^@@@@@ʆ@z@ʆv@@@ʆ@z@ʆZbv@@@@z@v@@@PʦʆR@@@@@@ʆ@z@PКܚ𦠠\X@Кܚ𦠠\X@PT`\`bRRv@@@@ʆ@z@PʆRv@@@@@z@@T@ʆ@^@ʆv@@^^@@@@@@@@@@\@@@@^^@@@@^^@@ڠ@z@b\`@^@Ph\`@T@Rv@@@Рʬ@z@РʌPRv@@@ʠʬ@z@РʬTʠʌ܈ʄОPʾ\ʾʾX@Rv@@^^@@@@@@@@@@ʦ@@z@ʦP`\`X`\`X`\`Rv@@@@z@Pb\`Xb\`Xb\`Rv@@@@z@`\`v@@@@z@`\`v@@@@ʦ@z@`\jv@@@ʆ@z@b\`^ʆv@@@Ƞ@z@Ƞv@@@P@@z@`\`X@@z@ʆTʆv@@x@v@@Vz@ʆR@@@@@@@v@@@@@PʦʆR@@@@@@@@@@@`@z@@T@v@@@@@@@b@z@@V@ʆv@@@@@@^^@@@@@@@@\@@@@@@b@z@b@T@bv@@@@@@^^@@`@@b@@@\@@@@@@`@z@@T@`v@@@@@@b@z@b@|@b\`@~@@t@@T@bv@@@@@@@z@`@V@Pb@Z@`RTʦv@@@@@@@z@b@Z@`v@@@@@@@@@@@@@@@@@@@@z@@T@P@V@ʦTʆRv@@@@@@@z@@Z@v@@@@@@@z@v@@@@@@@@@@z@@V@v@@@@@@z@PʾX@ʦP@T@@V@d\`@T@@T@@T@@V@@T@RRv@@@@@@z@PP@T@@V@@T@R@^@Rv@@@@PȠRvPȈRvPRvF@@@@@^^@@@@@@@@@Ƞ@z@Ƞ@V@P@V@TR@T@Ȉv@@@@@@z@PȠX@X@X@RvF@@@@ڦʤ@@z@ʚڌPʾX@Zʾ\ھX@ȠRv@@@@@f@ʞ؈@z@\@T@v@@@@@f@ʨ@z@PZʞ؈Rv@@@@f@ʨަ@z@ʨަP@ʾX@ʾX@X@Rv@@@@PȠRvPȈRvPRvF@@@@@^^@@@@@@@@ʨަ@Tz@ئڦPRvF@@@@f@ʨ@z@\Κ@T@ʠʬ@V@\Τ@T@Рʬv@@@@^^@@@@@@@@@f@ҦȘ@z@ʦPʾX@ʾξX@X@Rv@@@@F@@LL@@@@@ҦȘ@Tz@v@@@@F@@@@f@@z@Pʨަ@T@ʨ@V@ҦȘ@T@\Rv@@@@^^@@@@@@@@@@X@@@@@xb@@@@@\@@@@^^@@@X@Ҧb@@@@@@@@@\@@@@^^@@@@@@@@@@@@@@@@@dp@@t^^\\^d`bj^`p^ZZZZZZ^@@@@^^@X@@@@@@@@@@@@@@@@@@@j@\@@@@@@@@@@\@@@@^^@@@dp@@t^^\\^d`bj^`p^ZZZZZZ^@@@@f@@z@P@Z@@T@ʨR@^@\v@@@@^^@@@@@@@@@@@Vz@@T@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^^@@@@@@@@@@@@@@@f@@z@\ΤTʨަv@@@@f@@z@P@Z@@T@ʨR@^@\v@@@@\@Vz@@T@v@@@@f@ʦ@z@\ΚTʨަv@@@@f@ʦ@z@Pʦ@Z@ʦ@T@ʨR@^@\v@@@@\@Vz@@T@ʦv@@@@f@@z@ҦȘ@T@\v@@@@f@@z@P@Z@@T@ʨR@^@\v@@@@\@Vz@@T@v@@@@@z@Tʨv@@@@@z@v@@@@\@z@v@@\@z@v@@@vʦ@ʒʚP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@PʦΨR@X@@@@@X@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@@z@pv@@@@@z@@^@PRv@@@@@z@@^@PRv@@ʦ@@z@@@@@@ʦP`\`@T@ʾX`\`@T@ʾX`\`@T@ʾRv@@f@¾@z@fPPb\`@Z@@T@RX@`\`X@Rv@@@P@@z@`v@@x@@^@dv@VVR@@@@@@@z@PPR@V@`\jR@T@v@@@@@P@@z@`v@@x@d@T@v@VVR@@@@@@@@@z@PPR@V@`\jR@T@v@@@@@@f@@z@@@@@@@@@@fPPR@T@PRX@PR@T@PRX@PRRv@@@@@@Ȃ@@z@P@^@R@T@P@^@R@T@PR@T@v@@@@@@@@z@PX@¾Rv@@@@@@ʦΤ@@z@ʦȘʚP@@@@@@@@@@ʾX@@@@@@@@@@ʾX@@@@@@@@@@X@@@@@@@@@@fP`X`X`RXfP`X`X`RX`X^^@@@@@@@@@@fdX@X@dPblXblRX@@@@@@@@@@X@\X@X@X@@@@@@@@@@Rv@@@@@@@Vz@\@T@\@T@@T@ʾ\v@@@@@@@@@vʦ@ʒʨʚP@@@@PʠR@ʾX@@@@PʨR@ʾX@@@@PʦΨR@X@@@@PdR@ξR@@@v@@@v@@褚ꦌڒʨʪP@@@@@@ʾX@ξ@^@dPX@RX@X@Rv@@^^@ʒʦPʾX@ʾX@X@X@fdX@fdRv@@@ʒʚPʾX@@@@@@ʾX@X@X@RvF6vr'902941:209822.2<:49494HYRRUUTTVTYY[RRUUTTVHLHYTTSUPUUTTVQQSQYY[TTSUPUUTTVQQSHL]]؛HTTSUPUUTUHLN]]؛HTTSUPUUTRQH NHYY]]؛HPUTUUTWSTVHH N]]؛HPUTUUTїSTVHN]]؛HHTQRPUUTUH N]]؛HHTQRPUUTRQHHN]]؛HRRURSVUғӗSUSPVHHK]][ HHݛZY[Y]]؛HRRWSUSPUTWHȌN]]؛HRRSTVHHLN]]؛HRRSTVHH NBHY!Op5FV&7Ǖ6VGVF6V&WE'6זFG6V6ǖ}F@F@@b^TT@T@@PR@d`bn@@@T@@@\@T@T@@@@@@@@X@@@@T@X@@@@@@@@T@@t@T@b\@@@@@@@@@@T@@@@X@@@@@@@@\@T@d\@@@@@@@@@@T@@@@X@@@@@@@@@@@T@@@@@^@@@@@@\@T@f\@@@@@@@@@@@@@T@@@@@@@@@@@@@@@T@@@@@@@@@@\@T@T@@@@@@@@@@@D@D@T@@@@@@X@X@@@@X@@T@@@@@@@@@@@T@@\@@@@@@@@@@@T@@@@X@X@X@X@X@@T@@@PX@@@@X@@@T@@@@v@@@X@X@@v@@@T@R@@@@@@@@X@@@T@X@@X@@@P@@@R@T@@@@@@@@@@@X@@@@@T@@@@@\@T@T@@@@T@@PR@d``p@@T@@@\@T@T@@@@@@@@X@@@@T@X@@@@@@@@T@@t@T@b\@@@@@@@@@@T@@@@X@@@@@@@@\@T@d\@@@@@@@@@@T@@@@X@@@@@@@@@@@T@@@@@^@@@@@@\@T@f\@@@@@@@@@@@@@T@@@@@@@@@@@@@@@T@@@@@@@@@@\@T@T@@@@@@@@@@@D@D@T@@@@@@X@X@@@@X@@T@@@@@@@@@@@T@@\@@@@@@@@@@@T@@@@X@X@X@X@X@@T@@@PX@@@@X@@@T@@@@v@@@X@X@@v@@@T@R@@@@@@@@X@@@T@X@@X@@@P@@@R@T@@@@@@@@@@@X@@@@@T@@@@@\@T^F@Dʸʾ\D^Tx|@@@@@@@@œ@@@@@@@@@tT^@@P@R@@@@PX@PZb\`RX@Pb\`RRv@@P@R@@@@PX@`\`@T@Rv@@PPʠR@ʾX@@R@@@@PX@ʾ\ھX@ʾ\Rv@@ʦP@R@@@@PPX@`\`@T@dRRv^Txf@zDD|x^f|x|@@@@@@@HH@@@@HH@@@ʾX@@@@@@@@@@@@@@@@@@\@X@@@@@HH@@@@@@@@HHX@@@X@@@X@@@x@zDt^^\\^^D|x^|\@@@@@@@X@@@@@@@X@@@@@@\xh@zDʾD|x^h|x|@f@@@HHX@HH@@HH@@@ʾX@@X@@@@HH@@HH@@@@@@@HH@@HH@@@HH@@HH\@X@@@@HH@@HH@@@@HH@@@@@HH@@@Z@HXRH@@@@@ʾ@X@@@@@HH@@HH@P@`@@@@HXH@@@Rtx@zDfh`D@zDbrjD|@@x@zD^D|xB@@@@@@t@F``````v@t@v@@@@@@@t@v@t@F``````v@@@@@@@Zt@blv@Zt@v@Zt@v@@@@@\@@Zt@v@@@|x^|@@x@zD@`Xdl@@l``Xl``@`@`@b@fh`X`D^|@@x@zD@`Xbb`@@jd`Xjd`@`@`@b@fh`X`D^|@@x@zD@bn`Xbr`@`XZf`D^|@@x@zD@bn`Xbh`@`XZbf`D^|@@x@zD@bn`Xj`@bljXZffD^|@@x@zD@bjjXbj`@b`XZb`@b`Xb`@b`XZb`D^|@@x@zD@bjjXbl`@b`XZb`@b`Xb`@b`XZb`D^|@@x@zD@rjXj`@f`X`D^|@@x@zD@rjXbr`@f`X`D^|@@x@zD@b`jXj`@`Xbh`D@zDZtpXdvD^|@@x@zD@b``Xjj@jXZj@jXjD^|@@x@zD@b``Xbpj@jXj@jXZjD^|@@x@zD@bn`Xdj@@djXdj@`@`@b@djXd`D@zDZthXdvD^|@@x@zD@bn`Xbr`@n`X`D^|@@x@zD@dfjXbpj@jXj@ZjXjD^|@@x@zD@bljXbdj@jXZj@jXjD^|@@x@zDbn`D@zDbr`D@zDd\jD^|@@x@zDbn`D@zDj`D@zDd\jD^|@@x@zDfd`D@zDd`D@zDd\jD^|@@x@zDdn`D@zDf`D@zDd\jD^|@@x@zDbjjD@zDhjD@zDD|x^|@@x@zDdljD@zDhjD@zDD|x^|@@x@zDfd`D@zDbjD@zDD|x^|@@x@zDbnjD@zDbpjD@zDD|x^|@@x@zDr`D@zDbdjD|x^|@@x@zDbpjD@zDdjD|~zP~Rx^|@@x@zDdh`D@zDbpjD|x^|@@x@zDbjjD@zDbd`D|x^|x^|x|X@@@@HH@@HH@@@HH@@HH@@\@X@@@@@@@X@@@@@@@@@@HH@@@ʾX@@HH@@@@ʾ@\@@@@@@X@@@@@@@@Hz޸ฬH@@@@@D@@DXHz޸^޸ฬ踬ҸH\@@@X@@@@@@@HҸHX@@@@@@@@HXҺH@@@\xj|@@@@ʾ@x^j|x|@@@@HH@@HH@@HXRH@@HȸbZdX@Vȸ꺼HX@@@@@HȼdVd@VdH\X@@@@HHX@@HҸdVd긬ҸVdzdHX@@@@@@HҸHtT^@@ʨިʄPPʠR@ʾX@@@@@X@@R@@@P@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@z@@T@@T@P@T@@Z@b\`R@V@@@@@@ʾ\@T@ʾ\v@@@PZ@T@@V@ʦPRRv@@ʨަʂʄP@X@@X@@R@@@@P@|@R@@@@@`v@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@z@@T@@T@P@T@@Z@b\`R@V@@@@@@@T@v@@@PZ@T@@V@ʦPRRv^Tx|@@@X@@@@X@@@@@ʾ@X@@@@@@@@@P@@@HXRH@@@RtT^@@ʨބڂʄPPʠR@ʾX@@@@@X@@R@@@P@|z@ʾ\ھRv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@z@@T@@T@P@T@@Z@b\`R@V@@@@@@ʾ\ھ@T@ʾ\ھv@@@PZ@T@@Z@ʦPRRv^^@Zb@@@@@ʨބڂʄPPʠR@ʾX@@@@@X@@R@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@z@@T@@T@P@T@@Z@b\`R@V@@@@@@ʾ\ھ@T@ʾ\ھv@@@@x@`@LL@@|z@`@~@PZ@T@@Z@PRR@t@PZb@T@Rv^Txj|@@@x^j|x|@@HXҺH@@@@HȼdVd@VdzdH@@@@@H@@`H\@@@@HdPdZbRVdH@@@X@@@@@@tT^@@PPʠR@ʾX@@@@@X@@R@@@P@|z@ʾ\ھRv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@x@`\`@LL@@T@@T@P@T@@Z@b\`R@V@@@@@@ʾ\ھ@T@ʾ\ھ@|z@`\`@T@dv^Txj|@@@@ʾ@x^j|x|@@@@@@@HH@@HH\@@@@x@zDt^^\\^^ZD|Z@x^|X@@@@@@@@@@@@@HXҺHX@@@@@@@@@@@@@@@@@@@@@@@P\\@R@Z@@@@\@@f@@@@@@X@@@HXҺH@@@@@X@@@@@@@@@@@@@P@@xzDt^^\\^^ؾD|@x^|RtT^@@ʈPPʠR@ʾX@@R@@@^^@PPʾ\ʾʾ@T@RRv^^t@d@@@PPʾ\ʾʾ@T@RR@@@@@@@@Vʾ\d@T@PPʾ\dʾ@T@P`\X@Zʾ\dRRRv^^t@d@@PPʠR@ʾX@@R@@@@PPʾ\оʾ@T@RRv^^@d@@PPʠR@ʾX@@R@@@@P@x@ʾ\ܾ@~@@@@ʾ\ܾ`\@T@@V@ʾ\ܾ`\t@@@@ʾ\ܾb\@T@@V@ʾ\ܾb\Rv@ڦʤ@@@v@@@v@@@Κv@@@Τvv@ڦʤ@ʚڌPPʠR@ʾX@@X@PR@ȠR^^Ƞ@@@@@@PȠRv@@@@z@ʈPʾX@Rv@@@@z@PʾX@Rv@@@@z@PʾX@Rv@@ڦʤ@v@@\Κ@z@@T@ʾ\ʾv@@\Τ@z@@T@ʾ\оv@@\@z@@T@ʾ\ʾ@V@\Τ@V@@T@ʾ\ܾv@@@@z@P`X`X`Rv@@F@@@ڌP\ΚX@\ΤX@X@\X@X@ȠRv^^t@@@@@@F@@\@z@\Κ@V@\Τ@V@v@@@v@@ʚPPʠR@ʾX@@X@PR@ȠX@@@@@@@@@@@@@@@@@@@@PR@X@PR@R@@ڦʤ@@z@ʚڌPʾX@X@ȠRv@@@z@\v@@@z@\v^Tx|@@@@@@HH@@HH@@@@@P@@@@@@@@@@@RtT^@@ʨʨިʄP@@@@PʠR@ʾX@@X@@X@@X@@X@@@@PR@ȠX@PR@Ȉ^^@@@@@@@R@@P@|z@ʾ\ھ@LL@@xz@ʾ\Rv@@P@|z@Zb\`@LL@@xz@b\`Rv@@@@z@PX@ʨިʄPʾX@X@RRv@@@@z@@^@PRv@@^^@@\@@^^@X@@@@@@@ʦX@ʊv@@ʚPʾX@@Z@ʾ\ھX@ȠX@ʦX@ʊRv@@@@z@ʊT`\jv@@@P@@z@bv@@x@v@VVR@@@@@@@Ⱦ@z@PR@T@v@@@@^^@@@@@@@@@@\@@@@@@z@PȾ@T@Ⱦ@V@d\`@T@@T@@T@Ⱦ@V@@T@Rv@@@@ʚPʾX@@Z@ʾ\ھX@Ƞ@V@ȈTȾX@ʦX@ʊRv@@@@@Vz@ʊv@@@@ʚPʾX@P@T@@V@d\`@T@@T@@T@@V@@T@R@Z@ʾ\ھX@Ƞ@V@ȈTX@@@@ʦX@ʊRv@@@Vz@ʊT`\jv@@@PZTRv^Txh@zDʾD|x^h|x|@@@@@@@X@@@@@@@@@@@@\@@@@@@@@@@@X@@@@@@@@d@@@@@\x|@@@@@@@@@@HPXRH@@@@HPXRHX@@ZX@@@@@@@@@@@@\@@@@@@@X@@@HH@@@H`XbH@@@@@@@HH@@@@@H`\j^HX@Hb\j^HX@\\\@HPZ`\jR^HX@@@@@@@@\@X@@@@@@@@@@@@@PH`H@@HbHR\@@@@@@@HP`RH@@@@@@`@@HPbRH@@@@@HZbH\@@@@@@@@@@@HH@@H`XbH@@@HH@@H`\j^XbZ`\j^ܺH@Z@@@tT^F6|'l902941:219222.47/34:49406VGV"2FV&EVfV6&Ҡ06VGV"2FV&u&6ǖ&Ҡ06VGV"'&6ǖ&Ҡ06VGV"2&76VVEƖF6&Ҡ06VGV"2FV&u&6ǖ&Ҡ06VGV"F6V&WbV6F66ǖ&Ҡ06VGV"W6FWƔvF7F6ǖ&ҠР0BVfVBUDTDŔT$RҠ0BVfVŔtD5"ScӠ0BVfV5DŔtD5"ScӠР0BVfVBԔ4ŔtD5555Ӡ0BVfV$T$EŔtDӠ0BVfVBԔ4ŔtD5U$ŔUDӠР0G'W7F"UFV&ƔvFננbFG6'FV7ӠbFG2&gv6ӠbFGB&W6FEW57VӠbFG"'ӠbFG"'ӠbFG"'%ӠbFG6'UF$v5V&FV7ӠзӠР0G'W7F"UFV&7FǔvFננbFG–vF6'FV7ӠbFG–vF7&vV65VvV65V2v"F2F62F6F5Fv"FנbFG–vFG&W6FvVdf6WFӠbFGBWD57VӠзӠРp$5$TedT$”vF76G'TgfV&"Wv6GW&"ҠנbFGGfӠbFGGr&FfӠbFG27&WV6EEW7&GҠbFGr&FeVv6ӠзӠРРBD2W&GFVF'נ@UGW'W&C$'FVF'EWGW'W6EW"Wv6GW&BGӠ0V&7EFWFVF'EWGW'W6EW5V&7GFW"Wv6GW&2GӠҠРР0fFVfԠ0BVfV2CS#cS3Ss3#3CcҠ0RFf֠РBD2W&GFVF'נf&rVFFVF'GU7&G6f6–vFG&f6B&bF""FFWҠנf62FV&6–vFG&炗rscscSCӠf6Ҡf6Ӡf6b&w&G&ƖW2&672FV–vFG&Ӡ2FV2&67–vFG&b&w&GӠ0fR5U4DTD$tԠf&B76FVF&vf6BF2FVB&BF–vFG&B&BFb&w&GB&"FFWӠ0R6W֠fF&BFb&w&GB&BF2FVB&Ӡf&B7f&"66g6GGBF–vFG&B&֖Ӡ0RFf֠"WFW'B7ӠנР`FrVFFVF'gVWbF7–vFE&bF7B&bF""FFWFbFBWDҠנf&B7rVFFVF'GU7&G6–vFE&B&"FFWFӠ"$4Ԡf文&B7B7Ҡ"WFW'ӠbF7FVF'BW7CFҠFVF'EWGW'W6EWҠfFB7BWD"w&Ӡ"WFW'2%u$DƔV&e6GFVF'""ӠנҠРfǖFVF'FW6FbF7–vFGv&FF&bF7–vFG&bFBWDbFBW75V%FFbF2V''WFDGWVFҠנ"WFW'2V''WFDGWVFӠ22fFVF'EWGW'W6EWTԠ22fFVF'EWGW'W6EWTԠ""FFWFBW75V%FFӠbF&6BW75V%FF斲Ӡ"$4ԠfBWD2V''WFDGWVFҠ"WFW'2V''WFDGWVFӠ"WFW'rVFFVF'gVW–vFG&–vFGv&FF&"FFWFBWD2V''WFDGWVFӠ22R6W֠נРРb&FGFf6V6"WFV&WFV&v2FV&"cVwFEvFVF֠FGFf6V6"WFV&WFV&v2FV&"cVwFEvVwFGvEU6$GeGf֠f26Ֆ6&5FvffҠנ"WFW'f2FW'FW&6Ɣf"v'fӠנР`F776F'bF7"vFbF7RbF7b&w&GҠנbF76"vFӠbF76RӠbF76b&w&GӠ"WFW'bF77Ҡ666Ҡ666Ҡ666נӠנР`F7BvVFEu&FbF7bW6bF7BvVFҠנbF7R&6BvVF増㒓bF7bF7ӠbF7BvVF&ƖW2&67RBvVFӠbF7BvVF2&67BvVFBvVFӠ"WFW'BvVFbW6BvVFbW6BvVFbW6梷ӠנР`F'27&WV6EE7bF'27&WV6Ҡנ"WFW'27&WV627&WV6EEW7&G悗27&WV6EEW7&GwӠנAP!p͡qՑqѕɕqչՅ15ѡͱT41:29902/:349447364::8;39:42;7727:80:/774/39:4//8198230:7:490 ::30:02290230:478 ::0930:179022902478 ::0930:7:41790:0231791792:977:41797:41730:2:90 ::30:899:30:478 ::0930:0:2077180<899:0:20770:020:20777:490 ::899:478 ::092:970:20730:2 3 ::307042234:1793034:4930:34 30230:34 3'32'7:2!30:34 30230<3$729:2930:34 3'32::29030230:127:34:497042234:17930:0:20770:021234 30234 3'32:7:4:2:0472:970:20770:2077 34:5905727227092:24::92742032730982279034:59$9:12722032:12722032004797909820720007979034:48947:12722032/4:99/2/7909820729/9/2/7909*2097:16230:4640)82'9530:9*2030:48930:47*2089:39*209*2030:464027276439:94027:7:274067:0*2298247:2:929*2089:4899*2089:489072224:9*27:2920722247709*209*2048072430:029*204902439*209*20489464024890:029*20230:<89:34897905:9684<7<230:<<9*2047*2030:47*289,47*2089:3<464029*2099:<47*289,48900747*289,464022:970<4640230:4640)82 :20773079627063049734:30:34:0930:899)822200730:9*201687:796270649734!6870422222278227::2711:22:043477:2:907229:042442<:9:230:8934:0934:0934:0930:489478934:09899:30:464024640)82'959*204892:97464030:46402 :20773079627063049734:3080270630:34:0930:8995200730:9*207:79627064973430:8934:0934:0934:0977:2::2:9222:02:23430:4898934:098934:090<8934:09899::648<<0:027:8027064973472:290143:72:::430:464024640)82'959*204890:027:802706497342:9746404297/34/09307962930:07/093034/417730:34 30230:34 3'32:::063 :2077::3049#634:::3047:3447:34:07/09<79629<30:98#634:7:47:34:47:3430:189:#634:89:98#63449#634:47:34:189:#63430:47890218;07/09 :20772:90 ::98#634:478902 :2077 :20772 3 ::49#634:34/417734 30234 3'320630)82270407730:2730:344230:66:2:2704077179729:439822704077772:84:48729802704070639:0:023442206376179669:2:97761797617060)82234:06)06&0636063344$721::2982206272949&7:&&&2729490:02344223:4272942:97&<063)82 034$7217706'06+06&06330680063344206334:1063&<=06)231:+34:1<=0)82234:)&306803447042063270<23:434:1<=34:1<=2"2<7040734:1;0)822704077273442306802:9734: +k-Ln+m,̬nKLm-2I ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(%UM} I}!1M15(%UM} I}!1M14(4(Ց̡}ͱ4(4(͕̀1ѡ͕̀ Ɂ4(5(ȕɹ͕ ٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(I՝́ɍՅɁȽ՝5(͕̀ ɱ塀͕̀ ɱсI՝ͱс8Yс81сX!4(5(сԀȀX!X!I՝4(сYĀĤՠĀ8Y4(с1ĀĤՠĀ814(ȕɹ͕ ɁY1켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(ɽ٥ɽ ѕн@ Iɝ偌͕مѥٕɱ偐͕5(с͕ ɱᕑɕ͹сI՝ͱс8Yс81сX!4(5(сɝ ́4(сɝѽɁԘI՝́ԘI՝́ĸ4(с􀔹ɝ ́ȀX!X!I՝4(сYĀĤՠĀ8Y4(с1ĀĤՠĀ814(ȕɹY1ɝѽɥ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(͕̀ ɱᕑ͕̀ ɱсI՝ͱс8Yс81сX!4(5(ȕɹ͕ Ɂ͕ ɱᕑɕ͹I՝ͱ8Y81X!켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(с͕ ɕ͹с}ɽ՝ͱс8Yс81сX!с8!сȕɽIѥ٥]Ĥ4(5(Lܕ͕ ѥнٕѽٕсɁȽ՝́Ʌɥѥн5(СɁͥ́Ʌɥѥ4(с}􀰥}ɽ՝ͩ}ɽ՝4(сɀ􀜝}}4(с̅ɅѕĸɠȀɀĀ4(4(сX!ՠĀX!4(ṔѽɁչ́С偈ссɅ饹Ɂ݁Ƚ՝́ѕɥ4($сɕѕ́ɝȥсɅ饹Ɂ̵ѡɥѕɥ5(PɁС؅ՕȥMͱСݕɁСɝ偈сܥ5(Pձс؅Օɽ ́Ը4(LѥС؅ՕнĸсȥС́ɝ偈ѹ4(ссȥMԘ4(сŀĸȥMՠĸ81ĸȥMՠĸ8Y4(4(H՝н̵ѡŀȕ͕ѕѥ5(с􀰕Ű̅ɅѕȸȀԀ4(4(Hɽȕѥ٥偌ɥѥ4(с􀠀иԀ䀤иԀX!ɠᡀ̸ȀĸȰ䀤ѡ8!4(݁нɁȽ՝ȕɽȕѥ٥5(ȕɽIѥ٥]4(ȕɹ4(5(4(͕̀ ͕̀ ɱс}ɽ՝ͱс8Yс81сX!с8!сȕɽIѥ٥]Ĥ4(5(ȕɹ͕ Ɂ͕ ɕ͹}ɽ՝ͱ8Y81X!8!ȕɽIѥ٥]ѥ4(5(4(͕̀=ɕ9ɡ͕̀ ɱс}ɽ՝ͱс8Yс81сX!4(5(сX1ȀX!4(с􀰥}ɽ՝́}ɽ՝4(сɀ􀴁4(с ŀĀԀɀȍɀ̤4(с ɥX18Y814(4(с ɀԀɀȍɀ䤀 ɥ ɥȍ818Y4(ȕɹ͕ Ɂ ŀ ɤ4(с ɀԀɀȍɀ䤀 ɥ ɥİ818Y814(ȕɹ͕ Ɂ81 ŀ ɀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(8́Сɵɕѥ5(X́Сإ݁ؕѽ5(8ÝСͥݕСإ݁ؕѽɁСɵ5(͕̀Ɂ̀8̀Xс̅Ʌѕ}9Yс}4(5(сĸĘ}ĸИ4(сԘ}4(сѽɁ̅Ʌѕ̅Ʌѕ}9Y}4(Pȕձс́сɵ镑́ܕэՉ5(ȕɹ8XѽɁ4(5(4(4(mJT.\shaders\include\envi_brdf.hlsliLd .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$̍ *KH iAa,ͭ *KH i $AAa$̍ $)+IAa,ͭ $)+I +Aa̍,ͬAA奥ANHȨA奥AA-L䬌NH+H+N - -ͭ,LK ͭln- +$AaAd )L/LD&fD䨌. M  +-o.m, $ d( .OD-ll n$)IA$, .. ,NLͥAdm-͌d d%FƥFFF oAdm-͌d,d$F$ oA-͌D-ͭ,LK ͭlnDd dd,fA- $ - DDD N%E D +$$DDdD%oADN -L%$ $D$ dDEnAAA-lNH(N -ldl-LnM- -ͭ,LK ͭln- +$AaAd )L/LD&fD䨌. M  +-o.m, $ d( .OD-ll n$)IA$, .. ,NLͥA-L$H䬌NH+H+N -ͭ,LK ͭln +$eADN dl-LnMD$Hd$H%//Oe.N. %)+IJel-LnM,eAAAA- NH(N ͭ. - -ͭ,LK ͭln- +$AaAd* $lNH(N D ͭln +$Adm-Ld d%F oAdm-Ld,d$F oA-LD-ͭ,LK ͭlnDd dd,fADN - DDD N%E D +$$DDdD%oAAAa̍,ͬAa*B4pC #+Jsc#+2 C #+K;sAccK// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef SHADER_FAST_MATH_INC_FX +#define SHADER_FAST_MATH_INC_FX +// +// Trigonometric functions +// +#define fsl_PI 3.1415926535897932384626433f +#define fsl_HALF_PI (0.5f * 3.1415926535897932384626433f) + +// 4th order polynomial approximation +// 4 VGRP, 16 ALU Full Rate +// 7 * 10^-5 radians precision +// Reference : Handbook of Mathematical Functions (chapter : Elementary Transcendental Functions), M. Abramowitz and I.A. Stegun, Ed. +float acosFast4(float inX) +{ + float x1 = abs(inX); + float x2 = x1 * x1; + float x3 = x2 * x1; + float s; + + s = -0.2121144f * x1 + 1.5707288f; + s = 0.0742610f * x2 + s; + s = -0.0187293f * x3 + s; + s = sqrt(1.0f - x1) * s; + + // acos function mirroring + // check per platform if compiles to a selector - no branch neeeded + return inX >= 0.0f ? s : fsl_PI - s; +} + +// 4th order polynomial approximation +// 4 VGRP, 16 ALU Full Rate +// 7 * 10^-5 radians precision +float asinFast4(float inX) +{ + float x = inX; + + // asin is offset of acos + return fsl_HALF_PI - acosFast4(x); +} + +// 4th order hyperbolical approximation +// 4 VGRP, 12 ALU Full Rate +// 7 * 10^-5 radians precision +// Reference : Efficient approximations for the arctangent function, Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006 +float atanFast4(float inX) +{ + float x = inX; + return x*(-0.1784f * abs(x) - 0.0663f * x * x + 1.0301f); +} + +#undef fsl_PI +#undef fsl_HALF_PI + +#endifUa ZYW[YיXYܗX\ [Gyyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPIsc#+C #+"+3Ks+sAiPhP{{cI+jKK+B #+C1c{ i +K cKiPkP+si +K cB +"Jr:*jJJ*iPkPhP{++#;33+kPkPA c3!K33+zc{iPA c3+c zc{iPA c3 sc+szc{iPA c3{;Cs+caKs+ z;Cs+iP1c{ q{k ciPhPA c3i+ ccs+iPA c3 sc+syy)KC+ sc+syi+ ccKkPhPA c3)ã +# +c+#{ +{yy{kkPA c3 {yy{kkPA c3C #{iPA c3)kKK{szc{iPA c3)kKK{s iP1c{ i +K ciPiPhPr [+#;33+kPkPA c3 c+#{iPA c3k{{Cs+iP1c{ q{k ciPhPA c3i+ ccs+yy)KC+ sc+syi+ ccKy)kKK{skPA c3 sc+syy)KC+ sc+syi+ ccKy)kKK{skPA c3)kKK{s yy)KC+ sc+syi+ ccKy)kKK{skPhPA c3 {yy)KC+ {cy)kKK{skPA c3)kKK{s+s;Cyy)KC+ {cy)kKK{skPA c3C #{iP1c{ i +K ciP1c{ ycKs+iPiPhP +[+#;33+kPkPA c3 c+#{ +{iP1c{ q{k ck{{Cs+j +K ciPA c3i+ cc sc+sC #{yy{++#kPiPxyC++k  s3{kkP0c{ )s{#+szk cC1c{ qKiPkPA c3)sq{k cK+CqsKQACiqsSqYqIIiP)s)sSqYqiP+s)siPkP0c{ !+{#+szk cC1c{ )sKiPkP1c{ qs1c{ A)sscaIQ1c{ AaaaIY1c{ AiaiaaiIiPA c3a!{Cqssciqss˻KiPqssaiPqssQCaKiP+sAqssQYA c3AaaiIIiPkP@ c3akKs s+CA c3{cKiPkP+s!{C{ccA c3AqaqaqIIiPkP@ c3!+{#+ +c+#{ +{CA c3 c+#{KiPkP+s +CakKs s+C c+#{KQAyqIIQqYqyy sˣCKs;! [+C sC { cIq{C˛K c{Kc+c s#IC #{kPkP +[+#;33+ [:33+Cr [+#;33+933+KiPkP +[+#;33+93iPA c3i+ ccs+{ sc+s933+si+ ccs+iPi+ ccs+{ sc+sI+jKK+B #+C933+si +K cK933+s)kKK{s i+ ccs+{ sc+siPhP1c{ q{k ck{{Cs+1c{ A)s{#+szk cC933+sq{k csKai C933+sk{{Cs+cqyIIiPA c3i +K c933+si +K cQAq1yqIiP93sq{k ck{{Cs+j +K c1c{ Aq{k ck{{Cs+ci +K cKiP93s c+#{ +{A c3A933+s c+#{cI+jKK+B #+C933+si +K cK933+s)kKK{s+s;CQAq1yi +*jJJzrJ933+s {KiPyy93s c+#{ +{A c3A{C933+s c+#{cyqIa933+s {KiPyy93si+ cc sc+sC #{A1c{{Ci+ ccs+{ sc+sSIQY1c{{C933+sC #{SIIQAqyqIiP93si+ cc sc+sC #{1c{ Ai+ ccs+{ sc+sc933+sC #{KiP+s93iPkPhP{K#s zk cj{{Cs+C1c{ q{k ck{{Cs+cy1c{ q{k ccyA c3k{{Cs+KiPkPq{k c!+{#+szk cCq{k ck{{Cs+sKiPk{{Cs+ Cq{k ck{{Cs+sKiPkPhP{K#s [;33+szk cj{{Cs+C +[+#;33+93cy1c{ q{k ccyA c3k{{Cs+KiPkPs zk cj{{Cs+C93sq{k ck{{Cs+j +K cscq{k cck{{Cs+KiPkPhPr [+#;33+s [;33+C +[+#;33+93KiPkPr [+#;33+933+iPhP933+si +K c1c{{C93sq{k ck{{Cs+j +K csQq1KiPyyA c3i+ cc sc+sC #{93si+ cc sc+sC #{sSAqyqIiPyyA c3C #{1 Ci+ cc sc+sC #{KQAqyqIiPyyA c3i+ ccs+{ sc+s1c{{Ci+ cc sc+sC #{KQAqyIiPA c3C #{93si+ cc sc+sC #{siPA c3i+ ccs+{ sc+s93si+ cc sc+sC #{siP933+s c+#{93s c+#{ +{siPs [;33+szk cj{{Cs+C93c933+sq{k cc933+sk{{Cs+KiPhP933+s)kKK{s I+jKK+B #+C933+si +K cKi+ ccs+{ sc+siP933+si+ ccs+i+ ccs+{ sc+siP933+s sc+siP933+s {I+jKK+B #+C933+si +K cK93s c+#{ +{siP933+s)kKK{s+s;CI+jKK+B #+C933+si +K cK93s c+#{ +{sQi +*jJJzriP933+sC #{C #{iPyy933+s!K33+zc{ c+#{SAi933+si+ ccs+KiPyyA c31+s+c!J+c+Kq1yya+Cq1cq1ck{{Cs+KyyCAqi+3 K+Kr#+KyAqY+3 K+Kr#+KI1{!K+c+KiPyy933+s+c zc{a+CA c3A1+s+c!J+c+Kc1+s+c!J+c+Kc1+s+c!J+c+KKa c+#{c933+si+ ccs+KiP+s933+iPkP{++#;33+{+;33+Cr [+#;33+93KiPkP{++#;33+933+iP933+si +K c93si +K ciP933+sq{k c93sq{k ciP933+saKs+ z;Cs+i93sk{{Cs+iP933+s{;Cs+i C)ka933+saKs+ z;Cs+Q933+saKs+ z;Cs+KiP933+si+ ccs+93si+ ccs+iP933+s sc+s93s sc+syy!+{K)s{#Ks;QqI{+kP933+s)kKK{szc{93s)kKK{s+s;CQ93s c+#{iP933+s)kKK{s 93s)kKK{s iP933+s)ã +# +c+#{ +{!+{#+ +c+#{ +{C93s c+#{KiP933+s!K33+zc{93s c+#{i933+si+ ccs+Q93s c+#{yyQAii+KiP933+sC #{93sC #{iP933+s sc+szc{933+s!K33+zc{Q933+s sc+siPhPA c31+s+c!J+c+Kq1yyYA93si +K cB +"Jr:rzj +bqQAi93sC #{KIyya+Cq1cq1c{;Cs+KyyCAqi+3 K+Kr#+KyAqY+3 K+Kr#+KI1{!K+c+KiP1+s+c!J+c+Ka+C1+s+c!J+c+Kcq1c933+s{;Cs+Q933+s sc+sKiP1+s+c!J+c+KQAi933+s sc+sKiP933+s+c zc{a+CA c3A1+s+c!J+c+Kc1+s+c!J+c+Kc1+s+c!J+c+KKa93s c+#{c933+si+ ccs+KiP933+s {93s {iP+s933+iPkPhP{K#IsK:33+Cyr [+#;33++cKiPkP+cs c+#{+csq{k ciP+csk{{Cs++csi+ ccs++cs sc+siP+cs)kKK{s +cs)kKK{s+s;CiP+cs {+csC #{iP+csi +K cB +"Jr:rzj +biPkP{K#IsK +c+#{CIs{r [+#;33++ccA c3 c+#{KiPkP+cs c+#{s c+#{iPkP{K#IsKk{{Cs+CIs{r [+#;33++ccA c3k{{Cs+KiPkP+csk{{Cs+k{{Cs+iPkPhP{K#IsKr{k cCIs{r [+#;33++cc1c{ q{kKiPkP+csq{k cq{kiPkPhP{K#IsKj+ cs+CIs{r [+#;33++ccA c3i+ cKiPkP+csi+ ccs+i+ ciPkP{K#IsK sc+sCIs{r [+#;33++ccA c3 sc+sKiPkP+cs sc+s sc+siPkPhP{K#IsK +{CIs{r [+#;33++ccA c3 {KiPkP+cs { {iPkP{K#IsKC #{CIs{r [+#;33++ccA c3C #{KiPkP+csC #{C #{iPkP{K#IsKj +K cCIs{r [+#;33++cc1c{ i +K cKiPkP+csi +K ci +K ciPkP{K#IsK*kKK{sCIs{r [+#;33++cc1c{ )kKK{s+s;CKiPkP+cs)kKK{s+s;C)kKK{s+s;CiPkP{K#IsK*kKK{s CIs{r [+#;33++cc1c{ )kKK{s KiPkP+cs)kKK{s )kKK{s iPkPhP922*zjPkPA c3 c+#{ +{ +;+iP1c{ q{k ck{{Cs+j +K c +;+iPA c3i+ cc sc+sC #{ +;+iPiPhP822*zK+:33+C +[+#;33+93KiPkP922*z93{iP93{s c+#{ +{93s c+#{ +{iP93{sq{k ck{{Cs+j +K c93sq{k ck{{Cs+j +K ciP93{si+ cc sc+sC #{A c3A93si+ cc sc+sC #{caIiP+s93{iPkPhP822*z)s{#+:33+ Cr [+#;33+933+KiPkP+sK+:33+C [:33+C933+KIiPkPhP!+3Ks+)s{#+:33+C cK)s{#+:33+ C KiPhP@ c3+r{k cCA c3a{ cszkcA c3qb1c{ c1c{ KiPkPyy9+)#;++{y3C+K+cK s;c+kP1c{ !!#CKiP1c{ !!#CKiP1c{ !!#CKiP1c{ !!#CKiPhPyy{c+C+aKs+ ˛+kkP1c{ !+{Cqb!IiP1c{ !+{C!aqJiP1c{ !+Q!qY!+Q!qiP1c{ !+Q!qY!+Q!qiPhPyy{s  c+kIs K s1 k+kP1c{ Isk Ci C!{CbJa!{CbJIIiP+sA c3Aa{ cszksQqYAa{ cszksQIsk KQYAa{ cszksQIsk KQJiP ʫ \ʸ\8g// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "gbuffer_base.hlsli" + +Texture2D albedo_gbuf: register(t0); +Texture2D normal_gbuf: register(t1); +Texture2D material_gbuf: register(t2); +Texture2D depth_gbuf: register(t3); + +SamplerState default_sampler : register(s0); + +PackedGbuffer readPackedGbuffer(float2 tc) +{ + PackedGbuffer gbuf; + gbuf.albedo_ao = albedo_gbuf.SampleLevel(default_sampler, tc, 0); + gbuf.normal_smoothness_material = normal_gbuf.SampleLevel(default_sampler, tc, 0); + gbuf.metallTranslucency_shadow = material_gbuf.SampleLevel(default_sampler, tc, 0).xy; + return gbuf; +} + +ProcessedGbuffer readProcessedGbuffer(float2 tc) +{ + return processGbuffer(unpackGbuffer(readPackedGbuffer(tc))); +}X ZYW[YZ]\YY[ٜ [s0yyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3A +" +*"*2Jr*B* +"*jP!+3Ks+A +" +*"*2Jr*B* +"*iPhPhPhPI3B +" +*j* +bjP!+3Ks+: +Jb*B K sûkP!+3Ks+:Jb*B K skP)s#K3kPI3s#+3: +Jb*jP!+3Ks+: +Jb*B K kP)s#K3kPI3s#+3:Jb*jP!+3Ks+:Jb*B K kP)s#K3kPhPI3s#+3B +"*zjJb*BbbiP!+3Ks+B +"*zjJb*BbbiP)s#K3kPhP!+3Ks+9 +:*iP!+3Ks+Jqɑ1kP!+3Ks+JBqɑAkPhP!+3Ks+)JbzrqiP!+3Ks+rJ1c{ AqaqaqIiP!+3Ks+rJ1c{ AqaqaqIiP!+3Ks+rJ1c{ AqaqaqIiPhP!+3Ks+A +***JiP!+3Ks+* + +* +jb*zR*iP!+3Ks+!{c+!{c+ ++r{{+#{k+:kP!+3Ks+!{c+!{c+ ++r{{+#{k+:kP!+3Ks+!{c+!{c+ ++r{{+#{k+:kP!+3Ks+!{c+!{c+ ++r{{+#{k+:kPhP!+3Ks+1K+#A c3kP!+3Ks+1K+#A c3iP!+3Ks+1K+#A c3iP!+3Ks+1K+#A c3iPhP0c{ i ÛA1c{  c1c{ c1c{ KiPkP+si C ci CcKIiPkP0c{ iKsA1c{  c1c{ c1c{ KiPkP+siKsC ciKsCcKIiPkP!+3Ks+Ir +J +rBKkPhP0c{ i ÛA1c{  KiPkP+si ÛA sc sc sKiPkP0c{ i ãA1c{  c1c{ c1c{ c1c{ !KiPkP+si Ci C c!Kai CcKIiPkP0c{ iKsA1c{  c1c{ c1c{ c1c{ !KiPkP+siKsCiKsC c!KaiKsCcKIiPkPhP!+3Ks+*J*+K+kP!+3Ks+ +BKC +CKIiP!+3Ks+zzJJzrBq k+K1c{ q k+әzJJzriP!+3Ks++Ó!: #C cc!c!K s +kc+; #C  kc+ +cAKqc!c!KiP!+3Ks++Ó!b{#C cK s +kc+c*+cC  kc+ +cAKqcAKqKiP!+3Ks++Û!b{#C cK s +kc+c*+cC  kc+ +cAKqcAKqKiP!+3Ks++*b{#C cK s +kc+c*+cC  kc+ +cAKqcsKiP!+3Ks++* + c{#C cca{#K s +kc+c*+cC  kc+ +cAKqӻca{#KiP!+3Ks++Ó!{SC cK s +kc+C  kc+ +cAKq{AKqKiP!+3Ks++Ó!B cK s +kc+C  kc+ +cKiP!+3Ks++Û!B cK s +kc+C  kc+ +cKiP!+3Ks++*B cK s +kc+C  kc+ +cKiP!+3Ks++ã+; +C+C cK s9 +C+C  kc+ +cKiP!+3Ks+++c3*C{23+C cca{#cy3K saz #CIsAca{#Kay3KiP!+3Ks++ã+{23+C ccy3K s +kc+C  kc+ +ccy3KiP!+3Ks++ã+cz#{23+C cca{#cy3K s +kc+c*+cC  kc+ +cca{#cy3KiPhP!+3Ks+b +jz"*B cq k+c cKiP!+3Ks+azzb{{jP!+3Ks+rzbb٪s{ccjP!+3Ks+ +rB sCjP!+3Ks+1b +*r2c +sjPhP!+3Ks+)jBq k+Kq k+kP!+3Ks+!*b +*r*"j*j*jP!+3Ks+*r*jBq k+KiP!+3Ks+IrJ*jBq k+KiPhP!+3Ks+A***rzjP!+3Ks+9***rzB{K{kPI3s#+3**b2*B"*2Jr*"jP!+3Ks+**b2*B"*2Jr*"iPhP!+3Ks+B*Z*¢*!jP!+3Ks+B*Z*¢*!*‚B cKiP!+3Ks+B*Z*¢*! + +jP!+3Ks+B*Z*¢*!jP!+3Ks+B*Z22*B1Kc+cascq k+KiP!+3Ks+B*Z22**‚B cKiP!+3Ks+B*Z*"22*B1Kc+cascq k+KiP!+3Ks+B*Z*"22**‚B cKiP!+3Ks+B*Z*rJbjP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+! + 1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*! + +iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+! + 1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*! + +iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+! + 1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*! + +iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+! + 1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*! + +iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP0c{ ++c3*C ++C*ã+!1c{  cIscIsa{#cIs1Kc+cIsascIsq k+KiPB*Z*¢*!iP+s saz #CIsAca{#KIiPkP!+3Ks+++c3*CC cca{#K++c3*C ++C cca{#c2Jb*bbJr*biIiPhP0c{ a{ #33+ ++C33+1c{  cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s ۢiPkP0c{ a{ #33+ ++C33+1c{  cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s ۢiPkP0c{ a{ #33+ ++C33+1c{  cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s ۢiPkP0c{ a{ #33+ ++C33+1c{  cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s ۢiPkPKsa{ #33+ ++C33+Ks cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s ۢiPkPKsa{ #33+ ++C+#33+Ks cIscIs1Kc+cIsascIsq k+KiPB*Z*"22*B1Kc+cascq k+KiP+s ۢiPkPKsa{ #33+ ++C+#33+Ks cIscIs1Kc+cIsascIsq k+KiPB*Z*"22*B1Kc+cascq k+KiP+s ۢiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #CKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #AKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #AKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #AKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #CKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #AKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #AKiPkPKsa{ #33+ ++Cʣ+ "#+33+ cIscIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP+s saz #AKiPkP!+3Ks+a{ #33+C cKa{ #33+ ++C cc2Jb*bbJr*biIiP!+3Ks+a{ #33+A cKa{ #33+ ++C cc2Jb*bbJr*biIiP!+3Ks+a{ #33+A cKa{ #33+ ++C cc2Jb*bbJr*b9+r k+ KiP!+3Ks+a{ #33+A cKa{ #33+ ++C cc2Jb*bbJr*biIiP{K#{+33+ ++Cʣ+ "#+33+ cIscKs c+cIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP s{+Cc c+KiPkP{K#{+33+ ++Cʣ+ "#+33+ cIscKs c+cIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP s{+Ac c+KiPkP{K#{+33+ ++Cʣ+ "#+33+ cIscKs c+cIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP s{+Ac c+KiPkP{K#{+33+ ++Cʣ+ "#+33+ cIscKs c+cIs1Kc+cIsascIsq k+KiPB*Z22*B1Kc+cascq k+KiP s{+Ac c+KiPkP!+3Ks+{+33+C cc c+K{+33+ ++C cc c+c2Jb*bbJr*biIiP!+3Ks+{+33+A cc c+K{+33+ ++C cc c+c2Jb*bbJr*b9+r k+ KiP!+3Ks+{+33+A cc c+K{+33+ ++C cc c+c2Jb*bbJr*biIiP!+3Ks+{+33+A cc c+K{+33+ ++C cc c+c2Jb*bbJr*biIiP!+3Ks++#33+ C cK ۪KsCAB*Z*"22**‚B cKaKIjP!+3Ks+33+ C cK ۪KsCAB*Z22**‚B cKaKIjP!+3Ks++ã+! +C cK JsAAB*Z*¢*!*‚B cKaKIjP)s#K3kPhPKs+sKc3*C ++C*ã+!Ks cIscIs1Kc+cIsascIsq k+KiPiPB*Z*rJbiP+s ۢr9iPkP!+3Ks++sKc3*CC cK+sKc3*C ++C cc2Jb*bbJr*b9+r k+ KiPhPI3 B +"*zjJb*BbbiP!+3Ks++c+C ccK kP!+3Ks+yC cK kP)s#K3kPhP@ c3Aq s{3Kc+CA c3 cKiPkPI3A +b2*JJzrjP+siKsC ccqAKiP)c+kP+s+c+CI3KsK+C!{C cc cKIqc ccA c3AaaIIiP)s#K3kPkPhP)s#K3 JpsC #+Jsc#+sAccKc// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef __BRDF_COMMON__ +#define __BRDF_COMMON__ + +#include +#include +#include + +// Diffuse model +#define DIFFUSE_LAMBERT 0 +#define DIFFUSE_OREN_NAYAR 1 +#define DIFFUSE_BURLEY 2 +#define DIFFUSE_BURLEY_FIXED 3 +#define DIFFUSE_CHAN 4 + +#ifndef BRDF_DIFFUSE +#define BRDF_DIFFUSE DIFFUSE_BURLEY_FIXED//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_LAMBERT// +#endif + +// Microfacet distribution function + +#define SPEC_D_BLINN 0 +#define SPEC_D_BECKMANN 1 +#define SPEC_D_GGX 2 + +#ifndef BRDF_SPEC_D +#define BRDF_SPEC_D SPEC_D_GGX +#endif + +// Geometric attenuation or shadowing +#define SPEC_G_IMPLICIT 0 +#define SPEC_G_NEUMANN 1 +#define SPEC_G_KELEMEN 2 +#define SPEC_G_SHLICK 3 +#define SPEC_G_SMITH_GGX 4 +#define SPEC_G_SMITH_CORRELATED 5 +#define SPEC_G_SMITH_CORRELATED_APPROX 6 + +#ifndef BRDF_SPEC_G +#define BRDF_SPEC_G SPEC_G_SMITH_CORRELATED +#endif + +// Fresnel +#define SPEC_F_NONE 0 +#define SPEC_F_SHLICK 1 +#define SPEC_F_FRESNEL 2 +#ifndef BRDF_SPEC_F +#define BRDF_SPEC_F SPEC_F_SHLICK +#endif + +// Sheen +#ifndef SHEEN_SPECULAR +#define SHEEN_SPECULAR 0 +#endif + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + //#error call different BRDF_diffuse, with NoH + return 0; +#endif +} + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH, float NoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + return diffuseChan( diffuseColor, linearRoughness*linearRoughness, NoV, NoL, VoH, NoH); +#endif +} + +float BRDF_distribution(float ggx_alpha, float NoH) +{ +#if BRDF_SPEC_D == SPEC_D_BLINN + return distributionBlinn( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_BECKMANN + return distributionBeckmann( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_GGX + return distributionGGX( ggx_alpha, NoH ); +#endif +} + +// Vis = G / (4*NoL*NoV) +float BRDF_geometricVisibility(float ggx_alpha, float NoV, float NoL, float VoH) +{ +#if BRDF_SPEC_G == SPEC_G_IMPLICIT + return geometryImplicit(); +#elif BRDF_SPEC_G == SPEC_G_NEUMANN + return geometryNeumann( NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_KELEMEN + return geometryKelemen( VoH ); +#elif BRDF_SPEC_G == SPEC_G_SHLICK + return geometrySchlick( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_GGX + return geometrySmith( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED + return geometrySmithCorrelated( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED_APPROX + return geometrySmithCorrelatedApprox( ggx_alpha, NoV, NoL ); +#endif +} + +float3 BRDF_fresnel(float3 specularColor, float VoH) +{ +#if BRDF_SPEC_F == 0 + return fresnelNone( specularColor ); +#elif BRDF_SPEC_F == 1 + return fresnelSchlick( specularColor, VoH ); +#elif BRDF_SPEC_F == 2 + return fresnelFresnel( specularColor, VoH ); +#endif +} + +float3 BRDF_specular(float ggx_alpha, float NoV, float NoL, float VoH, float NoH, half sheenStrength, half3 sheenColor) +{ + float D = BRDF_distribution(ggx_alpha, NoH); + float G = BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH); + float3 result = D * G; + + return result; +} + +//from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr_v2.pdf (original version had bug in code!) +float computeSpecOcclusion(float saturated_NdotV, float AO, float ggx_alpha) +{ + return saturate(pow(saturated_NdotV + AO, exp2(-16.0 * ggx_alpha - 1.0)) - 1 + AO); +} +//ggx_alpha = linearRoughness*linearRoughness + +// ggx_alpha = linearRoughness*linearRoughness +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ +#if SPECULAR_DISABLED && BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert(baseDiffuseColor); +#else + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(normal, H)); + float VoH = saturate(dot(view, H)); + half3 diffuse = BRDF_diffuse(baseDiffuseColor, linearRoughness, NoV, NoL, VoH); +#if !SPECULAR_DISABLED + float3 specular = BRDF_specular(ggx_alpha, NoV, NoL, VoH, NoH, translucency, sheenColor) * specularStrength; + float3 F = BRDF_fresnel(specularColor, VoH); + return (diffuse + F * specular); +#else + return diffuse; +#endif +#endif +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, sheenColor, translucency) * NoL; +} + +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0); +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0) * NoL; +} + +// //////////// TODO: NAU-1797 Unify code above with other parts (for example see distributionGGX in specular_brdf.hlsli) +uint ReverseBits32(uint bits) +{ + bits = (bits << 16) | (bits >> 16); + bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1); + bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2); + bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4); + bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); + return bits; +} + +float2 Hammersley(uint i, uint N) +{ + const float E1 = frac(float(i) / N); + const float E2 = ReverseBits32(i) * 2.3283064365386963e-10; + return float2(E1, E2); +} + +float3 ImportanceSampleGGX(float2 E, float a2) +{ + const float phi = 2.0 * PI * E.x; + const float cosTheta = sqrt((1.0 - E.y) / (1.0 + (a2 - 1.0) * E.y)); + const float sinTheta = sqrt(1.0 - cosTheta * cosTheta); + + float3 H; + H.x = sinTheta * cos(phi); + H.y = sinTheta * sin(phi); + H.z = cosTheta; + + return H; +} + +float D_GGX(float a2, float NoH) +{ + const float d = (NoH * a2 - NoH) * NoH + 1.0; + return a2 / (PI * d * d); +} + +float ImportancePdfGGX(float cosTheta, float a2) +{ + return cosTheta * D_GGX(a2, cosTheta); +} + +float SpecularPdf(float NoH, float a2, float VoH) +{ + return ImportancePdfGGX(NoH, a2) / max(4.0 * VoH, 0.000001); +} + +float Luminance(float3 color) +{ + return dot(color, float3(0.2126, 0.7152, 0.0722)); +} + +#endif[ ZYW[YZYۛX [=xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPI3s#+3B +"*:bz +bBbbjP!+3Ks+B +"*:bz +bBbbiPhPIsc#+A # +"+3Ks+sAccKiPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  K3c{  S S+sS kPhP@ c3{ACA c3 Kٓ+s S kP@ c3{ACA c3 Kٓ+s{AC S KkP@ c3{ACA c3 KC c3 S  Q +s Q kPhP0c{ c k+#zC1c{ b1c{ J+s{Ci C CJaq1KaJkPhP0c{  +s;+szzc#C1c{ c1c{ rJiPkP+sicCrbKiPkPhP0c{ 9*rB1c{ qJiPkP1c{ riPhP1c{ {CqbrJJiPa+C{CqbrJJab+C)Jbzrb!{CbJIIiPq{k cK+CJiPhP{s1c{ q{k cK+C{CqbJIiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ 9*rB1c{ qb1c{ JiPkPq{k cK+Ci!{CbqJQqJiP{s1c{ {CqbJiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ aKs+ K+C1c{  #*Cc1c{ !+{#+"+CKiPkP+sC!+{#+"+CsY!+{#+"+CsQ #*CKiPkPhP)s#K3 ʮ \ʸ\ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYTPSԗSYY[TPSԗHLBH[YZYۛX [OB HSژܛYX\X[Hʑ  +ӛU +HUڜQ UH  +ӛUJBHYHWSWғTYY[HWSWғH ZHYYB Ȗ[HL HYț[\[]ڛٛ[\]\Z\^\]\ٜHW[Y\X]ڛ[ +[WZ [HJ^[H HWZ +WZN[ HH H H HN\]JL + +[X\ + H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B ȖPZ[HL ZX]\țH[[[ؙ[]]][[\YXٜHW[Y\X]ڛPZ[ +[WZ [HJ^[H HWZ +WZN[ H +N\]H + H HL + J +L +H + J + + H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B  ۝\YYTY^[Y\X]ڛ +[WZ [HJ^[HZ HWZ +WZN[H + +HZ H H + + +HN H[Y\]HZ H[JLY   +H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B H[\ Qڜ[Y^[Y\X]ڛV[ +[WZ [WZX [ [  [  [ HHJ^[H + HN[HH +H HN[H + ۝ WZV + +HJ ۝ WZXV + +N\]H H[JLY  WZWZX + +H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_BKZZ[[ ܜ˚[]ژݛ\ܜ[ۋ L L ZZYK[Y\X]ڛ[WZ [RJ^[ HWZ +WZN[ۜ H +N[\ HH H ۜ N[\ H\  +\ N\]\  + +HJۜ  \  +LJJ +  +J + +L + +\ Z Y]\ڛXTH[[[]YB_B[Y[[\^R[XJJ^\]LNB_B[Y[[\SY][ +[ӛ [HJ^\] + +H[ + ӛH +JLYKMNB_B[Y[[\՛\X[ [ [ӛ [ [WZXJ^[[X\YH[  LN[[X\YH[ӛ  LN[ٛݗH N\]H[ +H[ +ٛݗ +[X\ ٛݗ +[X\Y + H LNB_B R[Y[ L HH[ژܛYXX\[[\X[\K[]HY]HZܛ]X\X[ۙHW[Y[[\R[Y[ +[HJ^\] + + +HNB_B[Y[[\[ +[WZ [ӛ [HJ^[H۝ +WZH + +KN[Y[[\[ؚHӛ +J H Z + +N[Y[[\[H +J H Z + +N\]L  +Y[[\[ؚ +Y[[\[HNB_B T[]\ٛV[Y[[\T[ +[WZ [ӛ [HJ^[H H۝ +WZHNB[Y[[\T[Hӛ +\ +ӛ +ӛH ӛ +HL + +H HN[Y[[\T[H +\ + +H  +HL + +H HN\] +Y[[\T[ +Y[[\T[HNB_B H^Z[]ڛț؛\[]T[]\ٛ RY^[Y[[\T[Л\[] +[WZ [ӛ [HJ^[H H۝ +WZHN[Y[[\T[H +\ӛ +ӛH ӛ +HL + +H HN[Y[[\T[Hӛ +\ +H  +HL + +H HNˋ[HHWZNˋ[Y[[\T[H + +ӛ + +H H HH + +HHNˋ[Y[[\T[Hӛ + + + +H H HH + +HHN\] +K + +Y[[\T[ +Y[[\T[HJNB_B H^Z[]ڛț[T[]\ٛV RY L HY]YZHSZYZ]Q]ڛHHSژܛYX]P\ќHW[Y[[\T[Л\[]Y +[WZ [ӛ [HJ^[Y[[\T[H + +ӛ + +H H WZH + +WZHN[Y[[\T[Hӛ + + + +H H WZH + +WZHN\]K + +Y[[\T[ +Y[[\T[HNB_BKZZ[[ ܜ˚[]ژݛ\ܜ[ۋ L L ZZYK[Y[[\[ӛ [SJ^\]H  + + +ӛH  +ӛUJNB_B[ \ٜ[ӛ[ +[ \X[ۛHJ^\]\X[ۛNB_B[ \ٜ[[ +[ \X[ۛ [HJ^[H] +H H HNH H[Z[ZL HZ\X[HZ\[HHH]Y؛\Y\XZ]Y\]\]\] +HWSWғ +\X[ۛH + + +J H X + +\X[ۛNHB_B[ [ؚ[[[  [ [[[\J^؛[H] J H RN[H[HH H [[N\] +J[[ J[ H[ H[Z + L +H L + +NB_B[ \ٜ[\ٜ[ +[ \X[ۛ [HJ^[ \X[ۛTH\ +[X +[ +  L + [ +KN KN KNN + \X[ۛH +HN[ H +H +\X[ۛTH +  +H H \X[ۛTHN[ H\ + +H H HN\]K +۝̗] +H R +  +R +H + + +H +۝̗] + +يRH HL +  +YR +HL +H +HNB_B[ Y[T[]ڛU[  [ ۛ\[ [WZXKZH۝ +[[Yܗ[[\J^\][ +ۛ\[  J H WZX + + +\J H WZX + +WZH +HNB_BHYYW|@V%FFW5V657VV&6WUvV5&WFVV6%WFV&Ǖ6VGVV5FV&75FV&EVfV6F^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@^T@@@@@@@@@@@@@@@@@@@^^@N@@@@PttR@@@@@@@@@@@@T^^^@@PVV@@R@\F@@lF@@pF@@b`dhF@@bdpF@@jbdF@@b`F@@bdpF@@`F@@fF@@h\`F@@F@@F@^^@VV@@\F@PR@FF@PR@PR@tt@@@@@ttξ@؄@z@PRv@@@@@ttξ@ڄ@z@PRv@@@@@@؄Pttξ@R@@@@@@@@@@@@@\P؄Rv@@@@@@@@@@ڄPttξ@R@@@@@@@@@@@@@\PڄRv@@@@F@^^@^^@@\F@PX@R@FFF@PX@R@PX@RF@PR@@PX@RF@PR@@PX@RF@^^@6.BK*vs_6_0Z̡ͽՑt^^^ʄ^\\^\\^^^^^^^8hi*k+#"+;ra!5(s9t9tQua Lg.2A@  m^eiH) nmN̬LnHw{ywq|&fL&ȴq}ٗwqw`/&c 62 e."32`K-AɈLlA/P'#2#3A@ BȌ6 e2"32d`K/AˈLnA/P/#2# 1Qq LnA/oQ"23(0  `p]b{)wـKY ΔʈLoA/hQ;#2#3A@ EȌ̆_rFgxg621#36s3?ax͆]XAl&g!4D4AH`]&l@d6,b6g6i666kf+m.m,h!) Bb2p ۼMڠMlFnLY}AͥѥMe f.ts6j6u.u.hs7D6aq9ћqq lX$ommܥnmfCP2țAywQ2@\+om@mEm.Y MMlFt + " n\H+'0XG=`z[[[WY޸VPa/RA:::q ":B_# 0XG=`z4`xVx/6XG=`0.@@ >q "0]th0.Bd@ > rboxPosDAw!Gff6.@dxG >boxDw`06.BD N +ub Da|!`6.BDʧ fadeoutD|H`p024q ">J$0.@@ @O#0XG=*`z\`Ȁ: u' @O##0fB&v2V7%Gllvm.module.flagsS1)+llvm.identS3D2V'7V2FWF77B5q8;ѓ>Q1TaWZ]pqD2V'7VBVfV67%l̽ɍ9M [XKܔ]ؕͥM ]]ܔ ^̡5M \[Xܔ_,хѥM~Flإ%MхѕM K\[ܔ`tyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ) DAD1 bW@; a~qv <PEAD %am p LD4B4\ bP_ܶ L;8 65mA5\DJM5m4\Ma~qV <>mβT?_ Ea FA, D6@H! @c : `0F0笙c 0(&GL? {0A8Dap Q +&G+LW 0A8tap &G>L} 0A8ap !c$&IL *1A8Vbph Q#-&G[L v1A8bp# `B(3^A+# `AR,A 0xmY2a$qm) |pÃ=A ({ n2a A?@?0a$so1 ~CC> ~C> ~pC= ~`CT=3^A+ET 0aL 0a A! +?T?0c@ +h A1 +?X?0c@ +h  AA +?\?0c@ +h1 AQ +?`?0c@ + FH3_0 AQ +?`?0a AQ +?`?0a AQ +?`?0agƀ =hA>3hB+D1 @CZό +1|f ЃV,03c@F+`4Ԡ#L6(0F pX`f `Z1@`}P0F pW`& A0(\!0!.ng@ +W! @a1@^}N0 +1 )18++0F`M `4a& b0F [f uȝA0(h3 `@ +Z ha(K`ƀ org@ W.1 Fb[M =b$`rg@ .Y00f 8uȝф`0S1 F!wF અ4`ƀ9XM `@ ^Haƀ frg@ ^Ha1@vl0L:3c@ķcR !> ÌA:Έ Ä0b 80%?0a&,Q:hL 0a`gƀ( 2Xܱτ`" `4f uȝф'0F aaόQc# F> |f uL6$0F(`ƀ(VXM `4& &% ;6P0l3aX2gƀ(UXܱdτ` QόQ: Rτ0b > +>?0c@3b > +>?0a A?Ot?L#`: 3IP;#`;  @Ä0b` >0c@IJ3b` >0a0L#`P>@_3DI0;#`P=@^ !a-Ä`0gƀ@frVaτ`0g1@$1 JY1@$0F  {n& A0(Hž[(A"@g@ +aƀMg@ +aƀIg@ !1 `18 $lf 9`A|F 0{rf X!wF 0rf X!w#p(b%ufA>3J:tC Œ:y /r@> y <τ0b EKc?0c@ + -8pÄ0b EKc?0a A?X{?L#`p.?a0hL 0a&Ä0bp KC.Ą0hL 0a&Ä0bp WL/Ą0hL 0a&Ä0bp M8Ą0hL 0a&Ä`-gƀ A0v[& A0x[& Lf|& A0~b$]& A0]& L|& A0*_& A0"_& LƉ|& A0b0q& A0Ђ(q& L#`PEO$Q{3D_8 A `@ +a%0aƀ A0(` `@ +a% a1H.xB-&5VF  P h1H.xB-Ԃ& ` @ P @& A0p'B-n& A0p'B-f& A0p'B-h& A0p'B-l& A0p'B-n & A0p'B-f & A0p'B-h & A0p'B-l & A0p'B-n& A0p'B-f& A0p'B-hb& A0p'B-nb0F  p a1H.x-Ԃ& g (Zy$W9+3Js czc{ + !+{j"*s#+{jsKcJ;C!+{j"r)K3Gh;*|wc*|i*|o#+|uS+|{k+|m+|s+|y+|k (|qS (|w (|iC|GꚷGjGjGj{G6G6G[G7GjܶGj<ŀGjۀG6Gl[*|Į{s*|Ķm+|Ķs3+|Ķyc+|ľk{+|ľq+|ľw+|i+|o# (|uc (|{ (|mk |6>O O $V634L`o# 0>FZ7؀3A׀3a7ր373 +Dt6pK8&ii~!,'bDc~!a0&*&&*&STAT `EDXILBC! < #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 72" d##ㄡL L@ +f`)@DAQ A@Jb 1 5\=sUa*.BCQ! B"h*@ @AP ("l ``;pi0|pK8&iiqF0A%M%LJ4LqLضm۶-K/$$|!y@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` +X@ +< ʡ$J + + +4J +P@ʣTH(2("(B ogh r^^|%^|FyLFD oM $Efe%&,f&gl&eCLd@(  l xkH) nmN̬Ln@0BYb` )/34 l@!6M L ۜTYZx&4A !MiXeFeMΈ-ln@P<,6Rdirection__tex_scaleڀ `pi 7<) am@1˴T6 \geB OJf@`$ .52mc6'UF$v5V&FV77A W`m@*2@5p 6/34:7 m@8L[[[טJ B; tjn@lmӃ +zeYP9c{kJsۀ }{pњ++s{{+{{#  Lܽɱ}٥}Mn5 +XՁm(>P AA6PaC +Ta@o!`Jdeferred_lights_vsD&L1 6a!^bAba"h͔W]XY( Ba 6װalpAbaȅ!taP e m..mP6/lX^Y_|p BU5$E!6,8B,. 08l`â P08l % ,\@ mò,B:0 [,†"A6 \&[XM0 F7Gc.싍\ ;<ă< C=TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+H\ʂ +u\ȦʦP ϥ̍N.-͍nnJ]\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq & DAD1 bW@; a~qf <PEAD %amp LD4BX4\ bP_ܶ L;8 65m@5\DJM5mہ4\Ma~qF <> ILDN,$db288d42459c1940102b1bacf42b50a9.pdbHASH(BE@++PDXIL `DXIL +BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 72" d##ㄡL L@ +f`)@DAQ A@Jb 1 5\=sUa*.BCQ! B"h*@ @AP ("l ``;pi0|pK8&iiqF0A%M%LJ4LqLضm۶-K/$$|!y@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J`  +x ʡ<(2("(B o":OWgyxLFD oM $Efe%&,f&gl&eCLd@( a0(MfÀ$LfB, A 0An@8aa m @&dm P"+3++#bK;C#4D4A( BQm BaMg@@۰Xmf+m.m,hP\ 6,Cl@V00.SV_PositionB S D6ÆehLs1``@H8ذAdZp۰tmis0i6ua64;P PXWL@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)T ..l.lJ@!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq & DAD1 bW@; a~qf <PEAD %amp LD4BX4\ bP_ܶ L;8 65m@5\DJM5mہ4\Ma~qF <> a A, tQTr3PvEc97F f # `24# `B8# `Fc-# ``Fd1# ``We`5# ``Agf9ET0bp SL +|PcF ` +F`4AFa4ʢ18IȠ F3A0J MBF `B5`4!L:cR&,h&4 |l8c"MxHa |lhcCؐg4F`4lc%*X2ǒ> ac)džRψ 0 È 00È 0@È 0È 0 È 00[!> +C|F [A0p`8"33Ă`ADŽ< y #@>#`0/Ђ=&h& h1 0 B00 0bp I/hB&h &È L) 0  0@ 6ق|F r xxl!1@%a:f|F  zt!1@j&х:|F  ||!1@&!:Ɖ|F  ~!1@j':#`0HCI&h& S!>C|F @A  j @ @ F @A  f @ @@F @A {1H-PB,B&a @ @ A0P%",jF @A ȉ71H-P"'B&` @ @hA0P%r",j F @A v1H-P'B&a @ @ XA0P%p",lb1H-P'B&A0P%p",f"@DXBC@5Za~unea DTX8KTTUSFI0ISG1SV_PositionTEXCOORDOSG14(@SV_TargetPSV04% 8TEXCOORDTEXCOORDTEXCOORDTEXCOORDdeferred_lights_psDD +DCCDILDBtH`DXIL\HBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L \2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX0vxp6:0=ЃvHx_|r@2;<̃B9=ԃ<C9=<9;=Ё )LÑj/8* +"B8~7ISD ̳;̬@c +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !C <d2L &GCJ +F +B("(((`r((P$ʀ1O#AaAH r:gy@ (yL d!{KsbK;CC #+sAcc4@ oM $Efe%&,f&gl&e@Ì-]ݛ[ <float{ 0b4Z` E ,h  E 4h ( E <h 8 BaG[Y[ݲ6element_countT`qPֵAI HD*44Z 179063half{ <0b4`hE 4 `1@(  @ MgZe ```cg,bl@`XPl4PJdeferred_lights_psD8-b F6}}Ʌ-bG6Vcolor_and_attenuation $Dݛ 30Bvector90`1@$``0i0P Al&3aX (879629E Bl( @aLm ,J`ADa0AU  )m"@)6pyC #+{Isc#+c++#{{KsbK;CsAccK4++s{{c̍ɕ}}ѽ}эeYؕѽ5Yi0c{ !dW6F&cF"㳈CYH X",$``0Vp M+8,X L0 Vp@ @E `,ZMª @TPT[DZYK[YיXYܗ\Y [ڠ\YX\ّXYC!G, JmlnH̬L(+' +JmlnH̬LĮlM&Hd2FV&76VGVr&VgfV&%6W6ǖ6hx %6V67WFv$VgfV&G,̬nlMn4 ?8l1@C0 sc+szc{[8i`D ͭlnn4 ?40934E МC/@`41@C Pi+ ccs+[:j`:@N.mnm,o4 ?2<:12062E мC/X` 1@pИC #{[<j`J-mn.mMn4 ?887/09E C/h`D1@C`^q s@u`wy{}/ ~Mê ]؅\.@'6V67w$VgfV&>{+;33+ + {++#;33+r [+#;33+S6VFv$VgfV&G#Mm4# `0i`7:4E ДD/L8"hҡ`&$`4 d0j`v2 50X=̄ ,b&z fB @ͥ}ɕѡ-b%z! fB 1@33` ɇ^XH xѱ-b&z f"0ذIJJDKK$D<0 Ll&VM@/DH? "+{#+ +c+#{ +{c}}eYؕѽim 6 &n'ztRյ ~ʀH̀~HH̀H`dVM@/DO) s [;33+cԹՙeUUՙUAՙi +[+#;33+c&VF-͌]ݛZ "h0`4p +k,bNa->0PE <)`( 8 6 N@ -@-E `p +Z^` ɵ}͵ѡ}ѕɥ-b-zAb 0 `VFF%6V7V65Fv-L]ݛZ "h0`4p +wl.6d @ XV\9 00[$¢@ @/63U ?p}֎ئ8 ?unpackGbufferNormalSmoothness@@YAXUPackedGbuffer@@AIAV?$vector@M$02@@AIA$halff@@Z`@hP`h`/D46 P&4zALhչ9ɵMѡ~֜ئ怀~H䀚H`dbH̀6@il@5VM@/Fj/ !+{#+szk c9ɵeYؕѽ5Yؕѽ5im6 &Z5z`ٕͥMq I+jKK+B #+ +rj"!ƶȀ6 Bm$U 1`H, *llH̬L{#WF6VFv$VgfV&T6VFv$VgfV&dCbW6F&DA Z4n\ ȅ7Dn./shaders/include\pbr.hlsli7RcomputeSpecOcclusion6:)177 & D$ɦcxoxK"'297/47/34:D\ٛ\[[PVO]ݛ Z ]ݛP LSX\ّXYU  ZЌ]ݛP  ]ݛP L & ~H5Pmhaj0 X./shaders/include\shader_global.hlsli@=pow2t~d6IiX5{A90241:21922:106340:449A7:490 ::r?smoothDistanceAtt@@YAMMM@Z$I6 P&@>>䃰 (XW[ژZ g,m-mLk-(+- - HkàjЏU +`$90241:2.43/192349A432629:AYY\SXXPVO]ݛP U `!j?@?6Hp `;~qq1"pj K1c{ caM0`8|,bFE3p W"hXD07I @a8|,bE3p ×L"h`D07I @b8|,bFF3p ,×"hhD07I @c8|,bF3p <L"hpD07I @d8|,bFG3p L"hxD07I @e8|,bG3p \M"hD07I @f8|,bFL3p l"hD07I @g8|,bL3p |`"+"/#3R#7#;#?&cR&gDk΍nZAX7:7ikb]IMd'"@2 71 @8i:bJ;Czs33+!i Kj"!ڶ~S"q +f'@Tھx?globtm_inv@GB_LightConstBuffer@@3V?$matrix@M$03$03@@BoNP ܘ\Y]ۛ"0 (̍ɕ}}ѽ}ѕ፽ɑ }1 ՙXؕѽ5 m[default_samplerd&A7`@ ~䀀fʀ-¢7@@N$OUE]]E^^E__@FdHdPFeXe`fn&gvg~&lƦlmnoF=! $7.L ĪLn.m sQ"*;Ir3{*K{s0B`Y'// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "clustered/point_light.hlsli" + +struct VsInput +{ + float3 pos : POSITION; +}; + +struct VsOutput +{ + VS_OUT_POSITION(pos) + float4 pos_and_radius : TEXCOORD1; + float4 color_and_attenuation : TEXCOORD2; + float3 worldPos : TEXCOORD3; + float3 worldPos2 : TEXCOORD4; +#if OMNI_SHADOWS + float4 shadow_tc_to_atlas : TEXCOORD3; +#endif +}; + +SYSTEM_CBUFFER(Lights) : + register(b1) +{ + uint4 omni_lights_count; + RenderOmniLight omni_lights_cb[MAX_OMNI_LIGHTS]; +}; + + +#include "gbuffer_read.hlsli" + +float readGbufferDepth(float2 tc) +{ + return depth_gbuf.SampleLevel(default_sampler, float4(tc, 0, 0).xy, float4(tc, 0, 0).w).r; +} + +half3 perform_point_light(float3 worldPos, float3 view, float NoV, ProcessedGbuffer gbuffer, half3 specularColor, half dynamicLightsSpecularStrength, half ao, float4 pos_and_radius, float4 color_and_attenuation, float4 shadowTcToAtlas, float2 screenpos) +{ +#if DYNAMIC_LIGHTS_EARLY_EXIT + #define EXIT_STATEMENT return 0 +#endif + + float3 point2light = pos_and_radius.xyz - worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float ggx_alpha = max(1e-4, pow2(gbuffer.linearRoughness)); + +#if LAMBERT_LIGHT + float radius2 = pow2(pos_and_radius.w); + #if DYNAMIC_LIGHTS_EARLY_EXIT + bool shouldExit = distSqFromLight >= radius2; + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + EXIT_STATEMENT; + #endif + float invSqrRad = rcp(radius2); + float attenuation = smoothDistanceAtt(distSqFromLight, invSqrRad) * color_and_attenuation.w; + + float3 lightDir = point2light * rsqrt(0.0000001 + distSqFromLight); + float NoL = saturate(dot(gbuffer.normal, lightDir)); + half shadowTerm = attenuation; // no shadows + shadowTerm *= calc_micro_shadow(NoL, ao); + + #if OMNI_SHADOWS + shadowTerm *= getOmniShadow(shadowTcToAtlas, pos_and_radius, worldPos, NoL, screenpos); + #endif + + #if !DYNAMIC_LIGHTS_SPECULAR + half3 lightBRDF = diffuseLambert(gbuffer.diffuseColor) * (NoL * shadowTerm) * color_and_attenuation.xyz; + #else + half3 diffuse = diffuseLambert(gbuffer.diffuseColor); + + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(gbuffer.normal, H)); + float VoH = saturate(dot(view, H)); + float D = BRDF_distribution(ggx_alpha, NoH) * dynamicLightsSpecularStrength; + float G = NoL > 0 ? BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH) : 0; + float3 F = BRDF_fresnel(specularColor, VoH); + half3 result = (diffuse + (D * G) * F) * NoL; + #if DYNAMIC_LIGHTS_SSS + if (isSubSurfaceShader(gbuffer.material)) + result += (foliageSSS(NoL, view, lightDir) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + #endif + half3 lightBRDF = result * shadowTerm * color_and_attenuation.xyz; + #endif +#else + float NoL = dot(gbuffer.normal, point2light); + float invSqrRad = rcp(pow2(pos_and_radius.w)); + float attenuation = getDistanceAtt(distSqFromLight, invSqrRad) * color_and_attenuation.w; + float rcpDistFromLight = rsqrt(0.0000001 + distSqFromLight); + NoL *= rcpDistFromLight; + attenuation *= calc_micro_shadow(NoL, ao); + + #if DYNAMIC_LIGHTS_EARLY_EXIT + bool shouldExit = min(attenuation, NoL) <= 0; + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + EXIT_STATEMENT; + #endif + + #if OMNI_SHADOWS + attenuation *= getOmniShadow(shadowTcToAtlas, pos_and_radius, worldPos, NoL, screenpos); + #endif + + float3 lightDir = point2light * rcpDistFromLight; + half3 result = standardBRDF(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, lightDir, view, gbuffer.normal, gbuffer.translucencyColor, gbuffer.translucency); + #if !DYNAMIC_LIGHTS_EARLY_EXIT + result = NoL > 0 ? result : 0; + #endif + #if DYNAMIC_LIGHTS_SSS + if (isSubSurfaceShader(gbuffer.material)) + result += (foliageSSS(NoL, view, lightDir) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + #endif + half3 lightBRDF = result * attenuation * color_and_attenuation.xyz; +#endif + + return lightBRDF; +#if DYNAMIC_LIGHTS_EARLY_EXIT + #undef EXIT_STATEMENT +#endif +} + +half getOmniLightFade(RenderOmniLight ol, float3 worldPos) +{ + float3 boxPos = half3(ol.boxR0.w, ol.boxR1.w, ol.boxR2.w); + float3 boxDiff = worldPos - boxPos; + float3 box = 2 * (ol.boxR0.xyz * boxDiff.x + ol.boxR1.xyz * boxDiff.y + ol.boxR2.xyz * boxDiff.z); + box = saturate(abs(box)); + const float FADEOUT_DIST = 0.05; + box = 1 - box; + float fadeout = min3(box.x, box.y, box.z); + float fadelimit = FADEOUT_DIST; + return fadeout <= fadelimit ? fadeout / fadelimit : 1; +} + +#include "ColorSpaceUtility.hlsl" +#include "fast_shader_trig.hlsli" + +float3 inv_octahedral_mapping(float2 tc, float zoom, bool rotate) +{ + tc = (tc * 2 - 1) / zoom; + if (rotate) + tc = float2(tc.x - tc.y, tc.x + tc.y) / 2; + float3 dir = float3(tc.xy, 1.0 - (abs(tc.x) + abs(tc.y))); + if (dir.z < 0) + dir.xy = float2(-(abs(dir.y) - 1) * sign(dir.x), -(abs(dir.x) - 1) * sign(dir.y)); + return normalize(dir); +} + +half2 octahedral_mapping(half3 co, float zoom, bool rotate) +{ + co /= dot(half3(1, 1, 1), abs(co)); + +#if SHADER_COMPILER_HLSL2021 + co.xy = co.y < 0.0 ? (1.0 - abs(co.zx)) * (select(co.xz < 0, float2(-1, -1), float2(1, 1))) : co.xz; +#else + co.xy = co.y < 0.0 ? (1.0 - abs(co.zx)) * (co.xz < 0 ? float2(-1, -1) : float2(1, 1)) : co.xz; +#endif + + if (rotate) + { + float tempX = co.x; + co.x = (co.x + co.y); + co.y = (co.y - tempX); + } + co.x *= zoom; + co.y *= zoom; + return co.xy * 0.5 + 0.5; +} + +half getOmniLightIntensity(RenderOmniLight ol, float3 worldPos) +{ + return 1; +} + +float4 getFinalColor(RenderOmniLight ol, float3 worldPos) +{ + return ol.colorFlags * getOmniLightFade(ol, worldPos) * getOmniLightIntensity(ol, worldPos); +} + +VsOutput deferred_lights_vs(VsInput input, uint omni_light_index : SV_InstanceID) +{ + VsOutput output; + RenderOmniLight ol = omni_lights_cb[omni_light_index]; + float4 pos_and_radius = ol.posRadius; + float3 worldPos = pos_and_radius.xyz + input.pos.xyz * pos_and_radius.w * 1.15; + float4 color_and_attenuation = getFinalColor(ol, worldPos); + output.pos = mul(mvp, float4(worldPos, 1)); + output.color_and_attenuation = color_and_attenuation; + output.pos_and_radius = pos_and_radius; + output.worldPos = worldPos; + output.worldPos2 = worldPos - world_view_pos.xyz; +#if OMNI_SHADOWS + output.shadow_tc_to_atlas = getOmniLightShadowData(index); +#endif +#if LIGHT_LIMIT_SIZE + output.pos_and_radius.w = min(output.pos_and_radius.w, LIGHT_LIMIT_SIZE); +#endif + return output; +} + + + +float4 deferred_lights_ps(VsOutput input) : + SV_Target +{ + float4 screenpos = GET_SCREEN_POS(input.pos); + half3 result; + float3 view; + float2 tc; + float dist, w; + { + tc = screen_pos_to_tc(screenpos.xy); + + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, tc, 0).x; + float4 farpos = float4(tc.x * 2 - 1, (1 - tc.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + + float3 pointToEye = worldPos.xyz - world_view_pos.xyz; + + float4 pos_and_radius = input.pos_and_radius; +#if OMNI_SHADOWS + float4 shadowTcToAtlas = input.shadow_tc_to_atlas; +#else + float4 shadowTcToAtlas = float4(0, 0, 0, 0); +#endif + float3 moveFromPos = pos_and_radius.xyz - worldPos.xyz; + view = 0; + dist = 0; + + bool shouldExit = dot(moveFromPos, moveFromPos) > pos_and_radius.w * pos_and_radius.w; +#if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); +#endif + BRANCH + if (!shouldExit) + { + ProcessedGbuffer gbuffer = readProcessedGbuffer(tc); + + float distSq = dot(pointToEye, pointToEye); + float invRsqrt = rsqrt(distSq); + view = pointToEye * invRsqrt; + dist = rcp(invRsqrt); + float NdotV = dot(gbuffer.normal, view); + float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float NoV = abs(NdotV) + 1e-5; + + half dynamicLightsSpecularStrength = gbuffer.extracted_albedo_ao; + half ssao = 1; // fixme: we should use SSAO here! + half enviAO = gbuffer.ao * ssao; // we still modulate by albedo color, so we don't need micro AO + half pointLightsFinalAO = (enviAO * 0.5 + 0.5); + half specularAOcclusion = computeSpecOcclusion(saturate(NdotV), enviAO, gbuffer.linearRoughness * gbuffer.linearRoughness); // dice spec occlusion + half3 specularColor = gbuffer.specularColor * (specularAOcclusion * gbuffer.extracted_albedo_ao); + + float4 color_and_attenuation = input.color_and_attenuation; + result = perform_point_light(worldPos.xyz, view, NoV, gbuffer, gbuffer.specularColor, dynamicLightsSpecularStrength, gbuffer.ao, pos_and_radius, color_and_attenuation, shadowTcToAtlas, screenpos.xy); + result *= pointLightsFinalAO; + + return float4(result, 1); + } + } + + return float4(0, 0, 0, 0); +}t.\shaders\include\ColorSpaceUtility.hlsl,Ad .O. e,)mLm͌$ D. nDlLή̥A +-md썬 $m-mm ΍L ) +)mm )*ťA +)i +d艨$i +J*D%h +$iJ* +驊 +*HJ*ȉ* ɨA$) d)ɉ( +H + Jhj +I +$ )$i($)A$ )*HJ*ȉ*h +(ʩhj +I +$*H*i)HAJ +iHj)ȉ*H()*I +ɩ%H*騨ȉʥAA̮ D,)-L. AA$MND)ld.-L AAAaN.- .L- ,m.L Dd&$AAa$̍ kIk +*h諊*)* i)Aa,ͭ kIk +*h諊*)* i)AAA(- D. n$̍ m, N.mάLĬm.mAA$m.m dMd.l  n.-. -dM$m.mdNH$mD $AdMd.l ,ͭ D,M D,l.mĮlMn$̍ $ - -͍.$̍ $ ,- D. (-AD. n$L l.̭ Dn Ln . LNM d Nln. Č-n d- $͍LA.lM Nl,m. $mĭ $ ,LnLL.,̍n$l - , $mM dm..ͮA d͍N.l. ,Ln .l$,L.-m dNή $m͌ n̥AAAdNH$mD $ dMd.l $̍ $ N.mάLĬm. MD,- D. N%d$ N ,-AdNή-m -̮ D Nl, $ . dH +,m-,o%dNH$m-$m$ D nA Nln$̍  .ln $ i-M,m D. dNH NlnDA-ͭ,L.M M-o.m,-dMNlD̍L.$̍  -ͭ,LDlnĭ D Dm썬A.  dNHD. M,m-,ϥA-n)ͭ,LmJHČ-n$AaA$N /--$DE&ADN dlf&f$F%GD$D$Dƅ&&eAAA-ndJH)ͭ,LČ-n$AaA$N /--DE&ADN dl$F%Gd&$Dƅ&%eAAA +l Ĭm.m$- % ,m,̍-$ N /- dNH. $ LNMƅĥA-n)ͭ,LmJH(lČ-n$AaADN dlf&f$F%GD$%fDd.NFF'%fDd&&'eAAA-ndJH)ͭ,L(lČ-n$AaADN dl$F%GƅfDd&EF&Dd.Nƥf&GDd$E&'G&ddedž&eAAA-n$llN.lJH)ͭ,L% Č-n$dON dJH)ͭ,L/eA-n$llN.)ͭ,LmJH% Č-n$dON )ͭ,LmJH/eA + 䩈Dl쭭̍ Md͍̍d j +-mD,- D. N-,$mL,l d͍N.l$lA$ N N.- M.. $ $ ,Ln .Mͭ̍ΥA-n)ͭ,LMh&Č-n$AaADN dl&'ƥD$&'gDƅ&&'g&eAAA-nDh&)ͭ,LČ-n$AaADN dl'ƥd&'g&$&'g$ƅ&%eAAA +-m$m ĭH +N.mάLĬm.͍$m d, D*JMLn . $.̍.MLΥA-n)ͭ,LMhHŌ-n)AaAČ--D&&fAČ-MDFf&D$FgAČ-d,dF&fAČ-dLD&f&DdFfAČ-dlDf&G&DdFfAČ-n -&eADN e,ddLD .%ddlD .M&eAAA-nDhH)ͭ,LŌ-n)AaAČ--D&&fAČ-MDFf&D$FgAČ-d,dF&fAČ-dLD&f&DdFfAČ-dlDf&G&DdFfAČ-n ʼn$M&eADN -  d,&eLdlD .$-&eAAAAdMd.l dͮLn.mAA +l $ln -ͭ,L,-m썬,.l$dMd.l dͮLn. $m$ d -A D,l.m-m $ )ͭ,L$LL.,d*m $ dMd.l $m,ͭ D,M ĮlMnA D,l.mĮlMne -, d.l $ͮl$ -N. ŮlM. -m,.鍮 -Ad -,  dMd.l -,Dl$ dMn-$L D䭎 D΍lNDl,n dAdMd.ll-̮ -LL,n- Ln + dͮL. d dMnL $ .A, d- ,ĭ,.ͮ .l-,Dl-m $L $ͭ Nln.M $ -ĭAdMd.l̥AA$ D $, D. $ dM. -ͭ -m ĭ̮LMn$.,$ͭ Nln.M EALn,.L,dMn +-m,mn. $ dMd.l -$m$l. $lmn.M +A+K dMd.l $m ĭN.$m .ln. dMd.lD$-l M-AN L. -. ĭ,.ͮ .lel,,m,-$  $̍ D+ dMNl-m$ ĬNLAN.mM-. d, D -  $̍ D -l  $.,om..ͮ +,d, -̮ ,MANl,m. ĭlDn D,,., D,$$.  $̍ D D .ll $͍ I gΥA +-mdMd.l $md, $ +M-ll $ DL-̥AAA鍮LDl&$̍ dNHd-L  d. dMN.-L.l$̍ - -͍ +,M͍-,̬LmA$m N.mάLdNή n̥AA-nDh&MhHFČ-nDH&$AaAdmČ-nodͮ)AdAFFeF&G&GffƆA&&%'&&&fA&f&F'AoADN eͮ)DH&'eAAA-nDhHFMh&Ō-nDHHF&AaAdmČ-nodͮ)AdA$&džƥƦƆFA%F$%fF'gA&'%&$%&&AoADN eͮ)DHHF&eAAA-nDh&h( jČ-nDH&$AaAdmČ-nodͮ)AdAGF%榆FAff&&g%A&F&%'AoADN eͮ)DH&'eAAA-nh( jMh&Č-nDH&$AaAdmČ-nodͮ)AdA$EF&EF&AFƆ$FƆA&&dž&Ǧ&$&G&'AoADN eͮ)DH&'eAAAa̍, kIk +*h諊*)* i)k`:C:pC #+Jsc#+ +k{C++ +k{C++ ksAccK##ifndef ATMOSPHERE_PARAMETERS +#define ATMOSPHERE_PARAMETERS 1 + +#include "atmosphere/definitions.hlsli" +#include "atmosphere/definitions_units.hlsli" + +/* +

Atmosphere parameters

+ +

Using the above types, we can now define the parameters of our atmosphere +model. We start with the definition of density profiles, which are needed for +parameters that depend on the altitude: +*/ + +/* +The atmosphere parameters are then defined by the following struct: +*/ + +//this is const buffer <> CPU. so it must be aligned to float4! +struct AtmosphereParameters { + // The solar irradiance at the top of the atmosphere. + IrradianceSpectrum solar_irradiance; + // The sun's angular radius. Warning: the implementation uses approximations + // that are valid only if this angle is smaller than 0.1 radians. + Angle sun_angular_radius; + + // The scattering coefficient of air molecules at the altitude where their + // density is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'rayleigh_scattering' times 'rayleigh_density' at this altitude. + ScatteringSpectrum rayleigh_scattering; + // The density profile of air molecules, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile rayleigh_density; + Number rayleigh_density_altitude_exp_term; + + // The scattering coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'mie_scattering' times 'mie_density' at this altitude. + ScatteringSpectrum mie_scattering; + // The density profile of aerosols, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile mie_density; + Number mie_density_altitude_exp_term;//todo: make more sophisticated + + // The extinction coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The extinction coefficient at altitude h is equal to + // 'mie_extinction' times 'mie_density' at this altitude. + ScatteringSpectrum mie_extinction; + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols forward weight. + Number mie_forward_scattering_weight; + + //second mie layer + Number mie2_strength,//can be bigger than 1. making it relative to 'common mie' + mie2_altitude,//where (and below) strength is 1 + mie2_density_altitude_exp_term;// + Number padding; + // The extinction coefficient of molecules that absorb light (e.g. ozone) at + // the altitude where their density is maximum, as a function of wavelength. + // The extinction coefficient at altitude h is equal to + // 'absorption_extinction' times 'absorption_density' at this altitude. + ScatteringSpectrum absorption_extinction; + Length absorption_density_max_alt;//absorption profile part + + // The average albedo of the ground. + DimensionlessSpectrum ground_albedo; + // The cosine of the maximum Sun zenith angle for which atmospheric scattering + // must be precomputed (for maximum precision, use the smallest Sun zenith + // angle yielding negligible sky light radiance values. For instance, for the + // Earth case, 102 degrees is a good choice - yielding mu_s_min = -0.2). + Number mu_s_min;//to be removed + + // precalced + DimensionlessSpectrum mie_extrapolation_coef; + Number multiple_scattering_factor; + + // The distance between the planet center and the bottom of the atmosphere. + Length bottom_radius; + // The distance between the planet center and the top of the atmosphere. + Length top_radius; + + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols. + Number mie_phase_function_forward_g; + Number mie_phase_function_backward_g; + + //float2(1.0 + g * g, - 2.0 * g)*pow(2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); + //optimized mie phase coef + float4 mie_phase_consts; + // The density profile of air molecules that absorb light (e.g. ozone), i.e. + // a function from altitude to dimensionless values between 0 (null density) + // and 1 (maximum density). + //DensityProfile absorption_density; + float2 absorption_density_linear_term0; + float2 absorption_density_linear_term1; + + //https://en.wikipedia.org/wiki/Kruithof_curve + //5500 kelvin + Kruithof effect results in (0.5764705882352941,0.6274509803921569, 1) + // full moon lux brighntess is way darker + DimensionlessSpectrum moon_color;//(0.5764705882352941,0.6274509803921569, 1)*.25 by default. That affects sky and moon + Number sunBrightness;//this is 10 by default. that affects everything, sky and sun +}; + +#endifQ ZYW[YW]Z\YY[]ڛۜ [9I3s#+3 jzB**"*2JrJJzrjP!+3Ks+ jzB**"*2JrJJzriP!+3Ks+a*s;C1c{ kP!+3Ks+ ++c+s;C1c{ kP!+3Ks+ r;c+1c{ kP!+3Ks+zcK# r;c+1c{ kP!+3Ks+z+1c{ kP!+3Ks+akKs{z+1c{ kP!+3Ks+qk+1c{ kP!+3Ks+Ir++c*s;C1c{ kP!+3Ks+ + 1c{ kP!+3Ks+zck+1c{ kP!+3Ks+qk+#*sK1c{ kP!+3Ks+I #K s+1c{ kP!+3Ks+ +#K s+1c{ kP!+3Ks++ cz+1c{ kP!+3Ks++ cK #K s+1c{ kP!+3Ks++ c +#K s+1c{ kP!+3Ks++ c +#K s+#*sK1c{ kP!+3Ks+ +Ks;z+33KK+s1c{ kP!+3Ks+Ir++zcK# r;c+1c{ kP!+3Ks+akKs{Kr+sK1c{ kP!+3Ks+akKs s+1c{ kP!+3Ks+IbckKs s+1c{ kPhPxy 9+s+K1sK{s1{k ++c+s;C{{k+yC+˃+siP!+3Ks+  +k1c{ iPxy 1sK{s1{k ++c+s;C{qk+siP!+3Ks+!Jk+sK{sc++k1c{ iPxy 1sK{s1{k ++c+s;C{+ cz+siP!+3Ks+z++k1c{ iPxy 1sK{s1{k ++c+s;C{+ cK #K s+siP!+3Ks+I #K s++k1c{ iPxy 1sK{s1{k ++c+s;C{+ c +#K s+siP!+3Ks+ +#K s++k1c{ iPxy 1sK{s1{k ++c+s;C{+ c +#K s+#*sKsiP!+3Ks+ +#K s+#*sK˛+k1c{ iPxy 1sK{s1{k ++c+s;C{ +Ks;z+33KK+ssiP!+3Ks+ +Ks;+k1c{ iPhPxy {KK{sIs!Aa+s;C c+KqiP!+3Ks+zKK{s1c{ iPxy sK!K+K{s+{Is!AsKc+ c+KqiP!+3Ks+!J+K{s1c{ iPxy +{y3akKs s+ c+siP!+3Ks+akKs s+1c{ iPxy +{y3IcckKs s+ c+siP!+3Ks+IbckKs s+1c{ iPhP!+3Ks+ZJ** + +*Jr:b* +*Jr:iP!+3Ks+zjJr*" +*Jr:*¢*iPhP)s#K3 N\ʸʸ\HYHURTQQSUғWSTYY[HURTQQSUғWSHLBH[YH]Z\ YY[]ڛۜ [HH[YZ]\YY[ٜ [HB\TX[U]\ Q^U]\ []NTX[]]]\NBN\TX[U]\ Q^U]\ []NTX[]]]\NBNTX[U]\ []]\  +U]\ [] TX[]]]\\TX[U]\ ܎ ]^]ގ ]\H]\܎\]N_TX[U]\ []]\  +U]\ [] TX[]]]\\TX[U]\ ܎ ]^]ގ ]\H]\܎\]N_BYY[TX[U]\ [SX[JX +[]]\ J H\X[]]YJYY[TX[U]\ [SX[JX +[]]\ J H\X[]]YJYY[\\[]XU]\TX[U]\ QYY[H\X]\U]\TX[U]\ QYY[\\\ZZX]\U]\TX[U]\ QYY[\\\X]\U]\TX[U]\ QYY[TYXX]\U]\TX[U]\ QYY[X]\U]\TX[U]\ QYY[X]\Q\]U]\TX[U]\ QYY[H\YZXU]\TX[U]\ QYY[HS][X]\U]\TX[U]\ QBYY[H +] +]YY[S +] +[]YY[HS +] +H[]YY[HSSQYY[WSTJXJYY[H\JXJYY[]٘ [LYY[] [MYY[] [LYY[UQSUJXJYY[UQSUWQUSJXJQZ[\ڛ[\\]QZ[\ڛ[\\][U]\[ HX +Ȟ\]H ^N_B\\\]H\\\][U]\[ HX +Ȟ\]H ^N_B\YZX\\]H\YZX\\][U]\[ HX +Ȟ\]H ^N_B[H[H [X +Ȟ\]YJXN_B[ \X[]]\TX[U]\  [ H]J^\]ݜ ]TX[S] +ݜ ]\ H LNB_B[ \X[]]\TX[U]\  [ H]J^\]ݜ ]TX[S] +ݜ ]\ H LNB_B‹JڌZ\XH[ ڌOBUXZYY[ZH[ٛ[\X\Z\XH\]]]ZٜNB[]J[ + [[[][[ + \YZ\Y + ]\YZʜ\ + ]]] +H[][[ +[[NKB]]؛SH[]HH N]]؛U][[HH N]]؛H[\HH N]]؛[Y[ȜHH N]]؛]]HH N]]؛S][[][HH NB‹J[Z]XY\]ZH[ٛ[[Y\]Z\XH\]]]ZKB]H[[Y\]H[Z[[]Z ZXY[ Yٙ\YYYNKB]]؛SZHH +H[]N]]؛H\YH HH[] +H[]N]]؛[][H HH[] +H[] +H[]N]]؛H[\HT +\N]]؛H[YH\ H  N]]؛H\YZX]\\\]\W[]H] HN]]؛TYZX]\\\]\W[]\לH] J +Ȝ\N]]؛\\[\YZX]\\\]\W[]\ܗ[H] J +[[N]]؛\\TYZX]\\\]\W[]\ל\ܗ[HO] J +Ȝ +[[N]]؛\\TYZXQ\]]\XXW[]\ל\ܗ[HO] J +Ȝ +[[N]]؛S][[\]\]H[ ȜN]]؛S][[\]\]HH +N]]؛S][[X\\\]\W[]H HN]]؛S][[X\\\]\W[]H HNBHYu`l5FV&7Ǖ6VGVF6V&WeV6F66ǖ43723 )("/*!'/$)$!*"242 )("/*!'/$)$!*""77<02:4077072:::04:0292236"1!:277722076827:4:77<34:"1!:27 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"(6:22 98210:247<34:$' 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"41:20982:04:0249441:209822<:4949441:2098282020:24349641:2090/249494$'$"6292:2<:792#*4:02629<47:2<:42:976292<:4<6292<:4$'$"6292*4:02#62<:792629:47:2<:42:970:02:6292<:46292<:420:029:472272149044$'$"12:*04:022<:*;#6:$' 98220220982/823:4962929:90982/87:/0990982/87/029:::9027780982/8:70<790747706<0:3:7222623:4$89:0982/87/090982/87/090982/87:/090982/87:/09027:2747723:497089:990982/87:/090982/87:/09027:2780982/8:70<79:2<90724940720609729066:714227990729/74723:4290277 9822:70<0982/8923:4470982/87/0923:40<97629:240<4629/9972:9712:2<:792#*4:02:* $* /",*$"*2:2<:792#*4:02/9* $* /",*/#$8072:247220843769202<$'$"422::#6*04:022<:*;$' 98220220982/8$'1:;**23:9**6229::;<:;<29::;<:;<629:2*4:02#62<:792:;<* $* /",*$"*629/92*4:02#62<:792:;<* $* /",*/#$9027780982/8:70<790747706<0:3:7222623:4$89:0982/87/090982/87/090982/87:/090982/87:/09027:2747736;142076:2923:497$/2730:87789:<078720229:07<722275;22:099789:97970982/87:/090982/87:/00982/87:/09027:2780982/8:70<79:2<90724940720609729066:714227990729/74736;14207729:23:4470982/87/0923:40<9723:4247:0<4:2229629$$979729:!6428$:9;<72420327:9029:177786:202267:2:04:022<:2277)1:62:*04:0277 9822:70<$' 98220220982/8$'*04:022<::04:0/2<:223:4962929:90982/87:/0990982/87/01:;2:*04:022<:*;#6:0982/892:97277)1:6#62<:268/2<:2:04:0/2<:2:277)1:62:*04:02$' 98220220982/8$'*04:022<::04:0/2<:223:49629:23:4276/47213:729:90982/87:/0990982/87/029:::29:22223:4/2!68090982/889:229:29629/2!6429:/43/47213:72:970:022:*04:0277 9822:70<0982/8:04:0/2<:2/2/0<302:*04:0277 9822:70<0982/8:04:0/2<:29>222:970:022:*04:0277 9822:70<0982/8:04:0/2<:290<302:*04:0277 9822:70<0982/8:04:0/2<:2/2/277)1:62:*04:02:7$' 98220220982/8$'*04:022<::04:0/2<:223:496296294/:2/40982/87:/09629/:2/489:0<4/:2/44/:2/42:972:*04:0277 9822:70<0982/8:04:0/2<:297:9284/:2/40982/8:0:0/09024/:2/40982/8:0:0/09029/:2/23:4902709 9822:70<$' 98220220982/823:49629:76/47213:743/47213:72:9790277: 9822:70<0982/89>222:9790277 9822:70<0982/89$'$"$7274 32<34(2:177629$7274 325$92:975:30:22(79962943$'$"30:2(2:177442<<3462936292:972(2:177442<<3'842230:22(799;22(799;30:533:9979070730:82333:997:2977993:1473;1407282422<;52:9758289:8;77<792224::9094;78282''&($#'# *"$#("*!'')"*") )($'$"$7274 322(792:)09:1776293629$7274 325$93330:823332:975:8289:8;:66"4782:17$'$"$7274 322(2"47:177629362930:0680$7274 325$930680330:823332:9750680:8289:8;4::8;9173:90!!82-03:17$'$"$7274 322(2-03:1776293629$7274 325$93330:823332:975:8289:83:$9274$'$"30:02;6290629=2:970;0$'$"30:22(7996293629342:9730:3302;34:33$'$"30:22(799629=2:9722(7993$'$"30:2(2:177442<<3'842230:/879962930:709/82/8799</8799<:9907:2977993:1473;1407282422<;530:09/82/8799=/8799;:9907:2977993:1473;1407282422<;52:97;709/82;09/824:9929:07188289:879828289:877,$'$"00)1:62:(2200'842230:/8799$900)1:60:243$900)1:6430:2436292:970:243430:2432(2:177442<<3'8422/8799<34(2:177$'$"00)1:62:(22002$' 98220220982/8$900)1:60:243$900)1:6430:2436292:972:(2200'84220982/8/87990:243430:243$900)1:62$9002$' 98220220982/8$'$90022<:4900/2<:223:4962912$90022<:*;#6)$' 98220220982/823:4962929:90982/87:/0990982/87/029:99629/990982/87:/00982/87/090982/87:/0629992:9712:2<:792#*4:029$) /",*$"*2:2<:792#*4:02/9$) /",*/#$8*247220843769202<422:)#$90022<:*;$' 98220220982/8$'1:;**23:9**6229::;<:;<29::;<:;<62992*4:02#62<:792:;<$) /",*$"*629/92*4:02#62<:792:;<$) /",*/#$90982/87:/09/90982/87/090982/87:/09!6429444900/:8:848*097:286:222<:9207;2::23:7249004:404322<:2:8$900)1:62$9002$' 98220220982/8$'$90022<:4900/2<:223:496291:;2$90022<:*;#6)0982/892:97$900)1:6#62<:268/2<:24900/2<:2:2724309277)1:62"<:0702430:2423277)1:62<:07023$'10:24 2106<:9072292042:::74329790787:0:231:79:327:<979:;92:970:243;0<0:243<2<:070220220)<20$900)1:62"<:0702430:243)277)1:62<:07023$'10:242:97$900)1:6#62<:20:242"<:0702430:24232<:070230:24277)1:62"<:0702430:24279:$' 98220220982/2:970982/8<30:243<0982/80:2430982/80:2430982/8<30:247907:4323&$" *"$/",*$900)1:62"<:0702430:243$' 98220220982/8$'10:242:972"<:0702430:243)2"<:0702430:24279:0982/0:242748207:272:22066:20:24367279<34:6480:24377724207243220:24377:27:2944:4:7643:177227042430:24/:87220:2437202:802722249027343706977220:243722:2:0::22<:2794096:07799022227:2:47720:24/2<:2720772430:24/2<:272242/(" ")')/ )*242/(" ")')/ )(/(" ")')/ )*/(" ")')/ )30:0:24/9:7630:230:9//8202/=2:9789:0:0229//8202/1<9//8202/130:0:24/9:7630:230:9//8202/=2:970:24/9:7629//8202/4230:0:24/9:7/7330:230:9//8202/30:979:9:10:0229//8202/1<9//8202/130:739:10:0229//8202/1=9//8202/12:9789:979:9:1/(" ")')/ )(979:9:1739:30:0:24/179630:1,30:9//8202/30:11,12:971/(" ")')/ )(9//8202/19//8202/1<9//8202/19//8202/1242/")/ )*30:0:24/;-7130:;2:979;2:97/")/ )*;-/")/ )*/")/ );30:0:24/17;-30:2:979$30:022(,/")/ )*30:/")/ )30:/")/ )/")/ )2:97,022(<022(19792/82020:24/130::30:9:30:979/9//2:9730:0:24/9:769:979/9//0:24/;-71172/82020:24/130::30:9:30:7/9//2:9730:0:24/9:7/739:7/9//0:24/;-71277)1:62:(2022*04:0*+$'*04:022<:8202/:04:0/2<:21:2:97277)1:6#62<:268/2<:28202/:04:0/2<:2:426::6480:24 887<$' 98220220982/8$'*04:022<::04:0/2<:247:68:7:23:49$'417;49$'417:749**$900)1:&**277)1::60629:;49=:7:;49:749:7496:22<:4721774:409822793:776$721#:72$721#:720982/8923:40<902709 9822:70<0982/89:$721#:723:42<068:7<014:209822747302780628:&$900)1:633:60277)1:6277)1:6:434::277)1:623:427947:4468:723:42:468:7:>>42<22223:4/2!68090982/889:229:29629/2!642992/277)1:60:2432<41768260982/8/0982/87:/094770:2432<4172<41770<2<41770:2472:220222<72904277)1:6682*04:022<82<41772277)1:6:04:02:72:*04:02:70982/8:04:0/2<:2/2/30):04:02:70:2429420:4::8;39:428062:4272:2724439:43047:))682*04:02<41747302073:2:927:92827&:434::47:02072072477:7::2:04:023682992+2743:229227:020660:24379292299:27902277722*7292<:22327::60073;029072:9:6:4712709*2<74<:0:9720872900<064730779872247942734::8;39:428062:4272:2724439:42294:9412701294:0707754368229226:7766:87:47929*29:73:279299006<;77:4:7730)0:243047:))682*04:02<417:60:434::47:434:::434::682*04:0(2:1779:30::476(2&:476(43$721#:7:7:79:2234:733:209:23:4/20982/87:/023:420629/2!642992/30:04:02:72:*04:02:70982/8:04:0/2<:2/2/3:7/706704230;4979:30:'7:&0:027:3:7/706:74&:04:02:7:434::'7:&0982/83:7062743) " !"209406<41290;79729361:$'$"30:40)0;#)0;2630:=2:979274$'$"$900)1:66:0:2437$9002$' 98220220982/8$'*04:022<::04:0/2<:247:68:7:23:49$'417;49$'417:74629:;49=:7:;49:749:7496:22<:4721774:409822793:723:40<902709 9822:70<0982/89:$721#:720982/8923:42<068:7<014:209822747302780628:$900)1:6&$900)1:63330:434::277)1:6629<34(202<34(2:1776292(202<34(2022(2:177442<<3'84220982/8/879923:427947:4468:723:42:468:7:>>42<22223:4/2!68090982/889:229:29629/2!642992/2682#!266826:660982/8/0982/87:/0947779:3068'80628:4262<4177279:30682*04:022<868'80628:30:04:02:72:*04:02:70982/8:04:0/2<:2/2/43) " !"49:2002729030:90;2)0;302/2/:04:02:740)0;#)0;269027430(20:243260:2422(202260:243<<34(2030:60:2224023077022:64820:24392630:60:2224022:6480:2430982/8:6480:240887</2/30):04:02:7(20:243:60:222402260:243047:))682*04:0262<41747302073:2:927:92827&:434::47:02072072477:7::2:04:023682992:434:::434::682*04:02:97$900)1:66:$741$900432$' 98220220982/8$'*04:022<::04:0/2<:223:49629947:&(*'*47:&(*'29:90982/87:/0990982/87/029:9979: 322844629&(*'79: 322:204629&(*'$900)1:6:6:$900)1:60:/2022/2/60:/2022/2/60:/2022/2/989:97947:55&(*'* 32:206292:27947:44&(*' 32846292809847:247847:29:274 3202:200284047:29:6:6:0:2437$90020982/8:04:0/2<:2&(*'*900=00982/87049002:97:6$900)1:62:6480:243$' 98220220982/8$':6480:2432<::6480:240887<23:4962930::60:243**9*&$( *"$ (('30::;0:0230::3390982/87:/00982/87/090982/87:/0:;30:2:2<:792#*4:02:;<:60:243**2:2<:792#*4:02:;<:60:243**2:97$900)1:6#62<:268/2<:2:6480:240887<:9:1:430:243:6$900)1:60:22234:40$900)1:6<2277)1:6*04:0*04:0247-.:4:$'$"430:243:6:$7300:22240)$' 98220220982/8$'*04:022<::04:0/2<:2$':6480:2432<::6480:240887<$'4779629$'41779624962990732:77<799030:68:7$47600168:7:30:0140)((23:49629:629:62997647213:72$721#:720982/8930:00<430:243:6::6:6:&:6:<:6:2:6:9$900)1:630:909/90243'$ /$):6:*04:02277)1:69:48902232098224:9706<42727290982236924::::9249774:99:8792:2904<47144390982/87/023:4:923:490//70982/:70<:89:::990982/87/090982/87/04390//70982/:70<22909/90290//70982/:70>22$3:2;<97:4721::20982/868<2:972:97:62746:22<:4721774:409822793:730:0<902709 9822:70<0982/89:47213:7909/900<470<00682:730:68:7:68:7$30:68:7:#7968:7$30:0<#7904300168:768:7:2980140)((<0140)((<0:020<68:7:#7937968:70<#790<68:7:#7968:7020<7087:29:274292827:(2:1779:629:476(2629<34(202<34(2:1776292(202<34(2022(2:177442<<3'84220982/8/8799<014:209822747302780628:$900)1:6&$900)1:633277)1:6:434::277)1:630::30::(2;79:30:6827:*30:4768:7:#7968:7:#7477:7962979627930:93268:7:4768:7:#7994768:7:#730:24300168:730::930:94768:7:#7774099:4:77736824:47:2022:072796292909:0<#79:30<0<#79:::6827:2::230:;*0<0:0296827:*4768:7:#72:;*:;23:42:909/9023:4/2!68090982/8089:229:29629/2!642992/*"":7962*""79624*""9073243) " !"49:20027290477:7962979629290732:27962430:90;2)0;:796292/2/2742682#!266826:660982/8/0982/87:/09:796279:3068'80628:4262<4177279:30682*04:022<868'80628:30:04:02:72:*04:02:70982/8:04:0/2<:2/2/*""7962*""79624*""9073243) " !"49:20027290:04:02:740)0;#)0;269027430(20:243260:2422(202260:243<<34(20060:24379:640:2430:60:2224022:6480:2430982/8:6480:240887</2/43'$ /$)") " !":60:2224029027430):04:02:7(20:243:60:222402260:24+2743:229227:020660:24379292299:27902277722*7292<:22327::60073;029072:9:6:4712709*2<74<:0:9720872900<064730779872247942734::8;39:428062:4272:2724439:42294:9412701294:0707754368229226:7766:87:47929*29:73:279299006<;77:4:7729420:4::8;39:428062:4272:2724439:43047:))682*04:0262<41747302073:2:927:92827&:434::47:02072072477:7::2:04:02368299230)260:243<:04:02:3047:))682*04:0262<417:6:<:434::4730)260:242:04:02:3047:))682*04:0262<417:6:2:434::4730):60:222402260:243047:))682*04:0262<417:6:9:434::47:434:::434::682*04:0:(2;:6:&:6:*04:02:434:2:97:6$900)1:66:$741$900)$' 98220220982/8$'*04:022<::04:0/2<:2$':6480:2432<:/2<:223:4962929:90982/87:/0990982/87/029:9979:47:&(*'*79: 322844629&(*'79: 322:204629&(*'$900)1:6:6:$900)1:60:/2022/2/60:/2022/2/60:/2022/2/989:97947:55&(*'* 32:206292:27947:44&(*' 32846292809847:247847:29:274 3202:200284047:29629:7:0430:243:6:9$7300:22240)0982/8:04:0/2<:2/2<:2303090:230:90=:90:6:9&0=00982/87049002:97:6$900)1:66:$741$90022<:)$' 98220220982/8$'*04:022<::04:0/2<:2$':6480:2432<:/2<:2$'137923:46292:)#$90022<:*;0982/837921$) /",*$"*$$) /",*/#$92:976:$741$9004320982/8:04:0/2<:2992:976:$741$900)0982/8:04:0/2<:2/2<:29274 k-Ln+m+mL Nk.Mlm-|5fFVf2T4EUEU%U5U4ՠ0BVfV2T4EUEU%U5U4Ӡ0fFVfB%4ՔDE4TEUEU%U5UETdTDԠ0BVfVB%4ՔDE4TEUEU%U5UETdTDӠ0GF626GFB%4ՔDE4TEUEU%UuDD"ScӠ0GF626GFB%4ՔDE4TEUEU%UTtDbCӠ0RFf֠0GF626GF25DEU$tEUEU%UT5U#Ӡ0GF626GF25DEU$tEUEU%UT5UӠ0GF626GF$%D4TEUEU%UuDDbCӠ0GF626GF$%D4TEUEU%UTtDcӠ0GF626GF2T4EԔDTU$5R6FWƖ266r&vbV֠0GF626GF2T4TDT55DEU$t%2#Ӡ0GF626GF2T4TE5Uu#Ӡ0GF626GF2T4TE5UӠР0RFfA!p͡qՑqѵɕqɅ͵хͱ}43723 )("/* $* /$)$!*"242 )("/* $* /$)$!*""7<34:"1!:27 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"(6:22 98210:247<34:$' 66349292229:4:77072247:207240<794:4794::740770224:2287422:0::276437747022:29:4:7973:2729:247:20727<3472:99:7377479072:2764312929:4:794740<769:2872:20727<3472:99:7377479072:2764312947:2707707797:290209874224:4:29:4:774:29:2273:27<34:762979:2973477:4:79<2227277279872871924223:973024:::941879;4:27277*)'# ")('$"",*"',#$*'&") '"''*$*'))) '" ,",()')&("" ) ')$!*$#**'*$""'*&("" ) ')'#"! ' $$, '"$*)')  )* )*) "!""$''""'*) &&*"',#$*+")')''*$*') !"') ,$!*$'$!*$$"' &) &"&( ,''"' &)$!*$#**'*$""'(*"'*'*)$*"')')"))'#" ')('$')$$'")*('"")"" '"'' ,*','# $$,+"*")$''*!*)*!* $$,')')*$!*$##""')'*" $#$' ,,**'#*""'#*)'# """'$# """'*"$$$,'#!$"41:2098220982/094948*<2:27643:44<:1797042092730434709934:<:42:49:7206:79$'$"629!6426292:97168:629629$'$"23:4!6890223:42:970<222$'$"23:4!6809$' 98220220982/823:42:9716890982/87:/090982/87/0$'$"23:4089: 02:9789:0<064:04:02*04:0289:234::02936047:.187047:.847:20982/84:90906<079220720:222::73494406417727:2497:9072:22760919*9:234:094430:.8977<0317773:234:36.18072:93177;14227970223:490622:0424::9274207*04:02:04:020*7643179142;26:24:;29724:47086:22<:2072;2024:544:04:06:0776:07748790322479.18.8072.19442:20982/847:7929:2:04:02227.18072.199:2871:73::04:02227.18072.8072227.8072.19$09:09:2:04:02227.18072.89:2:04:0227.18072:209:472177.473:20642-.18.4:4:278797:60982/8:70<4422<:2:04:0222.8072.47943:227:-.18..47219:23:79342:8<348<9<2<2<9! 412=4669:270:4=46679:22<:=77428779<270774<0179=7734:76.9<20:4600:4600:460:460:460:460:460:460:460:469<9:909<0:460:460:4609<9:909<0:460:460:4641214121412141212<:117982<:2<:117982<:2<:117942<:2<:117972<:2<:92<:2<:92<:2<:<2<:2<:=2<:938 7:2:04:02227.18072.8072227.8072.1802:22*976:2:2:04:02227094:0<47949:327:75;:2:04:02227047:.1847:20982/8072479.477:2780982/8:70<*9:04:022279777<70229;14072279:209.29:.7.18.29:07:24273:2;24:4032.7.1817:.18..29:.7.18.29:.29:.18.4.29:76:24:49:2276:2:223:4.29:.18.4.29:07222275;;2:227:-.18..47219:23:729027:2780982/8:70<8 47:0:902236.18073-.18.97940-289:/>2./.78;20227692/9:9/*9<2447773.420.29:.18.4.29:/9:.29:.18.4.299/=0:4=7>/36;14222:223:4.29:.18.4.29:$'$"23:490277 9822:70<$' 98220220982/823:4962929:90982/87/029::: 01407:99::0982/87/090982/87/02:97!689029:089:1407$'$"23:4902 9822:70<23:49629:23:4043902:9729::: 01407:99::0902:97!689029:089:140782466072247:27:29179:29027:27:0982/8:70<;140726:22470409<:972:0:-.18.47219:23:7$'$"23:490277: 9822:70<$' 98220220982/823:4962929:90982/87:/029::: 01407:99::0982/87:/090982/87:/02:97!689029:089:14072:974374$'$"23:490277: 9822:70322$' 98220220982/823:4962929::: 01407:99::0982/87:/090982/87:/02:97:1407:9:89:140722$721794:4:23:728*227:-.18..47219:23:72;22/9:9/=0:4=7:>/907:774:422*49:21407:9/:/=0:4=7:>/7244236;14222:27643:177$'$"76$721#:72$' 98220220982/823:4962929:90982/87:/029:::2:97:99::0982/87:/090982/87:/096*04:027:2780982/8:70<8207;6:2:2:04:02227.18072.4#6424477072:0424::92742072629/;2629:;0:947769:24730673:262924<73497:9073:27:-.18..92669:24730673:262924<7327072:24730673:262924<73497:9:0:0791342377073:2227:*24730902:2276072;27:227:-.18..97:4721::23:72:<0726:2206<4:4:226873:27643:460<:17743:2424::9274207*0240/:2:02406:20$'$"6292224<$' 98220220982/823:4064:2:970:022<80982/8/24064:2Ց̡}͹4(Ց̡}ͱ4(Ցɹͱ4(Ց MUѥ幠ͱ4(Ց̡}ͱ4(Ցѵɕչѥ͹ͱ4(ՑչՅ15ѡͱ4(4(Pa}%}5U1Q%A1%IĀԤ4(4a}=59%}1%!QM4(4a}MA=Q}1%!QM4(4(e95% }1%!QM}MMM4(05 IQ}1%!Q4(e95% }1%!QM}I1e}a%Q4(4(ՍсH=15(5(рI4(р4(рɕѥ}}ѕ}͍4(рI4(рI4(рI4(рIQ=ɥ}ձI4(4(4(ՍсHM15(5(рAI4(р M퀼M̥сх́х}݁͡5(рɕѥ=͕4(рЕ%}͍4(4(4(1= 1} UI0 ՙɥȕѕɡ4(5(р4(рѵ}4(р̍ɕ}}ѽ}ѕ፽ɑ4(рܽɱ}٥}4(4(4(4(P==с@ѽ5(PɕɅѽ}ѕɕ}ѕȕѕɡѤ4(LMхѕѽ}ѕɕ}ѕ}ͅхѕȕѕɡѤ4(4(4(4(4}A%5(4}A%̸ؤ4(5(4(P==с@ѽ5(ɀAѽQ ɑ̀͡ɱ̀ɱс载Ƚхѕ4(5(̥̀􀄉͡ɹी4(͠İ4(耠͠Ĥ4(̀݅ɑ􀸽ɵ镡ɽ̥͡ɥ4(̥ɽ͡ɱ݅ɑ4(TM}= Q!I1}5AA%95(ɀЍ􀼍хɅ}͠ѡ̥ɥѡɱɥѡ݅ɑɥ载Ƚхѕ4(͕5(хɠѡ݅ɑɥѡ̥ɥ4(ɀЍ􀠅ɠȀ4}A%Ѡѡɱɥ4}A%载4(5(ȕɹЍ4(5(4(сAѽYՕ̀}ɱ̀ɱс载ȽхѕсЕ%4(5(ɀЍ􀜕AѽQ ɑ͡}ɱɱ载Ƚхѕ4(I9 !5(塼ɡЍЍĤ4(ȕɹ4(̀ѽЕ4(ѽ}ѕɕ}ѕ4(ѠЍЕ%ȝ4(ȕɹLI Q1}ѡѽȥ4(5(4(4(Aѽ%ѕͥ塘̀Q]ɱɱ̀ɱсЕ%сЕM}ɽхѥсɕѕՅѥ4(5(ȕɹɕѕՅѥ4(ѽ}ѕɕ}ѕ၄8U115(ѽ}ѕɕ}ѕ၄8U115(ȽхѕЕM}ɽхѥ4(с载􀄉͡ЕM}ɽхѥ4(I9 !5(Е%ɕѕՅѥĤ4(ȕɹɕѕՅѥ4(ȕɹAѽYՕɱQ]ɱɱ载ȽхѕЕ%ɕѕՅѥ4(͕5(5(4(4(ɽ鼼م͹ȕѥɕɥѡɽؼ՝}Ṡѵ5(鼼م͹ȕѥɕɥѡɽؼ՝}8՝}Q}5(}ɽ}͡ݡ81=4(5(ȕɹ̅Ʌѕ͡81ȸɠ=ĸ4(5(4(̀}ɥᡘ̀ȥѱ̀̀݅ɑ4(5(̀́ȥ4(̀́4(̀́􀘽݅ɑ4(ȕɹ͠4(͹ీ͹ీ͹ీ4(͹䱀͹䱀͹䱀4(͹豀͹豀͹5(4(5(4(̀Ѕ}ѽ}ݽɱ̀ؕ̀Ѕi4(5(̀􀄉͡Ѕi襀͠Ĥ耘͠İ4(̀Ѕa􀸽ɵ镡ɽ͡Ѕi4(̀Ѕeɽ͡ЅiЅa4(ȕɹЅaؕЅeؕ䁬Ѕiؕ4(5(4(ɀ̍ɕ}}ѽ}эɀ̍ɕ}ͥ4(5(ȕɹ̍ɕ}́̍ɕ}}ѽ}ѕ፽ɑ偬̍ɕ}}ѽ}ѕ፽ɑ4(5(lvwH.\shaders\include\clustered\punctualLightsMath.hlsli4b$m D,lk-LN.m-MAA*͍.L NLmN,ee͍̍-lE&%&eNn퍮l.LmN, NL̬AČ-d(m.m,Č-d..L(m.mČ-$n*N.N*,n$AdAČ-,lMd..L(m.m D$n*N.N*,ndAČ-d(lMd.N. % ,lMD,lM$eADN d(lMDd(lMnAAAČ-䬌(m.m,Č-d.N(mČ-$n*N.N*,n$AdAČ-$̭.. Dn - e.N(m&&%eA$̭.. d.N. %̭.. Dd(m.m,d.N(m$n*N.N*,n$%eADN $̭..mAAČ-䬌.팭,Č-nM--M) ΪlMČ-n- (MČ-- .팭lj, Č-- .팭l.AdA  dAČ-- .팭lj, $ - &ƌdm.ͭLdmL$%eAČ-- .팭lemLD$팭lj, dAAČ-d - (MM--M) ΪlM$eAČ-$̭.. d.N. e D- .팭lj, d- .팭l$eAd  N.m..ͭADN $̭.. D$̭.. dAAAA$D. ,mn $m$ ,mn M.̍ $.,o,l  -dN,l ĥAd- $팭 $ dL M$ D. ,mn $mD* %dmdN̍ $팭 $%ťAdN̍ $팭 d.- $Lnl. E,M$ dLA$̍ d.- $. E,M$ D. ,mnAd.m*-l*Nd. dN̍ $팭 $K$$mEKK&M$ dLA$̍ EKDKd K&$M$ ,mnAdm +. $md- A-$--ml +LI(mn Č-dm +. Č-d.m*-l*N$AaAČ-d.͍ +. d.N% dm +. Ddm +. $eAAČ-$--m lA鍮 D荍. l$m,..̍  M.,- M- ĥA +L $md-l $  dNή Ddm +. d.Nd.m*-l*N$Adm +. e.Nd.m*-l*N$$̍ m $$mA + 䭎Ld,l d, D L $͍ $ dm +. Ddm +. d.m*-l*NA$̍ n. d.N. dm +. $$m, ĥA$ dm +. Ddm +. d.m*-l*N$AdA$--m d.m*-l*NDd.N. dm +. $eAAmAdAČ-d.N% d.m*-l*N$,eM$ ,mn -md. -,  DAČ-$Ddm +. d.͍ +. $eAČ-d.͍ +.l*N. d.͍ +. Dd.N% $D$/eA$--m dm +. D$lm(l%/Dd.͍ +.l*N. $Dd.m*-l*Nd$. e.͍ +.l*N. /eA$--m *iAADN - $--m ,eAAA-$--ml +L,̭.. Č-nMM-Č-n,M) Č-- N*,nČ-d.N(m.AaAd +L ...ͭAČ-dm +. d- MM-,M) .%''%'''dd-  $- d,lA ĭ N̮̍ MLḽN.. $͍  dN,lA$̍ n$- ,. D,n %'''ĬAAČ-d.N) N*,n- N*,nD- N*,ndAČ-d.m*-l*N- d.N) N*,nd.N(m%''',eAČ-$--m $--ml +LI(mn dm +. d.m*-l*N$eADN $--mlAAAA-$--m(mn-̭.. Č-nMM-Č-n,M) Č-n-̭M-Č-- N*,nČ-d.N(m.AaA(mn ...ͭAČ-dm +. MM-,M) .eAČ-d.N) N*,n- N*,nD- N*,ndA  dN,l ̭N.  - AČ-d.m*-l*Nd.N) N*,nd.N) N*,nd- d.N) N*,nd.N(m$%eA. -D,d.N. -̭M- ,M) .% DL-n L΍ N ĥAČ-$--m $--ml +LI(mn dm +. d.m*-l*N$Dd.N. -̭M- ,M) .%eADN $--mlAAA- d- .L.mŌ-nM mČ-m+̍K.,nČ-n- ,Ml.͍Č-- .팭lj,Č-- .팭l䭎- -̭..͍䭎Č-n,MH) 䭎Č-n-͍N- .AaA-͍N- m+̍K.,n/OM m/OoAČ-,mn*H) -͍N- -͍N- .eAČ-Dn (mH) Dn.N&f,mn*H) .eA,MH) -͍N- NEn (mH) nAČ-$n*NN* Dn Nm+̍K.,n.%eAA-̭.. 䬌(m.m,,mn*H) $n*NN* $eA-̭.. -̭..M嬌.팭,,MH) - ,Ml.͍- .팭lj,- .팭l.eAAA- $L,l +LM--M/. Č-̍Č-- n*MČ- $AaAd  M--M/. ,lMnΥA鍮LDnn. dL M--M/. Md쭭 . N L,mn-̭ M--M/.-A- ,md.N. - n*M -eA- M(lM  dƥD,m$eADN M(lMDM(lMnAAA-l$L,l +L) -lD-l- - - n*M,Aa/A$ɍLnl dL̥A-ld̍L(M D*DDjA  d̍L(MDd.N. - n*M  e̍L(M.e%&$e'!!ADN /OoAAA-͌d +L,H,) .ɍLnl. -lĉ-lĊ-l- + -- - n*M $AaA-͌- Ϊl -͌/O$,eA-lD +ĎlŊ)eAA- Ϊl/O$L,l +L) E + -- n*M,eAAM--M̥A- -  - Ϊl/O$$&eA- Ϊl/OmAAȭL,M--M/.ͭA- Ϊl$L,l +LM--M/. ̍- n*M + - $eAADN - ΪllAAAAa;C2pC #+Jsc#+"K33+#3sAccKL// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef DIFFUSE_BRDF_HLSL +#define DIFFUSE_BRDF_HLSL 1 + +#include + +float3 diffuseLambert( float3 diffuseColor ) +{ + return diffuseColor;//division by PI omitted intentionally, lightColor is divided by Pi +} + +//linearRoughness - perceptual linear roughness +float3 diffuseBurley( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + float FD90 = 0.5 + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return diffuseColor * ( FdV * FdL );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//from moving FrostBite to PBR, energy conservative burley diffuse +float diffuseBurleyFixedFresnel( float linearRoughness, float NoV, float NoL, float VoH ) +{ + float energyBias = 0.5; + float energyFactor = (0.45f * linearRoughness - 0.475f) * linearRoughness + 1.0f; + float FD90 = energyBias + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return ( FdV * FdL * energyFactor);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float3 diffuseBurleyFixed( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + return diffuseColor * diffuseBurleyFixedFresnel( linearRoughness, NoV, NoL, VoH);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float diffuseChanFresnel( float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + // Since we use CoD fitting, need to invert/convert our roughness parametrization to + // their glossiness parametrization 'g' + float ggx_alpha = linear_roughness*linear_roughness; + float a2 = ggx_alpha*ggx_alpha; + float g = saturate( (1.0 / 18.0) * log2( 2 / a2 - 1 ) ); + + float f0 = VoH + pow5(1 - VoH); + // This factor tunes the enery boost at grazing angle for low roughness material. + // It creates energy ring at grazing angle for smooth dieletric material + // The higher the value 'rimScale' is, the lower the energy boost will be + // The default value from Chan is 0.75. + // Setting the value to 1.0 get rid off this energy boost. + const float rimScale = 0.75f; + float f1 = (1.0 - rimScale * pow5(1.0 - NoL)) * (1.0 - rimScale * pow5(1.0 - NoV)); + + // Rough (f0) to smooth f1 response interpolation + float fd = lerp( f0, f1, saturate( 2.2 * g - 0.5 ) ); + + // Retro reflectivity contribution. + float fb = ( (34.5 * g - 59 ) * g + 24.5 ) * VoH * exp2( -max( 73.2 * g - 21.2, 8.9 ) * sqrt( NoH ) ); + // allow to fade our rough retro reflectivity + fb *= retroReflectivityWeight; + return ( fd + fb ); +} + +float3 diffuseChan( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + return diffuseColor * diffuseChanFresnel(linear_roughness, NoV, NoL, VoH, NoH, retroReflectivityWeight); +} + +float3 diffuseOrenNayar( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH ) +{ + float VoL = 2 * VoH - 1; + float m = linear_roughness * linear_roughness; + float m2 = m * m; + float C1 = 1 - 0.5 * m2 *rcp(m2 + 0.33); + float Cosri = VoL - NoV * NoL; + + float C2 = 0.45 * m2 * rcp(m2 + 0.09) * ( Cosri >= 0 ? Cosri * rcp(max(NoL, NoV)) : 0 ); + return diffuseColor * (C1 + C2); + //float C2 = 0.45 * m2 * rcp(m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NoL / NoV ) : NoL ); + //return diffuseColor * ( NoL * C1 + C2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// N is the normal direction +// V is the view vector +// NdotV is the cosine angle between the view vector and the normal +float3 getDiffuseDominantDir ( float3 N, float3 V, float saturated_NdotV, float ggx_alpha) +{ + float a = 1.02341f * ggx_alpha - 1.51174f; + float b = -0.511705f * ggx_alpha + 0.755868f; + float lerpFactor = saturate (( saturated_NdotV* a + b) * ggx_alpha); + // The result is not normalized as we fetch in a cubemap + return lerp (N, V, lerpFactor ); +} + + +#endif ZYW[YW]ڗ [5xyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3)rJ"2BbbjP!+3Ks+)rJ"2BbbiPhPI3s#+3IrjJrJzjP!+3Ks+IrjJrJzqAkP)s#K3kPhPxyiiiiiiiiiiiiiiiiPxy)r"2jPxyiiiiiiiiiiiiiiiiPhP@ c39+*r"2 + +{CA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiP{sA c3iqAciqAciqAcqAiP{sA c3qAcqAcqAciqAiPA c3aKs+ {;Cs+QYiPA c3 iKsCsQsc)ÃAiqAQqzIIQsYsiP+sA c3AiqAcqAIQ YsѻiPkPhP@ c3)r"2 +{CA c3+c zc{cA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiPA c3 9+*r"2 + +{CaKs+ {;Cs+cqzIiP+s+c zc{Q rY rS +CIrjJrJzR+c zc{s9KiPkPhPhP@ c3)r"2 +{szsk+ cCA c3aKs+ {;Cs+cA c3qzIiPkPyy +k+ )r"2 +{Cqa{;Cs+cqzIiP{sA c3iqAciqAiP{sA c3qAcqAiPA c3aKs+ {;Cs+QYiP+siKsCsQsc)ÃAiqAQqzIIQsYsiPkPhP)s#K3kP O \ʸ\( \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYRQԗQWSWЗVYY[RQԗQWSWЗVK \ٛ[[\Y]ڛ\KYY[TȌK MLMML NMΌ  ̌YYY[RT +K +ȌK MLMML NMΌ  ̌YJB  țY[[[ZH^Z[]ڛ[  Ց H HSQT]Y +H WK \YZ\X\ڛ[ TY\XRțHSZY[]XQ]ڛZ]H[Y[]\\XY]Q]ڛ\ + H H\X]HHK ]Y HK[HۜQ [HVJ^B[^ HHJVNB[ H^ +^NB[ H +^NB[NBBHH LLL  +^ +HK ̍ NBH M  + +NBHH L ΍LΌ + +NBH\J H ^L + +NBB HY]ڛH[ܛ\YB Z\[ٛ\H[\[H\[ݛH \[YYYYB\]HO TH NB_B  țY[[[ZH^Z[]ڛ[  Ց H HSQT]Y +H WK \YZ\X\ڛH[H\Q [HVJ^B[HHNBB H\Hț\țH\B\]RTH HۜQ +^NB_B  țYZ\H^Z[]ڛ[  Ց H HSQT]Y +H WK \YZ\X\ڛH TY\XHYXZH^Z[]ڛٛZH]YY]ڛ TZ Ȕ TZUH [^ H HSX M[H]Q [HVJ^B[HHNB\] +J K  +H +^ +H  ͌ + + +H LYNB_BHYTRHYRTRBHY|Їd5FV&7Ǖ6VGVu&VgfV&%6W6ǖF^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@D\D@ʦP@R@@@@@@zz@v@Ȏ@@@@f@ʆv@@@@f@v@@@@f@v@@@@@X@v@@@@f@v@@@@@v@@@@@v@@^^@@@@@@@@@Ⱦ޾v@@^^@@@@@@v@@@@@@@@@@@@@@@@@@@^^@@@@@@v@@@@f@܆v@@@@@ܾv@@@@@vv@Ȏ@@@@f@v@@@@@v@@@@f@v@@@@@v@@@@@^^@@@@@@@@@@@v@@@^^@@@@@@@@@@@ܾv@@^^@@@@@@@@@@@v@@@@@@@@@@@@@@@@@^^@@X@@@@@@@ܾv@@^^@@X@@@@@@@v@@@@@v@@@@@vv@Ȏ@@@@h@޾v@@@@h@ؾv@@@@d@بv@@^^@v^^@@d@ʜPf@R@@@@d@@z@P\R@T@PPZ\T`\jV`\jRRv@@@@@z@T`\jV`\jv@@@@@vf@ʜPd@R@@@@h@@z@hP\X`X`RThPdXdX`X`R@V@hPZbXZbXbXZbRv@@@@@@z@P\XZ\Rv@@@@\@z@v@@@@\@Tz@PRv@@@@@P\@T@d@V@fP`X`XZbRRv@Pf@R@@@@@PX@fP`\drrX@`\jpnX@`\bbhRRv@ʾ޾Pf@R@@@@@PPR@T@Pb@^@`\`hRR@T@`\r@V@`\bv@@^^@@@@@@@@X@@@Ȏ@־PȎ@R@@@@Ȏ@v@@@@@@z@\v@@@@@z@ʦP\R@~@\ܾ@t@v@@@@f@ؾ@z@fPʜP\\RX@P\X@b\`@^@bdnRRv@@@@@@z@\@T@Pb\@^@f\`Rv@@@@\ؾ@z@hPؾX@Rv@@@@\޾@z@hP\X@ʦP\R@~@\ܾ@T@Pb\`@^@R@t@\Rv@@@@^^@\޾@z@hPP\X@b^d\dRX@\Rv@@@@^^@\ب@z@PPTbjRTblVP\TbjRRTPb\`^djj\`Rv@@@@\ب@z@dPX@\Rv@@@@@v@֜ئPf@ؾX@@f@X@@@R@@@@@z@ʜPؾ\Rv@@@@@z@Pؾ\Rv@֎ئPȎ@X@@f@X@@@R@@@@֜ئP\ؾ\X@X@RvȎ@֎PȎ@R@@@@Ȏ@v@@@@\@z@P\ؾ\@T@f\Rv@@@@^^@@ب@z@\ب\TPdjj\`^bl\`Rv@@@@^^@@@z@PبRTPbl\`^bj\`Rv@@@@^^@@@z@PبRTPb\^bjRv@@@@@@z@\ب\v@@@@@@z@\ب\v@@@@\@z@\޾\v@@@@֎ئPX@\X@\Rv@@@@\ܾ@z@ʦP\R@~@@t@`v@@@@\@z@v@@@@\@z@`v@@@@\@z@ʦP\R@~@b@t@\޾\v@@@@\ܾ@z@ʦP\R@~@\޾\@T@@t@`v@@@@\@z@v@@@@^^@\ʆ@z@TPbZ\Rv@@@@^^@@`@z@`\`hv^^P`\blX`\`bX@Rv^^PPb\`@Z@ʒR^Pb\`@V@ʒRR@@v@@@@^^@\@z@PfP`X@`X@`RX@X@\Rv@@@@@vȎ@PȎ@R@@@@Ȏ@v@@@@\@z@\v@@@@\@z@\v@@@@\@z@b@Z@\v@@@@\@z@PbZhX@\@T@\Rv@@@@\@z@\v@@@@\@z@\v@@^^@@@d@@@T`\nj@@@@@@\܆@z@\ܾ@T@\v@@@@\ܾ@z@\ܾv@@@@\Ⱦ޾@z@ʾ޾P\Rv@@@@\ʆ@z@\@Z@\@T@\v@@^^TPbZR@@@@\@z@\v@@@@\@z@\ʆ@T@\v@@@@@`@z@`\`hv@@^^@V@P\@zz@@~@`\d@T@PbZ\R@t@`Rv^^P`\blX`\`bX@Rv^^PPb\`@Z@ʒR^Pb\`@V@ʒRR@@v@@@@`@z@P`X@`\`bX@\@T@\Rv@@@@`@Tz@Pb@Z@\Rv@@@@\@z@PfP`X@`X@`RX@\X@\Rv@@@@\@z@\v@@@@@v@P@Ȏ@R@@@@\@z@\@z@`v@@@@\@z@\@z@\@z@`v@@@@\ܾ@z@\ܾ@z@`v@@@@\@z@\@z@bv@@@@\@z@v@P@Ȏ@X@f@R@@@@\\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@f@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@ܾR@@@@\ܾ@z@ܾv@ܾP@Ȏ@X@@ܾR@@@@\ܾ@z@ܾv@@@@@h@޾@t@`v@@@@h@ؾ@t@bv@@@@h@ب@t@dvv@ʾPȎ@R@@@@@̞v@@@@̞\޾@z@\޾v@@@@̞\ؾ@z@\ؾv@@@@̞\ب@z@hP\بX`X`Rv@@@@@̞v@ʾPȎ@R@@@@@ʾP־PRRvF@ʾPXR@ʾPRf@ľPf@؜X@f@X@f@X@d@R@@@@^^@@@@@@@@@@@f@b@z@PRv@@@@f@d@z@PRv@@@@d@b@z@PRv@@@@d@d@z@PRv@@@@^^@@@@@@@@f@d@z@PX@dRv@@@@f@b@z@PbX@Rv@@@@f@@z@d@T@b\@V@b@T@d\v@@@@f@@z@d@T@b\@V@b@T@d\v@@@@^^@@@Z@@@@@@@z@PPPX@RX@PX@RRRv@@@@@fP؜\@T@@V@P؜\@T@R@T@@V@P؜\@T@R@T@Rv6>$902941:23:32/02494 \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBH[YșXYܗX\ [HBU]\ HXיX\Y] +LNU]\ ۛ\[יX\Y] +]LNU]\ H[]\ZיX\Y] +LNU]\ YיX\Y] +LNBTX[]]YYX\X[\Y]LNBTZّXY\YTZّXY[ XJ^TZّXYșXNșXKXWHHXיXTX[S] +YYX\X[  LNșXۛ\[\[W[]\ZHۛ\[יXTX[S] +YYX\X[  LNșXK[]\[XXZHH[]\ZיXTX[S] +YYX\X[  L ^N\]șXNB_BX\ّXY\YX\ّXY[ XJ^\]XܑXYJ\ڑXY\YTZّXY +XJJNB}܇h5FV&7Ǖ6VGVƅ&Gv&WEVfV66ǖL^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@F@PR@\F@PR@\FF@F@PR@FF@F@PR@FF@d`dbF@d`db@bFF@@bF@@f\bhbjrdljF@@f\bhbjrdljF@@`\`````bF@@fPb\`X@`\`X@`\`RF@@fP`\`X@b\`X@`\`RF@@fP`\`X@`\`X@b\`RF@@bF@@bF@@ʾȾʾF@d@ʾȾʾF@f@ʾȾʾF@h@ʾȾʾF@@F@d@dF@f@fF@h@h@fP@X@@X@@R@@@@@PX@PX@RRv@fP@X@@X@@R@@@@@PX@PX@RRvF@PR@@fPf@R@@@@@fP\X@\X@\Rv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRvF@@F@PR@@PPRRF@PR@h@tvF@dPX@X@X@R@\ʎPFFX@PR\X@X@RF@dPX@R@\ʘPFFX@PR\X@PR\RF@fPX@R@\ʘPFFX@PR\X@PR\RF@PX@R@\ʘPFFX@PR\X@\RF@PX@X@R@\ʘPFFX@PR\X@RF@dPX@R@\PFFX@PR\^PR\RF@dPX@R@\PFFX@RF@fPX@R@\PFFX@RF@PX@R@\PFFX@RF@ʎPX@R@\PFFX@RF@،ОPX@X@X@R@\PfPX@RX@RF@ʞPX@X@R@\PFFX@X@RF@ʘȞPX@X@X@R@\ʘPFFX@X@X@RF@PX@X@RF@@F@@غF@@кF@@ܺF@PR@@@F@F@PRF@PRF@F@PR@F@F@@bF@dF@dPX@R@`F@dF@fF@PX@X@RF@PX@R@`F@PX@X@RF@PX@R@`F@h@،ЄPdxh|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvf@،ЄPdxf|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvd@،ЄPdxd|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRv@،ЄPdx|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvh@،ЄPdxh|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvf@،ЄPdxf|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvd@،ЄPdxd|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRv@،ЄPdx|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvh@،ЄPfxh|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvf@،ЄPfxf|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvd@،ЄPfxd|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRv@،ЄPfx|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvF@،PX@X@R@،ЄPX@X@X@X@X@ZbRh@ȄPxh|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvf@ȄPxf|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvd@ȄPxd|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRvF@ȄPX@R@ȄPX@X@X@X@ZbRF@ȄdPX@R@ȄdPX@X@X@X@ZbRF@ȄfPX@R@ȄfPX@X@X@X@ʾFFRF@ȄhPX@R@ȄhPX@X@X@X@ZbR@ʄPʂ@X@@X@@X@@X@@X@@R@PX@X@Rv@@@@\PX@Rv@ʄdPʂ@X@@X@d@X@@X@@X@@R@PX@X@Rv@@@@\dPX@Rv@ʄfPʂ@X@@X@f@X@@X@@X@@R@PX@X@Rv@@@@\fPX@Rv@ʄhPʂ@X@@X@h@X@@X@@X@@R@PX@X@Rv@@@@\hPX@RvF@ʄPX@X@R@ʄPX@X@X@X@X@ZbRF@ʄdPX@X@R@ʄdPX@X@X@X@X@ʾFFRF@ʄfPX@X@R@ʄfPX@X@X@X@X@ZbRF@ʄhPX@X@R@ʄhPX@X@X@X@X@ZbRF@ȄPX@R@¶PPPX@RX@RRF@PX@R@¶PPPX@RX@RRF@dPX@R@¶dPPdPX@RX@RRF@،ЄPdxd|@X@d@X@@X@@X@@R@@@@@v@@@@@¶ƺ\vF@،PX@R@،ЄPX@X@X@X@ʾFFRF@Bd`dbF@PX@X@R@@~@@t@F@PX@R@@@Ff@fPf@RF@@@@@@PX@ljj`h\RvF@@@@@PPPX@RR\X@X@fP`X@`X@`RRvFF6?\ʸ\ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYחSSӓWYY[חSSӓWBH[YYY\ٗ [OH[Y\X[ܗ [OH[YO]ڗ [OB QY\HY[YY[QQTSPPLYY[QQTדTӗSPVHLYY[QQTїPSQLYY[QQTїPSQ֗QVLYY[QQTRMBHYQQTQYY[QQTQQTїPSQ֗QV QQTדTӗSPV QQTїPSQ QQTדTӗSPV QQTїPSQ QQTSPPKHYYB HSژܛYXY\X]ڛY]ڛ[BYY[TїSLYY[TїPRSHLYY[TLBHYTQYY[TTVHYYB Q[[\H][]]ڛțZ]YYY[TWRSPLYY[TїSQUSHLYY[TRSQSLYY[TSLYY[TTSMYY[TTSГTSUHMYY[TTSГTSUWMBHYTQYY[TTTSГTSUQHYYB \ٜ[[YY[TЗїӓSLYY[TЗSHLYY[TЗїTєSLHYTЗQYY[TЗTЗSRHYYB ZY[HYRQTPSTYY[RQTPSLHYYB[ YY\[ YY\ۛ [[[Y[[ [ӛ [ [RJ^HQQTHOQQTSPPU\]YY\SXX +YY\ۛHNH[QQTHOQQTדTӗSPVT\]YY\ٓ\SX^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQV\]YY\P[Y +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQ֗QVQ\]YY\P[YQ^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTRSHܛXYY\YY\ ]R\]NHYYB_B[ YY\[ YY\ۛ [[[Y[[ [ӛ [ [ [RJ^HQQTHOQQTSPPU\]YY\SXX +YY\ۛHNH[QQTHOQQTדTӗSPVT\]YY\ٓ\SX^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQV\]YY\P[Y +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTїPSQ֗QVQ\]YY\P[YQ^ +YY\ۛ [[Y[[ ӛ  HNH[QQTHOQQTRS\]YY\Z +YY\ۛ [[Y[[ܜ +[[Y[[ ӛ   RNHYYB_B[Y\X]ڛ[WZ [RJ^HTHOTїSS\]Y\X]ڛ[ +WZ HNH[THOTїPRSS\]Y\X]ڛPZ[ +WZ HNH[THOTV\]Y\X]ڛ +WZ HNHYYB_B UH  +ӛUJ[Y[[\ژU\X[][WZ [ӛ [ [RJ^HTHOTWRSPU\]Y[[\^R[XJNH[THOTїSQUSS\]Y[[\SY][ +ӛ HNH[THOTRSQSS\]Y[[\R[Y[ +HNH[THOTSR\]Y[[\[ +WZ ӛ HNH[THOTTSV\]Y[[\T[ +WZ ӛ HNH[THOTTSГTSUQ\]Y[[\T[Л\[] +WZ ӛ HNH[THOTTSГTSUWV\]Y[[\T[Л\[]Y +WZ ӛ HNHYYB_B[ ї\ٜ[[ \X[ۛ [RJ^HTЗHOL\]\ٜ[ӛ[ +\X[ۛHNH[TЗHOHL\]\ٜ[[ +\X[ۛ HNH[TЗHOL\]\ٜ[\ٜ[ +\X[ۛ HNHYYB_B[ \X[[WZ [ӛ [ [ [ ZZY\ Z ZYۛ\J^[HY\X]ڛWZ RN[HY[[\ژU\X[]WZ ӛ  RN[ \\H +NB\]\\NB_Bˋ[ݝX][\؛]K[܋ L KL[\ٗ]Wۛ]ٗX]ܗ ʛ\Y[]\ڛZXHYYHJ[[\]\[\ڛ[\]\]ٗ [H [WZXJ^\]\]\] +\]\]ٗ +H H JK +WZH H LJ +H H +HSNB_WZH[[Y[[ܜ +[[Y[[\B WZH[[Y[[ܜ +[[Y[[\Z ]Yїӗ[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[ [ ZYۛ [\[XX^J^HTPSQTS QQTHOQQTSPPU\]YY\SXXX\QY\ۛ\NH\Y[ Hۛ\[[^]Z +[Q\N[H\]\] +ۛ\[ RJN[H\]\] +]Z RJNZ YY\HYY\X\QY\ۛ [[Y[[ ӛ  RNHHTPSQTSQ[ \X[H\X[WZ ӛ    \[XX ZYۛ\ + +\X[\N[ Hї\ٜ[\X[ۛ RN\] +YY\ + +\X[\NH\Y\]YY\NHYYHYYB_BZ ]Y[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[ [ ZYۛ [\[XX^J^\]]Yїӗӛ  X\QY\ۛ WZ [[Y[[ \X[ۛ \X[\ [Q ]Z ۛ\[ ZYۛ \[XX^ + +NB_BZ ]Yїӗ[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[[J^\]]Yїӗӛ  X\QY\ۛ WZ [[Y[[ \X[ۛ \X[\ [Q ]Z ۛ\[ [ +  L + LNB_BZ ]Y[ӛ [ Z X\QY\ۛ ZWZ Z[[Y[[ Z \X[ۛ Z\X[\ [ [Q [ ]Z Z ۛ\[[J^\]]Yїӗӛ  X\QY\ۛ WZ [[Y[[ \X[ۛ \X[\ [Q ]Z ۛ\[ [ +  L + L + +NB_B ѓSPUKM H[YYH؛]]Z\ٛH^X[\YY\X]ڛH\X[ܗ [ZJB]T]\P܌ J]X\J^XHXHM +XHMNXH +X  ^MMMMMMMM +HL + +X  ^PPPPPPPP +HLNXH +X  L +L + +X  P +LNXH +X  Q +M + +X  L +MNXH +X    Q +N + +X    L +NN\]XNB_B[ RX[[[YJ]H H]SJ^؛[HQ H\[JZ + SN؛[H HT]\P܌ JZ + +ˌ ͌M MLYK N\][ JQ HLNB_B[ HRܛ]XTX[[ H [HLJ^؛[ZH +T +H N؛[Z]H\ +J H HK^ + J +J H H L + +HK^JN؛[\Z]H\J H Z] +Z]XNB[ N H\Z] + +ZZNKH\Z] +\ +ZZNHZ]NH\]NB_B[[H [RJ^؛[H +H H R + + +H N\]H  +T + +YNB_B[HRܛ]X[Z] [HLJ^\]Z] +J Z]XNB_B[\X[[ [H [RJ^\]HRܛ]X HL + H[ + +  LLNB_B[S][[X[ ۛ\J^\]ۛ [ +L ML  ̍LJNB_BHYa~e5FV&7Ǖ6VGV5FV&u&6ǖ}^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@F@@bF@Dʾ\D@dP@R@@Tv@hP@R@@dPTRv@pP@R@@hPTRvd@ddPd@R@@Tvf@dfPf@R@@Tvh@dhPh@R@@Tvd@dPd@R@@Tvf@dPf@R@@Tvh@dPh@R@@Tvh@hPh@R@@dPTRvh@pPh@R@@hPTRvh@blPh@R@@pPTRv@jP@R@@@z@Tv@Tzv@@Tv@dP@R@@Tv@hP@R@@dPTRv@jP@R@hzTv@hTzhv@@hTv@ȠP@X@R@@@PPPRX`\`````bRXRv@f@ޮPf@X@ff@R@@@@@PX@Rvff@訄Pf@R@@@@ff@v@@@@f@@z@PX@Rv@@@@@z@PPX@RX@X@PX@PX@RRRv@@@@@z@PRv@@@@@f@@z@PPX@RRv@@@@@ffP@^^@t@Zbnrn@@@@X@@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RRvff@訄Pf@X@f@R@@@@@z@P@Z@PX@R@T@Rv@@@@@f@@z@PX@Rv@@@@@ffP@^^@t@Zbnrn@@@@X@@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RRv@ʾP@X@d@ʾR@@@@@Pʾ\@V@ʾ\@T@RvF6s?,902941:29:0/1923494n2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf2U4T$%$Ed4Ԡ0BVfV2U4T$%$Ed4ӠР06VGV3FV&u&6ǖӠРҔ6&f6VF2W6V&BrbBƤfBb6bԠb6rBƤfҠР0fFVfdՔ$ՠ0BVfVdՔ$R֠0RFf֠Р%Ėss"FV6f–vF"WfV6Fb&2WGW&2FV6WF6FW'W6'ՠ`FB6G'&VG&ĖbFrvbFҠנbF&rvrvӠbF&&Ӡ"WFW'&2WFv&"Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР%T6c3"BV27FGW&vfRV6F'vVF6rfW6b&"Vw2W'g6V6'ՠ`FB6G'&VG&T6bFrvbFҠנbF&rvrvӠbF$Ӡ"WFW'R$&$&$$Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נРrtB%v'&FvV"UFנ`FB6G'&VGvtbFrvbFҠנbF&rvrvӠbFB&"F֠"WFW'&SւBBBf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР6F'6rtB6Vנ`FB6G'&VGvt6bFrvbFrvbFbF7bF7bF7ҠנbFBFӠbFBFӠbFBv'rvv'rvӠ"WFW'SւrvrvBBBf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР4֖֠FG7&v6r&G'W672"C2F2FvҠ`FB6G'&VG6FbFrvbFҠנbF"'rvrvӠbF26'ӠbF2&26'ӠbF2F2&2&Ӡ"WFW'2FBR26'2&"'B"'2FBf6"6֖FWF֠נР`FrVVF'ǖ6FҠנ"WFW'"SӠנР`FrVVF'TVbFfbFҠנ"WFW'"7BfSRӠנР`FrVVF'7F&'6VbFbFbFfbFbbFrvҠנbFDF5WFӠbFDFg5WFfӠbFEfeEF"bӠ"WFW'ҖҖEfeEFDFg5WFEfeEFDF5WFӠנРTVV""Җ6&f6VF"6WF2VVF2W6V&FGW"&GfFVrF&G6V2ǖv&ՠ`FrVVF'TVVbFbҠנ"WFW'"7BbbӠנР`FrVVF'75Ɩ6bFrvbFfbFҠנbFv'rvRӠbFrVVF'75Ɩ6ffӠbFrVVF'75Ɩ6Ӡ"WFW'"SrVVF'75Ɩ6frVVF'75Ɩ6ӠנР2ՖFBW&b&rtՠ`FrVVF'7ՖFbFrvbFfbFҠנbF&v'rvӠРbFrVVF'7ՖFff2'Gfff&&ӠbFrVVF'7ՖF2'G&&Ӡ"WFW'"7rVVF'7ՖFfrVVF'7ՖFӠנРFf2&'WFWF2ՖFBW&b&rtTFנ`FrVVF'7ՖF6&'WFWFbFrvbFfbFҠנbF&v'rvӠbFrVVF'7ՖFf2'Gfff&&ӠbFrVVF'7ՖFf2'GƤ&&ӠbFrvӠbFrVVF'7ՖFffӠbFrVVF'7ՖFfӠ"WFW'R"7rVVF'7ՖFfrVVF'7ՖFӠנРFfF2ՖFBW&b&rtՠTF"C"RFV&7GFvBV6v2FvvbT6FҔ6&f6VF"6WF"$Ed4'ՠ`FrVVF'7ՖF6&'WFWF'bFrvbFfbFҠנbFrVVF'7ՖFffrvrvӠbFrVVF'7ՖFfrvrvӠ"WFW'R"7rVVF'7ՖFfrVVF'7ՖFӠנР4֖֠FG7&v6r&G'W672"C2F2FvҠ`FrVVF'7FbFfbFƔҠנ"WFW'BƴffӠנР`F7b&W6VVbF72W6V&7&Ҡנ"WFW'2W6V&7&ӠנР`F7b&W6V65Ɩ6bF72W6V&7&bFbҠנbFb4vWbӠҠGvV67B"S676Ɩ67&VF66GWF26FV&WFB"V2Fvv֠"WFW'2FW'FWdՔ$2W6V&7&rb4b42W6V&7&ӠҠנР`F7b55Ɩ6&VwV67bF7bbFbbF"VwV67Ҡנ26GbFb4vWbӠbFf'Vw"VwV67Ӡ"WFW'bbF7f'Vwf'Vwf'Vwbbb4ӠנР`F7b&W6Vf$W6VƆbF72W6V&7&bFbҠנbF72W6V&7&7'G2'G2bF7bF7㒓㒓㒓2W6V&7&ӠbF72W6V&7&7'G2W6V&7&7'GӠbF7r2'GbbӠ"WFW'Rv'eW66rbrbv'eW66rbbrbbӠנР`F7rVF'Vw&UfV6FfU6bF7"bF7&bFrvv'–V&%VwV67Ҡנ"WFW'V&&"rv2'GrvrvӠנР0RFf֠A9p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 φ RDܗ $>shaders/include":(77<68222477:27241:9029-ZilZȾ8\amX@ BHFFLPhDD +MiB-DnnP LjB3!Y!BZ! +۬ +, mH`Af`A`ahhCR2T7+T* +DC¡ B#/3479::32 bm@VHvhVHx `B?7+B*B69PM` 6  ڀP + MlCs dTgTF34A@  IQ60'eFe4C +2#4R#60цabCF*8 l˔\]ڛ!&I!X BLfPeaY!:#;####P†HH6ea)><"%?R!;*<6׆:#S#+ ()1 +;+ $ʆeRTHh6a@%V6$F"0A7YEJ|4H>P` h,dE\ݸS%A6D!@O#0XG=*`z\`H: u' @O`z ܘ\YܸS'6627&WV67.B w +tcDLܠ "vGTG6.@Itu@M m NNm\+#0XG=`0.@@ &GKy%8c.moveFromPosD^) K+ b +$F)2<77:763;47=ٓ +KrʅęXٸȧ^8uH44.B7)u <%@?B:#0 VFV67$G%6V7V67.@/DA Cظ ^Z&08) +nnDb#z6 `m\HlT/%@F>@߃D_SCH_Ӹȧ^A%@?BH#0XG=:`z|`px`%DNK##0 K$?' D,` 176.@$~J5enviAODb)QFǔvF7g4.@$J5q "$l0.B$=@0-%@f! %@f-͍N- n\Hz}|ژ%[ m09q "VB$b+{R!&invSqrRadD#=HOT\TYZܸ+ h>@3W&WFF6G6V6.B>J>$hѽɍK#2smoothFactorDCHK][]]ڛ۸+ –vFG&7.@$=J>NoLD?HZU\۸-(=KBsPP@! +- NHh\Hz +i4%j ͮͅLenJ7\\:V\c eNne͍̍nn +E::;c;;#>>>C?? eNn̅,ͭlnJ0"s{+si Ks3Jc+s +k+2<:20) +Y!s+K{s2<062)A !sC #+kz#+c2<:)AY"s˃+ rs{ K{s"!sK+K" +ȑ2<27:<47)A+yY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f09mβT?_ Ea E,D7@I R2S6V|0P\%Wvt c (   +c $ `00Fc&)LR 0A8NapH ¡ +c&+LZ 0A8nap $&GHL #1A8Hbp0 c%&KL .1Ap^bpሉ !&&ML :1A8zbph -&ZL i1A8bp q%&\L v1A8JcpЋ ±/&iLԘ 1A8Zcpx #6&lL# `сnԌ!Ao҈A tuȁA5a$AgXA twЁ5a$A`A tyA6a$ +u0qpҌ!d` + A (`t 4a AA +?t?0a$2 +wPsԄ0b E)Ä0b  +)AT 7A (vP{`M#`PB`@A (w`5a A +?A?L# `6a A +??L# `A6a A +??L# `BA6a A +??L# `6a A +"?A?L#`PBe C`Ä0b +P?0a A +?A?L#`PBe C Ä0b +P?0a A +?A?L#`PBe CÌQ)#`PBeо CÌ`p 4b +P?0af +٢3DHd@N 0a&`B!"$[ ' +L 0c@D9&Ä`"$> Ì)#`Pn DpY%F +Pw0c@0 Ì+Ft1 | ^ 3c@F`yPgƀ8x%0όyJ|7A0l! W1 ~c ^ M `4A& фA0Fa18l `M `4A& фA0Fa18  faM `4A& фA0Fa18@ jaM `4A& фA0Fa ό+#`( h@ +L#`C)8`L(Й0,L#`*T^0a 6A0aX@g0 3a fA0a v@A0aXAg1@$ȅ1 ~z%`@ +@!na1@$ȅl0F  r& k"gcτ0b H 7?0c@J #q/`Ä0b H 7?0a A16? 8?L#`PDP3y@ A1t?B f?L#`PPC #!/Ä`}0gƀP8x%`τ`}0g1@$1 z%`@ +8lHa1@$x0F 0~af `L1XI$raAf ^ 0? + G2A0c@GJ )Q8ÌѠAo҈ )A8Ä0b I*ԁ+>C.ÌY1K#`PD C 39_hB4 h L 0a Al? r?4b Kp3?0a Aj? d?L#`PD0 D+ +{0 3Dt1K#`PDp 39_hB,&00  2:ÌL1K#`PȄpC 2:pÄ0b KC--BH8Ì!AohBL#`PЄ(33, AAj??~O6|f uA0`"b0A0(lbmw"*A0(lmwA0(lnwA"*A0(lbnw! `@ +p`a1@&x1 1@&x0~0Rv|& >3Al `@ +padaƀ&6Pj@ +hada1@B'0F ЉA7& !>3dR6B|& A0pf ?pbF 艷A;f ?PbF 艸졆Pf ?`bF  졆P& A0(zm{a `@ ja10 +'!1 B 1@'D1 1@'B0F  :& A0(|{a `@ +h0aƀH/i@ +`(a1@'0H0F  Q& A0(|B{A `@ +baƀ0:܀ሤoƀ@*܀$A0(m|A"*A0(n|!p#F  Rf A0(o|a `@ +!`a1@,P0F  S& A0(m| `@ +!`(a1@,hX0F  U& A0(n|! `@ +x!\Haƀ &fj@ +p!\ha1@,0F  & A0(|pa `@ +X!\ a1@,F0F ;& A0(B|@!%A0(m|p"$,A0(bm|0>XF  Q& A0("m|0 `@ +X!J aƀ0ZH1@,ȇF0F ;& A0(m|0!>XF  & A0(m|0! `@ +x!JHaƀ0ZH1@,ȇZ0F 0& A0(m|0>XF 9A<f b 1@,1 BD%tό!"oKBD A0(Bm}aBDXF  Sf b 1@B,n؇J0F  <& A0(Ģv} `@ +a0aƀ0H1@B,nJ0F  <& A0(Ģv} `@ +a0aƀ0H1@B,f؇J0F  <& A0("v} `@ +paaƀ0H1@B,N؇L1 @ çF  aR& A0(Ģt} `@ + a0aƀ`&=|j@ +a(a1@B,D؇0F ~=f 6XçF  ~=f 8Xç#f 98Yaf 3JM̔yA|f @)kA>3(PR|f QblJYp0,3c@(e>gƀ%6P}τ`$B@) 5όWzԈ rqJÌKzԈ rqJÌA}Ո rJÌA}ԕl  A0(nX,3c@rpue4gƀ8>j@ *`ƀ8A0("oXF  ^bWf >Xç D>3AzԈ Tre>eAgƀ1H23aP0F  h_f ?`çF ؋h_& A0(Bo! ``@ pʼn!1 @K10."1 J1@/ l1 `I1@/ l1 @AI1@/R l1 ôF 苽l[f sôF  f tô3c@CiYP0, PaZ1 ЁôF  f tôF  xB^f PPçq3c@)OY0,H3c@>e!F!=|ʾό +|>e b!=|$3c@OY@gƀ@XH38 S1 P!çF h„xf TXçF h „x& A0(Zt0a ``1 H8W%8 A\A0(`#u86SF  y& A0(`t8 7ό"T,6|& @> [pÌa)#`Pl= q[Ä0K@*0Pq1 0Pq $ShaČ")# `Zi0a$Sha„0b Lmi^N@+3{k{KsbK;C + !+{"A c33"!+{j"i{++#;33+"A c33!+{j"!+{j"r)K#B\YX\ّXYPVOPX\ّXY]ݛP L K^Q>}>B[uw#Y>}>buw#9>}>Bsӷ#A>}>b#Q>B>B>B]>Be>Bm>B>B>B븡>Bﴥ>B>B!>B%>BE>BE >R[U#5Λ`@#uN[a@#unf@#uf@#ug@#u[k@#~k@#i@#^i@#n@#5Or@#5r@#5t@#5`#>b緩>b뺭>b뽑>bﶕ>b>b1>b5>bM>bHg|&0ܹ n{g͛pvg|&0 msg&_"1qN#MUD UDdP7E  ,0Q0DEDܷ(,0Q07n EYUqMTD`A@L0BD0BDS 3P?DEo1DDF@D\=؏8,P?DEo1[{xi@[STAT `CDXILBC! : #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L X2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ 5\=sUaBLCU9 QF@010P@  P@ |`@lt`z0@b&1vy7rzy(9 >rzxys`wz`0??@בy#M 9_"1qN#MUD8 +o&g!"v&YArt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y``!@C @2L &GC"J`$ʠ + +0J@ʣT +Y((2("(j +gH rʱxx yLFD oM $Efe%&,f&gl&eCLd@(  l |a%MLl@0 ͆P&u&Vg!pشѕɥ}ՙmHE"! P!+C:3ېPJEPC8' #/3479::32 l@,#A6 ȀYYX\X[<`Cm . B6; mȀ m@1`ʀ"̠r&Ff7A  2 F h͍ɕ}}ѽ}ѕ፽ɑMi@P 60Q7 :world_view_posڀ p@Ł4n@ + `@L`a 6wa&eP=DVfV&'WFŖvF77e m..mPhb 6,DB( @(*zz" › B P +~ +p +C( +f”* +(†ڰP +0% + 6,dP +~ +p +( +RPVpX`2eE&wVF7A( ! ~0 +C( +Z0B-:[\Z 30 qHs /6 јK;#BW&׶&tax|Ƞ +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[Xܔ *хѥMإ%MхѕM K\[ܔṌչѕM yY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f09 ILDN,$6946edd59d6189d151da480053d6d971.pdbHASHiF՝aQHSqDXIL `-DXIL BC! $ #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ 5\=sUaBLCU9 QF@010P@  P@ |`@lt`z0@b&1vy7rzy(9 >rzxys`wz`0??@בy#M 9_"1qN#MUD8 +o&g!"v&YALrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y``!@C @2L &GC"J` J +X< +(B(o"gy@ yLFD oM $Efe%&,f&gl&eCLd@( a0(MfÀ$Lf@8ِ CCC<aaahgC, LgC2- 1 l H&bMhBX A !&dm@!62nP܆ %2292/34/9.SV_Positionb Ԇ 6Ӵa!` Ƞ `0 ЀUӓц` 6SlX53X6`874F 3h 6ӆeR189` 3&! A@tp" LY}QɝM +lBA`@6 w €:؛۝ Z܊`X1 U\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\\2<$)0)W ϥ̍N.-͍nnJyY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f09 a @E,PQDLMCBٕ @q0FPogc  8 `0F c  ( `0F  c 70# ``# `iوA do6b Dbn$ARp# `4p݈A zne0$jrQ# ``A5b FAЁX# ``AA5b ؁`# ``A6b F(Ah# ``BA6b (ȁp#`@hB& |L(3P `#<A +jUBm@ +f&|,@ cg@ WxmF`4AFa4F ::M!Mb18* fa4!F`4aFa@ (_5фMфAM 0 5X X + Xp@,N>#``C)HZ0b : +t, Py X +41 3b ;& X +@б&)}c}0`A0x!3!7@ 4 +vP + + 0  0@ #`А8+-C?,&h& È 4(q  !p `/g@ h_ >&|91X'&Aa@ `8"An0)cA;g8ۘoA.$M>1yA|X0 c>H>|,X0A cǂ@>A|F  J J>#`ELԁ|LP1X.dbqAF  F  cIǂ|F  qc?ǂD>$c | NB>%*E `b@3 *C@7 p @>@` p T '@` t T z2 0b ki^# `Zi0b kiF^# `ZiE1[Vx`ˀDXBC<(sZ=НUL DT BGLGhGSFI0ISG14(SV_VertexIDOSG1htz SV_PositionCOLORTEXCOORDPSV04COLORTEXCOORDVSMainADDB3ILDB,@` DXIL@BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  I`B 2"H d""ㄡL LD#%@`1RsA @19-b9peAXrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GC:EPeP#Q AJ`$ʠ  @3z#GyeLFD mk-Lmm=271 30:Bvector X12@ E c%`0["0V`APelementIؔ}չqHscdVpI&A` @B` aFGCȮlMnj-g4A` "h! "h8! "h3Dz Aq!?<5?0c@D#`PO.?L#`PAO,?L#`PO*?L#`PO)?L#`PO(?L#`PO'?L#`PO%?L# `` 30b L8`[0a$SUM# ``QA 0ehDŽ0b L8a[1a$SNEM# ``MA 0ehDŽ0b L8d[1azF2m&е >RI#}STAT`ADXILBC! 8 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2("( *(2("k9ymLFD oM $Efe%&,f&gl&eCLa0  Pl `@,ˆ0 J3AX Cj),͍˔՗U]^X&! &D3A 5lXi*k d\&3A Mcp}b<COLOR"ڰ bY `a@Pa ==ImkRfY cPl€ `àP"5floats,&CBc.싍\aPXԥmPi7x@*llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77%P.dx.countersS9yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$0251d52f28f0dd3fb26dfbb908bdd61f.pdbHASHQ/(?mDXIL`cDXILtBC! Z #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b((R((B(ڱ@3ySLFD oM $Efe%&,f&gl&eCLa0 a0(McÀ$a6AhXM5q*+K" X6`&ñA @4 1U˔\]ڛh&3A €l(nB`&mFL'' mX/$0a&CBkIh@Q1l`1`Al.36sPͮ%̍nJT!s+K{sM\F2<90272)AR ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma :A, +4P3tc 7F  #c # `Pde9FU0WETz |LXcs$"&$"A$"Ō$"$"Rv$"RAV$"R$"R$"1b HdDXBC;6P9<M DT,B8GlGGSFI0ISG14(SV_VertexIDOSG1htz SV_PositionCOLORTEXCOORDPSV04COLORTEXCOORDVSMainADDB3ILDBL@`DXIL4@BC! + #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  I`B 2"H d""ㄡL LD#%@`1RsA @19-b9peAXrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GC:EPeP#Q AJ`$ʠ  @3z#GymLFD mk-Lmm=271 30:Bvector X12@ E c%`0["0V`APelementIؔ}չqHscdVpI&A` @B` aFGCȮlMnj-g4A` "h! "h8! "h3Dz Aq?<2?0c@D#`PA+?L#`P)?L#`P'?L#`P&?L#`P%?L#`P$?L#`P"?L# `` 30b L8`[0a$SUM# ``QA 0ehDŽ0b L8a[1a$SNEM# ``MA 0ehDŽ0b L8d[1azF2m&е >RI#}STAT`ADXILBC! 8 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2("( *(2("k9ymLFD oM $Efe%&,f&gl&eCLa0  Pl `@,ˆ0 J3AX Cj),͍˔՗U]^X&! &D3A 5lXi*k d\&3A Mcp}b<COLOR"ڰ bY `a@Pa ==ImkRfY cPl€ `àP"5floats,&CBc.싍\aPXԥmPi7x@*llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77%P.dx.countersS9yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$0251d52f28f0dd3fb26dfbb908bdd61f.pdbHASHQ/(?mDXIL`cDXILtBC! Z #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b((R((B(ڱ@3ySLFD oM $Efe%&,f&gl&eCLa0 a0(McÀ$a6AhXM5q*+K" X6`&ñA @4 1U˔\]ڛh&3A €l(nB`&mFL'' mX/$0a&CBkIh@Q1l`1`Al.36sPͮ%̍nJT!s+K{sM\F2<90272)AR ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma :A, +4P3tc 7F  #c # `Pde9FU0WETz |LXcs$"&$"A$"Ō$"$"Rv$"RAV$"R$"R$"1b HdDXBC;Ъ<^iM DT,B8GlGGSFI0ISG14(SV_VertexIDOSG1htz SV_PositionCOLORTEXCOORDPSV04COLORTEXCOORDVSMainADDB3ILDBL@`DXIL4@BC! + #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  I`B 2"H d""ㄡL LD#%@`1RsA @19-b9peAXrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GC:EPeP#Q AJ`$ʠ  @3z#GymLFD mk-Lmm=271 30:Bvector X12@ E c%`0["0V`APelementIؔ}չqHscdVpI&A` @B` aFGCȮlMnj-g4A` "h! "h8! "h3Dz Aq?<2?0c@D#`PA+?L#`P)?L#`P'?L#`P&?L#`P%?L#`P$?L#`P"?L# `` 30b L8`[0a$SUM# ``QA 0ehDŽ0b L8a[1a$SNEM# ``MA 0ehDŽ0b L8d[1azF2m&е >RI#}STAT`ADXILBC! 8 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2("( *(2("k9ymLFD oM $Efe%&,f&gl&eCLa0  Pl `@,ˆ0 J3AX Cj),͍˔՗U]^X&! &D3A 5lXi*k d\&3A Mcp}b<COLOR"ڰ bY `a@Pa ==ImkRfY cPl€ `àP"5floats,&CBc.싍\aPXԥmPi7x@*llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77%P.dx.countersS9yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$0251d52f28f0dd3fb26dfbb908bdd61f.pdbHASHQ/(?mDXIL`cDXILtBC! Z #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b((R((B(ڱ@3ySLFD oM $Efe%&,f&gl&eCLa0 a0(McÀ$a6AhXM5q*+K" X6`&ñA @4 1U˔\]ڛh&3A €l(nB`&mFL'' mX/$0a&CBkIh@Q1l`1`Al.36sPͮ%̍nJT!s+K{sM\F2<90272)AR ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma :A, +4P3tc 7F  #c # `Pde9FU0WETz |LXcs$"&$"A$"Ō$"$"Rv$"RAV$"R$"R$"1b HdDXBC;6P9<M DT,B8GlGGSFI0ISG14(SV_VertexIDOSG1htz SV_PositionCOLORTEXCOORDPSV04COLORTEXCOORDVSMainADDB3ILDBL@`DXIL4@BC! + #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  I`B 2"H d""ㄡL LD#%@`1RsA @19-b9peAXrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GC:EPeP#Q AJ`$ʠ  @3z#GymLFD mk-Lmm=271 30:Bvector X12@ E c%`0["0V`APelementIؔ}չqHscdVpI&A` @B` aFGCȮlMnj-g4A` "h! "h8! "h3Dz Aq?<2?0c@D#`PA+?L#`P)?L#`P'?L#`P&?L#`P%?L#`P$?L#`P"?L# `` 30b L8`[0a$SUM# ``QA 0ehDŽ0b L8a[1a$SNEM# ``MA 0ehDŽ0b L8d[1azF2m&е >RI#}STAT`ADXILBC! 8 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(2("( *(2("k9ymLFD oM $Efe%&,f&gl&eCLa0  Pl `@,ˆ0 J3AX Cj),͍˔՗U]^X&! &D3A 5lXi*k d\&3A Mcp}b<COLOR"ڰ bY `a@Pa ==ImkRfY cPl€ `àP"5floats,&CBc.싍\aPXԥmPi7x@*llvm.identS +]\ڛ۔hBbfW&7%(̡5M Jdx.typeAnnotationsS]Z]]]ٔCRF'F77%P.dx.countersS9yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$0251d52f28f0dd3fb26dfbb908bdd61f.pdbHASHQ/(?mDXIL`cDXILtBC! Z #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@13CC5P :rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y  2L &GC(b((R((B(ڱ@3ySLFD oM $Efe%&,f&gl&eCLa0 a0(McÀ$a6AhXM5q*+K" X6`&ñA @4 1U˔\]ڛh&3A €l(nB`&mFL'' mX/$0a&CBkIh@Q1l`1`Al.36sPͮ%̍nJT!s+K{sM\F2<90272)AR ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma :A, +4P3tc 7F  #c # `Pde9FU0WETz |LXcs$"&$"A$"Ō$"$"Rv$"RAV$"R$"R$"1b HdDXBC!ʛcYeTTS DTDDKKLSFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV0 4 COLORTEXCOORDPSMainDDBDILDBHB`DXIL0BBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L R2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??@Bvivector$CR0`1@P +|`FR0P C,&H2Da +0 = E ``@)SxMª Y@ @ A*)Ã{+[f 2<:2#/(729<:329 &m + +@LʾQɕؕѽ񘱽ѱ,I$`A8,nc&VEW4cCBUGW'W&CdCbW6F&D3mxhA8f\X682)0I0݂~؀fʀ-/B..l\ta*! 3*K{s0A/\@@6 k !h \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBH[YZYYY[ٜ HH[YH[ [HBU]\ \X[]\Y] +LNTX[]]\X\Y]LNBӓPאPQ +\]PY\ +\Y]LJ^[H\\NBNBS\TSXJ]HȔ՗U]^QJ^S\[\HS\] +NB ѓTٝ\]H\ț[ț[\Z[HY]\Y[\ ]ۛH[ +JHL + H LN[\ \]ڛH[ [\ ]ۛ +[ HL + +[ JK HL +  HLN[\ۛH[ [\ ]ۛ H KMNB\][\NB_B[ TYZYSX[ ]ۛ\J^[ \ۛH]ۛ  +]ۛ +HL TYZY \ۛH\ۛK ًY QX[[X\]\ۛNB_BH[Yۛ\XY][] O[ Q[[XSX[ ]ۛ\J^[ HH[ + ]ۛH  M Q[[P]Y[ \ۛH + + + +KMJ +  + + + +HM + + MN \ۛH\ۛY QX[[X\]\ۛNB_[ HZ] ՛[Y[[ ^J^[HHKLN[HK N[HK N[H N[HH N[H N[HHLNB\] + + +J + + +P + + +HQ +  + +J + +P + + +QJ +H H NB_B[ HZ]YSX[ ]ۛ\J^[H\\PZH N[ XHHZ] ՛[Y[J\\PZ +]ۛ\N[ HHN[ Z]X[HH  HZ] ՛[Y[UN[ ۛHX +Z]X[NB\]ۛNB_ YY[ݛ[Y[Q[[XSX[Zș\X[[[ H]J^\]\\J  +HK +H ͌LL + +M Ľ LNB_YY[]  +] \X[ H] +]TX[S]\X[ J] ^ J]]JBHHTWRUՓSQSTYY[ݛ[Y[ۛ\ +HZ]YSXۛ\JH[HTїQSSՓSQSTYY[ݛ[Y[ۛ\ +Q[[XSXۛ\JH[HTїTQRՓSQSTYY[ݛ[Y[ۛ\ +TYZYSXۛ\JH\HYY[ݛ[Y[ۛ\ +ۛ\JHYYHZ \X[X[ۛ[ XJ^\]] \X[] \X [ +  LJ ^NB_[ TSXS\H\] +NȔUY]^ YY[HTӓԗTQHL YY[HTבTPӗRUHLHHTӓԗTQQ[ ܘ\YHH\ ]ۛ ^ + H HN[ X[YR]H[ +  LNHHTבTPӗRUT[ X[YHH\ ]ۛ ^N[ș\XTHHKNZș\XHș\X[[X[Y +ș\XT[ș\X[]\]HHN[ ș\X[HX[Y +K [ JL H LNX[YH[X[Y ș\X[ ^ J H ș\X +ș\X[ + +ș\X[]\]^NX[YR]HX[Y ^H H\ ]ۛ ^NH\Y[ X[YHH\ ]ۛ ^NHYYB[ [[]WX\]ڛ\\XH[ +K K KLMN[ XX[H[[]WX\]ڛ\\Xۜ ^N[X]ݓ\H[[]WX\]ڛ\\XۜNB[ HNHHܘ\Yۜ ^^H \ڙܘ\Yۜ ^^ ^^ +\]\]Jܘ\Yۜ ^^ +H X]ݓ\] ^^ +XX[ ^^NHHH +K +KNBZ \X[H\X[X[ۛJԑ ^ +X[YR] ^^N\X[H\X[X[ۛJԑ +X[YR] ^^N\X[H\X[X[ۛX[YUNH\YZ \X[H\X[X[ۛJ\ ]ۛY Y^H\\țLMHHYY\]ݛ[Y[\X[ +H\\Yܙ ]ȝ\]Ȝܙ HX\]S[Y۔ԑ[YYYB! ZYW[Yۛ\XY][] ˹xyiPxyz˓K;CAKiJ{{3s bcK;C+++#siPxyBK{#+IaK+s+#s#+C+iJaJ+s+AiJJqiPxyBJz"*IzJ"*"Q IRJBz + +ry2jPxy rYJr"b)JB*)‚*yIjbJ*"bIrb"Jr: rjPxyIjbJ*" + +rJ*y21Jr*1z  +Jb +jPxyz*bi*B +r +JbJbyqzrjIr2Jr:*j*rriPxyiPxy!*+c{+#iJsK; CkPxyiPxy C{Q +k+ s #iPxyiPhP ;k  sKs;C!K c+IiPhPI3s#+3zbz +*JbJBbbJjP!+3Ks+zbz +*JbJBbbJjPhPxyiPxy9 +kk  k s#)s{#Ks; s3+1sK{skPxyiPxy :s{K{{c{ +C{;C ccK;Cc{c+#s1zIs s+c:I{C kPxy{c{ +A!+3Ks+#C++ K+{ s# CK+{KsK s# 9 kk  ks9 +kk kPxy k +!+K;s+#{+#+++ c){C+s{k+Ks;1c{ {k ccIs+;+kPxy c+siz++KK{sIq++#+#Is! [+9 #K+s C+Ak s)+Ii{++sKK+kPxy{{s KC! [ c+s a{; KCkK+Iy3+s+#siPxyiPhPxy:I{C {c{ + s#  s3+1sK{sy9 kk  kqAI;q{ +9 kk kPxy+cCKCA +++s!++ +# c{s;KC!Kc ˛sI:IC  ck{ cckPxy+ã++c s#C+s +#{ sa"i{sK{C+a{{[K;Cs:+ã+i+kPxyaKs+ K+#1{C˛K cc{++s#+Ks;c s#C+aKs+ +cq++#{++k)s{#+#kPxyKCC+: k1{!Kc siP0c{ aJs+ z:B1c{ IiPkPyy {Kk +c{CcqyqIiP+s+c+CqaqɑQcqQ{CcqyqIiqIiPkPhP0c{ :zcJs+ C1c{ IiPkPyy {Kk +c{CcqIiP+s+c+Cqayqɑa{CAYqIyqaqIIiPkPhPxyB++1sK{s {K#{CI{)33KK+sc {Kk +:KC s){q)qiP0c{ aJs+ z:2 +C1c{ IiPkP+s+c+CqaqɑQcqQCiqIiqQYqIiPkPhP0c{ :zcJs+ 2 +C1c{ IiPkP+s+c+CqayqɑaiqQiqɹQCiqɑQYqɑIYqIiPkPhP0c{   +:zcJs+ CIs1c{ Iٓ+s:zcJs+ CKkP0c{   +cJs+ z:BIs1c{ Iٓ+saJs+ z:BKkPxyB+y*2+{kk+s#+#1{{s+sC{sysA"sBK9 kk  ki Is+ +{s  kPxy {K +1{K+Ks;Is ! [)sK{sk+ssiP0c{ aJs+ z*A1c{ IiPkP+s+c+CqaqQcqəQ{CcqIiqəIiPkPhP0c{ *ɡzcJs+ C1c{ IiPkP+s+c+Cqayqa{CAYqəIyqəaqyqIIiPkPhPxyBKIC+q+A" s3+1sK{sc c{ cc+#1{++ c sK+siP0c{ aJs+ z*A1c{ aJiPkP1c{ iqyɱqyiP1c{ iqyɱqQiP1c{ qyɱqiP1c{ qyɱqQiP1c{ ɑqyɱqQiP1c{ a{CabiIiP+s{CAYQaKyAYQaKaiIiPkPhP0c{ *zcJs+ C1c{ qJiPkP1c{ iqyɱqyiP1c{ iqyɱqQiP1c{ qyɱqiP1c{ qyɱqQiP1c{ ɑqyɱqQiP1c{ q{CqbyiIiP+s{Ci CqiaIyAiQqKayiIiPkPhPxyiPxyzc{ +{s+K{skPxyiPxyB++ k+aKs+ Aq{9 kk k)s{#+#K c+s {c{ +{s+K{sI C s;+kPxyy3 KAaK[+IsaJs+  b;+ KqJs+ {c{ +I!+3Ks+#C+++{kiiPxyC+ K+{kiC s;Ks; +Is{c+ i Kk+{icKcK K{ssqz+C kPxyC s;Ks;C+{c{ +i +cIs{c{C  +yy3{s#+ +{k+kPxy{c{ +A +a ;+9 kC syC+sB+s{s+Ks;{k+{c{1{k K#+kPxy9 k{k cc9 kcq+; K+ c+i +ccCKC +Is+Ã+Kc+IsC q+kPxy{c{ +siPxyiPxyI{c#+I#+ c{Kc# {c{K+cKs+CKCq++C{ Is+Ã+Kc+AkPxy++K c+K{c{sBKi+ sKs; {c{ +C I K#+ {Kc+sB+kPxy{c{ +IC+q+ cc cck)s{k Ks;{c{ +cIA C+s3{s +kPxy{+y3A Ks;q+; K+ c+A+K3K ccIs s#Jqz{+CKc 1C+kPxy s3{k K{s s+i #+{ s#{i [+C+k c ˛{KK+sB+ sA +C+KkPxy+KK{sq++#+#+#!KK#Ks;b cc{Ks; s#{+ [+#Is{{rzj™siPxyBK{c{ +I cc+#ɪ1{a [y3 ++q k+siPxyiPhPxyqz+*s s#:C +C+ k+{c{Kk K+ s#CK+{KssB+Kysc!K33++s+kPxyIC+ s3+++#siPhP0c{ *ɡ{*A1c{ :IiPkP{s1c{ zsk +iPkPqaqɑɑaqaiPqɁɩaqɉɩaqaiPqɡaqaqɩiPiP+sicCzsk +c:IiPkPhP0c{ *{*A1c{ :IiPkP{s1c{ zsk +iPkPqɱaiqaiqaiPiqaqɩaiqaiPiqaiqɹaqiPiP+sicCzsk +c:IiPkPhP0c{ *ɡ{#JA1c{ :IiPkP{s1c{ zsk +iPkPqaqaqaiPqəaqɱaqaiPqaqaqɉiPiP+sicCzsk +c:IiPkPhP0c{ !J{*A1c{ :IiPkP{s1c{ zsk +iPkPqɡaiqɡaqaiPiqaqaqaiPiqɱaiqaqɉiPiP+sicCzsk +c:IiPkPhP)s#K3yyzbz +*JbJBbbJ C9sC #+Jsc#+JszsAccK\// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct VsInput +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; +}; + +struct VsVFXOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; + int frameID : TEXCOORD1; +}; + +struct VsInputLit +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 tangent : TANGENT; +}; + +struct VsOutputLit +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; +}; + +struct VsOutputLitForward +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; + float3 worldPos : TEXCOORD1; + float4 color : COLOR; +}; + +struct VsInputZPrepass +{ + float3 position : POSITION; +}; + +struct VsInputZPrepassSkinned +{ + float3 position : POSITION; + float4 boneWeights : BLENDWEIGHT; + uint4 boneIndices : BLENDINDICES; +}; + +struct VsOutputGBuff +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float3 tangent : TANGENT; + float2 texCoord : TEXCOORD; + float3 p2e : TEXCOORD1; +}; + +struct VsOutputZPrepass +{ + float4 position : SV_Position; + nointerpolation uint4 uid : TEXCOORD0; +}; + +struct VsOutputResolve +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; +s@SX]\\X[X[P\ WY[؛\WY[\YW[Y[XZYZYYY[ٜ :xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPhP ;k ys+kPhPxQiPq k+ +q kPkPq k+ ++s+kPkPyy!{s;i [+q++#q k+ +Aq љ+s+KKs+CK1Kc+I+#C #+{kKc+kPkPkPPyiPhPxyzkk{sAZY s#AbbJc{iPhP!+3Ks+*2 +*zriP!+3Ks+*r*j +bzZJ*iP!+3Ks+*j +*r2 +*J*iP!+3Ks+I +"J +r*j +2 +*J*iP!+3Ks+*2b*Jzrj +2 +*J*iP!+3Ks+*2b*Jzrj +jJzriPhP!+3Ks+q +j +ZJrrJr:zr*zriPhP!+3Ks+B +"Jr:rzj +biP!+3Ks+B +"Jr:*jJJ*iP!+3Ks+i +*jJJzrq1kPhP!+3Ks+9bz +b22**2J9jP!+3Ks+ʚ*j22**2JjPhPI3#+3cckPhPxyZYyscc{iPhP!+3Ks+Jr:J2JjbBKkP!+3Ks+Jr:J2BKJr:J2JjbBKiPhPp k+ +q љC #+"+3Ks+kPkP{s+Ã) cљKs;K+9b{ c33++3KJr:J2B9bz +b22**2JJiP{s+Ã) cљKs;K+ʛ+k33++3KJr:J2Bʚ*j22**2JJiPhPIscKs+{{cI;b{ c33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCC9b{ c33++3KKiPkPhPIscKs+{{cIʛ+k33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCCʛ+k33++3KKiPkPkPhP)c+yycckPhPxyAbbzscc{iPhP!+3Ks+zr +B+3Kcq k+K+3Kq k+kP!+3Ks+zr +B+3Kcq k+Kzr +B+3Kcq k+KiPhP!+3Ks+9bz +b22*Bq k+K33+zr +B9bz +b22**2Jbq k+KiP!+3Ks+ʚ*j22*Bq k+K33+zr +Bʚ*j22**2Jbq k+KiPhP)s#K3yycc :l +-EZh}|PhI3FV&76VGVF[ yq +{{˃+{ kc+{+s+ ++{qqyqqy)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆwxxz{ Y6 >P ͆!&5A@ B>Ć$@!a A$6#1A2FGB_PropertyBuffer|( ȇ|  H>-C>C>@+1A l0aD!\"$6Kl%`bÐ! >LL`)/47 BMiCd $Ԇ%n'rB'vv"x`1$5AH >NN>>@kIh +aY ЉX COX0 +;+ $6p|( 0 |؉| ņ,PA,=L@nl\H* o'0`WG7.BB9u ' @O0 k+ bv!؃): P/llvm.dbg.cuS]pfFVVbv67E_fFVF7%Kdx.source.contentsSq(tXGdx.source.definesS[XK[XQ[SX[ٔ̽ɍɝM +]\ڛ۔ ؅ٕM ZY\Y۔̐ȕͽɍM V ]\Y]]ڛ&f]Z]]]ٔ&ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK,DITmpK(5=mβT?_ Ea A,D5@I R +%7P|eG 0# &L6 m0A8# `p!m[2c@ +m1b W)A \bL]L# `W!3-`v A?8?0c@— +m1b  +|L2c@f j0ãC j ã j03,|#`PO?L#`ARB``1c@ +m1hL 0a A?L?0c@b n@Ôþ n0Ô Pjd0c@chBL0L(3aPg1H&4H0f |(1H&4HK0F * & A0`J4a  3m263m(i0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/O#! ۨ " 7ISD ̳;B<rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0P EPPPeB$ʠF@(=@}XB<yLFD oM $Efe%&,f&gl&eCLc@  l d3/2 Le@4BYb`gCL6ё\]PYX6 D$0je,6 u@lU6A."exposure :k6ӷa 60 `@l`0AL0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/O#! ۨ " 7ISD ̳;B<rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0PP%QePTJ +a + 3byyhLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!Le@,ِ CCC<hYـCl Bwm@!6"*lam 4ܸLY}AͥѥMgP@bPDBڰa czbz ӆe(o 1 BU5$E4A BAo 3h@ 6 dpkd*LnPP lX6 `b `C6`CusU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\X2<$)0)V ϥ̍N.-͍nnJ0yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,DITmpK(5= a 5A,$GR(+;#3# `0umɈA L1q2b ӇD]$AMȈA eq<ACIAa(hB&h tA `A! +Pg @ 7 a @ 7 ,a @ 7 ` @ 7 `@DXBCS"_JRs9t\ DTDLTPTlTSFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV0 4 COLORTEXCOORDPSMainDDBDILDBJ`DXILJBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L S2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??@BviUo5ZsyoAt֜oAf o +byHkATAPA 8/s8yBL d!Q{3C #+sAcc4@ oM $Efe%&,f&gl&e@Ì-]ݛ[ <float{ 0b4h 0 1@0[M#0Z` +n4h 8 BaG[Y[ݲ6element_countT`qPֵAI  @,b@6 47z./shaders/include\in_out.hlsliX={KK{s[M|l {c{[|l  Dh+{1c{ cY!0nE` 0 ALgZeabI (,3 E ДlĀ `L`-*`qA`s0AU t` tu682779B\X[X[ۛPVO]ݛ Z ]ݛP L  06>vector$CR0`1@P +|`FR0P C,&4Da +0 = E ``@)SxMª Y@ @`S6&GWFF5rC +#k +Ks + !+{j"ҢaF7CȮlMnj-dg4P EYH `1@0 ( ^6(LZp`X 0 hajUXlUѕP ~d~~H䀚H`dbVM -"RtH\\"0`ɕ }Aɽ ՙ4 m[v_^`b&VEWG NLǮlMnj-gHچ@&A`@8t3/2< 2<:2" 179& m PA@,LMхѕM  34S5V&7EFWmA@` v ]U\ڛۆa DT&VwfbU&7aXx @[^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@D\DF@Dܾ\Dd@ʾ@t@P`Rv@@t@P`RvPR@t@P`R@@@@@vv@P@@t@R@@@@@@z@PR`v@@@@^^t@@@@@@@@@@@@\@z@dPP@xx@bR@L@dX@@L@dRv@@@@\@z@hP\@T@dPdX@ZdR@V@dPZbX@bRX@`X@bRv@@@@\@z@hP\X@bX@`\jRv@@@@@vf@ȚPf@R@@@@f@@z@@^@P@V@bRv@@^^@@@@@^^@@z@PXb\`^d\dRv@^^@@@@@@vF@xʪ\|f@ƚPf@R@@@@f@@z@P`X@@Z@`\``hRv@@^^@@@@@@f@@z@P@T@Pl\d@T@@V@\jRR@^@P@T@Pl\d@T@@V@b\nR@V@`\`lRv@@@@^^@@z@PXd\dRv@^^@@@@@@vf@dPf@R@@@@@@z@`\bjv@@@@@@z@`\j`v@@@@@@z@`\b`v@@@@@@z@`\d`v@@@@@@z@`\`dv@@@@@@z@`\f`v@@@@@@z@bb\dv@@@@@PP@T@P@T@@V@@T@R@V@@T@R@^@P@T@P@T@@V@R@V@@T@RR@Z@@^@vf@ȚPf@R@@@@@ʄ@z@d\`v@@@@f@@z@dPʄ@T@Rv@@@@f@@z@jv@@@@f@ʦ@z@b\`@^@dPRv@@@@f@@z@@T@ʦv@@@@@v^^@F@@ƚ@܌ڪPd@R@@@@@PP\@V@\@T@jhf\fbR@T@hrf`bf\`RvF@dPX@X@R@\ʘPX@PR\X@PR\RF@F@PR@@ȚPRF@F@PR@@ƚPRF@F@PR@@ȚPRF@F@PR@PRF@@@@f@ʦʆPd@R@@@@@dPʾX@X@hPX@`X@`RR\vh@P@R@t@@@@^^@F@@b^^@F@@bF@@@@@d@ܠ@z@\\@T@d@Z@bv@@@@d@ʪ@z@dP`\`X@`\`Rv@@@@F@@@@@d@ʪ@z@\\v@@@@@ܤڌ@z@b\bv@@@@@@z@܌ڪPʪ@V@ܤڌRv@@@@@ܒ@z@bv@@@@d@ܪ@z@ʪ@V@`\j@^@dPbrd`X@b`p`Rv@@@@ʪ@z@PʪX@ܪ\X@Pb\`@Z@@T@R@T@ܒRv@@@@ʪ@z@ʪ\@Z@\\v@@@@F@@@@d@ʪ@z@\\v@@@@F@@@@f@ƾܾ@z@fP`\bX@`\bX@`\bjRv@@@@d@¦@z@ƾܾ\v@@@@@¦@z@ƾܾ\v@@@@h@줎v@@@@줎@z@ܠ\@Z@Pܠ\R\@T@PPܠ\R@Z@¦R\@T@¦\v@@@@줎@z@줎@T@`\j@V@`\jv@@@@f@@z@ʦʆP줎\@V@ʪ\Rv@@@@\@z@ʦʆP줎\@V@ʪ\R\v@@@@\@z@ʦʆPʪR\vF@@@@f@@z@ʦʆP\Rv@@^^@@@@`\djBF@@@@@P@T@R\v@@^^@@@@X@@ʘަ@@6< \ʸʪ\XK \\X +HSژܛ H\\\]K ZYH[X\HYZHSSX\JSUK RQHԓUQJHҔ +USUTUȓQ HSR HQRHTȓHRSR HSQHSV HRSRUTURȓQSѓHTUPST TT HSRUPSU ȓӓSKTQQSKK Q]\XHS[ڙ\ZK HPڛRX[][HKB\Y[][ +Y\[LM HJBHYӓTPWUSUSWYY[ӓTPWUSUSWBK QX[[\XHHY\ۜYY]ڛ\K HЙ]ۛ\X[H\][][[[ ћH]X ȜԑHHX ۛ\X +YY[X\YX\]ݛHHZ][] +HHYX[[\X QX[[X \XH\Y\ڙ[\YX\X]]HܛZ[\\[\[H]Y\ ][]ٜ Hӛ\\X\ڛH[YYHYZș\YZHZZ][HY^HHۛ\\\]]Y ؛\]Y][]ٜ HY\Z[X]Hț]H\KKB ȜԑHHۛ\XHH\ۜYY]ڛțYX[[\X JH\]YX[[X X] ZZ]XYY\X]Hۛ]ȐY[XޜK +ȜԑHZH[HX ]]\H\ HZ\\HHۛ[ݛZY\ Ȝԑ]]\H[XY [[Y\^ٛZ\X[؛\\Y\ HZ[[Y\\[YX\YKYY ]ZȜԑ\XٛY[XK[ S[Y۔ԑ +[ HJ^ H^Z[][ + H LJ\]\[ + L  HK + H LM + + H M +H  LMMNB_B[ ȔԑS[Y +[ HJ^ H^Z[][ + LJ\]\[ + M  HK  + + + LMM + H LM MJNB_B Z\Y]ڛH[J +HYXZ[H^Z[]Ȝԑ]HHܛ MK[ S[Y۔ԑЗQ +[ HJ^\]\[ + L  HK + HK L +\ +H  N +H K  + + LMLNNB_B[ ȔԑS[YܗQ +[ HJ^\]\[ + M  HK Hˍ ͌ L +H L L +\J KM + +HMN M + +L MNB_B[ HX\]ٔԑS[YJ[ H +Ȟ\]ȔԑS[Y +^N_[ HX\]S[Y۔ԑJ[ H +Ȟ\]S[Y۔ԑ +^N_ ZS\[[[Yٛ؛]۝ț՜ ZYX[[\XH[XHۘ\Y\؛\H\ H\Z]ٛ]Z]HHYH]ܛ[[K[ S[Y՛T L +[ HJ^\]\[ + L N K + H LN + +  MM +H  LNLNB_B[ T LS[Y +[ HJ^\]\[ + N M  K  + + + LNL + H LN H  MMJNB_B ZHZ[\ۜYY]ڛ HX[Tٛ\X]]H\]]^K[ S[Y՛Tѐ  [ SJ^[H[ HM  L N[H HĽ  L +H N[X H  L N[Ș H M̌  L +ȌN[ HL  L +ȌN[ H + H[LN\] +X +Ș +\ + J + +\ + HLNB_B[ Tѐ  S[Y[ SJ^[H[ HM  L N[H HĽ  L +H N[X H  L N[Ș H M̌  L +ȌN[ HL  L +ȌN[ H H HLN\]J[H X L + ʘ H +\ + H H[LNB_BK ۛ\X؛]\ڛ\K Z\H\][[[YYX[[XKYY +][]ٜ Hۛ\X؛]\ڛHHZYY țX\ +[ZHS[YHY\X TXHۛ\XHYY[X\Y]ݛ\KK ZX\]ݛ\KZY\XH]HH[\^]ݛH[][X]ڛ ]Z] ZYZۛ\XH[X\\HۛZH\[ț[ٜXXX\[[Y ۛ\XZ][YYX[ZZܜ Z؛]][[ۛ[H]YY YX[\[YX[ [Y]]][]H[X\\ ZH\H[\\[HZ[] ۛ\XKK H[XHYYX]Hۛ\\[[Z[]H]XH[\\[X] \XY][Y +ۛܜ ZH[YH\Hۛ\XZHH]YH\[ ZY Vۛ\XHZ[Y\ H[\\ۛ\X XHZZHٛ][]Y \]țZ][Y]]][]\XYX[HHV ؛\Z HYZ\ \ۜٛ\[]ڛXXH[YHH[ZZYH]X\]] ZYXZ]ZY\ \X\ڛ\YXXY]YXH H]HX\ZHHӓTΜK Zۛ\XHX[HVٛ[țHX][X[KKB ]T٘ LHȜԑZ\Z\X[ۛ\Z[\ZHZ][ ZYț[YY\XY HZ\ۜYX]H\KB[ T LݛTѐ +[ ԑ LHJ^؛[ Л]SHO^ ˌLL  K MLN KNLN  LĽ K LL     NNM NHN\]H[Л]S ԑ LNNB_B[ Tѐ ݛT L[ ԑ LJ^؛[ Л]SHO^H M H K ΍M H ̍  KH K M HǨ NN H KH L NL H K LM HKL MMLHN\]H[Л]S ԑ LNB_B[ T LP +[ ԑ LHJ^؛[ Л]SHO^ M  KM  K LL K   K L N  ̍ M KN L LMHN\]H[Л]S ԑ LNNB_B[ P ݛT L +[ ԑ LHJ^؛[ Л]SHO^H M H M  KH L H L  KH LL M H MM H LLNLHN\]H[Л]S ԑ LNNB_BHY ӓTPWUSUS쁞 ZYW[YW[ [:xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPKrkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iPiPhP{kPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPiPhP2zkPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPIs1 k+K"*zz"iPiPhPKrcJkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJkPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJ3z #kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riP1c{ {c#z*zz"iP1c{ {c{zbziPiPhPKrӂ+ kPkP1c{ {KK{szJJzriPiPhPKrӂ+ ZKss+#kPkP1c{ {KK{szJJzriP1c{ {s+*K;Cb*r"*J:BiPKs{s+Kr#K+b*r"Jr"J*iPiPhP{;33kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{  s;+s +r:*riP1c{ +z{#*zz"iP1c{ )*zz"iPiPhP{ӂ+ kPkP1c{ {KK{szKK{siPq{Ks+{c K{sKsK#*zz"iPiPhP{*{c+kPkP1c{ {KK{szKK{siP1c{ +z{#*zz"iPiP C>tʸʄʸ\\\\ʸʸʸ\ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBB\Y[țXYB‹J[X[\X[X]^[X[\XX[Y^ ٛ H[Z[][X[\X[XX[Y +\XZY[HH\XZY[\[\H_B_KB [[ۛ +HS +ؚKBYY[PPїQPSMYY[WPPQSԗTVNYY[PPQSW՗QPTVH MYY[HTQRPWSԗQPTVH NYY[TSUғWSԗQPTVHMLYY[TSUғWSWSSH LBYY[SPWSRSїГSSH NBYY[RQїӓTSLYY[RQWQSTULYY[HSWQSTғ YBYY[ӓPӗPQTQȑWYY[TUQӗPQTQȔWBHY[[\B +ț[ؚKBYY[TQQWR +^ +^YY[TQQ +^ +TQQWR +^JB[X[\X[XZYYY[\^؛]HY\ٗ]ZۛXPY\YHTQQӓPӗPQTQVN؛]HY\ٗ]ZT]YPY\YHTQQTUQӗPQTQVNBH[[HۛXPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]ۛXPY\Y^NH_BH[[HT]YPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]T]YPY\Y^NH_B_BH\ [[\B ӛ[ؚKBYY[ГP +\Y [X[Y +\YȈ[X[YYY[ГP +\Y [X[Y +ГP +\Y [X[YJBYY[ӓPאPQ[X[Y +ȘXYГPӓPӗPQTQ [X[YJYY[TUQאPQ[X[Y +ȘXYГPTUQӗPQTQ [X[YJBHY [[aWTWRUՓSQSTŎ6" +-T4l`(QhI3FV&76VGVF[ yq +{{˃+{ kc+{+s+ ++{qqyqqy)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ&$: 08 H 6,d KP Ԇ!&d%&7A@ BKĆ%hZ%Xb Z&671Aё\]PY%rB'Z%X6;1A0؀DOCKK! N< C&xAZB,jbpņ%‚,6 -A0D! `C\& 3AH AKLe$X h x x ӓ!A6,,!ln1,,"') (†e --%b .6 qAwd*Ln ^lXZ"/B/.X-Z.bC `CQ_0Qq " ,A#E\ݸ;(  @O#0XG=`L.l\`'@ Е ɍK ё)ƒ{+J  r !A`\.BLkLAи]  q "B$0A84CDt77H`pd %xoKх  q10 !A$%zz@ 0A1`p5.@CZ[x ;40q "K1 ] ؙXݔٵձMٵM [X؛]b![X YY[ܔl̽ɍ9M [XKܔ@%ؕͥM Z ]]ܔ%̡5M d \[Xܔ',хѥM,إ%MхѕM K\[ܔ/yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK,DITmpK(5=mβT?_ Ea A,D5@I Rv7Pr@ A0Fz{cLx7FКsN{0&L= {0A8`p  +C&(LR 0A8|ap C# `pAb ΌA L*ƈA \o3a$@A (uhPn0b 0PÌ! _*ƈA (vi`3c@f xEü xpE xu3,|#`PԽ?L#`TB,gp3c@ +1hL 0a A?`?0c@b |6C |6 PxPk0c@chBL0L(3aPg1@"Xaƀ^c@ PXA `@ PP `@ P"[x @>3- f 3τ0b )?0c@ABm AA +??L#`P`  0Ì.ƈ 0Ì.ƈ 0Ì.ƈ p0Ì.ƈ @0Ì.ƈ 0Ì.Ԇn *] 3@>p  +>3dP6X0l3aؐgƀHjÆD> |& 8t P6t0l3ac1 t6L|& $tP6H0l3a`1 t6l8L6|& ctP 03a1 t6lpL6|& A0(~=B[xA0(~a= `@ _aa1@؃z\1 1@؃\1 t=F  f 6Xt=F f 6Xt=F `f 7Xt=F f 7Xt=F f 8Xt=F ~@f 8Xt=F y f >`n5l}k 0lL#`P~03D0#`Pø~0  Ä0b  8A,Ă. 3>v$w „0b  8A,.A 0p 0L8a@3mBе->B״9>B׷E>B׽Q>B۶]>B۹i>Bۼu>Bߵ>B߸>BD#1>R׵=>R׸ >R&UHmVUHm߆UHmUHmUH}VH}fDH[#5oAT]U]6UmfUmUmFD}W#MW#}X##nJؽdфmTQ/TQPE0??DEoVH,0BDSTAT$`DXIL BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L N2"H d""ㄡL L|#%f`) BR˟VbFc* ?a!! UEc BȠvpmT_6"0Bp (#Is `fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/O#! ۨ " 7ISD ̳;B<rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0P EPPPThTJ +a + 3gȏ(yLFD oM $Efe%&,f&gl&eCLc@  l d3/2 Le@4BYb`gCLё\]PYX6 D$0ji,6 u@lU6A0"exposure :k6ӷa 60 `@l`0ALmCp4ܸLY}AͥѥMhPHbPLڰjln0'' BQmX8X7h9`xUӓ6,  rAl`ɔUY&A`BA6 wB 4[xXM\9:"tex_normPQR`Ja2 +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[Xܔ DBWFF67E2CbVvD6EFW6%8:dx.entryPointsS?B2VFW&77%0yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,DITmpK(5= ILDN,$099bafbf2ec99377ad3d2950b0bfd458.pdbHASH .ɓw=)PXDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L N2"H d""ㄡL L|#%f`) BR˟VbFc* ?a!! UEc BȠvpmT_6"0Bp (#Is `fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/O#! ۨ " 7ISD ̳;B<rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0PP%QePTJ +a + 3byyhLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!Le@,ِ CCC<hYـCl Bwm@!6"*lam 4ܸLY}AͥѥMgP@bPDBڰa czbz ӆe(o 1 BU5$E4A BAo 3h@ 6 dpkd*LnPP lX6 `b `C6`CusU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\X2<$)0)V ϥ̍N.-͍nnJ0yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,DITmpK(5= a dA,$G++ci700FbL ;&ލΚs `# `0D# `0AH# `0AL# ``AlЈA m dpT4b  L!h 5 0  0bp `&|L(cC!džH>fL1|lc2ؐdžD>6$ |l#1f c I>6HA i>6|c@c!c; w @># `܂Ȃ,0b -,# `܂Ȃ,B0b -,B* DXBC.xTߞdX DTDHPPPlPSFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV0 4 COLORTEXCOORDPSMainDDBDILDB|F`DXILdFBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L T2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXvector$CR0`1@P +|`FR0P C,&2Da +0 = E ``@)SxMª Y@ @b֖631JckKk +Ks + !+{j"ҢaF7CȮlMnj-dg4P EYH `1@0 ( ^6(LZp`X 0 hajUXa l6 v +@ mNl@0 ~ʀ䀀f-:..01 k++#GUGW'W&CcW6F&cFBl$mC @ A\X[]Ќ U]\ ]ݛP PжP^ sampld&AT`@P kc +kc+ + +ڶ@ aq@QO@@@p.L ĪLn.mðpQ"*;Ir3{*K{s0A;†`-// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "in_out.hlsli" + +Texture2D frame_tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(PropertyBuffer) : register(b0) +{ + float exposure; +}; + +VsOutput VSMain(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + //TODO: Rewrite to use only one triangle in future + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + output.color = float4(output.texCoord, 1, 0.5); + + return output; +} + +float3 ReinhardMain(float3 texColor) +{ + float3 retColor = texColor / (texColor + 1); // Reinhard + // retColor = pow(retColor,1.0f/2.2f); // Gamma + return retColor; +} + +#include +float3 FilmicMain(float3 texColor) +{ + float3 x = max(0, texColor - 0.004); // Filmic Curve + float3 retColor = (x * (6.2 * x + .5)) / (x * (6.2 * x + 1.7) + 0.06); + // retColor = pow(retColor,2.2f); // Gamma + return retColor; +} +float3 Uncharted2Tonemap(float3 x) +{ + float A = 0.15; + float B = 0.50; + float C = 0.10; + float D = 0.20; + float E = 0.02; + float F = 0.30; + float W = 11.2; + + return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F; +} + +float3 UnchartedMain(float3 texColor) +{ + float ExposureBias = 2.0f; + float3 curr = Uncharted2Tonemap(ExposureBias * texColor); + float3 W = 5; + float3 whiteScale = 1.0f / Uncharted2Tonemap(W); + float3 color = curr * whiteScale; + + return color; +} +// #define tonemap FilmicMain +half grainFromUV(float2 uv) +{ + return frac(sin(uv.x + uv.y * 543.31) * 493013.0); +} +#define tex2Dlod(tex, sampler, uv) tex.SampleLevel(sampler, (uv).xy, (uv).w) + +#if USE_UNCHARTED_TONEMAP +#define tonemap(color) UnchartedMain(color) +#elif USE_FILMIC_TONEMAP +#define tonemap(color) FilmicMain(color) +#elif USE_REINHARD_TONEMAP +#define tonemap(color) ReinhardMain(color) +#else +#define tonemap(color) (color) +#endif + +half3 sampleSceneColor(float2 tc) +{ + return tex2Dlod(frame_tex, sampl, float4(tc, 0, 0)).xyz; +} +float4 PSMain(VsOutput input) : + SV_Target +{ +// #define USE_COLOR_FRINGE 1 +// #define USE_GRAIN_JITTER 1 +#if USE_COLOR_FRINGE + float2 screenPos = input.texCoord.xy * 2 - 1; + float2 sceneUVJitter = float2(0.0, 0.0); + #if USE_GRAIN_JITTER + float2 sceneUV = input.texCoord.xy; + float grainRandomFull = 1.1; + half grain = grainFromUV(sceneUV + grainRandomFull); + float grainIntensity = 1; + float2 grainUV = sceneUV + 0.5 / float2(1920, 1080); + sceneUV = lerp(sceneUV, grainUV.xy, (1.0 - grain * grain) * grainIntensity); + sceneUVJitter = sceneUV.xy - input.texCoord.xy; + #else + float2 sceneUV = input.texCoord.xy; + #endif + + float3 chromatic_aberration_params = float3(0.1, 0.1, 0.15); + float2 caScale = chromatic_aberration_params.xy; + float caStartOffset = chromatic_aberration_params.z; + + float4 uvRG; + uvRG = screenPos.xyxy - sign(screenPos.xy).xyxy * saturate(abs(screenPos.xy) - caStartOffset).xyxy * caScale.xxyy; + uvRG = uvRG * 0.5 + 0.5; + + half3 frame = sampleSceneColor(uvRG.xy + sceneUVJitter.xy); + frame.g = sampleSceneColor(uvRG.zw + sceneUVJitter.xy).g; + frame.b = sampleSceneColor(sceneUV).b; +#else + half3 frame = sampleSceneColor(input.texCoord); // fixed exposure of 0.25! +#endif + return tonemap(frame * exposure).rgbr; // we write to srgb, so accurateLinearToSRGB not needed +}.\shaders\include\ColorSpaceUtility.hlsl,Ad .O. e,)mLm͌$ D. nDlLή̥A +-md썬 $m-mm ΍L ) +)mm )*ťA +)i +d艨$i +J*D%h +$iJ* +驊 +*HJ*ȉ* ɨA$) d)ɉ( +H + Jhj +I +$ )$i($)A$ )*HJ*ȉ*h +(ʩhj +I +$*H*i)HAJ +iHj)ȉ*H()*I +ɩ%H*騨ȉʥAA̮ D,)-L. AA$MND)ld.-L AAAaN.- .L- ,m.L Dd&$AAa$̍ kIk +*h諊*)* i)Aa,ͭ kIk +*h諊*)* i)AAA(- D. n$̍ m, N.mάLĬm.mAA$m.m dMd.l  n.-. -dM$m.mdNH$mD $AdMd.l ,ͭ D,M D,l.mĮlMn$̍ $ - -͍.$̍ $ ,- D. (-AD. n$L l.̭ Dn Ln . LNM d Nln. Č-n d- $͍LA.lM Nl,m. $mĭ $ ,LnLL.,̍n$l - , $mM dm..ͮA d͍N.l. ,Ln .l$,L.-m dNή $m͌ n̥AAAdNH$mD $ dMd.l $̍ $ N.mάLĬm. MD,- D. N%d$ N ,-AdNή-m -̮ D Nl, $ . dH +,m-,o%dNH$m-$m$ D nA Nln$̍  .ln $ i-M,m D. dNH NlnDA-ͭ,L.M M-o.m,-dMNlD̍L.$̍  -ͭ,LDlnĭ D Dm썬A.  dNHD. M,m-,ϥA-n)ͭ,LmJHČ-n$AaA$N /--$DE&ADN dlf&f$F%GD$D$Dƅ&&eAAA-ndJH)ͭ,LČ-n$AaA$N /--DE&ADN dl$F%Gd&$Dƅ&%eAAA +l Ĭm.m$- % ,m,̍-$ N /- dNH. $ LNMƅĥA-n)ͭ,LmJH(lČ-n$AaADN dlf&f$F%GD$%fDd.NFF'%fDd&&'eAAA-ndJH)ͭ,L(lČ-n$AaADN dl$F%GƅfDd&EF&Dd.Nƥf&GDd$E&'G&ddedž&eAAA-n$llN.lJH)ͭ,L% Č-n$dON dJH)ͭ,L/eA-n$llN.)ͭ,LmJH% Č-n$dON )ͭ,LmJH/eA + 䩈Dl쭭̍ Md͍̍d j +-mD,- D. N-,$mL,l d͍N.l$lA$ N N.- M.. $ $ ,Ln .Mͭ̍ΥA-n)ͭ,LMh&Č-n$AaADN dl&'ƥD$&'gDƅ&&'g&eAAA-nDh&)ͭ,LČ-n$AaADN dl'ƥd&'g&$&'g$ƅ&%eAAA +-m$m ĭH +N.mάLĬm.͍$m d, D*JMLn . $.̍.MLΥA-n)ͭ,LMhHŌ-n)AaAČ--D&&fAČ-MDFf&D$FgAČ-d,dF&fAČ-dLD&f&DdFfAČ-dlDf&G&DdFfAČ-n -&eADN e,ddLD .%ddlD .M&eAAA-nDhH)ͭ,LŌ-n)AaAČ--D&&fAČ-MDFf&D$FgAČ-d,dF&fAČ-dLD&f&DdFfAČ-dlDf&G&DdFfAČ-n ʼn$M&eADN -  d,&eLdlD .$-&eAAAAdMd.l dͮLn.mAA +l $ln -ͭ,L,-m썬,.l$dMd.l dͮLn. $m$ d -A D,l.m-m $ )ͭ,L$LL.,d*m $ dMd.l $m,ͭ D,M ĮlMnA D,l.mĮlMne -, d.l $ͮl$ -N. ŮlM. -m,.鍮 -Ad -,  dMd.l -,Dl$ dMn-$L D䭎 D΍lNDl,n dAdMd.ll-̮ -LL,n- Ln + dͮL. d dMnL $ .A, d- ,ĭ,.ͮ .l-,Dl-m $L $ͭ Nln.M $ -ĭAdMd.l̥AA$ D $, D. $ dM. -ͭ -m ĭ̮LMn$.,$ͭ Nln.M EALn,.L,dMn +-m,mn. $ dMd.l -$m$l. $lmn.M +A+K dMd.l $m ĭN.$m .ln. dMd.lD$-l M-AN L. -. ĭ,.ͮ .lel,,m,-$  $̍ D+ dMNl-m$ ĬNLAN.mM-. d, D -  $̍ D -l  $.,om..ͮ +,d, -̮ ,MANl,m. ĭlDn D,,., D,$$.  $̍ D D .ll $͍ I gΥA +-mdMd.l $md, $ +M-ll $ DL-̥AAA鍮LDl&$̍ dNHd-L  d. dMN.-L.l$̍ - -͍ +,M͍-,̬LmA$m N.mάLdNή n̥AA-nDh&MhHFČ-nDH&$AaAdmČ-nodͮ)AdAFFeF&G&GffƆA&&%'&&&fA&f&F'AoADN eͮ)DH&'eAAA-nDhHFMh&Ō-nDHHF&AaAdmČ-nodͮ)AdA$&džƥƦƆFA%F$%fF'gA&'%&$%&&AoADN eͮ)DHHF&eAAA-nDh&h( jČ-nDH&$AaAdmČ-nodͮ)AdAGF%榆FAff&&g%A&F&%'AoADN eͮ)DH&'eAAA-nh( jMh&Č-nDH&$AaAdmČ-nodͮ)AdA$EF&EF&AFƆ$FƆA&&dž&Ǧ&$&G&'AoADN eͮ)DH&'eAAAa̍, kIk +*h諊*)* i)k @υk-Ln+m+뭎m-s ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(ՍсX%5(5(̀ͥѥ@=M%Q%=94(̀ɵ8=I514(ɀЕ ɑPa ==I4(4(4(ՍсX=5(5(рͥѥLY}Aͥѥ4(рɁ =1=I4(ɀЕ ɑPa ==I4(4(4(ՍсXYa=5(5(рͥѥLY}Aͥѥ4(рɁ =1=I4(ɀЕ ɑPa ==I4(сɅ%Pa ==I4(4(4(ՍсX%15(5(̀ͥѥ@=M%Q%=94(̀ɵ8=I514(ɀЕ ɑPa ==I4(рЅсP99Q4(4(4(ՍсX=15(5(рͥѥLY}Aͥѥ4(̀ɵ8=I514(ɀЕ ɑPa ==I4(̀ЅсP99Q4(4(4(ՍсX=1݅ɑ5(5(рͥѥLY}Aͥѥ4(̀ɵ8=I514(ɀЕ ɑPa ==I4(̀ЅсP99Q4(̀ܽɱÁPa ==I4(рɁ =1=I4(4(4(ՍсX%iAɕ5(5(̀ͥѥ@=M%Q%=94(4(4(ՍсX%iAɕM5(5(̀ͥѥ@=M%Q%=94(р]́19]%!Q4(ԥр%́19%9% M4(4(4(ՍсX= ՙ5(5(рͥѥLY}Aͥѥ4(̀ɵ8=I514(̀ЅсP99Q4(ɀЕ ɑPa ==I4(̀ɔPa ==I4(4(4(ՍсX=iAɕ5(5(рͥѥLY}Aͥѥ4(ѕѥԥрԥPa ==I4(4(4(ՍсX=Iͽٕ5(5(рͥѥLY}Aͥѥ4(ɀЕ ɑPa ==I4(4(lxD:\NauPrototype\samples\sceneBase\..\..\engine\core\modules\render\include\nau\shaders\shader_defines.htd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAAaN.- mAAEA-l.l -AaA-l.l dṋAdA-l ĭl -l.l -NGgṋ,d.m -m, $mn D,d-Ld .LAAAAAAd譭 ehe$̍ i)DmlͥAAa,ͭ dJ(hkʉ +ĦAa,ͭ dhkJ)jKihk*IAa,ͭ dJ)(hk*I$FAa,ͭ $IJ*()i)(hk*I$FAa,ͭ DȈh*)(hk*I&FAa,ͭ DȈh*)) kʉ +$AAa,ͭ ))kj))Kɩhkʉ +$FAAa,ͭ d +)(I) Aa,ͭ d +)(諨)ij*ɪdAa,ͭ )뫨)ij* ƬAAa,ͭ I(KȨH J( HAa,ͭ d*kKȨH J( dJAAa$͌ k nnAAdhe͍-DmlͥAAa,ͭ dJ*((+ /dAa,ͭ dJ*(( /dJ*((+ /AA-l.l -NGg-L,ͭlAaAdm N,lMGgN..M,M̬LJ, dJ*(( I(KȨH J( +eAdm N,lMGgN..d*oM̬LJ, dJ*(( e*kKȨH J( +eAA$͍-ͭ D $mM,M̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. M,M̬LJ, /eAAA$͍-ͭ D $mn*oM̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. e*oM̬LJ, /eAAAAam k nnAAi͍-DmlͥAAa,ͭ di( N, -,N, od-Aa,ͭ di( +N, -,di( N, -,AAa,ͭ I(kHȨH +-,dL̬Ldi( +I(KȨH J( -,Aa,ͭ d*kkHȨH +-,dL̬Ldi( +e*kKȨH J( -,AAa̍, k nnn@j()iɩ)'fCBK*ps_6_0Z($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kC?DHHHDIILe0P lR%(Mg/ A%dbC1 *)*1 H J L.O̬Ln6q*)q Q PP `Cr'&_6A@ K(O JDXlT 6caH: p2e6F6AH B2mTbPڰZZ[[D[,&aIHX H HPa ==ImDA6,k ik)ksap &SV_Target Abâvwmlm0^:':(ЍKId `,%@؁h zD`: 0frameD4{0XG= +`@ oMn\-0 uKC(Z"retColorDn53fB&v2V7%HGllvm.module.flagsSuh+llvm.identSwD2V'7V2FWF77y|pD2V'7VBVfV67%[dx.source.mainFileNameS~C2V'7V&w67%8 +dx.versionSpBbfW&7%` ;dx.shaderModelS0C"W6V'7V67% Kdx.typeAnnotationsS ;dx.viewIdStateSCRF'F77% yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` @; a~qf <PEAD %amp LD4B4\ bP_ܶT;/̳%Q_ܶ T;/MNDP_ܶ8R1~,a ^A,D6@I RvWF3%W +t4Κs 9, cLx/0&GL9 t0A8`pȃ ¡&LP 0A8hap# `AA<3-0# `@A dhdc0ф0b 0b @Ì! _*ňA (ohP3c@f q0Cû q C q0C53,|#`Pāռ?L#`ATB0f`1c@ +~1hL 0a AQ?d?0c@b u@CC u0C Xp`j0c@chBL0L(3aPg1@BaƀXc@ +=0 `@ +=(a >3D- |& $L#`0' 3D@#`0A7  L{QÄ0b (@?0c@s 1b (@?0a A +?A?L6\1 n5l3aؐgaόaep a > |f 3n5lH3aؐgD 3c@kX20,!L6<1 n5lx3ag! 3c@(kؠ0lXL 1 ̀ n53a3g1@l1 ̀1@b0F }& A0`f!TABa1 ` @ YUP;& A0`f!TA@!0F 8PUa  83mGеmJ5oMvmP6nSn;з>BFD[#>R״!>R׷->R׽9>R۶E>R۹Q>Rۼ>R&DH#>b׵%>b׸1>b۴=>b۷I>bۺU>b۽>b6D͛e?gWm@gm/iC=C9)=8;;C8A;C9I Ɓa hAAHƁA e]n9MF` &i(aYy"b'`"P@ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0`,2L &GC"J`$ + ʡ<(2("(fnbyyLFD oM $Efe%&,f&gl&eCLc@   l l3/2 Le@4BYb`gCL:ё\]PY`6 D$0jm,6 u@lU6A2"exposure :k6ӷa 60 `@l`0AL 47.SV_PositionB ӆ 6, n@bIjPX! @7 BU5$EA Ckm 0oP8;`2eE&wVF7A( l:=ذxyo0{! 4 aF77A insts"1vFFc.k]ޗۛ\BAFRLafFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥM إ%MхѕM ΠK\[ܔṌչѕM LyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` @; a~qV <PEAD %amp LD4BX4\ bP_ܶ T;/̳%Q_ܶ T;/MNDP_6ILDN,$57688d39a7721f1b513a08604bb518c3.pdbHASHWh9rQ:`KDXIL`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Q2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@M!b9j {6X/n0  i (CAQ50@ 38C8<->C=C9)=8;;C8A;C9I Ɓa hAAHƁA e]n9MF` &i(aYy"b'`"P@ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0`,2L &GC"J` Jʠ<(2("(foxyiLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$aLe@0ِ CCC<h]ـCl ‡m@!6"*lن@  47.SV_Position ц 6,A ,&a00A 1Pa ==IMgiai00 1P 0 +;+ x6i >71Ā8 Ppd@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)V ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` @; a~qV <PEAD %amp LD4BX4\ bP_ܶ T;/̳%Q_ܶ T;/MNDP_6a _A,DPQD] @ɕ 3c/ 7Fc 7F`9˂;& ## `PAbA<# `P@# `PrD# ``d5# ``AHΈ 4k0c&h& ˆ Hm`j01 |lcC$c4s45pL>6da |lcC"ؐ1%cK>6<ᑏ |lHؠa c@c3g @ XUP?F 8PUa @ XUP?F 8PUDXBCS"_JRs9t\ DTDLTPTlTSFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV0 4 COLORTEXCOORDPSMainDDBDILDBJ`DXILJBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L S2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??@BviUo5ZsyoAt֜oAf o +byHkATAPA 8/s8yBL d!Q{3C #+sAcc4@ oM $Efe%&,f&gl&e@Ì-]ݛ[ <float{ 0b4h 0 1@0[M#0Z` +n4h 8 BaG[Y[ݲ6element_countT`qPֵAI  @,b@6 47z./shaders/include\in_out.hlsliX={KK{s[M|l {c{[|l  Dh+{1c{ cY!0nE` 0 ALgZeabI (,3 E ДlĀ `L`-*`qA`s0AU t` tu682779B\X[X[ۛPVO]ݛ Z ]ݛP L  06>vector$CR0`1@P +|`FR0P C,&4Da +0 = E ``@)SxMª Y@ @`S6&GWFF5rC +#k +Ks + !+{j"ҢaF7CȮlMnj-dg4P EYH `1@0 ( ^6(LZp`X 0 hajUXlUѕP ~d~~H䀚H`dbVM -"RtH\\"0`ɕ }Aɽ ՙ4 m[v_^`b&VEWG NLǮlMnj-gHچ@&A`@8t3/2< 2<:2" 179& m PA@,LMхѕM  34S5V&7EFWmA@` v ]U\ڛۆa DT&VwfbU&7aXx @[^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@D\DF@Dܾ\Dd@ʾ@t@P`Rv@@t@P`RvPR@t@P`R@@@@@vv@P@@t@R@@@@@@z@PR`v@@@@^^t@@@@@@@@@@@@\@z@dPP@xx@bR@L@dX@@L@dRv@@@@\@z@hP\@T@dPdX@ZdR@V@dPZbX@bRX@`X@bRv@@@@\@z@hP\X@bX@`\jRv@@@@@vf@ȚPf@R@@@@f@@z@@^@P@V@bRv@@^^@@@@@^^@@z@PXb\`^d\dRv@^^@@@@@@vF@xʪ\|f@ƚPf@R@@@@f@@z@P`X@@Z@`\``hRv@@^^@@@@@@f@@z@P@T@Pl\d@T@@V@\jRR@^@P@T@Pl\d@T@@V@b\nR@V@`\`lRv@@@@^^@@z@PXd\dRv@^^@@@@@@vf@dPf@R@@@@@@z@`\bjv@@@@@@z@`\j`v@@@@@@z@`\b`v@@@@@@z@`\d`v@@@@@@z@`\`dv@@@@@@z@`\f`v@@@@@@z@bb\dv@@@@@PP@T@P@T@@V@@T@R@V@@T@R@^@P@T@P@T@@V@R@V@@T@RR@Z@@^@vf@ȚPf@R@@@@@ʄ@z@d\`v@@@@f@@z@dPʄ@T@Rv@@@@f@@z@jv@@@@f@ʦ@z@b\`@^@dPRv@@@@f@@z@@T@ʦv@@@@@v^^@F@@ƚ@܌ڪPd@R@@@@@PP\@V@\@T@jhf\fbR@T@hrf`bf\`RvF@dPX@X@R@\ʘPX@PR\X@PR\RF@F@PR@@ȚPRF@F@PR@@ƚPRF@F@PR@@ȚPRF@F@PR@PRF@@@@f@ʦʆPd@R@@@@@dPʾX@X@hPX@`X@`RR\vh@P@R@t@@@@^^@F@@b^^@F@@bF@@@@@d@ܠ@z@\\@T@d@Z@bv@@@@d@ʪ@z@dP`\`X@`\`Rv@@@@F@@@@@d@ʪ@z@\\v@@@@@ܤڌ@z@b\bv@@@@@@z@܌ڪPʪ@V@ܤڌRv@@@@@ܒ@z@bv@@@@d@ܪ@z@ʪ@V@`\j@^@dPbrd`X@b`p`Rv@@@@ʪ@z@PʪX@ܪ\X@Pb\`@Z@@T@R@T@ܒRv@@@@ʪ@z@ʪ\@Z@\\v@@@@F@@@@d@ʪ@z@\\v@@@@F@@@@f@ƾܾ@z@fP`\bX@`\bX@`\bjRv@@@@d@¦@z@ƾܾ\v@@@@@¦@z@ƾܾ\v@@@@h@줎v@@@@줎@z@ܠ\@Z@Pܠ\R\@T@PPܠ\R@Z@¦R\@T@¦\v@@@@줎@z@줎@T@`\j@V@`\jv@@@@f@@z@ʦʆP줎\@V@ʪ\Rv@@@@\@z@ʦʆP줎\@V@ʪ\R\v@@@@\@z@ʦʆPʪR\vF@@@@f@@z@ʦʆP\Rv@@^^@@@@`\djBF@@@@@P@T@R\v@@^^@@@@X@@ʘަ@@6< \ʸʪ\XK \\X +HSژܛ H\\\]K ZYH[X\HYZHSSX\JSUK RQHԓUQJHҔ +USUTUȓQ HSR HQRHTȓHRSR HSQHSV HRSRUTURȓQSѓHTUPST TT HSRUPSU ȓӓSKTQQSKK Q]\XHS[ڙ\ZK HPڛRX[][HKB\Y[][ +Y\[LM HJBHYӓTPWUSUSWYY[ӓTPWUSUSWBK QX[[\XHHY\ۜYY]ڛ\K HЙ]ۛ\X[H\][][[[ ћH]X ȜԑHHX ۛ\X +YY[X\YX\]ݛHHZ][] +HHYX[[\X QX[[X \XH\Y\ڙ[\YX\X]]HܛZ[\\[\[H]Y\ ][]ٜ Hӛ\\X\ڛH[YYHYZș\YZHZZ][HY^HHۛ\\\]]Y ؛\]Y][]ٜ HY\Z[X]Hț]H\KKB ȜԑHHۛ\XHH\ۜYY]ڛțYX[[\X JH\]YX[[X X] ZZ]XYY\X]Hۛ]ȐY[XޜK +ȜԑHZH[HX ]]\H\ HZ\\HHۛ[ݛZY\ Ȝԑ]]\H[XY [[Y\^ٛZ\X[؛\\Y\ HZ[[Y\\[YX\YKYY ]ZȜԑ\XٛY[XK[ S[Y۔ԑ +[ HJ^ H^Z[][ + H LJ\]\[ + L  HK + H LM + + H M +H  LMMNB_B[ ȔԑS[Y +[ HJ^ H^Z[][ + LJ\]\[ + M  HK  + + + LMM + H LM MJNB_B Z\Y]ڛH[J +HYXZ[H^Z[]Ȝԑ]HHܛ MK[ S[Y۔ԑЗQ +[ HJ^\]\[ + L  HK + HK L +\ +H  N +H K  + + LMLNNB_B[ ȔԑS[YܗQ +[ HJ^\]\[ + M  HK Hˍ ͌ L +H L L +\J KM + +HMN M + +L MNB_B[ HX\]ٔԑS[YJ[ H +Ȟ\]ȔԑS[Y +^N_[ HX\]S[Y۔ԑJ[ H +Ȟ\]S[Y۔ԑ +^N_ ZS\[[[Yٛ؛]۝ț՜ ZYX[[\XH[XHۘ\Y\؛\H\ H\Z]ٛ]Z]HHYH]ܛ[[K[ S[Y՛T L +[ HJ^\]\[ + L N K + H LN + +  MM +H  LNLNB_B[ T LS[Y +[ HJ^\]\[ + N M  K  + + + LNL + H LN H  MMJNB_B ZHZ[\ۜYY]ڛ HX[Tٛ\X]]H\]]^K[ S[Y՛Tѐ  [ SJ^[H[ HM  L N[H HĽ  L +H N[X H  L N[Ș H M̌  L +ȌN[ HL  L +ȌN[ H + H[LN\] +X +Ș +\ + J + +\ + HLNB_B[ Tѐ  S[Y[ SJ^[H[ HM  L N[H HĽ  L +H N[X H  L N[Ș H M̌  L +ȌN[ HL  L +ȌN[ H H HLN\]J[H X L + ʘ H +\ + H H[LNB_BK ۛ\X؛]\ڛ\K Z\H\][[[YYX[[XKYY +][]ٜ Hۛ\X؛]\ڛHHZYY țX\ +[ZHS[YHY\X TXHۛ\XHYY[X\Y]ݛ\KK ZX\]ݛ\KZY\XH]HH[\^]ݛH[][X]ڛ ]Z] ZYZۛ\XH[X\\HۛZH\[ț[ٜXXX\[[Y ۛ\XZ][YYX[ZZܜ Z؛]][[ۛ[H]YY YX[\[YX[ [Y]]][]H[X\\ ZH\H[\\[HZ[] ۛ\XKK H[XHYYX]Hۛ\\[[Z[]H]XH[\\[X] \XY][Y +ۛܜ ZH[YH\Hۛ\XZHH]YH\[ ZY Vۛ\XHZ[Y\ H[\\ۛ\X XHZZHٛ][]Y \]țZ][Y]]][]\XYX[HHV ؛\Z HYZ\ \ۜٛ\[]ڛXXH[YHH[ZZYH]X\]] ZYXZ]ZY\ \X\ڛ\YXXY]YXH H]HX\ZHHӓTΜK Zۛ\XHX[HVٛ[țHX][X[KKB ]T٘ LHȜԑZ\Z\X[ۛ\Z[\ZHZ][ ZYț[YY\XY HZ\ۜYX]H\KB[ T LݛTѐ +[ ԑ LHJ^؛[ Л]SHO^ ˌLL  K MLN KNLN  LĽ K LL     NNM NHN\]H[Л]S ԑ LNNB_B[ Tѐ ݛT L[ ԑ LJ^؛[ Л]SHO^H M H K ΍M H ̍  KH K M HǨ NN H KH L NL H K LM HKL MMLHN\]H[Л]S ԑ LNB_B[ T LP +[ ԑ LHJ^؛[ Л]SHO^ M  KM  K LL K   K L N  ̍ M KN L LMHN\]H[Л]S ԑ LNNB_B[ P ݛT L +[ ԑ LHJ^؛[ Л]SHO^H M H M  KH L H L  KH LL M H MM H LLNLHN\]H[Л]S ԑ LNNB_BHY ӓTPWUSUS쁞 ZYW[YW[ [:xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPKrkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iPiPhP{kPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPiPhP2zkPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPIs1 k+K"*zz"iPiPhPKrcJkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJkPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJ3z #kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riP1c{ {c#z*zz"iP1c{ {c{zbziPiPhPKrӂ+ kPkP1c{ {KK{szJJzriPiPhPKrӂ+ ZKss+#kPkP1c{ {KK{szJJzriP1c{ {s+*K;Cb*r"*J:BiPKs{s+Kr#K+b*r"Jr"J*iPiPhP{;33kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{  s;+s +r:*riP1c{ +z{#*zz"iP1c{ )*zz"iPiPhP{ӂ+ kPkP1c{ {KK{szKK{siPq{Ks+{c K{sKsK#*zz"iPiPhP{*{c+kPkP1c{ {KK{szKK{siP1c{ +z{#*zz"iPiP C>tʸʄʸ\\\\ʸʸʸ\ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBB\Y[țXYB‹J[X[\X[X]^[X[\XX[Y^ ٛ H[Z[][X[\X[XX[Y +\XZY[HH\XZY[\[\H_B_KB [[ۛ +HS +ؚKBYY[PPїQPSMYY[WPPQSԗTVNYY[PPQSW՗QPTVH MYY[HTQRPWSԗQPTVH NYY[TSUғWSԗQPTVHMLYY[TSUғWSWSSH LBYY[SPWSRSїГSSH NBYY[RQїӓTSLYY[RQWQSTULYY[HSWQSTғ YBYY[ӓPӗPQTQȑWYY[TUQӗPQTQȔWBHY[[\B +ț[ؚKBYY[TQQWR +^ +^YY[TQQ +^ +TQQWR +^JB[X[\X[XZYYY[\^؛]HY\ٗ]ZۛXPY\YHTQQӓPӗPQTQVN؛]HY\ٗ]ZT]YPY\YHTQQTUQӗPQTQVNBH[[HۛXPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]ۛXPY\Y^NH_BH[[HT]YPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]T]YPY\Y^NH_B_BH\ [[\B ӛ[ؚKBYY[ГP +\Y [X[Y +\YȈ[X[YYY[ГP +\Y [X[Y +ГP +\Y [X[YJBYY[ӓPאPQ[X[Y +ȘXYГPӓPӗPQTQ [X[YJYY[TUQאPQ[X[Y +ȘXYГPTUQӗPQTQ [X[YJBHY [[aWTWRUՓSQSTŎ6" +-T4l`(QhI3FV&76VGVF[ yq +{{˃+{ kc+{+s+ ++{qqyqqy)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ&$: 08 H 6,d KP Ԇ!&d%&7A@ BKĆ%hZ%Xb Z&671Aё\]PY%rB'Z%X6;1A0؀DOCKK! N< C&xAZB,jbpņ%‚,6 -A0D! `C\& 3AH AKLe$X h x x ӓ!A6,,!ln1,,"') (†e --%b .6 qAwd*Ln ^lXZ"/B/.X-Z.bC `CQ_0Qq " ,A#E\ݸ;(  @O#0XG=`L.l\`'@ Е ɍK ё)ƒ{+J  r !A`\.BLkLAи]  q "B$0A84CDt77H`pd %xoKх  q10 !A$%zz@ 0A1`p5.@CZ[x ;40q "K1 ] ؙXݔٵձMٵM [X؛]b![X YY[ܔl̽ɍ9M [XKܔ@%ؕͥM Z ]]ܔ%̡5M d \[Xܔ',хѥM,إ%MхѕM K\[ܔ/yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK,DITmpK(5=mβT?_ Ea A,D5@I Rv7Pr@ A0Fz{cLx7FКsN{0&L= {0A8`p  +C&(LR 0A8|ap C# `pAb ΌA L*ƈA \o3a$@A (uhPn0b 0PÌ! _*ƈA (vi`3c@f xEü xpE xu3,|#`PԽ?L#`TB,gp3c@ +1hL 0a A?`?0c@b |6C |6 PxPk0c@chBL0L(3aPg1@"Xaƀ^c@ PXA `@ PP `@ P"[x @>3- f 3τ0b )?0c@ABm AA +??L#`P`  0Ì.ƈ 0Ì.ƈ 0Ì.ƈ p0Ì.ƈ @0Ì.ƈ 0Ì.Ԇn *] 3@>p  +>3dP6X0l3aؐgƀHjÆD> |& 8t P6t0l3ac1 t6L|& $tP6H0l3a`1 t6l8L6|& ctP 03a1 t6lpL6|& A0(~=B[xA0(~a= `@ _aa1@؃z\1 1@؃\1 t=F  f 6Xt=F f 6Xt=F `f 7Xt=F f 7Xt=F f 8Xt=F ~@f 8Xt=F y f >`n5l}k 0lL#`P~03D0#`Pø~0  Ä0b  8A,Ă. 3>v$w „0b  8A,.A 0p 0L8a@3mBе->B״9>B׷E>B׽Q>B۶]>B۹i>Bۼu>Bߵ>B߸>BD#1>R׵=>R׸ >R&UHmVUHm߆UHmUHmUH}VH}fDH[#5oAT]U]6UmfUmUmFD}W#MW#}X##nJؽdфmTQ/TQPE0??DEoVH,0BDSTAT$`DXIL BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L N2"H d""ㄡL L|#%f`) BR˟VbFc* ?a!! UEc BȠvpmT_6"0Bp (#Is `fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/O#! ۨ " 7ISD ̳;B<rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0P EPPPThTJ +a + 3gȏ(yLFD oM $Efe%&,f&gl&eCLc@  l d3/2 Le@4BYb`gCLё\]PYX6 D$0ji,6 u@lU6A0"exposure :k6ӷa 60 `@l`0ALmCp4ܸLY}AͥѥMhPHbPLڰjln0'' BQmX8X7h9`xUӓ6,  rAl`ɔUY&A`BA6 wB 4[xXM\9:"tex_normPQR`Ja2 +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[Xܔ DBWFF67E2CbVvD6EFW6%8:dx.entryPointsS?B2VFW&77%0yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,DITmpK(5= ILDN,$099bafbf2ec99377ad3d2950b0bfd458.pdbHASH .ɓw=)PXDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L N2"H d""ㄡL L|#%f`) BR˟VbFc* ?a!! UEc BȠvpmT_6"0Bp (#Is `fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/O#! ۨ " 7ISD ̳;B<rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0PP%QePTJ +a + 3byyhLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!Le@,ِ CCC<hYـCl Bwm@!6"*lam 4ܸLY}AͥѥMgP@bPDBڰa czbz ӆe(o 1 BU5$E4A BAo 3h@ 6 dpkd*LnPP lX6 `b `C6`CusU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\X2<$)0)V ϥ̍N.-͍nnJ0yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,DITmpK(5= a dA,$G++ci700FbL ;&ލΚs `# `0D# `0AH# `0AL# ``AlЈA m dpT4b  L!h 5 0  0bp `&|L(cC!džH>fL1|lc2ؐdžD>6$ |l#1f c I>6HA i>6|c@c!c; w @># `܂Ȃ,0b -,# `܂Ȃ,B0b -,B* DXBC2Km}4:COmx@0 DT!'$(@(SFI0ISG14(SV_VertexIDOSG1`HTSV_PositionTEXCOORDPSV04 + TEXCOORDVSMainADC{ILDB`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L (2"H d""ㄡL Lx#%@`1RsA @19-bG ?a!F+1m#b3\=@3, +^!܁b)Ykќ#:F $4-Pn?+ QEADHștaart`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GC:ePEP#Q (P%QAJ`$ʠ3g5>PyNLFD mkn-O mm=271 30Bvector X12@ E %`0["HX`@o4 a ( AaelementJؔ}չqHscd0Vp Q!&A`B aFGCȮlMnj-g4 A` "hA* `4 A` +n4 A`: &2@`$6A `X el23a5Fjnj-O \]ڛ"h@@ @ BW7&G67 @6k `Jpuintd@,8$@ ` &@@@,@6w@.)N. [  0:4<30:_11! _12! W"h@A!0CQ"qH a8|,bH0_221! ,×"hPA!0%CU"qH c8|,bH0_32q! L"h`A!05CY"qH e8|,bH0_42! l"hpA!0EC]"qH g6@}0 +p + + +0 p L%Lؾ%a{ DB`,bK`80:4<#22:329 0:4<& m pyPBD@ܚ?projectionMatrix@GB_SceneBuffer@@3V?$matrix@M$03$03@@B(٥ɽ Չѣ*ã+++{1c{ cY6Pla 0`<)sK{sk+s+k !*ã++!+{j" +ڶ 0b. TX[]]$Ah j?sampl@@3USamplerState@@Af6P8<  09327 >P"*;Ir3{*K{s0>T ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց̡}͹4(4(ՍсX=M剽5(5(рͥѥLY}Aͥѥ4(̀Е ɑPa ==I4(4(4(Pɕ Չ٥ɽ Չȕѕɡ4(LMхѕ̅ȕѕɡ4(4(1= 1} UIL ՙɥȕѕɡ4(5(рإ5ɥ4(рɽѥ5ɥ4(4(4(X=M剽XM5ԥсLY}Yѕ%4(5(X=M剽ၼсX=M剽4(4(с̀ͥѥ􀘱͠4(Ѥĸ耴ĸ4(ɤĸ耴ĸ4(Ťĸ耴ĸ4(4(ѹЕ ɑͥѥ4(4(рإAͥѥ͍ɑQɅͱѥձإ5ɥ᱀Ѡͥѥ4(рɽѕAͥѥձɽѥ5ɥ᱀إAͥѥ͍ɑQɅͱѥ4(ɽѕAͥѥ퀼̥ܕ͕Hٕ͕iѡݥ͕̕сн5(4(ѹͥѥɽѕAͥѥ4(4(ȕɹ4(5(4(р@M5X=M剽ၤѥLY}Qɝ5(5(р̭􀔹٥ɽ ՉL̅ѹЕ ɑ4(̭幄4(ȕɹ̭4(5(l9p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 HĆ RDܗ $>shaders/include":(77<68222477:27241:9029-ZilZȾ8\amXH J$N%N"%Tb%Xbp(c KLf1Annp4 l#22:32 l@^&n%^%pt h܆A &3A8 M>D>#ڀ9COTa?a  KXl^ 6eap ;0 mЂ˔՗U]^&!x Rm*ذZ[[[[ņ.LY}AͥѥMk\  K\E[ԅKK]*zz"  K\E[KЅK^l/6 q/vF6.B@C hэK7uHLoH"0  rj d'0XG=`z`H: uȠ%Ala`0AXu]\\Јͮͥ퍬Ō-lnPͮ%̍nJ\\\\C-2<:24742)H!s{+s ;D2<27)K4!s c+D2<90272)M!s+{+D%2<< 7707)XE2<$)0)Z!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<#mpK(5=mpOD4!@m[,WBa A,DFW)]P5F  0C &KL8 ,s0AXaaQ# ``Ay0b  Uň jpò3D0b `ÌqQw A?,?0aT0:c@h AUwL7F0c@hEspC@`0c@l H[r@g30\ut30b @ÌIw A1?P?0a A1?P?0a A1?P?0c@\#`Ṕ?L#`PA?L#`AqphBL B0a& „0@  Du`Ao0a&0 h L 0aA[UhBL B0a& „0@ Y|f 0h;F `1P`1@  2H> L`L#`0 U0a'g1@т `@ &SP & (L#`0@]0a  +ml0bp *ŒdphBL B0a& Ä0bp +0hL 0aA4 t0a&0 h0L#`+L 0a&00 =|f 0;F `څ?``1@@! `@ ^ +& #`A0W0b ORI1@тA0x@ ,ψ <P 3 +pl 4f 0  0bp M*́hB&h0A +w0 B00 #`)&h& =|F Q``@ [ +F R0$O>#`)<\0b .#`*$X`g@ ^P A0x|a/1@XA0@āzh!1HDXzA0@āz`F V^` @ q`_ZA0@ā|jaF V^<@DXBCAlsƖTM.R) DT 4#h##SFI0ISG1`HTSV_PositionTEXCOORDOSG14(@SV_TargetPSV04 +TEXCOORDPSMainDCDILDB `DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L 42"H d""ㄡL Lp#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8f"q`pypZ(|zrzr{(qw>0vxp6:0X7ISD ̳;D9rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCJBʠJ` JʃRIA!3ghqy#LFD mkn-O mm=271 47float4xX@h|0c{ cdAiS `F6 "hA0PwiS a6KD< )c+k+s{sF0(&1࠺ M$ 0 4`X @jnj-O \]ڛ"h<q$"texCoord4fٕѽ񘱽ѱ,b$5P X #Hj,b$5P @a6 c@e0A@iu + &A `"@51@Bk`A`L`xsMAVMPB 9bVvF'GČ-S[\[  E ܁` E `+ff4{ DpYMQ/(`0db1@B +H /E Є`Kff4 DpYM)Q/(`1fb1@s +B + E Ф`&kff4 DpYM+Q/(`2hb1@ +B + /E Ă`6ff4 DpYM-Q/(`3 <>PR0TPVpXZ&row_count +p˜}չM+8Ѕ 0P @!`Xu D@/ |إ5ɥ }M ՙXɥ5̐ m[yp_ 'V6FF'G<{S+K{sk +K:+s+33+!i Kj"!ڶ  H@.Mͭ̍nN- U]\PX]ݛ[ ϲ 9L@ t?environmentCubemap@@3V?$TextureCube@V?$vector@M$03@@@@A@A&X̅ +kc+ +S; @-g. hj* Ln. (h;и"aaL ]U\ڛۆaDT&VwfbU&7a{8 @ ^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@D\D@@@@@h@@t@v@@@@f@@t@vvʆ@@t@P`Rv@@t@P`RvPʄR@t@P`R@@@@hh@v@@@@hh@ܚvv@P@@t@R@@@@@@z@PR`v@@@@@f@@z@fP@@@@@@@@PP@L@`hR@zz@`R@~@b\`@t@Zb\`X@@@@@@@@PP@L@`dR@zz@`R@~@b\`@t@Zb\`X@@@@@@@@PP@L@`bR@zz@`R@~@b\`@t@Zb\`Rv@@@@\@z@v@@@@h@܈Ȩ@z@PX@hPX@`\`RRv@@@@h@Ƞ@z@PܚX@܈ȨRv@@@@Ƞ\@z@`\`v@^^@@@@ʴX@@@@\@@@@\@z@Ƞv@@@@@vh@P@R@t@@@@@h@@z@\PX@\Rv@@@@\@z@`v@@@@@v6A>tʸʄʸ\\\\ʸʸʸ\ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBB\Y[țXYB‹J[X[\X[X]^[X[\XX[Y^ ٛ H[Z[][X[\X[XX[Y +\XZY[HH\XZY[\[\H_B_KB [[ۛ +HS +ؚKBYY[PPїQPSMYY[WPPQSԗTVNYY[PPQSW՗QPTVH MYY[HTQRPWSԗQPTVH NYY[TSUғWSԗQPTVHMLYY[TSUғWSWSSH LBYY[SPWSRSїГSSH NBYY[RQїӓTSLYY[RQWQSTULYY[HSWQSTғ YBYY[ӓPӗPQTQȑWYY[TUQӗPQTQȔWBHY[[\B +ț[ؚKBYY[TQQWR +^ +^YY[TQQ +^ +TQQWR +^JB[X[\X[XZYYY[\^؛]HY\ٗ]ZۛXPY\YHTQQӓPӗPQTQVN؛]HY\ٗ]ZT]YPY\YHTQQTUQӗPQTQVNBH[[HۛXPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]ۛXPY\Y^NH_BH[[HT]YPYJY\ٗ]ZXYSX[YJ^\]XYSX[]]T]YPY\Y^NH_B_BH\ [[\B ӛ[ؚKBYY[ГP +\Y [X[Y +\YȈ[X[YYY[ГP +\Y [X[Y +ГP +\Y [X[YJBYY[ӓPאPQ[X[Y +ȘXYГPӓPӗPQTQ [X[YJYY[TUQאPQ[X[Y +ȘXYГPTUQӗPQTQ [X[YJBHY [[aaCPh)BEn BK90241:2΋SX]\\X[X[P\ًˋKY[؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ6,PDHHIIQ&ȲAH !%Xi6 .*1A Lg3!Q(P AMLl7*)'669aP Ć!%'&! .SV_PositionD $ӆ@%& 5AH JEXXEJJ@kIhX AZlXR,¢,-RB,R,b`kd*Ln$ [lXT--Ƣ,R,T,bC `C\" n\ԅn'@ @O# 007.@DBX: @O#0 : p.llvm.dbg.cuSxhfFVVbv67E{fFVF7%Jdx.source.contentsS|Fdx.source.definesS[XK[XQ[SX[ٔ̽ɍɝM N +]\ڛ۔@%؅ٕM XZY\Y۔%ʐȕͽɍM r ]\Y]]ڛܔ'إ%MхѕM |K\[ܔ`.yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa A,DFh(£Ttf0 &GL3 8g0A8`pP# `@uDs]ƌ# `@yaDŽ0b tZ3Dxr$2ަȄ0b  +|% f`#C fP# f@#û Dc (ƌ#`P?k03Hr&00 j`û30r A?@?0a A?@?0a A?@?0a$5mP0b  t`0a$AL# `A`QN@ +&MDNQ?DE/Pa#0K,DSTAT `DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L 22"H d""ㄡL Ld#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9B=C9=8;;C8 +&ћ)gY@! rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P PePQ@$ʠF@Н C=C9B=C9=8;;C8 +&ћ)gY@! rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP +%QPTJ +a + c%py]LFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hpUBbb `ֆ  47.SV_Position™ φ 6,q7x*zz" X&A2ذ a}  ̀ɔUY&DA5ذhA  6 gܠٵM *dx.versionS ]]ܔC2FV&FV6%HʐȕͽɍM :dx.viewIdStateSK\[ܔ yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma -A,FB(£10# `meȈA @\iZ2b !# ``qJ2b $^)#`ЄR˲ 0  0b |b 0b |b 0b |b V0b |b قDXBCI,e?a C DT@/88l88SFI0ISG1`HQPOSITIONSV_InstanceIDOSG1SV_PositionTEXCOORDPSV0`4.  DPOSITIONTEXCOORDTEXCOORDTEXCOORDTEXCOORDdeferred_lights_vsCAD +CDD%DILDBL,`DXIL4,BC! + #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L :2" d##ㄡL L@ +@@ 3s`0G@$AH) HS A rT98.B*VbFq% ?a!! b!t@l ($7@Iw8ҴCM>%b4ҴQEAD>#p@Β&%ǙJ8&Dx%x %b2)rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C <d2L &GCJ +2("(((P@ ((*R(@(JJb JJg(q2g(y?y*L d!{bK;CC #+sAcc4@ oM $Efe%&,f&gl&e@Ì-n]ݛ[ Ȍ<float{ 0b4a 0 1@0[M#`X` +aPG[Y[ݲ6element_countL`YHTAI ,b0h+{1c{ cY!A$`,bfР 00E 4A` +n4el  L+8(1 Dc0 M@ 0021 hÀYY\[ܗ::::posQ!3 0N]^X["h@P 0 6F%FV77:0Vcolor_and_attenuation3 0`B&vV9:0 L)  xX%-bF )2p6w0 &; 0< QFGm.̭ $͍n0A` &@@@8@./shaders/include\clustered/point_light.hlsli@Btangent_to_worldt027/7962 179&   Ce0U0 +P +pP@mvpDhh8ɥ񘱽ѱаpYM+f0 0bd1@ +C`+ff4 <$`0bh1@3 C`K&f4 <$` 1dd1@s C`Kff4 <$`1dh1@ C`k&f4 <$` 2fd1@ C`&kff4 <$`2fh1@3C`.&f4 <$` 3hd1@sC`6ff4 <$`3hh1@C`>rXZ\^pr0tPv`"v5VF7(1`25VF7(10D @` X*fAOБSЛPYЌI[\P жUQ0zr&Ff;9c{kJs:bJ;Czs33+!i Kj"!ڶ0 +gP@ܾ޾1@P++s{{+{{#:bJ;Czs33+!+{j"ڶ0 +h@tȾ?world_view_pos@GB_LightConstBuffer@@3V?$vector@M$03@@B?$F! [[47:^vector9% E ,|`FX @a1@ K8 $L$Pb@|AP1I@JJ XXf g- nk΍hJ) nhĮlM(fHhHp97/3411>RenderSpotLightt1@3@- nM.팭lj,l451 +OHH334:417 3'32E (OH2$0E (OH&l'tbL21 +N,b3 `!IOP~Ā怀f耀-@DXXh++#̡ͽՑqѵɕѥ}չ͹ͱ 1$菱b"[۶ʂ"\ٶʢ"œܶ"]ݶ"[۶"Z۶"B̶"B̶""\ڶB"Yٶb"]\\\]\W[]ܶʂ"]\\\]\W[]\לܶʢ"]\\\]\W[]\ܗ[۶"cpFGW&5W&WVFW&W&5'W&ֶmC4܅}}Չ}ѕ}}}}m[ ,r,(m[0 ,v,8m[@ ,x,8}}Յɕ}ѕm[P ,z,H}}Յɕ}ѕm[` ,|,QI9M5%QQ9 }QaQUI}]%Q!\^^ʸ^ʾ\ k (`kQF9* $* /",*/#$m AԦ-@HlP +*Jr:*¢*rJ*ڶql$@,IJ*()i苪J* +iGnF$) /",*/#$m A즖-@Ll -@MlZJ*bJ*ڶl8@hj)hꋩk*I ixF0623:3ZYK[YיXYܗ\Y [ڠ0U]\ ]ݛ[ ϲ`C @@ @=AOXיXЌ U]\ ]ݛP Pж`0ۛ\[יX M-L hꇄ NLĮlMf(h{y-L.-LΌrFW&u&Vg4cCBUGW'W&CdCbW6F&D3m#><BVGu&Vg7!+C:3!*ã+!!+{j" +ڶAqz!+3 c kc+#3V&7EFW6 &0dCVfVF5V&4S5V&7EFWm><ؐ0!gkosQw{QAAa1 a3H Ұ! 3*K{s0%23$7727 H! \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBH[Yۛ\XY][] HH[Y[]\ [[ [HB\S\]^STUғ +\J[][]ڛ[ H]^X[UӓN[ Wٗ\YZUӓQN[ ۛWW][]]ڛUӓN[ YW[UӓNBNB\\\]^[ TUғNBNBTUQאPQ +S\ +\Y]XLJ^H] [[NTYS[טVSSTNB_BS\YY\[ܗ\\H\ H][WYȔW]XYQJ^S\[\NTYSH[ט[WY^N[ Wٗ\YZH [ۜTYZN[ ۛWW][]]ڛH [ۛ\[X[NۛWW][]]ڛHHۛWW][]]ڛ]N[ YW[H [Q\]ڛ[[ٓ\N؛[[][X[HۛWW][]]ڛKN؛[[][ٓ\HYW[KN[ ]^X[H ]^X[ ^N[S]HH [][ٓ\ [][X[N[ZUH\J S] +S]\ +H HLN[ țNH +J\  H\ \ +LJ^țH]Yݛۛ\[[^[ J\ ۜ ^ +ZU H\ ۜ^J + YW[ ^^NH_H\Y^țH[ +  LNH_B[ ݛH[ +Wٗ\YZݜ ^ +țٜ ^ + +Wٗ\YZݜ S]\ + HLN[\K]^X[H[ [WY ]^X[YN[\ HH[J ݛ\N[\ۛWW][]]ڛHۛWW][]]ڛN[\ Wٗ\YZHWٗ\YZN[\ YW[HYW[N\][\NB_ HYYBBH[YșXYܗ\Y [HB[\YّXYQ[ XJ^\]YיXTX[S] +YYX\X[ [ +  L ^ [ +  L]NB_BB[ YY\[S\H\WTԐTQT +NȔUY]^[ ܘ\YHQԐTQJ\ \NZ \\N[ ]ZN[ N[YNHXX[]HY\N^Hܘ\Yܘ\Yۜ ^^NB؛[\QHYיXTX[S] +YYX\X[  L N[ YH[ +ݘ  + H H J H ݘK^ + + H H \Q H LN[ ݛHH[ۛ]W Y\N[ ݛHݛ ݛNB[ [[Q^Hݛۜ ^H ݛٗ]Zۜ ^NB[ Wٗ\YZHH\ Wٗ\YZNHSSRT[ Z[[HH\ZW[NH\Y[ Z[[H[ +   LNHYY[ Hۛ][HWٗ\YZݜ ^H ݛۜ ^N]ZHNYHNB[Y^HJۛ][ Hۛ][\ +Wٗ\YZݜ +Wٗ\YZݜNHUUWTTT[Y^H]TYQS[U]YP]J][Y^]JJNHYYTRH[Y^]J^HXX[]HY\ YX YXHY] XHYXHY[YZH_H\Y^X\ّXYșXYH\YX\ّXY +XNB[YTH +[[Q^ [[Q^YN[H\H\ +YT\N]ZH[[Q^ +H\NYHJ\]N[HʙXYۛ\[ ]Z]N[ \[]ڛUH + +șXYۛ\[H ]ZN[ӛHHU + +HLYKNBZY[X[S\X[\HșXYK\]WXWNZ\HH Y^[][H\TZ\YHZH]ZHșXYK +\ ]]HY[]XHXۛ ]ٛ [YH[ژHSZ[SݜQ[[HJ]Z +K +KMNZ\X[\[\ڛH[\]\[\ڛ\]\]U + H]Z șXY [[Y[[ +șXY [[Y[[\ YX\[\ڛ[Z \X[ۛHșXY\X[ۛ +\X[\[\ڛ +șXYK\]WXW[NB[ [ۜTYZHH\ Wٗ\YZN[ [ۛHH\ۛWW][]]ڛN[ [Q\]ڛHH\ YW[NH][WYHH\K]^X[ N[ ]^X[HH\K]^X[KNYY[HVUUQS\]Y\YB[[][X[H[ۛKN[[][ٓ\H[Q\]ڛKNBZY[[][]]ڛN[ Y[S [ [ [ [H ۛ\[[^Y[\\Xݛۜ ^ [ۜTYZ [Q\]ڛ ^ [][X[ [][ٓ\ Y[[][]]ڛ Y[S [ []NB[HʙXYۛ\[ Y[S]NZH][]]ڛHXW[ژZ șXYK[ + +Y[[][]]ڛN[WZHH[JLY șXY [[Y[[ +șXY [[Y[[\NBHQSPSSWQSWVUHQSPSST[Y^HH][]]ڛON [Y^HH][]]ڛO JHTTYXZYʙXYK[]\Z[ + OLNH\YH][]]ڛH\]\]J][]]ڛ +SN[Y^HH][]]ڛHONHYYHUUWTTT[Y^H]TYQS[U]YP]J][Y^]JJNHYYTRH[Y^]J^HXX[]HY\NH_H\Y^H\YHHQSPSSTH][]]ڛH\]\]J][]]ڛ +SNHYYHYYBZZHHNHRYY[ГURPPJ[XZHZ۝PZ +Z\PZ JS + +KLN[  SUHYSU[WY^N[ [ZHH[SU [ ݛۜ ^ + +[ [ +Y[S] + +XZ HLJNH +[ZՐHLYMJ^[ZՐ ^K[ZՐNHRTHYTRSԐRUZHH H Y[X[Z\X[ +[ZՐ ^ [ZՐ^NH\YHYZݗ\X[Y[Zݗ\X[HNHYYZHH H Y[X[Z\X[]ܘ\Y [ZՐ ^ [ZՐ HK +Z][U^  + +M +\]\] + +[ +[ []JJ + Zݗ\X[YNHYYHYYHYГURPPГURPPHYYH_H][]]ڛJZNHYYBHQSPSSTH\]\]SN Z [H]Yӛ  șXY YY\ۛ WZ șXY [[Y[[ \X[ۛ Y[X[S\X[\ Y[S ]Z șXYۛ\[ șXY \[XXۛ șXY \[XX^NZ [HYY\SXXʙXY YY\ۛ\ + +S +[ۛ ^NNBHHT RTTHʙXYK[]\ZHORQTTQPQJ^[ZQܘ\ݛ[QH[ZY[WY^NTH +[ZՐHLY [Qܘ ZQ[X[XJ^[ ZHH[SU [ ՛ HLJNZKZՐNZQܘ\ݛYNYܘ YYQH[Qܘ YYQNYܘK[][]YH[QܘK[][]YNYܘK]S[SH[QܘK]S[SNYܘZ۝TYH[ۜTYZݜN[\\[]XHY\\[]XٗYݛJșXY \[XX  Y[X[[Z\ Y[X[[Z\^ ZՐ ^ YXN\\JșXY YY\ۛ +[ۛܙ +YܛY[\\[]XʙXYۛ\[ Y[S \\[]XY + +Y[[][]]ڛNH_H_H\YHYY^ȋJTHJTTYXZYʙXYK[]\Z[JJ[JY ]Z Y[S] + +șXYK[ + +șXY \[XXۛ XH[ZșXYK؛ʙXY \[XXۛț[țXٛH[\KH_H\YZ [H]Yїӗӛ  șXY YY\ۛ WZ șXY [[Y[[ \X[ۛ Y[X[S\X[\ Y[S ]Z șXYۛ\[[NHYYH][]]ڛHH[[[\^]\]J Y[S [Q\]ڛ ^ ]^X[ K]^X[K H][]]ڛ[N[JH][]]ڛ +[ۛ ^NHUUWTTHQSPSSWQSWVUSUSHJ][]]ڛOLJ[HNHYYB\\H[ +[SݜQ[[NHXX[]H\]NH_H_H_HJXX[]YJ^\][ \\ HLNH_B\][ +   LNB!  ZYW[Yۛ\XY][] ˹xyiPxyz˓K;CAKiJ{{3s bcK;C+++#siPxyBK{#+IaK+s+#s#+C+iJaJ+s+AiJJqiPxyBJz"*IzJ"*"Q IRJBz + +ry2jPxy rYJr"b)JB*)‚*yIjbJ*"bIrb"Jr: rjPxyIjbJ*" + +rJ*y21Jr*1z  +Jb +jPxyz*bi*B +r +JbJbyqzrjIr2Jr:*j*rriPxyiPxy!*+c{+#iJsK; CkPxyiPxy C{Q +k+ s #iPxyiPhP ;k  sKs;C!K c+IiPhPI3s#+3zbz +*JbJBbbJjP!+3Ks+zbz +*JbJBbbJjPhPxyiPxy9 +kk  k s#)s{#Ks; s3+1sK{skPxyiPxy :s{K{{c{ +C{;C ccK;Cc{c+#s1zIs s+c:I{C kPxy{c{ +A!+3Ks+#C++ K+{ s# CK+{KsK s# 9 kk  ks9 +kk kPxy k +!+K;s+#{+#+++ c){C+s{k+Ks;1c{ {k ccIs+;+kPxy c+siz++KK{sIq++#+#Is! [+9 #K+s C+Ak s)+Ii{++sKK+kPxy{{s KC! [ c+s a{; KCkK+Iy3+s+#siPxyiPhPxy:I{C {c{ + s#  s3+1sK{sy9 kk  kqAI;q{ +9 kk kPxy+cCKCA +++s!++ +# c{s;KC!Kc ˛sI:IC  ck{ cckPxy+ã++c s#C+s +#{ sa"i{sK{C+a{{[K;Cs:+ã+i+kPxyaKs+ K+#1{C˛K cc{++s#+Ks;c s#C+aKs+ +cq++#{++k)s{#+#kPxyKCC+: k1{!Kc siP0c{ aJs+ z:B1c{ IiPkPyy {Kk +c{CcqyqIiP+s+c+CqaqɑQcqQ{CcqyqIiqIiPkPhP0c{ :zcJs+ C1c{ IiPkPyy {Kk +c{CcqIiP+s+c+Cqayqɑa{CAYqIyqaqIIiPkPhPxyB++1sK{s {K#{CI{)33KK+sc {Kk +:KC s){q)qiP0c{ aJs+ z:2 +C1c{ IiPkP+s+c+CqaqɑQcqQCiqIiqQYqIiPkPhP0c{ :zcJs+ 2 +C1c{ IiPkP+s+c+CqayqɑaiqQiqɹQCiqɑQYqɑIYqIiPkPhP0c{   +:zcJs+ CIs1c{ Iٓ+s:zcJs+ CKkP0c{   +cJs+ z:BIs1c{ Iٓ+saJs+ z:BKkPxyB+y*2+{kk+s#+#1{{s+sC{sysA"sBK9 kk  ki Is+ +{s  kPxy {K +1{K+Ks;Is ! [)sK{sk+ssiP0c{ aJs+ z*A1c{ IiPkP+s+c+CqaqQcqəQ{CcqIiqəIiPkPhP0c{ *ɡzcJs+ C1c{ IiPkP+s+c+Cqayqa{CAYqəIyqəaqyqIIiPkPhPxyBKIC+q+A" s3+1sK{sc c{ cc+#1{++ c sK+siP0c{ aJs+ z*A1c{ aJiPkP1c{ iqyɱqyiP1c{ iqyɱqQiP1c{ qyɱqiP1c{ qyɱqQiP1c{ ɑqyɱqQiP1c{ a{CabiIiP+s{CAYQaKyAYQaKaiIiPkPhP0c{ *zcJs+ C1c{ qJiPkP1c{ iqyɱqyiP1c{ iqyɱqQiP1c{ qyɱqiP1c{ qyɱqQiP1c{ ɑqyɱqQiP1c{ q{CqbyiIiP+s{Ci CqiaIyAiQqKayiIiPkPhPxyiPxyzc{ +{s+K{skPxyiPxyB++ k+aKs+ Aq{9 kk k)s{#+#K c+s {c{ +{s+K{sI C s;+kPxyy3 KAaK[+IsaJs+  b;+ KqJs+ {c{ +I!+3Ks+#C+++{kiiPxyC+ K+{kiC s;Ks; +Is{c+ i Kk+{icKcK K{ssqz+C kPxyC s;Ks;C+{c{ +i +cIs{c{C  +yy3{s#+ +{k+kPxy{c{ +A +a ;+9 kC syC+sB+s{s+Ks;{k+{c{1{k K#+kPxy9 k{k cc9 kcq+; K+ c+i +ccCKC +Is+Ã+Kc+IsC q+kPxy{c{ +siPxyiPxyI{c#+I#+ c{Kc# {c{K+cKs+CKCq++C{ Is+Ã+Kc+AkPxy++K c+K{c{sBKi+ sKs; {c{ +C I K#+ {Kc+sB+kPxy{c{ +IC+q+ cc cck)s{k Ks;{c{ +cIA C+s3{s +kPxy{+y3A Ks;q+; K+ c+A+K3K ccIs s#Jqz{+CKc 1C+kPxy s3{k K{s s+i #+{ s#{i [+C+k c ˛{KK+sB+ sA +C+KkPxy+KK{sq++#+#+#!KK#Ks;b cc{Ks; s#{+ [+#Is{{rzj™siPxyBK{c{ +I cc+#ɪ1{a [y3 ++q k+siPxyiPhPxyqz+*s s#:C +C+ k+{c{Kk K+ s#CK+{KssB+Kysc!K33++s+kPxyIC+ s3+++#siPhP0c{ *ɡ{*A1c{ :IiPkP{s1c{ zsk +iPkPqaqɑɑaqaiPqɁɩaqɉɩaqaiPqɡaqaqɩiPiP+sicCzsk +c:IiPkPhP0c{ *{*A1c{ :IiPkP{s1c{ zsk +iPkPqɱaiqaiqaiPiqaqɩaiqaiPiqaiqɹaqiPiP+sicCzsk +c:IiPkPhP0c{ *ɡ{#JA1c{ :IiPkP{s1c{ zsk +iPkPqaqaqaiPqəaqɱaqaiPqaqaqɉiPiP+sicCzsk +c:IiPkPhP0c{ !J{*A1c{ :IiPkP{s1c{ zsk +iPkPqɡaiqɡaqaiPiqaqaqaiPiqɱaiqaqɉiPiP+sicCzsk +c:IiPkPhP)s#K3yyzbz +*JbJBbbJ ȉ\ʸʸʾ\HYHURTTTPSUTYY[HURTTTPSUHLBH[YH]Z\ YY[]ڛۜ [HH[YH]Z\ YY[]ڛW[ݜ [HB‹JڌO]Z\\\X[] ڌOBO\ZH؛]]\ ]XYY[Z\\X[]ț[H]Z\YBY U]]ZYY[]ڛțY\]ܛY[ ZH\[YYٛ\\\X[]ZY\țZH]]YNKB‹JZH]Z\\\X[]H\ZYY[XZ]\NKB ZH؛XYT HH[XH[ڙ[[MH\H]Z\T\X[]^ Z[H\YZXHZțZH]Z\KH\YZX\\]\YZXN Z\HY[\YZݜ U[ۙZHZ[Y[]]ڛH\H^Z[]ڛ\ ZH\][ț[HZH[H\[[ZK \YZۜKH[\WY[ܗ\YZNB ZX]\[YXZțHXH[HZH]]YZ\ZY\ Y\]HH[^Z[]J\][Z[țZH]Z\Y + HHY]ڛțY ]][ ZX]\[YXZHH]]YHHY\][ ȉ\X[YX]\ ]Z[ȉ\X[YY\] HZH]]YKX]\\\]\X[YX]\N ZY\]ܛY[țHXH[ HK HY]ڛ[H]]Y[ YZ[\ڛ[][]X]Y [Y\]^ +HH J[^Z[]Y\]^K Q\]ܛY[\X[YY\]NS]X\X[YY\]W]]YW]\NB ZX]\[YXZțHXHZH]]YZ\ZYY\]^ HH[^Z[]J\][Z[țZH]Z\Y + HHY]ڛțY ]][ ZX]\[YXZHH]]YHHY\][ I[ZX]\ ]Z[I[ZY\] HZH]]YKX]\\\]H[ZX]\N ZY\]ܛY[țHX HK HY]ڛ[H]]Y[ YZ[\ڛ[][]X]Y [Y\]^ +HH J[^Z[]Y\]^K Q\]ܛY[H[ZY\]NS]XH[ZY\]W]]YW]\ ٛH[ZHۛ\Z]X]YB ZH]]ڛXZțHXHZH]]YZ\ZYY\]^ HH[^Z[]J\][Z[țZH]Z\Y + HHY]ڛțY ]][ ZH]]ڛXZHH]]YHHY\][ I[ZW]]ڛ ]Z[I[ZY\] HZH]]YKX]\\\]H[ZW]]ڛN ZH\^[\\\X[]ٛZЛ[]YZZ\Y]ڛٛZY HXٛ]]YKS]XH[Zٗٛ]X]\]YNB\؛H[Z[X^\S]XH[Z\XXXYZH H[ZH\[]][[ۛH[ZIH[ZW]]YZ\JX] +\HHLH[ZY\]W]]YW]\KS]X\YN ZH]]ڛXZțH[ZHܛ[J˙ țޛ[Y +H] ZH]]YZ\ZYY\]HH[^Z[] HHY]ڛț]][K ZH]]ڛXZHH]]YHHY\][ Iܛ]ڛW]]ڛ ]Z[Iܛ]ڛY\] HZH]]YKX]\\\]Hܛ]ڛW]]ڛNSHܛ]ڛY\]W[WKܛ]ڛܛY[\]B ZH]\YHXțZș[KQZ[\ڛ[\\]ș[WXN Z\[țZH[^Z[]T^[H[ٛZH]Z\X]\Y H[X\[\]ٛH[^Z[]\X\ڛ H\Z\[[T^[Z H[H^ZY[[Y[Z[\YZX][]ٜ ћH]X ٛZY HQX\ H Yٙ\YHH[XH H^ZYH[W[HH LKS]XH[W[ X\Yۛ]YB \XXYQZ[\ڛ[\\]H[ZW\[]ڛ[NS]XH[][X]\ٗYݛNB ZY]XX]YZ[[X]HZ[țZH]Z\KS[ۗ\YZN ZY]XX]YZ[[X]HZțZH]Z\KSܗ\YZNB ZH\^[\\\X[]ٛZЛ[]YZZ\Y]ڛٛZY HXۜKS]XH[ZZ\ٗY]ڛۗٛ]NS]XH[ZZ\ٗY]ڛۗX]NBˋ[ J + + H +Y + +J H  +Y +  + +Y + HKKKMN]Z[^H[ZZ\[Y[ H[ZZ\؛N ZY\]ܛY[țHXH[ZHܛ[J˙ țޛ[Y + HKK HY]ڛ[H]]YYZ[\ڛ[][]X]Y [Y\]^J HH J[^Z[]Y\]^K Q\]ܛY[Hܛ]ڛY\]N[ Hܛ]ڛY\][[Y]\N[ Hܛ]ڛY\][[Y]\[NB ܜK]Z\YZ˛]Z˒\]ڛX]YKM Z] +Ȓ\]ڛHY\\H +K͍ L LLM M LLLLM HLJ YHۛ[\]H]XYZ\QZ[\ڛ[\\]Hۛۛ +K͍ L LLM M LLLLM HLL XYYX ZHYZHHۛ[S]X\\[ ZHH XYYX ZHYH]\Z ZH\[BNBHY!ETn5FV&7Ǖ6VGVF6V&WEVfF66ǖFF@F@@bF@@F@@F@@F@Ȃ@F@@F@@F@@F@ʘ@F@@F@@F@@F@@F@@F@ؠ@F@ؒ@F@ؤ@F@ؤʈ@F@Ά@F@ʦȂ@F@@F@@F@@^^@@@@@@@@@\F@@f^^@@@@@@\F@@f^^@@@@@@ؠ\F@@f^^@@@@@@ؒ\F@ʦ@f^^@@@@@@ؤ\F@ʦ@f^^@@@@@@ؤʈ\F@ʈ@f^^@@@@@@Ά\F@Φ@f^^@@@@f@Pf@@R\F@@f^^@@@@@@f@Pf@@R\F@@f^^@@@@f@@\F@f@f^^@@@@f@@\F@f@fF@@bF@@bF6,"902941:209822.2447:494940fFVfD4T$UETdD4UD5ՠ0BVfVD4T$UETdD4UD5ӠР06VGV"F6V&WBVfF66ǖ&Ҡ06VGV"&Gv&WEVfV66ǖ&ҠР0G'W7F2V&GUGW'W&CԠנBUGW'W&CcFGBWӠ2V&7EFWBW5ӠзӠ0G'W7F2V&GUGW'W6CԠנBUGW'W6CcFGBWӠ2V&7EFWBW5ӠзӠ0V&GUGW'W&Cb&EWGW'W&CBUGW'W&CcFGBW2V&7EFWBW52V&GUGW'W&C"#BWCW#BW5BW5#WFW'"נ0V&GUGW'W6Cb&EWGW'W6CBUGW'W6CcFGBW2V&7EFWBW52V&GUGW'W6C"#BWCW#BW5BW5#WFW'"נР0BVfV2V&GUGW'W&Cd$Vb&EWGW'W&C625V&7GFWҠ0BVfV2V&GUGW'W6Cd$Vb&EWGW'W6C625V&7GFWҠ0BVfVB%6זFG6VFUGW'W2V&GUGW'W&CԠ0BVfV$6G'6F75FGW&vFUGW'W2V&GUGW'W6CԠ0BVfV%W&WF6V675FGW&vFUGW'W2V&GUGW'W&CԠ0BVfV%W&WF65FGW&vFUGW'W2V&GUGW'W6CԠ0BVfV"UFV7VF65FGW&vFUGW'W2V&GUGW'W6CԠ0BVfV25FGW&vFUGW'W2V&GUGW'W6CԠ0BVfV25FGW&vFT6FGUGW'W2V&GUGW'W6CԠ0BVfV$'F6VFUGW'W2V&GUGW'W&CԠ0BVfVTFV65FGW&vFUGW'W2V&GUGW'W&CԠР0BVfVBBנ0BVfVTEBVGBנ0BVfVTEBVGBנ0BVfVĔTԠ0BVfVrUT5UDҠ0BVfV67W&GҠ0BVfVbW6&bF'Ӡ0BVfVbW6FbFGӠ0BVfVbW66bF7Ӡ0BVfVBUDUҠ0BVfVBUDU$uTTDҠ@V6V677W6F'WBV6V677W6F'Wf$FUGW'WbFG'WFW'悗נ$6G'6F7W6F'W$6G'6F7W6F'Wf$FUGW'WbFG'WFW'悗נ$'F6V6W6F'W$'F6V6W6F'Wf$FUGW'WbFG'WFW'悗נР`FFbFbF"'WFW'bF"נР`FG2VEWGW'W2V&GUGW'W&CB7bF'RgҠנ"WFW'B7BW2VTfWƆB7BW5RgӠנР`FG2VEWGW'W2V&GUGW'W6CB7bF7RgҠנ"WFW'B7BW2VTfWƆB7BW5RgӠנРҠ676RF76ӠРsU2BVBVfVBVRF7b&V'2"6W76WFFV6ӠVFW&ҖVFW&֖"F"F2GW&F2'rFGrFGFVV֖֠ӠҠР0GF626GTvFVFW&Ӡ0GF626GrfWVvFӠ0GF626GvV"FӠ0GF626G2ƖFvV2'Ӡ0GF626GvW&rFGӠ0GF626GTזV7vW&ӠРҠc$r6rW2BV&fWBVRF7b&2VBV&fWF76WFFV6Ҡ6rW62VBV&fWFRF7VFW&6FV6FBVv&WVBVvӠҠР0GF626GTvFVFW&Ӡ0GF626G$W&VFW&VFW&Ӡ0GF626GbVV6VFW&VFW&VFW&Ӡ0GF626GvV"FӠ0GF626GvVBVvӠ0GF626G$'F6VrFGW&5W&WVFW&rFG&Ӡ0GF626G"F6VrFGW&5W&WVFW&W&5'rFG&2'Ӡ0GF626G2W6F'Ɩ$'F6VrFGW&5W&WVFW&W&rFG&֖Ӡ0GF626G2W6F'&F6VrFGW&5W&WVFW&W&5'W&ӠrFG&2'֖Ӡ0GF626G2W6F'&F6VFT6FrFGW&5V'6VFW&W&5'W&ӠrFG62'֖Ӡ0GF626GTזV7FW6F2F2'Ӡ0GF626GTזV7FW6F6F2FӠ0GF626GTז6V2FW&5W&WVFW&2F&Ӡ0GF626GTז6V6FW&5W&WVFW&6F&ӠР0RFfAx!p͡qՑqѵɕqչѥ͹ͱ`$̍ $i + +H˨i*i i)+iAa,ͭ $i + +H˨i*i i)+i$A͍-.L.N.M/. $̍ N.m-.m $mn L H.m DHέ d썬̥A d, D, ̍$lAEEADd .O. e,D&H.m DHέͭAD$ D. nDlLή̥ADADD,mN.M. $̍ n $ dNn $̍ D,-L.Mm. M.AD,,m,.͍$L L- N. - 썍. d͍,.mAD$L NAD$D,mN.M.m dNn d썬 nD.,  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,LΥADDD,mN.M.m$ D,-L.M nD Nn  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,L$ ADm̍.. $̍ML-L.-mN. .  ,mN.M.ͥADdĩ,L -  d .O. 퍍LnM -l $nADd͍N.MMn-,D n ̍Mn MN퍮 NnnL.ͮ LAD-md͌.L .dl,,m N.MN. L-mn.ͥADAD +)i +dɈ*H$i +J*D( +d *K* +鉉Hj +$ȉdɉJ*IIj +D$h +$iJAD$ȉ$)  Jhj +I +$ )*HJ*ȉ*h$i(D + +)) +AD$ )*HJ*ȉ*h +Hj)ȉ*H()* $ȉ(ʩhj +I +$*H*i)H +J +iAD$H(ij)($ Ȫȉ +d +) +d *K* +ʩH +I +dɉJ*IIj +DAD))HI +$) (Ih$ɉ(Ih$i(ȉ*d +h() )H*IADdi(ȉ*) ()h +%i(D + +))JiJȉ +ɨADdJh*h +I +dH*ihjij +j(*I +J(jjI +Dj*ɩhjAD$ɉHJ +*)ȪH +d(j$ȉ $) +I* ))H()* + +H +$ɩADdɉJ*hdJ*i +))H()*I +I +%i(ĩ)iI + +H*i(AD$H*i*$ $) *( 䩊 + +j +)i +dɈ*HȪ $$*iɨAD +ij*I()* dj ()ȥADADJl $mL.m dj,L.ADd .O. e,D$I*)AD$ D. nDlLή̥ADADD,mN.M. $̍ n $ dNn $̍ D,-L.Mm. M.AD,,m,.͍$L L- N. - 썍. d͍,.mAD$L NAD$D,mN.M.m dNn d썬 nD.,  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,LΥADDD,mN.M.m$ D,-L.M nD Nn  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,L$ ADm̍.. $̍ML-L.-mN. .  ,mN.M.ͥADdĩ,L -  d .O. 퍍LnM -l $nADd͍N.MMn-,D n ̍Mn MN퍮 NnnL.ͮ LAD-md͌.L .dl,,m N.MN. L-mn.ͥADAD +)i +dɈ*H$i +J*D( +d *K* +鉉Hj +$ȉdɉJ*IIj +D$h +$iJAD$ȉ$)  Jhj +I +$ )*HJ*ȉ*h$i(D + +)) +AD$ )*HJ*ȉ*h +Hj)ȉ*H()* $ȉ(ʩhj +I +$*H*i)H +J +iAD$H(ij)($ Ȫȉ +d +) +d *K* +ʩH +I +dɉJ*IIj +DAD))HI +$) (Ih$ɉ(Ih$i(ȉ*d +h() )H*IADdi(ȉ*) ()h +%i(D + +))JiJȉ +ɨADdJh*h +I +dH*ihjij +j(*I +J(jjI +Dj*ɩhjAD$ɉHJ +*)ȪH +d(j$ȉ $) +I* ))H()* + +H +$ɩADdɉJ*hdJ*i +))H()*I +I +%i(ĩ)iI + +H*i(AD$H*i*$ $) *( 䩊 + +j +)i +dɈ*HȪ $$*iɨAD +ij*I()* dj ()ȥADAAa$m D$mLN.m-.mm-MAa$m D$mL셮 Nk.Mlm-MAe$m D$mLN .Llj,L.LmMAa$m D-L.L심,ͭlm-MAA!ɉ)ɩĩML䨌 NlMH-N* ũML$͍ Nk.M,AaADN ƥĩML Nk.M,dD%$ĩML Nk.M,%eAAA!ɉ)ɩĩML䨌-N*H NlM ũML$͍ Nk.M,AaADN d.N. %$ĩML Nk.M,%ƥũML Nk.M,$&%e d.N. Dn$ d,l ĭL.m $m.L,-.lAAA!ɉ)ɩĮlL䨌J.m-.m NHM% %mL *L.Ln.$mL A DĩML.AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eA$lnLħ%$&eA(m.m $mL D΍,L.M$ M.M͍. D.,$L΍ ̮ͥA  d.N%mL ΅ K.,nD$mL ΅ K.,nA$mL E썎K.,nD$mL E썎K.,n.eA(m.m  M.MͥA D Ad*̬l*NEDD$mL E썎K.,nD$mL E썎K.,n.eA(m.m  $mL D΍,L.M D.,E.$̍ $n--A$̍ - / .lͮL$ M.,ͭ ME%&$̍ E M.M-ťA (m.m .mLL΍,L.%mL D.eA - $mL ΅ K.,nDnA - D diAĩML﫭 --- --eAĩMLKD iADN ĮlL娌 NlMH-N* 﫭J*i)*i苪J* +)A䨌 NlMH-N* KJ*i)*i苪J (*%eAAAEA'̍  $ͮLn - . 썍n$,--OAAAA!ɉ)ɩ- 䨌NHJ.m-.m N% %mL *L.Ln.$mL A$ ŮlL&Ύ䩊 +-D䩊 +ũML..AaA$lnLħ$&eA$lnL%ħ%$&eAĩML﫭䨌-N*H NlM J*i)*i苪J* +)eAĩMLK䨌-N*H NlM %J*i)*i苪J (*eA(m.m $mL D΍,L.M$ M.M͍. D.,$L΍ ̮ͥA  d.N%mL ΅ K.,nD$mL ΅ K.,nA$mL E썎K.,nD$mL E썎K.,n.eA(m.m  M.M͍L -m d, d DNA D  DKnA Č-Nl,m.͍d.NdO/d, Nn . L- d ĭ $ll펭 -ADD d.NE DD d$mL E썎K.,nD$mL E썎K.,n.D$mL E썎K.,nnA(m.m  $mL D΍,L.M D.,E.$̍ $n--A$̍ - / .lͮL$ M.,ͭ ME%&$̍ E M.M-AL -m d, DlͮLNA - $mL ΅ K.,nDnA - D diA - d﫭D- --eA DLĩML%&D D D DD  D,EDDD,eAd- nm.ͭ .eAAAEA'$m,l. ,ͭ $ L.쬭̍d-LĬm. Nl $ ͬA N.m-.m NLAAAA(m.͍lnn +lN 䨌J.m-.m .mLL΍,L.A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA DĩML.AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eAĮlL䨌J.m-.m NHM%mL D.eADN (m.͍lnn +lNH N e. 싮 N N.m-.m싮 N.%eAAA(m.͍lnn +lN 䨌J.m-.m A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA DĩML D D.,K+͍LnlnL΍,AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eA$lnLħ%$&eA$lnL ħDL.eAA D d- N*,n%mL d.N D dDDDDD dDDD.%eAĩML d- nm.ͭ EDd,D,eAA$ E.,K+͍LnlnL΍,dADN d.N. A䨌J.m-.m .mLL΍,L.A$mL N.m-.m싮 ND,A- Ō-n%%$%$%&䨌J.m-.m .mLL΍,L.A$mL N.m-.m싮 ND.%%eAm dADN d.N. A䨌J.m-.m .mLL΍,L.A$mL N.m-.m싮 ND.A- Ō-n%%$%$%&䨌J.m-.m .mLL΍,L.A$mL N.m-.m싮 ND,%%eAAAA(m.͍lnn +lN 䨌J.m-.mm A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA DĩMLk.AaAĩMLd.. $mL E썎K.,nDnAĩMLdm. e.N- %d.. Dd.. &%eADN 䨌J.m-.m .mLL΍,L.A$mL N.m-.m싮 NDk.DAdm e.. D$mL e+-LK.,nD.Ad.. D$mL e+-LK.,nD.Akdm. -eAAA (m.mͩ,Ll.mLL΍,L.% %mL *L.Ln.$mL A DĩMLD D.,K+͍LnlnL΍,AaA$ E.,K+͍LnlnL΍,dADN (m.mM荎-mLL΍,L.%mL D.eAm dADN (m.m .mLL΍,L.%mL D.eAAAA!ɉ)ɩ$ͮLnl-,팭 D*,, +-l̨m. ũMLĭ.AaA$ͮLnl-,팭 d d%D* DdN.eADN d D%dĭDĭ.eAAA-N䨌) +-llmnũML,eAAa$ A!ɉ)ɩČ-) +-l̨m.͍(.L(O*,, ũMLĩMLĭ.AaADN ) +-l̨m.͍(.L(O*,, .-M Ō-娌) +-llmn,Eƥ%%ƥ&䨌) +-llmnEF,Eƥ%%ƥ&%ĭ.eAŌ-d DD% D,Ed D,e-m$mdm.̍.̍AŌ--l $d D DD Dĭn-m$mL dmn%d D,dED,Eŭ,l -m d, D N. D,e%ƥ&AEN d -lLe.N-l,%e%ƥ&AAA͍-MD̬LmAnN%L/M%'F&'̬A d* )dj(H* +)hĨi*iAeIʩd +)ii + +)hA!ɉ)ɩ$ͮLnl-,팭 ) +-llMέl +-mmΨm. ũMLĩMLĭ.AaA$ͮLnl-,팭 d dD* DdN.D% D,Ed D,eAČ--l $d D DD DĭnADN d D%dĭDĭ.-lLe.N-l,%e%ƥAAŬ H., -l Ĭm.ͭA!ɉ)ɩ$ͮLnl-,팭 ) +-lH.,ͨm. ũMLĩMLĭ.AaAČ-$ - $fA$ͮLnl-,팭 d dD* DdN.D% D,ed$ -L%dDF D,%eAČ--l $d D DD DĭnADN d D%d$ -LŭDĭ.-lLe.N-l,%e%ƥAANelNmM̅EN-EiHeEiHeE̬AE - Ĭm.ͭA!ɉ)ɩ$ͮLnl-,팭 ) +-lL -̨m. ũMLĩMLĭ.AaA$ͮLnl-,팭 d dD* DdN.D% D,Ed D,eAČ--l $d D DD DĭnADN d D%dĭDĭ.-lLe.N-l,%dLŭN%F* DdN.eAAAa̍,ͬA!ɉ)ɩČ-d*̬ ũML$ĩMLD,dON $ $%D,DfA!ɉ)ɩČ-N䨌) +-llmnũMLĩML, .AaADN Č-N%d DDD,Ee*̬ , NED% D,Ed D,$%ƥ&eAAA!ɉ)ɩČ-N䨌) +-llmnũML,dDN 䨌) +-llmn$&eAA!ɉ)ɩČ-) +-l̨m.͍(.L(O*,, .-M Ō-- -lkmnĩMLĭ.AaAČ-M.L -l - -lkmnd- -lkmn%Oŭn-m$m$L dmn%d D,dED,Eŭ,l -m d, D N. D,e%ƥ&AČ-D,ll.L -l - -lkmnEd- -lkmnNŭn-m$m$L dmn%d D,dED,Eŭ,l -m d, D N. D,e%ƥ&ADN M.L -l%ƥ&dE,ll.L -l%ƥ&e%$m,lL- Dn -lLe.N-l,%M-lL-lLEn.N-l, K,fAAAA!ɉ)ɩD*,-ml +lN 䨌 +-lL*,-m .-M Ō-- -lkmnA$IN.,-ml +lN dn,L.팥A$IN.,-ml +lN d.팭-kn,L.팥AĩMLĭ.AaADN en,L. dd.팭-kn,L. DA) +-l̨m.͍(.L(O*,, .-M - -lkmnĭ.%DD*,, +-l̨m. ŭ.eAAA!ɉ)ɩD*,-ml +lN 䨌 +-lL*,-m % %mL *L.Ln.$mL A$IN.,-ml +lN dn,L.팥A$IN.,-ml +lN d.팭-kn,L.팥AĩMLĭ.AaADN 䨌 +-lL*,-m .-M %mL Υ- -lkmndn,L.d.팭-kn,L.ĭ.eAAA!IN.,-ml +lN 䨌.IN.,-m A$ %mL *L.Ln.$mL A$ %IN.,-m N,$MN.,-m싮 NA DĩMLk.eAAlL䨌.IN.,-m NHMn +% %mL *L.Ln.$mL A DĩMLk.AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eA$lnLkħ%k$&eAĩMLKE$mL E썎K.,n.A%mL ΅ K.,n$mL E썎K.,n.eAĩML﫭kkDƥdƥfADN ĮlL娌 NlMH-N* 﫭k$IJ*()i苪J* +)A䨌 NlMH-N* K$IJ*()i苪J (*%eAAAEA· + $ͮLn - . 썍n$,--OAAAA- 䨌NnH-IN.,-m N% %mL *L.Ln.$mL A$ ŮlL&Ύ䩊 +-D䩊 +ũML.k.AaA$lnLħ$&eA$lnL%ħ%$&eAĩML﫭k䨌-N*H NlM $IJ*()i苪J* +)eAĩMLK䨌-N*H NlM %$IJ*()i苪J (*eAD$mL E썎K.,ndAKD%mL ΅ K.,n$mL E썎K.,n.eAkd- nm.ͭ ED﫭k$&eAAEA$G$MN.,-mmNćmƧAA· +-mm l Nl Nl d, 䬌 L΍ $MN.,-mA. $ d.팭 N mNAAAA!IN.,-ml +lN 䨌.IN.,-m A$ %mL *L.Ln.$mL A$ %IN.,-m N,$MN.,-m싮 NA DĩMLk.AaAĮlL䨌.IN.,-m NHMn +%mL Dk.eADN $IN.,-ml +lNH N e. 싮 N %MN.,-m싮 N.%eAAAE̍L. .LA(m.͍lnn +lN 䨌N. -l*팭)lj,L.l A(m.͍lnn +lN N. -)ľ$ Ůl&dn,L.,AaA$LL.,m,--md, ĭ̮LD ĭ,.ͮDD΍, LNMnd, NnA-̬lMd,m,̍-dM.D.,oΥADN en,L.- en,L.$,%D N. -)llE.L) E.LD.L*eAAA!IN.,-ml +lN 䨌N. -l*팭)lj,L.h +A(m.͍lnn +lN N. -)ľ$ Ůl&dn,L.,AaADN $IN.,-ml +lNH N en,L.,D䨌N. -l*팭)lj,L.l N. -)ľdn,L.,eAA(m.͍lnn +lN 䨌N. -l*팭)lj,L.llmA$ %mL *L.Ln.$mL .AaADN %mL E.,, kn,L.$mL Υ-kn,L./DA%mL Υ-kn,L. $mL E.,, kn,L.,eem.̍AAAa$͌ dI(ɩkj(H*苪JhA!IN.,-ml +lN 䨌N. -l*팭)lj,L. A$ %mL *L.Ln.$mL $ Ůl&dn,L.,AaADN 䨌N. -l*팭)lj,L.h +娌N. -l*팭)lj,L.llm%mL .dn,L.,eAAAa̍,ͬAAEA d,  DN.̮ $  dn,L. d ͭ̍nE*,, d. Aan,L. ͭ d.$̍ d.팭 ) dn,L.  Ld.,. A썍. Ĭm.͍D,l ͭA' M̬Gdd.팭kn,L.mNćg썬稌nj,L.e썬̇% -m,Aa d썬 L$m, n. d,m g썬稌nj,L.e썬̇A-l dN - N dM,-ld .. $md-L D  mnA! g썬gn,L.싮 Ne썬$̍Ag썬g.팭-kn,L.싮 Ne썬'EAAAAa,ͭ dj)h J*Hk +I *H +%&F%F%Aa,ͭ dj)h J*Hk +I *Hk* +ej)h J*Hk +I *HJej)h J*Hk +I *H*A-dn,L.(mj Ō-Č-N,m N .Ln,dON d.Ne.N. L,m N .Lnd,m N .Ln%/%eA-dn,L.(mjk Ō-Č-N,m N .Ln,dON dn,L.(mj L%,m N .Ln,e, LA-dn,L.(mj Ō-Č-,m N .Ln,AaAČ-dM(mj d.N. L,m N .Lnd,m N .Ln%/eAČ-(mj d.N. L,m N .LnEd,m N .Ln.eADN d.NeM(mj dj)h J*Hk +I *Hk* +dM(mj D(mj,eAA-dn,L.j(mk Ō-n Č-,m N .Ln,AaAČ-n n Kn +eADN &Fn dj)h J*Hk +I *Hk* +n,m N .Ln%/,m N .LnDn,m N .Ln.,m N .LnE/eAAAa,ͭ dj)hHk +*h *H +A-dn,L..Nj Ō-.N+AaAEN $lm.N+E%*)d$fADN dj)hHk +*h *H +d.N dj)hHk +*h *H +D%ej)hHk +*h *H*%E.NkAA-dn,L.n*N Ō-n,+AaAEN dm*In,%&%eAČ-N- +n,gj)hHk +*h *H +Č-N%ej)hHk +*h *H*%&DČ-N%%ej)hHk +*h *H*%%%ej)hHk +*h *H*%&%eADN n,K- d- %oAAAlLdM묌 N .Lkn,L.n Ō-Č-,mČ-NdM,mn,AaADN Č-Nen,L.(mj ,mdM,mn,dn,L..Nj .%eAAAlL묌 N .Lkn,L.n Ō-Č-,mČ-,mn,AaADN Č-Nen,L.(mj ,m,mn,dn,L..Nj .%eAAA(m.͍lnn +lN 䨌J .LJ.m-.m +A$ J.m-.m N,N .LN.m-.m싮 NAĮlL.AaADN (m.͍lnn +lNH N e. 싮 N N .LN.m-.m싮 N.%eAAA- d . lj,L.,N A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA$͍d* l΍A D$ (Ml.-.(M$ (Ml.-d΍(MA䩊 +%IN.,-ml +lN-䩊 +(m.͍lnn +lN-.mj,.h.&AaAĩML.(MEĭ.(Md΍(M.kd΍(MEoAd ĭ $͍Lnl. . $mL ML΍AD D.,/ɍLnlH΍ D*,/ɍLnlnH΍ %mL D.eA ) (m.mͩ,Ll.mLL΍,L.%mL DD.,/ɍLnlH΍,eA ) e* l΍nAAD*,-Ln  $mL $͍L. .m, A $IN.,-ml +lN ƌƌ,eA.mj,.h.(m.͍lnn +lN &eA(m.͍lnn +lN M (m.͍lnn +lN %%%&eA lAM%͍$ f$ d* l΍nde%-AdA % d* l΍$ &ƥF D oA dnA D d- N*,n%mL d.N D dDDDDD dDDD.%eAĩMLk d- nm.ͭ EDkd Dĭ.D,eAA(m.͍lnn +lN dn,L. .m.mAd* , %mL D%mL E썎K.,nm.. &dn,L. .m.-eA .m. -  .m.͍dn,L.,e D dN $L ̭L,dmL..ͮAA(m.͍lnn +lN d. J.m-.m   .m. D.eA(m.͍lnn +lN N.m-.mm 䨌J.m-.mm %mL N.m-.m싮 NDk,eAAČ-nd +N.m-.mm Ddn,L.lAd d- D$NLmN,eE&-o.m,-E,l-,N.mE̍L.%ͭLmN,AČ-nd*͍e +d +Dd. J.m-.m, .m.m$͍L. $  dNN̍d d쬭̍A dM Dd*͍n$ll- $̍ $m .l $͍ $ll΍ N.m-.m L N.nd nAA + n.  LdL. $ll- $ d.L. MLdL. DnD 'M$ dL. dͮL̥AʍL N d,m,̍.mj,.h.d, L-LL$̍ nDl$ DLm .m.mΥA + ., , -$m n $ N L$--.m, $͍L.. $lN m $ d- D NLmN,eE&-o.m,-E,l-,N.mE̍L.%ͭLmN,A̮L$$mmn.M ,m.L $l$d, $m Mn n. d. LdL. d M   ML + Dl  MLn-l$ D,-d͍N.M.ͥAČ-ni +dn,L.lAČ-ni*͍i +i +Dd. J.m-.m, .m.mA.mj,.h.dM Di*͍nAAM M Ne. J.m-.mlAA +-l Ĭm.mAdmČ--M +-l $D*)eAI-M +-llAA$ E.,/ɍLnlH΍,AdA$hl΍MDm -   ,LA D $mL E썎K.,nnA ) oAĩMLk d- nm.ͭ EDkd Dĭ.D,eAČ-nN.m-.mm 䨌J.m-.mm A$mL N.m-.m싮 NDk,eAAĮllL΍M- M--M Ō-nE.d.(MD,eAdmČ-ĉ썎 d.N. L΍M-d΍(M.%eA dN.m-.mm DM Dĉ썎 D$mL L΍+M *iAAAAa$ d +)))HA $L.,m,--$mL,l d-M D.,oL dlA!ɉ)ɩČ-,-m +-Hm +-펪L Ō-d.eON dNenAa̍,ͬAA!ɉ)ɩ$IN.,-ml +lN d lj,L.M.IN.,-m A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA$͍d* l΍A D$ (Ml.-.(M$ (Ml.-d΍(M.AaAĩML.(MEĭ.(Md΍(M.kd΍(MEoAAd ĭ $͍Lnl. . $mL ML΍A ) (m.mͩ,Ll.mLL΍,L.%mL DD*,/ɍLnlnH΍ %mL D.%eA ) e* l΍nAAD*,-Ln  $mL $͍L. .m, A$IN.,-ml +lN $IN.,-ml +lN ƌƌ,eAČ-nM (m.͍lnn +lN %%%&eAĩMLD*,, +-l* D*,, +-l̨m. ŭ.eAĩML) +-l* D*,, +-l*L) +-l̨m.͍(.L(O*,, .-M %mL Υ- -lkmnĭ.eA lAM%͍$ f$ d* l΍nde%-AdA % d* l΍$ &ƥF D oA dnA D d- N*,n%mL d.N D dDDDDD dDDD.%eAĩMLk d- nm.ͭ EDkd Dĭ.D,eAA,m* LH, d* ,ͨ %mL D%mL E썎K.,nm.. &%eAAdmČ-nd* .m,  ,ͥ .m. DnAdmČ-nd. J.m-.m  e* .m, -eAAČ-nN.m-.mm 䨌J.m-.mm $mL N.m-.m싮 NDk,eAAd$ d +)))HA(Mn.. ., d-AČ-d-䬌n +-Ō-n&Dk,eAN.m-.mm D,-m +-Hm +-펪L e-.eAd̍,ͬAČ-n +-l*lnj,L. ,en,L.) D) +-l* d,en,L.L*,DD*,, +-l*lAAČ-n.mj,L--m Č-n&eAM$ . dn,L. $l䮌AŌ-n.mj,L--m 䨌. lj,L. %mL . kn,L.+ N Dk,eAČ-nd +N.m-.mm D +-l*lnj,L. d.mj,L--m D,en,L.,eAAČ-nd*͍e +d +Dd. J.m-.m,,ͥ .m.m$͍L. $  dNN̍d d쬭̍A dM Dd*͍n$ll- $̍ $m .l $͍ $ll΍ N.m-.m L N.nd nAM M Ne. J.m-.mlAADN iAAA!IN.,-ml +lN d ,ɍ,Ml.IN.,-ml*팭 A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA DĩMLkA$͍d* kʉA$͍D*(k* kʉ*AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eA$lnLkħ%k$&eAAdm$팭 - . ĩMLe* kʉ*eAdm$팭 . . ĩMLe* kʉ*eAA$IN.,-ml +lN DlA$IN.,-ml +lN D. Lk..L쫭L L˭D. Lk..L쫭L L˭D. Lk..L쫭L L˭-eAĮll䭭,kĮlle.N%kDk.k.eAM%͍D fD d* kʉ +DfdeE-dA$팭 . ũMLE-dƥ&D.lAM%͍$ f$ DDd* kʉjde%-dA$팭 - ũML%-dƥ&D -mAĮll䭭, AĮllem--Dd. .,d. --Dd. .,dm.,%eAd-,팭 쭭, . D.,D - D.,Dd. .,DdNnAADldd lj,L.M.IN.,-m %mL N.m-.m싮 ND*(k* kʉD䭭,䭭,k.DA䭭,ED쭭, D$mL e-L+MN.,-mlAAADN DlnAAAA!IN.,-ml +lN 䨌. lj,L. % %mL *L.Ln.$mL $ . lj,L.팪 N,. kn,L.+ N A DĩML.AaAČ-.mj,L.팩Jldj)hꫩ* kj(H*+ +J kAČ-Nd.N. Ō-NNƥ dƥƌE$mL E썎K.,n.%mL ΅ K.,n$mL E썎K.,n.%%eAČ-N娌 NlMH-N* .mj,L.팩Jl.䨌 NlMH-N* %.mj,L.팩Jl.%eAADN $IN.,-ml +lNH N e. 싮 N . kn,L.+ N .%eAAAaNnd*팭lj,L.LlAaA$IN.,-ml +lN idj,L - --m,A$IN.,-ml +lN D.,-mnA(m.͍lnn +lN J.m-.mlJ.m-.m $ d % -ln.AoAA!ɉ)ɩd*팭lj,L.Ll$ɍL.lj,L--mi +A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA$ . lj,L.팪 N,. kn,L.+ N A$ m..-M m$ (Ml.-M(MĩMLd-l͍-Md-nAČ-d. l΍.-D .L.-Ll* l΍Č-ND.,)Ln )ͭ) o + +A DĩMLĩMLĭĩMLkAD D.,+͍LnlnL΍E*,/ɍLnlnH΍ %mL D.AČ-) ) $,AaAd*팭lj,L.LlDlnADl΅ DlE.,DlΥ- DlΥm$IN.,-ml +lN &eAČ-d.L,m.m fAd$ I*(k(K+k +*hADl΅J.m-.m (m.͍lnn +lN %%%&eAEndn- ,m.m DL $mL̥A%$m.-,ͭ D̍L$mL L d.l .-m,ͭlͥA%$mDnNnlDL$.-.$ dn d,lA$ E$mL ΅ K.,n.AdA DDNnA ,m.m +mLK΍,L.EAd.NEDDDDDd$mL ΅ K.,nD$mL ΅ K.,n.eA$ ,m.m +mLK΍,L.DL.dAd.L,m.m ,m.m +mLK΍,L.oAm dA$  .D.,l$͍Lnl $mL d. -DN ƥADN DlnAAAd̍,ͬAAd ĭ $͍Lnl. . $mL ML΍AČ-) (m.mͩ,Ll.mLL΍,L.%mL DD.,+͍LnlnL΍,d.L,m.mlA) - ) ) ) /eAAd* d΍AČ-d. l΍d. l΍.-mAČ-d. l΍ΈMd. l΍.-%fAČ-) ψM) oA$ .L.-Ll* l΍.AdAd. l΍LE.,)Ln )ͭ) o + +D.,)Ln )ͭ) o + +%d.N. ) O&&%eAd. l΍ΈMČMe. l΍.eA) ψM) Dd. l΍ΈMd. l΍nDln, )  -   -l̍.M d d쬭̍ΥAA +-l Ĭm.mAemĩML-M +-l $D*)eAĩMLD*,, +-l* D*,, +-l̨m. ŭ.eAĩML) +-l* D*,, +-l*L) +-l̨m.͍(.L(O*,, .-M %mL Υ- -lkmnĭ.eAAD*,-Ln  $mL $͍L. .m, A$IN.,-ml +lN $IN.,-ml +lN ƌƌ,eA(m.͍lnn +lN M (m.͍lnn +lN %%%&eAČ-lAČ-JfAdmČ-d. l쬭̍ +ƥlAČ-$n* l΍ΈM$e. l΍ΈMnAm.. dNM mM mnAMŌ-dƌ d. l΍N%n* l΍ΈMndldd$n* l΍ΈM.AdAČ-nA$ .L.-Ll* l΍.AdAČ-dDdnAČ-.dd$n* l΍ΈMnA -ͭ,L,mN.M. d. .-  D.̥A..D.fA)l $̍ .M d.l ,m.mlΥA) ψMDfA..$ ) D) ψMD.fAd.&Ee. l쬭̍jA.fAAmAdAČ-ĭ +) Dd.N. edd. l쬭̍J%n* l΍ΈM.eAĭ +nAĭjAA dd.L,m.mlA D d- N*,n%mL d*̬l*N D dDDDDD dDDD.%eAĩMLk d- nm.ͭ EDkd Dĭ.D,eAAʩjeNM m.eʩjM(M.eʩje-l.eAa$ d +)))HA(Mn.. ., d-Am.. dNM mM md dd-lN.DM(MnAČ-d-䬌n +-eNM mDk,eAa̍,ͬA,m* LH, d* ,ͨ %mL D%mL E썎K.,ndNM m.eAAdmČ-nd. .m,  ,ͥ .m. DnAdmČ-nd. J.m-.m  e. .m, -eAAČ-nN.m-.mm 䨌J.m-.mm $mL N.m-.m싮 NDk,eAAAʩjM m.eʩjM(M.eʩje-l.eAa$ d +)))HA(Mn.. ., d-AN.m-.mm D,-m +-Hm +-펪L e-.eAa̍,ͬAČ-n +-l*lnj,L. ,en,L.) D) +-l* d,en,L.L*,DD*,, +-l*lAA. dn,L. M. dn,L.AAČ-n.mj,L--m 䨌. lj,L. %mL . kn,L.+ N Dk,eAAd$ I*(k(K+k +*hd +)))HA.mj,L--m Dd-nAd̍,ͬAAČ-nd +N.m-.mm D +-l*lnj,L. d.mj,L--m D,en,L.,eAA + n.  LdL. $ll- $ d.L. MLdL. DnD 'M$ dL. dͮL̥AʍL N d,m,̍.mj,.h.d, L-LL$̍ nDl$ DLm .m.mΥA + ., , -$m n $ N L$--.m, $͍L.. $lN m $ d- D NLmN,eE&-o.m,-E,l-,N.mE̍L.%ͭLmN,A̮L$$mmn.M ,m.L $l$d, $m Mn n. d. LdL. d M   ML + Dl  MLn-l$ D,-d͍N.M.ͥAAd d- D$NLmN,eE&-o.m,-E,l-,N.mE̍L.%ͭLmN,AČ-nd*͍e +d +Dd. J.m-.m,,ͥ .m.m$͍L. $  dNN̍d d쬭̍A dM Dd*͍n$ll- $̍ $m .l $͍ $ll΍ N.m-.m L N.nd nAAČ-nD.,o +,en,L.L*,ON.m-.mmmAČ-nD.,o*͍E.,o +D.,o +Dd. J.m-.m,,ͥ .m.mADlE.,dM DD.,o*͍nAAČ-n-l +,en,L.)LN.m-.mmmAČ-n-l*͍-l +-l +Dd. J.m-.m,,ͥ .m.mADlΥ- dM D-l*͍nAAČ-nmn +.mj,L--m D,en,L.lAČ-nmn*͍mn +mn +Dd. J.m-.m,,ͥ .m.mADlΥmdM Dmn*͍nAAM M Ne. J.m-.mlAJnAAADl΅ iADl΅J.m-.m M nADN DlnAAA!IN.,-ml +lN d ,ɍ,Ml.IN.,-mi +A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA$ . lj,L.팪 N,m NA DĩMLk.AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eA$lnLkħ%k$&eAAdm$͍d* kʉ +gAdm$팭 - . ĩMLe* kʉ*eAdm$팭 . . ĩMLe* kʉ*eAA$IN.,-ml +lN DlA$IN.,-ml +lN D. Lk..L쫭L L˭D. Lk..L쫭L L˭D. Lk..L쫭L L˭-eAĮll䭭,kĮlle.N%kDk.k.eAM%͍D fD d* kʉ +DfdeE-dA$팭 . ũMLE-dƥ&D.lAM%͍$ f$ DDd* kʉjde%-dA$팭 - ũML%-dƥ&D -mAĮll䭭, AĮllem--Dd. .,d. --Dd. .,dm.,%eAd-,팭 쭭, . D.,D - D.,Dd. .,DdNnAAĩMLĭ孭,䭭,k.eAd*팭lj,L.Lldn$ɍL.lj,L--mi +A$mL AN.m-.m싮 NAm NAČ-n&Ō-n&e-nAdFNČ-N%Ɔ%&AD䭭,EĭkA,m,eADlddn΅ D䭭,ED쭭, D$mL e-L+MN.,-mlAAADN DlnAAAA!IN.,-ml +lN d ,ɍ,Ml.IN.,-m Ni +A$ %mL *L.Ln.$mL A$ J.m-.m N,N.m-.m싮 NA$ . lj,L.팪 N,m NA$ ŮlL&L.kM,AaA DnAĩMLknA䨌NnH-IN.,-m NA$mL L.kM ĮlL%IJ*()i苪J* +$IJ*()i苪J (*Dk.eAEN d ,ɍ,Ml.IN.,-ml*팭 %mL N.m-.m싮 NDkdFdF&eADN d ,ɍ,Ml.IN.,-mi +%mL AN.m-.m싮 Nm NDk.eAAAa̍,l #3B8pC #+Jsc#+ +k{C+++ã+K+sAccK#_L-%M}QaQUI}M%iM5(L-%M}QaQUI}M%iM4(PI9M5%QQ9 }QaQUI}M%i}%95(PI9M5%QQ9 }QaQUI}M%i}%94(хѥссPI9M5%QQ9 }QaQUI}]%Q!4(хѥссPI9M5%QQ9 }QaQUI}!%!Q4(5(хѥссL QQI%9}QaQUI}5U}M%i4(хѥссL QQI%9}QaQUI}9U}M%i4(хѥсс$II%9 }QaQUI}]%Q!4(хѥсс$II%9 }QaQUI}!%!Q4(хѥссL-%M}=AQ%5%iQ%=9}9U5}1eIM켼Յ̀́ͽܽɭ5(хѥссL-%M}5U1Q%A1}M QQI%9}AAI=a4(хѥссL-%M}1UQ}M%i}]4(хѥссL-%M}1UQ}M%i}!4(4(mjF.\shaders\include\atmosphere\transmittance.hlsli|g$̍ $i + +HJ*i**i i)+iAa,ͭ $i + +HJ*i**i i)+i$AEEADd .O. e,D&H.m DHέͭAD$ D. nDlLή̥ADADD,mN.M. $̍ n $ dNn $̍ D,-L.Mm. M.AD,,m,.͍$L L- N. - 썍. d͍,.mAD$L NAD$D,mN.M.m dNn d썬 nD.,  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,LΥADDD,mN.M.m$ D,-L.M nD Nn  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,L$ ADm̍.. $̍ML-L.-mN. .  ,mN.M.ͥADdĩ,L -  d .O. 퍍LnM -l $nADd͍N.MMn-,D n ̍Mn MN퍮 NnnL.ͮ LAD-md͌.L .dl,,m N.MN. L-mn.ͥADAD +)i +dɈ*H$i +J*D( +d *K* +鉉Hj +$ȉdɉJ*IIj +D$h +$iJAD$ȉ$)  Jhj +I +$ )*HJ*ȉ*h$i(D + +)) +AD$ )*HJ*ȉ*h +Hj)ȉ*H()* $ȉ(ʩhj +I +$*H*i)H +J +iAD$H(ij)($ Ȫȉ +d +) +d *K* +ʩH +I +dɉJ*IIj +DAD))HI +$) (Ih$ɉ(Ih$i(ȉ*d +h() )H*IADdi(ȉ*) ()h +%i(D + +))JiJȉ +ɨADdJh*h +I +dH*ihjij +j(*I +J(jjI +Dj*ɩhjAD$ɉHJ +*)ȪH +d(j$ȉ $) +I* ))H()* + +H +$ɩADdɉJ*hdJ*i +))H()*I +I +%i(ĩ)iI + +H*i(AD$H*i*$ $) *( 䩊 + +j +)i +dɈ*HȪ $$*iɨAD +ij*I()* dj ()ȥADADJl $mL.m dj,L.ADd .O. e,D$I*)AD$ D. nDlLή̥ADADD,mN.M. $̍ n $ dNn $̍ D,-L.Mm. M.AD,,m,.͍$L L- N. - 썍. d͍,.mAD$L NAD$D,mN.M.m dNn d썬 nD.,  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,LΥADDD,mN.M.m$ D,-L.M nD Nn  $Lͮ d .O. AD.m-m-m d͍,.m$̍  썍. ,mn-,L$ ADm̍.. $̍ML-L.-mN. .  ,mN.M.ͥADdĩ,L -  d .O. 퍍LnM -l $nADd͍N.MMn-,D n ̍Mn MN퍮 NnnL.ͮ LAD-md͌.L .dl,,m N.MN. L-mn.ͥADAD +)i +dɈ*H$i +J*D( +d *K* +鉉Hj +$ȉdɉJ*IIj +D$h +$iJAD$ȉ$)  Jhj +I +$ )*HJ*ȉ*h$i(D + +)) +AD$ )*HJ*ȉ*h +Hj)ȉ*H()* $ȉ(ʩhj +I +$*H*i)H +J +iAD$H(ij)($ Ȫȉ +d +) +d *K* +ʩH +I +dɉJ*IIj +DAD))HI +$) (Ih$ɉ(Ih$i(ȉ*d +h() )H*IADdi(ȉ*) ()h +%i(D + +))JiJȉ +ɨADdJh*h +I +dH*ihjij +j(*I +J(jjI +Dj*ɩhjAD$ɉHJ +*)ȪH +d(j$ȉ $) +I* ))H()* + +H +$ɩADdɉJ*hdJ*i +))H()*I +I +%i(ĩ)iI + +H*i(AD$H*i*$ $) *( 䩊 + +j +)i +dɈ*HȪ $$*iɨAD +ij*I()* dj ()ȥADAAa$m D$mL+mL .L.mm-MAAEA· +,n  썍. .-.Ĭm.m $- )i Č-. -͍A.ld- -䭎n. ,MM.m, D΍lNAAA!ɉ)ɩĩMLd- nm.ͭ ũML.dADN d- ĩML%&ĩML%&%eAAA!ɉ)ɩ d- (m.m  ,dADN - DL.eAAA!ɉ)ɩ d- N*,n% %mL *L.Ln.$mL  D.dADN d- E$mL E썎K.,n$mL ΅ K.,n.eAAA!ɉ)ɩ d*̬l*N%H, $,dADN d.N- %DM&%eAAAEAm$GN.m-.mLćJ.m-.mmƧAA'h - N.̮mL $ -͍K  $ -͍K,$  $mL A!$m.L.--$LlMN $̍ dn,L 䭎 $n$-.- ,Ml. Dl,n ͬA $,M퍭ll$̍  $Lm .L.ml +n - $LN.. $K,A!m͍-$ L.l.  - L K $̍ -mL.l.͍-m ̍lͭA.̮$md, A' M̬GnN.m- ,-M.m-J.m-.mLćN.m-.m% +A썍. dl.mlnL.M  d $ dM $$ $ Nl A N$̍  D, $D,llͥAA$GN.m-.mk ..Mg ..͍ƧAAMd$-̭ -͍nK K,$̍ KL$m.  $mL $ -mAML N.m-.m D K $̍ KL$m Nn AN.m-.m D K $̍ K,$̍ D K,$̍ KL$ɭA.L.m-L N.m-.m D K $̍ K,$m N.m-.mAA K $̍  ĭ,Ll$͍Lnl. K,  -ͬ-ͭ dK K,.A.  MD썎 $mL D΍,L.,. D, N.m-.m D̭AK,$̍ K,M$  d쬭̍dK K,$͍Lnln L΍,EAAg .GdO, G$&OħAg. .G elnNć'dk(*hAd,Mn d,MdfdNmLͭlA. d,MͭldNmLdfA d͍e.ML$o͍e.LM-m͍,--Od*mnAŮlMd͍, ND썍lAˇe.̧A. G E$ $dFŧA. G %&$ FF$dFŧA. G $%&eFŧA. G $%%fFŧA. G $$ƦefFŧA. G $%$%$%$%FŧA. G $%$%$%$%FŧA. G $dFŧA. G $%&dFŧA. G $%Fd.GdNm,l-LN.,OEfGŧA. G $FŧA. G $%FŧA. G $E$ DE$DEFd.GdNm,l-LN.,OEfGŧA. G $%&FŧA. G Df%FŧA. G $Ʀ%FFŧAg,Mn d G$Fd,G$&FDGDƥFŧAg,Mn d G$Fd,GFDGDƥFŧAg,Mn d GdFFd,GDFDGDƥFŧAg,Mn d GDFd,GdFDGDƥFŧA G$F$GFd-lnGĮlMN煮 ΧA GDƦF$GFd-lnGĮlMN'煮 ΧA GdFF$G$Fd-lnGĮlMN'煮 ΧA G$F$G$Fd-lnGĮlMN煮 ΧA G$F$G$FFG煮 ΧA G$F$GDFgm'煮 ΧA GDF$G$F煮 ΧA G$F$G$FFG煮 ΧAȩAA'm N.m-.m D K $̍ K,$̍ D K,$̍ K A!L  d. +n d  N.m-.m D $LN,N.L.-͍n$A!md,m,̍ d N.m-.m D $ -͍K $  $mL A!̍ -͍nK,  $mL D΍,L. +-mN.m-.m ̍lͭA͍- .L.Ln-m d, D .l $l D.,nD˪LKK ˪L$̍A dm.ͭ  D.D- $팭LAKK k썎K K,˪LKK ˪L˪LK K,˪L d $䮬A,Mnĭ d   ˪LK K,˪L$̍ ĭ ḓA d쬭̍dK K,$͍Lnln L΍̥AAƇ(m.m  $mL D΍,L.ƧAA'-͍$,m.m L K $ dK K,--ldM,-lAdk.Nn/KDnˋ m d..L M $mKfEFlEKĥA +nD,,-. K, -̮A˪LK K,˪LKfEF˪LK K,˪LnEKGk-Mm KAL -m n   ˪LK K,˪LDAAAA!ɉ)ɩ (m.m .mLL΍,L.% %mL *L.Ln.$mL A DĩML.dA$lnLE$mL ΅ K.,n.eA$lnLħ%$&eA$H, ,mnL.--̍DDDDD$&dA$mL ΅ K.,nD$mL ΅ K.,nnADN d- (m.m EDdd*̬l*N,mnL.--̍.%eAAA!ɉ)ɩ (m.mm꭭,mLL΍,L. DĩML D.,n.dA$ ED.,n.ADN fA$lnLħ%$&eA$H, ,mnL.--̍DDDDD$&dAD.,nDD.,nnADN d- (m.m EDdd*̬l*N,mnL.--̍.%eAAAEA . $m ĭ$  Ldl.m ,m.m  D썎A!mL D΍,L.-m d, D d $ $ d.--L.,-md썬 $lnlA-dK K,-$͍Lnln L΍,EAAAA!ɉ)ɩ (m.mM荎-mLL΍,L.% %mL *L.Ln.$mL A DĩML.dA$lnLEħ$mL E썎K.,n.eA$lnLħ%$&eA$H, ,mnL.--̍DDDDD$&dA$mL E썎K.,nD$mL E썎K.,nnADN d- (m.m EDd*̬l*N,mnL.--̍.%eAAAEN %$ -A!ɉ)ɩ (m.mM荎-mLL΍,L.o*̭ % %mL *L.Ln.$mL A DĩML.AaA$lnLħ%$&eA$H, ,mnL.--̍DDDDD$&dA$mL E썎K.,nD$mL E썎K.,nnADN ,mnL.--̍ħEDd.N,mnL.--̍.%D%DL.eAAAEA'ɍLnl.m.  L΍ƧAA· + d쬭̍dK K,$͍Lnln L΍ ̭AKfEFlEKGk-MmO썎K-l$ d. .  +-mAA,.Ml ,mnL.--̍DKK%&eEk-MmO썎K D m..ͮAL -m n  썍. Ĭm.MAAAA!ɉ)ɩD D*,/ɍLnlnH΍ % %mL *L.Ln.$mL A DĩML.dA$lnLEħ$mL E썎K.,n.eA$lnLħ%$&eADN DDDDD$&dA$mL E썎K.,nD$mL E썎K.,nħDMfAAAEAƇJ.m-.m  $mL D΍,L.ƧAA d, d  N.m-.m D K $̍ K,H $nA,-. $̍ A' M̬GnN.m- ,-M.m-EL)ML-NGL)ML-%̇A-m$ͮl $͍L.  ĭMLm.. $,M퍭ll$ Aa쬭̍dK K,$l䮌 $l $͍L.  ĭMLm.. $LmmA!̍  $͍L.  ĭMLm.. $,M퍭ll-$LlMN - AMͭ,$  d. d쬭̍ +l d$͍L.m-̮  d. M $̍A  d쬭̍dK K,l$͍Lnl L΍,d, D d AL.m,-.     썍. $/--L.Ĭm. n.  'AM̬GnN.m- ,-M.m-J. L-,KLćN. L-, D%'EAAAA!ɉ)ɩĩML䨌)m..% %mL *L.Ln.$mL  $.,dAEN d.N. %mL Υ-심m..+. L D$.,%eM NADN d.N. %mL Υ-심m..+. L D$.,%Ad%mL Υ-LkN Dd.N. %mL Υ-L括m..+. L D- ƅ$.%mL Υ-L+.,%%eM NAAA!ɉ)ɩĩML䨌N*,m..% %mL *L.Ln.$mL  $.,dADN d.N. %mL E.,, 틬m..+. L D$.,%e NAAA!ɉ)ɩĩML䨌.Hlm..% %mL *L.Ln.$mL  $.,dADN d.N. %. $mL %LlM.틬m..- +A$mL %LlM.틬m..-ͭ,LL D$. d$mL %LlM.틬m..-ͭ,LL %OA$mL %LlM.틬m..-ͭ,LL-D$. d$mL %LlM.틬m..-ͭ,LL-%/eAAAaNn,m* LHAaA(m.͍lnn +lN dn,L.lA(m.͍lnn +lN .m.mAA(m.͍lnn +lN dn,L.)lA(m.͍lnn +lN dn,L.L*,oAoAA!ɉ)ɩ,m* LHd* ,ͨ % %mL *L.Ln.$mL  $.$ m..-M m.M m$mMLN.mlAaAʩjM m.eAĩMLm..) 䨌)m..%mL $.,eAĩMLm..O*,䨌N*,m..%mL $.,eAĩMLm../Hl䨌.Hlm..%mL $.,eAA,m* LHdnAAden,L.) m..) D$mL Υ-kn,L.lAden,L.L*,m..O*,D$mL E.,, kn,L.lAdΥ .m. m..) D$mL Υ- .m. dden,L.L*,dm../HlD$mL %LlM. .m.mA(m.͍lnn +lN mnj,L. (m.͍lnn +lN &eAd$ djkj)hA䬌nj-lnn een,L.)den,L.L*,mnj,L.dΥ .m.͍$.M m.eM$ , -l Ad̍,ͬAden,L. den,L.) dden,L.L*,dmnj,L.lADN dnAAA!ɉ)ɩ- d* , % %mL *L.Ln.$mL  $.$ m..-M mA䩊 +(m.͍lnn +lN-dn,L.䩊 +(m.͍lnn +lN- .m.-AaA,m* LH, d* ,ͨ %mL $.M m.eAdn,L. ,en,L.lA .m. ,ͥ .m.mAAEA* -mĬm.  N.m-.m D K $̍ K,$m,l.Aa  d͍.ͭ $ln - d쬭̍l$͍Lnl L΍,EAAAA!ɉ)ɩ(m.͍lnn +lN d J.m-.m .mLL΍,L.A$ %mL *L.Ln.$mL  DĩML - (m$͍d* kʉA$ m..-M m$ (Ml.-M(M͍-Mdn A$AaA$lnLEħ$mL E썎K.,nD$mL ΅ K.,n.eA$lnLħ%$&eAA ,m- - (m(m.m .mLL΍,L.%mL D.%eA ,mĩMLe* kʉ*eA$ɍL.. ΥA̭L.m MnmM$-,A(m.͍lnn +lN d. lj,L.d. .m.mAd* , %mL D$mL E썎K.,nM md. lj,L.d. .m.-eA(m.͍lnn +lN .m. d. .m.MƥfAM%͍$ $f$ d* kʉjde%-AdA + ĩML%-D oA(m.m D  dNN̍d. -͍$̍  -̭d̍LΥA D+ d.N+ D+ dDDDDD+ dDDD.eAd* , %mL D+ $mL E썎K.,nM mdM(MN+d. lj,L.d. .m.-eA .m. dd. .m.mAAd* , %mL d.N,mD,mdDDDDD,mdDDD.$mL E썎K.,nM mdM(MN,mAd. lj,L.d. .m.-eA .m. dd. .m.MƥfADN  O .m.-eAAAEA$GN.m-.m Nl ..MJl ..͍ƧAA· + $Lͮ Ĭm. $m$. dm- ..$̍ $  ...m$LA d d.팭 $̍ . dn,L.M---mĬm.ͭA ̍l ͍- .L.Ln$̍ $m$. dd d, Nl $$ $Aa- D N .-M $n...ͥAAM-m ĭ $ - . D  Ĭm. .L.LnE.$̍ A N dM,-l.$̍ .mŮLn.Dl,n l .L.Ln 퍮A-̮  d. -n$̍ D. .l$ȍ ̮ $ $.l d,ldM. $Am. ČL  d %$͍L. $ $ N d.M č d. Am. $ƥō$ƥōŭƥ&ōDl,n N d. l$L $A d̍L m +LM-m N  ͍-,ͮ n N. -Am. .l$ -, D΍,L.l$̍ $$ $- -m ĭA dM &$ d̍L $̍ %&$ d̍L Aĭ% +-md, D ͭ .  썍. - . L .l$ d %A N dM,-l$ d ƥō%ƥŭ$̍ $n$ͮLnLAAAa̍,l#96pC #+Jsc#+c++#{KsbK;CsAccK##include "shader_defines.h" +#include "shader_global.hlsli" +#include "pbr.hlsli" +#include "ColorSpaceUtility.hlsl" +#include "shader_global.hlsli" +#include "atmosphere/functions.hlsli" +#include "punctualLightsMath.hlsli" + +#define TEX_ID_MULTIPLIER (1 << 5) +#define MAX_OMNI_LIGHTS 256 +#define MAX_SPOT_LIGHTS 256 + +#define DYNAMIC_LIGHTS_SSS 1 +#define LAMBERT_LIGHT 1 +#define DYNAMIC_LIGHTS_EARLY_EXIT 1 + +struct RenderOmniLight +{ + float4 posRadius; + float4 colorFlags; + float4 direction__tex_scale; + float4 boxR0; + float4 boxR1; + float4 boxR2; + float4 posRelToOrigin_cullRadius; +}; + +struct RenderSpotLight +{ + float4 lightPosRadius; + float4 lightColorAngleScale; //AngleScale sign bit contains contact_shadow bit + float4 lightDirectionAngleOffset; + float4 texId_scale; +}; + +GLOBAL_CBUFFER(LightConstBuffer) : register(b0) +{ + float4x4 mvp; + float4x4 globtm_inv; + float4 screen_pos_to_texcoord; + float4 world_view_pos; +}; + + +/* TODO: support Photometry +Texture2DArray photometry_textures_tex : register(t4); +SamplerState photometry_textures_tex_samplerstate : register(s4); +*/ + + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +/* TODO: support Photometry +half2 getPhotometryTexCoords(half3 lightDir, half3 dir, float zoom, bool rotate) +{ + half3 side = abs(lightDir.x) < 0.707106781186548 + ? half3(1, 0, 0) + : half3(0, 0, 1); + half3 forward = normalize(cross(side, lightDir)); + side = cross(lightDir, forward); +#if USE_OCTAHEDRAL_MAPPING + half2 tc = octahedral_mapping(half3(dot(side, dir), dot(lightDir, dir), dot(forward, dir)), zoom, rotate); +#else + half phi = atan2(dot(forward, dir), dot(side, dir)); + half2 tc = half2(phi / (2 * M_PI), acosFast4(dot(lightDir, dir)) / M_PI * zoom); +#endif + return tc; +} + +float getPhotometryValue(float3 light_dir, float3 dir, float zoom, bool rotated, float texId) +{ + half2 tc = getPhotometryTexCoords(light_dir, dir, zoom, rotated); + BRANCH + if (any(or(tc < 0, tc > 1))) + return 0; + float3 photometry = tex3Dlod( + photometry_textures_tex, + half4(tc, texId, 0)).rgb; + return SRGBToLinear_Fast(photometry.r).r; +} +*/ + +half applyPhotometryIntensity(float3 lightToWorldDir, float3 lightDir, float texId, float texScale_rotation, float currentAttenuation) +{ + return currentAttenuation; +// ##if photometry_textures_tex != NULL +// ##if photometry_textures_tex != NULL + //bool rotated = texScale_rotation < 0; + //float zoom = abs(texScale_rotation); + // BRANCH + //if (texId < 0 || currentAttenuation < 0.0001) + // return currentAttenuation; + //return getPhotometryValue(lightDir, lightToWorldDir, zoom, rotated, texId) * currentAttenuation; +// ##else +} + + +// from http://advances.realtimerendering.com/other/2016/naughty_dog/index.html +// http://advances.realtimerendering.com/other/2016/naughty_dog/NaughtyDog_TechArt_Final.pdf +half calc_micro_shadow(half NoL, half AO) +{ + return (half) saturate(abs(NoL) + half(2.0) * pow2(AO) - half(1.0)); +} + +float3x3 axis_matrix(float3 right, float3 up, float3 forward) +{ + float3 xaxis = right; + float3 yaxis = up; + float3 zaxis = forward; + return float3x3( + xaxis.x, yaxis.x, zaxis.x, + xaxis.y, yaxis.y, zaxis.y, + xaxis.z, yaxis.z, zaxis.z + ); +} + +float3 tangent_to_world(float3 vec, float3 tangentZ) +{ + float3 up = abs(tangentZ.z) < 0.999 ? float3(0, 0, 1) : float3(1, 0, 0); + float3 tangentX = normalize(cross(up, tangentZ)); + float3 tangentY = cross(tangentZ, tangentX); + return tangentX * vec.x + tangentY * vec.y + tangentZ * vec.z; +} + +float2 screen_pos_to_tc(float2 screen_pos) +{ + return screen_pos * screen_pos_to_texcoord.xy + screen_pos_to_texcoord.zw; +} +ҁ ZYW[Y[]\\]]S\S [MIsc#+1 C #+K;sAccKiPhPyyJs#{1{kAyys1{K+s{k{k{s+s{c{ #{yy{+r{+j{Ks;2{K+{s#3kP1c{ k{{C#J s+ A1c{  +##J s+c1c{ Is +#KIiPkP1c{ 1 { +##J s+QIs +#KiP1c{ k{{C3 +{ +Aq1i1 {Q1 {IiP+sk{{C3 +{Qk{{C3 +{iPkPhP1c{ 9+#J s+ A1c{ #Jc1c{ Is +#KIiPkP1c{  +s K{sCi C#JcqIIiP +s K{s +C +s K{sQk{{C#J s+ A#JcIs +#KIIiP+s +s K{siPkP1c{ 9+ r;c+ A1c{ q{k cK+#cJ;C*{c1c{ aK;C#Jc1c{ aK;C r;c+ c+a1c{ aK;C r;c+{23+KiPkPyyyrC+jPyy1c{ aK;C r;c+ c+q1yi Aq1cA{Krs+i{{+IIiPyy1c{ aK;C r;c+{23+i{{+Q s;c+ c+iPhP1c{ #!{AaK;C#Jaq{k cK+#cJ;C*{IiP1c{  +s K{s +A#QaK;C r;c+ c+YaK;C r;c+{23+IiPyyk{{CC+ sKK{skP+s +s K{sQ +s K{siPkPhPhPxy K;C!K[I !K[yK+s+#{ c ˛1 +C+aK3 +qiPxyzcK# s;c+y3 C++y K;C!K[IJAi{C+s#+# s;c+IIqiPxy+s#+# s;c+K;k  KsAy!K1{ C++kPxy s#K;k  sAy!K1{ K;C!K[kPxyKsJ;k KsC+s#+# s;c+IaIIAy!I1{ C++kPxy s#AyAY!II1{ !K[kPxy{B+ Iq{c k+#kP0c{ IcckKs s+C++{#J[A1c{ {B+ a1c{ KsJ;k IiPkP1c{ KsB+ Aq1i{B+ Q{B+ IiPhP1c{ IcckKs s+q1iPyyqz+1zcc{Ks;+I)K c+s{C+yK;Ks c1{kc qiPyyB++IC +IsC++{B+ AKsJ;k IaiPyy{B+ iAKsJ;k I s#)c+IIiPyyB+{y+ + s+i+;+Is{ {B+ Q{B+ KsJ;k kPyy s#Ks; +A{B+ IIs+ #qiPI3A{B+ Q{B+ KsJ;k IiPkPIcckKs s+KsJ;k Q +A{B+ IiPkP)c+kPkP1c{ Aq1yKsJ;k iq1Kyy1z !K[CKKkcK3{!ykP1c{ iQA{B+ yKsB+ IiP1c{ KsB+ KsB+ QAq1iQKiPIcckKs s+A{B+ Q {3 +AKiQKsB+ IQKsJ;k Y sAKsB+ yKiPIcckKs s+yJiPkP+si AIcckKs s+aq1KiPkPhP0c{ IcckKs s+C++ +s K{sA1c{ {c#szk cc1c{ !KzcJ;Cc1c{ aK;C +#Kc1c{ #JKiPkPyyC++) c K{skP1c{ {B+ c kA!{A{c#szk cc!KzcJ;CKaiqaqIyyb k{ {K#)#;+ +kPyy*q++#{++sC+yS++s+ Ks;Is{C+3 +kPyy s#+i {K#!KK#+aCC+q1kPhP1c{ cJ;C +#KaK;C +#KQaK;C +#KiP1c{ KsJ;k iKsCcJ;C +#Ky#Jcq1KiP1c{ IcckKs s+IcckKs s+C++{#J[A{B+ aKsJ;k IiP+sIcckKs s+iPkPhPhP0c{ IcckKs s+#J[ +s K{sA1c{ {c#szk cc1c{ !KzcJ;Cc1c{ c s+szk cc1c{ aK;C +#Kc1c{ #JKiPkPyy!J[) c K{skP1c{ {B+ !{A{c#szk cc!KzcJ;CKiP1c{ cJ;C +#KaK;C +#KQaK;C +#KiPyy!zq{a+C+3 ++s+ +C+aK;CkP1c{ KsJ;k cJ;C +#KyAcJ;C +#KYi AcJ;C +#Ka#JIIiPyyicKc +A!{Ac s+szk cai!KzcJ;CKI{++i C9{s#CqiP1c{ IcckKs s+IcckKs s+C++{#J[A{B+ aKsJ;k IQ +A!{Cc s+szk cai!KzcJ;CKIiP+sIcckKs s+iPkPhP{K#{bK;C kC1c{ {c#zc1c{ { +s# #Kc1c{ aK;C"K+K{sc1c{ aK;C r;c+ c+c1c{ aK;C r;c+{23+cyA c39+{k +s K{scy1c{ !K3{kcJ;Ccy1c{ {KsaK;CKiPkP{KsaK;C{ +s# #Ksk{c#zsiP1c{ !K3{kcJ;C!{C{KsaK;Cc{KsaK;CKiP1c{ #J3{kcJ;CCqY!K3{kcJ;CKiP!K3{kcJ;C{KsaK;CS#J3{kcJ;CiP1c{ Is +#C{A{ +s# #KsKIiPiP9+{k +s K{s9+#J s+ C!K3{kcJ;CcIs +#IiP9+{k +s K{s9+{k +s K{sS9+ r;c+ Ai!K3{kcJ;CcaK;C"K+K{scaK;C r;c+ c+caK;C r;c+{23+KiPkPhP@ c3 + C++szk cK K{sC1c{ a+sc1c{ aK;CJ+c1c{ iIiPkPyyzk+C+q{k cK K{s1 {siPyyqz+QKs;C++q{k cK K{sA{#{{k+KC{+!K[{c s+q{k cK K{sKiPA c3!K +CaK;CJ+ya+sKiPA c3q{k3 +{iyAiYqQ!KIiP+sq{k3 +{Qq{k3 +{iPkPhP@ c3 + C++cJ;CCA c3bA c3abA c3icA c3aK;CJ+KiPKhPyyIr++C+C++siPA c3+s+#Jai!{CabJQiPaai+s+#JQ +CaK;CJ+yAa+s;CC+s+#JKY)kIIIHHhP+sariPkPhP@ c3C++ + cJ;CKr++K{sCA c3qbA c3bA c3abA c39; +cC cA c3aK;CJ+IiPkPA c3aK;C*A c3Aarcq1KiPA c3+3c+CbqJiPhPaK;C*s + C++cJ;CCbab9; +cC caK;CJ+KiPhPyyqzk cK+siPA c3a+si Ca+s;CCaK;C*sIa)kIiPaK;C*sya+siPhPyy)r+;q{k cK K{skPaK;C*s + C++szk cK K{sCa+scaK;CJ+c9; +cC IiPhP+saK;C*iPkPhPhP ȏ \ʸʾ\( \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYQQTїSYY[QQTїHLBH[YZYۛX [OB[ YY\SXX +[ YY\ۛHJ^\]YY\ۛ Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B [[Y[[H \X]][[Y[[\[ YY\P[Y +[ YY\ۛ [[[Y[[ [ӛ [ [HJ^[Q HK + + + +[[Y[[N[HH +Q H HL + +] J H ӛUN[HH +Q H HL + +] J H SN\]YY\ۛ + + +H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_Bˋ[Hۛ]P] H[Y؛\]]]X[YYY\Y[YY\P[YQ^\ٜ[ +[[[Y[[ [ӛ [ [HJ^[H[YPZHKN[H[YQݛH + M +[[Y[[H  MY + +[[Y[[ +H N[Q HH[YPZ + + + +[[Y[[N[HH +Q H HL + +] J H ӛUN[HH +Q H HL + +] J H SN\] + + +H[YQݛ\ Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B[ YY\P[YQ^ +[ YY\ۛ [[[Y[[ [ӛ [ [HJ^\]YY\ۛ +YY\P[YQ^\ٜ[ +[[Y[[ ӛ  R Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B[YY\Z\ٜ[ +[[[Yܗ[[ [ӛ [ [ [ [\ܛT[]]]UY]OLJ^ TX]H\Y] [YH]؛][[[\\X[\^]ڛ[ ZY\[\\X[\^]ڛI[WZH[[Yܗ[[ܜ +[[Yܗ[[N[H HWZWZN[H\]\] +J H L + +ۙ + H H H H +HNB[ H +] J H RN ZYݛ][ZH[\Hș\^H[ٛ[[H[]\ZK HȘ\Y]H[Y\Hș\^H[ٛ\YZ[\H[]\Z[ ZZZZ][]ȉ\ZX[ H Z]ZH[Y]XY ZYYX][][ZHMK T]Z][]H Y\țZH[YK؛[\ZX[HMN[Y HJ H \ZX[ +] J H SJ + +J H \ZX[ +] J H ӛUJNB [L +\Y \ܛ\H][]ڛ[[H[ + Y \]\] + +H K H +HNB T\[]]]؛\X]ڛK[H + K +H HMH + + + K H + + +H +HK[ +͌ +H L KH + +\ +H +HN HYY[[\\[]]]^J\ܛT[]]]UYN\] + +HNB_B[ YY\Z +[ YY\ۛ [[[Yܗ[[ [ӛ [ [ [ [\ܛT[]]]UY]OLJ^\]YY\ۛ +YY\Z\ٜ[ +[[Yܗ[[ ӛ    \ܛT[]]]UY]NB_B[ YY\ٓ\SX^ +[ YY\ۛ [[[Yܗ[[ [ӛ [ [HJ^[H +H HN[HH[[Yܗ[[ +[[Yܗ[[N[H HH +HN[P HH H K +H J +LN[ۜ\HH ӛ +NB[Ȑ H M +H +J + LN + + +ۜ\O ۜ\ +J[ ӛUJ + HN\]YY\ۛ +P +ȐLNˋ[Ȑ H M +H +J + LN + +ۜ\ + +ۜ\O H[ +H  ӛH +HNˋ\]YY\ۛ + + +P +Ȑ H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B HZۛ\[Y\]ڛ[ HZ]Z]ݛ\ HZ\[H[X]YZ]Z]ݛHZۛ\[[[ YQY\[[[Q +[  [  [\]\]ٗ [WZXJ^[HHH M +WZH HKML N[HH KML L +WZ +MM N[[QݛH\]\] + +\]\]ٗ +H +X + +WZXN Z\\Hۛ\[[^H]YHHXXY[\\][  [QݛHNB_BBHY!LĄa5FV&7Ǖ6VGVUf%&Gf6ǖt ^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@F@@j`\`F^^ZZZZZZZZZZZZZZZ^^@설^^ZZZZZZZZZZZZZZZd@辊설P@@X@@ެ@R@@^^@@@d`bfX@D@@@@@@t@@@D@@@^^@@@@@@\@@@h@`@z@@Zb\X@Z`\`dnjX@Z`\jndX@`\`dd@v@@@h@b@z@@b\X@`\`hdjX@b\`hX@Z`\`h@v@@h@@z@@T@`@V@bv@@@``h@z@P@\@T@\X@dP@Zr\dp@T@ެ@R@R@T@\@V@\v@@@dP@Zb\`hX@b\`h@R@T@``h@V@\vf@설P@f@X@@X@@ެ@R@@^^@@@d`bfX@D@@@@@@t@@@D@@@^^@@@@@@\@@d@@z@辊설P@X@ެ@Rv@@@@T@\@V@\TPT\Rv@설P@@X@@ެ@R@@^^@@@설P@`\`hX@X@ެ@R@@@d@`@z@@Zb\X@Z`\`dnj@v@@@d@b@z@@b\X@`\`hdj@v@@d@@z@@T@`@V@bv@@@P@\@T@\X@dP@Zr\dp@T@ެ@R@R@T@\@V@\vF6dR&D902941:2.9902/:3494p2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf2DT$e4ED4eՠ0BVfV2DT$e4ED4eՠҠB%vVF'6bV6F6נҠ0BVfVb62CS#cS3Ss3#3Cc#cC33c֠0BVfVb6dRc2CS#cS3Ss3#3Cc#cC33cҠРBC&GV&Ɩ֖'F֠Bbu$cTbT"FW֠rR"F6'W66֠"UfV&W6VF&fFVF6bT6F62GW&RVVF&B%67VFVFbT6F6$&vFF2EWvVRDҠ`F66g6GGbF憕Ҡנ`F&6憕Ӡ`F'Ӡ`F7'Ӡ`F2ӠР0"#CCcRss#cӠ0sC#cc'2Ӡ0s#3c72Ӡ02'Gc2ӠР66bV6FҖ&'&v֠2V6W&Fg&f2V6B2WV6F&"&6VVVFVF֠ WFW'c2b62ӠנРBC&GV&Ɩ֖'F֠Bbu$cTbT"FW֠rR"F6'W66Ҡ`F6f6GGbF憕Ҡנ`F憵ӠР66ff6WFf66נ WFW'b6d66g6GGӠנРBC&GV&W&'Ɩ6'F֠Bbu$#TbT"FW֠rR"F6'W66Ҡ"UfV&W6VRdf6VF'F6b&BV&7FvVFbV6F"226Vrv""cӠ`FFf6GGbF憕Ҡנ`F憵Ӡ WFW'sCc&6cc3c3cӠנР0RFVfb6Ԡ0RFVfb6dԠР0RFfA84!p͡qՑqՙ}͕ͱq7<34:$''&! 6634929227<34:4479%#* 6634929241:2902/2494764)02930:0202:970206) $$9:1:(2#:32064377069:07706:092770633494093430700632066063:0924:29:0927:792060632<:120629063906390067770637/0930:0209:1:*72#:32060620637:4307006320664:29:0927:792061797063:0924:29:0927:7920617970637/094:29:0927:7920617970634:29779706379:23:4:2977970639030:02030:::49:1:2#:3206306230:707:40200632066*0929082)8208*09730:27270630063217042789:7=21212:972307270630:230:7730:21<30:30:06367:77<=7777=77<89:2:9777<=060634020672:977:760606370627060622:970:024020620<:43029:07100697:8064120729902#:3293:329*72#:3293:322#:3293:0632066'9*092<3:32920662066'9*092<4)0293:3290203:3297/09:2066'9*09230707:49302727063:329706<0<3:3297:4906302063:329020633:3707:4020630:707:490203:306270633:32906274)0293:3290203:32979:23:43 '3:3293:30627063;3:32906273:3293:32066*09290;3792066'9*092<3793:32990;3:32066*09290;30:2066'9*092<3:329902:973:42:75707:4930707:49::30706::0637:470672706707:497:4909707:4942:7#:329707:492#:3293:3::30706::0637:4:75707:493:3707:40206<=7067:4*72#:329:7#:3292#:3293:*72#:3293:323:32902063793:3707:40206;0632066*09290;3:32066*09290;<06390;312066*092900632066'9*092<3792066*0929006390;3:32066*09290;0632066'9*092<3:32066*09290;3:32906273:30627<:7#:329707:493:33:3297063:3297:43:3297/09:4)0293:3290202066'9*092<3:329206692066'9*0923:329:092<3:32974)0293:3290203:306273:32979:23:44)0293:3290203:30627; ''3:32990;903:3294377906273:3292066063392621:1298337:4892314$722314$727921:3:3299:077929806392621:1392621:1392621:06273:32920662:973:32(2#:3298#:329*72#:3293:(2#:3293:323:32902063:30203:3297063:3703:3294093493:37:43:3293490<3:3294093493:329409343:329206693:320663:329:092<3:3:092274:274397913:32977793:379:23:43:30623:3297/09:3:37/093:3292<:120627706273:30623:329437793:306273:329206693:306223:32990;3:3903:329:0927793:329437793:329:092063392621:13:30206) $/' &3:3902983334892314$722314$727921:392621:1298392621:133:3293493:329:092392621:13:329:0923:3299:077929806392621:1392621:1392621:3:306273:32920663:32973:32:973:3242443:329::*72#:329:6:6:0627:6:706:6:7:49:6:20669:6::092<:6:7/09::6:79:23:4:6:7:6:90;:6:0206) $/' 424406274::*72#:329:6:06062:6:0627<=06242447:494::*72#:329:6:0637:4:6:7:497:44244/7064::*72#:329:6:307:6:7067424420694::*72#:329:6:06320:6:20669204244/:092<4::*72#:329:6:063:092:6::092<:092424474::*72#:329:6:063:6:7424490;4::*72#:329:6:06390:6:90;90424402064::*72#:329:6:30:020:6:02060204244774::*72#:329:6:30:79:23::6:79:23:479:23:42447/09:4::*72#:329:6:30:7/09:6:7/09:7/099:1:#*#"***0630627)/02:30:707:40206)/020632066*09290;)/02:#*#"****;43:3292#:3293:#*#"****3::3:::06273:30623:::707:402063:3707:40203:::2066*09290;0633:32066*09290;2:973::#*#"****273:32/;*72#:3293:322:97;43:3293:3293:32242273:3290273:32/;0629:9/70606067606'30830::2:2217973:2426:0330222<30282<30::22<:30::;2<:762:24099302829819'2830229819230*28298:<2298:;30!28298:<2298:;79:1:0047007:330:470<89:0<7:*7:!2:97060676='0676<470*0676<470 k-Ln+mL̬LK,m-s2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р06VGV"r&VgfV&%6W6ǖ&ҠР@UGW'W&C&VFu&Vg"Wv6GW&BӠ@UGW'W&C&u&Vg"Wv6GW&BӠ@UGW'W&CFW&u&Vg"Wv6GW&B'Ӡ@UGW'W&CBVGu&Vg"Wv6GW&B7ӠР0V&7EFWBVfVF5V&"Wv6GW&2ӠР6VFv$VgfV&"WF6VFv$VgfV&bF'B7Ҡנ6VFv$VgfV&r&VgӠr&Vg&VF&VFu&Vg2VTfWƆBVfVF5V&B7Ӡr&Vg&5FV67FW&&u&Vg2VTfWƆBVfVF5V&B7Ӡr&VgVFF%6V7V65FvFW&u&Vg2VTfWƆBVfVF5V&B7ₗӠ"WFW'r&VgӠנР%6V67WFv$VgfV&"WF%6V67WFv$VgfV&bF'B7Ҡנ"WFW''6V67w$VgfV&R6v$VgfV&"WF6VFv$VgfV&B7ӠзAh7!p͡qՑqɑ݅ɕ}͹ͱ17<34:$''&! 6634929227<34:4479%#* 6634929243723 ) /"$/ "242 ) /"$/ ")43/ ) " 242#$--"0<242#$--"0<27443723#$--242#$--"27443723#$--242#$--"27443723) "&$"/$)&242) "&$"/$)&274242#/ "*242$242$4242"$''242*$/,30242*$,30242*$/-30242/"""$)242" &("'!!*242:12:10/7:8792/3242:12:10/7:8792/3242:1:10/7:8792/3242:12:10/7:8792/324242206242422063242420624242206330:030:030:130:2:970<00<130:430:030:130:2:97470471242$' '*30:0302:9700<0<030:0<30:030:130:130:2:970<0<00<130:4730:030:130:130:2:9747470471242("8242() *89:0:02242*/$''30:2)/$'2422<3020:;2<068#02682902:<2<2422<"720:0682226682902:<:2422"720:0682226682902:<=:2422*"720:0682226682902:<=:;2422* 9<720:;70682226682902:<;72422<"8750:0682682902::2422<"0:0682682902:2422"0:0682682902:2422*"0:0682682902:2422<:0:29000:2968290224222621'32:01727002471772422<:'32:0170682682902172422<:27'32:0172706822266829021727242!&/')")020242'(-7242*''&&:776242! !$-101242# *"'-30:2242&()*!*9:1:2242! *"&"242"*)&()*!*242$$&()*!*242!"/242"!"/)//43723""&"!/"$"242""&"!/"$""242!/",*"242!/",*"",()0242!/",*" )242!/",*242!/*#")4267242!/*#"",()0242!)*!*"/*#")4267242!)*!*"/*#"",()0242!)"$30:22621422<:2"30:047:147:7247:4247:6747:=!/",*"2:9700247173022621422<:2"30047:147:7247:4247:6747:=!/",*"2:97002471730:22621422<:2"30:047:147:7247:4247:6747:=!/",*"2:97002471730:22621422<:2"30:047:147:7247:4247:6747:=!/",*"2:97002471730:22621422<:2 9<30:047147:7247:4247:6747:=!/",*" )2:9700247:173022621422<:2 9<30047147:7247:4247:6747:=!/",*" )2:9700247:1730:22621422<:2 9<30:047147:7247:4247:6747:=!/",*" )2:9700247:1730:22621422<:2 9<30:047147:7247:4247:6747:=!/",*" )2:9700247:1730:22621422<:"30:047147:7247:4247:6747:=!/",*2:9700247:173022621422<:"30047147:7247:4247:6747:=!/",*2:9700247:1730:22621422<:"30:047147:7247:4247:6747:=!/",*2:9700247:1730:22621422<:"30:047147:7247:4247:6747:=!/",*2:9700247:1724222621401722621420172/$//$/30:02:3292:32930:047:147:4247:6747:=!/*#")42672:97-3002:3292:32930047:147:4247:6747:=!/*#")42672:97-30:02:3292:32930:047:147:4247:6747:=!/*#")42672:97-30:02:3292:32930:047:147:4247:6747:=!/*#")42672:97-47:02:3292:32947:047:147:4247:6747:=!/*#")42672:97-47:02:3292):1:22:32947:047:147:4247:6747:=!)*!*"/*#")42672:97-47:02:3292):1:22:32947:047:147:4247:6747:=!)*!*"/*#")42672:97-47:02:3292< 229:329047:147:4247:6747:=!/*#")42672:9700247:02:3292< 229:329047:147:4247:6747:=!/*#")42672:970024702:322< 229:329047:147:4247:6747:=!/*#")42672:970047:02:3292< 229:329047:147:4247:6747:=!/*#")42672:9700247:02:3292+< 229:329047:147:4247:6747:=!/*#")42672:9700247:02:3292+< 229:329047:147:4247:6747:=!/*#")42672:970024702:322+< 229:329047:147:4247:6747:=!/*#")42672:970047:02:3292+< 229:329047:147:4247:6747:=!/*#")42672:9700224202:329002:329201/$//$/24202:329002:329201/$//$/24202:32002:32201/$//$/2/24202:329002:329201/$//$/42972:3292+< 229:329047:147:0247:4247:6747:=!/*#")42670)721042972:3292+< 229:329047:147:0247:4247:6747:=!/*#")42670)721042972:322+< 229:329047:1470247:4247:6747:=!/*#")42670)71042972:3292+< 229:329047:147:0247:4247:6747:=!/*#")42670)7210242972:329010972:32920102/$//$/242972:329010972:32920102/$//$/2/242972:32010972:3220102/$//$/242972:329010972:32920102/$//$/2429:1:22:32 :047:!)*!*"/*#"",()0242:32 :047:!/*#"",()02422<:2 :047:!/",*"",()027447:924621422<:2"47:047:147:4247:6747:=!)"$2:97-.242924621409246214201/$//$/2/43) "&$"/$)&24221:01012427900>>2740607462906043 &/('2:97470622:9721:94427:060<<<0606274274  7902941:2.8194942'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf%$Ed5ՠ0BVfV%$Ed5ՠР06VGVCffV7W%&Gf6ǖӠ06VGV3W6V&%&Gf6ǖӠ06VGVSf%&Gf6ǖӠРBffV7WFV֠0BVfVBddT5U$T$EӠ0BVfVBddT5U$U$Ӡ0BVfVBddT5U%T%T"Ӡ0BVfVBddT5U%T%TeUD2Ӡ0BVfVBddT5U5BӠР0fFVf"$EdEddT5UԠ0BVfV"$EdEddT5UBddT5U%T%TeUDBddT5U$U$BddT5U%T%TBddT5U$U$BddT5U%T%TBddT5U$T$EҠ0RFf֠РҔ6&f6VFB6G'&VGbV6F֠Р0BVfV2U4E%ĔӠ0BVfV2U4E%T4Ӡ0BVfV2U4Eut"ӠР0fFVf"$Ed5U4EԠ0BVfV"$Ed5U4E2U4Eutՠ0RFf֠РrTVF'6FGWVF&2Fvv֠0BVfV2U4uŔ4DӠ0BVfV2U4uTTӠ0BVfV2U4uTTT"Ӡ0BVfV2U4u5Ĕ42Ӡ0BVfV2U4u5ՔDutBӠ0BVfV2U4u5ՔD5$%UDUDRӠ0BVfV2U4u5ՔD5$%UDUD%bӠР0fFVf"$Ed5U4uԠ0BVfV"$Ed5U4u2U4u5ՔD5$%UDUDԠ0RFf֠Рb$W6V֠0BVfV2U4eTӠ0BVfV2U4e5Ĕ4Ӡ0BVfV2U4ee$U4T"Ӡ0fFVf"$Ed5U4eԠ0BVfV"$Ed5U4e2U4e5Ĕ4Ԡ0RFf֠Р2VV֠0fFVf2TT5U4T$ՠ0BVfV2TT5U4T$Ӡ0RFf֠Р`F7"$EdEffV7WbF7BffV7W6&bF–V&'VwV67bFfbFbFbҠנ0f"$EdEddT5UBddT5U$T$Eՠ"WFW'BffV7W&V&GBffV7W6&Ӡ0RƖf"$EdEddT5UBddT5U$U$ՠ"WFW'BffV7W$W&BffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%Tՠ"WFW'BffV7W&T'VBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%TeUDԠ"WFW'BffV7W&T'VgWFBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U5Ԡ2R&'&2BffV&WF"$EdEffV7WrFԠ"WFW'Ӡ0RFf֠נР`F7"$EdEffV7WbF7BffV7W6&bF–V&'VwV67bFfbFbFbbFҠנ0f"$EdEddT5UBddT5U$T$Eՠ"WFW'BffV7W&V&GBffV7W6&Ӡ0RƖf"$EdEddT5UBddT5U$U$ՠ"WFW'BffV7W$W&BffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%Tՠ"WFW'BffV7W&T'VBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%TeUDԠ"WFW'BffV7W&T'VgWFBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U5Ԡ"WFW'BffV7W6BffV7W6&–V&'VwV67–V&'VwV67fb􆔲Ӡ0RFf֠נР`F"$EdE6G'&VGbFrvbFҠנ0f"$Ed5U4E2U4E%ĔԠ"WFW'B6G'&VG&ĖrvӠ0RƖf"$Ed5U4E2U4E%T4Ԡ"WFW'B6G'&VG&T6rvӠ0RƖf"$Ed5U4E2U4Eutՠ"WFW'B6G'&VGvtrvӠ0RFf֠נРb6rBƤfҠ`F"$EduVVF'6f6&ƖFbFrvbFfbFbFbҠנ0f"$Ed5U4u2U4uŔ4Dՠ"WFW'rVVF'ǖ6FӠ0RƖf"$Ed5U4u2U4uTTԠ"WFW'rVVF'TVfӠ0RƖf"$Ed5U4u2U4uTTTԠ"WFW'rVVF'TVVbӠ0RƖf"$Ed5U4u2U4u5Ĕ4Ԡ"WFW'rVVF'75Ɩ6rvfӠ0RƖf"$Ed5U4u2U4u5ՔDutՠ"WFW'rVVF'7ՖFrvfӠ0RƖf"$Ed5U4u2U4u5ՔD5$%UDUDԠ"WFW'rVVF'7ՖF6&'WFWFrvfӠ0RƖf"$Ed5U4u2U4u5ՔD5$%UDUD%ՠ"WFW'rVVF'7ՖF6&'WFWF'rvfӠ0RFf֠נР`F7"$Ede&W6VƆbF72W6V&7&bFbҠנ0f"$Ed5U4eӠ"WFW'b&W6VV2W6V&7&Ӡ0RƖf"$Ed5U4eӠ"WFW'b&W6V65Ɩ62W6V&7&bӠ0RƖf"$Ed5U4e"Ӡ"WFW'b&W6Vf$W6VƆ2W6V&7&bӠ0RFf֠נР`F7"$Ed5W6V&bFrvbFfbFbFbbFf2VV6E'WvFf62VV6&ҠנbFB"$EdE6G'&VGrv􆔲ӠbFr"$EduVVF'6f6&ƖFrvfbӠbF7"W6WFBrӠР"WFW'"W6WFӠנРb&FGrwwb&6G'FW2r2FWFRF6"C2V'7WFW6fve&6G'FWE'&e'Gf&vbW&7F"Vw2FVҠ`F2WGW6W646V7bF2FW'FWFDFgbFbFrvҠנ"WFW'2FW'FWv2FW'FWFDFgR'crvӠנrv–V&'VwV67–V&'VwV67נРrv–V&'VwV67–V&'VwV67נf62GF&G&$EdĄbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&bF72VV6&bFB'6V7V6Ҡנ0f2U4T$E4$TDbb"$EdEddT5UBddT5U$T$Eՠ"WFW'BffV7W&V&G"6WFffV7W6&Ӡ0R6W֠bF7&ƖWbVv–vFG&ӠbF2FW'FWBF&ӠbFb2FW'FWBFbVvӠf6BffV7W"$EdEffV7W"6WFffV7W6&–V&'VwV67fbӠ0f2U4T$E4$TDԠbF72W6V&"$Ed5W6V&rvfbB'6V7V62VV6&2W6V&7E'WvFӠbF7b"$Ede&W6VƆ2W6V&7&bӠ"WFW'BffV7Wb2W6V&Ӡ0R6W֠"WFW'BffV7WӠ0RFf֠0RFf֠נРf62GF&G&$EdbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&bF72VV6&bFB'6V7V6Ҡנ"WFW'2GF&G&$EdĄf"6WFffV7W6&rv–V&'VwV672W6V&7&2W6V&7E'WvF–vFG&bVv&2VV6&B'6V7V6ƴӠנРf62GF&G&$EdĄbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&ƖҠנ"WFW'2GF&G&$EdĄf"6WFffV7W6&rv–V&'VwV672W6V&7&2W6V&7E'WvF–vFG&bVv&bF7ӠנРf62GF&G&$EdbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&ƖҠנ"WFW'2GF&G&$EdĄf"6WFffV7W6&rv–V&'VwV672W6V&7&2W6V&7E'WvF–vFG&bVv&bF7ƴӠנРBDTssRf2FV&fWrFFV&&G7b&RV2WVB6G'&VGvt2W6V&%&Gf6ǖҠPF"UfW&7W&F77#RF"F7Ҡנ"F7"F7c"F7cӠ"F7"F7bWSSSSSSS"F7bӠ"F7"F7b73333333""F7b74444444"Ӡ"F7"F7bccccB"F7bgcccBӠ"F7"F7bcdcd"F7bgdcdӠ"WFW'"F7ӠנР`F'V&7VRFRFҠנ26GbFRb&6bF┲Ӡ26GbFR$"UfW&7W&F77#"2#3cC3cS3cc3SӠ"WFW'bF'RR$ӠנР`F7&G6V6VvtbF'RbF&Ҡנ26GbF"R䂷Ӡ26GbF26GVF2'GR䒗&R䒗Ӡ26GbF2FVF2'G26GVF26GVFӠРbF7Ӡ2FVF26Ӡ2FVF2Ӡ26GVFӠҠ"WFW'ӠנР`FButbF&bFҠנ26GbFB&Ӡ"WFW'&BBӠנР`F&G6VEfvtbF26GVFbF&Ҡנ"WFW'26GVFBut&26GVFӠנР`F2W6V&EfbFbF&bFbҠנ"WFW'&G6VEfvt&BbӠנР`FTז6VbF72&Ҡנ"WFW'BF2&bF7"#crS#s##ӠנР0RFfA:ap͡qՑq͡}ͱq߃7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""4243723) "#' /$)242) "#' /$)&41:2090/24949430:;30:=2:97030:;30:=2:97;030:;30:=2:97;030:;/130:=2:97030;/30=2:97030:;/130:=2:97030:;30:=2:97030;30=2:97030:;30:=2:97030:;30:=2:97;030:;30:=2:97;030:30:=2:97;030:30:=30:;0;2:97;063;4063=2:970063;4063=2:97;400634063=06300002:97030:1622;30:,30:=2:97;0<0930027:796230;30*!2:97:6*!'302:*!'3030*!30*19'*$*29819'*$/*928"$''7:**704279:30!704219'2:9730'':450:::9:09221730*<!<'30*<!<'30*=!='302:*!'30'30*7042*7:*79:30!19'2:9730'':450:::9:09221730*<!<'30*<!<'30*=!='30:404/=30:;28:430:7/28:2:97187/28:4<7/28:4<;28:274 k-Ln+mkl-LKLm-[ ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(LA U1I} I}!1M15(LA U1I} I}!1M14(4(Ց̡}ͱ4(4(4ɽсձɁШ818YXͩ5(X́Ш818Y4(4($9Y}5%9}%=I5($9Y}5%9}%=I5(5(4(l ܰ4́сȕѥɁѕɁѡͥ镑ɕ͉t5(сɥѥ с}с8!4(5(сɀ􀜝}}4(сɀĀɀ4(ȕɹɬĤAݡ8!ɨȀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(l ̰P̍ѕɥɽѥ܅ٕ́ɽȽ՝ə͉t5(сɥѥ с}с8!4(5(сɀ􀜝}}4(с8!ɀ8!8!4(ȕɹ8!ɀĤɀ8!ɤɀ8!ɀ8!ɀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(aPɽ݉ɥH5(сɥѥaс}с8!4(5(сɀ􀜝}}4(с􀠀8!ɀ8!8!$Ȁ5(ȕɹɀĔఀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(ͽɽa͹5(сɥѥaͽс}aс}eс8!̀ ̀`̀d4(5(с`!􀐽ѡ` 4(сd!􀐽ѡd 4(с`!`!ɠ}ad!d!ɠ}e8!8!4(ȕɹĀĔఀ}a}e켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(͡5(鼼ɭݥܽɑɕ͹ļмѡ̡4(сɥѥ ѡс}с8!4(5(сɀ􀜝}}4(сɠ8!8!4(с̥ɠĸɠ4(с̥Ѡ̥ɠ̥ɠ4(ȕɹ̥Ѡиɠ̥ɠɤĸиɤ̥Ѡ켼٥ͥ@́ѕ5(5(4(с%ѡ4(5(ȕɹ4(5(4(с9յс8Yс814(5(ȕɹȍЀᡀ818YĔԤ4(5(4(с QɅс8!с81с8YсX!с}4(5(с81}814(с8Y}8Y4(с8!}}Y!Ȩ8!X!4(ȕɹ8!}}Y!8Y}8!}}Y!81}ĸ4(5(4(l-İɽс͕ձɵѕɑܥѡх̅t5(с-сX!4(5(ȕɹȍЀX!X!4(5(4(сMс}с8Yс814(5(сɠ}4(сMY8YĀ4(сM181Ā4(ȕɹԀMYM14(5(4(LѡЕɵɁa5(сMѡс}с8Yс814(5(сɀɠ}4(4(сMѡY8Yѡ8Y8Y8Yɤɀ4(сMѡ181ѡ818181ɤɀ4(ȕɹȍMѡYMѡ14(5(4(᥵ѥɕѕLѡЕɵɁa 5(сMѡ ɕѕс}с8Yс814(5(сɀɠ}4(сMѡY81с8Y8Y8Yɤɀ4(сMѡ18Yс818181ɤɀ4(с􀜝}4(сMѡY818YĀ4(сMѡ18Y81Ā4(ȕɹԀȍMѡYMѡ14(5(4(᥵ѥсLѡЕɵɁa5(l!аTхС4ͭLݥչѥ4ɽѵ͕I͉t5(сMѡ ɕѕɽᡀс}с8Yс814(5(сMѡY818YĀ}}4(сMѡ18Y81Ā}}4(ȕɹԀȍMѡYMѡ14(5(4(͡5(鼼ɭݥܽɑɕ͹ļмѡ̡4(с ѡс8Yс814(5(ȕɹĸи818Y818Y4(5(4(̀ɕ͹9̀ձ Ɂ4(5(ȕɹձ 4(5(4(̀ɕ͹M̀ձ ɱсX!4(5(сՠĀX!4(4(ѡ́СȔ́ͥ偤ͥ́ѕͥɕн̡ݥ5(ȕɹ̅Ʌѕ$9Y}5%9}%=Iձ ɹĀձ 4(4(5(4(̀}MI՝̀͡сX!сȽ՝ͥ4(5(ссՠĀX!4(сI՝ĸȽ՝4(ȕɹᡘ͠I՝I՝I՝4(5(4(̀ɕ͹ɕ͹̀ձ ɱсX!4(5(̀Lձ Mсѡ͠͠䰀䰀䤰ձ Ɂ4(̀􀠀ĀLձ MсĀLձ Mс4(̀ѡX!X!Ā4(ȕɹԀ|ٕ͠X!X!Ā|ٕ͠X!X!ĤX!X!Ĥ4(5(4(̀I՝IѥỲH̀ɵс}ɠ}ɽ՝ͥ4(5(ȕɹɵHĀ}ѡĀ}}4(5(4(5(lDOxD:\NauPrototype\samples\sceneBase\..\..\engine\core\modules\render\include\nau\shaders\shader_defines.htd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAAaN.- mAAEA-l.l -AaA-l.l dṋAdA-l ĭl -l.l -NGgṋ,d.m -m, $mn D,d-Ld .LAAAAAAd譭 ehe$̍ i)DmlͥAAa,ͭ dJ(hkʉ +ĦAa,ͭ dhkJ)jKihk*IAa,ͭ dJ)(hk*I$FAa,ͭ $IJ*()i)(hk*I$FAa,ͭ DȈh*)(hk*I&FAa,ͭ DȈh*)) kʉ +$AAa,ͭ ))kj))Kɩhkʉ +$FAAa,ͭ d +)(I) Aa,ͭ d +)(諨)ij*ɪdAa,ͭ )뫨)ij* ƬAAa,ͭ I(KȨH J( HAa,ͭ d*kKȨH J( dJAAa$͌ k nnAAdhe͍-DmlͥAAa,ͭ dJ*((+ /dAa,ͭ dJ*(( /dJ*((+ /AA-l.l -NGg-L,ͭlAaAdm N,lMGgN..M,M̬LJ, dJ*(( I(KȨH J( +eAdm N,lMGgN..d*oM̬LJ, dJ*(( e*kKȨH J( +eAA$͍-ͭ D $mM,M̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. M,M̬LJ, /eAAA$͍-ͭ D $mn*oM̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. e*oM̬LJ, /eAAAAam k nnAAi͍-DmlͥAAa,ͭ di( N, -,N, od-Aa,ͭ di( +N, -,di( N, -,AAa,ͭ I(kHȨH +-,dL̬Ldi( +I(KȨH J( -,Aa,ͭ d*kkHȨH +-,dL̬Ldi( +e*kKȨH J( -,AAa̍, k nnn'}!(Qha7eC%ZYK[YmH)J.e. leṋL(l,ͭeM퍬lE̍L%m-e-LnCV62/23-WXPAPQ!Q)S9T y6* JP цU`eU&a`&YYUYU``idJ) nnLU[YUQ\6+`0g0A@ RMk+3Q6RUʯLl+7Q6Uʯl(z\ą\ePh0A@ D*.X*\6 .2A20VT?ܥZ_ K++d`>T+2A@ C5/+ +Zyxzp + KˆaUbCp/U| lTUғ!&ɷ!X BW6,///2/!f+m.m,h! B2JU6,22$S2/b2/'A2e6F6AH m*ٰ ʨʬ "') L˿KlTe//3%*+2ذT//23%*+SKl LK͔Kl(\fdflfÐ27l(@ pfWinput DBAg-`' @O{bK;CJs#+! +?#l} `\H(#0  +p :::q "P6BWz|`: 0uDBA10ÖvFvV65V6.@$FBlightAngleOffsetDBm20 aF'CȮlMnj-Dg4PwE(I `6r37 +$?6QL!n2P`Xp#p7P =ѕɍK  halfTanDBo3H`Vɬ"A +"tangentZ DPtF25x]ظTQ,(KA|`p027:q ": s;+s +3 +7q ":dz$`X: u'@ @O #0XG=`zD`: P/llvm.dbg.cuSpfFVVbv67EfFVF7%Kdx.source.contentsS(9i1)4Y7:=Gdx.source.definesS[XK[XQ[SX[ٔO̽ɍɝM P +]\ڛ۔`U؅ٕM ZZY\Y۔V̐ȕͽɍM t ]\Y]]ڛ^]Z]]]ٔ@_ṔAM pyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ) DAD1 bWl;/TQQCIm[4\BDͰf z0A8Bap A +&*LT 0A8Vapx  #&-LZ 0A8vap A&:Lx 0A8apȇ $&GJL ,1A8Zbpᰉ C.&]L# `Ab03V$ʥjL# `܁lȄ0b JL#`P9Xa?L# `Adʄ0b  Ä0b āL#`P9Yc?L#`PA9Yb?L#`P9Ya?L#`P8O>?[PD܌A(N#`phBL#`P9WXg? +h0b (pÌ1& ŒA(#`P9Xg? +h10b )Ì1 AA +?hd?0a AA +?hd?0a AA +?hd?0aq 1 B18,'0F`1@haƀ&!1 B1@haƀ&фA1 B1@"haƀ&b1 B1@B1 `@ +UP xa1@B0F Pt& A0LA" PF Xv f 0`B1@b0F Xu & A0(V0HA PB PF 2 +& ф0F pu@f `4Af 1B1@(1 :'фA1 ` `@ +XP HaƀPFaƀ-A0(bA3h!sB1@"81 Ā `@ X` a1@"80F u& A0(b30Ab PF u΀f 2B`ƀ(.A0Xa `ƀ(-ф0F`1@X1 ʀ `@ Z`a |a00(3c@ + }f 3@PF vf 3XB όqh +A@ P,(g@d ngP0b .`?0c@ + Ha_7c@A7pD7c@ 0I(6|f 5L# ` Bk sL0L 3ap0F  f {`TA0(=(! `@ +rA@a1@T1  PAtF  {@& A0(= `@ pjƀȇDg8"1 ! PAtF""T8 a1@\1 A1@Z0F @|&  :FA|& :LVp0L3ag1X)Bf }PAtF ZQ& LV03a A1"?[? A1!?[?L#`PHme b.T@> A|& 3@>j  >!l 6τ`B `@ +~@AaƀDg@ +~8Aa1@L03c@C +c ' N>)|f ~@TC3?*)|f ~PAt,@3c@RgƀDǂ>3?*Έ +AC8ÌL(#`PL| +!C8Ä0K lP 0Pq(l0Pqm#`PM0}30 A3?h?L#`PL0|gƀWB>3A(&0l 3a 1 BA3a 01 B1@&r`T1 :'A0(l­v! `@ +h@a18 &Pbƀ+ф0F`M `4& A0j%& ф0F`M `4& A0t"Ё&& ф0F`M `4& A0~a'& ф0F`M `4& 0t 0b Yà de LЙ03a A q0b YZ +t& @> dl1 dmA t& @> dpq dqt& A0(sB1@B/ ~0F  `& A0("! `@ +&lXa1@B/t 0F Ћ`& A0( `@ +&l8a1@B/| 0F Ћ`& A0( `@ +&la1@B/j h0F  `& A0(bA ` @  ` hf <`B1H.‚-' ` @  `(& A0p",؂-v"0F h 20F h s0F h s0F p }0F p |0F p |0F p ؉{0F  z0F  y0F  y0F  x0F x v0F x v0F x ȉu0F x u0pƀ"p Y5mb5ngеnquo}жmvn6owm7nn8m_6VH]&WHmWHmPHmPHmFPH}ۖPH}PH}FPHF6mh5osvm6nn7mmطnwoظmeħ-H 5mgCmkPߖP|&0܆P|&0VP|&0FP|&0P|&0_"1qN#MUD UDdp*Ada*AdNn$B@BdSH>#5 N!8>bSTAT`<DXILBC! 3 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 72" d##ㄡL L@ +f`)@DAQ A@Jb 1 0 5\=sUa*.BCQ! B"h*@ @AP ("l ``;pi0|pK8&iiqF0A%M%LJ43qLضmK@vK8& _Hbrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` +X@ +0 ʡ$J + + +T0 A@ >#`# `ଂ|apD`7 c #@># `༂ uX@B>6|F V#9 8`A@0-A:XDŽ >v|1XBBF R,8c +XP cB3@>V|Lc6 A|c 'c:O>f|c`P0X2ǂ>-|,H3K T J@ŀl T FB>&򱁐 d>6|18$Bb4!F`4aFa@ &`q8фMфAM A0^"a$F`4AFa4F ` {hM!Mb ψ T9 A`t3b UO#`PH8\`@>#`PHT` A%$A`A@>#`PI`d Ae(AA`A0P؂%ʢ,t1H-X,&A0P؂%ʢ,n1H-X,"'A0P؂%̢,t F @a 0s1H-X,&a @ `( ЇA0P؂%z,l"F @a 色 |1H-X'"'a @ ` ( A0P؂%,lbF @a y1H-X,"'a @ ` ( hA0P؂%x,lF @a u1H-X'"'DXBCկV ޷tk DTX4T]^ ^SFI0ISG1SV_PositionTEXCOORDOSG14(@SV_TargetPSV04% 8TEXCOORDTEXCOORDTEXCOORDTEXCOORDdeferred_lights_psDC +DDDDILDB\Q`WDXILDQBC! N #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L ^2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXQJL~qۈ8(D@i88#! x #Lm00n@ PPr@ +|`0`@~~z P(@fq`pypZ(|zrR{(qw>0vxp6:0$"Iw8ҴCM>%b4ҴQEAD(0$&i(aYy"b'`"P0pLrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y> 2L &GCJ +J`B("(((`r((P$ʠ#P1A@2gtԱ,xx yuyuL d!{bK;CC #+sAcc4@ oM $Efe%&,f&gl&e@Ì-]ݛ[ <float{ 0b4Z` E ,h  E 4h ( E <h 8 BaG[Y[ݲ6element_countT`yPֵAI HD*44Z 179063half{ <0b4 +hEH4 `1@(  @ MhZe ` +`cg,bR@`Xl4PJdeferred_lights_psD8-b D6褑}ѕ%}͍0c{ !dW6F&cF2㳈C 0`4A`F 00a2I ȁ880E BЁ{ +s# #K[(l Ⱦ1@# +H403E Ј`>x=?I0p8aMAVMP +e-Ln%mknL-͍- m-m@hnL mnm37&WV6EE7dCbW6F&DdEÌ-N]ݛ[ "haf!0`4 +lZ&H4`a0$XAX0WY1 +*lh6 P &RAPl@H./shaders/include\gbuffer_read.hlsliRreadProcessedGbuffer 02(2#:329 *(2#:329 179& -ZYK[Y˙XYܗX\ [ڠX\ّXY4377E B/4+c zc{[M8i`N.mnm,oMn4 ?8h34E ДC/@``|1@s +p{k c[M:By`.@.ͭlnn4 ?:092E дC/P`Ⱦ޾1@`P{[M<j`F@c-n4 ?(777E C/dlܾ1@si +K c[M> xāԁaL >l6 & tar XܑXY NmlnH̬L(+' +JmlnH̬L .llH̬LHO\ZّXY062E ЌD/L8T1@S3`I^pE ЬC/Lx"hڡ`& D`4 f0j`&x4 50`T֖675G'WvF4 50X<̄ ,b&za f"0VGǖV6 t`B&q(*-/ `^|d`3iX5! P@@l썬+M+uCV6FV&VFDffdCbW6F&DffD#AP44@N^ T H@`Vז6VF7akKs s+ +"A c33!+{"A c33"Z5= @P + .llH̬LyS6v$VgfV&TU6VFv$VgfV&T6VFv$VgfV&*llH̬LIXW 063>vector9SX E ,)`F8 @a1@8 ,,b@$B8 015)k,bF,z!-@ &5FV67FW&ƶ9؋ $$Y[]\[XXZ 063>vector9S E ,)`A A,LA.SP `Xq!p"h`/D`o ` +^x0 ^l/VM@/X9 s [;33+szk cj{{Cs+,Թՙ9ɵMѡeaUAՙ%Yؕѽ5%i-b E p,b@ E pl  4@i^ q0 @U6&6FV67?s zk cj{{Cs+ +²!+{j" +J + +J +"A c33@y iX5 @ @l썬M-vCV6FV&dCbW6F&D#dCbW6F&DAZ4k^h > @ 6WԖ67fW6FV&-'m-mn.ͮl +-L(+˩ H 06l6VM@/lq@p"#022#:329A\YTZّXYPVOPTZّXY]ݛP L a/hajr!7t#̡ͽՑqɹͱ HѕM=ͥ ~ʦƞ܀6I$U.90241:21922:106340:449AP97/34/09B[\\XPV]ݛP ]ݛP LSSPR ZPPRU ֆȃ-4DC46 &<=rX./shaders/include\shader_global.hlsli=pow2t~d6IiX5I|Atʂхe555im$4@}0>DFsmoothDistanceAtt~Јʂ耀VMyG~a@P"2 3 ::AY][YPVP]ݛP LSֆ"Ƀ0214Q6q8:a"v5VF7N[ݴ< t'y2 @ N@OE `͈`   }1 ՙXɥ5̐ m[ґ?A3 *globtm_inv37147;#/3479::329 0:4<& m P:*p}@knL m틮 oMl~ܾ޾Ȁ䀀f~H䀚H`f-@J +796//9Aݛٗ]ZБSЛPYЌ]ݛP ж(SATHR`4FŖvF75VFǢ.͍]ݛO\ڙ[H :32247=@`p,b.[q0`1@ + "hW0X#\*`0WXe VI pH + +U.VE `0~耦怀f~H䀒H`f-@JЙ{bK;C#UFV&7FǔvFG- mN*,nn4 +l bK;Czc{ r;c+ c+[ͯg.HH334:417 3'32E Є *l  \Ⱦ1@3.沁 l |\ą\&A+ "0s t H g- nkL hJ) nh&JJ̍Ln +) Hhή 229ҁZYK[YW]Z\ YY[]ڛW[ݜ [ڠp`@l[i]F^(m[ґ]H^8ȅm[ҡ]J^(m[ұ]L^H܅m[]N^(m[]P^(m[]^^(l[]`^(l[]b^(m[]d^8m[!]f^X݅}}Յɕ}ѕm[1]h^݅}}Յɕ}ѕ}}m[A]j^݅}}Յɕ}ѕ}}m[Q]l^8watt_per_square_meter_per_sr_per_nmtXx[ ]\XXW[]\ל\ܗ[۶(%%ٶ(e%ٶ(ޅ%\\\]\W[]ܶ(ޥ%\\\]\W[]ܶ(%TTSUPUUTUe-Ln%m+mL셮 Nk.Mlm-m -@ 3 +rjJ +r**¢*B*J:Bڶ3;@mj(H*苪J諩k*Ih:L *"$/",*/$m P:aL3AĒ-@ 30K +"J +r**¢*B*J:BڶS6,;nj)h *)I+*˩)(Hjj:L`j)hꫩ* kj(H*+ +J kN:L/*$m P:k茳3A-@ 3p c+#{:3#GUGW'W&CcW6F&cFBl$mC7 @ @nAOXיXЌ U]\ ]ݛP Pж(\0ۛ\[יX M-L hꇄ NLĮlMf(hM.s-L.-LΌrFW&u&Vg4cCBUGW'W&CdCbW6F&D3mJ'o&BVGu&Vg7!+C:3!*ã+!!+{j" +ڶ7} !+3 c kc+#3V&7EFW6 &0dCVfVF5V&4S5V&7EFWmJoD'ؐ"**.2/r///!32%s2)2-21335s3<3`#6dc6h6l6u7{73 a56Dwarf VersionX0QXHU\ڛۆP 6Q?yyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPIsc#+zc{ +KcKsAcciPIsc#+c++#{{KsbK;CsAccKiPhP{kPkPzzJJzrB{KiPq{Ks+{c K{s1c{ I#+K" c+*zz"iP1c{ { +s# #K*zz"iP1c{ {c{ +s# ++s K{s*zz"iP1c{ !K +s;c+*zz"iPiPhPKrkPkP1c{ {zJJzriPiPhPʚ*j22*BaJ;CK+;K+CIiPkPKs{bK;C{siP*s#+{cJ;C{bK;Cj +zbJ:BiPkPhP{!+3++#bK;CCKrIscKs{bK;CJs#+Jr s+K"JiPkP{yiP*s#+{cJ;Cc{bK;Cۚ{bK;CJs#+iP1c{ { +s# #KcsaK;Cz +#KiP1c{ {c{ +s# ++s K{scsaK;Czc{ r;c+ c+iP{c{ +s# ++s K{ss C{c{ +s# ++s K{ssKiP1c{ !K +s;c+csaK;C#J+K{s r;c+{23+iP{s1c{ aK;C r;c+ c+{c{ +s# ++s K{ss iP{s1c{ aK;C r;c+{23+!K +s;c+s iP1c{ +K" c+cs+K" c+siP1c{ {{+iaK;C r;c+{23+yaK;C r;c+ c+iP1c{ A c3 +sCyA{{+Q{{+KiIiP1c{ y3iPI3A!{CIss{cIss{KIiPkPy3 s;+s{{c#Cq{k cK+C1c{ AIss{sQA c3 +scIss{sKIa!K +s;c+sKiPkP)c+kPkPy31c{ AaaIiPkPhP1c{ {c#z1c{ A{ +s# #KsYy3sQA{ +s# #Ksy{{+KaIiPysI#+K" c+1c{ A{bK;CJs#+c+K" c+KiPys{icCic{c#zKiPys{c{ +s# ++s K{s{c{ +s# ++s K{siPys{ +s# #K{ +s# #KiPys!K +s;c+!K +s;c+iP+syiPkPxy)s#K3kPhPhPIsc#+933++ #sAccKiPhP0c{ + #;33+#*CC1c{ KiPkP+s!+C:3s +kc+c*+cC!+3 c kc+c1c{ AcaIqc1c{ AcaIqKqiPkPhPhP0c{ !+3++#bK;CC{IsA***rzJiP +;+kPkP1c{ ++s{9***rzBIss{KiPA c3+ciP1c{ K+iP1c{ iP1c{ !KiP{{cI cc +#1 c+iPkP++s{{C++s{sKiPhP{s1c{  #*C!+C:3s +kc+c*+cC!+3 c kc+ccIqiP1c{ 1 {1c{ AsQiaAisKQia #*CcqIiP1c{ {c#{SicC9c{kJsc1 {KiP1c{ {c#z{c#{Sy{c#{SsiPhP1c{ {Ksz++{c#zsi{c#K+{siPhP1c{ { +s# #KIss{ +s# #KiPI3yjrJB +"zjP1c{ C #{z c IssC #{{ +c iP)c+kP1c{ C #{z c 1c{ AaaaIiP)s#K3kP1c{ i{+3{kz{ +s# #Ksi{c#zsiPK+iP!KiPhP{{cC{c#+K!{Ci{+3{kzci{+3{kzK{ +s# #KsQ{ +s# #KsiPI3 +*JrJrJjPC{c#+KA{{cK ++* #3Jc +s+C ++ bcJ r#CKsCC{c#+KKIIiP)s#K3kP +rBjPI3AC{c#+KKiPkPI cc +#1 c+yy!K #yy!K #I1 +c c{1 Kc) c!+CkPkP)c+kPkP{++#;33+933++ #{++#;33+CKiPhP1c{ !K!{C{Ksz++c{Ksz++KiP1c{ IsC!KKiPK+{Ksz++QIsiP!KCIsKiP1c{ q"{!{C933+sq{k ccK+KiP1c{ +3c+K{s*Qq"{Q933+sq{k ciK+iP1c{ qz Cq"{JY)kiPhPA c3!s kKcJ;C+c +s;C933+s)ã +# +c+#{ +{iPA c3 {yy1Kk++C{c#+ +zA++ iPA c3)sK z933+s {Q {yy+Kcci{#c + c+#{{c{c{+!{s;q++#iK{ zjPA c3{KscJ;C3Js c zA)sK zQqYqIiPA c3+c zcK{s{k++{cK{sC +Cq"{Ja)sK zb933+saKs+ z;Cs+Q933+saKs+ z;Cs+Kyy!K++ycK{skPA c3+c zc{933+s+c zc{QA+c zcK{sQ933+s)ã +# +c+#{ +{KiPhP1c{ aK;Cz +#KIss{ +s# #KiP1c{ aK;Czc{Iss{c{ +s# ++s K{siP1c{ aK;C#J+K{sIss!K +s;c+iPKs{bK;CJs#+IssI#+K" c+siP1c{ +K" c+IssI#+K" c+siP!+3Ks+)J +*j*r+s1 c+kPhP1c{ aK;C r;c+ c+aK;Czc{s iP1c{ aK;C r;c+{23+aK;C#J+K{ss iPhPA c39+{k +s K{siP1c{ !K3{kcJ;Cc{KsaK;Cyy{KsaK;Ciq{q{k cK+#kP{bK;C kC{c#zscaK;Cz +#KcaK;C#J+K{sscaK;C r;c+ c+caK;C r;c+{23+c9+{k +s K{sc!K3{kcJ;Cc{KsaK;CKiPhP1c{ qzc!{C933+sq{k cc!K3{kcJ;CKiPA c3 +s K{s cjK{C #{Cqzcb933+s {KQ9+{k +s K{siP1c{ 9; +cC i C)ka933+saKs+ z;Cs+Q933+saKs+ z;Cs+KiPhPI3!r +jJbJ:B* +b*JjPI3!r +jJbJ:BjP{{cC{c#+K +s K{siPyy{{cC{c#+K +s K{sA I3 +B #+C933+si +K cK11qzcIiP)c+kP +s K{s +C +s K{sQqzcJiP{{cC{c#+K +s K{siP)s#K3kPI3 +*JrJrJjPC{c#+KA{{cK ++* #3Jc +s+C ++ bcJ r#CKsCC{c#+KKIIiP)s#K3kP +rBjPI3AC{c#+KKiPkPI cc +#1 c+iPkP)c+kPkP)c+kPI3 !r +jJbJ:BjP +s K{s +C +s K{sQqzcJiP)s#K3kP)s#K3kPhPA c3{B #{iPI3zB +"z!+3Ks+#Czzr +B +"z +bJiP1c{ K C #{J YC #{b{+J yA CqzcJYqIiP1c{ {cJ;Cj9+{cJ;CjC{bK;CJs#+KiP1c{ aK;CB #{icC{cJ;Cjc1c{ A{c#zsYA{KsaK;CY!K3{kcJ;CKQK cIIiPI3AaK;CB #{r)kIiPkPaK;CB #{ryaK;CB #{riPI3zB +"zjPI3#+3Jjb*2B +"zjP{B #{i!s kKC #{ kc+CaK;CB #{rcaK;CB #{rKiP)c+kPI3s#+3C #{2 k+kP1c{ C #{2 k+iP)s#K3kP{B #{i!s kKC #{ kc+¡ C++s{caK;CB #{rcaK;CB #{rcqQC #{ c *+csQAqY +CqQa+s;CC{KsaK;CKIIaC #{2 k+KiP)s#K3kP)s#K3kPI3#+3zzr +B +"z +bjPzzr +B +"z +bjP)s#K3kPkP +s K{sQ{B #{iP)s#K3kPhPI3!r +jJbJ:BjPqzc +CqzcJiPyyA c3aK;C"2 s# #"2Bqzbqzcb933+s!K33+zc{c9; +cC c933+saKs+ z;Cs+c+c zc{c!s kKcJ;C+c +s;Cc!K3{kcJ;CcK+c933+sq{k cc933+s sc+szc{c933+s sc+sKiPA c3aK;C"2!K33+c +k+C933+s!K33+zc{KQAqzcJQaK;Czc{siPiPhPI3*11zB +"zjP +rBI3A933+si +K cB +"Jr:2 +*JiPkP{cK;CB #{#*K{{cK;C#*{bK;CC #{"+ۚ{bK;CJs#+iP +rBI3AaK;CB #{r)k11{cK;C#*sA #s kKKiPkP1c{ B #{icC{cJ;Cjc1c{ Azc#zcIIiPB #{yB #{riPB #{#*K{!+iP!+s!+{#+#*C{cK;C#*s!+{#+#*CiP!+si++z 2 {cK;C#*si++z 2 iP!+skJsk +{cK;C#*skJsk +iP!+sC #{ +s;+aK;Cz +#KsiP1c{  skK s+:+ skK s+2 {CiP933+s sc+scc!s kKbK;CC #{kc!s kKbK;CC #{K+cB #{rc!+KiP+cY933+s!K33+zc{QaK;Czc{s;Q:+{3Kc+# skK s+C933+sq{k cc!K3{kcJ;Cc skK s+KQ9+{k +s K{siPkPkP)c+kP)s#K3kPkPyQiP +rBI3AI3 +B #+C933+si +K cKIiPaK;C"2YA1{cK ;+BqzcbK+c!K3{kcJ;CKQ933+s {KQ933+s sc+szc{yy si [+933+s {S933+s sc+szc{yscys+1{ ccaK;CkPQyiPkP)c+kPA c3aK;C"2 s# #"2rzrzbBqzbqzcb933+s!K33+zc{c9; +cC c933+saKs+ z;Cs+c+c zc{c!s kKcJ;C+c +s;Cc!K3{kcJ;CcK+c933+sq{k cKiP)s#K3kP +s K{s c˃B{{k+Kr+sKCi!K3{kcJ;CcaK;C#J+K{ssc+K" c+sciP+K" c+sc +s K{sKiPaK;C"2Q +s K{sQaK;Czc{siPI3 +*JrJrJ !r +jJbJ:B* +b*JjP1b +*rjPI3A +s K{sIiPaK;C"2iP)s#K3kPhP+caK;C"2Q{KscJ;C3Js c ziPI cc +#+iPkPkPkPI3AI cc +#KiPkP+s1c{ A+ccIiPkPhP+s1c{ AaaaIiP C4pC #+Jsc#+zc{ +KcKsAccc9// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY +// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR +// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. +// +// Developed by Minigraph +// +// Author: James Stanard +// + +#pragma warning( disable : 3571 ) + +#ifndef __COLOR_SPACE_UTILITY_HLSLI__ +#define __COLOR_SPACE_UTILITY_HLSLI__ + +// +// Gamma ramps and encoding transfer functions +// +// Agnostic to color space though usually tightly coupled. For instance, sRGB is both a +// color space (defined by three basis vectors and a white point) and a gamma ramp. Gamma +// ramps are designed to reduce perceptual error when compressing floats to small integer +// values. More precision is needed in darker gradients as the human eye is more sensitive +// to contrast with dark values. A logarithmic curve is often used. +// + +// sRGB is both a color space and a transfer function or "gamma ramp". (It's not a true gamma +// curve, which have been deprecated along with CRT displays.) sRGB is what almost all 8 bpc +// textures use, and when passed to an LCD monitor they look right. sRGB textures must be +// linearized for physically correct rendering, and the linear results need to be re-encoded +// with the sRGB ramp for display. +float3 LinearToSRGB( float3 x ) +{ + // Approximately pow(x, 1.0 / 2.2) + return select(x < 0.0031308, 12.92 * x, 1.055 * pow(x, 1.0 / 2.4) - 0.055); +} + +float3 SRGBToLinear( float3 x ) +{ + // Approximately pow(x, 2.2) + return select(x < 0.04045, x / 12.92, pow((x + 0.055) / 1.055, 2.4)); +} + +// These functions avoid pow() to efficiently approximate sRGB with an error < 0.4%. +float3 LinearToSRGB_Fast( float3 x ) +{ + return select(x < 0.0031308, 12.92 * x, 1.13005 * sqrt(x - 0.00228) - 0.13448 * x + 0.005719); +} + +float3 SRGBToLinear_Fast( float3 x ) +{ + return select(x < 0.04045, x / 12.92, -7.43605 * x - 31.24297 * sqrt(-0.53792 * x + 1.279924) + 35.34864); +} + +float3 accurateSRGBToLinear(in float3 x ) {return SRGBToLinear(x);} +float3 accurateLinearToSRGB(in float3 x ) {return LinearToSRGB(x);} +// The OETF recommended for content shown on HDTVs. This "gamma ramp" may increase contrast as +// appropriate for viewing in a dark environment. +float3 LinearToREC709( float3 x ) +{ + return select(x < 0.0181, 4.5 * x, 1.0993 * pow(x, 0.45) - 0.0993); +} + +float3 REC709ToLinear( float3 x ) +{ + return select(x < 0.08145, x / 4.5, pow((x + 0.0993) / 1.0993, 1.0 / 0.45)); +} + +// This is the new HDR transfer function, also called "PQ" for perceptual quantizer. +float3 LinearToREC2084(float3 L) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Lp = pow(L, m1); + return pow((c1 + c2 * Lp) / (1 + c3 * Lp), m2); +} + +float3 REC2084ToLinear(float3 N) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Np = pow(N, 1 / m2); + return pow(max(Np - c1, 0) / (c2 - c3 * Np), 1 / m1); +} + +// +// Color space conversions +// +// These assume linear (not gamma-encoded) values. A color space conversion is a change +// of basis (like in Linear Algebra). Since a color space is defined by three vectors-- +// the basis vectors--changing space involves a matrix-vector multiplication. Note that +// changing the color space may result in colors that are "out of bounds" because some +// color spaces have larger gamuts than others. When converting some colors from a wide +// gamut to small gamut, negative values may result, which are inexpressible in that new +// color space. +// +// It would be ideal to build a color pipeline which never throws away inexpressible (but +// perceivable) colors. This means using a color space that is as wide as possible. The +// XYZ color space is the neutral, all-encompassing color space, but it has the unfortunate +// property of having negative values (specifically in X and Z). To correct this, a further +// transformation can be made to X and Z to make them always positive. They can have their +// precision needs reduced by dividing by Y, allowing X and Z to be packed into two UNORM8s. +// This color space is called YUV for lack of a better name. +// + +// Note: Rec.709 and sRGB share the same color primaries and white point. Their only difference +// is the transfer curve used. + +float3 REC709toREC2020( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.627402, 0.329292, 0.043306, + 0.069095, 0.919544, 0.011360, + 0.016394, 0.088028, 0.895578 + }; + return mul(ConvMat, RGB709); +} + +float3 REC2020toREC709(float3 RGB2020) +{ + const float3x3 ConvMat = + { + 1.660496, -0.587656, -0.072840, + -0.124547, 1.132895, -0.008348, + -0.018154, -0.100597, 1.118751 + }; + return mul(ConvMat, RGB2020); +} + +float3 REC709toDCIP3( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.822458, 0.177542, 0.000000, + 0.033193, 0.966807, 0.000000, + 0.017085, 0.072410, 0.910505 + }; + return mul(ConvMat, RGB709); +} + +float3 DCIP3toREC709( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 1.224947, -0.224947, 0.000000, + -0.042056, 1.042056, 0.000000, + -0.019641, -0.078651, 1.098291 + }; + return mul(ConvMat, RGB709); +} + +#endif // __COLOR_SPACE_UTILITY_HLSLI__qҁ ZYW[YW]Z\W]Z\\\Xۜ [ٜI3s#+3 jzB** + +j**jP!+3Ks+ jzB** + +j**iPhPIsc#+ k{C++{!+3KsKK{ssAccKiPIsc#+ k{C++{!+3KsKK{ssKsAccKiPhPxQiPA k{C++ k++yAiPhPKs;C+ {+˃+c+ sq{!+3Ks+C+ k++y3y k{C++kPh{#+cs* KCC+!+3KsKK{sy3!+sK{3Kc+cCKC +q++#+#1{kP k++C !++s#ysC+ cK#+iPPyiPhPxQiPB+ k{C++ k++ +C+s!+3Ks+#C+1{cc{Ks;iPPyiPhPxyCKI{s33+r{Ii+ cK;s+#{1c{ iP k{C++ + k++kPyyB+{c I #K s+ C+{y3C+ k{C++siPI #K s++k{c J #K s+iPyyB+s; s;c  #Ks +sKs;C+Ikc+k+s K{s+ {Kk K{skPyyC  + cK#yscI3CK s;c+Ik cc+C sq #K ssiP r;c+s +s;c #KiPhPyyB+ +Ks;{+33KK+sy3 Ki{c+c+ C+ cK#+C++C+KkPyy!+sKIi KkkA ccC+{{ky3C+ k{C++Ka  1sK{sy3kPyy +c+s;CsB+ +Ks;{+33KK+s  cK#+AI) c{kPyy9 c+K;C +Ks;;Kk+9 c+K;C"+sK; CK cK#+siP +Ks;+k c+K;C +Ks;iPyyB+!+sK{3Kc+y3 Ki{c+c+cIs)s 1sK{s1{k cK#+{kPyy!Kk+sK{sc+ c++++sAqcc!+sKK s#Ai Kkk!+sKKqiPyy!*sK˃{3Kc+ c+K;C"+sKiPqk+ c+K;C"+sK +cK#+*Ã+kiPhPyyB+ +Ks;{+33KK+sy3 +{{c C+ cK#+C++C+K!+sKkPyyIi KkkA ccC+{{ky3C+ k{C++Ka  1sK{sy3kPyy +c+s;CsB+ +Ks;{+33KK+s  cK#+AI) c{kPyy9iK+ +Ks;;Kk+9iK+"+sK; CK cK#+siP +Ks;+kiK+ +Ks;iPyyB+!+sK{3Kc+y3 +{{ccIs)s 1sK{s1{k cK#+{kPyy!Kk+sK{sc+ c++++sAqcc!+sKK s#Ai Kkk!+sKKqiPyy!*sK˃{3Kc+iK+"+sKiPqk+iK+"+sK +cK#+*Ã+kyy{#{i [+i{+{CKK +#kPhPyyB+)ãKsK{s{+33KK+sy3 +{{c C+ cK#+C++C+K!+sKkPyyIi KkkA ccC+{{ky3C+ k{C++Ka  1sK{sy3kPyy +c+s;CsB+)ãKsK{s{+33KK+s  cK#+AI) c{kPyy9iK+*ãKsK{s;Kk+9iK+"+sK; CK cK#+siP +Ks;+kiK+*ãKsK{siPyyB+ k+ k++1{C+zs++kB s[C +1sK{s1{C+kPyy +{{c1{ #+K;CsiPqk+iK+2{ # +Ks;+K;CiPhPyy+{s#iK+a +kPqk+iK++s;Ccyy s+K;;+C sqi [Ks;I+c K+{9{kk{siK+;iPiK+ +cK#+cyyC++A s#+c{K+s;CIiPiK+"+sK +cK#+*Ã+kyyiPqk+ ##Ks;iPyyB+)ãKsK{s{+33KK+sy3i{c+c+C  {aK;CA)s9sy{s+K kPyyC+ cK#+C++C+K!+sKIi Kkkc  1sK{sy3 +c+s;CsiPyyB+)ãKsK{s{+33KK+s  cK#+AI) c{kPyy9 {K{s*ãKsK{s;Kk+9 {K{s"+sK; CK cK#+siP +Ks;+k {K{s*ãKsK{siPa*s;C {K{s"+sKj +cyy {K{s{3Kc+ kPhPyyB+ + ;+ c+#{y3C+9{s#siP!Jk+sK{sc++k9{s# +c+#{iPyyB+{Ks+y3C+i Kkks+sKC s;c+1{CKC k{C+K +Ks;kPyyi++{k+#A1{i Kkk+KK{sc+C+k cc+s+sKCkPyy s;c+K+c#Ks;q+;cK;Kc+[aK;C #K s+ c+s1zIs s+c1{C+kPyy) +C +c!+;++I 9{{#C{K+iK+c#Ks;ijKsiqIqiPqk+ijKsyy{++k{+#kPhPyy+ c+#kP!Jk+sK{sc++kiK+*ã {c K{s{+3iPqk+icKc+ +Ks;2 {iPhPyyB+!K s++++sC+c s++s+ s#C+{{ky3C+ k{C++siPa*s;C{{k #KiPyyB+!K s++++sC+c s++s+ s#C+{y3C+ k{C++siPa*s;C{ #KiPhPyyB+ k+ k++1{C+zs++kB s[C +1sK{s1{C+kPyy +{{csiPqk+iK+C +2sK{s2{ #:iPqk+iK+C +2sK{s [ #:iPhPyy1c{ AqY9Q9ciqQ9KQ{CqQAqi9Q9KyAqY9Q9KaqyiqIiPyyyKkK+#iK+C +{+3kP1c{ iK+C +{siPyyB+!+sK{3Kc+y3 Ki{c+c+C  {aK;CA)s9sy{s+KaIs)siPyy 1sK{s1{k cK#+{!Kk+sK{sc+ c++++sAqcc!+sKKiPyy s#Ai Kkk!+sKKqiPyy!*sK˃{3Kc+ {K{s"+sKiP1c{  {K{s"+sKbKs+ +kiP1c{  {K{s"+sKbKs+ +kiPhPyyAyy)ssK[K+#K sy;{K[K{YKC{3+kPyyY+cKsYYKC{3)33++cIsAqɡaqɑaIiPyy1cci{{saK;Cs+I ! [+kP!Jk+sK{sc++ki{{s{c{yyAqɡaqɑaIQq!+3 csB  33+[ s#i{{skPqk+sK;Cs+yyCKI!+3 csC  33+)+ˣCKs;c[ s#skPiPhP)s#K3 N \ʸʸ\HYHURTQQSUғTYY[HURTQQSUғHLYY[S[]YY[U][[]YY[H[[]YY[[Y[[]YY[][]YY[S][[][]YY[S]X[]YY[H]\S[]YY[H\Y[]YY[[][[]YY[S]XQ\][]YY[H\YZX[]YY[TYZX[]YY[\\][]YY[\\[\YZX[]YY[\\TYZX[]YY[\\TYZXQ\][]YY[X]\[YXZ[]YY[H]\[Y[[]YY[S][[\]\][]YY[S][[X[]YY[H[][[X[]B HY[\Y]ڛ[U][[[Z]\KYY[H\\\][L HY]ڛ[U][S]XKYY[QZ[\ڛ[\\][L HY]ڛ[U][\\]KYY[]\\][L HY]ڛ[U][\\[\YZXKYY[H\YZX\\][L HY]ڛ[U][\\TYZXKYY[TYZX\\][L HY]ڛ[U][\\TYZXQ\]KYY[TYZXQ\]\\][L HY]ڛ[U][X]\[YXZKYY[X]\\\][LB H\]ڛH  [][]\KYY[\]ڛ[L HH[Y\]ڛ]ݛH  H[[][]\KYY[Q\]ڛ[L H]ݛț [][[X][]ٜKYY[S][[X [L H]ݛț H[][[X][]ٜKYY[H[][[X [LBYY[RRTTTUTSPUTHLYY[SPSPUTUUTHLBHYavht5FV&7Ǖ6VGVF6V&WEVfF6UF76ǖF@F@@bF@D^\DF@Dʾ\D@d@@dxh|@v@@@vv@f@@fxh|@v@@@vvd@ھdPdxh|@X@@R@d@v\zv\@z@v@vf@ھfPfxh|@X@@R@f@v\zv\@z@v@vF@dڜPR@ھdPX@FFRF@fڜPR@ھfPX@FFRF@ʨ@dF@Ψ@fF@ȦΨ@dF@ȦΨ@fF@ȦΨ@fF@Ψ@fF@Έ@fF@ʨ@dF@ʦΨ@dF@PR@F@PR@@F@PR@@F@F@PRF@PRF@d@dF@h@hF@f@fF@PRF@PR@ڌڨPh@R@@\v@ڌڨPh@R@@\vʦ@ʦڌڨPh@R@@\v@P@X@@R@@PXRvh@ʾPd@X@d@R@@@\\ʘP\X@X@`Rvh@ʾPf@X@f@R@@@\\ʘP\X@X@`Rv^Txf|@x^f|x|@@@@@@@@@@@t@PRX@@PRX@@PRX@@PRX@@PR@@PRtT^@@@@z@b\`v@@@@z@b\`v@@@@z@b\`v@@Ȃ@@z@b\`v@@@@z@b\`v@@@@z@b\`v^Tx|@@@@@@@@@@@X@@@@@@P@X@@X@@RtT^@@@@z@b```\`@T@v@@@d@z@@T@v@@@f@z@@T@@T@v@@@@z@@T@v@@@@z@@^@bp`\`v@@@ʾ@z@@^@dv@@@ʾ@z@@^@Pd@T@Rv@@ؒ@ʾ@z@@^@Pd@T@Rv@@ؤ@ʾ@z@@@@@^@Pd@T@@T@Rv@@ؤʈ@ƾ@z@@@@@^@Pf@T@@T@Rv@@@@z@@^@v@@@@z@b```\`@T@v@@@Ⱦʾ@z@@^@dv@@@Ⱦʾ@z@@^@dvF6s;d902941:209822.:179494֠Q5=MA!I}U9 Q%=9M}!1M1%}%9 1U5(Q5=MA!I}U9 Q%=9M}!1M1%}%9 1U4(ɅɥѥсɅ͵х͕́ɽɥչѽ4(ܕȕсс5(4( ɥс܀ɥչѽ5(ȥ́ȕ͕ٕ4(4(Hɥѥ͕̽ɍ偘ɵͱܥѡɁܥѡ5(ѥɕɵѕɽ٥СсСݥѥ5(ɕ4(ĸHɥѥ́̽ɍсȕхСٕɥ5(ѥС́сѥ́Сݥ͍ɹ4(ȸHɥѥ́偘ɵсȕɽՍСٕɥ5(ѥС́сѥ́Сݥ͍ɁС5(յхѥɁѡɁѕɥ́ɽ٥ܥѡСɥѥ4(̸8ѡɁССɥс́ɁС́5(ɥѽ́偈͕н͕ɁɽѕɽՍ́ɥٕɽ5(С́̽݅ɕܥѡсɥɁɥѕɵͥ4(4(P!%ML=Q]I$M@I=Y%eP! =AeI%!Q =1IM9 =9QI% UQ=IMM$M4(99eaAIMMC:pC #+Jsc#+c++#カs ccJ;Ck +CsAccK#include "fast_shader_trig.hlsli" + + //Window1 from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + float smoothDistanceAtt ( float squaredDistance, float invSqrAttRadius ) + { + float factor = squaredDistance * invSqrAttRadius ; + float smoothFactor = saturate (1.0f - factor * factor ); + return smoothFactor * smoothFactor; + } + + float getDistanceAtt ( float sqrDist, float invSqrAttRadius ) + { + float attenuation = rcp(max(sqrDist, 0.0001)); + attenuation = saturate(attenuation * smoothDistanceAtt ( sqrDist, invSqrAttRadius )); + return attenuation; + } + float getAngleAtt ( float3 normalizedLightVector, float3 lightDir, float lightAngleScale , float lightAngleOffset) + { + // On the CPU + // float lightAngleScale = 1.0f / max (0.001f, ( cosInner - cosOuter )); + // float lightAngleOffset = -cosOuter * angleScale ; + + float cd = dot ( lightDir , normalizedLightVector ); + float attenuation = saturate (cd * lightAngleScale + lightAngleOffset ); + // smooth the transition + return attenuation * attenuation ; + } + + +// A right disk is a disk oriented to always face the lit surface . +// Solid angle of a sphere or a right disk is 2 PI (1 - cos( subtended angle )). +// Subtended angle sigma = arcsin (r / d) for a sphere +// and sigma = atan (r / d) for a right disk +// sinSigmaSqr = sin( subtended angle )^2, it is (r^2 / d^2) for a sphere +// and (r^2 / ( r^2 + d ^2) ) for a disk +// cosTheta is not clamped +float illuminanceSphereOrDisk ( float cosTheta , float sinSigmaSqr ) +{ + float sinTheta = sqrt (1.0f - cosTheta * cosTheta ); + + float illuminance = 0.0f; + // Note : Following test is equivalent to the original formula . + // There is 3 phase in the curve : cosTheta > sqrt ( sinSigmaSqr ), + // cosTheta > -sqrt ( sinSigmaSqr ) and else it is 0 + // The two outer case can be merge into a cosTheta * cosTheta > sinSigmaSqr + // and using saturate ( cosTheta ) instead . + if ( cosTheta * cosTheta > sinSigmaSqr ) + { + illuminance = sinSigmaSqr * saturate ( cosTheta ); + } + else + { + float x = sqrt (1.0f / sinSigmaSqr - 1.0f); // For a disk this simplify to x = d / r + float y = -x * ( cosTheta / sinTheta ); + float sinThetaSqrtY = sinTheta * sqrt (1.0f - y * y); + illuminance = ( cosTheta * acosFast4 (y) - x * sinThetaSqrtY ) * sinSigmaSqr + atan (sinThetaSqrtY / x); + illuminance /= PI; + } + return max ( illuminance , 0.0f); +} + +float illuminanceSphereAttenuation ( float3 worldNormal, float3 dirToLight, float lightRadius, float sqrDist) +{ + // Sphere evaluation + float cosTheta = clamp ( dot ( worldNormal, dirToLight), -0.999, 0.999) ; // Clamp to avoid edge case + // We need to prevent the object penetrating into the surface + // and we must avoid divide by 0, thus the 0.9999 f + + float sqrLightRadius = lightRadius * lightRadius ; + float sinSigmaSqr = min( sqrLightRadius / sqrDist, 0.9999f); + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ); + return illuminance; +} + + +float illuminanceDiskAttenuation ( float3 worldNormal, float3 dirToLight, float3 planeNormal, float lightRadius, float sqrDist) +{ + // Disk evaluation + float cosTheta = dot ( worldNormal, dirToLight); + float sqrLightRadius = lightRadius * lightRadius ; + // Do not let the surface penetrate the light + float sinSigmaSqr = sqrLightRadius / ( sqrLightRadius + max ( sqrLightRadius , sqrDist )); + // Multiply by saturate ( dot ( planeNormal , -dirToLight)) to better match ground truth . + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ) * saturate ( dot( planeNormal , -dirToLight)); + return illuminance; +} + +void spot_light_params(float3 worldPos, float4 pos_and_radius, float3 light_direction, float lightAngleScale, float lightAngleOffset, out half geomAttenuation, out float3 dirFromLight, out float3 point2light) +{ + point2light = pos_and_radius.xyz-worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float rcpDistFromLight = rsqrt(0.0000001+distSqFromLight); + dirFromLight = point2light*rcpDistFromLight; + float invSqrRad = rcp(pow2(pos_and_radius.w)); + + geomAttenuation = getDistanceAtt( distSqFromLight, invSqrRad ); + geomAttenuation = geomAttenuation*getAngleAtt ( -dirFromLight, light_direction, lightAngleScale, lightAngleOffset); +} + +half areaSphereNormalization( float len, float lightSize, float m ) +{ + // Compute the normalization factors. + // Note: just using sphere normalization (todo: come up with proper disk/plane normalization) + half dist = saturate(lightSize / len); + half normFactor = m / ( m + 0.5 * dist ); + return normFactor * normFactor; +} + +half3 areaSphereLight(half3 R, half3 L, half m, half lightSize) +{ + // Intersect the sphere. + half3 centerDir = L - dot(L, R) * R; + L = L - centerDir * saturate( lightSize / (length(centerDir)+1e-6) ); + return L.xyz; +} + +half4 SphereAreaLightIntersection( half3 N, half3 V, half3 L, half ggx_alpha, half lightSize ) +{ + half4 lightVec = half4(L.xyz, 1.0f); + half3 R = reflect(V, N); + + lightVec.xyz = areaSphereLight(R, L, ggx_alpha, lightSize); + + // Normalize. + half len = max(length( lightVec.xyz ), 1e-6); + lightVec.xyz /= len; + + // Energy normalization + lightVec.w = areaSphereNormalization( len, lightSize, ggx_alpha ); + + return lightVec; +} + + +1 ZYW[YYY\ٗ [exyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3!J22*"2BbbjP!+3Ks+!J22*"2BbbiPhPIsc#+C #+:c{ csAccKiPhP0c{ !K33+c +k+C1c{ !K33+zc{IiPkP+s!K33+zc{yy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxyaKs+ z;Cs+i++ caKs+ {;Cs+kP0c{ !K33+c+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ 1"ʁqYQzCQzCQaKs+ z;Cs+iP1c{ 1"YA1"ʁiIQ{AiqzJiP1c{ 1"cYA1"ʁiIQ{AiqzcJiP+s!K33+zc{QA1"Q1"cIyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxy1{ki{Ks;1{J+{b)s+;{s+ K+c+!K33+kP0c{ !K33+c+3J+#3+s+cC1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ )s+;J qiP1c{ )s+;3 +{Aq1QaKs+ z;Cs+iq1KQaKs+ z;Cs+Yq1iP1c{ 1"ʁ)s+;J YQzCQzCQaKs+ z;Cs+iP1c{ 1"YA1"ʁiIQ{AiqzJiP1c{ 1"cYA1"ʁiIQ{AiqzcJiP+sA1"Q1"cQ)s+;3 +{Kyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhP0c{ !K33+c+3J+#C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP+s!K33+zc{Q!K33+c+3J+#3+s+cCaKs+ z;Cs+cqzbqzcbzCJyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhP0c{ !K33+B s3+s+cC1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCb1c{ +{*3c+KK˻*K;CIiPkPyyJs+++z#1KKs;cq++#{Is+{{s+y{;Cs+ k+K K{s{kPyyC+K9c{Ks+ k+K K{s99;iP1c{ 9; +cC aKs+ {;Cs+SaKs+ {;Cs+iP1c{  9; +cC S9; +cC iP1c{ 9 +CAqyqIQa{;Ay iIIiPhP1c{ 1zCY{AizCJiPyyBK1 {s+C+)s+{{ 9 Ks; s;c+1{a{{;Cs+i +K csiPyyI+ +)s+;Ks; 9 Ks; s;c+1{k{{C!K+c+Ki +K ckPyyB+AK;C+C+ c+9Kk c+;IcC+a{+C+)s+;{{Kcc+kPyyB+!+3 c c+1{kB sIqqiPyy*Ks;C+ c+{q9+K#y33CK)s+;{{siP{s1c{ Kk c+q1iP1c{ 1AqiKk c+Q{AqiqzcJIQAqiKk c+Q{AqiqzJIiPhPyyz;CA1I{k{{C1+{s+Is+{c K{skP1c{ 1#a+C1a1a +CqQ9iqIIiPhPyy*{+3c+KK{sKK{ssiP1c{ 1AAqQ9iIQ9YqIQzCQ)ÃAii CqQ9iqaqIQCqzCIIiPyy cc{{1 #+y{;C+{+3c+KKkP1Q+{*3c+KK˻*K;CiP+sA1#Y1IiPkPhP0c{ !K33+B sC1c{ !K33+zc{c1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCb1c{ +{*3c+KK˻*K;CIiPkP+s!K33+zc{Q!K33+B s3+s+cCaKs+ {;Cs+cqzbqzcbzCbqzCb+{*3c+KK˻*K;CKiPkPhP0c{ !K33+{+ss + C1c{ !K33+zc{c1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ zcQzCiiP1c{ iaKs+ {;Cs+QaKs+ {;Cs+iP1c{ iiQiiP1c{ iqQiQCiYqIiP1c{ zKzciqzQqzciPhP1c{ qQiQCiYqIQAzKzKQCi CqzcbqzJIIiP+s!K33+zc{QAYIiPyy1c{ qQiQCiYqIQzKQAzKiKsCaqzcyqzIqzcIiPyy+s!K33+zc{QAqzcQYIyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxyqIC+q{k c!K+K{skPxyIC+K++{kPxyq"{IC+{Ks+ s;c++++sC+K++{ s#C+q{k ckP0c{ 9+#J33+#zkKs s#JA1c{ qb1c{ b1c{  +#r"{b1c{ 9; +cC KiPkP1c{  q1Q9; +cC iq1iP1c{ iq1Q9; +cC Yq1iP1c{ a+3 +{ +AA +#r"{R YKQ9; +cC KiPyyB++cIq{q{k cK+# +1+CIs +k kP+sa+Aqbba+3 +{IiPkPhPhP)s#K3 O0 \ʸҾ\Ҙ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYHUҗSYY[HUҗHLBHYHWSWғTYY[HWSWғH ZHYYBKKKKKKKKKKKKKKKK HQKKKKKKKKKKKKKKKKBZ YWWW +Z[[Yܗ[[ ZӛHJ^ S^ܛ L Q]Hӛ\Z\XHPțQ][HRHW HY]]ڛY[]\K؛Z  HHK  H M  H K͍   HN؛Z X HH   L  H  H HNZ H[[Yܗ[[ + +XNZH HH[ +  +  H +HK  +ӛH +H + +  +KN\]Z +HK  H H + +H +NB_BZ HQ +Z \X[ۛ Z[[Yܗ[[ ZӛHJ^ S^ܛ L Q]Hӛ\Z\XHPțQ][HRHW HY]]ڛY[]\KZ HHYWWW +[[Yܗ[[ ӛHN\]\X[ۛ +H  +HK^^\]\]JWSWғ\X[ۛYNB_BBZHQӛ[[] +Z[[Yܗ[[ ZӛHJ^ TX[HHQ + [[ ӛHJ؛Z  HHK  H M HN؛Z X HH   L HNZ H[[Yܗ[[ + +XN\]H[ +  +  H +HK  +ӛH +H + +  +KNB_BHYYa}؇h5FV&7Ǖ6VGVe6G5FV&E'v6ǖF^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@^^^^@@^^F@ؾ@f\bhbjrdljfjprnrfdfphldlhffF@ؾ@P`\j@T@f\bhbjrdljfjprnrfdfphldlhffR^^@h@@@^^@h@X@bl@@@^^@n@T@b`Zj@@^^@@t@@@@@P@t@@@RX@\@@@\\@X@\@hP@ܰR@b@z@PܰRv@d@z@b@T@bv@f@z@d@T@bv@v@z@Z`\dbdbbhh@T@b@V@b\jn`ndppv@z@`\`nhdlb`@T@d@V@v@z@Z`\`bpndrf@T@f@V@v@z@Pb\`@Z@bR@T@v^^@@@^^@@@@@@@@@Z@@@@ܰ@|z@`\`@~@@t@ؾ@Z@v^^@h@@@^^@h@X@bl@@@^^@n@T@b`Zj@@@@܌hP@ܰR@@z@ܰv^^@@@@@@ؾ@Z@hPRv^^@h@@@^^@h@X@bd@@@^^@n@T@b`Zj@@@^^@@t@@@@@@X@X@\@@@X@\@X@\X@@d``l@܌hP@ܰR@@@z@ܰv@TPZ`\bnph@T@PR@Z@`\`llf@T@@T@@V@b\`f`bRvF@ؾF@ؾF6>$902941:23:32/249402'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р06VGV"2FV&EVfV6&ҠР 6WԖ67fW6FV&bFFW&ƖҠנ"WFW'FW&2DtUԔ45dUӠנР0G'W7F%6V67WFv$VgfV&ננf6BffV7W6&Ӡf62W6V&7&Ӡf6B'6V7V67&Ӡf"VwV67–V&'VwV67ӠbF7&ƶӠРfVFV67ӠfB'6V7V6RFV&B'6V7VF&VFƖ6֠РfRG'6FWF&VF2V7G֠f2V7G֠f2FvӠf6R֖676&ӠfR֖67&GӠbFFW&ƶӠзӠР0G'W7FR6VFv$VgfV&ננf6&VFӠf2FV67ӠbF7&ƶӠРfVFV67RFV&B'6V7VF&VFƖ6&R֖67֠fB'6V7V6RFV&B'6V7VF&VFƖ6&R֖67֠fR֖67&GRFV&B'6V7VF&VFƖ6&R֖67֠РfRFV&&R֖67֠fR֖675G'WvFRFV&&R֖67֠f2FvӠbFFW&ƶӠbFVGǖVӠзӠР0G'W7F6VFv$VgfV&ננfF&VFӠbFG&5FV67FW&ƶӠf&VFF%6V7V65Fv'6V67WF֠зӠ2V&WB%6g&֠`F'R6FV&ƆbF7Ҡנf&R6&ƖW悗2'G梧RRӠR6R6RRӠ"WFW'R6Ӡנ`F7BV6FV&ƆbF'R6ҠנbFGbFGR6悗bFG""bFGӠfBF悗悗wӠ¶Ӡ悗2'G–Ӡ"WFW'悗"f6ӠנfVז6Vf62ƖҠנ"WFW'BF2f6"RsCӠנfBV6FV&VFf6&VFҠנ"WFW'2FW'FWVז6V&VFCGvB&V&B2&76F7667&VF62Fvננ6VFv$VgfV&6u&VgfV&R6VFv$VgfV&r&VgfV&Ҡנ6VFv$VgfV&r&VgӠfVFV67$G%6V7V6r&VgfV&VFV67ӠVFV67$G%6V7V66WԖ67fW6FV&r&VgfV&FW&Ɩr&VgfV&R֖67&GVFV67$G%6V7V6ӠРbF7&5FV67bF7R6FV&Ɔr&VgfV&&悗r&VgfV&2FV67#sӠfFW&r&VgfV&FW&b2Ӡr&Vg&5FV67FW&bFG&5FV67FW&ƖӠr&Vg&VFfFr&VgfV&&VF6WԖ67fW6FV&r&VgfV&FW&Ɩr&VgfV&R֖675G'WvFcUԔ45r&VgfV&Ӡr&Vg&VFfFvr&VgfV&&VF""r&VgfV&Ӡr&VgVFF%6V7V65Fvb&VFV67$G%6V7V6Scb&r&VgfV&2FvS"SSӠr&VgVFF%6V7V65FvbF'VFV67$G%6V7V6r&VgfV&2FvӠ"WFW'r&VgӠנР`FR6&6FV67bF7&5FV67VGbF7&VGf2FV67Ҡנ&BV6FV&Ɔ&5FV67炗Ӡ2FV67&6&5FV67碗ӠנР`FR6v$VgfV&&6FV676VFv$VgfV&r&VgVGbF7&VGf2FV67ҠנR6&6FV67r&Vg&5FV67FW&悗&2FV67ӠנРP6VFv$VgfV&R6v$VgfV&6VFv$VgfV&r&VgҠנR6VFv$VgfV&r&VgfV&ӠРr&VgfV&FW&b&r&Vg&5FV67FW&r2bӠfVFF%6V7V65Fvr&VgVFF%6V7V65Fv炧"SScӠf2Fvb&6VFF%6V7V65FvcSӠfVFV67$G%6V7V6b&VFF%6V7V65FvSӠf2Fvr&VgVFF%6V7V65Fv璷ӠfVFV67$G%6V7V6r&VgVFF%6V7V65Fv炷Ӡr&VgfV&&VFr&Vg&VF悗ӠR6v$VgfV&&6FV67r&Vgr&VgfV&&r&VgfV&2FV67ӠРr&VgfV&R֖67&G6WԖ67fW6FV&r&VgfV&FW&ƖVFV67$G%6V7V6Ӡr&VgfV&VFV67VFV67$G%6V7V6Ӡr&VgfV&B'6V7V6Ӡr&VgfV&6WԖ67fW6FV&r&VgfV&FW&Ɩr&Vg&VFrӠr&VgfV&R֖675G'WvF6WԖ67fW6FV&r&VgfV&FW&Ɩr&Vg&VFrUԔ45Ӡr&VgfV&2Fv2FvӠr&VgfV&BffV7W6&&VFr&VgfV&VFV67Ӡfb&W6VCVV6F'6CcV&ccc2FV672'"Wf&6FfWFV"Wf&6FfWFVb&BVV6F'66Ӡr&VgfV&2W6V&7&V&f6b&W6VCVV6F'6b&W6VCVV6F'6b&W6VCVV6F'6&VFr&VgfV&VFV67Ӡ"WFW'r&VgfV&Ӡנ%6V67WFv$VgfV&'6V67w$VgfV&R6VFv$VgfV&r&VgҠנ%6V67WFv$VgfV&r&VgfV&Ӡr&VgfV&FW&r&VgFW&ƶӠr&VgfV&&r&Vg&ƶӠr&VgfV&–V&'VwV67r&Vg2FV67Ӡr&VgfV&"VwV67SBr&VgfV&–V&'VwV67r&VgfV&–V&'VwV67Ӡr&VgfV&VFV67r&VgVFV67Ӡr&VgfV&B'6V7V6r&VgB'6V7V6BVWB""FR6FvrS62&'W6Fנr&VgfV&R֖676&r&VgR֖675G'WvFr&Vg&VFӠr&VgfV&R֖67&Gr&VgR֖67&GӠr&VgfV&RG'6FWF&VFBV6FV&VFr&Vg&VFӠr&VgfV&BffV7W6&r&Vg&VFr&VgfV&VFV67r&Vg&VFVFҠr&VgfV&2Fvr&Vg2FvӠr&VgfV&B'6V7V67&r&VgfV&BffV7W6&r&VgfV&B'6V7V6ӠРfb&W6VCVV6F'6Ccr&VgFW&2Dt$"r&Vg2FvV&ccc"VwV672'"Wf&6FfWFV"Wf&6FfWFVb&BVV6F'66Ӡb&W6VCVV6F'6V&b&W6VCVV6F'6cr&VgfV&"VwV67r&VgfV&B'6V7V6Ӡb&W6VCVV6F'6r&VgfV&B'6V7V6Ӡr&VgfV&2W6V&7&V&f6b&W6VCVV6F'6b&W6VCVV6F'6b&W6VCVV6F'6r&Vg&VFr&VgfV&VFV67Ӡr&VgfV&r&VgӠ"WFW'r&VgfV&ӠנР`FFu&VgfV&VGR6VFv$VgfV&"W6WFҠנ"W6WF&VF"W6WF&Ӡ"W6WF2FV67"W6WFVFV67"W6WFB'6V7V6Ӡ"W6WFR֖67&G"W6WFR֖675G'WvFӠ"W6WF"W6WF2FvӠ"W6WFFW&2Dt$ĴӠנ`FF&VFVGR6VFv$VgfV&"W6WFf6&VFҠנ"W6WF&VF悗&VFӠנ`FF5FV67VGR6VFv$VgfV&"W6WFf2FV67Ҡנ"W6WF2FV672FV67ӠנР`FF&ƆVGR6VFv$VgfV&"W6WFbF7&זҠנ"W6WF&&׶ӠנР`FFVFV67VGR6VFv$VgfV&"W6WFfVFƖҠנ"W6WFVFV67VFƶӠנ`FFE'6V7V6VGR6VFv$VgfV&"W6WFfB'6V7V6Ҡנ"W6WFB'6V7V6B'6V7V6ӠנР`FFVGR6VFv$VgfV&"W6WFfҠנ"W6WFӠנ`FF5FvVGR6VFv$VgfV&"W6WFf2FvҠנ"W6WF2Fv2FvӠנ`FFFW&ƆVGR6VFv$VgfV&"W6WFbFFW&ƖҠנ"W6WFFW&FW&ƶӠנ`FFU֖67憒VGR6VFv$VgfV&"W6WFbFR֖675G'WvFҠנ"W6WFR֖675G'WvFR֖675G'WvFӠנ`FFU֖67&GVGR6VFv$VgfV&"W6WFbFR֖67&GҠנ"W6WFR֖67&GR֖67&GӠנР0G'W7Fr$TedT$TEUEՠנfF&VF2eE&wVFӠbFG&5FV67FW&2eE&wVFӠfFVFF%6V7V65Fv2eE&wVF'ӠзӠРp$TedT$TEUEr'FWu&VgfV&6VFv$VgfV&r&VgҠנr$TedT$TEUEr&VgTGӠr&VgTG&VFr&Vg&VFӠr&VgTG&5FV67FW&r&Vg&5FV67FW&ƶӠr&VgTGVFF%6V7V65FvfFr&VgVFF%6V7V65FvӠ"WFW'r&VgTGӠנРp$TedT$TEUER6FVu&VgfV&%vR6VFv$VgfV&r&VgfV&Ҡנ"WFW'r'FWu&VgfV&6u&VgfV&r&VgfV&ӠנР0BVfVR6FVu&VgfV&"R6FVu&VgfV&%vҠРf6W&GW''&Ɔf66&f6bF7bF'RgҠנrVFRFvVbW6F&7fBVWB'vV֠bF7BBFӠbF7B'BFӠbF'BVgBFRgӠbF'BVg'BFRgӠР2fWBV–V&27GW֠bF7B'W&2&67B'ӠbF7BW&2&67B┲ӠbF7BB'W&BVgBW&BVg'シӠbF7"B'W&BVgBW&BVg'㒷ӠР26G'W7F27V֒f&Fb&V֠bFf"7'GBFBBBF""Ӡ"WFW'f66&6&fB6&f"ӠзA!p͡qՑqՙ}ɕͱq^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@D\Dd@޾t@P`Rvd@ؾt@PbRvd@ؾt@PdRvd@оt@PfRv@@t@P`RvȎ@ȠȎPd@R@@@@Ȏ@v@@@@\޾@z@޾\ʘPX@X@`Rv@@@@\ؾ@z@ؾ\ʘPX@X@`Rv@@@@\ب@z@ؾ\ʘPX@X@`R\v@@@@@vȎ@ȠȎPd@R@@@@@P֎PȠȎPRRRv6S?D902941:2.090/249494`2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf$Et$UETdT4TDT$ՠ0BVfV$Et$UETdT4TDT$ӠРРР0f$Et$UTDԠ0BVfV"t$5uT梗wנ0BVfV"t$5uT梗נ0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠Р0fFVf2DT$5T$4$#Ӡ0BVfV2DT$5T$4$#Ӡ0RFf֠Р0BVfVrUE$uTDӠ0BVfV2CS#cSc֠0BVfV2CS#cS֠Р0BVfVR5Ӡ0BVfVRDbF7Ҡ0BVfVRDbF7Ҡ0BVfVRDbF7ҠР0BVfV4%UdU$5U$D5Ӡ0BVfV2U$DU5T$$T4DӠ0BVfVBV'VBV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V&BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V6BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'VFBV'V6&WF5W&GWF%5VuW7נР0BVfVbWFf֠0BVfVbWF&f&Ӡ0BVfVbWF6f6Ӡ0BVfVbWFFfFӠР`F7bFbF"bF2Ҡנ"WFW'"2Ӡנ`FҖ6bFbF"bF2Ҡנ"WFW'ҖҖ"2Ӡנ0BVfVd$DנР`F7bF7Ҡנ"WFW'7梗Ӡנ`FGbFbF"bF2bFBҠנ"WFW'B"2Ӡנ`FҖFbFbF"bF2bFBҠנ"WFW'ҖҖBҖ"2ӠנР0BVfV%U44U'W66W֠0BVfV2%E5D2'G2FW'FWҠ0BVfVb5TE4DVbFGV3e4DӠ0BVfVBW'Ct&FRgBB2Vv$F625V&7GFWRgₗBBҠ0BVfVBW'CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%TFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%T$'FRgF2VTfWƆ625V&7GFWRgₗwFҠ0BVfVBW'C'Rg2V625V&7GFWRgₗRgrҠ0BVfVBW'CRg2V625V&7GFWRgҠ0BVfVBW7CRg2V625V&7GFWRgҠ0BVfVBW7T%TRg2V625V&7GFWRgҠ0BVfVBWGW'WvFV&B7rFV&625V&7GFWB7Ҡ0BVfVBWWfTF7df6WFB7Ff6FF7B7Ff6Ҡ0BVfVBWGW'Wdf6WFB7f62V625V&7GFWB7f6Ҡ0BVfVBWGW'WFdf6WFB7Ff62VTfWƆ625V&7GFWB7Ff6ҠР0BVfV2%$ET$VbƖҠ0BVfVՠ0BVfVR$U&ՠ0BVfV"$4%&6ՠ0BVfVbDEUeFGWՠР0BVfVRE5E%U5DV2G'W7FVנ0BVfVBT4$UUT5UDT$T$ՠ0BVfV"UDU%UE5E%U5DVҠ0BVfVDUE5E%U5DVҠР0BVfVtU5U55$UT4ՠ0BVfVrTD55$UT4b76b76נ0fFVfBUUdTD5ETdTDԠ0BVfVBUUdTD5ETdTDӠР0BVfV2T4EUEU%U$CԠ0BVfV2T4EUEU%U$CU%B7Ӡ0BVfV2T4EUEU%U$C$%ՠ0BVfV2T4EUEU%U4CԠ0BVfV2T4%TedT$bVVҠ0BVfV2T4%TedT$U%B7Ӡ0BVfV2T45E%U5DU%UD%TedT$bVVҠ0BVfV2T45E%U5DU%UD%TedT$U%B7Ӡ0BVfV2T45EU4Ԡ`FGBWWfTF7&6WBUGW'W&CcFGF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F7BWWfTF7&6WBUGW'W&CcF7F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F'BWWfTF7&6WBUGW'W&CcF'F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FBWWfTF7&6WBUGW'W&CcFF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FGBWWfTF7&6WBUGW'W&C$'cFGF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W&C$'cF7F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W&C$'cF'F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W&C$'cFF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FGBWWfTF7&6WBUGW'W6CcFGF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W6CcF7F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W6CcF'F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W6CcFF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ0BVfVBWWfTF7B7FBWWfTF7&6WB7FeTŔTҠР`FGF&TgfV&'6W"TgfV&cFGFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F7F&TgfV&'6W"TgfV&cF7FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F'F&TgfV&'6W"TgfV&cF'FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`FF&TgfV&'6W"TgfV&cFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"TgfV&SFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W2E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"u5E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7ӠנPFF&TgfV&'6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7Ӡנ0BVfVF&TgfV&B7F&TgfV&'6WB7eTŔTҠ0BVfVF&TgfV&'B7F&TgfV&'#6WB7eTŔTҠ0BVfVF&TgfV&7B7F&TgfV&7#6WB7eTŔTrVFV52Ҡ0BVfVF&TgfV&GB7F&TgfV&G#6WB7eTŔTҠ`F2G&W&TgfV&'6W"u%GWDF&W67'TgfV&FB7RFbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WB7bVWӠנ`F2G&W&TgfV&'#6W"u%GWDF&W67'TgfV&FB7RF'bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W&B7bVWӠנ`F2G&W&TgfV&7#6W"u%GWDF&W67'TgfV&FB7RF7bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W6B7bVWӠנ`F2G&W&TgfV&G#6W"u%GWDF&W67'TgfV&FB7RFGbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WFB7bVWӠנ0BVfV2G&W&TgfV&B7bVW2G&W&TgfV&'6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&'B7bVW2G&W&TgfV&'#6WB7bVWeTŔTrVFV52Ҡ0BVfV2G&W&TgfV&7B7bVW2G&W&TgfV&7#6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&GB7bVW2G&W&TgfV&G#6WB7bVWeTŔTҠ0BVfV2G'W7FW'WF&TgfV&DB7UF2T45E%U5DU%UD%TedT$U%B7B7ՠ0BVfV"VgfV&DB7UF2T4%TedT$U%B7B7ՠ0BVfVBWGW'W&CDB7F'2T4EUEU%U$CU%B7B7ՠ0RFf֠РPF2GW6fTF7&6WBUGW'W&CSF'F'B7FbVFFVҠҠ2T45EU4ĴӠ"WFW'E7rӠנ0BVfV2GW6fTF7B72GW6fTF7&6WB7eTŔTrVFV52ҠР0f2DT$5T$4$#Ӡ0BVfV2WV6F"2"2֠0BVfV&""֠0RFf֠Рf66fFW&f6bƖҠנ0fd%U44Ԡ"WFW'ҖbbSSCゖӠ0R6W֠"WFW'2WV6F6gFWBFbbƖ₇bf6Ӡ0RFf֠נР0RFfA5FV&7Ǖ6VGV'&6ǖ?^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@F@xʾ\|F@x\|F@xҾ\|^^@@F@@`F@@bF@@dF@@fF@@hF@F@@^^^^^^^^^^^^F^^@@@F@@`F@@bF@@dF@F@@F^^@@@@F@@`F@@bF@@dF@@fF@@hF@@jF@@lF@F@@F^^@F@@`F@@bF@@dF@F@@F^^@F@F@@`Ff@Pf@ʆX@@X@@ެX@@ޘX@@ސRF@@@@zz@@@@ʘP@ʆ@RvF@@zz@@@@ʞܜP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@^^F@@@X@@ސ@@@`vFf@Pf@ʆX@@X@@ެX@@ޘX@@ސX@@ސRF@@@@zz@@@@ʘP@ʆ@RvF@@zz@@@@ʞܜP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʄP@ʆX@X@ެX@ޘX@ސ@RvF@@zz@@@@ʆP@ʆX@TX@ެX@ޘX@ސX@ސRvF@P@X@@ސRF@@@@zz@@@@܄P@X@ސ@RvF@@zz@@@@܄P@X@ސ@RvF@@zz@@@@܎P@X@ސ@RvF^^@@z@@^@PhTޘTެR@ƬP@X@@ެX@@ޘX@@ސRF@@@@zz@@@@PRvF@@zz@@@@P@ެX@ޘ@RvF@@zz@@@@P@ސ@RvF@@zz@@@@P@X@ެX@ޘ@RvF@@zz@@@@P@X@ެX@ޘ@RvF@@zz@@@@ІP@X@ެX@ޘ@RvF@@zz@@@@ІȂP@X@ެX@ޘ@RvFf@Pf@X@@ސRF@@@@zz@`@@@؜P@@RvF@@zz@b@@@ئP@X@ސ@RvF@@zz@d@@@،P@X@ސ@RvFf@P@X@@ެX@@ޘX@@ސX@@ސX@@ܦX@f@܆R@@@@@@z@PX@ސRv@@@@@@z@ƬPX@ެX@ޘX@ސRv@@@@f@@z@@T@v@@@@@v^^@t^^\\^Z^^d`bh^bb^ʾξʾ޾d\@P@@@@@BR@ʦƞP@ȾX@@X@@R@@@@@PPȾ@V@X@dPZbl\`@T@@Z@b\`RR@Z@b@V@Rv^^@z@T^^@@z@Tf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@X@f@܆X@@RF@@LL@@zz@@@@@@ʘPʈʆRvF@@@@f@@z@P@V@Rv@@@@@ސ@z@PPX@RRv@@@@@ސ@z@PPX@RRv@@@@f@@z@PʈʆX@X@ެX@ޘX@ސRvF@B@@@@f@@z@PX@ެX@ޘX@ސX@ސX@X@܆R@T@v@@@@f@@z@PX@ސRv@@@@@P@V@@T@RvF@@@@@vFFf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@X@f@܆X@@R@@@@@ȄPެX@ޘX@ʈʆX@X@X@X@X@X@X@X@܆X@R@T@ޘvf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@R@@@@@ȄPެX@ޘX@ʈʆX@X@X@X@X@X@X@X@fP`X@`X@`RX@`Rvf@ȄP@ެX@@ޘX@f@ʈʆX@@X@@X@f@X@@X@f@X@f@X@f@R@@@@@ȄPެX@ޘX@ʈʆX@X@X@X@X@X@X@X@fP`X@`X@`RX@`R@T@ޘv^^@^^^^^^^^^^^^@t@Zbnrn@@@@@@@P@@@܎@@\R@ʄfdP@R@@@@@z@P@xx@blR@@P@||@blRv@@@@@z@PP@L@`jjjjjjjjR@xx@bR@@PP@L@`R@||@bRv@@@@@z@PP@L@`ffffffffR@xx@dR@@PP@L@`R@||@dRv@@@@@z@PP@L@`````R@xx@hR@@PP@L@`````R@||@hRv@@@@@z@PP@L@`````R@xx@pR@@PP@L@`````R@||@pRv@@@@@vd@P@X@@R@@@@@@b@z@PPR@^@Rv@@@@@@d@z@ʄfdPR@T@d\fdpf`lhfljfplrlfZb`v@@@@@dPbX@dRvf@ʦʎPd@X@@dR@@@@@@@z@d\`@T@@T@\v@@@@@@@z@PPb\`@Z@\R@^@Pb\`@V@Pd@Z@b\`R@T@\RRv@@@@@@ܨ@z@Pb\`@Z@@T@Rv@@@@f@v@@@@\@z@ܨ@T@PRv@@@@\@z@ܨ@T@PRv@@@@\@z@v@@@@@@@@@v@P@dX@@ސR@@@@@@@z@Pސ@T@d@Z@ސR@T@ސ@V@b\`v@@@@@d@^@P@T@@T@Rv@ʠ̎P@X@@dR@@@@@@T@PdX@Rv@P@ސX@@dX@@ސR@@@@@ʠ̎PސX@dR@^@Ph\`@T@ސX@`\`````bRv@Pf@R@@@@@PX@fP`\dbdlX@`\nbjdX@`\`nddRRvF6?,902941:29023706494{2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР0fFVf2DT$u$4Ԡ0BVfV2DT$u$4ӠР06VGV"&Gv&WEVfV66ǖ&ҠР`Fv'bF'WFW'נ`FvGbF'WFW'v'נ`FvbF'WFW'vGנ`F'v'eW6&bF''WFW'נ`F7v'eW66bF7'WFW'נ`FGv'eW6FbFG'WFW'נР`F'v'bF''WFW'נ`F7v'bF7'WFW'נ`FGv'bFG'WFW'נ`FGvGbFG'WFW'v'נ`FGvbFG'WFW'vGנ`FGvcbFG'WFW'vנ`FvWbFgFbbc"WFW'bנРfv'f'WFW'נfvGf'WFW'v'נfvWffFFF"WFW'FנР`F2WFvbFbF"WFW'v&6c’נР`F7BvVFGv&FbF7bbF77B%Ҡנ"WFW'VdžB%bӠנР`F77rTFG%bF7ҠנbF77B%ӠРbF7B2&67RDӠBV&2&67RDB2GWR5BFBBӠB&ƖWBӠР26GbF7"&ƖW2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F77rTFG%bF7bF7BҠנB&ƖWBBFB┲Ӡ26GbF7"2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F–V&WbF"vGTGbF'BV6FVEVGҠנ"WFW'"7BV6FVEVGBV6FVEVG"vGTGӠנР0RFfAap͡qՑqձ}ɑͱ1t7<34:$''&! 6634929227<34:4479%#* 6634929243723)* /!)"/$)242)* /!)"/$)&41:29023706494172:9:09"##7&7"99#7&743723$'$'242$'$')274-!4777297334:23177796:29<7:4221:930:9:4:77!47730:3068030:7$30:630680306830:762:9771622;7$7477<$4:224727706<3477994422<-077*20:2437321:321093634:9930:9:4:7707730:3068030:7$30:630680306830:7$7$72:972<87$67$67$7$477<$4:224727706<3477994422<#,*;144:30:9:4:7#,30:3068030:7$30:068030680306830:27$06807$7$02:9706800<22477<$4:224727706<3477994422< 7:71#,930:9:4:7#0730:30680,30:3068,30:7$30$30,30,30:7$7:,$30:7$7:,$30:27$7$;306807$7$;30687$72:970<30680,3068,22477<$4:224727706<3477994422<9544::9501=7928917:90430:9:4:7!7:430:3068030:730:930680306830:947$730:474930:474474472:974742<8944749947477<494230:2:684:2:9730:2:<07730:7+30:7&2:97180<7&7+30:2:5790230:7$30:7&30:7+30:7$30:306830:'7:1620<7&30:'7:1620<7+30:7/7/+7:$7$72:9747477/7/+7:$'7:16227/7/+7:$'7:162227 172:22:8229:00:219237264:467902684330:2:22730:7$2:97187$7$30:2:14530:3068030:7+30:7&30:5;3068030:2:145+7+30:2:145&7&2:972:145+2:145&4:42679#30:2:4:430:3068030:7+30:7&30:0;3068030:2:4:4+7+89:7+7+7+0030:2:4:4&7&89:7&7&7&002:97182:4:4+2:4:4& 87077737920224:42679#4:30:2:4:79202230:3068030:7+30:7&30:0;3068030:2:4:4+7&89:7+7+7+0030:2:4:4&7+89:7&7&7&0030:0306830:2:4:4+7&7+0030:2:4:4&7+7&002:97182:4:4+2:4:4& 870777347:4:42679#-4:=*7290743:24)043:1774717222!)"930:2:4:79202 887<30:3068030:7+30:7&30:2:4:4+7&7+306803068030:2:4:4&7+7&30680306802:97182:4:4+2:4:4&9544::9501=7928917:90430:2:!7:430:7+30:72:9777+7&730392672309:07792:979:07730392145309:077930:7$30:17$ <:439:079806<64120729490274222729042:970:02$'$')9:0779319:0773014534930#30:7$30:3479:30:1730:47;34342:97#0<3047;3447;3447;3##303926#926309:077930:7$30):07789:89:16830309:0779307):07789:):07789:30389:777$7$2:97;/3737;/77$77$302:3423177130)3070630:30680680;40/342:97298706)306889:306830680274 ρH)J.k. lkṋL(lŅŅ,ͭkM퍬lK̍L+m-k-Lnk-L,ͭln ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(4(Ʌ5(4(4(5(5(̍5(5(Ёѕ̥̍С̡͕́́Ɂ5(5(5(4(4( 1M14(4( U } } =U9Q4( M}9Y} U 5AM} 1= -}M%i4( U 5A}9Y} }M%i4($II%9 }5A} }M%i4(H1 Q%=9}5A} }M%i4(H1 Q%=9}5A}5%A} =U9Q4(4(8U}5a}M-%99%9} =9M} =U9Q4(4(L!%9}9=I514(L!%9}5%MM%Y4(4a}5%MM%=9и5(4(1= 1} UI}AI%a }5(LeMQ5} UI}AI%aL }5(4(|}5(4( 偈4(4(LQI%9%e}%5A1ी5(LQI%9%eीLQI%9%e}%5A14(4(̡}5(5(ѕɁѱɥ}٥݁ ՙAɕLQI%9%e1= 1} UI}AI%a4(ѕɁѱɥ}٥݁Lѕ ՙAɕLQI%9%eLeMQ5} UI}AI%a4(4( ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡ ՙAɕ4(5(4(Mѕ ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡLѕ ՙAɕ4(5(5(4(͕|}5(4( 1M1偈4(4( =9 Q}ɕ᱀ɕፌ5( =9 Qɕ᱀ =9 Q}ɕ᱀4(4(1= 1} UIՙɁ =9 Q1= 1} UI}AI%a4(LeMQ5} UIՙɁ =9 QLeMQ5} UI}AI%a4(4(|}mF6" +-T4l`($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +krBlB)B+B,B.BD !dhP! +ps0  `Xҡ Ȑ ,mHb(Fb(`AvhC 972 1 2C2!2!X@PM 8 }1 ՙMk"Ca$F2$C14F&ip2!!6g#h`ea.X d֨ dthdXX2p#6ҡ m0nhTH&ȶS)9b#PQQцAԈ6 2D;0P)A `CG\&I7AH Mo82( Q R(*zz" $͆%F@ɏH)(@ !a&A(Tڰ(()(҆6,e0J|JtJ1GeJ!( 5J|JtJ1G(҆BJIXɕLY}QɝMe"CGGC$CJY0,R`ZJ#`V +Ŭ"%YEpK;$(4" n\)P +' @O##0XG=J`z\`Ȁ: u' @O#0XG=*`zu`L%: 0:02q "NB+ *screen_pos DnPh!j @76.@IXZ"rawDepthDlX s&F6'6.@ĖI @O#0 r&F67.@ĖI &K=pa.moveFromPosDl_ AK+ b +"%B)2<77:763;47CIT KyʅęXٸ8^8uH44.B7N*u '@ @O833+!/ 0@.ͭlnIJ.mnm,o\_T/2q "1S-}RMQS aS%Nl0A8Ā۸ة^5u# %@F>@߃D_TCH_Ը8^!%@KBHL0d&W6VCVV6F'66.@&̪^B `\.$%RZ @.-i\.j؂%R[ 0.@zE ɍK%a:lightDirectionDpI[][X[ٸ\+$ ĖvFvVdf6WF7.@J0%@].$*pK+}ɕѥKY2\ȃ!{` '<.point2light DMɽ1эKY2]HQ[Sݸ-Ȑɽ1эKY2\ȃ`f7''F6.@d=N<|!>invSqrAttRadius D#cIB=\Qݸ`-XFGWVF6.@>\<%@Gj@;*Z|Ȉ%@l 17q "A[a$@f(lMn\~ؖy 9+{k +s K{s!e0.B?<:J#%@]G 34:4q "[r{k cK+#cJ;C*{!eQ eXDp P K%D7q "T^K$@!i\*@- DHP %k -b`/YEKODh IKqH# \\ݸS/!ٵM H]KY[[tP +]KYݔ u,̽ɍѕMVubvnGwz||҇}G~B̽ɍM [dx.source.mainFileNameSC2V'7V&w67%x!+dx.versionSrBbfW&7%!;dx.shaderModelS2C"W6V'7V67%@#Kdx.typeAnnotationsS:#;dx.viewIdStateS Ì +)#`Po` Dp%Yf +Px0c@0 CоÌ -Fp1 d l @3c@B`zPgƀ8%O>3,-|f Y[F @Å4baƀ1%`4!& !0FaM `@ ^pO& ф0F`M `4& A0aȠ& ф0F`M `4& A0& ф0F`M `4& 00b ;c p + LЙ03a  i0b \<` 20τ0b =B p + t& @> p + p +t& A0(F"d]hb [F  t& A0(F_]h `@ AZXa&όA h`K)}& ;L#`P3-@ Aa? >?L#`P  &C/Ä0b I *?0c@dK &C/Ä0b I *?0a Aa*? +.?LC|f _[LC|& A0(RdpXA [F Ha0& A0(R_pXA `@ PPaƀPA0J"!`ƀ͖?ό!`Kpߌ!y`K,394$0c@0b  +K?<„0b JKHH„0b KDHH„0b KHH„0b EL-?0c@4h4b EL-?0a<A +z  0c@@Vo҈ 2aC:Ìqm*53d.&00h1L#`PD33. Aa(?C n?L#`P 6aC;Ä0b L-(-I8ÌAo҈ 7a;Ìqm*53DtK B0a& Ä0b N1?0c@bF ꁅ;& ;A>3Alܔ όt7eHg1@B,Vȇ1 1@B,Tȇ0F 3a5& A0(B|XA AόYlܔ ``@ &b !ظA0(ʂe~XظA0(e~pظA0(ʢe~p `@ `\pa1@,Z0F {f PpbF 0 ?f ?`bF 0?& A0(̢e~x `@ +p^pag3c@7eA;g`ό! +TlܔE "ظ) >|f Qb qL|f QbF p J1f tBF pJ1& A0(fa `@ +$Xa1@-d( 0T0F p J"Pf  !f  nh -1 A 1@.b8 1T1 ҡ 1@.t8F1 7j@ +$`Haƀ81@.8 P0F N<& A0(f `@ +$` a1@.d8 j0F NV& A0( `@ +$`Pa1@.t8 ^0F  N…Xf lbF N…X& A0(Bfp `@ +$\pa1@.h8 j0F  N…T& A0(ep `@ +p$\a1@.Z8F1 ^B1@.b8 f1 B²1@.`8 R1 %`@ +x$T@a1@.\8 0F  NBX& A0(bfP `@ +$Txa1@.b8 f0F :NQf |p 1@.b8 F1 A%{όoKBA0(e0B$\F RUf p 1@B.HT0F R=& A0(n(A `@ +!%FXaƀ +A0(oA `@ +!%Fa1@B.H0F R"Uf p 1@B.@HT0F R"=& A0(oA `@ +!%(aƀ( A0(o$&\F  RRf \ȫA0(Bo|a=j@ +!%XaƀSX1@B.@H T0F R=& A0("oa`=j@ +!%Pa1@B.H0F  R~=& A0(maȫA0(bmA `@ +P!%a1@B.H V1 p4#F  R~U& A0(la `@ +p!%(aƀ؅d=@3c@G^A&G^ AA/??G^Y1 z[2 3a0F \b~Xf \`ȫA0(f `@ x%ahPG^ A/??G^ A/??j A4?D? j%,!1c@4}D@cF  b}Vf f1@B/b Z1 =Џ1@B/lZ1 1Џز!3c@d5b ^ ?0c@~Ė|f C#L'GGlAf5b _P?0c@~Ė|f  c,03aAit5b Eh?0c@4}ֈ AN@Ì 0ye$gƀ9Xh3aI40F  v}[f cF  vB}[f cF  v}^f cF  v}^& A0(H#v@ `@ +Ұa'aƀحA0(Hf0 `@ +Ҡa'ha1X 4h!1 .?vk@ Ҡ'aƀ- @>3f[|f  cF  f ,1@5l v1 ?vk@ +Ԩ'aƀX1@5jv1 PB%`@ +'aƀH +A0(P#l0 `@ +'a1X4p %2\F H|^f p 1@"5x1 H$F H"|^f sH$F "f tH$l3c@CHzY0,X P$^1 ЁH$F Jf tH$ A3c@G^Yg`όK ѳCZPÌ.\(ߌ!kK,03OD|f + >3JM(gƀX>Q3c@X|f +3 >3JMՈ T!ь!{#`PqaC;3KL Ae?E?-!0b n?0c@^ !C\ Ä0b n?0aMЄ|f @,3c@+`gƀ05p/F>3ylXPgƀh2p/p'3c@*`"4^ @>3y{D1 cs/E>3D{{-L0L`o 0>n[>3ML`{3>pܶ:3-7L2 1siڨ _ " @VjA6X%(9a0&*&-8@ai PX`"`"ڴ6Ɉ,` *&*"~{k +Z_g!_g!" ♎⟈k"kxE`"6!&"B7'⚨Ɖ`*&*"~{0%"$j|Ghs`"Bɧ}m=`Z&ei}cX"Bɧ}6&"$j|Gl1[xHj*zSTAT0 `LDXIL BC! C #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Z2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b ˟|n1 P`J106G! +hF `!a܀á!  @!P@$0P@  P@ |`@lt`H>;pi0|pK8&ii!GMQ,DND2-rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !C <d2L &GC"J`$ʠ + +0J@ʣJ^8(2((!(q2gˢy@ yyLFD oM $Efe%&,f&gl&eCLe@,  l p c+#{:3 p6D!! pɵ}ՙmH"!6material_gbufFf`g@;pi0|pK8&ii!GMQ,DND2-)rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !C <d2L &GC"J` J +X< +(B("( +g sα,xx yyLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$! 6™ p6$φdXbِ4 C4CC<ڐL CLCC<( p"ڀCl tBcb !&@̬LN- n n˔\]ڛ&E! &5A( 4mX12(3̀84 BU5$E4A( ˠcpe gl BMi0Q186p 3 Aa` @`0 `@LiBj0gPn0l(Ҁ `ɔUY6,A f@l`p{l( HṌɽݹͭ(Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +xu\|yY3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC@`@0#܀A!f09#`и`d)h `' > cg@ XF`4AFa4F :`4!F`4aFa@ ]2фMфAM A0F`4AFa4l3b X9c#`(,\`8  i `` +(б 3b X;B#`*DdX@82ψ ` +#`Ƀ+PhXAǚ>c!>C|F ^`?p,# ``<ԃ>.$Q00b I=;ˆA 'Q # ``=؃?ȃ/<As +z  0 B00 0b  K-(-I9hB&h0<A @ + (06|F  y11c9AA0xrF  ʉ}qX`E  >1cҠ3b` YD`7 n Ӈ6ψ Lko@}lX!ψ Dq|,03b` ]D`'PDA0x'` @>|F  ڋF  n&i@ M>|, X@g@ "D>@`pD@7 @!(F!A)L!ψ DMǂA>|,`cA! |,XE> X12@ E ¦%`0["lZ`@o4i ( E <¦%`0q element@Jؔ}չqHscdP$Vp@Ya&A`@B l4蹼̡ͽՑq}ѹͱ `c5TGWGw$TgfFm..m4aB(l p{kaF7CȮlMnj-dg4A` "hak `4A` +a03@ L+8,5 Lk0 260461E1F!$]Y"h#Ppp"texCoord4dٕѽ񘱽ѱ,b=H X"l{l&2`0$@X"h+PPPp2eB  @6bq0 &0@ X%1-b& >.normal!K70X|^*(h"hRa 0@B))LI> @ 6 +P oDV`C +pj K1c{ caY0|H #Z0|H `8|,b 0P_14Ç ×L"htA!0%#^0|H b8|,b 0_24Ç <L"hA!05#r0|H d8|,b 0P_34AÇ \M"hA!0E#v0|H f8|,b 0_44Ç |`4 p 0pDk΍nZ\6;8#22:329 0:4<& m @\Ț8?worldMatrix@GB_SceneBuffer@@3V?$matrix@M$03$03@@B,Lȸɵ5ɥ~ؚʄ䀀f~HH`fH`f-XDH>{c#J+z[f7962;9#22:329 179& m #QF@LިQɕؕѽ񘱽ѱ,I$PB`,P n&VFFU4cCBUGW'W&CdCbW6F&D3m$XB`Vۛ\[U M- hꇄ NLĮlMf(hKЬ2063472˔\]ڛ6jpӰHҘ8ذ{y{Fzydž<=ޣ4C=6,jqjp!( qyЏ0 +V@D6input DZAD/`: 0u4%‰` +z\`8: u`'0XG=`z`h: .llvm.dbg.cuShfFVVbv67EfFVF7% Jdx.source.contentsSH x hD2V'7VBVfV67%j̽ɍ9M [XKܔ`4ؕͥM L ]]ܔ5̡5M V \[Xܔ 6*хѥM|#<إ%MхѕM ƣK\[ܔDyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q "` l;/TQQCIm4\BDͰF mβT?_ Ea zA,DP6@Hq @ٕ[ɔ\QPRt 0 &GL7 o0A8`pᐃ 1&GL; 0A8dapЅ !c&=L -1A8\bp# `y2c@xa +A (j0bQɄ0b Ä0b L#`Pj?L# `AAP˄0b Ä0b JL#`PQk?`00b A^0b  ÌS+# `dΌA+#`Pi?L# `AA$τ0b @Ä0b JAM#`Pi?L# `pф0b `Ä0b #M#`Pi?L# `AApӄ0b Ä0b Ä0b pÄ0bp ULb0hL 0a&Ä0bp `L 0a&00h1L#`PAg0hL 0a&Ä0bp (hBL B0a& „0@ M|f 1Z1@โ `@ .S` +& Lfm0F J7`1@Kق :e|& A0Za/0F r:`΄`g1@+`1@K`΄0b .?0c@ + Ä0b .?0a A |??L#`PA+c&0 h L#`PA+L 0a&00 TxhBL B0a& „`gƀA0;& A0 +;& k@> \ +J \ +G=| `@ sh `@ .tp ``@ vX"1 `j`@ vX` τ`! B> P-ÌS+#`P 0-`Ä0bp ;Ă*ÌAd +hBL B0a& „0bp <Ԃ+„0hL 0aAu 0a&0 h LԂ|f 2VF ڇp@j!0F q(j!0L#`p9(L#`pC9L|& A0B]& A0D]& A0pL"8`ƀ A0L D> |&  +L#`Pÿ3L A?,?L#`P .<Ä0b K(?0aX9B|f 3Z1@%V1 `j`@ P!R@a1H%a$FDaƀ@A0`ZFb$& A0`ZFb$A& A0`ZFb$& A0`ZHb$0F i w 8n1H%܁$F ` @ p | & A0`ZJb$a0F i w(a1H%$Fa1H%$F g 4(Z4&7mwosPHF7mxmgCM[aP6`|&0Է  5nogCݛ`f|&0ض mig`e|&0ؼa voUg]pe|&0ܸA wnMgýpP|&0P|&0b +DClTQ/TQE-E STATd`DXILLBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L (2"H d""ㄡL Lx#%f`) BR 2c* QOCH>QJL~qۈc * ?a!! WG XA4b@Rd! e#M 9 +DClTQ"֙vJrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !Y 2L &GC"%0P :PPPP8PQ2EPA$Fʠ +j О >@}, AyLFD oM $Efe%&,f&gl&eCLd@$  l pa@Hkj̭L̬Ln@,BYb` A l`n@00L4A LhP}$ r&FF'7A +ITYׅq{k ck +KÛ $ܽɱYAMi@P 0.16L}ca 2 `@l`0AL:1 47"POSITIONB ۆ 6, r@pzj +bڰ upp0s@kIhPtڰHwpp0y*ȉjPxj>`6t`z\&DA@aBA†e78A8 oqHp0< 6Æe7SA&860 +P +aT6f4&"mnn@\4ξ&Fc.kn@dU`VpWX*llvm.identS +]\ڛ۔hBbfW&7%(̡5M 2dx.resourcesS ]\Y]]ڛ Ҡ]Z]]]ٔ` ṔAM R []ܔ@yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCImہ4\BDͰ6  ILDN,$d1012eb77a7b0517186c756526f81943.pdbHASH.z{lue&CDXIL@ +`DXIL( +BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L (2"H d""ㄡL Lx#%f`) BR 2c* QOCH>QJL~qۈc * ?a!! WG XA4b@Rd! e#M 9 +DClTQ"֙vJrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !Y 2L &GC"%0PPePEP@$Fʠ + $hzx D@<yqLFD oM $Efe%&,f&gl&eCLd@$ a0(MeÀ$LfB, A !p6Da5Fi**iPHb p6ڶa!*®!#.ӓTSӆe l *zz" A6,`օ]5<&ak06Gge m..m@@M 6,DXflXϺ016,`PօmX0.L 1Ю1 ц`ذAXWl(ؠ `Àsl(& +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔCbVvD6EFW6%ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCImہ4\BDͰ6  a A,TGW)]LɕDQP)c # ``yq̈A ePeݤ$aˈA gpmČ$V3b Fd[ΈA j`ψA k$ЈA l`шA mЕAl҈A n0ӈA olԈ Dl@1h0 B00 0bp Qd&h& h1Ad 0  0@ #`ls0 B00 `%A0@ +1@)` 蘵g@ &Ri F `*8p:}1@ A0R/qc A0X1F `j< Έ Dp + 0  0bp -hB&h A {0 B00؁|F `T@ 1@R<ψ L +J#`0+y1@I\`@ qxA0P΁"8`@ s`D>&򱡐ψ D 0  0bp ;؂+hB&h A$ 0 B00Ԃ|F `q@j!1@ơ\ψ LP +.#`09س 1@Ёم`@ ~HdA0PB"8`@ 0D>&򱡐/g @ x{A0@PB"$F Aw=1H%!$B` @ x{F Aw8n @ xzF Aw؇b @ x}sF Aw؇a @ x~{A0@P!$!@DXBC +KѮ,bP DT4Ԝ$SFI0ISG1POSITIONNORMALTEXCOORDTANGENTSV_InstanceIDOSG1 SV_PositionNORMALTANGENTTEXCOORDPSV04C   LPOSITIONNORMALTEXCOORDTANGENTNORMALTANGENTTEXCOORDTEXCOORDVSMainC +CBDAD"C)C1B:Cppp ILDB`#DXILBC! # #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L U2" d##ㄡL L@ +@@ 3s`0G@$AH) HS A rq@.B*VbFq% ?a!! b!t@l ($wpJL~qۨ8@J!7@I#0€w8ҴCM4E0b#M@#0!gztxyv|xz7vy7zzzy(rz0s(yTpyppq(Rz?@AIe#M 9 +DClTQĐГFF :`6(!9rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C < y> 2L &GC" +B("(((` (r( (@R(PB(JJb J sBg( ubǚy$@@<yXLFf.̍,Lmm=271 30:Bvector X12@ E h 0 1@o%``0 1@o%`0 1@o%`0q element@Jؔ}չqHscdPVp@Ya&A`o @,b Fj),͍ZYK[YW[ [ڠ6VsOutputGBuffD1@(` 76float3xX@f|1@st 0Y:h `4@ml `4 +(K 6L :pH``Xd "hPpptangentB  Е ɑ0c{ !dW6F&cF"㳈C=H X"$``0: L+8,< Ly0 :@ @E `́@B@ @8ɔ-b>S70PA$0Pb5WGǔF0Tpphɵ-b.`4ryK $D`1 +` +0 &Q40T QFGm.̭ $͍n*RV6 +iW  :@ȃW=DX`C pj K1c{ ca[܀0`8|,b7 W"htAp~H @a8|,b7 ×L"h|Ap~H @b8|,b7 ,×"hAp~H @c8|,b7 <L"hAp~H @d8|,b7 L"hAp~H @e8|,b7 \M"hAp~H @f8|,b7 l"hAp~H @g8|,b7 |`t 0p0Dk΍nZ=X7:7i`] a => ~1@5:+s+33+!i Kj"!ڶ1 ?{c#J+z[f7962;9#22:329 179& m !14902$"AO]XP\YP]XQ]PYЌ]ݛP жX0 DIXU92<:2"17930:e iBJ + ~ިf~Hd~H䀚H`f-jDK K0q{k c*ãɵQXPɕYؕѽ5m[x VF&VwV67FUG<i+ cz;Cs+ z*!*ã+!!+{j" +ڶ!3!8,&Mm* LTX[]]$lB AOXTX[LTX[]]PжX  6normalSampler706829 682)02 m :Bt@ؤަ?metalRoughnessAoSampler@@3USamplerState@@A`5z'&褹х ՙћ+#33+Ir s+# + !̡ͽՑq}͹ͱ $ххq{c#k +K[MYAB`700:4E МX  Xԥ+{sK;s+#IscY!\0Y; V0XM#\( "h a6ln@b B\` @X $XZw 4$`6vƖvFWF4Z $`AV֖Ǣ.͍n]ݛO\ڙ[H Ȍ"h@ X"h "h@ @a6 {}A5^w"B4E X(`,Т.B4&ADcA`l$$B ?instanceBuffer@@3V?$StructuredBuffer@UInstanceData@@@@A`55;8 +HIDLDNOƨ'  8YP `Ct&gbU&7aָ(՝$Xͥm5`C0慗7<34:$''&! 6634929227<34:4479%#* 6634929241:2902/249441:24::49441:27/<949441:2902370649441:23:32/24942<:2"06272<929:2<:2"7062<9292<:2"2063472<929:682)0206268299299682)02706829929682)02206346829929943723$) "#' !*#")22:32929130:<6;30:<7960:430:<700:430:7962;:::#:3347$7::4:47::::#:33:::::::477:66;830:47::477::::767042:6700:4<30:47::706<::::027:7042:67960:4<30:47::027:<=<::::279247::279::::2792<3::::27922:97:::22$) "#' !*#")22:32929130:<;30:7962;1:329$90200:32992930:4902$):1:22:329$902004902:329929::::#:3347$7::4:47::47:49$")$90$:::#:33:::79:47:49$2<4902$"<49$::::477:6:6;84902:3249$2.7960:430:47::477::::76:64902:3249$2.700:4<30:47::706<=<::::027:7042:64902:3249$2.7960:4<30:47::027:<=<::::279247::279::::2792<3::::27922:97:::2743$) "#*#"****47:::#:3347:06062706272<682062682947::27930632063472063472<68220634682947::27930027:7067062<68270682947::279<=330796)27067042027:7962027:7062:*!'47::7647::02730:127947::47*72#:329:6443:329:6440627:6:0624323$440206:6:) $$4477:6:9:02447:6:0:02206347927444/706:6:796)270447:49:6:3206347442069:6:2063472:97273:329:6:127 B$902941:27/<9494 \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB\H]XQ]X^[  ݛYS\N[  ۛ\[[S\NH] H]NH]HR[]NH] Y][[NBNB\T^Q]X^H] H]N[YNBNa6hd5FV&7Ǖ6VGVu&VgfV&%6W6ǖF^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@D\D@ʦP@R@@@@@@zz@v@Ȏ@@@@f@ʆv@@@@f@v@@@@f@v@@@@@X@v@@@@f@v@@@@@v@@@@@v@@^^@@@@@@@@@Ⱦ޾v@@^^@@@@@@v@@@@@@@@@@@@@@@@@@@^^@@@@@@v@@@@f@܆v@@@@@ܾv@@@@@vv@Ȏ@@@@f@v@@@@@v@@@@f@v@@@@@v@@@@@^^@@@@@@@@@@@v@@@^^@@@@@@@@@@@ܾv@@^^@@@@@@@@@@@v@@@@@@@@@@@@@@@@@^^@@X@@@@@@@ܾv@@^^@@X@@@@@@@v@@@@@v@@@@@vv@Ȏ@@@@h@޾v@@@@h@ؾv@@@@d@بv@@^^@v^^@@d@ʜPf@R@@@@d@@z@P\R@T@PPZ\T`\jV`\jRRv@@@@@z@T`\jV`\jv@@@@@vf@ʜPd@R@@@@h@@z@hP\X`X`RThPdXdX`X`R@V@hPZbXZbXbXZbRv@@@@@@z@P\XZ\Rv@@@@\@z@v@@@@\@Tz@PRv@@@@@P\@T@d@V@fP`X`XZbRRv@Pf@R@@@@@PX@fP`\drrX@`\jpnX@`\bbhRRv@ʾ޾Pf@R@@@@@PPR@T@Pb@^@`\`hRR@T@`\r@V@`\bv@@^^@@@@@@@@X@@@Ȏ@־PȎ@R@@@@Ȏ@v@@@@@@z@\v@@@@@z@ʦP\R@~@\ܾ@t@v@@@@f@ؾ@z@fPʜP\\RX@P\X@b\`@^@bdnRRv@@@@@@z@\@T@Pb\@^@f\`Rv@@@@\ؾ@z@hPؾX@Rv@@@@\޾@z@hP\X@ʦP\R@~@\ܾ@T@Pb\`@^@R@t@\Rv@@@@^^@\޾@z@hPP\X@b^d\dRX@\Rv@@@@^^@\ب@z@PPTbjRTblVP\TbjRRTPb\`^djj\`Rv@@@@\ب@z@dPX@\Rv@@@@@v@֜ئPf@ؾX@@f@X@@@R@@@@@z@ʜPؾ\Rv@@@@@z@Pؾ\Rv@֎ئPȎ@X@@f@X@@@R@@@@֜ئP\ؾ\X@X@RvȎ@֎PȎ@R@@@@Ȏ@v@@@@\@z@P\ؾ\@T@f\Rv@@@@^^@@ب@z@\ب\TPdjj\`^bl\`Rv@@@@^^@@@z@PبRTPbl\`^bj\`Rv@@@@^^@@@z@PبRTPb\^bjRv@@@@@@z@\ب\v@@@@@@z@\ب\v@@@@\@z@\޾\v@@@@֎ئPX@\X@\Rv@@@@\ܾ@z@ʦP\R@~@@t@`v@@@@\@z@v@@@@\@z@`v@@@@\@z@ʦP\R@~@b@t@\޾\v@@@@\ܾ@z@ʦP\R@~@\޾\@T@@t@`v@@@@\@z@v@@@@^^@\ʆ@z@TPbZ\Rv@@@@^^@@`@z@`\`hv^^P`\blX`\`bX@Rv^^PPb\`@Z@ʒR^Pb\`@V@ʒRR@@v@@@@^^@\@z@PfP`X@`X@`RX@X@\Rv@@@@@vȎ@PȎ@R@@@@Ȏ@v@@@@\@z@\v@@@@\@z@\v@@@@\@z@b@Z@\v@@@@\@z@PbZhX@\@T@\Rv@@@@\@z@\v@@@@\@z@\v@@^^@@@d@@@T`\nj@@@@@@\܆@z@\ܾ@T@\v@@@@\ܾ@z@\ܾv@@@@\Ⱦ޾@z@ʾ޾P\Rv@@@@\ʆ@z@\@Z@\@T@\v@@^^TPbZR@@@@\@z@\v@@@@\@z@\ʆ@T@\v@@@@@`@z@`\`hv@@^^@V@P\@zz@@~@`\d@T@PbZ\R@t@`Rv^^P`\blX`\`bX@Rv^^PPb\`@Z@ʒR^Pb\`@V@ʒRR@@v@@@@`@z@P`X@`\`bX@\@T@\Rv@@@@`@Tz@Pb@Z@\Rv@@@@\@z@PfP`X@`X@`RX@\X@\Rv@@@@\@z@\v@@@@@v@P@Ȏ@R@@@@\@z@\@z@`v@@@@\@z@\@z@\@z@`v@@@@\ܾ@z@\ܾ@z@`v@@@@\@z@\@z@bv@@@@\@z@v@P@Ȏ@X@f@R@@@@\\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@f@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@ܾR@@@@\ܾ@z@ܾv@ܾP@Ȏ@X@@ܾR@@@@\ܾ@z@ܾv@@@@@h@޾@t@`v@@@@h@ؾ@t@bv@@@@h@ب@t@dvv@ʾPȎ@R@@@@@̞v@@@@̞\޾@z@\޾v@@@@̞\ؾ@z@\ؾv@@@@̞\ب@z@hP\بX`X`Rv@@@@@̞v@ʾPȎ@R@@@@@ʾP־PRRvF@ʾPXR@ʾPRf@ľPf@؜X@f@X@f@X@d@R@@@@^^@@@@@@@@@@@f@b@z@PRv@@@@f@d@z@PRv@@@@d@b@z@PRv@@@@d@d@z@PRv@@@@^^@@@@@@@@f@d@z@PX@dRv@@@@f@b@z@PbX@Rv@@@@f@@z@d@T@b\@V@b@T@d\v@@@@f@@z@d@T@b\@V@b@T@d\v@@@@^^@@@Z@@@@@@@z@PPPX@RX@PX@RRRv@@@@@fP؜\@T@@V@P؜\@T@R@T@@V@P؜\@T@R@T@Rv6qD902941:2.090/249494`2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf$Et$UETdT4TDT$ՠ0BVfV$Et$UETdT4TDT$ӠРРР0f$Et$UTDԠ0BVfV"t$5uT梗wנ0BVfV"t$5uT梗נ0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠Р0fFVf2DT$5T$4$#Ӡ0BVfV2DT$5T$4$#Ӡ0RFf֠Р0BVfVrUE$uTDӠ0BVfV2CS#cSc֠0BVfV2CS#cS֠Р0BVfVR5Ӡ0BVfVRDbF7Ҡ0BVfVRDbF7Ҡ0BVfVRDbF7ҠР0BVfV4%UdU$5U$D5Ӡ0BVfV2U$DU5T$$T4DӠ0BVfVBV'VBV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V&BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V6BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'VFBV'V6&WF5W&GWF%5VuW7נР0BVfVbWFf֠0BVfVbWF&f&Ӡ0BVfVbWF6f6Ӡ0BVfVbWFFfFӠР`F7bFbF"bF2Ҡנ"WFW'"2Ӡנ`FҖ6bFbF"bF2Ҡנ"WFW'ҖҖ"2Ӡנ0BVfVd$DנР`F7bF7Ҡנ"WFW'7梗Ӡנ`FGbFbF"bF2bFBҠנ"WFW'B"2Ӡנ`FҖFbFbF"bF2bFBҠנ"WFW'ҖҖBҖ"2ӠנР0BVfV%U44U'W66W֠0BVfV2%E5D2'G2FW'FWҠ0BVfVb5TE4DVbFGV3e4DӠ0BVfVBW'Ct&FRgBB2Vv$F625V&7GFWRgₗBBҠ0BVfVBW'CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%TFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%T$'FRgF2VTfWƆ625V&7GFWRgₗwFҠ0BVfVBW'C'Rg2V625V&7GFWRgₗRgrҠ0BVfVBW'CRg2V625V&7GFWRgҠ0BVfVBW7CRg2V625V&7GFWRgҠ0BVfVBW7T%TRg2V625V&7GFWRgҠ0BVfVBWGW'WvFV&B7rFV&625V&7GFWB7Ҡ0BVfVBWWfTF7df6WFB7Ff6FF7B7Ff6Ҡ0BVfVBWGW'Wdf6WFB7f62V625V&7GFWB7f6Ҡ0BVfVBWGW'WFdf6WFB7Ff62VTfWƆ625V&7GFWB7Ff6ҠР0BVfV2%$ET$VbƖҠ0BVfVՠ0BVfVR$U&ՠ0BVfV"$4%&6ՠ0BVfVbDEUeFGWՠР0BVfVRE5E%U5DV2G'W7FVנ0BVfVBT4$UUT5UDT$T$ՠ0BVfV"UDU%UE5E%U5DVҠ0BVfVDUE5E%U5DVҠР0BVfVtU5U55$UT4ՠ0BVfVrTD55$UT4b76b76נ0fFVfBUUdTD5ETdTDԠ0BVfVBUUdTD5ETdTDӠР0BVfV2T4EUEU%U$CԠ0BVfV2T4EUEU%U$CU%B7Ӡ0BVfV2T4EUEU%U$C$%ՠ0BVfV2T4EUEU%U4CԠ0BVfV2T4%TedT$bVVҠ0BVfV2T4%TedT$U%B7Ӡ0BVfV2T45E%U5DU%UD%TedT$bVVҠ0BVfV2T45E%U5DU%UD%TedT$U%B7Ӡ0BVfV2T45EU4Ԡ`FGBWWfTF7&6WBUGW'W&CcFGF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F7BWWfTF7&6WBUGW'W&CcF7F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F'BWWfTF7&6WBUGW'W&CcF'F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FBWWfTF7&6WBUGW'W&CcFF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FGBWWfTF7&6WBUGW'W&C$'cFGF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W&C$'cF7F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W&C$'cF'F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W&C$'cFF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FGBWWfTF7&6WBUGW'W6CcFGF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W6CcF7F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W6CcF'F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W6CcFF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ0BVfVBWWfTF7B7FBWWfTF7&6WB7FeTŔTҠР`FGF&TgfV&'6W"TgfV&cFGFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F7F&TgfV&'6W"TgfV&cF7FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F'F&TgfV&'6W"TgfV&cF'FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`FF&TgfV&'6W"TgfV&cFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"TgfV&SFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W2E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"u5E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7ӠנPFF&TgfV&'6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7Ӡנ0BVfVF&TgfV&B7F&TgfV&'6WB7eTŔTҠ0BVfVF&TgfV&'B7F&TgfV&'#6WB7eTŔTҠ0BVfVF&TgfV&7B7F&TgfV&7#6WB7eTŔTrVFV52Ҡ0BVfVF&TgfV&GB7F&TgfV&G#6WB7eTŔTҠ`F2G&W&TgfV&'6W"u%GWDF&W67'TgfV&FB7RFbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WB7bVWӠנ`F2G&W&TgfV&'#6W"u%GWDF&W67'TgfV&FB7RF'bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W&B7bVWӠנ`F2G&W&TgfV&7#6W"u%GWDF&W67'TgfV&FB7RF7bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W6B7bVWӠנ`F2G&W&TgfV&G#6W"u%GWDF&W67'TgfV&FB7RFGbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WFB7bVWӠנ0BVfV2G&W&TgfV&B7bVW2G&W&TgfV&'6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&'B7bVW2G&W&TgfV&'#6WB7bVWeTŔTrVFV52Ҡ0BVfV2G&W&TgfV&7B7bVW2G&W&TgfV&7#6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&GB7bVW2G&W&TgfV&G#6WB7bVWeTŔTҠ0BVfV2G'W7FW'WF&TgfV&DB7UF2T45E%U5DU%UD%TedT$U%B7B7ՠ0BVfV"VgfV&DB7UF2T4%TedT$U%B7B7ՠ0BVfVBWGW'W&CDB7F'2T4EUEU%U$CU%B7B7ՠ0RFf֠РPF2GW6fTF7&6WBUGW'W&CSF'F'B7FbVFFVҠҠ2T45EU4ĴӠ"WFW'E7rӠנ0BVfV2GW6fTF7B72GW6fTF7&6WB7eTŔTrVFV52ҠР0f2DT$5T$4$#Ӡ0BVfV2WV6F"2"2֠0BVfV&""֠0RFf֠Рf66fFW&f6bƖҠנ0fd%U44Ԡ"WFW'ҖbbSSCゖӠ0R6W֠"WFW'2WV6F6gFWBFbbƖ₇bf6Ӡ0RFf֠נР0RFfA ݠ5FV&7Ǖ6VGVƕVG6ǖƹ^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`vv@@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@欌@@@@h@@t@v@@@@h@@t@v@@@@d@@t@v@@@@@ʒ@t@bvv@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`v@@@@h@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@v@@@@f@Ƞ@t@bv@@@@h@@t@vv@贠@@@@f@@t@vv@贠@@@@f@@t@v@@@@h@ʮ@t@v@@@@h@ʒ@t@vv@莄@@@@h@@t@v@@@@f@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@d@t@bvv@贠@@@@h@@t@v@@@@@h@@t@`vv@@@@@h@@t@v@@@@d@@@@@@t@`vv6,902941:29023706494{2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР0fFVf2DT$u$4Ԡ0BVfV2DT$u$4ӠР06VGV"&Gv&WEVfV66ǖ&ҠР`Fv'bF'WFW'נ`FvGbF'WFW'v'נ`FvbF'WFW'vGנ`F'v'eW6&bF''WFW'נ`F7v'eW66bF7'WFW'נ`FGv'eW6FbFG'WFW'נР`F'v'bF''WFW'נ`F7v'bF7'WFW'נ`FGv'bFG'WFW'נ`FGvGbFG'WFW'v'נ`FGvbFG'WFW'vGנ`FGvcbFG'WFW'vנ`FvWbFgFbbc"WFW'bנРfv'f'WFW'נfvGf'WFW'v'נfvWffFFF"WFW'FנР`F2WFvbFbF"WFW'v&6c’נР`F7BvVFGv&FbF7bbF77B%Ҡנ"WFW'VdžB%bӠנР`F77rTFG%bF7ҠנbF77B%ӠРbF7B2&67RDӠBV&2&67RDB2GWR5BFBBӠB&ƖWBӠР26GbF7"&ƖW2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F77rTFG%bF7bF7BҠנB&ƖWBBFB┲Ӡ26GbF7"2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F–V&WbF"vGTGbF'BV6FVEVGҠנ"WFW'"7BV6FVEVGBV6FVEVG"vGTGӠנР0RFfA 9p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898 x$) " Ayl +-EZh}|Ph!Вg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ ztQ1A@ m>&HA`77A@ ~}L &4A@ |dž>,>??61AH5s$55VV&TgfV&7A@ }}Lj5`JInstanceDataBufferڀG}|A @"A `\`GI}HlNE&hƒ H~Ĉ6j0#," l@, FԀ>XE6 qx#j0#,"D #?B rEtdp 5ё m0/GXDG6q#8#=#38h5 BɆ>VE`FlL„L6 A30, `C&D&7AH`C@$ 6j"X6i7ixh8$Ĵa9a6q676"TEXCOORDD 6j<6i7iO6q2'w'e m..mx5 } +| }ɨlXCNؤMܤNMMdÂx&m&u2om'56i75h;dž6iTxM Jl@EU lU6Э +47:q "*BB#0XG=&`zT[\ݸXaB@O #0XG=`z,`' @O# 0XG=`@#m.h\H, G]"0V%Ă}0.ЅͮͅLenJ\\U\Q eNne͍̍nnq1\\Q eNn̥-,()lJ`u\\Q ŮLn.mJ@M\Q e-L鍬mJe\)R υ.,..mn@&gR ..l.lJ&u\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq +` )P;PEAD ~qv <PEAD %am p LD4BX3\3~q&0 <<mp/0CM>rFP <49RCM~qۆ  d W d S d O}d `@ 2~ `@ ~ `@ 2 3a AA0a AA0a A&`A0a؁|& A0H `@  `@ 2 Ԡ3a A`uL#`D8A d*!^g1@%A 0F  kr0:& A0\Ā 3a AL#`D:) d2ep +`u` +0F  vS& A0j `@ 2p40`<(L#` d`|p 0b YXB0a A&@LF + `@ 2P`1@,l!0F  3 [& CZτ0b Z)B0a A! +L#`HA--g1@-Hh!0F  k Z& A0$@ 3c@  dpz0b Y\C0aX@Й0,A> dtn@0b Y]C0aXЙ0 A> dxb0b Y^ć` 2~τ0b _Є0b Y_` `@ +Ӱ!'paƀ؃)A0(L `@ +Ӡ!'`a1@4fȉy0F 닚`|p ф0F`M `@ 0F`M `4a& A0J'h"$pbM `4A& фA0ly 00b k0b YkE`Lg1@5B`1@ 6␉`&3a A&jD0a A6kD0a A?%?{00b n(?0a A? ?L=! A0j-P' `@ 2p `0 L#`\X d&`010F  ۍ`& A0x.Pb, ``@ h"1 @`@ $h` τ`! B> !_ÌS,#`PG|a _Ä0b Ez6?0a A"?5?LgBXF Pf =b1@B=苛l0F 9؍X81 H` @ h ` @ ؍H ` @ ( ` @ ؍հ& A0p6xc7Lc0F 9H h1H<`7vc5 ` @ & A0p6zc7RC0F 9X0F 90`Xv0mԖ0mgCxP`|&0ص mg[w``|&0ܴi wmg}upV`|&0ܺQ ngq`|&0 mgo`|&0 xogCN[mF`|&0 mgCl`|&0亵 ngCΛj`|&0贡 zmgn[iF`|&0踉 zngh`|&0u zogNfז`|&0a mgÎ[eF`|&0I ngd`|&05 |mgobߖ`|&0! |ng[aF`|&0  |ogCO`g|&0 m|gCg|&0 n=@4FB@&64QEADPEADfPMH#M@#UDO5QKSD S@STAT `sDXIL BC! j #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L ^2" d##ㄡL L@ +f`)@DAQ A@JAba)@ 5\=sUa*.BCQ! B"h*@ @AP ("'!$%Q1 @B#$m `F a8pi0|i(aFF :`P} @@n00n0 0PP +`P@P~Gsب "$|'4@tlTQ +<:@|"&q|7ISD /6440'9Prt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C <d!2L &GC"J` + +4@ʠJ4 + +0J@ +U<ʩ(2(B(-gr:g uֱhzx D@<= qyLFD oM $Efe%&,f&gl&eCLe@,  l AIs s+33+ p6C!! p6 րΑX[PYx6 D$04hJInstanceDataBufferڀ E l(l0A866G6V&6WD4A !Mi@Pڀ \Gx B; am `p)38 ܽɱYAMkAaaҀ &b\Ț6 tq{k ck +Kۀ q`gЭqK# 6 tt934342 m0;dummybۀ zW`m08;> 0@@ 5p  +Q ah@6$6dn~P +lT@ A*lSP hXM5zJJzr  1A(`y`!d!Y bh8=I51mX[XXfaZ BU5$E4A(`u3XY! tUQ K   C/t@ lʒ&L2 tÆ% ~rAba0qP-/)/47 m:sذ 0 albAra!hab 0̂-lX:\X\r] 0Xvȅa  ::C;l  );h@Ì-nn@t,&Gc.싍\2/0 r6P <49RCM~qv 00 xP99QMm2nAce0A *6SV_InstanceID a KA@qu04h8.SV_Position AlX< `x `2a `P4p ` 1H0( a`ذā|`k0A>? 0APo@†D!#*llvm.identS +]\ڛ۔hBbfW&7%0̡5M 2dx.resourcesS]Z]]]ٔ@CRF'F77% yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq '` %P;PEAD ~qf <PEAD %amp LD4B3\3~q0 <<mp/0CM>r6P <49RCM~qv @F`4AFa4F ` 1Ȍ<M!Mb1@[`4!F`4aFa@ Uh1`4!F`4aFa@ Y3pфMфAM A0pրF`4AFa4F `=WM!Mb18I@la4!F`4aF3ψ T +#`P*,g ApA`g@ up A03F jXX 3b ;U T0 S#`P-#`P݃.xw AA0b U>ug@ }1`@ *~A04;L @>#`P8A#`P8A#`P9xuЁ|F  sP:F "s0:F * t:,NA>#`P:)#`P:)#`P;)V A0VA0XA0Z˃Rψ T/!uP + T01qP + T1AmP +)g@ < `@ *: `@ 8 @3b MB0b NB0b UNB`` 1@j'l!1@'l!1@'@l!0T A"A + A# + A$+Ђ|F  @ZF " ZF * ZA>#`PJ<#`PJ<t,A>#`PK=#`PK=t A>#`PL>#`PL|XA2~ψ Tsa?#`PMLXAg@ 6 ȇM!MA0B'`b4!F`4aF ` фMфA%3b h TqKȄ|F 2Pd"1@4␉ψ TLM#`PF[$5K|F b@F j %B>#`P\X#`P\Xc!A0d.Xb,A0f.Pb,A0`n-"8`@ hD>&򱡐Yg @  ۰ԈA0P|c/l6H F @񍽰 841H76l5` @ ؋۰԰F @񍽸 i @ ؋۰ӀF @h H b @ ؋ְ F @h 8 a @ ؋װHA0P|c/^6H#@DXBC)FkX7f`Z DTl܇H|SFI0ISG1POSITIONNORMALTEXCOORDTANGENTOSG1 SV_PositionNORMALTANGENTTEXCOORDPSV04C LPOSITIONNORMALTEXCOORDTANGENTNORMALTANGENTTEXCOORDTEXCOORDVSMainC +CBDD"C)C1B:Cppp ILDBh`!DXILPBC! ! #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L -2" d##ㄡL L@ +@@ 3s`0G@$AH) HrS98rp AG ?a!F+1m#8{˟h@T Jq q5GBHF $.;iZ̡&~V buG^J rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q``!@C @2L &GCB + F + +tJ +Pʃ("(f p, AytLFf.̍,Lmm=271 30:Bvector X12@ E ¦%`0["lZ`@o4i ( E <¦%`0q element@Jؔ}չqHscdP$Vp@Ya&A`@B l4蹼̡ͽՑq}ѹͱ `c5TGWGw$TgfFm..m4aB(l p{kaF7CȮlMnj-dg4A` "hak `4A` +a03@ L+8,5 Lk0 260461E1F!$]Y"h#Ppp"texCoord4dٕѽ񘱽ѱ,b=H X"l{l&2`0$@X"h+PPPp2eB  @6bq0 &0@ X%1-b& >.normal!K70X|^*(h"hRa 0@B))LI> @ 6 +P oDV`C +pj K1c{ caY0|H #Z0|H `8|,b 0P_14Ç ×L"htA!0%#^0|H b8|,b 0_24Ç <L"hA!05#r0|H d8|,b 0P_34AÇ \M"hA!0E#v0|H f8|,b 0_44Ç |`4 p 0pDk΍nZ\6;8#22:329 0:4<& m @\Ț8?worldMatrix@GB_SceneBuffer@@3V?$matrix@M$03$03@@B,Lȸɵ5ɥ~ؚʄ䀀f~HH`fH`f-XDH>{c#J+z[f7962;9#22:329 179& m #QF@LިQɕؕѽ񘱽ѱ,I$PB`,P n&VFFU4cCBUGW'W&CdCbW6F&D3m$XB`Vۛ\[U M- hꇄ NLĮlMf(hKЬ20634726a#=D5R`C"`C +݈" n\H+B#0XG=&`zT[\ݸVP B@O #0XG=`z,`' @O# 0XG=`ЅͮͅLenJ\\a1U\dQ eNne͍̍nnaio!u\\zQ eNn̥-,()lJu\\Q ŮLn.mJM\Q e-L鍬mJe\Q υ.,..mnQ ..l.lJ`u\#yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q "` l;/TQQCIm4\BDͰF mβT?_ Ea zA,DP6@Hq @ٕ[ɔ\QPRt 0 &GL7 o0A8`pᐃ 1&GL; 0A8dapЅ !c&=L -1A8\bp# `y2c@xa +A (j0bQɄ0b pÄ0b L#`PAOg?L# `AAP˄0b pÄ0b JL#`PAh?`00b A^0b  `ÌS+# `dΌA+#`PASf?L# `AA$τ0b @`Ä0b JAM#`PA՛f?L# `pф0b ``Ä0b #M#`PAWf?L# `AApӄ0b `Ä0b PÄ0b @Ä0bp ULb0hL 0a&Ä0bp `L 0a&00h1L#`PAg0hL 0a&Ä0bp (hBL B0a& „0@ M|f 1Z1@โ `@ .S` +& Lfm0F J7`1@Kق :e|& A0Za/0F r:`΄`g1@+`1@K`΄0b .?0c@ + Ä0b .?0a A y?A?L#`PA+c&0 h L#`PA+L 0a&00 TxhBL B0a& „`gƀA0;& A0 +;& k@> \ +J \ +G=| `@ sh `@ .tp ``@ vX"1 `j`@ vX` τ`! B>  -ÌS+#`PCù -0Ä0bp ;Ă*ÌAd +hBL B0a& „0bp <Ԃ+„0hL 0aAu 0a&0 h LԂ|f 2VF ڇp@j!0F q(j!0L#`p9(L#`pC9L|& A0B]& A0D]& A0pL"8`ƀ A0L D> |&  +L#`PDP3L A?C)?L#`PĹP .QJL~qۈc * ?a!! WG XA4b@Rd! e#M 9 +DClTQ"֙vJrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !Y 2L &GC"%0P :PPPP8PQ2EPA$Fʠ +j О >@}, AyLFD oM $Efe%&,f&gl&eCLd@$  l pa@Hkj̭L̬Ln@,BYb` A l`n@00L4A LhP}$ r&FF'7A +ITYׅq{k ck +KÛ $ܽɱYAMi@P 0.16L}ca 2 `@l`0AL:1 47"POSITIONB ۆ 6, r@pzj +bڰ upp0s@kIhPtڰHwpp0y*ȉjPxj>`6t`z\&DA@aBA†e78A8 oqHp0< 6Æe7SA&860 +P +aT6f4&"mnn@\4ξ&Fc.kn@dU`VpWX*llvm.identS +]\ڛ۔hBbfW&7%(̡5M 2dx.resourcesS ]\Y]]ڛ Ҡ]Z]]]ٔ` ṔAM R []ܔ@yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCImہ4\BDͰ6  ILDN,$d1012eb77a7b0517186c756526f81943.pdbHASH.z{lue&CDXIL@ +`DXIL( +BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L (2"H d""ㄡL Lx#%f`) BR 2c* QOCH>QJL~qۈc * ?a!! WG XA4b@Rd! e#M 9 +DClTQ"֙vJrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !Y 2L &GC"%0PPePEP@$Fʠ + $hzx D@<yqLFD oM $Efe%&,f&gl&eCLd@$ a0(MeÀ$LfB, A !p6Da5Fi**iPHb p6ڶa!*®!#.ӓTSӆe l *zz" A6,`օ]5<&ak06Gge m..m@@M 6,DXflXϺ016,`PօmX0.L 1Ю1 ц`ذAXWl(ؠ `Àsl(& +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔCbVvD6EFW6%ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCImہ4\BDͰ6  a A,TGW)]LɕDQP)c # ``yq̈A ePeݤ$aˈA gpmČ$V3b Fd[ΈA j`ψA k$ЈA l`шA mЕAl҈A n0ӈA olԈ Dl@1h0 B00 0bp Qd&h& h1Ad 0  0@ #`ls0 B00 `%A0@ +1@)` 蘵g@ &Ri F `*8p:}1@ A0R/qc A0X1F `j< Έ Dp + 0  0bp -hB&h A {0 B00؁|F `T@ 1@R<ψ L +J#`0+y1@I\`@ qxA0P΁"8`@ s`D>&򱡐ψ D 0  0bp ;؂+hB&h A$ 0 B00Ԃ|F `q@j!1@ơ\ψ LP +.#`09س 1@Ёم`@ ~HdA0PB"8`@ 0D>&򱡐/g @ x{A0@PB"$F Aw=1H%!$B` @ x{F Aw8n @ xzF Aw؇b @ x}sF Aw؇a @ x~{A0@P!$!@DXBC{fng*  DT(HtĥSFI0ISG1SV_PositionNORMALTANGENTTEXCOORDOSG1th@h@h@SV_TargetPSV04",NORMALTANGENTTEXCOORDTEXCOORDPSMainDCCBCDDD000000ILDB`l&DXILBC! c& #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L P2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??=htyzx( 38C8<->C=C9)=8;;C8ě)gY@BdV rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y< 2L &GCJ +)B((b(r(JJ +a1Aq2Ǫ&88_:Gy> L d! s# #sAcc4@ oM $Efe%&,f&gl&e@Č-noS[\[ Ȍfloat{ 0b4 A` E ,d  E 4d ( /E 6WH a6 + +N&Ap +  + +"LAWh+{1c{ cY.$`,b 00 ,yI Ă(,X6 A)B.Ѐj +Ks#̡ͽՑqՙ}͕ͱ ^ UI}=UQAUQ1 c+#{ +{[/BkC)@M-kͭln-L.-m4 a`.J.mnm,k-n4 a`"aq I0B/ @9syC #+{Isc#+JszsAccK4{;33#6F消u@QW 0ۛ\"hF$]Y"hH<]ۛ"hJrTL"hLd`C0 `Jt0z C=l&j]T P@X./shaders/include\shader_global.hlsli@:TangentToWorld027:7962 179&  0:4<& ClVM>C?@"2:*!'AQPVOI[\P ]ݛP  ֆ 6 0&`BB$aHȤ}ՙ ~䀀Ȏ䀀Tՙc+#{cf6ǮlM-͌dg4j BL0aab" `1@*DlX%\b +r0 V %&E ` +@LI^ p̵ѡ-b YX MBEMp{k c[MEPi+ ccs+[MNEM sc+sBEM)kKK{s [MOEM P{[OEM +0*kKK{s+s;C[MXBEM ИC #{[XEM i +K c[MYE`6㭎-ͭl4g l e&l't'|,Ă,-&A"6Zl-VM@/IM pIsK +c+#{#}eaUUՙYؕѽimMŪ 腷^ Dinit_aoL447 *72#:329 0633 5iX5@u vq@p%-M-vF&UU6VFv$VgfV&dCbW6F&D#a֢6 &B/z-}͵ѡ1~怀Ȏ䀀H̀VM@/_X IsKj+ cs+#}хeaUUՙi^ 腶 p @T6FVu&VgfV&%v?)s{#+:33+  + :22*zr [+#;33+ Zl4VM@/Fin K+:33+#ɥѕ}ՙeU UI}=UQAUQUAՙi +[+#;33+[/BF)p9W 0 `f&ǮlM-͌Dg4j m0a7h# `6PI  +`,b5hX8FmlX5lcL opsMƪ P^ D2pack_gbufferă3:329 *2#:329 *72#:329 nŦ|coF/oA+"4)029n?isEmissiveShader@@YA_NM@Z$A djz!<ģ Ȕ9ɵ~ʜ؀~~H䀚H`b~H䀚H`d6PPU `w|p@`mvpDhh8ɥ񘱽ѱа,b0I X"`,,b0I @a8|,b>E0pE <" H "h"c ,`4H`Kf4!`,,b0I @d1@s $``2E0P_34c \M"h@DX$0E#0I f8|,bDE0_441c |`1a"#R"'2PVp0` +.ETd!`B`(+,b= ``@\6;8#22:329 0:4<& m @'""@\Ț8?worldMatrix@GB_SceneBuffer@@3V?$matrix@M$03$03@@BNbDFEȸɵ5ɥ~ؚʄ䀀f~HH`fH`f-H{c#J+z[f + M*mHkj̭L̬LhĮlMfHhɍ䈰06272 >s ALG ?albedoTex@@3V?$Texture2D@V?$vector@M$03@@@@ANvLGɵQ ~بf~Hd~H䀚H`f-ɘ͏pj+ cz;Cs+ z*#хI՝QXPɕYؕѽ5m[:)3`&VF6V&Gf* Ln.lLi"@` 'Mm* Lhj* Ln. (h 706829Aۛ\[TX[LTX[]]Pж6q!R ^metalRoughnessAoSamplerd206346829 682)02 m @'p'&@ё0!3a7QO@@@B{ ! 3*K{s0B%23$7727 C-IlҼ2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р06VGV"2FV&EVfV6&ҠР06VGV"VG6ǖ&Ҡ06VGV"2EW66ǖ&ҠР06VGV"2FV&u&6ǖ&Ҡ06VGV"r&VgfV&%6W6ǖ&ҠР@UGW'W&C&VFFU"Wv6GW&BӠ@UGW'W&C&FU"Wv6GW&BӠ@UGW'W&CVF&VwV67FU"Wv6GW&B'ӠР0V&7EFW&VF6V&"Wv6GW&2Ӡ0V&7EFW&6V&"Wv6GW&2Ӡ0V&7EFWVF&VwV676V&"Wv6GW&2'ӠР0fFVf4E4TDԠРp$5$TedT$25VV&TgfV&"Wv6GW&"ҠנbFGGfӠbFGGr&FF'ӠbFGG&F'ӠbFGr&FfVv6ӠзӠР`5TGWGw$Tgfb5b5WGǔFWGҠנb5TGWGw$TgfVGWGӠРVGWG6FVdžfbFGWG6FcӠVGWG&&ƖWVdž&F'bFGWG&cₗӠVGWGBvVF&ƖWVdžr&FF'bFGWGBvVF炗cₗӠVGWGBW7&GWGBW7&GӠVGWGBW7&GcVGWGBW7&G撷ӠР"WFW'VGWGӠנ0R6W4E4TDԠРp$5$TedT$25VV&TgfV&"Wv6GW&"ҠנbFGGbӠbFGr&FfVv6ӠзӠР0&VgfV&6G6VFF&TgfV&"Wv6GW&"ҠנbFG6G6V&6WDӠзӠР0E'W7FW'WF&TgfV&Ǔ6G6VFF6G6V&TgfV&"Wv6GW&BӠР`5TGWGw$Tgfb5b5WGǔFWGRF6GD2e6G6VDҠנb5TGWGw$TgfVGWGӠР26GRF6GD6G6V&6WD6GDӠVGWG6FVdžVdžb6G6V&TgfV&6GDr&FF'bFGWG6FcӠVGWG&Vdž6G6V&TgfV&6GD&F'bFGWG&悗cₗӠVGWGBvVF&ƖWVdž6G6V&TgfV&6GDr&FF'bFGWGBvVF炗cₗӠVGWGBW7&GWGBW7&GӠVGWGBW7&GcVGWGBW7&G撷ӠР"WFW'VGWGӠנР0RFf4E4TDԠРp$TedT$TEUE5b5TGWGw$TgfWGҠנf6&VF&VFFU2V&VF6V&WGBW7&G"w&ӠfFVF&VwV67VF&VwV67FU2VVF&VwV676V&WGBW7&GӠРbF7BvVF&&FU2V&6V&WGBW7&Gₗ"ccӠbF7r&F66V&&ƖWBvVFGv&FBvVF&rTFG%䄒WG&WGBvVFӠРbFG27&WV6WG6FӠҠR6VFv$VgfV&"W6WFӠFu&VgfV&"W6WFӠРF&VF"W6WF&VFӠР0fFVfRԔ45dUԠFFW&Ɔ"W6WF2DtUԔ45dUӠFU֖67"W6WFbcccBW6GbVW֠0R6W֠F"W6WF2FW'FWVF&VwV67"cӠ0RFf֠РF&Ɔ"W6WFr&F66V&ƖӠF5FV67"W6WFcVF&VwV67rӠFVFV67"W6WFVF&VwV67"ӠР"WFW'R6FVu&VgfV&"W6WF27&WV6ӠנРAd5FV&7Ǖ6VGV5EW66ǖFuyyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPIr s+# + kPkP1c{ {c#k +KiP1c{ q{k ck +KiPKsK#iPKsICJ;CcK;C+#iPKs!kkiPiPhPJ+c# + kPkPKsK#iP1c{ !+CiPiP I \ʸ\8 \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBH[YZYYY[ٜ HBH\Q[\]ZY[H[]\Z[J^\]H[]\ZHORQWQSTUNB_B\X\ّXY\^Z YY\ۛNZ \X[ۛNZ \[XXۛNZ[[ [[Y[[N[ ۛ\[NBZH[]Z\[XX HYZ\[XțH[]BZH\]WXW X[[ZH X[[ZZNZ HY[\ڛۛNZHY[\ڛ\N[H[]\ZNBNB\H\ZّXY\^Z HXNZ\[N[ ۛ\[NBZH[][ HYZ\[XțH[][țHY[\ڛ[Z\[XX HYZ\[XțH[][țHY[\ڛ[ZHY[\ڛ\ HYZ\[XțH[][țHY[\ڛ[BZH HYZH țHY[\ڛ[ZHY[\ڛ\ HYZH țHY[\ڛ[ZZN[H[]\ZN[[[[NBNB\TZّXY\^Z HXWN[ ۛ\[\[W[]\ZNZ H[]\[XXZ X\YBN Z\Y[\ۜٛ\[[ HYӛ\[[ [J^Z HHۛ\[[^ ^^ + +\J +K +KMJNHHHۘ +K +KN\]HNB_[ YYӛ\[[ HXJ^[ H[ Jۘ ^ L[ L + +[ JK KK K KKLNZH ^K ^]NHN ^J\ +[N\] ^ + +Z + KKLJNB_Z[][[X +Z ^\] Z +LN K KL MJNB_ZYYWXW +Z HX[J^\]\]\] +[][[XJX[ + +J  MJ + +K +K H[ZYZZZ[HZ\X\[ HHZ]B_TZّXY\יXYJ\ZّXYșXY\J^TZّXYșXNZH[][ܓ\[XXHșXYK[]H[][ܓ\[XXHH\Q[\]ZYʙXYK[]\Z[ +șXYKY[\ڛ\H[][ܓ\[XXNB[ ۛ\[\[H[ JYӛ\[ʙXYۛ\[ ^^ + H[ʙXY\[ H HMJNZH[]\ZHșXYK[]\Z +J Ȍ LNșXۛ\[\[W[]\ZH[ ۛ\[\[ H[]\Z[NșXKXWHZ ʙXYKX H\Q[\]ZYʙXYK[]\Z[ +șXYKY[\ڛ\ +J  HSWQSTғS +șXYK[N șXKXWHZ +ʙXYKX H̋L + șXYK[N șXK[]\[XXZHۛJ[][ܓ\[XXJLMJ͊ۛʙXYZ۝JLMJ +J ̋LM LNșXK[]\[XXZH[ J[][ܓ\[XX șXYZ]N\]șXNB_B[H\ؚӛ\[T[[ ۛ\[\[ [[ ۛ\[ [Z\[\J^ۛ\[HYYӛ\[ۛ\[\[ܜ ^^N\[HHۛ\[\[ܜ^NB_B[H\ڑXYӛ\[T[ +TZّXYșX [[ ۛ\[ [Z\[\J^H\ؚӛ\[T[ʙXۛ\[\[W[]\Z ^ ۛ\[ \[\NB_BB\ZّXYH\ڑXY +TZّXYșXYJ^H\ZّXYșXYNBșXYK[]\ZHۛʙXۛ\[\[W[]\Z +ȌYN ZH[]\[XXZHșXK[]\[XXZ۝ +LM K LN ZZH\J[]\[XXZ] +J KL LN ZH[][ܓ\[XXHۛJ[]\[XXZ] +JKLMNZZHșXK[]\[XXZ۝KNZH[][ܓ\[XXHșXK[]\[XXZ۝ NșXYKXHșXKXW؛ ^NH\ڑXYӛ\[T[ʙX șXYۛ\[ șXY\[\NBșXYKY[\ڛ\HH\Q[\]ZYʙXYK[]\Z[ +H[][ܓ\[XXNșXYK[][HH[][ܓ\[XXNșXY \[XXHNșXYKHH\Q[\]ZYʙXYK[]\Z[ +H șXKXW؛NșXYKY[\ڛ\HH\Q[\]ZYʙXYK[]\Z[ +șXKXW؛ +HSWQSTғNșXYZHZN șXY YY\ۛHHXٛ +JL˙XYK[][\N Z\ٜ[ QZ[\H [ +K L \[\\ +J H \\]]YY^ J +\\]]YY^J +ٛYZ[\N șXY\X[ۛH[ +Z \ٜ[ QZ[\ \ٜ[ QZ[\ \ٜ[ QZ[\X + HX șXYK[][\N\]șXYNB_X\ّXYXܑXYJ\ZّXYșXYJ^X\ّXYșXYNșXYK[]\ZHșXK[]\ZNșXYۛ\[HșXۛ\[NșXY [[Y[[HH H șX\[NșXY[[HH[JLY șXY [[Y[[ +șXY [[Y[[\NșXYK[][HșXK[]șXY \[XXHșX \[XX Y] XHY +M H؛\]șXYKY[\ڛۛHșXKY[\ڛ\ +șXKXNșXYKY[\ڛ\HșXKY[\ڛ\NșXYK\]WXWHYYWXWʙXKX[NșXY YY\ۛHșXKXH șXYK[][ +șXKXˋ +JLK[]JșXYZHșXZNșXY \[XXۛHșXY YY\ۛ +șXY \[XXNBZ\ٜ[ QZ[\H  +ʙXK[]\ZHORQїӓTS +JL˙XZ] +L [ +K L [[\\ +J H \\]]YY^ J +\\]]YY^J +ٛYZ[\N\ٜ[ QZ[\H[\ٜ[ QZ[\  L șXY[[ +șXY \[XX^N\ٜ[ QZ[\JJ H șXY \[XX^NșXY\X[ۛH[ +Z \ٜ[ QZ[\ \ٜ[ QZ[\ \ٜ[ QZ[\X + șXKX șXYK[][\NșXYKHșXKN\]șXYNB_B[H[יXY[H\ZّXY\\]J^\\KXH\\ۛ\[HN\\\[H\\K[][H\\ \[XXHN\\KY[\ڛ\H\\KY[\ڛ\HN\\KH\\ZHHN\\K[]\ZHRQїӓTSNB_[H[WXJ[H\ZّXY\\ Z HX[J^\\KXٛ ^HHXNB_[H[\[J[H\ZّXY\\ Z\[\J^\\\[H\[NB_B[H[ݗۛ\[J[H\ZّXY\\ [ ۛ\[J^\\ۛ\[Hۛ\NB_B[H[W[][J[H\ZّXY\\ ZH[][J^\\K[][HH[]NB_[H[\[XXJ[H\ZّXY\\ Z\[XX^J^\\ \[XXH\[XXNB_B[H[WJ[H\ZّXY\\ ZH[J^\\KHHNB_[H[ZJ[H\ZّXY\\ ZZ]J^\\ZHZNB_[H[W[]\ZJ[H\ZّXY\\ [H[]\Z[J^\\K[]\ZHH[]\ZNB_[H[WY[\ڛJ[H\ZّXY\\ [HY[\ڛ\ZJ^\\KY[\ڛ\HHY[\ڛ\NB_[H[WY[\ڛ\J[H\ZّXY\\ [HY[\ڛ\]J^\\KY[\ڛ\HHY[\ڛ\NB_B\ȑPQSTU^Z HXWȔUYN[ ۛ\[\[W[]\ZȔUY]NZ H[]\[XXZȔUYNBNB‘PQSTȝ\]יXY +TZّXYșXYJ^ȑPQSTșXSNșXSKXWHșXKXWNșXSۛ\[\[W[]\ZHșXۛ\[\[W[]\ZNșXSK[]\[XXZHZ ʙXK[]\[XXZ LN\]șXSNB_B‘PQSTHYיXYܗ\J\ZّXYșXY\J^\]ȝ\]יXY +\יXYʙXY\JNB_BYY[HYיXYJX +HYיXYܗ\JXJBZ \]ؗۛ\[ +Z Xӛ\ Z  [  [ H]J^ YHY]ݛțZ\^\Z[Y[ \ H +\N[  HY +\N[ Y] HJ]N[ Y HYJ]NB ]Z[[Y\]Y[[  \HȘ LN[ \ \HȘ +\ SN[ H \ +Y]  +\ \ +Y N[ H \ +Y]K +\ \ +YKNB ؛\HX[YK]\Z\X[Y[H][H\J[ + + U +  PJJN\]Z +Xӛ\ + + +Xӛ\  +H][^ + + + +Xӛ\K +H][^ + +PNBO@h5FV&7Ǖ6VGVƅ&Gv&WEVfV66ǖL^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@F@PR@\F@PR@\FF@F@PR@FF@F@PR@FF@d`dbF@d`db@bFF@@bF@@f\bhbjrdljF@@f\bhbjrdljF@@`\`````bF@@fPb\`X@`\`X@`\`RF@@fP`\`X@b\`X@`\`RF@@fP`\`X@`\`X@b\`RF@@bF@@bF@@ʾȾʾF@d@ʾȾʾF@f@ʾȾʾF@h@ʾȾʾF@@F@d@dF@f@fF@h@h@fP@X@@X@@R@@@@@PX@PX@RRv@fP@X@@X@@R@@@@@PX@PX@RRvF@PR@@fPf@R@@@@@fP\X@\X@\Rv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRvF@@F@PR@@PPRRF@PR@h@tvF@dPX@X@X@R@\ʎPFFX@PR\X@X@RF@dPX@R@\ʘPFFX@PR\X@PR\RF@fPX@R@\ʘPFFX@PR\X@PR\RF@PX@R@\ʘPFFX@PR\X@\RF@PX@X@R@\ʘPFFX@PR\X@RF@dPX@R@\PFFX@PR\^PR\RF@dPX@R@\PFFX@RF@fPX@R@\PFFX@RF@PX@R@\PFFX@RF@ʎPX@R@\PFFX@RF@،ОPX@X@X@R@\PfPX@RX@RF@ʞPX@X@R@\PFFX@X@RF@ʘȞPX@X@X@R@\ʘPFFX@X@X@RF@PX@X@RF@@F@@غF@@кF@@ܺF@PR@@@F@F@PRF@PRF@F@PR@F@F@@bF@dF@dPX@R@`F@dF@fF@PX@X@RF@PX@R@`F@PX@X@RF@PX@R@`F@h@،ЄPdxh|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvf@،ЄPdxf|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvd@،ЄPdxd|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRv@،ЄPdx|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvh@،ЄPdxh|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvf@،ЄPdxf|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvd@،ЄPdxd|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRv@،ЄPdx|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvh@،ЄPfxh|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvf@،ЄPfxf|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvd@،ЄPfxd|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRv@،ЄPfx|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvF@،PX@X@R@،ЄPX@X@X@X@X@ZbRh@ȄPxh|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvf@ȄPxf|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvd@ȄPxd|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRvF@ȄPX@R@ȄPX@X@X@X@ZbRF@ȄdPX@R@ȄdPX@X@X@X@ZbRF@ȄfPX@R@ȄfPX@X@X@X@ʾFFRF@ȄhPX@R@ȄhPX@X@X@X@ZbR@ʄPʂ@X@@X@@X@@X@@X@@R@PX@X@Rv@@@@\PX@Rv@ʄdPʂ@X@@X@d@X@@X@@X@@R@PX@X@Rv@@@@\dPX@Rv@ʄfPʂ@X@@X@f@X@@X@@X@@R@PX@X@Rv@@@@\fPX@Rv@ʄhPʂ@X@@X@h@X@@X@@X@@R@PX@X@Rv@@@@\hPX@RvF@ʄPX@X@R@ʄPX@X@X@X@X@ZbRF@ʄdPX@X@R@ʄdPX@X@X@X@X@ʾFFRF@ʄfPX@X@R@ʄfPX@X@X@X@X@ZbRF@ʄhPX@X@R@ʄhPX@X@X@X@X@ZbRF@ȄPX@R@¶PPPX@RX@RRF@PX@R@¶PPPX@RX@RRF@dPX@R@¶dPPdPX@RX@RRF@،ЄPdxd|@X@d@X@@X@@X@@R@@@@@v@@@@@¶ƺ\vF@،PX@R@،ЄPX@X@X@X@ʾFFRF@Bd`dbF@PX@X@R@@~@@t@F@PX@R@@@Ff@fPf@RF@@@@@@PX@ljj`h\RvF@@@@@PPPX@RR\X@X@fP`X@`X@`RRvFF62*\ʸܾ\8 \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB\\\]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓNBNB\S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNBNB\՜S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNH\X[YUӓQNBNB\\\S]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\S]^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\Sћ]Y^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQN[ ݛUӓQN[ ۛӓNBNB\\\\\\^[ \]ڛTUғNBNB\\\\\Z[Y^[ \]ڛTUғN[ ؛[UYSUQNH] ؛[YYXSQQPNBNB\S\ݑPY^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]YUQN[ ]ۛUӓN[ LUӓQNBNB\S\\\\^[ \]ڛȔ\]ڛN[][]ڛH] H]UӓNBNB\S\T]Y^[ \]ڛȔ\]ڛN[ ]ۛUӓNBNTLe5FV&7Ǖ6VGV5FV&u&6ǖ}^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@F@@bF@Dʾ\D@dP@R@@Tv@hP@R@@dPTRv@pP@R@@hPTRvd@ddPd@R@@Tvf@dfPf@R@@Tvh@dhPh@R@@Tvd@dPd@R@@Tvf@dPf@R@@Tvh@dPh@R@@Tvh@hPh@R@@dPTRvh@pPh@R@@hPTRvh@blPh@R@@pPTRv@jP@R@@@z@Tv@Tzv@@Tv@dP@R@@Tv@hP@R@@dPTRv@jP@R@hzTv@hTzhv@@hTv@ȠP@X@R@@@PPPRX`\`````bRXRv@f@ޮPf@X@ff@R@@@@@PX@Rvff@訄Pf@R@@@@ff@v@@@@f@@z@PX@Rv@@@@@z@PPX@RX@X@PX@PX@RRRv@@@@@z@PRv@@@@@f@@z@PPX@RRv@@@@@ffP@^^@t@Zbnrn@@@@X@@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RRvff@訄Pf@X@f@R@@@@@z@P@Z@PX@R@T@Rv@@@@@f@@z@PX@Rv@@@@@ffP@^^@t@Zbnrn@@@@X@@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RX@@@@@@@@fP\X@\X@\RRv@ʾP@X@d@ʾR@@@@@Pʾ\@V@ʾ\@T@RvF6*<".:(77<2689222..242727:9.272941:2.:9029902/2494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠРР0'v6V֠РҠV66VVננV66V27VV֠נBvBVV6GWFV66VV37VV26VB6bV6R7WF"2FV&2V&נננҠР22F4Ŕ"6ҠР0BVfV2T%Te4T5TDbӠ0BVfV24Ud5T%T5%45UӠ0BVfV2T%TUde4T5U#CӠ0BVfV$%D4Te4T5U#Ӡ0BVfV"UdT4De4T5UR#Ӡ0BVfV"UdT4DՔ5TDӠР0BVfVT5t%T45TD#ӠР0BVfV2Dt$Ӡ0BVfV2DtUԔ45dU2Ӡ0BVfVUԔ45Bc֠Р0BVfVr$%TedT$%Udr$ՠ0BVfV25EU%TedT$%Ud2%ՠР0fFVf5V7V7נР2Ɩ"6ҠР0BVfV2E%tdń2נ0BVfV2E%td2E%tdńҠРV66VV3FV&EVfV6ננ26GW'R6GǦ3G'veVvr&&TgfV&%Wf2E%tdr$%TedT$%UdӠ26GW'R6GǦ3G'veVv27GW&TgfV&%Wf2E%td25EU%TedT$%UdӠРƖV"6w&&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uFr&&TgfV&%WfӠנРƖV"677GW&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uF27GW&TgfV&%WfӠננР0R6W5V7V7נР4Ɩ"6ҠР0BVfV24D'WfV'Wf72V֠0BVfV24D'WfV24D'WfVҠР0BVfVr$5$TedT$V2&VgfV&24Dr$%TedT$%UdVҠ0BVfV25EU5$TedT$V2&VgfV&24D25EU%TedT$%UdVҠР0RFf5V7V7AXVZ(PрВg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ ˫Ċ̊JʭLhD\ѕ "mrW(Mi++1&AqِJ숮JԂˆ$WELt%Wrte\6$.e+++a r1 Bx]A4]]6 .m++l@j]DWj!Wt0\]6 Bw0 +> ApzKK{s $!62AH BmXte^^^r^t_NORMAL ! eÒ+B/b/++/<6,///R//BkIhaa |}ɕ} | AlXB!d_Hf_r^B_ E ȌL0 +;+ $6a2]9zA{\]ٰ ʐ ʽ +̆6,p22-/r//*aXq ɼ ]vXэKR`x: u`'@ @O#0XG=.`z4`\H> +2'0XG=`zP[][[\۸|J027:70q "06+0!ResPЯpq "%60u 10.@$f`mݸh} R t&F66V&6.@$Fx:  :6q "07,# pXG=@OLmȀ: gbuffer Doz"z8 !VFV67$G%6V7V67.@<@^&۸^:encDأtzj%GY,83! 0.Bd7Pd7{4ǙXSݸ`^ s/llvm.dbg.cuS9qfFVVbv67E;fFVF7%Kdx.source.contentsS=PSIVqD2V'7VBVfV67%l̽ɍ9M Z[XKܔVؕͥM t ]]ܔW̡5M ~ \[Xܔ],хѥM ]Z]]]ٔ ^ṔAM `yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq '` @; a~qۦ <D@3,!8;?8mptm4\ bP_ܶ@;/̳~q6P <49RCM~qۖ LT  1A8Fbp0 q# `ੁAH3+x$Ve0M# `ÕAPA xm|hՄ0b 8`h`M# `hׄ0b  +AD3D*A># `A`҄0b AL |ZA ({n5a A?tl?0a$pm Մ0b Ä0b JAX ZA (~ p5a A +?[j?L# `6a A +?\j?L#`P;aCZ PCÄ0b E(p?0a A +?\m?L#`P<a[ CÄ0b E(p?0a<A Adό +T> 0a&00 CÌ +K>#`P<eCZ CÄ0b (h,TuM3+x Aa +?Yf?03+x&00 DU\WA\3+p&0 h L6t1 \τ`' 0ό + b 1τ0b ,0q?0c@ pÄ0b ,0q?0a A1 '?[x?s %q6#`P̂Is] P`Ä0b ,0l?0c@Vg3b ,0l?0a A1 ?[v?L# `0`UQӌQWI|f :8,L6X03c@AUgc !> L B0c@ARg3b` -A0aXgBτ` `@ _  aƀ1(1@FF0F `& @>3X%q66|& Lf|& +@> A|& C@>)g  > *ÌaRI͈ *Ä0b : +~?0a A0?_?o3b : +|?0a A.?_?L`1 1@- `@ 6q6 M> l +L#`(Ly0F `;R@`1@ L`1XJ f W10X!0,H3apg1@ht1 ^`@ zLa1@dp0F jaf Y1@JB0F ja& A0(Z `@ zFa1@@0F ja& A0(Z `@ zFa78AP0b =p ?0c@B `- Ä0b =p ?0a Aq4?Bi?L p A0(a\0Ab|F p& A0(a\A3+|Xgƀ6`ұU3aAx@A:#`PMx3,A:#`PMx- "  xA: 1 aұ3c@AcA"€=HC>3D8A:F|f <؃tLL#`PDO z3,A:#`PO z \ 1O. +7#`Pl y3,(7#`PO|3+L7#`PDOC| '9Ä0b Ip?0a Aq>?_?:#`PDOC| '9Ä0b Ip?0a Aqs?h?0ߌ Aqr?h?L#`PD\z '19Ä0b Ip?0c@ Aqr?_?L#`PD\z '19Ä0b Ip|?0c@Ƶ3b Ip|?0a Aqq?_?L#`PXClA 0%pP +A 0%p@ +A 0%p0 +A 0%pM#`PO|3mnΈ '9Ä0b Ip|?0a Aq?_?L# `8=0a$SP„0b LI>?A 0%p '9@Ìqg3b Ip|?0a Aq?_?L#`Pl{A 0%pA 0%pA 0%pA 0%pPk$R)s{#+:33+  + :22*zr [+#;33+r)K3Gh*|o*|u*|{*|m+|s+|y (|i (|m+ (|q{|6G7GzGj6GjGj[7GjG6€G6ÀG;7Gl*|Įs*|Įy*|Ķk*|Ķq+|Ķw#>L`i[3>Ԍ63733˸UUI7=cha0?r*` aYYl(` i럈k"bա!$IsXy"%y"2!&`Y8B4%" j`~ `j&*"~{STAT$` DXIL BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L M2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b b 0 Ua#Ad  #Lm00n@ PPr@ +|`0`@~~z P( fq`pypZ(|zrR{(qw>0vxp6:0$t}7ISD ̳;¬ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J`$ʠ +< + +0(2("(gHqjb8_yLFD oM $Efe%&,f&gl&eCLe@,  l A$M썪 o@4 ͆Pa&FU!p8хI՝QmHE"! M1؄Mm@"ظɵMm@ +#xхI՝Mm@J#6 Wm (&0߷! a Ѐj +Ks2e6F6A( Bm BM +mBA4&6A m6,C h0A +r:*rڰ0spkn0q@kIhoay:85H7 &D!6,xPgy +6:=`2eE&wVF7A( !m6,A j@lX>8>ȃ5`X?0ΠDa 5`6  +aR6^B0c{ 49 AјK;b# 9 a+r{k۠**++TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+p\ʂaP ..l.lJ0u\Ѕ e΍LnnJ +yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 0vxp6:0$t}7ISD ̳;¬ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J` J ʡʃ(B(!pǪ&88_yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ 4™ p6$φdXbِ4 C4CC<(&bm@!6 @bf Ce] pm 4ܸLY}AͥѥM +jPTbPXڰa cpzj +b &DA84ذ eA "' K `ЌA*zz" lXΠ 13 &!6,pā `cl(@ ɔUY&ĴA8;ذtA e` 16͆` 1h6 x{a>6\Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +hu\}yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 6|l, +n]VEMX1 |c,C u0 #`VB|,1!b +@>&1 cDŽ >`1@A0 3b 8#`p(g@ r( F 2S/1XgX F  ZW,Hc!{Tψ D0g @ w(A0SRA>$U3b` =B`K+C> cA" 1 13bp ?ó # `8>C)$2p0b H>C;ˆA  #$2ÈA  # $2A  # # `8܃>$2pp0b H=C;ˆA  # DXBC\ }%'L DT(ԟ4PSFI0ISG1SV_PositionNORMALTANGENTTEXCOORDOSG1th@h@h@SV_TargetPSV04",NORMALTANGENTTEXCOORDTEXCOORDPSMainDCCBCDDD000000ILDB<`'DXIL$BC! ' #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L P2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??=htyzx( 38C8<->C=C9)=8;;C8ě)gY@BdV rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y< 2L &GCJ +)B((b(r(JJ +a1Aq2Ǫ&88_:Gy L d! s# #sAcc4@ oM $Efe%&,f&gl&e@Č-noS[\[ Ȍfloat{ 0b4pf+Ff4pfpYM#܁$`0db1@w` 8 /E DA`Kff4pfpYM%܁$`1fd1@s w` x E dA`"!Q( x-.a"v5VF!͍n`PLfZadk΍nZAl:1 I lP" +3h+{1c{ ca50`-b : "h@:H @a6 ko̍k΍nZAAl:9Bt0"@half4|xX@h|H120b4j )0aH! `1@B0[Mt@ +y`Ѓ=?X6\LgZAA(l@A&ApH,; [ !17930:E Ш600E и,b7p ` + +ADa +@+2 Wh+{1c{ cYt 0ap!0 ,LgZAA-l:[B,t@ p "`A A)B.Ѐj +Ks#̡ͽՑqՙ}͕ͱ ^ UI}=UQAUQ1 c+#{ +{[/BkC)@M-kͭln-L.-m4 a`.J.mnm,k-n4 a`"aq I0B/ @9syC #+{Isc#+JszsAccK4{;33#6F消u@QW 0ۛ\"hF$]Y"hH<]ۛ"hJrTL"hLd`C0 `Jt0z C=l&j]T P@X./shaders/include\shader_global.hlsli@:TangentToWorld027:7962 179&  0:4<& ClVM>C?@"2:*!'AQPVOI[\P ]ݛP  ֆ 6 0&`BB$aHȤ}ՙ ~䀀Ȏ䀀Tՙc+#{cf6ǮlM-͌dg4j BL0aab" `1@*DlX%\b +r0 V %&E ` +@LI^ p̵ѡ-b YX MBEMp{k c[MEPi+ ccs+[MNEM sc+sBEM)kKK{s [MOEM P{[OEM +0*kKK{s+s;C[MXBEM ИC #{[XEM i +K c[MYE`6㭎-ͭl4g l e&l't'|,Ă,-&A"6Zl-VM@/IM pIsK +c+#{#}eaUUՙYؕѽimMŪ 腷^ Dinit_aoL447 *72#:329 0633 5iX5@u vq@p%-M-vF&UU6VFv$VgfV&dCbW6F&D#a֢6 &B/z-}͵ѡ1~怀Ȏ䀀H̀VM@/_X IsKj+ cs+#}хeaUUՙi^ 腶 p @T6FVu&VgfV&%v?)s{#+:33+  + :22*zr [+#;33+ Zl4VM@/Fin K+:33+#ɥѕ}ՙeU UI}=UQAUQUAՙi +[+#;33+[/BF)p9W 0 `f&ǮlM-͌Dg4j m0a7h# `6PI  +`,b5hX8FmlX5lcL opsMƪ P^ D2pack_gbufferă3:329 *2#:329 *72#:329 nŦ|coF/oA+"4)029n?isEmissiveShader@@YA_NM@Z$A djz!<ģ Ȕ9ɵ~ʜ؀~~H䀚H`b~H䀚H`d6PPU `w|p@` +vpDhh8ɥ񘱽ѱа,b܀E0`1@n"  "h X$0C܀E0pE <H`HpI b1@3 n" h /E ,,b܀E0E \H`&LpI @e8|,b?7` \M"h@DpI @f8|,bFD7` l"hHDpI @g8|,bD7` |`1a"#R"'2PVp0` +.ETd!z 1@5:+s+33+!i Kj"!ڶ/"{c#J+z[f + M*mHkj̭L̬LhĮlMfHhJ̈2@'m.mL(l,w6G6V&6WD6G6VFF&TgfV&4cCbW6F&D3$m~FlD`&VFFUG NLǮlMnj-gp!БI X# 'M썪 hꇄ NLĮlMf(h +706200 +aT`"jZ1@*sJe +;SY[   +peC+ @D0t`х ՙXLՍɕ ՙU%ххm[_^`W6(0B#7#aB&i&o+Ѕ`Ct&gbU&7ap JDebug Info VersionZ0 yd .O. DFĩ( i$ D. nDlLή̥Ad .O. e(DF(,M- (ldɈ$ D. nDlLήAAa$m Dd-L,ͭlMAAa$m D$뭎m-MAa$m Dd쭭.lm-MAAa$m Dd-LM,m-MAa$m DL̬LK,lm-MAA NL$M썪 DD,mL&eA NLM- DD,mL.&eA NL.M ͭln.荪 DD,mLN&eAAa* Ln. $Mm* LDD,mLe&eAa* Ln. M-m* LDD,mLe.&eAa* Ln. .M ͭln.m* LDD,mLeN&eAAa$̍ $i*iAAI(kHȨH +ej̭L̬L.DD,mLE &AaAČ-nAČ-M)N. oAČ-M-)N. oAČ-M*mnAoAAjH j), j. )$ .AaAjH 䭎nAA䭎m..  Č-% m..͍$,%eA䭎M M--M M-)N. Č-% M-,%/O/eA䭎΅.̍M--M M)N. Č-% ΅.̍/O,%/O/eA䭎΅ oM $ ΅ oMlA䭎΅ oM%$ 䭎΅ oM%oAADN 䭎nAAam $$i*iAAI(kHȨH +ej̭L̬L.DD,mLE &AaAČ-nAČ-M*mnAoAAaL̬L$m.m(.L̬LDD,mLE,&AaAČ-$m.mL(l,hAoAAaNnNL̬L'm.m(.$m.mL̬LDD,mL&eAAjH j), j. )$ .͍$m.Dd+m.m,(AaAjH 䭎nAAdm.͍$m. $m.mL(l,d$m.hA䭎m..  $m.mL̬Ln+m. M)N. /Č-% m..͍$,%eA䭎M  %m.mL̬Ln+m. M-)N. Č-% M-/O,%/OoA䭎΅.̍M--M %m.mL̬Ln+m. M)N. Č-% ΅.̍/O,%/O/eA䭎΅ oM $ ΅ oMlA䭎΅ oM%$ 䭎΅ oM%oAADN 䭎nAAAa̍, $$i*iAAHȨH멊 + +j), jH $ .AaA-l$M $M썪 e* %Mm* L$ ΅ oM,ELlA-͌.M ͭln. .M ͭln.荪 e* .M ͭln.m* L$ ΅ oM,eAAČ-n.̍M- M- e* M-m* L$ ΅ oM,/ODD $lAČ-nMl +.lM- M--M *̍M .̍M-䨌J % M$ ΅.̍.%%eAAČ-dnL m$ m..mAA .llH̬LDlnA$-L̬LEl.eAA$-+M El$M-eAAa$͌ )ij*ɪA$--L.- Eld +)(諨)ij*ɪ(eA$--mn. El,el.AamA$-+ Eld.N. .M ͭln.Ed%,%eAa̍,ͬAA$-M- ElMl +.lM--eA$-kͭlnEl$ .M ͭln.,eA$-.ͭlnEl.M ͭln.E,eAADN m썬L̬LEldnL m.eAAAa k-Ln+mk쭭.lm-2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР0G'W7F6G6VFF֠נbFGGr&FF'ӠbFGG&F'ӠRFGRFӠRF6vƖvFWFӠRF7BV֖ӠзӠР0G'W7FWFF֠נRFGRFӠbFBVGӠзӠA8t!p͡qՑqՙ}͕ͱq7<34:$''&! 6634929227<34:4479%#* 6634929241:2902/2494764)02930:0202:970206) $$9:1:(2#:32064377069:07706:092770633494093430700632066063:0924:29:0927:792060632<:120629063906390067770637/0930:0209:1:*72#:32060620637:4307006320664:29:0927:792061797063:0924:29:0927:7920617970637/094:29:0927:7920617970634:29779706379:23:4:2977970639030:02030:::49:1:2#:3206306230:707:40200632066*0929082)8208*09730:27270630063217042789:7=21212:972307270630:230:7730:21<30:30:06367:77<=7777=77<89:2:9777<=060634020672:977:760606370627060622:970:024020620<:43029:07100697:8064120729902#:3293:329*72#:3293:322#:3293:0632066'9*092<3:32920662066'9*092<4)0293:3290203:3297/09:2066'9*09230707:49302727063:329706<0<3:3297:4906302063:329020633:3707:4020630:707:490203:306270633:32906274)0293:3290203:32979:23:43 '3:3293:30627063;3:32906273:3293:32066*09290;3792066'9*092<3793:32990;3:32066*09290;30:2066'9*092<3:329902:973:42:75707:4930707:49::30706::0637:470672706707:497:4909707:4942:7#:329707:492#:3293:3::30706::0637:4:75707:493:3707:40206<=7067:4*72#:329:7#:3292#:3293:*72#:3293:323:32902063793:3707:40206;0632066*09290;3:32066*09290;<06390;312066*092900632066'9*092<3792066*0929006390;3:32066*09290;0632066'9*092<3:32066*09290;3:32906273:30627<:7#:329707:493:33:3297063:3297:43:3297/09:4)0293:3290202066'9*092<3:329206692066'9*0923:329:092<3:32974)0293:3290203:306273:32979:23:44)0293:3290203:30627; ''3:32990;903:3294377906273:3292066063392621:1298337:4892314$722314$727921:3:3299:077929806392621:1392621:1392621:06273:32920662:973:32(2#:3298#:329*72#:3293:(2#:3293:323:32902063:30203:3297063:3703:3294093493:37:43:3293490<3:3294093493:329409343:329206693:320663:329:092<3:3:092274:274397913:32977793:379:23:43:30623:3297/09:3:37/093:3292<:120627706273:30623:329437793:306273:329206693:306223:32990;3:3903:329:0927793:329437793:329:092063392621:13:30206) $/' &3:3902983334892314$722314$727921:392621:1298392621:133:3293493:329:092392621:13:329:0923:3299:077929806392621:1392621:1392621:3:306273:32920663:32973:32:973:3242443:329::*72#:329:6:6:0627:6:706:6:7:49:6:20669:6::092<:6:7/09::6:79:23:4:6:7:6:90;:6:0206) $/' 424406274::*72#:329:6:06062:6:0627<=06242447:494::*72#:329:6:0637:4:6:7:497:44244/7064::*72#:329:6:307:6:7067424420694::*72#:329:6:06320:6:20669204244/:092<4::*72#:329:6:063:092:6::092<:092424474::*72#:329:6:063:6:7424490;4::*72#:329:6:06390:6:90;90424402064::*72#:329:6:30:020:6:02060204244774::*72#:329:6:30:79:23::6:79:23:479:23:42447/09:4::*72#:329:6:30:7/09:6:7/09:7/099:1:#*#"***0630627)/02:30:707:40206)/020632066*09290;)/02:#*#"****;43:3292#:3293:#*#"****3::3:::06273:30623:::707:402063:3707:40203:::2066*09290;0633:32066*09290;2:973::#*#"****273:32/;*72#:3293:322:97;43:3293:3293:32242273:3290273:32/;0629:9/70606067606'30830::2:2217973:2426:0330222<30282<30::22<:30::;2<:762:24099302829819'2830229819230*28298:<2298:;30!28298:<2298:;79:1:0047007:330:470<89:0<7:*7:!2:97060676='0676<470*0676<470 k-Ln+m -L.L심,ͭlm-9 ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4( I]I}%9M}!I5( I]I}%9M}!I4(4(4(4(|!I]I}5Q15(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(4(L!I} =5A%1I}!1M14(L!I} =5A%1I}!1M1Ā4(5(4(AU}QIQ4(@%̸Ԙ5(@%̸Ԡ5(4(AM%1=94(T9%Q}a͠ĸ4(T9%Q}e͠ĸ4(T9%Q}i͠ĸ4(4( M}IYIM %QM4(LAIQ}M5A1I}= ) Q4(ՉՉ}ɕ}}ѕ}}ͽ}5(ՉɀՉ}ɕ}}ѕ}}ͽ}5(Չ̀Չ}ɕ}}ѕ}}ͽ}5(ՉрՉ}ɕ}}ѕ}}ͽ}5(4(ᕑ5(ᕑɀ4(ᕑ̀4(ᕑр4(4(с͠ссс4(5(ȕɹᡄᡈ4(5(с͠ссс4(5(ȕɹ4(5($9YI%9Qी5(4(с̀͠4(5(ȕɹ͠ీ䱀4(5(сѠсссс4(5(ȕɹᡴᡄᡈ4(5(сѠсссс4(5(ȕɹ4(5(4(@I %Mɕ͕5(LEIQ}MQीѡ̅Ʌѕ।4(XM}=UQ}A=M%Q%=9рLY}A=M%Q%=94(ЕɅٱ᱀奀LɅ|ͅхѕ٥局᱀4(Е٥L1ٕ|ͅхѕ٥局٥ܥ4(Е٥L1ٕ|ͅхѕ٥鱀٥ܥ4(Е U ٥L1ٕ|ͅхѕ٥鱀ٹܥ4(Е U Ʌ屽ٱL1ٕ|ͅхѕ٥ݱ4(Еɽ٥L|ͅхѕ٥彠٥ܥ4(Е٥L|ͅхѕ٥4(Е٥L|ͅхѕ٥4(Е U ٥L|ͅхѕ٥4(ЕɕѡɡЍѡɡ|ͅхѕЍ4(Еᕱэ=͕ѡЍͥ0͠Ѝͥ4(Еɕ=͕ѡЍͥL|ͅхѕЍͥ4(Еɕ1=͕ѡЍͥL1ٕ|ͅхѕЍͥ4(4( 15A} =II؅4(0==Alu5(T9I=11lչɽu5(I9 !lɅu5(1QQ9lѕu5(4(5AQe}MQIU QՍс5( 1I}U9UM}55 I5(HQUI9}5AQe}MQIU Q4($9%Q}5AQe}MQIU Q4(4( ]}UM}M I9}A=M5(Q}M I9}A=M}ͥ}5(Pa1Q !}%95(Pa1Q !}%94(4( ! -}QaQUI5( ! -}QaQUI}aAIЍ4( ! -}QaQUIIIe5( ! -}QaQUI5( ! -} UI4( ! -} UI}aAIЍ4( ! -}MQIU QUI} UI4( ! -}MQIU QUI} UI}aAIЍ4( ! -}MQ9 %15(рЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(̀Еᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(ɀЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(сЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(рЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(рЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ЕᕱэЍЕᕱэ ͕Ѝ|%1}|}1%9}}Ĥ4(4(р ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(̀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ɀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(с ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕ՙԥсЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕LՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕H]MՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5(ԥс ՙ ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5( ՙɡЍ ՙ ͕Ѝ|%1}|}1%9}}Ĥ4( ՙɠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4( ՙ͠Ѝ ՙ͕Ѝ|%1}|}1%9}}}}4( ՙѠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4(ؽѽɕ ՙ ͕H] ѕɕ ՙɁсЍԥс؅Օссс4( ! -} UI4(LѽɕЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥɀ؅Օссс4( ! -} UI4(LѽɕɠЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥ̀؅Օссс4( ! -} UI4(Lѽɕ͠Ѝ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥр؅Օссс4( ! -} UI4(LѽɕѠЍ؅Օ4(5(ѽɕ ՙɡЍ؅Օѽɕ ՙ ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙɠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}}}4(ѽɕ ՙ͠Ѝ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙѠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(Սɕ ՙѡЍmեѡ ! -}MQIU QUI} UI}aAIЍЍt5(ՙѡЍmեѡ ! -} UI}aAIЍЍt5(ЕɕѡЍmɠ ! -}QaQUI}aAIЍЍt5(5(4(ԥсѕэ ͕PɕԥɀЍссс4(4( ! -}MQ9 %14(ȕɹmэu4(5(ѕэЍѕэ ͕Ѝ|%1}|}1%9}}}}4(4(L!I} =5A%1I}!1M14(̕ѡ而5(ɡ5(5(4(̀͸ѕɡ̀؅4(5( 1}AI %M%=95(ȕɹ؅и4(͕5(ȕɹ̕ѡ͙ѕѡ؅؅᱀؅͠4(5(5(4(m]p͡qՑq}ѹͱq7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""429:1:$7:30477$'30706' 30:2792"')"9:1::::30:477)/4730:779''30:2792"')9:1:9+#:::30:477)/4730:779''30:2792"')47:3$""')9:1:$7::430477$'30706' 30:2792"')"30:027: "'9:1:::::430:477)/473076' 30:2792"')30027: "'9:1:::::4:70930:477)/473076' 30:2792"')30027: "'3079629"')30:779''9:1:$7::-(230477$'9:1:$7::-(247230477$'30:7349!"'#$47:7$79!"'$'9:1::::#:330:477)/473076' 30027: "'30:2792"')3082"')9:1:::::-(230:477)/474729707747:42"')"9:1:::::7630:477)/4730:2792"')"  k-Ln+mk-LM,m- ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(L!I}1= 1}!1M15(L!I}1= 1}!1M14(4(Ցɑ݅ɕ}͹ͱ4(4(сɠсɕɹ5(сѠсɕɹɠ5(с᠘сɕɹѠ5(ɀ|ٕɠɀɕɹ5(̀|ٕ̀͠ɕɹ5(р|ٕѠрɕɹ5(4(ɀɠɀɕɹ5(̀ɠ̀ɕɹ5(рɠрɕɹ5(рѠрɕɹɠ5(р᠘рɕɹѠ5(рؠрɕɹ᠄5(сՠс왱с؁􀄩ةȕɹة5(4(ɠɕɹ5(Ѡɕɹɠ5(ՠ졅􄩄퀄ѨȕɹѨ5(4(сAݡс`сdȕɹݡᡄ͡`Ęd5(4(̀PQ]ɱ̀ر̀P 94(5(ȕɹձP 9إ4(5(4(̀Q 9̀84(5(̀P 94(4(̀Pɽ͡8T9%Q}e4(P􀰕ɽ͡8T9%Q}aPѕAM%1=9ѡPP4(P􀸽ɵ镡P4(4(с̀􀸽ɵ镡ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(̀Q 9̀8̀P4(5(P􀸽ɵ镡PѡP884(с̀ɽ͡8P4(4(ȕɹ͠P==8U܀СсС́Ʌ͕ȕѽ5(͠Pీీ8॰4(͠P䱀䱀8䥰4(͠P豀豀8襤4(5(4(сɥ}願сȅѡɀ}ѡ4(5(ȕɹȍ}ѡ}ѡ䁨ȅѡ4(5(4(m^xD:\NauPrototype\samples\sceneBase\..\..\engine\core\modules\render\include\nau\shaders\shader_defines.htd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAAaN.- mAAEA-l.l -AaA-l.l dṋAdA-l ĭl -l.l -NGgṋ,d.m -m, $mn D,d-Ld .LAAAAAAd譭 ehe$̍ i)DmlͥAAa,ͭ dJ(hkʉ +ĦAa,ͭ dhkJ)jKihk*IAa,ͭ dJ)(hk*I$FAa,ͭ $IJ*()i)(hk*I$FAa,ͭ DȈh*)(hk*I&FAa,ͭ DȈh*)) kʉ +$AAa,ͭ ))kj))Kɩhkʉ +$FAAa,ͭ d +)(I) Aa,ͭ d +)(諨)ij*ɪdAa,ͭ )뫨)ij* ƬAAa,ͭ I(KȨH J( HAa,ͭ d*kKȨH J( dJAAa$͌ k nnAAdhe͍-DmlͥAAa,ͭ dJ*((+ /dAa,ͭ dJ*(( /dJ*((+ /AA-l.l -NGg-L,ͭlAaAdm N,lMGgN..M,M̬LJ, dJ*(( I(KȨH J( +eAdm N,lMGgN..d*oM̬LJ, dJ*(( e*kKȨH J( +eAA$͍-ͭ D $mM,M̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. M,M̬LJ, /eAAA$͍-ͭ D $mn*oM̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. e*oM̬LJ, /eAAAAam k nnAAi͍-DmlͥAAa,ͭ di( N, -,N, od-Aa,ͭ di( +N, -,di( N, -,AAa,ͭ I(kHȨH +-,dL̬Ldi( +I(KȨH J( -,Aa,ͭ d*kkHȨH +-,dL̬Ldi( +e*kKȨH J( -,AAa̍, k nnn`/%i*i'fC/BK*ps_6_0Z($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kC///2!2"32$S2 dPfHQ +psd0Lˠa BmPf6$(282(s221!99 I-L-L-LldffhfPelLPeNe ،ɜ Z6AZ86 739Й Ćg6 '=3A0oC3\&5AH Llh ))1ӓTS!a&HAٰ ڈِMڜ؜٬  "' K-ؘ ٤ɌM-*zz" AlXml&mN&mlfCp2Px1IP0`Cq6l6q37L&2A@ B͆eFlldeo6,'S7bc7rc6'S6'c6x! K-ԍޘɔM- lFof@7}l(afginput DtTXG=`zD`: u`'@ @O # 0 )!L: @O#0 VF&VwV676.@$\G`Ru.̍M-m\H>Ď +u %@ԁ+i\HI>AE `uK) ;``7.B$vg:~|ݽɱM9ɵK^`p`@Cln\H>0 j'@@O0A8uc[G=2`zlǙXYܸP^`|74N}х=QɅͱՍKW `6.B=e7ڇCظ^q "Q0 5$%@+K `8 q&VgTG7.Bd7h ] ؙXݔWٵձME\ٵM [X؛]ܔ\e]%^^̽ɍM [XK[XQ[SX[ٔ@_̽ɍɝM J +]\ڛ۔e؅ٕM TZY\Y۔e̐ȕͽɍM t ]\Y]]ڛܔgإ%MхѕM ~K\[ܔoyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq '` @; a~qۦ <D@3,!8;?8mptm4\ bP_ܶ@;/̳~q6P <49RCM~qۖ LT  1A8Fbp0 q# `ੁAH3+x$Ve0M# `ÕAPA xm|hՄ0b 8`h`M# `hׄ0b  +AD3D*A># `A`҄0b AL | ?A ({n5a A?t?0a$pm Մ0b Ä0b JAX  ?A (~ p5a A +?AH?L# `6a A +?H?L#`PB(a > pCÄ0b E("?0a A +?H?L#`P)a ? 0CÄ0b E("?0a<A Adό +T> 0a&00 0CÌ +K>#`P(e> CÄ0b (h,TuM3+x Aa +?A>?03+x&00 DU\WA\3+p&0 h L6t1 \τ`' 0ό + b 1τ0b ,0#?0c@ Ä0b ,0#?0a A1 ?AH*?s %Q;#`P.sCJ pÄ0b ,0?0c@V3b ,0?0a A1 ?́?(?L# `0`UQӌQWIԎ|f :,L6X03c@AUc !> L B0c@AR3b` -A0aXgBτ` `@ _Zaƀ1(1@jj0F Z& @>3X%Q;6|& Lf|& +@> A|& C@>)g  > *ÌaRIΈ *Ä0b : +0?0a A?K??3b : +.?0a A?K=?L`1 1@- `@ 6q6 M> l +L#`(Ly0F `;R@`1@ L`1XJ f W10X!0,H3apg1@1 ^`@ z(pXa1@0F jf Y1@nf0F j& A0(AZ! `@ zjxa1@d0F j& A0(Z `@ zjpa78AP0b =p 7?0c@B -@Ä0b =p 7?0a Aq?Mp?L p A0(\b|F rp& A0(\x3+|Xgƀ6`U3aAx@!?#`PC:C]3,!?#`P:]- " x!? 1 a3c@AcA"€=C>3D8!?F|f #`PY@C^3,(>#`P< i3+L>#`P; h '9Ä0b Ip2?0a Aq?CL??#`P;h '9Ä0b Ip1?0a Aq%?L~?0G Aq$?L}?L#`PH _ 'Q90Ä0b Ip1?0c@F Aq$?CL}?L#`PH_ 'Q90Ä0b Ip.?0c@Ƶ3b Ip.?0a Aq#?K|?L#`PD=XA 0%pP +A 0%p@ +A 0%p0 +A 0%pM#`P<i3mnψ '90Ä0b Ip.?0a Aqd?K?L# `8=0a$SP„0b LI>?A 0%p '19`Ìqg3b Ip.?0a Aqd?K?L#`PYChA 0%pA 0%pA 0%pA 0%pPk$R)s{#+:33+  + :22*zr [+#;33+r)K3Gh*|o*|u*|{*|m+|s+|y (|i (|m+ (|q{|6G7GzGj6GjGj[7GjG6€G6ÀG;7Gl*|Įs*|Įy*|Ķk*|Ķq+|Ķw#>L`i[3>Ԍ63733˸UUI7=cha0?r*` aYYl(` i럈k"bա!$IsXy"%y"2!&`Y8B4%" j`~ `j&*"~{STAT$` DXIL BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L M2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b b 0 Ua#Ad  #Lm00n@ PPr@ +|`0`@~~z P( fq`pypZ(|zrR{(qw>0vxp6:0$t}7ISD ̳;¬ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J`$ʠ +< + +0(2("(gHqjb8_yLFD oM $Efe%&,f&gl&eCLe@,  l A$M썪 o@4 ͆Pa&FU!p8хI՝QmHE"! M1؄Mm@"ظɵMm@ +#xхI՝Mm@J#6 Wm (&0߷! a Ѐj +Ks2e6F6A( Bm BM +mBA4&6A m6,C h0A +r:*rڰ0spkn0q@kIhoay:85H7 &D!6,xPgy +6:=`2eE&wVF7A( !m6,A j@lX>8>ȃ5`X?0ΠDa 5`6  +aR6^B0c{ 49 AјK;b# 9 a+r{k۠**++TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+p\ʂaP ..l.lJ0u\Ѕ e΍LnnJ +yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 0vxp6:0$t}7ISD ̳;¬ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J` J ʡʃ(B(!pǪ&88_yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ 4™ p6$φdXbِ4 C4CC<(&bm@!6 @bf Ce] pm 4ܸLY}AͥѥM +jPTbPXڰa cpzj +b &DA84ذ eA "' K `ЌA*zz" lXΠ 13 &!6,pā `cl(@ ɔUY&ĴA8;ذtA e` 16͆` 1h6 x{a>6\Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +hu\}yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 6|l, +n]VEMX1 |c,C u0 #`VB|,1!b +@>&1 cDŽ >`1@A0 3b 8#`p(g@ r( F 2S/1XgX F  ZW,Hc!{Tψ D0g @ w(A0SRA>$U3b` =B`K+C> cA" 1 13bp ?ó # `8>C)$2p0b H>C;ˆA  #$2ÈA  # $2A  # # `8܃>$2pp0b H=C;ˆA  # DXBC{Q58* 7y DT(P|̡SFI0ISG1SV_PositionNORMALTANGENTTEXCOORDOSG1th@h@h@SV_TargetPSV04",NORMALTANGENTTEXCOORDTEXCOORDPSMainDCCBCDDD000000wwILDB`n%DXILBC! e% #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Q2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??=htyzx( 38C8<->C=C9)=8;;C8ě)gY@BdV 1 rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y< 2L &GCJ +F +2("((($ʀ1i#A$`AF@hṟ8{BAyY L d! s# #sAcc4@ oM $Efe%&,f&gl&e@Č-noS[\[ Ȍfloat{ 0b4 A` E ,d  E 4d ( /E 6WH a6 + +N&Ap +  + +"LAWh+{1c{ cY.$`,b 00 ,I Ă(,X6 A)B.Ѐj +Ks#̡ͽՑqՙ}͕ͱ ^ UI}=UQAUQ1 c+#{ +{[/BkC)@M-kͭln-L.-m4 a`.J.mnm,k-n4 a`"aq I0B/ @9syC #+{Isc#+JszsAccK4{;33#6F消u@QW 0ۛ\"hF$]Y"hH<]ۛ"hJrTL"hLd`C0 `Jt0z C=l&j]T P@X./shaders/include\shader_global.hlsli@:TangentToWorld027:7962 179&  0:4<& ClVM>C?@"2:*!'AQPVOI[\P ]ݛP  ֆ 6 0&`BB$aHȤ}ՙ ~䀀Ȏ䀀Tՙc+#{cf6ǮlM-͌dg4j BL0aab" `1@*DlX%\b +r0 V %&E ` +@LI^ p̵ѡ-b YX MBEMp{k c[MEPi+ ccs+[MNEM sc+sBEM)kKK{s [MOEM P{[OEM +0*kKK{s+s;C[MXBEM ИC #{[XEM i +K c[MYE`6㭎-ͭl4g l e&l't'|,Ă,-&A"6Zl-VM@/IM pIsK +c+#{#}eaUUՙYؕѽimMŪ 腷^ D6init_materialL440206 *72#:329 & ɦb]E/]_"4477AO[WY[\ڛPVVU\ZّXYP֪ 腼Ћ^D.init_normal44/706 *72#:329 179& uiX5} h@'-kͭlnqF5FV67UU6VFv$VgfV&Dffa֢&6 0&BC4za,H褹}х~怀Ȏ䀀H̀VM@/iB[ P*s{#+:33+ }ՙ}ɅeU UI}=UQAUQUUՙimA-6 &RC5za7Xxɥѕ}ՙ~ʾ䀀~Ȏ䀀@ՙ-bz!z@ XM8+@ c3cW6F&ǃf"㳈5|#7 E а``0ڰ ($hC 015o,bfzazC7@ @6 !1 &7P 9Ʀ|ckF/ol"3:329A\יXYPVOPTZّXYPU\ZّXY7bjz!<ģX<P\Q[\]ZY4)029 /& -bool{  @ GiX5` zdʜh?encodeNormal@@YA?AV?$vector@M$01@@V?$vector@M$02@@@Z\MǪ p^;D O>DI\^FiFkGyG|ph#bFGGé-N. nj-g4H` "h `4H` ++f4!`1,bI @b1@ X$``1,F0_24 <`4H`"Kb$0XM&`1pY͈X$`2hb1@S"#  /E МH`6ff4)"`1pY͊X$`3 Џ !Aai´1P0t." @h`X!`@ d }M ՙXɥ5̐ m[<r&FF'9{c#k +K:+s+33+!i Kj"!ڶyb#7"d3@M-)N. t&F't$55VV&TgfV&4cCF'D3C3$m$GtDfݛUZ"0W?worldViewPos@GB_SceneBuffer@@3V?$vector@M$03@@B OxGGQᑣ*ã+!+{1c{ cY6+lda"0` @7 c+#{*!*ã+!!+{j" +ڶy&e"0dM- n&FU4cCBUGW'W&CdCbW6F&D3mLDhS[][[\U ৭.M ͭln.荪 hꇄ NLĮlMf(h䉚 06268292SamplerState `r0 (?albedoSampler@@3USamplerState@@A ONMظɵMQ ~ئ䀀fʀ-@ɜћj+ cz;Cs+ z +kc+#хI՝MTMMхѕm[<;7ؠȏIIɝzBBO ]U\ڛۆ$(՝$XͥmjO`C0慗7<34:$''&! 6634929227<34:4479%#* 6634929241:2902/249441:24::49441:27/<949441:2902370649441:23:32/24942<:2"06272<929:2<:2"7062<9292<:2"2063472<929:682)0206268299299682)02706829929682)02206346829929943723$) "#' !*#")22:32929130:<6;30:<7960:430:<700:430:7962;:::#:3347$7::4:47::::#:33:::::::477:66;830:47::477::::767042:6700:4<30:47::706<::::027:7042:67960:4<30:47::027:<=<::::279247::279::::2792<3::::27922:97:::22$) "#' !*#")22:32929130:<;30:7962;1:329$90200:32992930:4902$):1:22:329$902004902:329929::::#:3347$7::4:47::47:49$")$90$:::#:33:::79:47:49$2<4902$"<49$::::477:6:6;84902:3249$2.7960:430:47::477::::76:64902:3249$2.700:4<30:47::706<=<::::027:7042:64902:3249$2.7960:4<30:47::027:<=<::::279247::279::::2792<3::::27922:97:::2743$) "#*#"****47:::#:3347:06062706272<682062682947::27930632063472063472<68220634682947::27930027:7067062<68270682947::279<=330796)27067042027:7962027:7062:*!'47::7647::02730:127947::47*72#:329:6443:329:6440627:6:0624323$440206:6:) $$4477:6:9:02447:6:0:02206347927444/706:6:796)270447:49:6:3206347442069:6:2063472:97273:329:6:127 B'$902941:27/<9494 \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB\H]XQ]X^[  ݛYS\N[  ۛ\[[S\NH] H]NH]HR[]NH] Y][[NBNB\T^Q]X^H] H]N[YNBN!TDd5FV&7Ǖ6VGVu&VgfV&%6W6ǖF^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@D\D@ʦP@R@@@@@@zz@v@Ȏ@@@@f@ʆv@@@@f@v@@@@f@v@@@@@X@v@@@@f@v@@@@@v@@@@@v@@^^@@@@@@@@@Ⱦ޾v@@^^@@@@@@v@@@@@@@@@@@@@@@@@@@^^@@@@@@v@@@@f@܆v@@@@@ܾv@@@@@vv@Ȏ@@@@f@v@@@@@v@@@@f@v@@@@@v@@@@@^^@@@@@@@@@@@v@@@^^@@@@@@@@@@@ܾv@@^^@@@@@@@@@@@v@@@@@@@@@@@@@@@@@^^@@X@@@@@@@ܾv@@^^@@X@@@@@@@v@@@@@v@@@@@vv@Ȏ@@@@h@޾v@@@@h@ؾv@@@@d@بv@@^^@v^^@@d@ʜPf@R@@@@d@@z@P\R@T@PPZ\T`\jV`\jRRv@@@@@z@T`\jV`\jv@@@@@vf@ʜPd@R@@@@h@@z@hP\X`X`RThPdXdX`X`R@V@hPZbXZbXbXZbRv@@@@@@z@P\XZ\Rv@@@@\@z@v@@@@\@Tz@PRv@@@@@P\@T@d@V@fP`X`XZbRRv@Pf@R@@@@@PX@fP`\drrX@`\jpnX@`\bbhRRv@ʾ޾Pf@R@@@@@PPR@T@Pb@^@`\`hRR@T@`\r@V@`\bv@@^^@@@@@@@@X@@@Ȏ@־PȎ@R@@@@Ȏ@v@@@@@@z@\v@@@@@z@ʦP\R@~@\ܾ@t@v@@@@f@ؾ@z@fPʜP\\RX@P\X@b\`@^@bdnRRv@@@@@@z@\@T@Pb\@^@f\`Rv@@@@\ؾ@z@hPؾX@Rv@@@@\޾@z@hP\X@ʦP\R@~@\ܾ@T@Pb\`@^@R@t@\Rv@@@@^^@\޾@z@hPP\X@b^d\dRX@\Rv@@@@^^@\ب@z@PPTbjRTblVP\TbjRRTPb\`^djj\`Rv@@@@\ب@z@dPX@\Rv@@@@@v@֜ئPf@ؾX@@f@X@@@R@@@@@z@ʜPؾ\Rv@@@@@z@Pؾ\Rv@֎ئPȎ@X@@f@X@@@R@@@@֜ئP\ؾ\X@X@RvȎ@֎PȎ@R@@@@Ȏ@v@@@@\@z@P\ؾ\@T@f\Rv@@@@^^@@ب@z@\ب\TPdjj\`^bl\`Rv@@@@^^@@@z@PبRTPbl\`^bj\`Rv@@@@^^@@@z@PبRTPb\^bjRv@@@@@@z@\ب\v@@@@@@z@\ب\v@@@@\@z@\޾\v@@@@֎ئPX@\X@\Rv@@@@\ܾ@z@ʦP\R@~@@t@`v@@@@\@z@v@@@@\@z@`v@@@@\@z@ʦP\R@~@b@t@\޾\v@@@@\ܾ@z@ʦP\R@~@\޾\@T@@t@`v@@@@\@z@v@@@@^^@\ʆ@z@TPbZ\Rv@@@@^^@@`@z@`\`hv^^P`\blX`\`bX@Rv^^PPb\`@Z@ʒR^Pb\`@V@ʒRR@@v@@@@^^@\@z@PfP`X@`X@`RX@X@\Rv@@@@@vȎ@PȎ@R@@@@Ȏ@v@@@@\@z@\v@@@@\@z@\v@@@@\@z@b@Z@\v@@@@\@z@PbZhX@\@T@\Rv@@@@\@z@\v@@@@\@z@\v@@^^@@@d@@@T`\nj@@@@@@\܆@z@\ܾ@T@\v@@@@\ܾ@z@\ܾv@@@@\Ⱦ޾@z@ʾ޾P\Rv@@@@\ʆ@z@\@Z@\@T@\v@@^^TPbZR@@@@\@z@\v@@@@\@z@\ʆ@T@\v@@@@@`@z@`\`hv@@^^@V@P\@zz@@~@`\d@T@PbZ\R@t@`Rv^^P`\blX`\`bX@Rv^^PPb\`@Z@ʒR^Pb\`@V@ʒRR@@v@@@@`@z@P`X@`\`bX@\@T@\Rv@@@@`@Tz@Pb@Z@\Rv@@@@\@z@PfP`X@`X@`RX@\X@\Rv@@@@\@z@\v@@@@@v@P@Ȏ@R@@@@\@z@\@z@`v@@@@\@z@\@z@\@z@`v@@@@\ܾ@z@\ܾ@z@`v@@@@\@z@\@z@bv@@@@\@z@v@P@Ȏ@X@f@R@@@@\\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@f@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@R@@@@\@z@v@P@Ȏ@X@@ܾR@@@@\ܾ@z@ܾv@ܾP@Ȏ@X@@ܾR@@@@\ܾ@z@ܾv@@@@@h@޾@t@`v@@@@h@ؾ@t@bv@@@@h@ب@t@dvv@ʾPȎ@R@@@@@̞v@@@@̞\޾@z@\޾v@@@@̞\ؾ@z@\ؾv@@@@̞\ب@z@hP\بX`X`Rv@@@@@̞v@ʾPȎ@R@@@@@ʾP־PRRvF@ʾPXR@ʾPRf@ľPf@؜X@f@X@f@X@d@R@@@@^^@@@@@@@@@@@f@b@z@PRv@@@@f@d@z@PRv@@@@d@b@z@PRv@@@@d@d@z@PRv@@@@^^@@@@@@@@f@d@z@PX@dRv@@@@f@b@z@PbX@Rv@@@@f@@z@d@T@b\@V@b@T@d\v@@@@f@@z@d@T@b\@V@b@T@d\v@@@@^^@@@Z@@@@@@@z@PPPX@RX@PX@RRRv@@@@@fP؜\@T@@V@P؜\@T@R@T@@V@P؜\@T@R@T@Rv6R*D902941:2.090/249494`2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf$Et$UETdT4TDT$ՠ0BVfV$Et$UETdT4TDT$ӠРРР0f$Et$UTDԠ0BVfV"t$5uT梗wנ0BVfV"t$5uT梗נ0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠0fFVf"t$5uTԠ0BVfV"t$5uT֠0RFf֠Р0fFVf2DT$5T$4$#Ӡ0BVfV2DT$5T$4$#Ӡ0RFf֠Р0BVfVrUE$uTDӠ0BVfV2CS#cSc֠0BVfV2CS#cS֠Р0BVfVR5Ӡ0BVfVRDbF7Ҡ0BVfVRDbF7Ҡ0BVfVRDbF7ҠР0BVfV4%UdU$5U$D5Ӡ0BVfV2U$DU5T$$T4DӠ0BVfVBV'VBV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V&BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'V6BV'V6&WF5W&GWF%5VuW7נ0BVfVBV'VFBV'V6&WF5W&GWF%5VuW7נР0BVfVbWFf֠0BVfVbWF&f&Ӡ0BVfVbWF6f6Ӡ0BVfVbWFFfFӠР`F7bFbF"bF2Ҡנ"WFW'"2Ӡנ`FҖ6bFbF"bF2Ҡנ"WFW'ҖҖ"2Ӡנ0BVfVd$DנР`F7bF7Ҡנ"WFW'7梗Ӡנ`FGbFbF"bF2bFBҠנ"WFW'B"2Ӡנ`FҖFbFbF"bF2bFBҠנ"WFW'ҖҖBҖ"2ӠנР0BVfV%U44U'W66W֠0BVfV2%E5D2'G2FW'FWҠ0BVfVb5TE4DVbFGV3e4DӠ0BVfVBW'Ct&FRgBB2Vv$F625V&7GFWRgₗBBҠ0BVfVBW'CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7CFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%TFRg2VTfWƆ625V&7GFWRgₗRgrҠ0BVfVBW7T%T$'FRgF2VTfWƆ625V&7GFWRgₗwFҠ0BVfVBW'C'Rg2V625V&7GFWRgₗRgrҠ0BVfVBW'CRg2V625V&7GFWRgҠ0BVfVBW7CRg2V625V&7GFWRgҠ0BVfVBW7T%TRg2V625V&7GFWRgҠ0BVfVBWGW'WvFV&B7rFV&625V&7GFWB7Ҡ0BVfVBWWfTF7df6WFB7Ff6FF7B7Ff6Ҡ0BVfVBWGW'Wdf6WFB7f62V625V&7GFWB7f6Ҡ0BVfVBWGW'WFdf6WFB7Ff62VTfWƆ625V&7GFWB7Ff6ҠР0BVfV2%$ET$VbƖҠ0BVfVՠ0BVfVR$U&ՠ0BVfV"$4%&6ՠ0BVfVbDEUeFGWՠР0BVfVRE5E%U5DV2G'W7FVנ0BVfVBT4$UUT5UDT$T$ՠ0BVfV"UDU%UE5E%U5DVҠ0BVfVDUE5E%U5DVҠР0BVfVtU5U55$UT4ՠ0BVfVrTD55$UT4b76b76נ0fFVfBUUdTD5ETdTDԠ0BVfVBUUdTD5ETdTDӠР0BVfV2T4EUEU%U$CԠ0BVfV2T4EUEU%U$CU%B7Ӡ0BVfV2T4EUEU%U$C$%ՠ0BVfV2T4EUEU%U4CԠ0BVfV2T4%TedT$bVVҠ0BVfV2T4%TedT$U%B7Ӡ0BVfV2T45E%U5DU%UD%TedT$bVVҠ0BVfV2T45E%U5DU%UD%TedT$U%B7Ӡ0BVfV2T45EU4Ԡ`FGBWWfTF7&6WBUGW'W&CcFGF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F7BWWfTF7&6WBUGW'W&CcF7F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`F'BWWfTF7&6WBUGW'W&CcF'F'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FBWWfTF7&6WBUGW'W&CcFF'B7FFFbVFFVҠ2T4EUEU%U$CӠ"WFW'FF7B7FӠנ`FGBWWfTF7&6WBUGW'W&C$'cFGF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W&C$'cF7F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W&C$'cF'F7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W&C$'cFF7B7FFFbVFFVҠ2T4EUEU%U$C$%Ӡ"WFW'FFGB7FӠנ`FGBWWfTF7&6WBUGW'W6CcFGF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F7BWWfTF7&6WBUGW'W6CcF7F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`F'BWWfTF7&6WBUGW'W6CcF'F7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ`FBWWfTF7&6WBUGW'W6CcFF7B7FFFbVFFVҠ2T4EUEU%U4CӠ"WFW'FFGB7FӠנ0BVfVBWWfTF7B7FBWWfTF7&6WB7FeTŔTҠР`FGF&TgfV&'6W"TgfV&cFGFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F7F&TgfV&'6W"TgfV&cF7FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`F'F&TgfV&'6W"TgfV&cF'FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנ`FF&TgfV&'6W"TgfV&cFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"TgfV&SFFB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W2E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"u5E'W7FW'WF&TgfV&SFFB7FbVFFVҠ2T45E%U5DU%UD%TedT$bVVӠ"WFW'E7ֵӠנPFF&TgfV&'6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7ӠנPFF&TgfV&'6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FB7ӠנPF'F&TgfV&'#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F&B7ӠנPF7F&TgfV&7#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'F6B7ӠנPFGF&TgfV&G#6W"u%GWDF&W67'TgfV&FB7FbVFFVҠ2T4%TedT$bVVӠ"WFW'FFB7Ӡנ0BVfVF&TgfV&B7F&TgfV&'6WB7eTŔTҠ0BVfVF&TgfV&'B7F&TgfV&'#6WB7eTŔTҠ0BVfVF&TgfV&7B7F&TgfV&7#6WB7eTŔTrVFV52Ҡ0BVfVF&TgfV&GB7F&TgfV&G#6WB7eTŔTҠ`F2G&W&TgfV&'6W"u%GWDF&W67'TgfV&FB7RFbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WB7bVWӠנ`F2G&W&TgfV&'#6W"u%GWDF&W67'TgfV&FB7RF'bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W&B7bVWӠנ`F2G&W&TgfV&7#6W"u%GWDF&W67'TgfV&FB7RF7bVWFbVFFVҠ2T4%TedT$bVVӠ2E&W6B7bVWӠנ`F2G&W&TgfV&G#6W"u%GWDF&W67'TgfV&FB7RFGbVWFbVFFVҠ2T4%TedT$bVVӠ2E&WFB7bVWӠנ0BVfV2G&W&TgfV&B7bVW2G&W&TgfV&'6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&'B7bVW2G&W&TgfV&'#6WB7bVWeTŔTrVFV52Ҡ0BVfV2G&W&TgfV&7B7bVW2G&W&TgfV&7#6WB7bVWeTŔTҠ0BVfV2G&W&TgfV&GB7bVW2G&W&TgfV&G#6WB7bVWeTŔTҠ0BVfV2G'W7FW'WF&TgfV&DB7UF2T45E%U5DU%UD%TedT$U%B7B7ՠ0BVfV"VgfV&DB7UF2T4%TedT$U%B7B7ՠ0BVfVBWGW'W&CDB7F'2T4EUEU%U$CU%B7B7ՠ0RFf֠РPF2GW6fTF7&6WBUGW'W&CSF'F'B7FbVFFVҠҠ2T45EU4ĴӠ"WFW'E7rӠנ0BVfV2GW6fTF7B72GW6fTF7&6WB7eTŔTrVFV52ҠР0f2DT$5T$4$#Ӡ0BVfV2WV6F"2"2֠0BVfV&""֠0RFf֠Рf66fFW&f6bƖҠנ0fd%U44Ԡ"WFW'ҖbbSSCゖӠ0R6W֠"WFW'2WV6F6gFWBFbbƖ₇bf6Ӡ0RFf֠נР0RFfA8T5FV&7Ǖ6VGVƕVG6ǖƹ^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`vv@@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@欌@@@@h@@t@v@@@@h@@t@v@@@@d@@t@v@@@@@ʒ@t@bvv@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`v@@@@h@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@v@@@@f@Ƞ@t@bv@@@@h@@t@vv@贠@@@@f@@t@vv@贠@@@@f@@t@v@@@@h@ʮ@t@v@@@@h@ʒ@t@vv@莄@@@@h@@t@v@@@@f@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@d@t@bvv@贠@@@@h@@t@v@@@@@h@@t@`vv@@@@@h@@t@v@@@@d@@@@@@t@`vv6*,902941:29023706494{2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠР0fFVf2DT$u$4Ԡ0BVfV2DT$u$4ӠР06VGV"&Gv&WEVfV66ǖ&ҠР`Fv'bF'WFW'נ`FvGbF'WFW'v'נ`FvbF'WFW'vGנ`F'v'eW6&bF''WFW'נ`F7v'eW66bF7'WFW'נ`FGv'eW6FbFG'WFW'נР`F'v'bF''WFW'נ`F7v'bF7'WFW'נ`FGv'bFG'WFW'נ`FGvGbFG'WFW'v'נ`FGvbFG'WFW'vGנ`FGvcbFG'WFW'vנ`FvWbFgFbbc"WFW'bנРfv'f'WFW'נfvGf'WFW'v'נfvWffFFF"WFW'FנР`F2WFvbFbF"WFW'v&6c’נР`F7BvVFGv&FbF7bbF77B%Ҡנ"WFW'VdžB%bӠנР`F77rTFG%bF7ҠנbF77B%ӠРbF7B2&67RDӠBV&2&67RDB2GWR5BFBBӠB&ƖWBӠР26GbF7"&ƖW2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F77rTFG%bF7bF7BҠנB&ƖWBBFB┲Ӡ26GbF7"2&67BӠР"WFW'bF77BDTssB&VGB6B'66W"Wf6F&נbF7B"䂗ҠbF7B"䒗ҠbF7B"䢗ӠנР`F–V&WbF"vGTGbF'BV6FVEVGҠנ"WFW'"7BV6FVEVGBV6FVEVG"vGTGӠנР0RFfAhW9p9Aɽѽqͅq͍ ͕qppqɕqձqɕqՑqq͡q͡}͹ѭ7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""42807929227:292292:242:942922<902964277072$)15242*/*'*242"'* /!$"242* "'/$"242$) /$"242"#!' /$"242"#!' $*'*242 $'$/'*'*242) $/' &242) $$"242 ''242#' /*#"/("$,#242)/*#"/("$,)4323189877<15242)*$$&(&242)*$$,)*$$&(&92:902/24792<899:69:4/;#706:329(24<)*$$,#' /*#"/("$792<899:69:4/;96:329(24<)*$$,)/*#"/("$474276#706:3299:69:4/;:3292:97:32929094:4#706:329(2447427696:3299:69:4/;:3292:97:32929094:496:329(24221898$)77<15242' /824<824242' *824<' /824<242#' !*#")1:329' *#' /*#"/("$,242)!*#")1:329' *)/*#"/("$,27431898  +$ l +-EZh}|Ph!Вg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ ­J̊슮JʯLiLp Bm…\(Mj`.".1 bmE]6$.`".. .! t9q pqY I-K-K-˺lإ]ePaxiqp`."'.".NĥE\ C˼l e .! CýL@ 6e m..mdD!q&Ia}~ h8=I51Mf\0 K LKL +r:*rڰ ȄKȔ "') B% R_@_F&\F& @Fe6a a ~ 6!c2(2-d*Ln, AlXefd_ddf.//02 .. #3Zذ Ȅ˿̆afhf6 .s3vg`WG7.B$tFHzu'@ @O # 0XG=`z4P[][[\۸|J027:70q "P6+#`: PT DJBma@`4.B$fݸx} R t&F66V&6.@$Fx:  :6q "P7,# pXG=@OLnȀ: P #0 : pgbuffer DCtz"z` !VFV67$G%6V7V67.@# `gpӄ0b 0mpg@M# `AjՄ0b 8bj`M# `3jׄ0b  +AD3D*A># ``҄0b L wYA (p5a A +?th?0a$ +ro`Մ0b (`Ä0b J(AX çYA (@r5a AA +?Zf?L# `B́6a AQ +?[k?L#`P;aZ CÄ0b E)l?0a AQ +?[g?L#`P:aY D`1 r<A@0hL 0a<Ad +04tӌ +^>#`P;fZ3+,& +^>#`7ANSUy_5c@hBL B0a& „`&`!8L6t0l3c@-`g! 3a AQ ?A\p?0b E-q?0a AQ ?A\n?L#`P?q\3AI͈ CÄ0b E-l?0a AQ ?AZp?sی AQ ?AZo?L#`PԂ>q[ LPVEMR4c@Ulc% $J> |& ӆuPۘ6g0mτ0b . uیA sLV03aX1g1@"B1 @ JmF & A0(>A O>3X%66x0L3a0L&0 )L|& L#`PCKCi3D܌ A,?_?L#`PJh1|f 0`@"nF `>@`1@@ `0gτ0b 9 l +lA|& A0a/0F `SRp/0F `zQ8 |F zU& L&0F ff W`1@fb0F f& A0(YAb|F fa& A0(Y `@ {aFa1@@v0F fa& A0(Y `@ {aFa1@0F fa& A0(aY! `@ {aFa]h  A2?i?P0b >@ w?0c@G A5?]?L#`PMpn 0-Ä0b >@ w?0a A?]}?L#`P^pC^ -Ä0b >@ w?0a A?\?G A5?B\?vŇ A4?B\?L#`PLClA d +03D:#`P+! |,83c@Ać)0F ‡Zf < PA0(]!PA0(] TόQ||f <P yć +1 ձ όac!"P#^>3DH:&|& A0(Lq!PA0(Lq `@ .f YH(A0(Nµqb(A0(Nbq(A0(NbqB6L`ik3>،63733˼UUI7=ch͏`h +XbpXy"%y"2 +XbpZ'⚨v>eu(hI`~ ` c XV2$i럈k"'bg!_g!"ˡ'b%"STAT$` DXIL BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L M2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b b 0 Ua#Ad  #Lm00n@ PPr@ +|`0`@~~z P( fq`pypZ(|zrR{(qw>0vxp6:0$t}7ISD ̳;¬ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J`$ʠ +8>ȃ5`X?0ΠDa 5`6  +aR6^B0c{ 49 AјK;b# 9 a+r{k۠**++TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+p\ʂaP ..l.lJ0u\Ѕ e΍LnnJ +yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 0vxp6:0$t}7ISD ̳;¬ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J` J ʡʃ(B(!pǪ&88yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ 4™ p6$φdXbِ4 C4CC<(&bm@!6 @bf Ce] pm 4ܸLY}AͥѥM +jPTbPXڰa cpzj +b &DA84ذ eA "' K `ЌA*zz" lXΠ 13 &!6,pā `cl(@ ɔUY&ĴA8;ذtA e` 16͆` 1h6 x{a>6\Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +hu\}yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 1mψ <0 B0b` ,A`E +X1O>6x1!` +@>&1 cJDŽ >`1@A0| 3b 8#`pC(g@ q F "Rp/1X'T F  JV,Hc!+6ψA T 0#`C,|,8cg@ "yT|,c +ǂD>1c,g@ &}F ^{PP1Hxa@a @ {tA0@F ^{Pa @ {qF ^{H` @ {vA0@F ^{Z1Hxa!la @ yvDXBC-PZ?27 DT`SFI0ISG1POSITIONNORMALTEXCOORDTANGENTBLENDWEIGHTBLENDINDICESOSG1 SV_PositionNORMALTEXCOORDTANGENTPSV04S \POSITIONNORMALTEXCOORDTANGENTBLENDWEIGHTBLENDINDICESNORMALTEXCOORDTANGENTVSMainC +CBD"D.DD;CBBKCppppppppppppppILDB`o(DXILBC! f( #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 02" d##ㄡL L@ +@@ 3s`0G@$AH) HS A rq@.B*VbFq% ?a!! b!t@l ($7@I%`wH`5UD)L da8rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C <d2L &GCJJB("(( (( (R$Fʠ +F( qƱ4yxD@@A9GGyLFj.̍,Lkn-ͭmm=271 30:Bvector X12@ E h 0 1@h%``0 1@h%`0 1@h%`0q element@Jؔ}չqHscdPdVp@Ya&A`h @,bfloat3xX@f|1@shP 0Y4( `4el &3`0$: X'Pa3VSMainDͥѥ-bF 6hɵ-b $]ۛ 30:Bvector94 E ,A`A9 ʹʢ T @ Xh7>Ptangent!30@AL)  +@ xX%zKK{s[ .841@ + f`7\PTangent! $DЛ[UY"hLApa 0"VF6V6Ǣ.͍]ݛO\ڙ[H :32247=@`p,bЀX E ,+,bЀX `4 +`0VpWe AI `,b+4hX *.HDaJlaL~ $R`A\4@.L`hk @ lx0:4<30:_11 L"0W"hA0H `8|,b30 W "hA0H a8|,b30 $×"hA0H b8|,b30 4× "hA0H c8|,b30 D׌"hA0H d8|,b30 T "hA0H e8|,b30 d"hA0H f8|,b30 t "hA0H g6@0p0pLu1{c{sVp0ֵaD$&A $AБX[PYЌI[\P ж` _@ NЛ[\ۜٛ\ܚ `C 8 0`QɅ͙ɵ }M ՙD Yɥ5̐ m[P Π%X 9ɵQɅ͙ɵ~ب怎ʄ䀀f~HH`fH`f-[DLh@LިQɕؕѽ񘱽ѱ,I$hB, n&VFFU4cCBUGW'W&CdCbW6F&D3mb&pBnۛ\[U M- hꇄ NLĮlMf(hN2063472c=c=Vc>`=UQ!6,b`qbEȉ(j\1Џ ˕qz19%9% MMe.SV_PositionhոXذ|z|F{zdžC=փ=c5փ>6,b`1b)0ȉ]@ E\ݸ^Pa p!@O#0XG=*`z4`x: pu ' @O`z `: 0u' @O #0XG=:`z|`(̭A͍K0`u0A 1`3VF&6.@D3:skinnedTangentDxL80 ެ" +iDDM:`V@Ŭ"` +&boneIndex$1&,b3`\H`qM;hfxx u"A: p.llvm.dbg.cuShfFVVbv67EhfFVF7%Jdx.source.contentsS + hD2V'7VBVfV67%j̽ɍ9M [XKܔ 5ؕͥM X ]]ܔ5̡5M b \[Xܔ6*хѥMģ<إ%MхѕM ΣK\[ܔEyU3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; avvpvxwC P0܀ʡa>8C9:8q &` l;/TQQCIm[4\BDͰV }0A8`p  +C&(L9 s0A@`ᰃ q&GLR 0A8apᐇ ±%&GKL 81A8rbp؉ '&GXL c1A8|bp !c6&mLژ 1A8cp "CD&LjL %2A8LdpX "D&L {2A8dp ¡+cW&Lt 2A8eph .]&ǼLz 2A8epᐗ A6l&L 3A8Hgpᐝ 1;v&GLݙ 3A8jgpḝ ;w&GLߙ 3A8gp QBÄ& M +4A8X# `P# `hc-# `ld@0# `Ape5# `ȁtf9# `pψA (ul4b A$rnjI# `4b pÌ/# `0Ԉ {@&A (zp`P A$?ds?0a$rn0ֈ }@FA (|0q5b Ä0b JAA`#`Pp?L# `AADو @CwA (`s e A +$?xx?0a$ +w0sۈ @×A (t@7b (z?0a$" +yPu݈ @CÄ0b ){?0a AA +"?n?L#`PBaC CÄ0b ){?0a AA +?j?L#`PBaC CpÄ0b ){?0a AA +)?u?L#`Pa pC0Ä0b ){?0a AA +%?q?L#`Pa pC@Ì /#`P˜a30 AA +c?d?q0b )e?0c@  CÄ0b )e?0a AA +>?Au?L#`Pa38i AA +>?r?q0b )??0a AA +>?h?L#`Pa30 AA +>?Aq?L#`Pa @C@ÌaT SG3\s2B0c@A&@Qyp3DL#`p\0hL 0a&ÄPG0bp )AL 0a&00h1LՈL#`pA0a&0 h L 0ad +0a5 t0hL 0a&Ä`V'"NA0pa.0F  >``΄`Yg1@ +`1@@ `@΄`\g1@ F*`1@,HA*`΄`_g1@NAK`1@PJ`΄`Mgƀ8=τ`g03a A!i?¬?o0b < +?0a A!g?¬?L#`Pȃ0ø@*y@' \ +L 0a&00@Ɂ+0bp <*hBL B0a& „Pw 0au +0hL 0aX3 +1 1@l|!`1@~`3a AᰘB0a ApB0aX +0F  rhR!0F  rHR!0z0tXa 0lL#`Pþ30 A??L#`PC-gƀ;`@ PP`1@ %ah!0nA> d*p 0b JCB0aX*|& A0ZHA `@ 2?Ѕ`#3c@ `8ga3a A?'?q0b EN`?0a A??LŒ - T0PqB@a   Tf0PqA@"@A& TT"@A* A1?1?o0b X$?0a A1?'?L#`PE A cH0ÌAN#`P C3D0 A1?0?L#`P  cHÌ /#`P  cqHpÄ0b X?0c@&pC<wp 00qM%8q3DL#`pEHC0a&0 h L 0aA0ae'0hL 0a&ÄPMX0bp [HhBL B0a& „0@ @Me \r1(L 0a&00h1Lf|f <:F  !0F  Ë`!0,83aX0F  @"0F  ㋟x@"0,P3aG0F  H"0F  H"0,h3a؇0F   P"0F  #P"0,3aXs1 0'3aؑ0 LF|f <03a0L#`Pra30 AQ?ȅ?L#`PԆraC Q\`ÄPq0c@A 0bp ląYhBL B0a& „Pv0aUv0hL 0aL#`p^E0a&0 h L֘|f =:F  H"0F  ("0I L#`i,iL#`GiiL|& A04& A05& ;B>3V|& B> B6:lL6|& A0(C؀!^F `& A0(؀ XA/3c@ 0b Y{)E0a A! +zL +}! `@ 2T`1@,>h"0 @C> da0b }܆)F0aa1 43a؀0l{ `/g3a A!">?F?q0b ?0a A!"!3 & 4τ0b *I0a A+b +iLv|f =:xL6|& ~>3pt 0lL#`Pb +0c@  ".L#`PKb +0a3$t TP1PqC!@!l8A TlP1PqA!@lU1PqPlU1b E +030 AQ/?Ȋ-Ä0b E +  r؂9L#`PK ++ŒAN#`Pԋ 0c@  R8L#`P  0a AQ/?Ȋ,Ì /#`Pԋ" 0a AQ/?Ȋ,„0b EȁB-v@ 0*B3\s2H0c@A&@܌v@'@ \2+L 0a&00h1Lu L#`pKJ0a&0 h L 0aT3/0a/B+0hL 0a&ÄPӽ0bp ɔhBL B0a& „0@ Y""NA0R]"W & A0T]W & LɊ|& A0Z^(Y & A0\&^Y & Lي|& A0b^.[ & A0d^$[ & L|& A0j_4] & A0l&_*] & L֜|f <:LALv|& #E>x"0:LF|& #> g#$51c@  g$41a Aq6`@2( g JĄPq/0c@A 0bp ، hBL B0a& „Pv020au6(/0hL 0a L#`pMˈL0a&0 h L|f =:F  I%0F  )%0L#`͍,L#`L|& A0&g & A0Fg & ;NF>3V|& RF> B6:lL6|& A0(JF,bƀA0(JgF,b1@t@l"-& cόv@' d#620b 茍(L0a+|& A0DlRe `@ 1Rx`0XL#`ڬ d6 3`gƀ:τ`g3c@G' _τ0b Bܼhq0b BܼEhL#`PЎ)[ń0K| 0Pq!@!l8a TpȆ1Pq!@la T!@Aa T!ƈ  +{1c@   +{1a A;7{!  +{1c@   +{1a A;7!  +{1a A;7y3D0 A;7y c +{1a A;7u38i;y63c@ hBL B0a& „0@  \7sc;hBL B0a& „0@  \3:x;hBL B0a& „0@  \:}#>hBL B0a& „0@ M|f ?x1@}^ `@ & A0'v/0L#`HbL#`8bL#`O(bL|& A0v*3& A0w"3& A0'w3& @> d; d; d; "1c@  "1a A!B;a "d1a A!B;A "1a,?ijh0c@B  Hs;`g0 3a0F 8!u ٸ ^F 8t ٰ `@ B 0F !a5P6X51 D`@ ` 3a0lpL#`P;nȌ/#`P:nȄ0b  CmL# `P5c@ A 8)T??3M# `P3a$B?#?˄0b N + A 8)T??sL# `Pď1a$BB3?3a$BB;3a$BB3?Ä0b N +OA 8)T?!?L8c@B @8k!O ao~Mp;mо}:p4mй;nйwoй4nйvmй׼nйymйߵny|oy9nyuoкwnк4mкznк7mzmz:ozm;o|mp~MpH{mԾ}:pHtm{n8mtn׶mn۹mn:=m:yn:6m׷ntmۺnwmԺ4nԺzoԺ7n{oԼmq~Mp׻mؾ}&:pߴm9׻n9xm9ߴn9m9B[%)HD `I +4p:,~#_! +X4 1N_Hum MC 1>R%)HD `I +4p:,~#_% +X4 1N_۵m MC 1>b%)HD ۦ0I +4Đ:_xm MC #оM.0I +4Đ:_{m MC #}0I +4Đ:_H׸m MC #ԾM.0I +4Đ:_Hۻm MC #}0I +4Đ:_m MC #ؾM.0I +4Đ:_m MC #}0I +4Đ:_8n MC #ܾM.0I +4Đ:_;n MC #}pI +4A4_8o MC -D3о]6/pI +4A4_;o MC -D3&pI +4A4_Hxo MC -D3Ծ]F/pI +4A4_H{o MC -D36pI +4A4_9m MC -D3ؾ]V/pI +4A4_8C9:8q #` l;/TQQCIm4\BDͰF 8C9:8q #` l;/TQQCIm4\BDͰF v|Td0 +hB&h  +hB&h  +hB&h X3 +1@|!`@ zb{LA>#`PC8, ApB`Q*g@ *} &A0TXa c@ 1@ +$h!1@*$ah!S A5 + AEX*|F 2 x ]F :x]X!a3K T 0P1B`@` n- T f0P1A@`x0P1Py0@ #`0EKD0 B00 PSX Lk1(&h& h11@ +.t"`@  X1@.|`@ $ G1@ +/"`@  $ ؇1@/BC`@ 8 +% Xs1'cGNx#>F|TqahB&h vhB&h 4{hB&h Xc1@6B#1`@ *,{B>#`Pi,i AqE`[g@ 8-A0|5 X!/c,džY cψ T TB_g@ T`@ * R`43b {*F0b U{܆)F`iNJӐ !~>6|l8 ! T 0Ȇ0P1 @ l ! T l0Ȇ0P1 @@ ! T @@ ! 7Fy,Caq$"hB&h &C#`0|G0 B00 P͉ L.b&h& h1Ԥ"0bp G| 0  0@ f|F ʑ#1@JGH):|F #1@GPI:Ƶ|F  +#1@JLXDj:Ň|F *#1@L`:|L"1BDc<x#>6#`0ɉH0 B00e:#`0ɏH0 B00>#`0 H0 B00ּ|F 5I^$1@*T֤xψ T&#`P2XT#1@Tऩ`@ SF;~D>V|l0 ac,XaL3b ի)I0b (I``&1@JV$$1@jV$0XH AU+ +i Ae+b +i&Mcdž_ ~>@ l8A T P1P1C!@lA T lP1P1PlU1P1Pl *d0p Aʯ\#`0ˬJ0 B00 PǸ L+&h& h1T/0bp ӽ + 0  0@ 5 /+hB&h &Y"A0D]"W F va\%e"A0L^(Y F :xyd%@q"A0T^.[ F Zzl%}"A0\_4] F z|t%5"SE>v|P1c6|l0 1V` A7bs +, A7c# +,+|F ڛI F ! dF>#`P ڬ#`PMژv،|؀3c/dž_,2P1!@ l8a T pȆ1P1!@la T !@@a T !ƈ L7n: 0  0@ #`0َ&h& h1;73 B00 0bp NhB&h &M|F *y`@ * F :9,1ψ T3;#`P8b A>A`g@ A0w"3F zi 0N 3b U T;#`PO@j,s?ijh0b` N`6 l A0`w` Ԁ @ F  ,p 3b \# `4b <# `2b  # `1b # `$"BS?;3b  # `0b DXBC +vξA$ DTD,HSFI0ISG1SV_PositionNORMALTEXCOORDTANGENTOSG1th@h@h@SV_TargetPSV04 NORMALTEXCOORDTANGENTPSMainDCBCDDD000000ILDB`'$DXILBC! $ #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L P2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??=htyzx( 38C8<->C=C9)=8;;C8ě)gY@BdF rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y< 2L &GCJ +)B((b(r(JJ +a1Aq2NJ8:GyL d! s# #[Kss+#sAcc4@ oM $Efe%&,f&gl&e@Č-noS[\[ Ȍfloat{ 0b4 f+Ff4 fpYM#$`0db1@b` 8 /E DA`Kff4 fpYM%$`1fd1@s b` x E dA`"!Q( x-.a"v5VF!͍n`PLfZadk΍nZAl:1 I lP" +A 3h+{1c{ ca5Ѐ0`-b 4 "h@@:H @a6 ko̍k΍nZAAl:9Bh0"@@half4|xX@h|H120b4j )0a H! `1@B0[Mh@ +y`Ѓ=?X6\LgZAA(l@A&ApH,; [ !17930:E Ш600E и,b4p ` + +ADa +@+2 Wh+{1c{ cYh 0a p!0 ,LgZAA-l:[B,h@ p "`A@ A)B.Ѐj +Ks#̡ͽՑqՙ}͕ͱ ^ UI}=UQAUQ1 c+#{ +{[/BkC)@M-kͭln-L.-m4 a`.J.mnm,k-n4 a`"aq I0B/ @9{#6F消txxhɵ-bF+$]ۛ"hA!@ xЅ-b,L`0 s(0x C܃@"2:*!'AQPVOI[\P ]ݛP  ֆ 6 &a@Ȥ}ՙ ~䀀Ȏ䀀Tՙc+#{cf6ǮlM-͌dg4j BK0a!Z" `1@B*DlP"%Tb +r0 R `%%E ` +@K)^p p̵ѡ-b XX LBEL,bFzA ʢ @х-b&z "& ɅͱՍ-b&z "& @ؔͥ}-b'z "& (-bF'z "& @ͥ}ɕѡ-b'z! "& h̡-b'zA "& @ѕɥ-b,za "0VGǖV6( t`215q9=a1 `"^|`@Y,6 p&Db$z&p}~ހȎ䀀~HH̀H`d6 YĦbZE/D[X"447AO[WPVVU\ZّXY Zֆ04@\^x  @F&F;IsKr{k c +ªr [+#;33+!+{j"0fQU tQwi|?init_smoothness@@YAXUUnpackedGbuffer@@$halff@@Z&B/za,褹}х~怀Ȏ䀀H̀VM@/E_B[ P*s{#+:33+ }ՙ}ɅeU UI}=UQAUQUUՙim̡,6 &4za7Dxɥѕ}ՙ~ʾ䀀~Ȏ䀀@ՙ-bz!f@ XM8+@ c3cW6F&ǃf"㳈5|5 E а``0` ($TC 01o,bfzaf6@ @6 1 &7P 9ƦhciF/Fml"3:329A\יXYPVOPTZّXYPU\ZّXYa6bjz6pXA7P\Q[\]ZY4)029 /& -bool{ | @ FiX5 Fxdʜh?encodeNormal@@YA?AV?$vector@M$01@@V?$vector@M$02@@@Z\MǪ ^;D N=CH[^_mx;8Nmatrix930 E ,H`F0I @a8|,b=30 `4`&,b&D0E LH`Kf4!$`130 D`4`&,b&D0P_34 L$0ED0_42 L$0E3D0_44 L$0{{G|}ԇ}G~GGL+8 †zf  "P""0?vp@GB_SceneBuffer@@3V?$matrix@M$03$03@@BME38 >BonesTransformsk$ LD@Xy#V6G%6g&6t$55VV&TgfV&4%dCF'D3C3$mDE\D8`%V6&F%6g&6?zs+szk c s3{k:+s+33+!i Kj"!ڶl#1"A0 c+#{*#GUGW'W&CcW6F&cFBl8W$hD,n&VFFU4cCBUGW'W&CdCbW6F&D3mdFpDnۛ\[U M- hꇄ NLĮlMf(h2063472s^@B +=Ȧʜ%CP0A80!W6WF7.@Fu 'p : p ±#0XG=6`L̬Ln\nM/BY@=6%F+0p!rs vPвppáml\yM/l^gbuf Dv#ozf%@FlFto083{!b} aͮͅLenJ&\\m&V\pb eNne͍̍nnJ!'u'{'\\-2<:24742)!s{+s ;2<27)8!s c+2<90272)A!s+{+%2<< 7707)A!sK+K" +2<27:<47)AyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq '` @; a~qۦ <D@3,!8;?8mptm4\ bP_ܶ@;/̳~q6P <49RCM~qۖ 0A8@ap  +c&)LR 80A8bapᘅ &/Lq 0A8apᨇ ±&>LT  1A8Fbp0 q# `ੁAH3*x$Ve0M# `ÕAPA xm|hՄ0b 8`h`M# `hׄ0b  +AD3)A=#`PA?^w?L# `A`҄0b pÄ0b L |]A ({nc@M# `AlՄ0b JAX C^A (~ p5a A +?_y?L# `6a A +$?_~?L#`PHaC_  CÄ0b E(?0a A +?_x?L#`PBHa^ CÄ0b E(?0a<AAdό +T= 0a&00 CÌ +K=#`P?e^ CpÄ0b (hғ TuM3*x Aa +?]u?03*x&00 DUR\WA\3*p&0 h L6t1 Vτ`' 0ό +P b 1τ0b ,0?0c@S `Ä0b ,0?0a A1 6?́_?s !3#`PBMsi @PÄ0b ,0{?0c@83b ,0{?0a A1 /?^?L# `0hVQӌQWH|f :,L6X03c@A8c !> L B0c@A83b` -A0aXgBτ` `@ _Taƀ1 1@dd0F @& @>3X!36|& Lf|& +@> A|& C@>)g  > *ÌaRḦ *Ä0b : +?0a A??j?`3b : +?0a A=?j?L`1 1@- `@ 6q6 M> l +L#`(Ly0F `;R@`1@ L`1XJ f V10X!0,H3apg1@1 Z`@ zj@a1@0F jAf X1@h`0F jA& A0(Z `@ zxda1@^0F jA& A0(꡵Z! `@ zxdXa78AP0b =p ?0c@BU P-Ä0b =p ?0a Aqc?m?L pĠA0(A\!zF p& A0(A\`!`7f@ +|0Xa1@0F p& A0(!\` `@ +|Xa1@0F p& A0(\` `@ +|Xpa1@1 ^A 1@1 ;1@0F p& A0a + f <ΣnF Y& SRA>3D+|Xgƀ68U3aAx@Q7#`PY|3,Q7#`PCYC|-  xQ7 1 93c@AtucA"<C>3D8Q7F|f <ΣnLL#`P[~3,Q7#`PZC~ \ 1O. +7#`PDx}3,(7#`PD[C3+L7#`P[ '9Ä0b Ip?0a Aqm?k!?7#`P[ '9Ä0b Ip?0a Aq?k?0܌ Aq?k?L#`PhC~ '!9Ä0b Ip?0c@ߌ Aq?k?L#`PhC~ '!9Ä0b Ip?0c@e|3b Ip?0a Aq?j?L#`P\xA 0%pP +A 0%p@ +A 0%p0 +A 0%pM#`PD[C3mm͈ '9Ä0b Ip?0a Aq?j?L# `8=0a$SP„0b LI>?A 0%p '9Ìqg`|3b Ip?0a Aq?j#?L#`PDxA 0%pA 0%pA 0%pA 0%pPk$R)s{#+:33+  + :22*zr [+#;33+r)K3Gh*|o*|u*|{*|m+|s+|y (|i (|m+ (|q{|6G7GzGj6GjGj[7GjG6€G6ÀG;7Gl*|Įs*|Įy*|Ķk*|Ķq+|Ķw#>L`i[3>Ԍ63733˸UUI7=cha0?r*` aYYl(` i럈k"bա!$IsXy"%y"2!&`Y8B4%" j`~ `j&*"~{STAT`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L M2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b b 0 Ua#Ad  #Lm00n@ PPr@ +|`0`@~~z P( fq`pypZ(|zrR{(qw>0vxp6:0$t}7ISD ̳;Œ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J`$ʠʣJ8 +(B(!pNJ8yLFD oM $Efe%&,f&gl&eCLe@,  l $M썪 o@4 ͆Pa&FU!p8хI՝QmHE"! M1؄Mm@"ظɵMm@ +#xхI՝Mm@J#6 Wm (&0߷! a Ѐj +Ks2e6F6A( Bqm BMlBA4&6A m6,C h0A*zz" lX985H7܀Y:AtTDay;85H7 6l upL&6A ȃ3Ѓ4XA 5 a `Pa `ClX<8=5ԀY>0†DPxe0 +@Ì-nn@H,&Dc.싍l@P4ξ&DE MmR +p + + + +oPͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJU"s˃+ rs{ K{sA2<$)0)!s)s˃zKsB2<:72)A+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 0vxp6:0$t}7ISD ̳;Œ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !O@C <d2L &GC"J` J ʡ<(2("(gHqa88yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ 2™ p6$φdXbِ4 C4CC<(&bm@!6 @bf Ce] lm 4ܸLY}AͥѥMiPPbPTڰa cpzj +b &DA84ذ eA"') Yo 3hƀ xP99QmX 13 6dmL&6A O` 1 ƀ6ÆeO` 1ƀ6͆O` 1hƀ6 upya=6\Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +hu\{yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq $` @; a~qۖ <D@3,8;?8mptm[4\ bP_ܶ @;/̳~q&P <49RCM~qۆ 6X1oyC|3b - AD xX +A>V cDŽ >f|(ǐ3)g g@ _ F P`,0gψ \ + 5[`'A0ʡ/1@L``@ uh"10h^! | R>#`8 +pA0 + F  [LIXV!ψ D -  X0X|,0c,Zψ L`.$20b H>:ˆA  #0 +# `D8>C4b H>; # `D8>0b H>;# `D8>C.$2p0b H=:ˆA  # # `D8܃>C. DXBC + ^[\mf(m DT0PlSFI0ISG1POSITIONNORMALTEXCOORDTANGENTOSG1 SV_PositionNORMALTEXCOORDTANGENTCOLORPSV04I  PPOSITIONNORMALTEXCOORDTANGENTNORMALTEXCOORDTANGENTTEXCOORDCOLORVSMainC +CBDD"C)B2C:CCDppppppILDBh`Z.DXILPBC! Q. #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L 02" d##ㄡL L@ +@@ 3s`0G@$AH) HrS98rp AG ?a!F+1m#8{˟h@T Jq q5GBHF $.;iZ̡&~V buG-8F#0%rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q``!@C @2L &GCB + F + +t@ʡ$ +0 +p X12@ E h 0 1@b%``0 1@b%`0 1@b%`0q element@Jؔ}չqHscdP$Vp@Ya&A`b @,b Fj),͍ZYK[YW[ [ڠJVsOutputLitForwardD1@` 76float3xX@f|1@sg 0Y3h `4pml `( +(K 6L 3pH``Xd "hkQpp"texCoord4dٕѽ񘱽ѱ,b 0`1@g  a`, +(6LA3P`Xq "hsQPtangent F  ܽɱA-b>870`1&P`6 $S'0Qb5WGǔF0Upphɵ-bn`4py[ $D`Q + +0 &R40U *l&jԠ` 6;8"float4x4xX@hX@h|8|,bO0`8|,bO00_13Ӈ W "htA!0%^>}H @b8|,bO0_23Ӈ 4× "hA!05r>}H @d8|,bO00_33AӇ T "hA!0Ev>}H @f8|,bO0_43Ӈ t "hA!0-./89:;<0{{sVpPdk΍nZ=X׆a|,=@>Xf Hkj̭L̬Lhꇤ-N. ffHhE,7960:4 >@6-1  0\QXPɕYؕѽ5m[X `&FUG7q{k c*!*ã+!!+{j" +ڶd!3! + +float3 diffuseLambert( float3 diffuseColor ) +{ + return diffuseColor;//division by PI omitted intentionally, lightColor is divided by Pi +} + +//linearRoughness - perceptual linear roughness +float3 diffuseBurley( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + float FD90 = 0.5 + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return diffuseColor * ( FdV * FdL );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//from moving FrostBite to PBR, energy conservative burley diffuse +float diffuseBurleyFixedFresnel( float linearRoughness, float NoV, float NoL, float VoH ) +{ + float energyBias = 0.5; + float energyFactor = (0.45f * linearRoughness - 0.475f) * linearRoughness + 1.0f; + float FD90 = energyBias + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return ( FdV * FdL * energyFactor);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float3 diffuseBurleyFixed( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + return diffuseColor * diffuseBurleyFixedFresnel( linearRoughness, NoV, NoL, VoH);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float diffuseChanFresnel( float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + // Since we use CoD fitting, need to invert/convert our roughness parametrization to + // their glossiness parametrization 'g' + float ggx_alpha = linear_roughness*linear_roughness; + float a2 = ggx_alpha*ggx_alpha; + float g = saturate( (1.0 / 18.0) * log2( 2 / a2 - 1 ) ); + + float f0 = VoH + pow5(1 - VoH); + // This factor tunes the enery boost at grazing angle for low roughness material. + // It creates energy ring at grazing angle for smooth dieletric material + // The higher the value 'rimScale' is, the lower the energy boost will be + // The default value from Chan is 0.75. + // Setting the value to 1.0 get rid off this energy boost. + const float rimScale = 0.75f; + float f1 = (1.0 - rimScale * pow5(1.0 - NoL)) * (1.0 - rimScale * pow5(1.0 - NoV)); + + // Rough (f0) to smooth f1 response interpolation + float fd = lerp( f0, f1, saturate( 2.2 * g - 0.5 ) ); + + // Retro reflectivity contribution. + float fb = ( (34.5 * g - 59 ) * g + 24.5 ) * VoH * exp2( -max( 73.2 * g - 21.2, 8.9 ) * sqrt( NoH ) ); + // allow to fade our rough retro reflectivity + fb *= retroReflectivityWeight; + return ( fd + fb ); +} + +float3 diffuseChan( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + return diffuseColor * diffuseChanFresnel(linear_roughness, NoV, NoL, VoH, NoH, retroReflectivityWeight); +} + +float3 diffuseOrenNayar( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH ) +{ + float VoL = 2 * VoH - 1; + float m = linear_roughness * linear_roughness; + float m2 = m * m; + float C1 = 1 - 0.5 * m2 *rcp(m2 + 0.33); + float Cosri = VoL - NoV * NoL; + + float C2 = 0.45 * m2 * rcp(m2 + 0.09) * ( Cosri >= 0 ? Cosri * rcp(max(NoL, NoV)) : 0 ); + return diffuseColor * (C1 + C2); + //float C2 = 0.45 * m2 * rcp(m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NoL / NoV ) : NoL ); + //return diffuseColor * ( NoL * C1 + C2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// N is the normal direction +// V is the view vector +// NdotV is the cosine angle between the view vector and the normal +float3 getDiffuseDominantDir ( float3 N, float3 V, float saturated_NdotV, float ggx_alpha) +{ + float a = 1.02341f * ggx_alpha - 1.51174f; + float b = -0.511705f * ggx_alpha + 0.755868f; + float lerpFactor = saturate (( saturated_NdotV* a + b) * ggx_alpha); + // The result is not normalized as we fetch in a cubemap + return lerp (N, V, lerpFactor ); +} + + +#endif ZYW[YW]ڗ [5xyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3)rJ"2BbbjP!+3Ks+)rJ"2BbbiPhPI3s#+3IrjJrJzjP!+3Ks+IrjJrJzqAkP)s#K3kPhPxyiiiiiiiiiiiiiiiiPxy)r"2jPxyiiiiiiiiiiiiiiiiPhP@ c39+*r"2 + +{CA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiP{sA c3iqAciqAciqAcqAiP{sA c3qAcqAcqAciqAiPA c3aKs+ {;Cs+QYiPA c3 iKsCsQsc)ÃAiqAQqzIIQsYsiP+sA c3AiqAcqAIQ YsѻiPkPhP@ c3)r"2 +{CA c3+c zc{cA c3aKs+ {;Cs+cA c3qzIiPkPyya + {a9*Ks;iz+B˛K cIs +ccy3!b [yIJjPyy " K{s{1Ky9+ksiPA c3 9+*r"2 + +{CaKs+ {;Cs+cqzIiP+s+c zc{Q rY rS +CIrjJrJzR+c zc{s9KiPkPhPhP@ c3)r"2 +{szsk+ cCA c3aKs+ {;Cs+cA c3qzIiPkPyy +k+ )r"2 +{Cqa{;Cs+cqzIiP{sA c3iqAciqAiP{sA c3qAcqAiPA c3aKs+ {;Cs+QYiP+siKsCsQsc)ÃAiqAQqzIIQsYsiPkPhP)s#K3kP \ \ʸʾ\Ҙ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYRUTQQSRQQTYY[RUTQQSRQQHLBBBHRUTWSUSYY[БTUSJX +H^]YY[БUSJX +H^^HYYHYБTUSQYY[БTUSJX +HXHYYHYБUSQYY[БUSJX +HXHYYBHYRQSTS LLYY[RQSTS L HLHYYBYY[TUQHLYY[TȌK MLMMYYY[TȌK MLMM ZBYY[HTӓ LLYY[HS[ J   LJYY[HSW[ + H  LJYY[HS՗[ +  H LJBYY[RԗTUTPHLYY[TTTUTPSדRHLYY[[[[[W\ٗ\ܛ]ٗX[[\\YY[[[ [[W\ٗ\ܛ]ٗX[[\\YY[[[ [[W\ٗ\ܛ]ٗX[[\\YY[[[ [[W\ٗ\ܛ]ٗX[[\\BYY[Y^ZYYY[Y^ ZLYY[Y^ ZLYY[Y^ ZMB[H[ [H [ [XJ^\]H[J H[ XJNB_[H[ [H [ [XJ^\]H[J H[ XJNB_YY[HUTR +^ +^B[H[ [ HXJ^\]H[ J  HK H^NB_[H[ [H [ [ [YJ^\]H[J[J Y + H[ XJNB_[H[ [H [ [ [YJ^\]H[J[J Y + H[ XJNB_BYY[TPT\X\YYY[TT +^ +\\]\] +^JJYY[STUғ[X[Y +[ [X[ΔTUғNYY[] љ\J H  Y^ +HTX[ّ\J\X[]] J] ^  Y^JYY[] J H] +HTX[S]J\X[]] J] ^ J]]JYY[] J H] +HTX[S]J\X[]] J] ^ J]]JYY[]PPJ H] +HTX[S]J\X[]] J] ^ H]JYY[]PPQ\XJ H Y +HTX[S]J\X[]] J] ^ YJYY[] ܛJ H] +HTX[J\X[]] J] ^ J]]JYY[] J H] +HTX[J\X[]] H]JYY[] J H] +HTX[J\X[]] H]JYY[]PPJ H] +HTX[J\X[]] H]JYY[]]\QZJ X +HQZJ\X[]] XJYY[]^Qړ\J   ț\ +H [J + Y + ț\JYY[]]\ٓ\J  ț\ +HTX[J\X[]]  ț\JYY[]]\ٓ\J   ț\ +HTX[S]J\X[]]   ț\JBYY[SPԗГQJ [X[ ][JYY[\WYY[HVYY[TȖ\ZWYY[SUȖ[][WBYY[HQUT[X[Y +\[X[^_YY[QSTWSTWSQPTYY[TUWQUT[X[YJYY[HSWQUT[X[YJBYY[WTԐTQTYY[QԐTQ\ +\HYUVQQQSQYY[UVQQQSHLBYY[RUUT QYY[RUUT WJ X +LYY[RUUT QTPVYY[RUUT QYY[RҗPQY[  [X[YJYY[RҗPQWJ X +LYY[RTUTїPQY[  [X[YJYY[RTUTїPQWJ X +LYY[RUPS[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [݌H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ Q\X[H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[ ]^QP\ +U]\ Q\X[݌H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[ ]^QP\ +U]\ Q\X[H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[]^QP\ +U]\ Q\X[H H  H HY[ H H[X[YJRUUT QTPN\]H [J + YJNB_[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [݌H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[ ]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_[]^QP\ +U]\ [H H  H HY[ H H[X[YJRUUT N\]H [J + YJNB_YY[]^QJ  Y +]^QP\J   ȗQS SS HKLJB[ [PYP\PY[H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_[ [PYP\PY[݌H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_[ [PYP\PY[H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_[[PYP\PY[H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_B][PYP\PYO]H H HY[ H H[X[YJRҗPQY[  [X[YN\]HXNB_B][PYP\\]\PYO]H H HY[ H H[X[YJRTUTїPQY[  [X[YN\]HXNB_B][PYP\\]\PYO]H H HY[ H H[X[YJRTUTїPQY[  [X[YN\]HXNB_B][PYP\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PY܌P\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\P]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B][PYP\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PY܌P\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_B] [PYP\ԕP]Y\ܜPYH H HY[ H H[X[YJRҗPQY[  [X[YN\]H [ +XNB_YY[[PYJ X +[PYP\J  ȗQS SS HKLJYY[[PY J X +[PYP\J  ȗQS SS HKLJYY[[PY J X +[PY܌P\J  ȗQS SS Yݗ[X[HXJYY[[PY J X +[PYP\J  ȗQS SS HKLJ[ݛ\PYP\ԕP]Y\ܜPYH H H]][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_[ݛ\PYP\ԕP]Y\ܜPYH H H] ][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_[ݛ\PY܌P\ԕP]Y\ܜPYH H H] ][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_[ݛ\PYP\ԕP]Y\ܜPYH H H] ][] HY[ H H[X[YJRҗPQY[  [X[YNHݛ\ + ][]YNB_YY[ݛ\PYJ  ][]Y +ݛ\PYP\J  ][] ȗQS SS HKLJYY[ݛ\PY J  ][]Y +ݛ\PYP\J  ][] ȗQS SS Yݗ[X[HXJYY[ݛ\PY J  ][]Y +ݛ\PY܌P\J  ][] ȗQS SS HKLJYY[ݛ\PY J  ][]Y +ݛ\PYP\J  ][] ȗQS SS HKLJYY[\]\PY\J X +HV] +RTUTїPQWJ X + XJJWYY[XY\J X +HV] +RҗPQWJ X + XJJWYY[]]\ QJ X +HV +RUUT WJ X + XJJWHYYBB]]XQP\ +U]\ O]H H  HY[ H H[X[YJHRUPN\]HXNB_YY[]XQJ X +]XQP\J  ȗQS SS Yݗ[X[HXJBHHRQSTS LLYY[\[J  X +HXYY[țJ X +HXHYYBZ ڌ[ۛY] +Z ][J^HRTPTғS\]H[] MM ZNH\Y\]\[JڜY[] +] ][J  ] Z +  LJNHYYB_BHY.삞 ZYW[YW[ [:xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPKrkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iPiPhP{kPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPiPhP2zkPkP1c{ {KK{szKK{siP1c{ {c{zbziP1c{ +z{#*zz"iPIs1 k+K"*zz"iPiPhPKrcJkPkP1c{ {KK{szJJzriP1c{ q{k cqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJkPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riPiPhP{cJ3z #kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{ +z{#*zz"iP1c{  s;+s +r:*riP1c{ {c#z*zz"iP1c{ {c{zbziPiPhPKrӂ+ kPkP1c{ {KK{szJJzriPiPhPKrӂ+ ZKss+#kPkP1c{ {KK{szJJzriP1c{ {s+*K;Cb*r"*J:BiPKs{s+Kr#K+b*r"Jr"J*iPiPhP{;33kPkP1c{ {KK{szKK{siP1c{ q{kqzj +biP1c{  s;+s +r:*riP1c{ +z{#*zz"iP1c{ )*zz"iPiPhP{ӂ+ kPkP1c{ {KK{szKK{siPq{Ks+{c K{sKsK#*zz"iPiPhP{*{c+kPkP1c{ {KK{szKK{siP1c{ +z{#*zz"iPiP E^psC #+Jsc#+sAccKc// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef __BRDF_COMMON__ +#define __BRDF_COMMON__ + +#include +#include +#include + +// Diffuse model +#define DIFFUSE_LAMBERT 0 +#define DIFFUSE_OREN_NAYAR 1 +#define DIFFUSE_BURLEY 2 +#define DIFFUSE_BURLEY_FIXED 3 +#define DIFFUSE_CHAN 4 + +#ifndef BRDF_DIFFUSE +#define BRDF_DIFFUSE DIFFUSE_BURLEY_FIXED//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_LAMBERT// +#endif + +// Microfacet distribution function + +#define SPEC_D_BLINN 0 +#define SPEC_D_BECKMANN 1 +#define SPEC_D_GGX 2 + +#ifndef BRDF_SPEC_D +#define BRDF_SPEC_D SPEC_D_GGX +#endif + +// Geometric attenuation or shadowing +#define SPEC_G_IMPLICIT 0 +#define SPEC_G_NEUMANN 1 +#define SPEC_G_KELEMEN 2 +#define SPEC_G_SHLICK 3 +#define SPEC_G_SMITH_GGX 4 +#define SPEC_G_SMITH_CORRELATED 5 +#define SPEC_G_SMITH_CORRELATED_APPROX 6 + +#ifndef BRDF_SPEC_G +#define BRDF_SPEC_G SPEC_G_SMITH_CORRELATED +#endif + +// Fresnel +#define SPEC_F_NONE 0 +#define SPEC_F_SHLICK 1 +#define SPEC_F_FRESNEL 2 +#ifndef BRDF_SPEC_F +#define BRDF_SPEC_F SPEC_F_SHLICK +#endif + +// Sheen +#ifndef SHEEN_SPECULAR +#define SHEEN_SPECULAR 0 +#endif + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + //#error call different BRDF_diffuse, with NoH + return 0; +#endif +} + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH, float NoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + return diffuseChan( diffuseColor, linearRoughness*linearRoughness, NoV, NoL, VoH, NoH); +#endif +} + +float BRDF_distribution(float ggx_alpha, float NoH) +{ +#if BRDF_SPEC_D == SPEC_D_BLINN + return distributionBlinn( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_BECKMANN + return distributionBeckmann( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_GGX + return distributionGGX( ggx_alpha, NoH ); +#endif +} + +// Vis = G / (4*NoL*NoV) +float BRDF_geometricVisibility(float ggx_alpha, float NoV, float NoL, float VoH) +{ +#if BRDF_SPEC_G == SPEC_G_IMPLICIT + return geometryImplicit(); +#elif BRDF_SPEC_G == SPEC_G_NEUMANN + return geometryNeumann( NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_KELEMEN + return geometryKelemen( VoH ); +#elif BRDF_SPEC_G == SPEC_G_SHLICK + return geometrySchlick( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_GGX + return geometrySmith( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED + return geometrySmithCorrelated( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED_APPROX + return geometrySmithCorrelatedApprox( ggx_alpha, NoV, NoL ); +#endif +} + +float3 BRDF_fresnel(float3 specularColor, float VoH) +{ +#if BRDF_SPEC_F == 0 + return fresnelNone( specularColor ); +#elif BRDF_SPEC_F == 1 + return fresnelSchlick( specularColor, VoH ); +#elif BRDF_SPEC_F == 2 + return fresnelFresnel( specularColor, VoH ); +#endif +} + +float3 BRDF_specular(float ggx_alpha, float NoV, float NoL, float VoH, float NoH, half sheenStrength, half3 sheenColor) +{ + float D = BRDF_distribution(ggx_alpha, NoH); + float G = BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH); + float3 result = D * G; + + return result; +} + +//from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr_v2.pdf (original version had bug in code!) +float computeSpecOcclusion(float saturated_NdotV, float AO, float ggx_alpha) +{ + return saturate(pow(saturated_NdotV + AO, exp2(-16.0 * ggx_alpha - 1.0)) - 1 + AO); +} +//ggx_alpha = linearRoughness*linearRoughness + +// ggx_alpha = linearRoughness*linearRoughness +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ +#if SPECULAR_DISABLED && BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert(baseDiffuseColor); +#else + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(normal, H)); + float VoH = saturate(dot(view, H)); + half3 diffuse = BRDF_diffuse(baseDiffuseColor, linearRoughness, NoV, NoL, VoH); +#if !SPECULAR_DISABLED + float3 specular = BRDF_specular(ggx_alpha, NoV, NoL, VoH, NoH, translucency, sheenColor) * specularStrength; + float3 F = BRDF_fresnel(specularColor, VoH); + return (diffuse + F * specular); +#else + return diffuse; +#endif +#endif +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, sheenColor, translucency) * NoL; +} + +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0); +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0) * NoL; +} + +// //////////// TODO: NAU-1797 Unify code above with other parts (for example see distributionGGX in specular_brdf.hlsli) +uint ReverseBits32(uint bits) +{ + bits = (bits << 16) | (bits >> 16); + bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1); + bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2); + bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4); + bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); + return bits; +} + +float2 Hammersley(uint i, uint N) +{ + const float E1 = frac(float(i) / N); + const float E2 = ReverseBits32(i) * 2.3283064365386963e-10; + return float2(E1, E2); +} + +float3 ImportanceSampleGGX(float2 E, float a2) +{ + const float phi = 2.0 * PI * E.x; + const float cosTheta = sqrt((1.0 - E.y) / (1.0 + (a2 - 1.0) * E.y)); + const float sinTheta = sqrt(1.0 - cosTheta * cosTheta); + + float3 H; + H.x = sinTheta * cos(phi); + H.y = sinTheta * sin(phi); + H.z = cosTheta; + + return H; +} + +float D_GGX(float a2, float NoH) +{ + const float d = (NoH * a2 - NoH) * NoH + 1.0; + return a2 / (PI * d * d); +} + +float ImportancePdfGGX(float cosTheta, float a2) +{ + return cosTheta * D_GGX(a2, cosTheta); +} + +float SpecularPdf(float NoH, float a2, float VoH) +{ + return ImportancePdfGGX(NoH, a2) / max(4.0 * VoH, 0.000001); +} + +float Luminance(float3 color) +{ + return dot(color, float3(0.2126, 0.7152, 0.0722)); +} + +#endif ZYW[YZYۛX [=xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPI3s#+3B +"*:bz +bBbbjP!+3Ks+B +"*:bz +bBbbiPhPIsc#+A # +"+3Ks+sAccKiPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kP0c{ {+A1c{  Kٓ+s S kPhP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s S kP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  Kٓ+s{A S KkP0c{ {A1c{  K3c{  S S+sS kPhP@ c3{ACA c3 Kٓ+s S kP@ c3{ACA c3 Kٓ+s{AC S KkP@ c3{ACA c3 KC c3 S  Q +s Q kPhP0c{ c k+#zC1c{ b1c{ J+s{Ci C CJaq1KaJkPhP0c{  +s;+szzc#C1c{ c1c{ rJiPkP+sicCrbKiPkPhP0c{ 9*rB1c{ qJiPkP1c{ riPhP1c{ {CqbrJJiPa+C{CqbrJJab+C)Jbzrb!{CbJIIiPq{k cK+CJiPhP{s1c{ q{k cK+C{CqbJIiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ 9*rB1c{ qb1c{ JiPkPq{k cK+Ci!{CbqJQqJiP{s1c{ {CqbJiPhP+s1c{ Ayyz"zq +jɹCKs[ {CK s{+c+3 {kP1c{ ArcrcqrKaiP1c{ ArcrcqrKaiP1c{ ArcrcqrKIiPkPhP0c{ aKs+ K+C1c{  #*Cc1c{ !+{#+"+CKiPkP+sC!+{#+"+CsY!+{#+"+CsQ #*CKiPkPhP)s#K3 _ \ʸ\ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYTPSԗSYY[TPSԗHLBH[YZYۛX [OB HSژܛYX\X[Hʑ  +ӛU +HUڜQ UH  +ӛUJBHYHWSWғTYY[HWSWғH ZHYYB Ȗ[HL HYț[\[]ڛٛ[\]\Z\^\]\ٜHW[Y\X]ڛ[ +[WZ [HJ^[H HWZ +WZN[ HH H H HN\]JL + +[X\ + H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B ȖPZ[HL ZX]\țH[[[ؙ[]]][[\YXٜHW[Y\X]ڛPZ[ +[WZ [HJ^[H HWZ +WZN[ H +N\]H + H HL + J +L +H + J + + H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B  ۝\YYTY^[Y\X]ڛ +[WZ [HJ^[HZ HWZ +WZN[H + +HZ H H + + +HN H[Y\]HZ H[JLY   +H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_B H[\ Qڜ[Y^[Y\X]ڛV[ +[WZ [WZX [ [  [  [ HHJ^[H + HN[HH +H HN[H + ۝ WZV + +HJ ۝ WZXV + +N\]H H[JLY  WZWZX + +H Y]\ڛXT[[]H]]ڛ[[ [ۛHY]YXTZB_BKZZ[[ ܜ˚[]ژݛ\ܜ[ۋ L L ZZYK[Y\X]ڛ[WZ [RJ^[ HWZ +WZN[ۜ H +N[\ HH H ۜ N[\ H\  +\ N\]\  + +HJۜ  \  +LJJ +  +J + +L + +\ Z Y]\ڛXTH[[[]YB_B[Y[[\^R[XJJ^\]LNB_B[Y[[\SY][ +[ӛ [HJ^\] + +H[ + ӛH +JLYKMNB_B[Y[[\՛\X[ [ [ӛ [ [WZXJ^[[X\YH[  LN[[X\YH[ӛ  LN[ٛݗH N\]H[ +H[ +ٛݗ +[X\ ٛݗ +[X\Y + H LNB_B R[Y[ L HH[ژܛYXX\[[\X[\K[]HY]HZܛ]X\X[ۙHW[Y[[\R[Y[ +[HJ^\] + + +HNB_B[Y[[\[ +[WZ [ӛ [HJ^[H۝ +WZH + +KN[Y[[\[ؚHӛ +J H Z + +N[Y[[\[H +J H Z + +N\]L  +Y[[\[ؚ +Y[[\[HNB_B T[]\ٛV[Y[[\T[ +[WZ [ӛ [HJ^[H H۝ +WZHNB[Y[[\T[Hӛ +\ +ӛ +ӛH ӛ +HL + +H HN[Y[[\T[H +\ + +H  +HL + +H HN\] +Y[[\T[ +Y[[\T[HNB_B H^Z[]ڛț؛\[]T[]\ٛ RY^[Y[[\T[Л\[] +[WZ [ӛ [HJ^[H H۝ +WZHN[Y[[\T[H +\ӛ +ӛH ӛ +HL + +H HN[Y[[\T[Hӛ +\ +H  +HL + +H HNˋ[HHWZNˋ[Y[[\T[H + +ӛ + +H H HH + +HHNˋ[Y[[\T[Hӛ + + + +H H HH + +HHN\] +K + +Y[[\T[ +Y[[\T[HJNB_B H^Z[]ڛț[T[]\ٛV RY L HY]YZHSZYZ]Q]ڛHHSژܛYX]P\ќHW[Y[[\T[Л\[]Y +[WZ [ӛ [HJ^[Y[[\T[H + +ӛ + +H H WZH + +WZHN[Y[[\T[Hӛ + + + +H H WZH + +WZHN\]K + +Y[[\T[ +Y[[\T[HNB_BKZZ[[ ܜ˚[]ژݛ\ܜ[ۋ L L ZZYK[Y[[\[ӛ [SJ^\]H  + + +ӛH  +ӛUJNB_B[ \ٜ[ӛ[ +[ \X[ۛHJ^\]\X[ۛNB_B[ \ٜ[[ +[ \X[ۛ [HJ^[H] +H H HNH H[Z[ZL HZ\X[HZ\[HHH]Y؛\Y\XZ]Y\]\]\] +HWSWғ +\X[ۛH + + +J H X + +\X[ۛNHB_B[ [ؚ[[[  [ [[[\J^؛[H] J H RN[H[HH H [[N\] +J[[ J[ H[ H[Z + L +H L + +NB_B[ \ٜ[\ٜ[ +[ \X[ۛ [HJ^[ \X[ۛTH\ +[X +[ +  L + [ +KN KN KNN + \X[ۛH +HN[ H +H +\X[ۛTH +  +H H \X[ۛTHN[ H\ + +H H HN\]K +۝̗] +H R +  +R +H + + +H +۝̗] + +يRH HL +  +YR +HL +H +HNB_B[ Y[T[]ڛU[  [ ۛ\[ [WZXKZH۝ +[[Yܗ[[\J^\][ +ۛ\[  J H WZX + + +\J H WZX + +WZH +HNB_BHYY!4D@V%FFW5V657VV&6WUvV5&WFVV6%WFV&Ǖ6VGVV5FV&75FV&EVfV6F^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@^T@@@@@@@@@@@@@@@@@@@^^@N@@@@PttR@@@@@@@@@@@@T^^^@@PVV@@R@\F@@lF@@pF@@b`dhF@@bdpF@@jbdF@@b`F@@bdpF@@`F@@fF@@h\`F@@F@@F@^^@VV@@\F@PR@FF@PR@PR@tt@@@@@ttξ@؄@z@PRv@@@@@ttξ@ڄ@z@PRv@@@@@@؄Pttξ@R@@@@@@@@@@@@@\P؄Rv@@@@@@@@@@ڄPttξ@R@@@@@@@@@@@@@\PڄRv@@@@F@^^@^^@@\F@PX@R@FFF@PX@R@PX@RF@PR@@PX@RF@PR@@PX@RF@^^@6QBK*vs_6_0Z̡ͽՑt^^^ʄ^\\^\\^^^^^^^8hi*k+#"+;raA.5Tc5Xc5Z5^6&3A@ lq6Q&ȳa ܘ 9+s+33+ d6tc7fc6d7 B779:32 m@d7~c6dC6 Fxl @< &ȴ PP( yL<6񱡘 @ lĆ>6 +1A1$' BMmC0d AylXf#?c?c?d?fc?ӓTSӆE6@D??C6C6?Pa ==IMnjaя TANGENT۰~~Ɖ~?BDP˔\]ڛ6j"P88ٰ~LjF~džDD??FD6FD6,j`"1"j! %"12"~X =1=ImXfFc?cDdDfd?Xd"."0"#5aH6x,%@Bj +zD`: PoutputD^G6XG=`z`H: u#0XG= +`z4`: u`'@ @O#!0XG=F`z ] ؙXݔ`,ٵձM,ٵM Т[X؛]E-../B4J[X YY[ܔ`E2V'7VfVV6%0:dx.source.argsSبBbW&76%&dx.valverSڨC2FV&FV6%2dx.resourcesSDBWFF67ECbVvD6EFW6%:dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q "` l;/TQQCIm4\BDͰF mβT?_ Ea +A,DR\e7PrV2EAI P60 &L8 r0A8`pᨃ a&L< 0A8jap Q&=L 01A8bbp c,&YL f# `A3+# `!AA (m`e U2a A!?47?0a$g`cP( pA (og@2a A!?<9?0a$ipe1 rT3p$jf43+#`PA:?l0b j AA!?H?0a$RnjE wCCA (vk4a A!?X`?0a$rplM yC y ypÎ TtP1m0c@ +hBL B0a& „0@  TyEs0a&0 h L 0aAhBL B0a& „0@  T@L 0a&00h1L6]1 `{`@ .TX +& A0R +0,83ag1@@ڂ `@ Vg & L}0F 9`1@+ :qc `@ .Zl `@ Zj : @Ì+#`P˜{  Ä0b E/?0aA y0c@A0hL 0aA }@0a&0 h L#`PC(L 0a&00-v  A0;& A0 +;& k@> \ +J \ +G=| `@ .uh `@ up ``@ wX"1 z`@ wX` τ`! B> C-pÌ+#`PC C- Ä0bp <̂*Ìh +hBL B0a& „0bp =܂+Ä0hL 0aA 0a&0 h LԂ|f 8 WF p@j!0F q(j!0L#`p9(L#`pD9L|& A0H]& A0J]& A0pR"8`ƀA0R D> |&  +L#`PD@ý3p A??L#`Pī@ú 1;0Ä0b EL?0aA@ 1c@ +hBL B0a& „`/gƀA0`b_& A0b_& L `@ .n `@ m :9g1@ ' !0F  ~!0,`3a A??l0b EX$?0a A??L#`PD?CMt0 cCHÌ+ B0c@ + dHÌ+ 0c@ + eHÌ+ 0c@ + fIÌ+#`Pů$þ fIÄ0b Y@)?0a$C/:0c@ +A 0d: A 0d:+ +A 0d:, +A 0d;-!A 0d;A 0d;+A 0d<-QA 0d<@A 0d=-M# `KN5a$C/:ք0b  YODK8A 0d>L# `KN1a$C/:Ą0b  YK? A 0d/+!L# `KND0aa+@DV7mйmvPHv7m9n-,NQEADPEAD`|&0Եm mgCeP`|&0ش- vmg}b`f`|&0غ nrgm[pf|&0ܹ nlgۚpe|&0m mXgەFe|&0M 8oPgCNۓP|&0P|&0b +DClTQ/TQE9ESTAT`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L -2" d##ㄡL L@ +f`)@DAQ b 1 0 a b.B*VbF0  ?a!! b ai (DQ50@ I]v8ҴCM>@4F!BӴ[8gq* +"BAF]Jrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !Y 2L &GC"J` +t@ʠJ4 + +0 +p3 47"POSITION ݆ 6, z@pzj +bڰ }pxx0{@kIhP|ڰ|pxx0‡*ȉjP;<,<؃ ()/47 am,Tذpz0a @aЃ`A +†;<A,<؃ a@a `@\,6, wy +)CVZda` +l(ܠhahMEh̥}M\6 p U\A2<27)ф .ͮLnJP!sC #+kz#+c e\R%2<< 7707)A2<$)0)!s)s˃zKsB2<:72)A/yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCImہ4\BDͰ6  ILDN,$127f256602907019594c5d11f8499fb7.pdbHASH%fpYL]IDXIL `DXIL BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L -2" d##ㄡL L@ +f`)@DAQ b 1 0 a b.B*VbF0  ?a!! b ai (DQ50@ I]v8ҴCM>@4F!BӴ[8gq* +"BAF]Jrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !Y 2L &GC"J` @ + ʡʣJ("(fțo, ^t^t^txx@9@y|LFD oM $Efe%&,f&gl&eCLd@$ a0(MeÀ$LfB, A 0A l@!6N |ۆ  47"POSITION Ն p&ijA eڦ }46,Cdڦ ܠ}"BU5$E4A( BmXƀ 2mӆ2 xP99QM +lҡAmڐm @ @ LY}AͥѥMhе``HBs  ڷa2ȴ 2 6,dVi6Æe no@L,6,vpv `ðyl(K& +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[Xܔ@CbVvD6EFW6%ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCImہ4\BDͰ6  a EA,DW\LI%@# ``}yA X`@'$qMʈA hpm`P,# ``ƅČ$&V3b h ΈA l`ψA mA(ЈA nН`шA ol҈A p4ӈA qi5bp X&h& h1A4[ 0  0@ #`Xm0 B00 0bp QF 0  0@ 6]1@IโA0F +Y|F `28`@ Sg ,Pc'A0T/1@i  71@`@ Wj  A$ z0 B00#`قA&h& ˆ D +x 0  `g@ &_@A0~! +; A0b 8‘=| A0>F `*WH 1X%X F IV,Hc! +A +0 B00#`.8&h& ˆ D  0  `K-g@ &|A0aZ B0b ?Á = A0]F `tHv!1Xe$ F  s,Hc! +Ad@0 B00|F `R z~!1@i%: A0\qF `z|! 9g@ &08`@  AdP21 B00 0b OMJˆA  >7q # `DKM+$-q70b ONJA  >8q# `DKM$-70b OL?ÈA  >2q+$-!7׈A  >2q)a$-7ΈA  >.q$-7ƈA  >-q+A$-7ÈA  >-q)!$-7DXBC忕q"Ѕ3WT DT40<@SFI0ISG1POSITIONNORMALTEXCOORDTANGENTSV_InstanceIDOSG1 SV_PositionNORMALTEXCOORDTANGENTCOLORPSV04I    PPOSITIONNORMALTEXCOORDTANGENTNORMALTEXCOORDTANGENTTEXCOORDCOLORVSMainC +CBDAD"C)B2C:CCDpppppppILDB`0DXILBC! 0 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +@@ 3s`0G@$AH) HS A rq@.B*VbFq% ?a!! b!t@l ($wpJL~qۨ8@J!7@I#0€w8ҴCM4E0b#M@#0!gztxyv|xz7vy7zzzy(rz0s(yTpyppq(Rz?@AIe#M 9 +DClTQĐГFF :`6(!pDUD؜@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C < y> !2L &GC" +B("(((` (r( (@R(PB(JJb J sBg( ubg w)^t^t^txx@9@wy*LFl.̍,LN.mn̍mm=271 30:Bvector X12@ E h 0 1@~%``0 1@~%`0 1@~%`0q element@Jؔ}չqHscdPVp@Ya&A`~ @,b Fj),͍ZYK[YW[ [ڠJVsOutputLitForwardD1@` 76float3xX@f|1@s 0YTh `4 +ml `4 +(K 6L TpH``Xd "hkQpp"texCoord4dٕѽ񘱽ѱ,bP!0`1@  a`8 +(6LATP`Xq "hsQPtangent F  ܽɱA-b>870`1&P`6 $S'0Qb5WGǔF0Upphɵ-bn`4py[ $D`Q + +0 &R40U QFGm.̭ $͍nA+bW6 +iX  :@hXWDY`C0 pj K1c{ ca\0`8|,bF> W"hxAH @a8|,b> ×L"hAH @b8|,bF> ,×"hAH @c8|,b> <L"hAH @d8|,bF> L"hAH @e8|,b> \M"hAH @f8|,bF> l"hAH @g8|,b> |` PPDk΍nZA>X7:7i`]Ia >@?1@5:+s+33+!i Kj"!ڶQ !!H{c#J+z[f7962;9#22:329 179& m #Q4902$"AO]XP\YP]XQ]PYЌ]ݛP жx@ aHg3&4&'TgfV&4cCbW6F&D3$m^TB@`&VFFUG NLǮlMnj-gHچ%&A`@Kt06272< 2<:2" 179& m ,@Lب?normalTex@@3V?$Texture2D@V?$vector@M$03@@@@A5f&&8хI՝Q~ؤިf~Hd~H䀚H`f-kML c+#{ +kc+#3V&7EFW6 &$0b&VF6V&4S5V&7EFWm^#'xBvۛ\[TX[ M-m* Lhj* Ln. (hO0206346829AO[][[\TX[LTX[]]Pжx :instanceBufferȄxʈ|H./shaders/include\common_types.hlsli,2InstanceData\Ț1@ga?@M-)N. o4kqj42uint4x@X@h|1@sp` "ha `1@p` +GXp0p \ą\Ų\aP$BX 01*w,b-A 0ؤ!ѕ-bF/"AW0Xյ屨KseW6F&S6vVFF2㳈CXp0`1@@`FXp0P _Fhlb &A*8V `4|q +j8XP ȋ0I0Yi, 561 V@4 @5AO]XPYЌ\]\PYPU]XQ]Pжx ` aV`"&+!5=ch5 ]U\ڛۆ`DT&VwfbU&7aP @&^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@D\DF@Dܾ\DF@Dܾ\DF@D\DF@D\DF@`@fP`\`hX@`\`hX@`\`hRd@ި@t@P`Rvd@ب@t@PbRvd@ؤި@t@PdRv@ަ@t@P`Rv@ئ@t@PbRv@ؤަ@t@PdRv@Pf@R@@@@@PX@fP`\drrX@`\jpnX@`\bbhRRvF@@@@@PʄR@t@P`R@@@@@@@@@@@@hh@v@@@@@@@@hh@Țv@@@@@@@@hh@ؚv@@@@@@@@@@h@Ȭv@@@@v@@@@@@t@PbR@@@@@@@@@@@@h@v@@@@v@@@@@P@R@@@@@@@@@@@@@v@@@@@@@@\@z@PX@hP\X@b\`RRv@@@@@@@@\@z@PPؚX@hP\X@`\`RR\Rv@@@@@@@@\@z@PPȚX@hP\\X@`\`RR\Rv@@@@@@@@\@z@\v@@@@@@@@@@@@@@@@\Ƞ@z@PȚX@hP\X@b\`RR\v@@@@@@@@\@z@v@@@@@@@@@v@@@@F@^^@B@@@@PʄR@t@P`R@@@@@@@@@@@@hh@v@@@@@@@@h@Ȭv@@@@v@@@@@ʈ„@t@PbR@@@@@@@@@@@@h@ʄʒv@@@@v@@@@@@t@PdR@@@@@@@@@@@@h@v@@@@v@@@@Ȅxʈ|@ʄ@t@P`Rv@@@@@P@X@@蒈@t@ʒR@@@@@@@@@@@@@v@@@@@@@@@@@z@ʄʒ\@V@蒈v@@@@@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@@@@\@z@Pʄ\ؚX@hP\\X@`\`RR\v@@@@@@@@\@z@PPʄ\ȚX@hP\\X@`\`RR\Rv@@@@@@@@\@z@\v@@@@@@@@@@@@@@@@\Ƞ@z@Pʄ\ȚX@hP\X@b\`RR\v@@@@@@@@\@z@v@@@@@@@@@v@@@@F@^^@Bh@P@R@t@@@@@h@@z@ި\PަX@\Rv@@@@h@ؤ@z@ؤި\PؤަX@\Rv@@@@f@@z@ب\PئX@\R\@T@d\`@Z@b\`v@@@@@f@ʆ@z@fP\Rv@@@@@@@z@Pؤ\Rv@^^@t@Zbnrnt@^@~@@@@@@@z@Pؤ\Rv@@@@@@@z@b\`v@@@@f@Ȧʜ@z@PޮPX@訄P\X@\RRRv@@@@f@ފ@z@@Ȭ\@Z@\Ƞv@@@@f@@z@PފRv@@@@^^@@@@@f@@z@PfP`\jX@Z`\jX@`\`RRv@^^@t@Zbnrn@@@@@@@@@ޘ@z@PPȦʜX@RR@V@bZjv@@@@@@z@PȦʜX@Rv@@@@@ެ@z@PR@V@bZjv@@@@@@z@@T@v@@@@@@@@f@@z@fPb\`X@b\`X@b\`Rv@^^@t@Zbnrn@@@@@@@@@f@ܬ@z@d@T@@T@Ȧʜ@Z@v@@@@f@Ф@z@ФܬPܬX@ȦʜX@Rv@@@@@@z@\v@^^@t@Zbnrn@@h@@X@@@Z@@@@@Z@PZR@@@@@@@@@`@z@`\`hv@@@@`@z@P`X@`\`bX@@T@Rv@@@@`@Tz@Pb@Z@Rv@@@@f@@z@PfP`X@`X@`RX@\X@PRRv@@@@@@z@PP\R@T@Pb@^@`\`hRR@T@`\r@V@`\bv@@@@f@@z@ȄP@ެX@ޘX@ʆX@X@X@X@X@X@X@fPȦʜRR@T@v@@@@@hPfPRX@b\`R@T@\v6Am \ʸܾ\Ҩ.// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; + ZYW[YYY\ٗ [exyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3!J22*"2BbbjP!+3Ks+!J22*"2BbbiPhPIsc#+C #+:c{ csAccKiPhP0c{ !K33+c +k+C1c{ !K33+zc{IiPkP+s!K33+zc{yy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxyaKs+ z;Cs+i++ caKs+ {;Cs+kP0c{ !K33+c+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ 1"ʁqYQzCQzCQaKs+ z;Cs+iP1c{ 1"YA1"ʁiIQ{AiqzJiP1c{ 1"cYA1"ʁiIQ{AiqzcJiP+s!K33+zc{QA1"Q1"cIyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxy1{ki{Ks;1{J+{b)s+;{s+ K+c+!K33+kP0c{ !K33+c+3J+#3+s+cC1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ )s+;J qiP1c{ )s+;3 +{Aq1QaKs+ z;Cs+iq1KQaKs+ z;Cs+Yq1iP1c{ 1"ʁ)s+;J YQzCQzCQaKs+ z;Cs+iP1c{ 1"YA1"ʁiIQ{AiqzJiP1c{ 1"cYA1"ʁiIQ{AiqzcJiP+sA1"Q1"cQ)s+;3 +{Kyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhP0c{ !K33+c+3J+#C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP+s!K33+zc{Q!K33+c+3J+#3+s+cCaKs+ z;Cs+cqzbqzcbzCJyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhP0c{ !K33+B s3+s+cC1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCb1c{ +{*3c+KK˻*K;CIiPkPyyJs+++z#1KKs;cq++#{Is+{{s+y{;Cs+ k+K K{s{kPyyC+K9c{Ks+ k+K K{s99;iP1c{ 9; +cC aKs+ {;Cs+SaKs+ {;Cs+iP1c{  9; +cC S9; +cC iP1c{ 9 +CAqyqIQa{;Ay iIIiPhP1c{ 1zCY{AizCJiPyyBK1 {s+C+)s+{{ 9 Ks; s;c+1{a{{;Cs+i +K csiPyyI+ +)s+;Ks; 9 Ks; s;c+1{k{{C!K+c+Ki +K ckPyyB+AK;C+C+ c+9Kk c+;IcC+a{+C+)s+;{{Kcc+kPyyB+!+3 c c+1{kB sIqqiPyy*Ks;C+ c+{q9+K#y33CK)s+;{{siP{s1c{ Kk c+q1iP1c{ 1AqiKk c+Q{AqiqzcJIQAqiKk c+Q{AqiqzJIiPhPyyz;CA1I{k{{C1+{s+Is+{c K{skP1c{ 1#a+C1a1a +CqQ9iqIIiPhPyy*{+3c+KK{sKK{ssiP1c{ 1AAqQ9iIQ9YqIQzCQ)ÃAii CqQ9iqaqIQCqzCIIiPyy cc{{1 #+y{;C+{+3c+KKkP1Q+{*3c+KK˻*K;CiP+sA1#Y1IiPkPhP0c{ !K33+B sC1c{ !K33+zc{c1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCb1c{ +{*3c+KK˻*K;CIiPkP+s!K33+zc{Q!K33+B s3+s+cCaKs+ {;Cs+cqzbqzcbzCbqzCb+{*3c+KK˻*K;CKiPkPhP0c{ !K33+{+ss + C1c{ !K33+zc{c1c{ aKs+ {;Cs+c1c{ qzb1c{ qzcb1c{ zCIiPkP1c{ zcQzCiiP1c{ iaKs+ {;Cs+QaKs+ {;Cs+iP1c{ iiQiiP1c{ iqQiQCiYqIiP1c{ zKzciqzQqzciPhP1c{ qQiQCiYqIQAzKzKQCi CqzcbqzJIIiP+s!K33+zc{QAYIiPyy1c{ qQiQCiYqIQzKQAzKiKsCaqzcyqzIqzcIiPyy+s!K33+zc{QAqzcQYIyy!KKK{sJykK+#Is+sK{s cccaK;Czc{I!KK#+#JkPkPhPxyqIC+q{k c!K+K{skPxyIC+K++{kPxyq"{IC+{Ks+ s;c++++sC+K++{ s#C+q{k ckP0c{ 9+#J33+#zkKs s#JA1c{ qb1c{ b1c{  +#r"{b1c{ 9; +cC KiPkP1c{  q1Q9; +cC iq1iP1c{ iq1Q9; +cC Yq1iP1c{ a+3 +{ +AA +#r"{R YKQ9; +cC KiPyyB++cIq{q{k cK+# +1+CIs +k kP+sa+Aqbba+3 +{IiPkPhPhP)s#K3 n0 \ʸҾ\Ҙ \\ SQӐ H\\\]K \\P + QXZQX[Ȓ H\\\]YBHYHUҗSYY[HUҗHLBHYHWSWғTYY[HWSWғH ZHYYBKKKKKKKKKKKKKKKK HQKKKKKKKKKKKKKKKKBZ YWWW +Z[[Yܗ[[ ZӛHJ^ S^ܛ L Q]Hӛ\Z\XHPțQ][HRHW HY]]ڛY[]\K؛Z  HHK  H M  H K͍   HN؛Z X HH   L  H  H HNZ H[[Yܗ[[ + +XNZH HH[ +  +  H +HK  +ӛH +H + +  +KN\]Z +HK  H H + +H +NB_BZ HQ +Z \X[ۛ Z[[Yܗ[[ ZӛHJ^ S^ܛ L Q]Hӛ\Z\XHPțQ][HRHW HY]]ڛY[]\KZ HHYWWW +[[Yܗ[[ ӛHN\]\X[ۛ +H  +HK^^\]\]JWSWғ\X[ۛYNB_BBZHQӛ[[] +Z[[Yܗ[[ ZӛHJ^ TX[HHQ + [[ ӛHJ؛Z  HHK  H M HN؛Z X HH   L HNZ H[[Yܗ[[ + +XN\]H[ +  +  H +HK  +ӛH +H + +  +KNB_BHYY7|h5FV&7Ǖ6VGVƅ&Gv&WEVfV66ǖL^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@F@PR@\F@PR@\FF@F@PR@FF@F@PR@FF@d`dbF@d`db@bFF@@bF@@f\bhbjrdljF@@f\bhbjrdljF@@`\`````bF@@fPb\`X@`\`X@`\`RF@@fP`\`X@b\`X@`\`RF@@fP`\`X@`\`X@b\`RF@@bF@@bF@@ʾȾʾF@d@ʾȾʾF@f@ʾȾʾF@h@ʾȾʾF@@F@d@dF@f@fF@h@h@fP@X@@X@@R@@@@@PX@PX@RRv@fP@X@@X@@R@@@@@PX@PX@RRvF@PR@@fPf@R@@@@@fP\X@\X@\Rv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRv@hP@X@@X@@X@@R@@@@@PPX@RX@PX@RRvF@@F@PR@@PPRRF@PR@h@tvF@dPX@X@X@R@\ʎPFFX@PR\X@X@RF@dPX@R@\ʘPFFX@PR\X@PR\RF@fPX@R@\ʘPFFX@PR\X@PR\RF@PX@R@\ʘPFFX@PR\X@\RF@PX@X@R@\ʘPFFX@PR\X@RF@dPX@R@\PFFX@PR\^PR\RF@dPX@R@\PFFX@RF@fPX@R@\PFFX@RF@PX@R@\PFFX@RF@ʎPX@R@\PFFX@RF@،ОPX@X@X@R@\PfPX@RX@RF@ʞPX@X@R@\PFFX@X@RF@ʘȞPX@X@X@R@\ʘPFFX@X@X@RF@PX@X@RF@@F@@غF@@кF@@ܺF@PR@@@F@F@PRF@PRF@F@PR@F@F@@bF@dF@dPX@R@`F@dF@fF@PX@X@RF@PX@R@`F@PX@X@RF@PX@R@`F@h@،ЄPdxh|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvf@،ЄPdxf|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvd@،ЄPdxd|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRv@،ЄPdx|@X@d@X@@X@@X@@X@@R@dv@@@@@\PfPX@RRvh@،ЄPdxh|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvf@،ЄPdxf|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvd@،ЄPdxd|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRv@،ЄPdx|@X@f@X@@X@@X@@X@@R@dv@@@@@\PhPX@RRvh@،ЄPfxh|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvf@،ЄPfxf|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvd@،ЄPfxd|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRv@،ЄPfx|@X@f@X@@X@@X@@X@@R@fv@@@@@\PhPX@RRvF@،PX@X@R@،ЄPX@X@X@X@X@ZbRh@ȄPxh|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvf@ȄPxf|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺvd@ȄPxd|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPȄx|@X@@X@@X@@X@@R@PX@X@Rv@@@@@¶ƺv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRv@ȄPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\PRvd@ȄdPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\dPRvf@ȄfPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\fPRvh@ȄhPʂ@X@@X@@X@@X@@R@PX@X@Rv@@@@@\hPRvF@ȄPX@R@ȄPX@X@X@X@ZbRF@ȄdPX@R@ȄdPX@X@X@X@ZbRF@ȄfPX@R@ȄfPX@X@X@X@ʾFFRF@ȄhPX@R@ȄhPX@X@X@X@ZbR@ʄPʂ@X@@X@@X@@X@@X@@R@PX@X@Rv@@@@\PX@Rv@ʄdPʂ@X@@X@d@X@@X@@X@@R@PX@X@Rv@@@@\dPX@Rv@ʄfPʂ@X@@X@f@X@@X@@X@@R@PX@X@Rv@@@@\fPX@Rv@ʄhPʂ@X@@X@h@X@@X@@X@@R@PX@X@Rv@@@@\hPX@RvF@ʄPX@X@R@ʄPX@X@X@X@X@ZbRF@ʄdPX@X@R@ʄdPX@X@X@X@X@ʾFFRF@ʄfPX@X@R@ʄfPX@X@X@X@X@ZbRF@ʄhPX@X@R@ʄhPX@X@X@X@X@ZbRF@ȄPX@R@¶PPPX@RX@RRF@PX@R@¶PPPX@RX@RRF@dPX@R@¶dPPdPX@RX@RRF@،ЄPdxd|@X@d@X@@X@@X@@R@@@@@v@@@@@¶ƺ\vF@،PX@R@،ЄPX@X@X@X@ʾFFRF@Bd`dbF@PX@X@R@@~@@t@F@PX@R@@@Ff@fPf@RF@@@@@@PX@ljj`h\RvF@@@@@PPPX@RR\X@X@fP`X@`X@`RRvFF6\ʸܾ\8 \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB\\\]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓNBNB\S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNBNB\՜S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNH\X[YUӓQNBNB\\\S]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\S]^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\Sћ]Y^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQN[ ݛUӓQN[ ۛӓNBNB\\\\\\^[ \]ڛTUғNBNB\\\\\Z[Y^[ \]ڛTUғN[ ؛[UYSUQNH] ؛[YYXSQQPNBNB\S\ݑPY^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]YUQN[ ]ۛUӓN[ LUӓQNBNB\S\\\\^[ \]ڛȔ\]ڛN[][]ڛH] H]UӓNBNB\S\T]Y^[ \]ڛȔ\]ڛN[ ]ۛUӓNBNa<ȃ ZYW[Y [{xyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPI3s#+3"2zjjzrjP!+3Ks+"2zjjzrjPhPIsc#+!K33+#3sAccKiPIsc#+ᙃ+c #3sAccKiPIsc#+)sK#3sAccKiPhPxy!J33+i{#+ckP!+3Ks+!J22*b +j*iP!+3Ks+!J22*z*rr + +iP!+3Ks+!J22*b*iP!+3Ks+!J22*b*2J*"iP!+3Ks+!J22*B +riPhPI3s#+3"2"J22*jP!+3Ks+"2"J22*!J22*b*2J*"zy!J22*z*rr + +zy!J22*b*zy!J22*z*rr + +zy!J22*b*zy!J22*b +j*zyiP)s#K3kPhPxyiJ{3 +!KKK{s1sK{skPhP!+3Ks+*"bJrriP!+3Ks+*"*Zj +rriP!+3Ks+*"::iPhPI3s#+3"2*"jP!+3Ks+"2*"*"::jP)s#K3kPhPxy9*{k+K +s K{syC #{Ks;kP!+3Ks+*:JjbJJiP!+3Ks+*:r*j +rriP!+3Ks+*:Z*b*j*riP!+3Ks+*:BbJZiP!+3Ks+*:jJB::iP!+3Ks+*:jJBz*b +*"iP!+3Ks+*:jJBz*b +*" +ziPhPI3s#+3"2*:jP!+3Ks+"2*:*:jJBz*b +*"jP)s#K3kPhPxy1+s+ckP!+3Ks+*2rzr*iP!+3Ks+*2BbJZiP!+3Ks+*22*r*biPI3s#+3"2*2jP!+3Ks+"2*2*2BbJZjP)s#K3kPhPxyB++skPI3s#+3B**r*b +jP!+3Ks+B**r*b +iP)s#K3kPhP0c{ "2"K33+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCJiPkPI3"2"J22*!J22*b +j*jP+s!K33+c +k+C!K33+zc{IiP)cK3"2"J22*!J22*z*rr + +jP+s!K33+{+ss + C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*jP+s!K33+c+C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*2J*"jP+s!K33+c+3J+#C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*B +rjPyy){ cc!K33++s"2"K33+cKCqzCjP+siP)s#K3kPkPhP0c{ "2"K33+C1c{ !K33+zc{c1c{ aKs+ z;Cs+c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCJiPkPI3"2"J22*!J22*b +j*jP+s!K33+c +k+C!K33+zc{IiP)cK3"2"J22*!J22*z*rr + +jP+s!K33+{+ss + C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*jP+s!K33+c+C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*b*2J*"jP+s!K33+c+3J+#C!K33+zc{caKs+ z;Cs+cqzbqzcbzCIiP)cK3"2"J22*!J22*B +rjP+s!K33+B sC!K33+zc{caKs+ z;Cs+SaKs+ z;Cs+cqzbqzcbzCbqzCJiP)s#K3kPkPhP0c{ "2"KKK{sC1c{ 9; +cC c1c{ qzCJiPkPI3"2*"*"bJrrjP+s!KKK{sbKssC9; +cC cqzCIiP)cK3"2*"*"*Zj +rrjP+s!KKK{s* ssC9; +cC cqzCIiP)cK3"2*"*"::jP+s!KKK{s;:B9; +cC cqzCIiP)s#K3kPkPhPxyJ9yAQqzcRqzJiP0c{ "2:+{k+KJKKcKC1c{ 9; +cC c1c{ qzb1c{ qzcb1c{ zCJiPkPI3"2*:*:JjbJJjP+s9+{k+KjcKKCIiP)cK3"2*:*:r*j +rrjP+s9+{k+s*k ssCqzbqzcIiP)cK3"2*:*:Z*b*j*rjP+s9+{k+[*c+k+sCzCIiP)cK3"2*:*:BbJZjP+s9+{k+˛CcK9; +cC cqzbqzcIiP)cK3"2*:*:jJB::jP+s9+{k+˛jKCC9; +cC cqzbqzcIiP)cK3"2*:*:jJBz*b +*"jP+s9+{k+˛jKCz+c +#C9; +cC cqzbqzcIiP)cK3"2*:*:jJBz*b +*" +zjP+s9+{k+˛jKCz+c +# {C9; +cC cqzbqzcIiP)s#K3kPkPhP0c{ "22+s+cC1c{ +c zc{c1c{ zCJiPkPI3"2*2iP+s1+s+cszs+C+c zc{IiP)cK3"2*2iP+s1+s+cCcK+c zc{czCIiP)cK3"2*2iP+s1+s+c3+s+cC+c zc{czCIiP)s#K3kPkPhP0c{ "2+c C1c{ 9; +cC c1c{ qzb1c{ qzcb1c{ zCb1c{ qzCbA c3C++s+s;CcA c3C++szc{KiPkP1c{ !"2"KKK{sC9; +cC cqzCJiP1c{ 9"2:+{k+KJKKcKC9; +cC cqzbqzcbzCJiP1c{ +c!Q9iPhP+s+ciPkPhPxy1{kAyys1{K+s{k{k{s+s{c{ #{yy{+r{+j{Ks;2{K+{q#3AyK;Ks c+K{sA #;Is{#+ IiP0c{ {k++{cK{sC1c{  +#r"{b1c{  zb1c{ 9; +cC KiPkP+s +C{C +#r"{Y zb)ÃAiqQ9; +cC iqIIiY zJiPkPxy9; +cC aKs+ z;Cs+SaKs+ z;Cs+kPhPxy9; +cC aKs+ z;Cs+SaKs+ z;Cs+kP@ c3 s# #"2rzrzbB1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cc1c{ C++szc{c1c{  sc+sKiPkPI3*b +"J +b*"11"2"J22*!J22*b +j*jP+s!K33+c +k+C +#J33+zc{KiP)c+kP1c{ Aq{k cK+CK+YaK;C#JKiP1c{ qzC +C!{Cq{k ccAJIiP1c{ zC +C!{CK+cAJIiPA c3!K33+"2"K33+C +#J33+zc{caKs+ z;Cs+cqzbqzcbzCJiPI3 *b +"J +b*"jP1c{ +c "2+c C9; +cC cqzbqzcbzCbqzCb sc+scC++szc{KQ+c +s;CiP1c{ 1"22+s+cC+c zc{czCJiP+sA!K33+Y1Q+c KiP)c+kP+s!K33+iP)s#K3kP)s#K3kPkPhP@ c3 s# #"2B1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cc1c{ C++szc{c1c{  sc+sKiPkP+s s# #"2rzrzbBqzbqzcb +#J33+zc{c9; +cC caKs+ z;Cs+c+c zc{c+c +s;CcaK;C#JcK+cq{k ccC++szc{c sc+sKQqzciPkPhP@ c3 s# #"2rzrzbB1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cKiPkP+s s# #"2rzrzbBqzbqzcb +#J33+zc{c9; +cC caKs+ z;Cs+c+c zc{c+c +s;CcaK;C#JcK+cq{k cc1c{ AaaIaIiPkPhP@ c3 s# #"2B1c{ qzb1c{ qzcbA c3 +#J33+zc{cA c39; +cC cA c3aKs+ z;Cs+cA c3+c zc{cA c3+c +s;Cc1c{ aK;C#Jc1c{ K+cA c3q{k cKiPkP+s s# #"2rzrzbBqzbqzcb +#J33+zc{c9; +cC caKs+ z;Cs+c+c zc{c+c +s;CcaK;C#JcK+cq{k cc1c{ AaaIaIQqzciPkPhPxyyyyyyyyyyyyyz"zq +jɹrK3{#+ {+KCyC+ A1{) kc+++!KKK{s;:Is+c #3sAccKKiPKs*++JAKsKKiPkPKAKIAKIiPKAAK1IIAAK1 + + + + + + +JIiPKAAK1IIAAK1JIiPKAAK11111JIAAK13111IIiPKAAK11212JIAAK13212IIiP+sKiPkPhP0c{ A +kk+c+CKsIcKsqJiPkP{s1c{ )1 C1c{ CIKyqJiP{s1c{ )*++JAIKQqɱ)kiP+s1c{ A)a)IiPkPhP0c{ Ij{ s+ +kc+;:B1c{ )b1c{  IiPkP{s1c{ CKqQJQ)riP{s1c{ {B+ CAqi)rKyAqYA iqIQ)rKIiP{s1c{ KsB+ Cqi{B+ Q{B+ KiPhP1c{ AiPArKsB+ Q{CCKKiPArKsB+ QKsCCKKiPAr{B+ iPiP+sAiPkPhP0c{ !::B1c{  a1c{ qzCJiPkP{s1c{ !AqzCQ iqzCJQqzCYqiP+s yAJQ!Q!KiPkPhP0c{ Ij{ s+"3;:B1c{ {B+ c1c{  IiPkP+s{B+ Q!::B a{B+ KiPkPhP0c{ +c "3C1c{ qzCb1c{  a1c{ zCJiPkP+sIj{ s+"3;:BqzCb Iyi CqQzCbqIiPkPhP0c{ akKs s+C1c{ {c{KiPkP+s!{C{c{c1c{ AqaqaqIIiPkPhP)s#K3 y \ʸ\Ҹ \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBHYRQӓPSYY[RQӓPHLBH[YZ]\YY[ٜ [HB[۝ [HX +Ȟ\]HJN_[ [HX +Ȟ\]۝ JJXN_[[HX +Ȟ\] JJXN_[ ۝̗]٘ [ HX +Ȟ\]HJN_[ ۝̗] [ HX +Ȟ\]HJN_[ ۝̗] [ HX +Ȟ\]HJN_B[ ۝ [ HX +Ȟ\]HJN_[ ۝ [ HX +Ȟ\]HJN_[ ۝ [ HX +Ȟ\]HJN_[  [ HX +Ȟ\]۝ JJXN_[ [ HX +Ȟ\] JJXN_[ ] [ HX +Ȟ\]JJXN_[] [HX +Ȟ[HHJJ\]JN_BZ۝  +ZHX +Ȟ\]HJN_Z  +ZHX +Ȟ\]۝ JJXN_Z]  +ZHXZHMOJHJO\]HJN_B[[X\[[HV +\]J[J +V + LY +KVH_B[ UY՛[  [ SJ^\]H[ + ]NB_B[ Q[ SJ^[ NB[ HȘ HSWVNH[ʘ HSV +  ]JTӓ  + UJJNHۛ\[[^ +UNB؛[ Hۛ\[[^ʘ UJNB\][ + ѓSPUKM ZH[Z\\ \Yݛ\[ +   ^ +K[ +K K K^ +K[ +  ^JNB_B[ Q[  [ UJ^Hۛ\[[^ +H  + S + +SN؛[ HȘ UNB\][ + ѓSPUKM ZH[Z\\ \Yݛ\[ +   ^ +K[ +K K K^ +K[ +  ^JNB_B[[[Y\^ٗ[\Q [ YYYZJ^\] +YYY  +YYYK +\QZNB_BHY!=ԃe5FV&7Ǖ6VGV5W6V&%&Gf6ǖ-^^@@d`dh@Z@\@@@\^^@@PR@d`dh@@@@\@@@@F@F@@bF@x\|^^@@@z@TT@^@PhTޘTެR@z@TT^^@@z@@^@PhTޘTެRF@F@@j`\`F^^@@brnnX@D@@@@@@@D@܄P@@X@@ސ@R@@@d@z@@T@v@@@d@z@b@^@d@Z@bv@@@PdVbR@T@ȠP@ސX@dTd@Rv^^@@@@X@@@@@^^@@brlfX@D@@@@@@@D@܄P@@X@@ސ@R@@@d@z@@T@v@@@ސd@z@ސ@T@ސv@@@P@Pސd@Z@bR@^@Pd@T@ސdR@R@^@Pd@T@ސd@T@ސd@Rv^^@@@@X@@@@@^^@@^@Z@܎P@@X@@ސ@R@@@d@z@@T@v@@@@z@P@ސ@T@d@Z@ސ@R@T@ސ@V@bv^^@d@@@@d@^@PbZpX@T@Rv^^@@@@X@@@@@^^@@X@@܎P@@°X@@²X@@ސX@f@X@f@X@f@@R@@@ސ@z@P@X@@Rv@@@ސ@z@P@X@@Rv@@@@z@ސTސ@^@dP°R@V@ސTސ@^@dP²R@V@ސTސv@@@b@^@PbZpX@°T²@T@T@Rv^^@@@@X@@@@@^^^^t^^\\^d`bp^`b^`h^Z^@܆P@X@@ސR@@@d@@@@z@@T@v@@@d@z@ސ@T@ސv@@@d@z@b\@Z@dv@@@h@z@d@T@dv@@@Ph@V@h\@T@PZd@^@Pd@T@dRRR@^@PPb\@V@h\@T@dR@T@hRv^^@@@@@@PR@@@`\djv@P@@ެX@@ޘ@R@@@P@h@T@P@ޘX@ެ@R@VbZjRv@֨P@ސX@@ޘX@@ެX@@ސX@@R@@@蘾z@PޘX@`\`Rv@@@謾z@PެX@`\`Rv@@@ސ쾬@z@dTސ@^@ސv@@@P@P@ސ쾬@T@謾X@ސ쾬@T@蘾RX@b\`Rv^^@@d``bX@D@@@@Z@@@@@D@P@@ސ@R@@@P@h@T@ސ@T@ސ@Rv@P@@X@@ެX@@ޘ@R@@@@z@dP@@R@T@`\jv@@@֬@z@ެ@T@Pb@Z@R@V@v@@@֘@z@ޘ@T@Pb@Z@R@V@v@@@`\dj@^@P@֬@T@֘@Rv^^@@@@@P@@X@@ެX@@ޘ@R@@@d@z@dP@@Rv@@@Ь@z@ެ@V@P@ެ@T@Pެ@Z@ެ@T@dR@V@d@Rv@@@И@z@ޘ@V@P@ޘ@T@Pޘ@Z@ޘ@T@dR@V@d@Rv@@@P@Ь@T@И@Rv^^@@@@@@@^@ІP@@X@@ެX@@ޘ@R@@@d@z@dP@@Rv@@@Ь@z@ޘ@T@@PެTPެ@Z@ެ@T@dR@V@d@Rv@@@И@z@ެ@T@@PޘTPޘ@Z@ޘ@T@dR@V@d@Rv@@^^@@z@v@@^^@Ь@z@ޘ@T@P@ެ@T@P@b@Z@@R@V@@Rv@@^^@И@z@ެ@T@P@ޘ@T@P@b@Z@@R@V@@Rv@@@P`\j@T@P@Ь@V@И@RRv^^@@@@@@@^^@@d`bhX@D@@Z@@@Z@D@ІȂP@@X@@ެX@@ޘ@R@@@Ь@z@ޘ@T@P@ެ@T@P@b@Z@@R@V@@Rv@@@И@z@ެ@T@P@ޘ@T@P@b@Z@@R@V@@Rv@@@`\j@T@P@Ь@V@И@Rv^^^^t^^\\^d`bp^`b^`h^Z^@P@ެX@@ޘR@@@b\@^@Ph\@T@PޘV@ެ@Z@ޘ@T@ެRRvf@؜P@f@@R@@@vf@ئP@f@X@@ސ@R@@@@z@jP@b@Z@ސ@Rv@@@@^^@@@@dJ@@@@@@@@@@@@@P@@T@\@R@T@@V@Pb@Z@R@T@v@@f@֤Pf@`X@@ސX@@R@@@@@@@z@jPb@Z@ސRv@@@@@@z@b\`@Z@v@@@@@`@V@PPfPX@X@RX@`R@Z@`R@T@vf@،P@f@X@@ސ@R@@f@@z@P@P@fP`X@`X@`RX@fP`\rrX@`\rrX@`\rrRX@@R@Rv@@f@@z@P@b@V@@R@^@P@b@Z@@Rv@@f@@z@P@T@V@ސTސ@Z@b@Rv@@@`\j@T@dfP@P@Z@ސR@^@P@V@ސR@R@T@P@b@V@dfP@PPVސRTސ@Z@bR@^@PPZސRTސ@V@bR@R@Rvf@ФܬPf@X@f@X@@R^^@z@dPR@@@P@X@X@Pb@Z@R@T@P@Pb@Z@R@V@@R@RvF6<".:(77<2689222..242727:9.272941:2.:9029902/2494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠРР0'v6V֠РҠV66VVננV66V27VV֠נBvBVV6GWFV66VV37VV26VB6bV6R7WF"2FV&2V&נננҠР22F4Ŕ"6ҠР0BVfV2T%Te4T5TDbӠ0BVfV24Ud5T%T5%45UӠ0BVfV2T%TUde4T5U#CӠ0BVfV$%D4Te4T5U#Ӡ0BVfV"UdT4De4T5UR#Ӡ0BVfV"UdT4DՔ5TDӠР0BVfVT5t%T45TD#ӠР0BVfV2Dt$Ӡ0BVfV2DtUԔ45dU2Ӡ0BVfVUԔ45Bc֠Р0BVfVr$%TedT$%Udr$ՠ0BVfV25EU%TedT$%Ud2%ՠР0fFVf5V7V7נР2Ɩ"6ҠР0BVfV2E%tdń2נ0BVfV2E%td2E%tdńҠРV66VV3FV&EVfV6ננ26GW'R6GǦ3G'veVvr&&TgfV&%Wf2E%tdr$%TedT$%UdӠ26GW'R6GǦ3G'veVv27GW&TgfV&%Wf2E%td25EU%TedT$%UdӠРƖV"6w&&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uFr&&TgfV&%WfӠנРƖV"677GW&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uF27GW&TgfV&%WfӠננР0R6W5V7V7נР4Ɩ"6ҠР0BVfV24D'WfV'Wf72V֠0BVfV24D'WfV24D'WfVҠР0BVfVr$5$TedT$V2&VgfV&24Dr$%TedT$%UdVҠ0BVfV25EU5$TedT$V2&VgfV&24D25EU%TedT$%UdVҠР0RFf5V7V7Ax4E4TD! A@B  // +-DZ̡ͽՑt^^^ʄ^\\^\\^^^^^^^8hi*k+#"+;r>?#?#???&3A@ 6 2"&a( &AِEHȆE&itʄ&H y `l@)m.m(.L̬LnX &m\6 v`#7"v"4lbFpd"@5X rMla"'!#=A Al0L DxG64&4H uDjD BGzdd  50 əL 6 &v@&j"<#Y ; 50 Mma"ml#m2A@  6&j'<& Q5q8  ԉAEd";#`"&c&i2'tr'! Al@Ddo!"POSITION $`! B5 KɟJ +Jʨpzj +bڰH + +"') B"5P ʟJ +J +r:*r $caQUP PVQP6SV_InstanceID &IlD6, + +\+ +R1UiY2e6F6A@ ʆ%DhOD%TXDX%D@V6, R*** "* *aSP TTPI ʟJ +ʨl@drʟʮ +*bIj&'*"&b+[\^ ì +0A BˆB:pqaWG7.BdEhUu ' @O +x 2 "(: u'@ @O#`: Pu4蒈%@¼ +.x%-b3x`\,؋ ' @O #0XG=:`z|`: 0u]\\шͮͥ퍬Ō-lnQͮ%̍nJ0\\(A\\Q eNn̥-,()lJ0u\\Q ŮLn.mJ"M\#R e-L鍬mJ`"e\9R υ.,..mnp'zR ..l.lJ'u\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq +` )P;PEAD ~qv <PEAD %am p LD4BX3\3~q&0 <<mp/0CM>rFP <49RCM~qۆ &}L 1A8cp# `3,,# `A pupoÄ0b (1a$t@pΌ +j0 A (PtaL#`Pho?L# `ԁtЄ0b (0Ä0b J(܁AD  CoA (v@d M#`Pho?0b (L3D+,#`PhVo?0b  +)؁P3D+,#`Phx?L# `A5a Aq +?`?0a$b +|x`ք0b *Ä0b )AA\  foA (zeM#`Phy?L# `A6a A +?p?0a A +?p?0a A +?p?0a A +?p?0c@0bp W)`09Ggƀ7df Xf1@Jz1 b`@ S f YYF`M `4a& b0F c1 P0F`M `4a& b0F 420F`M `4a& b0F ೅6 ( & ф0F`M `4& A0|!̠f YYF`M `4a& b0F ;X]0F`M `4a& b0F B=p0F`M `4a& b0F jPs0F`M `4a& b0l:0b  d"  d#  d$ g1@$zA 0F  ; _ 0F  C_ 0L @> d*fP0b JA0a AA0aЁ|& A0\Ԁ `@ 03`1@ &A 0,NA> d2mp +0b LCB0a AFPLV `@ 2h80`1@&ܡ L!0F  ÉwHS& ˃Rτ0b NCB0a AL#`- ddtp `` 0F  3~[& A0 `@ 2<`0TL#`EHB- dk!P 0b [B0a+Ђ|& A0ܢ$P `@ 0 R`1@ .Nh!0A>3,l A&)L#`ͅJ<t 3a Af-L#`݅K=h 3a A1!L#`L|LpЙ0,L#`EMXL#`MLL@Й0F @ >r]f Wf1@5 pt0F @ =r\& A0(P# `@ 1 fafM `4A& фA0F  ~ `4!& !0Fa1@4|&B"'& ф0F`M ό1 ,#`FY /L#`Y/LȄ|& A0b-& A0d#-& {jB> dLM dIM [ Ì +,#`PnQC [Ä`,1 h f1@6%z"0F  Í & s τ0b nąJE0a Ara`Lc! `@ ޠ `1@7%"0F 8 YF @& L&0l(3a A?&?0b z#?0a A??L#`PG|1 _pÄ`:11 na`@ `1@HDLFB@z@JP4 4@lTQ?DE/M%LUSTATP +`DXIL8 +BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L a2" d##ㄡL L@ +f`)@DAQ A@JAba)@ 5\=sUa*.BCQ! B"h*@ @AP ("'!$%Q1 @B#$m `F a8pi0|i(aFF :`P} @@n00n0 0PP +`P@P~Gsب "$|'4@tlTQ +<:oʼn6(g I>Lr8 +)i @źD(rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C <d$2L &GC"J` + +4@ ʡ$J +0J@ +U< +Tʄ("(R(jq*gȜsJgH vڱ{AyAyA@AG!qy LFD oM $Efe%&,f&gl&eCLe@,  l Is s+33+ p6C!! p6 ؀ΑX[PYx6 D$04pJInstanceDataBufferڀ E LhpeMN̬Lni a0n0A866G6V&6WD4A 1Mj@Tڀ `2 B77 a@Al.5 P0Ad 6(Hdn7962; qm@891 20Lp01.worldMatrix27B ƀۛ\[[S\ @` 8ԥMl@dD`ĀȠ ؤ!ѕMmA m@PQ> 0`4w} +0A4`@L! @ A*lU04 +;4X6: R` l6 +†6 + `C0 4܈@=M%Q%=9M +0 a! &l@ 6,-.. @.pzj +bڰ p 0€ @kIhP! `Ò-B.. "' BA0[\v͔W]XY( Ba06,e` :.Æ|AALY}AͥѥMna!t!a a2-B.à .†%[\2\ K-B.à a !6,e ..'' -B.@| xxy{0=7@  +W|[XM\9 +b{ #۠C??"1bPͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJU"s˃+ rs{ K{s"B,!sK+K" +B2<27:<47)>t!s{s+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq '` %P;PEAD ~qf <PEAD %amp LD4B3\3~q0 <<mp/0CM>r6P <49RCM~qv r6P <49RCM~qv #`P,\e A0A0b w T #`P/Xw؁|F _;F _ 1@AԠ3b HA0b UHA0b HWg@ *05`@ 83`@ *@13b JCB0b UJCB0b JCB`u` +1@%!L!1@%ޡ L!1@%! L!<( AP A A%X|F  {RF {RF  |R nA>#`P>-#`P>-#`P?-F + A0x@A0zA0|$CZψ T`!P  Ta1P  TbA|P -g@ *0 T`@ 8 R`@ *@ P3b ZC0b UZC`@3b [C0b U[C`@3b \ȄC0b U\ćt, AE6aC0b U]tF `h|фMфA1@-/v"&A.F`4AFa@ M!M[^B>#`PY / AUgQD`Lg@ H E&A0PC-  AlD0b jERDOg@ x `@ *׀ \,3b lȅJE0b Ul̅IE`011@j6%"1@6%"1X7 F  ,Hc! +N|F ڍF  ,p XO|F ȉF Ѩ, X|F F ", t1 B00 0b {yGnˆA (q# `nyF$qu0b {zGnA (q1# `ny$y1b {xmňA (qA$AӈA (q!$ΈA (q$qƈA (qA$AÈA (q!$DXBC}s}?~L DTPD`SFI0ISG1SV_PositionNORMALTEXCOORDTANGENTCOLOROSG14(@SV_TargetPSV04( 0NORMALTEXCOORDTANGENTTEXCOORDCOLORPSMainDCBCC"DDILDB\`8DXILDBC! 8 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L \2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXQJL~qۈ8(D@i88#! x #Lm00n@ PPr@ +|`0`@~~z P(@fq`pypZ(|zrR{(qw>0vxp6:0$"I^v8ҴCM>@4F!,ː̛)gY@Bhj rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y> "2L &GCJ +)B((b(( (@($ʠF#A1O#r:g( u, #@hkP AA?Ay-L d!1 s# # sc+ssAcc4@ oM $Efe%&,f&gl&e@Ì-n]ݛ[ Ȍ<float{ 0b4pX` E ,`  E 4` ( AaelementJؔ}չqHscd0Vp Q!&A`g,bhalf3|xX@f|H12 E =A` "hȠ0XM#t`0eu1&A 0"421 t 30:Bvector91 E ,A`F9H @a-b 1 `jm0A@i&AH3[ 0:4<30:_11r _12r W"h@\!0%>(WH a8|,b0_23r ,L"hDA\!05#R(WH c8|,b0 ()0{{sVp +Tdk΍nZ*PՆ!RVB *@+\`dI 47z./shaders/include\in_out.hlsli@JVsOutputLitForwardD1@S 0 p{k[-BC`@ oM[ !17930:E C` "h !0 B/LgZD!I p +`,bK3XM.̂8 s;+s[M9C`&@M mn40 p877E Ф,;HpaL0 j9`MAVM e-Ln%mk-LM,m-m@*̍M~CvVFGv&FdCbW6F&D#ddCF'D#C#aȲW4@=yzDGetTBN2:*!' 0:4<& 179&  +d٦a><>"e-Ln%mkl-LKLm-mꬌN M̌l.ͪltsVF'Vw&UfV6FfU6dCbW6F&D#dȲ,4@H @`Vז6VF7akKs s+ +"A c33!+{"A c33" Al$VM@%!X' psyC #+{Isc#+sAccK4) s# #"2b+хɑ IeYؕѽ55YXؕѽ5imX I ̠ `-jTb%XB%%@.]Yїӗm!g.̍,LLH (+'ĮlM- F*- (&ĮlMFHF HkCSIRf`e`YVYiX5*141@P@FH,̬nm#$EdEffV7WdCbW6F&D#dȲ$IMĪ P =DZYK[YYY\ٗ [ڠ YY\P[YQ^ ,̬nLN,( (+'ĮlMF* HkONN"3432:9<422#926AYY\P[YQ^\ٜ[PVPSSSSֆ"I$4@X L, Dpow5t~j6IiX5@e!Yl +?BRDF_specular@@YA?AV?$vector@M$02@@MMMMM$halff@V?$vector@$halff@$02@@@Z,I$124ZH P` @`$$EdE6G'&VGF.GH,mN.M. (+ HkÐ$ɦb[JB\."9:4:7#,j?distributionGGX@@YAMMM@Z&.!  I}ɥYͥ ~Ƭ򀀲VMJ]D9 :+{k+˛jKCz+c +#Mѡ ɕѕe5555im $I6 &B/H { +jjZ5!YAdب?BRDF_fresnel@@YA?AV?$vector@M$02@@V1@M@Z,K6 0&@%BC4THɕ͹M ~ئր~~H䀚H`dbVM?iI la$P%h"'|b,Т-./@4PC30:<NmatrixC E G`=>H @a8|,b6=0pE G`?>H b1@ +‡ h /E ԆG`Q>H @d1@C +‡  "hLA#05C>H e8|,b7=0_42 C l"hC#0EC>H g6@1a1 +Rzi@!*kyyZ Xf Hkj̭L̬Lhꇤ-N. ffHhԈj7960:4 DtTb$!#h$%@C$%9>4.B.Z alpha2D"a `@6.@. DDڢT$! @[P˃]ѸX8D%@E9$@!Lf\H_?CtЬ%:$@쭭N.o-i\H_?C %I$@Cln\H[БJDD%ЄOd0.B5N" `ȣq "q;pYtJ8Q0 })q "4G*K:J ] ؙXݔFٵձMlGٵM r[X؛]eG|$LLԤMdN[X YY[ܔ`E2V'7VfVV6%;dx.source.argsSPBbW&76% 'dx.valverSSC2FV&FV6%H3dx.resourcesS]DBWFF67E8uCbVvD6EFW6%`;dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq )` @; a~qۆ <PEAD %am +p LD4BX3\3~q&0 <<mpK,_ܶ T;/MNDP_ܶ%H;?фmpS a~q,KC`Pa A,)D7@I RFQvSx%S\%Wn3tԦ/0c朳7FКs{c朳7F0 c8b6F Llt)KƯgο0F0:c / `0F 30QC&,LZ 0A8lap ‘ C&.L_ 0A8a1 #& L` + B0c@Ax3b` U=B0aXgBτ` `@ +8Raƀ11@f0F 2l!& @>3X76|& Lf|& +@> A|& C@>)g  > '/Ìy7#`Po 'a/Ä` & {A0@,0F  \`,03a 7l0b Il`' `@ 8 & A0N & A0X"8`ƀPA0X" D> |&  +L#`Pz3:0 AQz?n?L#`PDCz h.3;h&0 h L6B|f vXxl L6B|& A0(xzAxF  ?衷& A0(xz ``@ &HA!1 a`@ *h`"τ` A> aC>pÌ <#`P(} aC>PÄ0b EX?0c@ L=B/Ì!<#`PDK3 k1H`Ì +<6$ |& L6$0F  V\f X1@.Vp V0F  U\& A0(삜²PbwF q\·& A0(BA ``@ &ZY|cPbw, #A5c#`Hgƀ Uό1 {L`Ì1 +<#`PE83C3D\Kψ {LÄ0b ^0?0a A?o1?q/>#`P.3 {LÄ0b ^0?0c@N A?̄n6?q!/>#`PE,3C3D\Kψ {LÄ0b ^0?0a A?n6?qq />#`PE-3q3D\Kψ {LÌp3b ^0?0a A?Dm/?L#`P.3A3D\Kψ {aL`ÌKψ {LÌAA3b ^0?0a A?̄l/?L#`P.3C3MMψ {LÄ0b ^0?0a A?k6?4!4>#`P+33MMψ {LÌA@3b ^0?0a A?Dk/?L#`P933MMψ {QL`ÌA@3b ^0?0c@ A?̄j0?L#`P93Ë {L`ÌAl@3b ^0?0c@DXg1 r 3a,*!t3DN@4>#`PK|& L6|& A0(Dh"'`A0(Dch `@ +ѐA'Za1X/^ !1 tB 10/"1 t" 1@4f~1 tb 1X 4b ʀ +b1 vB 10 +4"1 v" 1@4h1 vb 1@4h 1 Ā|F 0q|"0f 1A0(L#@!B \'g@ +ӈ'Naƀ; 1@4 x1 ` |F 0y|´& A0(LC0A `@ +Ӡ'Jaƀja,Hh@ +'FaƀTa,Hh@ +'Daƀ`,Hh@ +ӈ'Baƀ`,Hh@ +'aƀВ !ό}cAB|f -Ƃ, Y1 V 1@B5n 1 d,Ha$3c@pe0$d![ ! L|f . 2H  A?hj?/dA  +xA0(`ca,3c@Xs/d B>3D Y1 h,Hh@ +-Hxaƀ蒱 ! 9όXЈ C[ÌaIh1C1 0@1@6|p 1 ,-fȂ@>35h1C 0,X3c@xX1‹ƂF Ѝp:f /  όAcAB 1 >k,HȂ}όAO }τ0b op?0c@B3b op?0a A?܅js?L#`P;w3HB[Ј ]Ì1x94b op?0c@DE A?Eiz?#E A?iz?auC#`PF>w3DxuCx b A0(cab !d0Ygƀ .~ȂO>3A]; Ԡ.~h@ +0/Daƀ .~Ȃ@>3DxuC#`p^E0c@T?dG@ A0(A$ȡA0(΃AD/h@ /aƀ8;41@3:A_ |f u؃HA0̣/B/ȂTό^_ш CiÌI_#b/V!όoid+gƀX44 ό{i4b` {F0c@EY +1 41@b>X \1 !4όeidgƀx/h@ 5Haƀ0-rȂG>3I\mC#`P<13I0mC#`P<1ê 1kÄ`gƀ _ 1@>x Z1 | 1@>x X0F y^CU& A0(A$5h@ h5haƀ85h@ `5`a1@>Vx V0- >3DJXG#`P<ì3%Ygƀ-h@ !6aƀ8# Y0g1@b?l1 R"A =S ,G#`Py3K(G 1 XPC.,G|f  #XA> >3Kj|& ;L#`PH?qî3O04>#`P?q %CoÄ` ,2`L 0 `Q 0 L#`PHC3DI, A"?k?L#`P?ï^gƀx 𱀐όqi^gƀx 𱠐όqi_gƀx όqiA 0/!"Q'Q0b ̋Gy A 0/!"&L# `~HG_L8a6mpnt6mwm|жnvoзmwn7oxm8nn9mmйnyoкmzn:o{m;nnWH]VWHm׆WHmWHmFPH}ӶPH}PH}PH}&PHVPHPHPHPH(PHF(PHv(PH(PH(PH(PH6mruovضmyvn~6owm7nn8mmظnعmynzm:nn;mmػnħA `|&0Զ5 mgCbP`|&0Ժ \e +DClTQ/TQEEm*AфgJP4DEDXnQ6DEDԵ$,0Q0$,0Q0,MPP4UK@  0BD0BDDK@ NK\D\=e !I̳/̳-y 1P9-qqMTD`OUD ,DK,DdLTD O5QSTAT `EDXILBC! < #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b ˟|n1 P`J106G! +hF `!a܀á!  @!P@$0P@  P@ |`@lt`H>pi0|pYh* +"B(7ISD ̳; rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !C <d2L &GC"J`$ +tʠ +0 +p4Jpi0|pYh* +"B(7ISD ̳; rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !C <d2L &GC"J` J@ʠ +ʃ(B(p2gK888@ yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$! 8™ p6$φdXbِ4 C4CC<(&dMhBP A !&fm@!6 @cf Cm |o 4ܸLY}AͥѥM +kP\bP`"۰b0dPf0q ' BMh@H5` ːcpe gD6k @ 5hxP99QmX@ @ 2X3h 1m A@tpm0A (COLOR AlX @ 33Ѓ Á)/02 BmX>?(3̀8=@PABTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+pu\Ȧʦ^2<27:<47)A(yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq &` @; a~qv <PEAD %am p LD4B3\3~q0 <<mpK,_ܶ T;/MNDP_ܶ!H;?фmpS a~qa A,+PQDQa]^Wɕ cb7FP{c <sAk9sκ c /|  a0Fpҥ~c*^7Fz#c7F+oc/g c    # `遦uPc0b lkz@# `ze0b [tox`# `}g0b |q}# `A$ +w`߈A w +j# ``BA(A$ +z`b0b F+BA |@ +n@# ``BA)A$ ~ +f0b F,A(BA  + +y# ``B(B*A$A p +@j0b F-+BA @ + +v# ``B)B+A<Ac s@Eq] +np&h& h1<A xaJq0 s&h <A {i }` v&h& e @>6|lHؠa 3b 9a5Y`K>6X1oyC|3b ; AX +A>V cDŽ >f|(ǐ3)g g@ | F ]`,0gψ `  [`'A0/1@ $``@ "10$! |l(3bp IC)hB&h @ +c)g`@ XA!10(&!"|3b M4 0b` MD`8g`@ )10('b"`c +1R@X +ucp +1!Bc!> +C|lPذ +cؐg`@ (ZY DB>#`O|, Xg3b \tBЍA$0X@B>6|F ๋7pAF  F ɋ02 F  \B>|,Xq aA>|% > |,(cJdBcA  X0ǂE>|,c" A>&|l| c >X ψ LjBB FA>,107" cV!  "ATX +E@ X򱷐Xǂ@> S AX0삈 XA>6|c;3ǠA> 16cl0`^B>{! +;|,03b G|# `}0b |# `}G_ DXBC>`P(P DTP<HdSFI0ISG1SV_PositionNORMALTEXCOORDTANGENTCOLOROSG14(@SV_TargetPSV04( 0NORMALTEXCOORDTANGENTTEXCOORDCOLORPSMainDCBCC"DDILDB`8DXILBC! 8 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L \2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXQJL~qۈ8(D@i88#! x #Lm00n@ PPr@ +|`0`@~~z P(@fq`pypZ(|zrR{(qw>0vxp6:0$"I^v8ҴCM>@4F! ɼI"J|`  20rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C < y> !2L &GCJ +)B((b( ( ($ʠF#A1O#r:g( u, #@hkP AA?AyK.L d!1 s# # sc+ssAcc4@ oM $Efe%&,f&gl&e@Ì-n]ݛ[ Ȍ<float{ 0b4 +X` E ,*`  E 4*` ( AaelementJؔ}չqHscd0Vp Q!&A`,bPhalf3|xX@f|H12 E =A` "hȠ0XM#t`0eu1&A 0"421 t 30:Bvector9? E ,A`F9H @a-b ? `jm0A@i&AH3[ 0:4<30:_11a\!0W"h@XWH `8|,bFUp ×L"h@XWH a8|,bUp $×"h@AXWH b8|,bFUp 4׌"hHAXWH c8|,bUp D`Cry}0 +p +LU1{c{sVp +TaT&AP*,:Vp`%e`s +4蹼̡ͽՑq}ѹͱ Y(Y=1݅ɑ{KK{s[M-@Mm40 m8H2792float2xX@d|1@s  0YT ` 0A@i &A *(,]P`40 n +`.̍n40 o87962E М,;d ,1@0  [r0tPI0,:l6 X5B,/ ,90241:2902370649A027:7962AUY՛PVO]ݛP U I[\P ֆ!^ajaA<{hQ 9~訄~~HH`dH`d~H䀚H`d`6 eЇU 0t,90241:29:0/192349A2:34231771AY[T[]ڛUPVO]ݛP U L"˲d!j@~B$, [][[X --m (+- ĮlM- FHk`eiX5I`\e-Ln%m NLm-m@f.̍,LLHȈ3GF&G&$EddCbW6F&DffD#dDffcCbW6F&D#$a)$)3020,+MĪ P` DNstandardBRDF_NO_NOL907092!)"//'& 179 0633  & 0633179& & M$IdYdɦdbLĄJLAM"!)"/432AYY\PVO]ݛP U PSSS#˒$I6 p&@%j&TBpH./shaders/include\diffuse_brdf.hlsli@'JdiffuseBurleyFixed432:9<422 179& & U<;!8cʄȌh?diffuseBurleyFixedFresnel@@YAMMMMM@Z$Idajv'b'0 H { +jj $ɦbY@ E 葀,bF>@ W "h`CH a1@BG`?=0E Ѐ葀pYMm} x "hDAH @d1@C +BG`&S=0P_34 #0E=0_42 #0E3=0_44#0kFllІmnnoxL+8H C ՙXؕѽ5 m[PIP=(-b3Hm pALިQɕؕѽ񘱽ѱ,H61  0QXPɕYؕѽ5m[P`&FUG7q{k c*!*ã+!!+{j" +ڶ"!"<.M ͭln.荪 xVF&VwV67FU4cCBUGW'W&CdCbW6F&D3m@eDHDMXTX[682)0I0 0626829 682)02 m *&""@lئ(?normalSampler@@3USamplerState@@ATVE ExхI՝Mɑ ~ؤަ䀀fʀ-ȋIs s+33+7E'W7FW'WF&TgfV&Ǔ6G6VFFC2pyC #+{Isc#+{kk{s˃+sAccK43Ir s+# + r&FF'#O2normalMatrix9$=@ @8ԥKseW6F&S6vVFFBCm.̭ $͍nA9U00`4 +f#``0iU00X `&>`0 1Y6l&A#*H V0`4:B#H H&m) - D]"DXGE Ф $y&`  <uint3x@X@f|1@sP'>` "haG `1@P'>` +a8 X @xaX 6%O,PH $jF O '= ' 'm.mL̬LhdNnNL̬L*m.m(. (hJ +|aQ?0,Ɵ09327 /P"*;Ir3{*K{s0¨TtM ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց̡}͹4(4(Ց}ѹͱ4(Ց}͹ͱ4(4(Ց̡}ͱ4(Ցɹͱ4(4(%1 QI% }͠ааФ4(4(PɕQȕѕɡ4(PɕɵQȕѕɡŤ4(PɕхI՝Qȕѕɡɤ4(4(LMхѕMɁȕѕɡ4(LMхѕɵMɁȕѕɡŤ4(LMхѕхI՝MɁȕѕɡɤ4(4(յ̀4(5(ȕɹѡ͠䰀ܰФ4(5(4($9MQ9 5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(рܽɱ5ɥ4(рɵ5ɥ퀀4(рܽɱYA4(4(4(ՙɁ ՙɁȕѕɡŤ4(5(р4(4(4(X=1݅ɑXM5X%1сѥ4(5(X=1݅ɑ4(4(ѹͥѥձѠѹͥѥĸ4(ѹɵ􀸽ɵ镡ձɵ5ɥ᱀Ѡѹɵ4(ѹЅс􀸽ɵ镡ձܽɱ5ɥ᱀ѠѹЅѹ鱀4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ѹܽɱÁձܽɱ5ɥ᱀Ѡѹͥѥĸ4(ѹɁ􀌽4(4(ȕɹ4(5(4(͕$9MQ9 5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(рܽɱYA4(4(4(ՙɁ$хх ՙɁȕѕɡŤ4(5(рх ͕%4(4(4(ՙɁ ՙɁȕѕɡɤ4(5(р4(4(4(LՍɕ ՙ$ххх ՙɁȕѕɡ4(4(X=1݅ɑXM5X%1сѱԥс%LY}%х%4(5(X=1݅ɑ4(4(сԥс%􀤹х ͕%%4(ѹͥѥձձх ՙm%uܽɱ5ɥᥰѠѹͥѥĸ4(ѹɵձх ՙm%uɵ5ɥ᱀Ѡѹɵ鱀4(ѹЅс􀸽ɵ镡ձх ՙm%uܽɱ5ɥ᱀ѠѹЅѹ鱀4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ѹܽɱÁձх ՙm%uܽɱ5ɥ᱀Ѡѹͥѥĸ4(ѹɁ􀌽4(4(ȕɹ4(5(4($9MQ9 5(4(р@M5X=1݅ɑѥLY}Qɝ5(5(р􀄱QLMɱѹЕ ɑ4(рхI՝􀴕хI՝QLхI՝MɱѹЕ ɑ4(̀Ѕ9ɵ􀸽ɵQLɵMɱѹЕ ɑ遨ȸĸ4(4(с͕̀ Ɂ􀘱͠ȝ4(ссI՝́􀘱ѡхI՝쀼н8UɝɁ4(ссх́􀘱ѡхI՝4(ссĸ4(4(̀ܽɱM9ɵ􀸽ɵ镡PQ]ɱЅ9ɵQ 9ѹɵѹЅѥ4(4(̀Q啁ܽɱYA͹遴ѹܽɱA4(̀إ݁􀸽ɵ镡Q啥4(4(5(̀Ɂ􀸽ɵ镡͠ԘԘ쀼н8U܀́ɕсс5(4(с81̅ɅѕѡܽɱM9ɵɥĔ4(с8Y􀐽ѡܽɱM9ɵإݥ4(с8Y􀄉͡8YĔ4(с}􀰥I՝́I՝4(4(̀ Ɂ􀠅͠ĸĸĸ쀼н8U܀́ɕсс5(4(с̀ȕѥYȀ8YܽɱM9ɵإ4(̀Ƚ՝I􀜕I՝IѥYȕѥYܽɱM9ɵ}4(4(с􀄱퀼н8U܀рѕɥɽ́́@ɵ$ххɁ́ȕձɁ Ɂх4(4(ɕ͹ɥИ4(ɕ͹ɥ􀰕ɕ͹ɥĘI՝́4(ɕ͹ɥĀ4(̀ձ Ɂ􀰕͠ɕ͹ɥɕ͹ɥɕ͹ɥȝхͥ4(4(ձMɕѡ̅ɅѕյȝĀФ䀬4(4(̀ȕձсхɑ I8Y81͕ ɱ}I՝ͱձ ɱձMɕѡɱإݱܽ͠ɱM9ɵ 4(4(ȕɹѠ͠ȕձѥĸѹ4(5(lS!p͡qՑq}͹ͱQ]^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\@ʈ@@@@hh@Țv@@@@hh@ؚv@@@@h@v@@@@@v@@@@f@vv@؈@@@@h@v@@@@@vv6*$902941:2.43/1923494$2'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVfBddT5U%$Ed4Ԡ0BVfVBddT5U%$Ed4ӠР06VGV3FV&u&6ǖӠР`F7BffV7W&V&GbF7BffV7W6&Ҡנ"WFW'BffV7W6&Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР–V&'VwV67W&7VGW–V&"VwV67נ`F7BffV7W&T'VbF7BffV7W6&bF–V&'VwV67bFfbFbFbҠנbFbDR"bb–V&'VwV67ӠbFbDfbDvWfӠbFbDbDvWƔӠ"WFW'BffV7W6&bDfbDBf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נРb&fvb$6G'FWB%$RV&w26W&gFfW"V'VBffV7W֠`FBffV7W&T'VgWFf$W6VƆbF–V&'VwV67bFfbFbFbҠנbFRV&w'6RӠbFRV&wg6F&BSc–V&'VwV67BsSc–V&'VwV67cӠbFbDRV&w'6"bb–V&'VwV67ӠbFbDfbDvWfӠbFbDbDvWƔӠ"WFW'bDfbDRV&wg6F&Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР`F7BffV7W&T'VgWFbF7BffV7W6&bF–V&'VwV67bFfbFbFbҠנ"WFW'BffV7W6&BffV7W&T'VgWFf$W6VƆ–V&'VwV67fbBf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР`FBffV7W6f$W6VƆbF–V&%VwV67bFfbFbFbbFbF"WF'&UfV6FfFwUvFҠנ26VrWR7W2FbFGvVVFBfW&G2fW&GV'"VwV67&VF'FB֠BV&r67V67&VF'FrrvҠbFrv–V&%VwV67–V&%VwV67ӠbF&rvrvӠbFr2FW'FWv&"&ӠРbFbbvWbӠB6b6F&BWV6BVRV&"6GFr&vvVb&v"VwV67FW&ҠD2&WFW6RV&w"vFr&vvVb&2FBVVF'6FW&֠BVvV&BVbVWr"65Vv6BVvW&BVRV&w"6Gr"V֠BVBVfVFbVWb&26rSҠ2UFGvBVbVWBrVF"FffB6RV&w"6GҠ26GbF"65VrScӠbFb"65VvWƔ"65VvWfӠР"VwbB2Fb"W66WFW&F֠bFbFV&bb2FW'FW""rRӠР"UF'"WfV6FfF2F'&VGҠbFb&2CRrRr"CRbR'r3"r""2'GӠvBbFVV'"Vw"WF'"WfV6FfFנb&"WF'&UfV6FfFwUvFӠ"WFW'bFb&ӠנР`F7BffV7W6bF7BffV7W6&bF–V&%VwV67bFfbFbFbbFbF"WF'&UfV6FfFwUvFҠנ"WFW'BffV7W6&BffV7W6f$W6VƆ–V&%VwV67fb"WF'&UfV6FfFwUvFӠנР`F7BffV7W$W&bF7BffV7W6&bF–V&%VwV67bFfbFbFbҠנbFb"bӠbF–V&%VwV67–V&%VwV67ӠbF&ҶӠbF2R&"7&23ӠbF26'bfƴӠРbF2$BS&"7&26'26'"7fӠ"WFW'BffV7W6&22$ӠbF2$BS&"7&26'26'ҖfӠ"WFW'BffV7W6&22$Bf6"֖FGWFFWFƖ–vF7&6BfFVF"֠נР6BV&B&W6F֠b6BVbVvbW6F&נDFg6BV26VvV"VFwWVBVbVvbW6F&FBV&֠`F7rVFGffV7WF֖FG&bF7bF7bbF2FW'FWFDFgbFrvҠנbF#3CcrvRsCcӠbF"RsScrvrSSccӠbFV&g6F&2FW'FW2FW'FWFDFg"rvӠBV"W6WF6F&ƖWF6rWbVF72V'Vנ"WFW'V&bV&g6F&ӠנРР0RFfAXVap͡qՑq٥}ɑͱ1]7<34:$''&! 6634929227<34:4479%#* 6634929243723"'/!)"/$)242"'/!)"/$)&43723$'$'242$'$')274"7;!)"0632"7;!)" 887<06340/3490637+-007;2:4372(064706673:<!5'9$ 0807774::9#2679:0631=444479:063=4444063940/34910630479<9<2<847+9<92:97063440906"7;!)" 887<069:077906340/3490637+-007;2:4372(064706673:<!5'9$ 0807774::9#26063 !2"7;!)" 887<40/3497+2:979:0779 !< !<0:02$'$')9:0779063"7;!)" 887<720606340/3490637+29"7;!)" 887<3497+79:0631=4479:063=44063940/34912:97479<9<2<847+9<9274 +k-Ln+m -L.L심,ͭlm-9 ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4( I]I}%9M}!I5( I]I}%9M}!I4(4(4(4(|!I]I}5Q15(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(I}M]%ii15(I}M]%ii15(5(4(L!I} =5A%1I}!1M14(L!I} =5A%1I}!1M1Ā4(5(4(AU}QIQ4(@%̸Ԙ5(@%̸Ԡ5(4(AM%1=94(T9%Q}a͠ĸ4(T9%Q}e͠ĸ4(T9%Q}i͠ĸ4(4( M}IYIM %QM4(LAIQ}M5A1I}= ) Q4(ՉՉ}ɕ}}ѕ}}ͽ}5(ՉɀՉ}ɕ}}ѕ}}ͽ}5(Չ̀Չ}ɕ}}ѕ}}ͽ}5(ՉрՉ}ɕ}}ѕ}}ͽ}5(4(ᕑ5(ᕑɀ4(ᕑ̀4(ᕑр4(4(с͠ссс4(5(ȕɹᡄᡈ4(5(с͠ссс4(5(ȕɹ4(5($9YI%9Qी5(4(с̀͠4(5(ȕɹ͠ీ䱀4(5(сѠсссс4(5(ȕɹᡴᡄᡈ4(5(сѠсссс4(5(ȕɹ4(5(4(@I %Mɕ͕5(LEIQ}MQीѡ̅Ʌѕ।4(XM}=UQ}A=M%Q%=9рLY}A=M%Q%=94(ЕɅٱ᱀奀LɅ|ͅхѕ٥局᱀4(Е٥L1ٕ|ͅхѕ٥局٥ܥ4(Е٥L1ٕ|ͅхѕ٥鱀٥ܥ4(Е U ٥L1ٕ|ͅхѕ٥鱀ٹܥ4(Е U Ʌ屽ٱL1ٕ|ͅхѕ٥ݱ4(Еɽ٥L|ͅхѕ٥彠٥ܥ4(Е٥L|ͅхѕ٥4(Е٥L|ͅхѕ٥4(Е U ٥L|ͅхѕ٥4(ЕɕѡɡЍѡɡ|ͅхѕЍ4(Еᕱэ=͕ѡЍͥ0͠Ѝͥ4(Еɕ=͕ѡЍͥL|ͅхѕЍͥ4(Еɕ1=͕ѡЍͥL1ٕ|ͅхѕЍͥ4(4( 15A} =II؅4(0==Alu5(T9I=11lչɽu5(I9 !lɅu5(1QQ9lѕu5(4(5AQe}MQIU QՍс5( 1I}U9UM}55 I5(HQUI9}5AQe}MQIU Q4($9%Q}5AQe}MQIU Q4(4( ]}UM}M I9}A=M5(Q}M I9}A=M}ͥ}5(Pa1Q !}%95(Pa1Q !}%94(4( ! -}QaQUI5( ! -}QaQUI}aAIЍ4( ! -}QaQUIIIe5( ! -}QaQUI5( ! -} UI4( ! -} UI}aAIЍ4( ! -}MQIU QUI} UI4( ! -}MQIU QUI} UI}aAIЍ4( ! -}MQ9 %15(рЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(̀Еᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(ɀЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(сЕᕱэ ͕Pɕ񘱽ɀЍсссс4( ! -}QaQUI4(ȕɹ0͠Ѝ4(5(рЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕PɕɅ񘱽̀Ѝсссс4( ! -}QaQUIIIe4(ȕɹ0ѠЍ4(5(рЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(̀Еᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ɀЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(сЕᕱэ ͕Pɕ񘱽̀Ѝсссс4( ! -}QaQUI4(ȕɹ0ѠЍ4(5(ЕᕱэЍЕᕱэ ͕Ѝ|%1}|}1%9}}Ĥ4(4(р ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(̀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ɀ ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(с ՙ ͕ՙ񘱽сЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕ՙԥсЍссс4( ! -} UI4(ȕɹmэu4(5(ԥс ՙ ͕LՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕H]MՍɕ ՙԥсЍссс4( ! -}MQIU QUI} UI4(ȕɹmэu4(5(ԥс ՙ ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5(ԥс ՙ ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0Ѝ4(5(ԥɀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ɠЍ4(5(ԥ̀ ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0͠Ѝ4(5(ԥр ՙ͕H] ѕɕ ՙɁсЍссс4( ! -} UI4(ȕɹ0ѠЍ4(5( ՙɡЍ ՙ ͕Ѝ|%1}|}1%9}}Ĥ4( ՙɠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4( ՙ͠Ѝ ՙ͕Ѝ|%1}|}1%9}}}}4( ՙѠЍ ՙ͕Ѝ|%1}|}1%9}}Ĥ4(ؽѽɕ ՙ ͕H] ѕɕ ՙɁсЍԥс؅Օссс4( ! -} UI4(LѽɕЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥɀ؅Օссс4( ! -} UI4(LѽɕɠЍ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥ̀؅Օссс4( ! -} UI4(Lѽɕ͠Ѝ؅Օ4(5(ؽѽɕ ՙ͕H] ѕɕ ՙɁсЍԥр؅Օссс4( ! -} UI4(LѽɕѠЍ؅Օ4(5(ѽɕ ՙɡЍ؅Օѽɕ ՙ ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙɠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}}}4(ѽɕ ՙ͠Ѝ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(ѽɕ ՙѠЍ؅Օѽɕ ՙ͕Ѝ؅Օ|%1}|}1%9}}Ĥ4(Սɕ ՙѡЍmեѡ ! -}MQIU QUI} UI}aAIЍЍt5(ՙѡЍmեѡ ! -} UI}aAIЍЍt5(ЕɕѡЍmɠ ! -}QaQUI}aAIЍЍt5(5(4(ԥсѕэ ͕PɕԥɀЍссс4(4( ! -}MQ9 %14(ȕɹmэu4(5(ѕэЍѕэ ͕Ѝ|%1}|}1%9}}}}4(4(L!I} =5A%1I}!1M14(̕ѡ而5(ɡ5(5(4(̀͸ѕɡ̀؅4(5( 1}AI %M%=95(ȕɹ؅и4(͕5(ȕɹ̕ѡ͙ѕѡ؅؅᱀؅͠4(5(5(4(mbEVp͡qՑq}ѹͱq7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""429:1:$7:30477$'30706' 30:2792"')"9:1::::30:477)/4730:779''30:2792"')9:1:9+#:::30:477)/4730:779''30:2792"')47:3$""')9:1:$7::430477$'30706' 30:2792"')"30:027: "'9:1:::::430:477)/473076' 30:2792"')30027: "'9:1:::::4:70930:477)/473076' 30:2792"')30027: "'3079629"')30:779''9:1:$7::-(230477$'9:1:$7::-(247230477$'30:7349!"'#$47:7$79!"'$'9:1::::#:330:477)/473076' 30027: "'30:2792"')3082"')9:1:::::-(230:477)/474729707747:42"')"9:1:::::7630:477)/4730:2792"')"  +7902941:2.8194942'vF"#Cr4"vF7"W6W&gWFҠ2'vF2"#CrrV6dD"vF7"W6W&gWF֠Р0fFVf%$Ed5ՠ0BVfV%$Ed5ՠР06VGVCffV7W%&Gf6ǖӠ06VGV3W6V&%&Gf6ǖӠ06VGVSf%&Gf6ǖӠРBffV7WFV֠0BVfVBddT5U$T$EӠ0BVfVBddT5U$U$Ӡ0BVfVBddT5U%T%T"Ӡ0BVfVBddT5U%T%TeUD2Ӡ0BVfVBddT5U5BӠР0fFVf"$EdEddT5UԠ0BVfV"$EdEddT5UBddT5U%T%TeUDBddT5U$U$BddT5U%T%TBddT5U$U$BddT5U%T%TBddT5U$T$EҠ0RFf֠РҔ6&f6VFB6G'&VGbV6F֠Р0BVfV2U4E%ĔӠ0BVfV2U4E%T4Ӡ0BVfV2U4Eut"ӠР0fFVf"$Ed5U4EԠ0BVfV"$Ed5U4E2U4Eutՠ0RFf֠РrTVF'6FGWVF&2Fvv֠0BVfV2U4uŔ4DӠ0BVfV2U4uTTӠ0BVfV2U4uTTT"Ӡ0BVfV2U4u5Ĕ42Ӡ0BVfV2U4u5ՔDutBӠ0BVfV2U4u5ՔD5$%UDUDRӠ0BVfV2U4u5ՔD5$%UDUD%bӠР0fFVf"$Ed5U4uԠ0BVfV"$Ed5U4u2U4u5ՔD5$%UDUDԠ0RFf֠Рb$W6V֠0BVfV2U4eTӠ0BVfV2U4e5Ĕ4Ӡ0BVfV2U4ee$U4T"Ӡ0fFVf"$Ed5U4eԠ0BVfV"$Ed5U4e2U4e5Ĕ4Ԡ0RFf֠Р2VV֠0fFVf2TT5U4T$ՠ0BVfV2TT5U4T$Ӡ0RFf֠Р`F7"$EdEffV7WbF7BffV7W6&bF–V&'VwV67bFfbFbFbҠנ0f"$EdEddT5UBddT5U$T$Eՠ"WFW'BffV7W&V&GBffV7W6&Ӡ0RƖf"$EdEddT5UBddT5U$U$ՠ"WFW'BffV7W$W&BffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%Tՠ"WFW'BffV7W&T'VBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%TeUDԠ"WFW'BffV7W&T'VgWFBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U5Ԡ2R&'&2BffV&WF"$EdEffV7WrFԠ"WFW'Ӡ0RFf֠נР`F7"$EdEffV7WbF7BffV7W6&bF–V&'VwV67bFfbFbFbbFҠנ0f"$EdEddT5UBddT5U$T$Eՠ"WFW'BffV7W&V&GBffV7W6&Ӡ0RƖf"$EdEddT5UBddT5U$U$ՠ"WFW'BffV7W$W&BffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%Tՠ"WFW'BffV7W&T'VBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U%T%TeUDԠ"WFW'BffV7W&T'VgWFBffV7W6&–V&'VwV67fbӠ0RƖf"$EdEddT5UBddT5U5Ԡ"WFW'BffV7W6BffV7W6&–V&'VwV67–V&'VwV67fb􆔲Ӡ0RFf֠נР`F"$EdE6G'&VGbFrvbFҠנ0f"$Ed5U4E2U4E%ĔԠ"WFW'B6G'&VG&ĖrvӠ0RƖf"$Ed5U4E2U4E%T4Ԡ"WFW'B6G'&VG&T6rvӠ0RƖf"$Ed5U4E2U4Eutՠ"WFW'B6G'&VGvtrvӠ0RFf֠נРb6rBƤfҠ`F"$EduVVF'6f6&ƖFbFrvbFfbFbFbҠנ0f"$Ed5U4u2U4uŔ4Dՠ"WFW'rVVF'ǖ6FӠ0RƖf"$Ed5U4u2U4uTTԠ"WFW'rVVF'TVfӠ0RƖf"$Ed5U4u2U4uTTTԠ"WFW'rVVF'TVVbӠ0RƖf"$Ed5U4u2U4u5Ĕ4Ԡ"WFW'rVVF'75Ɩ6rvfӠ0RƖf"$Ed5U4u2U4u5ՔDutՠ"WFW'rVVF'7ՖFrvfӠ0RƖf"$Ed5U4u2U4u5ՔD5$%UDUDԠ"WFW'rVVF'7ՖF6&'WFWFrvfӠ0RƖf"$Ed5U4u2U4u5ՔD5$%UDUD%ՠ"WFW'rVVF'7ՖF6&'WFWF'rvfӠ0RFf֠נР`F7"$Ede&W6VƆbF72W6V&7&bFbҠנ0f"$Ed5U4eӠ"WFW'b&W6VV2W6V&7&Ӡ0RƖf"$Ed5U4eӠ"WFW'b&W6V65Ɩ62W6V&7&bӠ0RƖf"$Ed5U4e"Ӡ"WFW'b&W6Vf$W6VƆ2W6V&7&bӠ0RFf֠נР`F7"$Ed5W6V&bFrvbFfbFbFbbFf2VV6E'WvFf62VV6&ҠנbFB"$EdE6G'&VGrv􆔲ӠbFr"$EduVVF'6f6&ƖFrvfbӠbF7"W6WFBrӠР"WFW'"W6WFӠנРb&FGrwwb&6G'FW2r2FWFRF6"C2V'7WFW6fve&6G'FWE'&e'Gf&vbW&7F"Vw2FVҠ`F2WGW6W646V7bF2FW'FWFDFgbFbFrvҠנ"WFW'2FW'FWv2FW'FWFDFgR'crvӠנrv–V&'VwV67–V&'VwV67נРrv–V&'VwV67–V&'VwV67נf62GF&G&$EdĄbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&bF72VV6&bFB'6V7V6Ҡנ0f2U4T$E4$TDbb"$EdEddT5UBddT5U$T$Eՠ"WFW'BffV7W&V&G"6WFffV7W6&Ӡ0R6W֠bF7&ƖWbVv–vFG&ӠbF2FW'FWBF&ӠbFb2FW'FWBFbVvӠf6BffV7W"$EdEffV7W"6WFffV7W6&–V&'VwV67fbӠ0f2U4T$E4$TDԠbF72W6V&"$Ed5W6V&rvfbB'6V7V62VV6&2W6V&7E'WvFӠbF7b"$Ede&W6VƆ2W6V&7&bӠ"WFW'BffV7Wb2W6V&Ӡ0R6W֠"WFW'BffV7WӠ0RFf֠0RFf֠נРf62GF&G&$EdbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&bF72VV6&bFB'6V7V6Ҡנ"WFW'2GF&G&$EdĄf"6WFffV7W6&rv–V&'VwV672W6V&7&2W6V&7E'WvF–vFG&bVv&2VV6&B'6V7V6ƴӠנРf62GF&G&$EdĄbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&ƖҠנ"WFW'2GF&G&$EdĄf"6WFffV7W6&rv–V&'VwV672W6V&7&2W6V&7E'WvF–vFG&bVv&bF7ӠנРf62GF&G&$EdbFfbFf6"6WFffV7W6&frvf–V&'VwV67f62W6V&7&f2W6V&7E'WvFbF7–vFG&bF7bVvf6&ƖҠנ"WFW'2GF&G&$EdĄf"6WFffV7W6&rv–V&'VwV672W6V&7&2W6V&7E'WvF–vFG&bVv&bF7ƴӠנРBDTssRf2FV&fWrFFV&&G7b&RV2WVB6G'&VGvt2W6V&%&Gf6ǖҠPF"UfW&7W&F77#RF"F7Ҡנ"F7"F7c"F7cӠ"F7"F7bWSSSSSSS"F7bӠ"F7"F7b73333333""F7b74444444"Ӡ"F7"F7bccccB"F7bgcccBӠ"F7"F7bcdcd"F7bgdcdӠ"WFW'"F7ӠנР`F'V&7VRFRFҠנ26GbFRb&6bF┲Ӡ26GbFR$"UfW&7W&F77#"2#3cC3cS3cc3SӠ"WFW'bF'RR$ӠנР`F7&G6V6VvtbF'RbF&Ҡנ26GbF"R䂷Ӡ26GbF26GVF2'GR䒗&R䒗Ӡ26GbF2FVF2'G26GVF26GVFӠРbF7Ӡ2FVF26Ӡ2FVF2Ӡ26GVFӠҠ"WFW'ӠנР`FButbF&bFҠנ26GbFB&Ӡ"WFW'&BBӠנР`F&G6VEfvtbF26GVFbF&Ҡנ"WFW'26GVFBut&26GVFӠנР`F2W6V&EfbFbF&bFbҠנ"WFW'&G6VEfvt&BbӠנР`FTז6VbF72&Ҡנ"WFW'BF2&bF7"#crS#s##ӠנР0RFfA\ap͡qՑq͡}ͱq߃7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""4243723) "#' /$)242) "#' /$)&41:2090/24949430:;30:=2:97030:;30:=2:97;030:;30:=2:97;030:;/130:=2:97030;/30=2:97030:;/130:=2:97030:;30:=2:97030;30=2:97030:;30:=2:97030:;30:=2:97;030:;30:=2:97;030:30:=2:97;030:30:=30:;0;2:97;063;4063=2:970063;4063=2:97;400634063=06300002:97030:1622;30:,30:=2:97;0<0930027:796230;30*!2:97:6*!'302:*!'3030*!30*19'*$*29819'*$/*928"$''7:**704279:30!704219'2:9730'':450:::9:09221730*<!<'30*<!<'30*=!='302:*!'30'30*7042*7:*79:30!19'2:9730'':450:::9:09221730*<!<'30*<!<'30*=!='30:404/=30:;28:430:7/28:2:97187/28:4<7/28:4<;28:274 +k-Ln+mkl-LKLm-[ ɥсЀ8%9901 ȥ́ȕ͕ٕ4( ɥс Ѐ́,Qȥ́ȕ͕ٕ5(4(LA U1I} I}!1M15(LA U1I} I}!1M14(4(Ց̡}ͱ4(4(4ɽсձɁШ818YXͩ5(X́Ш818Y4(4($9Y}5%9}%=I5($9Y}5%9}%=I5(5(4(l ܰ4́сȕѥɁѕɁѡͥ镑ɕ͉t5(сɥѥ с}с8!4(5(сɀ􀜝}}4(сɀĀɀ4(ȕɹɬĤAݡ8!ɨȀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(l ̰P̍ѕɥɽѥ܅ٕ́ɽȽ՝ə͉t5(сɥѥ с}с8!4(5(сɀ􀜝}}4(с8!ɀ8!8!4(ȕɹ8!ɀĤɀ8!ɤɀ8!ɀ8!ɀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(aPɽ݉ɥH5(сɥѥaс}с8!4(5(сɀ􀜝}}4(с􀠀8!ɀ8!8!$Ȁ5(ȕɹɀĔఀ켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(ͽɽa͹5(сɥѥaͽс}aс}eс8!̀ ̀`̀d4(5(с`!􀐽ѡ` 4(сd!􀐽ѡd 4(с`!`!ɠ}ad!d!ɠ}e8!8!4(ȕɹĀĔఀ}a}e켼٥ͥ@%ѕѕѥ局 Ɂ́٥@5(5(4(͡5(鼼ɭݥܽɑɕ͹ļмѡ̡4(сɥѥ ѡс}с8!4(5(сɀ􀜝}}4(сɠ8!8!4(с̥ɠĸɠ4(с̥Ѡ̥ɠ̥ɠ4(ȕɹ̥Ѡиɠ̥ɠɤĸиɤ̥Ѡ켼٥ͥ@́ѕ5(5(4(с%ѡ4(5(ȕɹ4(5(4(с9յс8Yс814(5(ȕɹȍЀᡀ818YĔԤ4(5(4(с QɅс8!с81с8YсX!с}4(5(с81}814(с8Y}8Y4(с8!}}Y!Ȩ8!X!4(ȕɹ8!}}Y!8Y}8!}}Y!81}ĸ4(5(4(l-İɽс͕ձɵѕɑܥѡх̅t5(с-сX!4(5(ȕɹȍЀX!X!4(5(4(сMс}с8Yс814(5(сɠ}4(сMY8YĀ4(сM181Ā4(ȕɹԀMYM14(5(4(LѡЕɵɁa5(сMѡс}с8Yс814(5(сɀɠ}4(4(сMѡY8Yѡ8Y8Y8Yɤɀ4(сMѡ181ѡ818181ɤɀ4(ȕɹȍMѡYMѡ14(5(4(᥵ѥɕѕLѡЕɵɁa 5(сMѡ ɕѕс}с8Yс814(5(сɀɠ}4(сMѡY81с8Y8Y8Yɤɀ4(сMѡ18Yс818181ɤɀ4(с􀜝}4(сMѡY818YĀ4(сMѡ18Y81Ā4(ȕɹԀȍMѡYMѡ14(5(4(᥵ѥсLѡЕɵɁa5(l!аTхС4ͭLݥչѥ4ɽѵ͕I͉t5(сMѡ ɕѕɽᡀс}с8Yс814(5(сMѡY818YĀ}}4(сMѡ18Y81Ā}}4(ȕɹԀȍMѡYMѡ14(5(4(͡5(鼼ɭݥܽɑɕ͹ļмѡ̡4(с ѡс8Yс814(5(ȕɹĸи818Y818Y4(5(4(̀ɕ͹9̀ձ Ɂ4(5(ȕɹձ 4(5(4(̀ɕ͹M̀ձ ɱсX!4(5(сՠĀX!4(4(ѡ́СȔ́ͥ偤ͥ́ѕͥɕн̡ݥ5(ȕɹ̅Ʌѕ$9Y}5%9}%=Iձ ɹĀձ 4(4(5(4(̀}MI՝̀͡сX!сȽ՝ͥ4(5(ссՠĀX!4(сI՝ĸȽ՝4(ȕɹᡘ͠I՝I՝I՝4(5(4(̀ɕ͹ɕ͹̀ձ ɱсX!4(5(̀Lձ Mсѡ͠͠䰀䰀䤰ձ Ɂ4(̀􀠀ĀLձ MсĀLձ Mс4(̀ѡX!X!Ā4(ȕɹԀ|ٕ͠X!X!Ā|ٕ͠X!X!ĤX!X!Ĥ4(5(4(̀I՝IѥỲH̀ɵс}ɠ}ɽ՝ͥ4(5(ȕɹɵHĀ}ѡĀ}}4(5(4(5(lzWxD:\NauPrototype\samples\sceneBase\..\..\engine\core\modules\render\include\nau\shaders\shader_defines.htd .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAAaN.- mAAEA-l.l -AaA-l.l dṋAdA-l ĭl -l.l -NGgṋ,d.m -m, $mn D,d-Ld .LAAAAAAd譭 ehe$̍ i)DmlͥAAa,ͭ dJ(hkʉ +ĦAa,ͭ dhkJ)jKihk*IAa,ͭ dJ)(hk*I$FAa,ͭ $IJ*()i)(hk*I$FAa,ͭ DȈh*)(hk*I&FAa,ͭ DȈh*)) kʉ +$AAa,ͭ ))kj))Kɩhkʉ +$FAAa,ͭ d +)(I) Aa,ͭ d +)(諨)ij*ɪdAa,ͭ )뫨)ij* ƬAAa,ͭ I(KȨH J( HAa,ͭ d*kKȨH J( dJAAa$͌ k nnAAdhe͍-DmlͥAAa,ͭ dJ*((+ /dAa,ͭ dJ*(( /dJ*((+ /AA-l.l -NGg-L,ͭlAaAdm N,lMGgN..M,M̬LJ, dJ*(( I(KȨH J( +eAdm N,lMGgN..d*oM̬LJ, dJ*(( e*kKȨH J( +eAA$͍-ͭ D $mM,M̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. M,M̬LJ, /eAAA$͍-ͭ D $mn*oM̬L,lMGgN..D̬L),AdADN D̬L)e.Ln. e*oM̬LJ, /eAAAAam k nnAAi͍-DmlͥAAa,ͭ di( N, -,N, od-Aa,ͭ di( +N, -,di( N, -,AAa,ͭ I(kHȨH +-,dL̬Ldi( +I(KȨH J( -,Aa,ͭ d*kkHȨH +-,dL̬Ldi( +e*kKȨH J( -,AAa̍, k nnn.%i*i'fC0.BK*ps_6_0Z($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kCc.p...... !^eHx +psd0˽ `Pyї K~ȋ/˾lH%_@D^%^~A^eC 2" /~ 9+s+33+ D^@&dE^Ed L` 6 R2&"//l@dVD^%^؀BɸB a0A Ŀ$23 /Lkr/ ,SK6˴lDe`f /+3y! lhfd!.SV_PositionD $ۆ@^& 7AH LL @I)i0e6,393;633aCkIhPU_陝x_AtTDa&gzfg&^t꙰ˆ &gzm&^t z&l&bIjdm6,j693;63j3m)Ia2eE&wVF7AH MLLlf6sl(!Feinput Dn_`XG=>`z`: Pu ' @O#0XG=*`z\`H: u4X+{A c3cY!t`,bfu:00E 4B8N` +6u:0p ꤎA `#@2!%C:.хI՝Ku ]Yӛ\[۸xa2XG=: 0udʆ1dxtI՝͍K>J[][ܸxPK9N Da|a``7.BG,ZR t&F66V&6.@GP Q啍K!viewD}v`e@- (Mn\<ppzc #C,%7q "P?=$ + -l\<܏P L ɍK \X]޸x %392621:q "??+c zc{ !$D7q "(1BU#a9:0):23:q "`BHp{k c!(qQ +%A`,%@D\d0.B%LH% `\KJE 3(q "/q?*f@ʈʆ%@D D\KyQH`\KԏJE DhT&@z.\B%@Md 0.B&G%h"Cq "4aB*Afp Dh"T&%@MAKQ 0!B14Q0.B&G%h"q "4Q?*AI0@ B`97q "4!F* pzC Bd; '*f†zp%@D$0.B'g' q ">;;!K 1`\XN` 4dK ,q "cQ?;%0.Bd,xg'$&G̭L,O(-ln\XNh )s+;3 +{ 2u[ %@Ƀ@w bFDТ|JոأhD,܈ӸAffV7W6.@&@I%x `\H[JDR3aC D"~Tb$!#$%@ԅC$%4.B. alpha2Dba `@6.@.Z DDT$! @[R˃]Ҹ8D%@9$@!Lf\H_ؒ?CtЬ%.:$@쭭N.o-i\H_?C %/I$@Cln\H[JDD%8Od0.B5N" q "BpYtJ89Q0 )q "4N*K_J ] ؙXݔOٵձMBeTٵM H[X؛]TRU^EVjWvW[X YY[ܔ`\l̽ɍ9M [XKܔ]ؕͥM ]]ܔ^̡5M \[Xܔ e,хѥMbfإ%MхѕM lK\[ܔnyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq )` @; a~qۆ <PEAD %am +p LD4BX3\3~q&0 <<mpK,_ܶ T;/MNDP_ܶ%H;?фmpS a~q,KC`Pa A,(D7@I RFeW0W2Ur6@lԦ/0c朳7FКs{c朳7F0 c8b6F LIr4m| c7F  c 70Q&,LX 0A8fapᨅ a &.L] 0A8za &;L_ 0A8ap ‘C&>L 11A8dbp ‘'&GOL a1A8bp( !-&ZL r1A8bp /&GhLј 1A8Xcpል !c6&mLݘ 1A8xcp AC=&|L 1A8cpᰏ D&GL )2A8Vdp# `y`0c@A |AAL# `yb0a$ +0b (pq|@A |AL# `' +}f0a$ +p~ ݌ b PCÄ0b +x PÄ0b +BB)| PÄ0b  +,0b ,=?0a$ P +`a0a A1 ?O9?L# `Ȃ)(L#`PBnCNA (p +@ +0 PÄ0b  +-B*B0b -a?0a$R +e0a Aq ?āX9?L# `؂*)L#`PBr0CNA ( + +|pA ( + +qA ( + +~ pCÄ0b .+0b /`g?0a$ + k0a A ?Zg?L#`PwY PÄ0b E/ph?0a A ?Zc?L#`PwX оÄ0b E/ph?0a A ?Z??L#`PwO Ä0b E/ph?0a A ?Z;?L#`BPQA\W+\3D8P A ?L/?03D8P&00h1L#`lp,Bp38x A1?L4?038x&„0b 8A5B-7c@hBL B0a& „`CgƀX3τ`g! 3c@-`ga 3a A?O;?0b ; +#`PCN C*Ä0b ; +-?0c@3b ; +-?0a A?BK9?L# `0hVQӌQ?|f :~,L6X03c@Ac !> L` + B0c@A3b` 3X >6|& Lf|& +@> A|& C@>)g  > $/Ìyp>#`P +[ $/Ä` & {8A0,0F \`,03a l0b \Hl`' `@  & A0H & A0R"8`ƀPA0R" D> |&  +L#`PȄ _3:0 A!-?Z}?L#`P _ h+P3;h&0 h L6B|f vXxl L6B|& A0(rByxF ȉ& A0(rya ``@ HA!1 a`@ h`"τ` A> >A>Ì <#`P 0Cj >!>Ä0b Op?0c@ L:B/Ì!<#`PJ3 haHÌ +<6$ |& L6$0F Zbf X1@b.|h|0F Zb& A0(²PF  ;Z"& A0(梎 ``@ ZYcP, #A`#`AHgƀ Uό1 xLÌ1 +<#`P2y3D\KЈ x1L0Ä0b ^ q?0a An?[?q/B#`PE2x xL Ä0b ^ n?0c@N + Aa?D[?q!/B#`P2y3D\KЈ x1L0Ä0b ^ l?0a Ay?Z?qq /B#`P2Cz3D\KЈ xL@Ìp*4b ^ h?0a Az?Z?L#`P2qCz3D\KЈ xLÌKЈ xAL@ÌAA64b ^ e?0a Ar?DY?L#`P21y3MMЈ xL0Ä0b ^ c?0a A?ȄX?4!4aC#`PE2Cz3MMЈ xAL@ÌA@64b ^ `?0a Ab?X?L#`PE2Cz3MMЈ xLÌA@64b ^ =?0c@Є  A{?DO?L#`P2x xLÌAl@64b ^ ;?0c@DЄ Yg1 r 3a,d*!t3DN@4aC#`PمK|& L6|& A0(a"'A0(ŒA `@ (!'Ha1Xi/^ !1 tB 10j/"1 t" 1@"4 1 tb 1X/b ʀ +b1 vB 10/"1 v" 1@b4 1 vb 1@b4艟1 Ā|F  ;zf 1@A0(FB \'h@ 'taƀ; 41@b4N艜1 ` |F  Sz"& A0(F `@ 8'paƀja,h@ Ѱ'laƀTa,h@ Ѡ'jaƀ`,h@ 'haƀ`,h@ ј'baƀВp#ό}cF|f -,Y1 V 71@41 d,a$3c@pe0nd![p# L|f . 72H An?M?ydA  +ȣA0(ZÍ",3c@Xsyd B>3D獅Y1 h,h@ ؈a-naƀ蒱p# 9όXш [0ÌaIhG1 0@>1@b6hH1 ,-Ȃ@>35hG 0,X3c@xX1‹F  :Bf / 7 όAcF 1 >k,Ȃ}όAO }τ0b o`=?0c@B64b o`=?0a Av?EO&?L#`PF(vC3HB[҈ ]Ì1x4b o`9?0c@D( A?N-?#( A?M-?auJ#`P+vAC3DxuJx b HA0(zÎb H%d0E*Ygƀ .RɂO>3A]; Ԡ.Ri@ a/jaƀ .Rɂ@>3DxuJ#`pF^E0c@TdG@ HA0(c$A0(D/fi@ +/daƀ8;Y1@f tHb,P}1K& +A|f ux% FA>3:A_̒ |f u؃A0ƣ/B/fɂTό^_҈ iÌI_̒#b/fV!όod+gƀX4Y ό{4b` UzF0c@,Y +1 Y1@>JP1 !Yόedgƀx/fi@ +05naƀ0-FɂG>3I\m1J#`Ṗ)aÏ3I0m1J#`Ṗ)a aCkÄ`gƀ _ 1@>Lp1 | 1@>Lp~0F S\& A0(נ$5i@ +5baƀ85i@ +5ba1@>|p|0- >3DJXAN#`Pԇ)3%9Ygƀ-i@ +068aƀ80' 9Y0g1@?N 1 R"A rS ,AN#`Py3K(AN 1 XP.,AN|f   'XA> >3Kj|& ;L#`P,3O04aC#`P+C "oÄ` ,2!L 0 `Qф  0 L#`P,3DI, A"?Os?L#`PH,^gƀx όqi^gƀx όqi_gƀx όqiA 0,rQ'Q0b  ܇y A 0,r#L# `}G_L8a6mmnq6mtmyжnvoзmwn7oxm8nn9mmйnyoкmzn:o{m;nkVH]&WHmVWHmWHmPH}ӆPH}PH}PH}PH&PHPHPH׶PHPH(PHF(PHv(PH(PH(PH6mouosضmvvn{6owm7nn8mmظnعmynzm:nn;mmػnħ5 `|&0Զ) mgCaPf`|&0Ժ \d +DClTQ/TQEEm*AфfJP4DEDmQDEDԵ $,0Q0$,0Q0,MPP4TK@  0BD0BDDK@ NK\D\=e !I̳/̳!y 1P9-qqMTD`LUD ,DK,DdITD O5QSTAT`4DXILBC! + #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b ˟|n1 P`J106G! +hF `!a܀á!  @!P@$0P@  P@ |`@lt`H>pi0|pYh* +"Bx4E0,< 0( L rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !C <d2L &GC"J`$ +4ʠ +04JӓTS6g =@Pa ==Im 6, )A( A) +r:*rڰ)A( {p~ +aR~ +0A(Lӓ6g +U`=>V\a` + +d*LnPx"@> 6aZ6q  30 qHs /62sig_stD6( +PpU\A2<27)ф .ͮLnJP!sC #+kz#+c e\aP υ.,..mntP ..l.lJ`u\Ѕ e΍LnnJ yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq &` @; a~qv <PEAD %am p LD4B3\3~q0 <<mpK,_ܶ T;/MNDP_ܶ!H;?фmpS a~qILDN,$f8cddca41634f93dad9663ee796fe67e.pdbHASHܤ4=cyo~DXIL `yDXIL BC! p #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@MAba)@ b ˟|n1 P`J106G! +hF `!a܀á!  @!P@$0P@  P@ |`@lt`H>pi0|pYh* +"Bx4E0,< 0( L rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !C <d2L &GC"J` J@ʠ +ʃ(B(p2gK888@ yLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$! 8™ p6$φdXbِ4 C4CC<(&dMhBP A !&fm@!6 @cf Cm |o 4ܸLY}AͥѥM +kP\bP`"۰b0dPf0q ' BMh@H5` ːcpe gD6k @ 5hxP99QmX@ @ 2X3h 1m A@tpm0A (COLOR AlX @ 33Ѓ Á)/02 BmX>?(3̀8=@PABTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+pu\Ȧʦ^2<27:<47)A(yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq &` @; a~qv <PEAD %am p LD4B3\3~q0 <<mpK,_ܶ T;/MNDP_ܶ!H;?фmpS a~qa A,+PQDQLLq\0Fpҥ~cb7FP{c <sAk9sκ c /|  a0F){c/ 70Fcl6F0:| 0F  # `偖t@b0b ljy0# `yd0b tnpwP# `|f0b |p|p# `A$ +vP~߈A pvi# ``(A$ +yPb0b +A {0 +m@# ``)A$ +}pf0b ,(A p +x# ``(*A$1 ` +0j0b -*A 0 + +u# ``)+A<AS s@Eq] +np&h& h1<A xaJq s&h <A {i }P v&h& e @>6|lHؠa 3b 9a5Y`K>6X1oyC|3b O; AX +A>V cDŽ >f|(ǐ3)g g@ 0| F ]`,0gψ `  [`'A0/1@``@ "10$! |l(3bp IC)hB&h @ +c)g`@ XA!10&!"|3b OM4 0b` QMD`8g`@ )10'`"`c +1R@X +ucp +1!Bc!> +C|lPذ +cؐg`@ (ZY  BB>#`O|, Xg3b O\tBЍA0X@B>6|F ో7pAF  F 02 F  ‹ZB>|,Xq aA>|% > |,(cJdBcA  X0ǂE>|,c" A>&|l| c >X ψ LiBB FA>,107" cV!  "ADX +E@ X򱷐Xǂ@> S AX0삈 XA>6|c;3ǠA> 16cl0`^B>{! +;|,03b ȉԇ|# `H}0b ȉԇ{# `H}G_ DXBCa~![@7C DTl29:,:SFI0ISG1hqxPOSITIONNORMALTEXCOORDOSG1htz SV_PositionCOLORTEXCOORDPSV0(4) 0POSITIONNORMALTEXCOORDCOLORTEXCOORDVSMainC +CBDD BpppILDBP0` DXIL80BC! #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L -2" d##ㄡL L@ +@@ 3s`0G@$AH) HrS98rp A8 '!$ۨb%&mDqPrpͰ( +A!BW)8bXH qđe#M 9 +DClTQ +>rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`G !C <d2L &GCJ +B(2(( ((JJb 1A#pbxx@y LFĆ Nmm=271 30:Bvector X12@ E %`0["(Z`@o4h ( E <%`0q element@Jؔ}չqHscdPdVp@Ya&A` +@BP l4蹼̡ͽՑq}ѹͱ  b5TGWGGm..m4a5rbMn4c9r+z{#aF'CȮlMnj-Dg4@A` "hr `i0A@i &Ap"@71@S#o +`"a2I0$7::float3xX@f|1@sT$`,bf>H `1@T$`0;< ʹ҃ ´ @p`Xt P@ ?0ۛ\["h@;H 1@SB +o +`aPI0GAHa0AU tp`p +lPa ~䀨䀀f~H䀚H`f-N**ph#bFGGé-N. nj-ƇWL"h`A!0W"hdA!03Z({H @a8|,b0p_21 $×"htA!0%3^({H @c8|,b0_31 D׌"hA!053r({H @e8|,b0p_41A d"hA!0E3v({H @g8|,b0 P,B-B.B/B8C9C:C;:7i`]Lؾ̃um&yI @,W(E `p ~ʄ䀀f~HH`fH`f-NB>>aJ;Cz[f@}8Еᑣ*ã+!+{1c{ cY6!I X hꇄ NLĮlMf(h?Ј6862SamplerState `2 0 ̅TMMхѕm[( ”vF6Cf4+?O!) m'j), (+'jj. H hĮlMFHfJ34:9 +.1  0BSOϏTSXPVOPS\P\\Ќ]ݛP K̶@ ! *LightPos.2\d1@S<34:947 *:::: *$7:: -179& !m +4qBf@VЇ~ pQO@@@p.L ĪLn.mð;qQ"*;Ir3{*K{s0AO`x // Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +// Constant buffer for test local material properties. +cbuffer TestBuffer : register(b1) +{ + float4 color; +}; + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +#ifndef GBUFFER_VARIANT + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; + +VsOutput VSMain(VsInput input) +{ + const float3 LightPos = {0, 15, -30}; + const float3 lightVec = normalize(LightPos - input.position); + const float diffuse = saturate(max(dot(lightVec, input.normal), 0.2) * 1.3); + + VsOutput output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.color = float4(diffuse, diffuse, diffuse, 1.0f); + output.texCoord = input.texCoord; + + return output; +} + +float4 PSMain(VsOutput input) : + SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color; +} + +float4 PSMainColored(VsOutput input) : SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color * color; +} +#else + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4 worldViewPos; +}; + +VsOutputGBuff VSMain(VsInput input) +{ + VsOutputGBuff output; + + float3 pos = input.position; + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = input.normal; + output.p2e = worldViewPos.xyz - pos; + output.texCoord = input.texCoord; + + return output; +} + +#include "gbuffer_base.hlsli" + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + float4 screenpos = input.position; + UnpackedGbuffer result; + init_gbuffer(result); + half4 albedo_roughness = tex.Sample(sampl, input.texCoord); + albedo_roughness.a = 1; // roughness + half4 normal_smoothness = half4(0, 1, 0, 1); + float3 normal; + normal.xyz = (normal_smoothness.xyz * 2 - 1); + // init_albedo_roughness(result, albedo_roughness); + init_albedo(result, albedo_roughness.xyz); + init_smoothness(result, normal_smoothness.a); + //init_normal(result, perturb_normal(normal, normalize(input.norm), input.p2e, input.texCoord)); + init_normal(result, normalize(input.norm)); + init_metalness(result, 0); + init_ao(result, 1); + return encode_gbuffer(result, screenpos); +} + +GBUFFER_OUTPUT PSMainColored(VsOutputGBuff input) +{ + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + float4 albedo = tex.Sample(sampl, input.texCoord); + init_albedo(result, albedo.xyz); + + return encode_gbuffer(result, screenpos); +} +#endif +,p͡qՑq}ѹͱq7<34:$''&! 663492922273:9:272972922<0)!222:0:072:7247:2""429:1:$7:30477$'30706' 30:2792"')"9:1::::30:477)/4730:779''30:2792"')9:1:9+#:::30:477)/4730:779''30:2792"')47:3$""')9:1:$7::430477$'30706' 30:2792"')"30:027: "'9:1:::::430:477)/473076' 30:2792"')30027: "'9:1:::::4:70930:477)/473076' 30:2792"')30027: "'3079629"')30:779''9:1:$7::-(230477$'9:1:$7::-(247230477$'30:7349!"'#$47:7$79!"'$'9:1::::#:330:477)/473076' 30027: "'30:2792"')3082"')9:1:::::-(230:477)/474729707747:42"')"9:1:::::7630:477)/4730:2792"')" XρH)J.k. lkṋL(lŅŅ,ͭkM퍬lK̍L+m-k-Lnk-L,ͭln ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(4(Ʌ5(4(4(5(5(̍5(5(Ёѕ̥̍С̡͕́́Ɂ5(5(5(4(4( 1M14(4( U } } =U9Q4( M}9Y} U 5AM} 1= -}M%i4( U 5A}9Y} }M%i4($II%9 }5A} }M%i4(H1 Q%=9}5A} }M%i4(H1 Q%=9}5A}5%A} =U9Q4(4(8U}5a}M-%99%9} =9M} =U9Q4(4(L!%9}9=I514(L!%9}5%MM%Y4(4a}5%MM%=9и5(4(1= 1} UI}AI%a }5(LeMQ5} UI}AI%aL }5(4(|}5(4( 偈4(4(LQI%9%e}%5A1ी5(LQI%9%eीLQI%9%e}%5A14(4(̡}5(5(ѕɁѱɥ}٥݁ ՙAɕLQI%9%e1= 1} UI}AI%a4(ѕɁѱɥ}٥݁Lѕ ՙAɕLQI%9%eLeMQ5} UI}AI%a4(4( ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡ ՙAɕ4(5(4(Mѕ ՙɡѱɥ}٥݁ՙ94(5(ȕɹՙ9х}ݥѡLѕ ՙAɕ4(5(5(4(͕|}5(4( 1M1偈4(4( =9 Q}ɕ᱀ɕፌ5( =9 Qɕ᱀ =9 Q}ɕ᱀4(4(1= 1} UIՙɁ =9 Q1= 1} UI}AI%a4(LeMQ5} UIՙɁ =9 QLeMQ5} UI}AI%a4(4(|}m,6" +-T4l`($C #+{Isc#+-8Aɽѽ̅ͽ̍ ͕ɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kÒZ[[[E\Lg< m.(MhÀyA0 }M ՙMiB{tAs/6 u&ɋVX Eil"4Lc@!@ \BjLĠ$' BbMkC@ hlX5\5`5"65dӓTSӆe.h5^6^c.bc.^C6Pa ==IMlzaYp׀טX lFnpzKK{s $6z ׈ x `1$a p׀ۘ ޘ ؆kl\nl~#9C|& A0p@`BP10`τ`B! B> ~CÌI A|??L#`PaC 8{p B4̌*#` X3FXgƀTA0 bP1@B(VV1 A0`ƀ6TF`M `4a& b0F  +0`M `4A& фA0Fa18 `4!& !0FaM `@ UX2( `4!& !0FaM 1ό] A rA0a A sA0aXp@g0 3a AF v A0a AV wA0aX@gl 3a A zPA0a A {A0aX@g0 3a A ~A0a A @A0aXAg1@H1 :A0(T `@ +s!Ba1@|H0F 0qR!}& A0(ATA `@ +s!Ba1@H0F 0vR!& A0(́T ` @ r\Xhf 1`P1HFp ` @ r\W(& A0`ap^!0F !Q\20F !Q\820F !Q\p20F !Q\xV0F !Q\<0F !Q\8;0pƀp v3m<еn8SH]3m>5o]gC]Pۖe|&0Ըa unegCndgnago`gCo@gXUD UDd;*AdB LTLSTAT`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L +2" d##ㄡL L@ +f`)@DAQ b 1 0 a b +1@QOCH>QJL~qۈa'!$?a!P"$R 0 TŐ .! Gsب "p%rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` +0 + ʡ$ʣP +1 ("(fțo,FQxD@yLFD oM $Efe%&,f&gl&eCLd@(  l x#22:32 l@e!6`q&D3A 4I 6 H$Qa]0P6A Aa6oy0a5Fi**iP\" Tֆ2(3( 2@NORMALA Ƞ ̠ 3 Pa ==IM +mPU Ƞ ̠ 6 6 ioe m..mPlB Tsa! ` ӓԆe2(3hA2 dPfCHe:<0AM hMEh̥}M\6 |~ +0 +U\A2<27)ф .ͮLnJP!sC #+kz#+c e\N%2<< 7707)B!sK+K" +A2<27:<47)t!s{s+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q #` @; a~qf <PEAD %amp LD4B؀3\3~q0 <<mpK(5=mpOD4!@m3\TD_6ILDN,$9839959aa21baffa6e7568a641b58cef.pdbHASH9nuhADXIL`8DXILBC! / #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L +2" d##ㄡL L@ +f`)@DAQ b 1 0 a b +1@QOCH>QJL~qۈa'!$?a!P"$R 0 TŐ .! Gsب "p%rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`g`!O@C @2L &GC"J` ʠ<(2(B oE!yfLFD oM $Efe%&,f&gl&eCLd@( a0(MfÀ$LfB, A !p6Da5Fi**iPHb x6ڶa!*®!#.ӓTSӆe l *zz" A6,`օ]5#.SV_Positionš AC aVpĕ,6,X& WlX A  Al DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+# `A70#`A|F у7F `фMфAM A0 =M!Mb18i˃фMфAM A0Pa F`4AFa4l A +rA0b +2t: A v A0b ,܁s +t,[ AU zPA0b -A t{ A ~A0b .tF  Rȅ\f @ p \ȅTHF  Rȅ\pb @ p \ȅWF  RЅ\21H$HAr!` @ p ]W(A0@t!^F  R\<1H$Har!DXBCY,_:(]4hd DTTx[[[SFI0ISG1hqxPOSITIONNORMALTEXCOORDOSG1 SV_PositionNORMALTANGENTTEXCOORDPSV0`4; DPOSITIONNORMALTEXCOORDNORMALTANGENTTEXCOORDTEXCOORDVSMainC +CBDC!C)B2C @ ILDBQ``DXILhQBC! W #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Lt#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $4-Pn?+ QEADHȘt2 rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPEP#Q P%QA$Fʠ + c1 @` + ypLFĆ Nmm=271 30:Bvector X12@ E %`0["(Z`@o4h ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A` +@BP l4蹼̡ͽՑq}ѹͱ `c5TGWGw$TgfFm..m4aB(l p{kaF7CȮlMnj-dg4pmE6H `1@w ( &2`0$@0461Em,bf Q70 AvVF8H!<]ۛ 30:Bvector9;؃ E ,A`A; ɴƒ ” @Xw9J!TL"h3Ppp AL >PVsInput @70ۛ\["hH;P  1@# +| +`aR0I0G!Pa0AU t{X-b3AۛUPYЌ]ݛP ж WAy mvpDhh8ɥ񘱽ѱаpYM-v 0bd1@s C`+ff4 >$`0bh1@ C`K&f4 >$` 1dd1@ C`Kff4 >$`1dh1@3C`k&f4 >$` 2fd1@sC`&kff4 >$`2fh1@C`.&f4 >$` 3hd1@C`6ff4 >$`3hh1@3C`>\^pr0tPvpxz`"v5VF7[ݴ| t0 Z@ @E `͂`>  }M ՙXɥ5̐ m[ܽɱYA1~Ȭ怎ʄ䀀f~H䀚H`f-LDHw +@Qɕؕѽ񘱽ѱ,I$HBh,0 hCW4cCBUGW'W&CdCbW6F&D3m`b$PBhN\X682)0I0~؀fʀ-LDKKl(bD"%\b\+! 3*K{s0AL\@@6 x0j!( \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBH[YZYYY[ٜ HH[YH[ [HB Л]XYٛ]XH[]\Z\]ZٜK˜XYUPY\Y]XLJ^[ ۛNBNBU]\ ]\Y] +LNTX[]]\X\Y]LNBHYȑPQԗUTRUBӓPאPQX[PY\ +\Y]LJ^[  HNBNBS\TSX\\H\]J^؛[ SH HL H LN؛[ [UHۛ\[[^ +SH H\ \]ڛ[N؛[YY\H\]\]J[ + +[U H\ۛ\[[ + L + +HLNBS\[\NB[\ \]ڛHH[J [ J\ \]ڛ H YJN[\ۛH[ +YY\ YY\ YY\ H YN[\ ]ۛHH\ ]ۛNB\][\NB_B[ TSXS\H\] +NȔUY]^[ HXH]TX[\X H\ ]ۛYN\]HX +H\ۛNB_B[ TSXۛ\S\H\] +ȔUY]^[ HXH]TX[\X H\ ]ۛYN\]HX +H\ۛ +ۛNB_H\YBӓPאPQX[PY\ +\Y]LJ^[  HN[ ݛUZNBNBS\ݑPTSX\\H\]J^S\ݑP[\NB[ HH\ \]ڛN[\ \]ڛHH[J [ J\ \]ڛ H YJN[\ۛ\HH\ۛ\[N[\ LHݛUZۜ ^H N[\ ]ۛHH\ ]ۛNB\][\NB_BH[YșXYܗX\ [HB‘PQSTTSXS\ݑPH\]J^[ ܘ\YHH\ \]ڛNH\ZّXY\\NH[יXY\\]NZ HXۗ[[H]TX[\X H\ ]ۛYNHXۗ[[ܜKHH [[\Z ۛ\[\[HZ + H  HLN[ ۛ\[Nۛ\[ ^Hۛ\[\[ܜ ^ + H HLN H[WXۗ[[\\ HXۗ[[\NH[WX\\ HXۗ[[ܜ ^^NH[\[\\ ۛ\[\[ܜKXNK[ݗۛ\[\\ \]ؗۛ\[ۛ\[ ۛ\[[^J\ۛ\[ + H\ L H\ ]ۛYJNH[ݗۛ\[\\ ۛ\[[^J\ۛ\[JNH[W[][\\ LNH[W\\ HLN\]HYיXY\\ ܘ\Y\NB_B‘PQSTTSXۛ\S\ݑPH\]J^[ ܘ\YHH\ \]ڛNBH\ZّXY\\NH[יXY\\]N[ HXH]TX[\X H\ ]ۛYNH[WX\\ HXٛ ^^NB\]HYיXY\\ ܘ\Y\NB_HYY! ZYW[YיXYܗX\ [Gyyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPIsc#+C #+"+3Ks+sAiPhP{{cI+jKK+B #+C1c{ i +K cKiPkP+si +K cB +"Jr:*jJJ*iPkPhP{++#;33+kPkPA c3!K33+zc{iPA c3+c zc{iPA c3 sc+szc{iPA c3{;Cs+caKs+ z;Cs+iP1c{ q{k ciPhPA c3i+ ccs+iPA c3 sc+syy)KC+ sc+syi+ ccKkPhPA c3)ã +# +c+#{ +{yy{kkPA c3 {yy{kkPA c3C #{iPA c3)kKK{szc{iPA c3)kKK{s iP1c{ i +K ciPiPhPr [+#;33+kPkPA c3 c+#{iPA c3k{{Cs+iP1c{ q{k ciPhPA c3i+ ccs+yy)KC+ sc+syi+ ccKy)kKK{skPA c3 sc+syy)KC+ sc+syi+ ccKy)kKK{skPA c3)kKK{s yy)KC+ sc+syi+ ccKy)kKK{skPhPA c3 {yy)KC+ {cy)kKK{skPA c3)kKK{s+s;Cyy)KC+ {cy)kKK{skPA c3C #{iP1c{ i +K ciP1c{ ycKs+iPiPhP +[+#;33+kPkPA c3 c+#{ +{iP1c{ q{k ck{{Cs+j +K ciPA c3i+ cc sc+sC #{yy{++#kPiPxyC++k  s3{kkP0c{ )s{#+szk cC1c{ qKiPkPA c3)sq{k cK+CqsKQACiqsSqYqIIiP)s)sSqYqiP+s)siPkP0c{ !+{#+szk cC1c{ )sKiPkP1c{ qs1c{ A)sscaIQ1c{ AaaaIY1c{ AiaiaaiIiPA c3a!{Cqssciqss˻KiPqssaiPqssQCaKiP+sAqssQYA c3AaaiIIiPkP@ c3akKs s+CA c3{cKiPkP+s!{C{ccA c3AqaqaqIIiPkP@ c3!+{#+ +c+#{ +{CA c3 c+#{KiPkP+s +CakKs s+C c+#{KQAyqIIQqYqyy sˣCKs;! [+C sC { cIq{C˛K c{Kc+c s#IC #{kPkP +[+#;33+ [:33+Cr [+#;33+933+KiPkP +[+#;33+93iPA c3i+ ccs+{ sc+s933+si+ ccs+iPi+ ccs+{ sc+sI+jKK+B #+C933+si +K cK933+s)kKK{s i+ ccs+{ sc+siPhP1c{ q{k ck{{Cs+1c{ A)s{#+szk cC933+sq{k csKai C933+sk{{Cs+cqyIIiPA c3i +K c933+si +K cQAq1yqIiP93sq{k ck{{Cs+j +K c1c{ Aq{k ck{{Cs+ci +K cKiP93s c+#{ +{A c3A933+s c+#{cI+jKK+B #+C933+si +K cK933+s)kKK{s+s;CQAq1yi +*jJJzrJ933+s {KiPyy93s c+#{ +{A c3A{C933+s c+#{cyqIa933+s {KiPyy93si+ cc sc+sC #{A1c{{Ci+ ccs+{ sc+sSIQY1c{{C933+sC #{SIIQAqyqIiP93si+ cc sc+sC #{1c{ Ai+ ccs+{ sc+sc933+sC #{KiP+s93iPkPhP{K#s zk cj{{Cs+C1c{ q{k ck{{Cs+cy1c{ q{k ccyA c3k{{Cs+KiPkPq{k c!+{#+szk cCq{k ck{{Cs+sKiPk{{Cs+ Cq{k ck{{Cs+sKiPkPhP{K#s [;33+szk cj{{Cs+C +[+#;33+93cy1c{ q{k ccyA c3k{{Cs+KiPkPs zk cj{{Cs+C93sq{k ck{{Cs+j +K cscq{k cck{{Cs+KiPkPhPr [+#;33+s [;33+C +[+#;33+93KiPkPr [+#;33+933+iPhP933+si +K c1c{{C93sq{k ck{{Cs+j +K csQq1KiPyyA c3i+ cc sc+sC #{93si+ cc sc+sC #{sSAqyqIiPyyA c3C #{1 Ci+ cc sc+sC #{KQAqyqIiPyyA c3i+ ccs+{ sc+s1c{{Ci+ cc sc+sC #{KQAqyIiPA c3C #{93si+ cc sc+sC #{siPA c3i+ ccs+{ sc+s93si+ cc sc+sC #{siP933+s c+#{93s c+#{ +{siPs [;33+szk cj{{Cs+C93c933+sq{k cc933+sk{{Cs+KiPhP933+s)kKK{s I+jKK+B #+C933+si +K cKi+ ccs+{ sc+siP933+si+ ccs+i+ ccs+{ sc+siP933+s sc+siP933+s {I+jKK+B #+C933+si +K cK93s c+#{ +{siP933+s)kKK{s+s;CI+jKK+B #+C933+si +K cK93s c+#{ +{sQi +*jJJzriP933+sC #{C #{iPyy933+s!K33+zc{ c+#{SAi933+si+ ccs+KiPyyA c31+s+c!J+c+Kq1yya+Cq1cq1ck{{Cs+KyyCAqi+3 K+Kr#+KyAqY+3 K+Kr#+KI1{!K+c+KiPyy933+s+c zc{a+CA c3A1+s+c!J+c+Kc1+s+c!J+c+Kc1+s+c!J+c+KKa c+#{c933+si+ ccs+KiP+s933+iPkP{++#;33+{+;33+Cr [+#;33+93KiPkP{++#;33+933+iP933+si +K c93si +K ciP933+sq{k c93sq{k ciP933+saKs+ z;Cs+i93sk{{Cs+iP933+s{;Cs+i C)ka933+saKs+ z;Cs+Q933+saKs+ z;Cs+KiP933+si+ ccs+93si+ ccs+iP933+s sc+s93s sc+syy!+{K)s{#Ks;QqI{+kP933+s)kKK{szc{93s)kKK{s+s;CQ93s c+#{iP933+s)kKK{s 93s)kKK{s iP933+s)ã +# +c+#{ +{!+{#+ +c+#{ +{C93s c+#{KiP933+s!K33+zc{93s c+#{i933+si+ ccs+Q93s c+#{yyQAii+KiP933+sC #{93sC #{iP933+s sc+szc{933+s!K33+zc{Q933+s sc+siPhPA c31+s+c!J+c+Kq1yyYA93si +K cB +"Jr:rzj +bqQAi93sC #{KIyya+Cq1cq1c{;Cs+KyyCAqi+3 K+Kr#+KyAqY+3 K+Kr#+KI1{!K+c+KiP1+s+c!J+c+Ka+C1+s+c!J+c+Kcq1c933+s{;Cs+Q933+s sc+sKiP1+s+c!J+c+KQAi933+s sc+sKiP933+s+c zc{a+CA c3A1+s+c!J+c+Kc1+s+c!J+c+Kc1+s+c!J+c+KKa93s c+#{c933+si+ ccs+KiP933+s {93s {iP+s933+iPkPhP{K#IsK:33+Cyr [+#;33++cKiPkP+cs c+#{+csq{k ciP+csk{{Cs++csi+ ccs++cs sc+siP+cs)kKK{s +cs)kKK{s+s;CiP+cs {+csC #{iP+csi +K cB +"Jr:rzj +biPkP{K#IsK +c+#{CIs{r [+#;33++ccA c3 c+#{KiPkP+cs c+#{s c+#{iPkP{K#IsKk{{Cs+CIs{r [+#;33++ccA c3k{{Cs+KiPkP+csk{{Cs+k{{Cs+iPkPhP{K#IsKr{k cCIs{r [+#;33++cc1c{ q{kKiPkP+csq{k cq{kiPkPhP{K#IsKj+ cs+CIs{r [+#;33++ccA c3i+ cKiPkP+csi+ ccs+i+ ciPkP{K#IsK sc+sCIs{r [+#;33++ccA c3 sc+sKiPkP+cs sc+s sc+siPkPhP{K#IsK +{CIs{r [+#;33++ccA c3 {KiPkP+cs { {iPkP{K#IsKC #{CIs{r [+#;33++ccA c3C #{KiPkP+csC #{C #{iPkP{K#IsKj +K cCIs{r [+#;33++cc1c{ i +K cKiPkP+csi +K ci +K ciPkP{K#IsK*kKK{sCIs{r [+#;33++cc1c{ )kKK{s+s;CKiPkP+cs)kKK{s+s;C)kKK{s+s;CiPkP{K#IsK*kKK{s CIs{r [+#;33++cc1c{ )kKK{s KiPkP+cs)kKK{s )kKK{s iPkPhP922*zjPkPA c3 c+#{ +{ +;+iP1c{ q{k ck{{Cs+j +K c +;+iPA c3i+ cc sc+sC #{ +;+iPiPhP822*zK+:33+C +[+#;33+93KiPkP922*z93{iP93{s c+#{ +{93s c+#{ +{iP93{sq{k ck{{Cs+j +K c93sq{k ck{{Cs+j +K ciP93{si+ cc sc+sC #{A c3A93si+ cc sc+sC #{caIiP+s93{iPkPhP822*z)s{#+:33+ Cr [+#;33+933+KiPkP+sK+:33+C [:33+C933+KIiPkPhP!+3Ks+)s{#+:33+C cK)s{#+:33+ C KiPhP@ c3+r{k cCA c3a{ cszkcA c3qb1c{ c1c{ KiPkPyy9+)#;++{y3C+K+cK s;c+kP1c{ !!#CKiP1c{ !!#CKiP1c{ !!#CKiP1c{ !!#CKiPhPyy{c+C+aKs+ ˛+kkP1c{ !+{Cqb!IiP1c{ !+{C!aqJiP1c{ !+Q!qY!+Q!qiP1c{ !+Q!qY!+Q!qiPhPyy{s  c+kIs K s1 k+kP1c{ Isk Ci C!{CbJa!{CbJIIiP+sA c3Aa{ cszksQqYAa{ cszksQIsk KQYAa{ cszksQIsk KQJiP DNsC #+Jsc#+JszsAccK\// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct VsInput +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; +}; + +struct VsVFXOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; + int frameID : TEXCOORD1; +}; + +struct VsInputLit +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 tangent : TANGENT; +}; + +struct VsOutputLit +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; +}; + +struct VsOutputLitForward +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; + float3 worldPos : TEXCOORD1; + float4 color : COLOR; +}; + +struct VsInputZPrepass +{ + float3 position : POSITION; +}; + +struct VsInputZPrepassSkinned +{ + float3 position : POSITION; + float4 boneWeights : BLENDWEIGHT; + uint4 boneIndices : BLENDINDICES; +}; + +struct VsOutputGBuff +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float3 tangent : TANGENT; + float2 texCoord : TEXCOORD; + float3 p2e : TEXCOORD1; +}; + +struct VsOutputZPrepass +{ + float4 position : SV_Position; + nointerpolation uint4 uid : TEXCOORD0; +}; + +struct VsOutputResolve +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; + SX]\\X[X[P\ WY[؛\WY[\YW[Y[XZYZYYY[ٜ :xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPhP ;k ys+kPhPxQiPq k+ +q kPkPq k+ ++s+kPkPyy!{s;i [+q++#q k+ +Aq љ+s+KKs+CK1Kc+I+#C #+{kKc+kPkPkPPyiPhPxyzkk{sAZY s#AbbJc{iPhP!+3Ks+*2 +*zriP!+3Ks+*r*j +bzZJ*iP!+3Ks+*j +*r2 +*J*iP!+3Ks+I +"J +r*j +2 +*J*iP!+3Ks+*2b*Jzrj +2 +*J*iP!+3Ks+*2b*Jzrj +jJzriPhP!+3Ks+q +j +ZJrrJr:zr*zriPhP!+3Ks+B +"Jr:rzj +biP!+3Ks+B +"Jr:*jJJ*iP!+3Ks+i +*jJJzrq1kPhP!+3Ks+9bz +b22**2J9jP!+3Ks+ʚ*j22**2JjPhPI3#+3cckPhPxyZYyscc{iPhP!+3Ks+Jr:J2JjbBKkP!+3Ks+Jr:J2BKJr:J2JjbBKiPhPp k+ +q љC #+"+3Ks+kPkP{s+Ã) cљKs;K+9b{ c33++3KJr:J2B9bz +b22**2JJiP{s+Ã) cљKs;K+ʛ+k33++3KJr:J2Bʚ*j22**2JJiPhPIscKs+{{cI;b{ c33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCC9b{ c33++3KKiPkPhPIscKs+{{cIʛ+k33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCCʛ+k33++3KKiPkPkPhP)c+yycckPhPxyAbbzscc{iPhP!+3Ks+zr +B+3Kcq k+K+3Kq k+kP!+3Ks+zr +B+3Kcq k+Kzr +B+3Kcq k+KiPhP!+3Ks+9bz +b22*Bq k+K33+zr +B9bz +b22**2Jbq k+KiP!+3Ks+ʚ*j22*Bq k+K33+zr +Bʚ*j22**2Jbq k+KiPhP)s#K3yycc O0:22* +J +rņ RDܗ " +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhАEWfqaijlD -b0 +vs0E]a }M ՙMgwpo@/6A6 ׅ .dB /@cD 5 C^hl/Hc!0 [iL8mCD&4AH \Lja`px׀ր NORMAL h hxh BU5$E4AH h5Z5Z-jZ66 1e m..m\D nlX"7X5\C7B75xc<6,xQoxE h5Z5j-jC Z66oah5ZC!&VF Xp& A0(l> `@ +[xa1@zx0F =`Vjƀ A0`haX0F =`Vf1HXA ` @ Z؃V`Q ` @ Z؃V`; ` @ Z؃V`Px ` @ Z؃W`Q ` @ Z؃W`; ` @ ZX`Q& A0`ha`@0F =V` +VF5mUf5mNgCmBgCM[PT|&0ئT|&0T|&0fT|&0VT|&06b +DClTQ/TQSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L %2"H d""ㄡL Lh#%f`) BR˟|n1T.BC0B1`I #CGsب "$J7rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P PPPPQ%PA$Fʠ +b Н <@y,F^^$^D @AyLFD oM $Efe%&,f&gl&eCLc@  l `#22:32 l@e!6`pq&2A 4I p&ѶAA"02worldViewPos Ѫͺ.6 Lmț `@Al`0L2oCP4܈@=M%Q%=9M +kP\bP`ڰhjj0m@I)i2A"') Bmj"A  LY}AͥѥM +m@D +6, w@AlX7H5X9`P6AtTDa ` ``I Kik Tj0a2AB6 u + @[XM\h̥}MjB +` + + +Pͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJT"s˃+ rs{ K{s"xcP ..l.lJPu\Ѕ e΍LnnJ +yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$50fb4a751309c95f1ac646df72c0454d.pdbHASHPJu _FrEMDXIL@`DXIL(BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L %2"H d""ㄡL Lh#%f`) BR˟|n1T.BC0B1`I #CGsب "$J7rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePEP@$Fʠ + ezAPxAxA 0 DynLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$LeB, A !p6Da5Fi**iP@"B `6ڶa!*®!#.ӓTSӆe l *zz" A6,`օ]5#.SV_Position AC aVpĕ.L l8TANGENT0``6,ZX&hLgC0lX `6jmqa(965Pͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +Du\syL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;;Ì!|prsp{y`pȇwz<n@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@ma A,DJaʮ䨔# ` er]A $a1b M$ҦAɈA a0q$!TAˈA cPuČ$A%͈A ep}ACM 0  0@ #`ФhB&h &È 4npMd0 B00 0bp p&h& h1tg@ < +F 2X:fm1@@ڂA0x -@e|F 5`@ P` ,hcg@ Rxl A0xJ1,3bp  *AhB&h ذa cg @ X؃UXPF =XUh @ X؃UX?`F =XUd @ XVXPA0@`aXaF =`U71HV!` @ X؃SX;A0@`aFaBa1H`VA0@`aFa @DXBCH&`#Är#~D48 DT,*P111SFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV04COLORTEXCOORDPSMainDDBDILDB(`( +DXIL(BC!  + #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@" rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + c1 +<yPLFĆ Nmm=271 47float4xX@h|0c{ cdAeS `FP6 "hA0PweS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X@e-Ln%m+뭎m-mt::::"position$colorω$$]ۛ 30:BvectorA 0`1@T(``03@ rL+8.5 Pk0 3(0461U28pP CL08 pqi9   +@094D:`CP 8f3&DU6G'TgfV&4cCbW6F&D3$mA @PC30:<Nmatrixbb1@5 +0bd1@5 + E Є@` ++f4 P㠀pYM)8(` 1dd1@s +5 +X /E Ф@`Kf4 P㠀pYM+8(` 2fd1@ +5 + E Ă@`*kf4 P㠀pYM-8(` 3hd1@s 5 + /E @`:዆f4 P㠀lDLT\dltȽ}չM+8 c25VF7.l@B8L +@ @E `@,b3 kft$55VV&TgfV&4cCF'D3C3$mAA]92<:2"17930:e0muB:  ~f~Hd~H䀚H`f-@=C; ; kc#3V&7EFW6 &x0Z\XLTX[]]Pжw D;è'  ;`Ct&gbU&7aP{(՝$XͥMdà- ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց̡}͹4(Ց}ѹͱ4(4( хсՙɁɁЕсѕɥɽѥ͹4(ՙɁP ՙɁȕѕɡŤ4(5(р4(4(4(PɕЕȕѕɡ4(LMхѕ̅ȕѕɡ4(4( UI}YI%9Q5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(4(4(X=сXM5X%сѥ4(5(с̀0Á԰4(с̀Y􀸽ɵ镡0Áѹͥѥ4(сс͕̅ɅѕᡐѡYѹɵȤĸ̤4(4(X=с4(4(ѹͥѥձѠѹͥѥĸ4(ѹɁ􀘱Ѡ͕͕͕ĸ4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ȕɹ4(5(4(р@M5X=сѥ4(LY}Qɝ5(5(рЕL̅ѹЕ ɑ4(ȕɹѹ4(5(4(р@M5 ɕX=сѥLY}Qɝ5(5(рЕL̅ѹЕ ɑ4(ȕɹѹɁ4(5(͕5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(рܽɱYA4(4(4(X= ՙXM5X%сѥ4(5(X= ՙ4(4(̀́􀤹ѹͥѥ4(ѹͥѥձѠѹͥѥĸ4(ѹɵ􀤹ѹɵ4(ѹɔܽɱYA͹遴4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ȕɹ4(5(4(Ցՙ}͕ͱ4(4( UI}=UQAUQ@M5X= ՙѥ4(5(р̍ɕ́􀤹ѹͥѥ4(TՙɁȕձ4(}ՙɡȕձѥ4(р}ɽ՝́ЕL̅ѹЕ ɑ4(}ɽ՝͹쀀Ƚ՝5(рɵ}͵ѡ́􀠅ѠİĤ4(̀ɵ4(ɵ􀠸ɵ}͵ѡ͹遨ȀĤ4(}}ɽ՝͡ȕձѱ}ɽ՝ͥ4(}ȕձѱ}ɽ՝͹4(}͵ѡ͡ȕձѱɵ}͵ѡ͹4(}ɵȕձѱɉ}ɵɵɵ镡ѹɵѹɔѹЕ ɑ4(}ɵȕձѱɵ镡ѹɵ4(}х͡ȕձѱ4(}ȕձѱĤ4(ȕɹ}ՙɡȕձѱ̍ɕͥ4(5(4( UI}=UQAUQ@M5 ɕX= ՙѥ4(5(р̍ɕ́􀤹ѹͥѥ4(4(TՙɁȕձ4(}ՙɡȕձѥ4(рЕL̅ѹЕ ɑ4(}ȕձѱ4(4(ȕɹ}ՙɡȕձѱ̍ɕͥ4(5(5(l~5FV&7Ǖ6VGVƕVG6ǖƹ^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`vv@@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@欌@@@@h@@t@v@@@@h@@t@v@@@@d@@t@v@@@@@ʒ@t@bvv@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`v@@@@h@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@v@@@@f@Ƞ@t@bv@@@@h@@t@vv@贠@@@@f@@t@vv@贠@@@@f@@t@v@@@@h@ʮ@t@v@@@@h@ʒ@t@vv@莄@@@@h@@t@v@@@@f@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@d@t@bvv@贠@@@@h@@t@v@@@@@h@@t@`vv@@@@@h@@t@v@@@@d@@@@@@t@`vv6<".:(77<2689222..242727:9.272941:2.:9029902/2494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠРР0'v6V֠РҠV66VVננV66V27VV֠נBvBVV6GWFV66VV37VV26VB6bV6R7WF"2FV&2V&נננҠР22F4Ŕ"6ҠР0BVfV2T%Te4T5TDbӠ0BVfV24Ud5T%T5%45UӠ0BVfV2T%TUde4T5U#CӠ0BVfV$%D4Te4T5U#Ӡ0BVfV"UdT4De4T5UR#Ӡ0BVfV"UdT4DՔ5TDӠР0BVfVT5t%T45TD#ӠР0BVfV2Dt$Ӡ0BVfV2DtUԔ45dU2Ӡ0BVfVUԔ45Bc֠Р0BVfVr$%TedT$%Udr$ՠ0BVfV25EU%TedT$%Ud2%ՠР0fFVf5V7V7נР2Ɩ"6ҠР0BVfV2E%tdń2נ0BVfV2E%td2E%tdńҠРV66VV3FV&EVfV6ננ26GW'R6GǦ3G'veVvr&&TgfV&%Wf2E%tdr$%TedT$%UdӠ26GW'R6GǦ3G'veVv27GW&TgfV&%Wf2E%td25EU%TedT$%UdӠРƖV"6w&&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uFr&&TgfV&%WfӠנРƖV"677GW&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uF27GW&TgfV&%WfӠננР0R6W5V7V7נР4Ɩ"6ҠР0BVfV24D'WfV'Wf72V֠0BVfV24D'WfV24D'WfVҠР0BVfVr$5$TedT$V2&VgfV&24Dr$%TedT$%UdVҠ0BVfV25EU5$TedT$V2&VgfV&24D25EU%TedT$%UdVҠР0RFf5V7V7A Z(PрВg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ KI&q((+-1A@ l^&&ȲAx 77A@ MLLj4 L:LDNltbYw x 6= LĆ,6 /Aa1A XpzKK{s $!601AH B"mX`,,"-^"-`B-COLORd !blajmijD65 P hh 5P 0\)/02 BBmX`..B-^"-`B-bCp `CAE^" n\H`q'@ @O# 0XG="`zL`x062q "u0Bp.ٵM ]KY[[ +]KYݔ@*̽ɍѕMD[X YY[ܔ`E2V'7VfVV6%:dx.source.argsSBbW&76%&dx.valverSC2FV&FV6%2dx.resourcesSDBWFF67%:dx.viewIdStateSCRF'F77% yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa A,DFh(+C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePP,TJ +a + c1 +<yLFD oM $Efe%&,f&gl&eCLb@  ql X2 Ld@4BYb`gCL\X$`C0m &0׵!6 M2kCрj +Ks2e6F6A( Bl BMhBx b@bIjPHB  `27a` cD6gpf 13̀60)/02 B1mX7 `b `C7`CausP4&"mnn@44ξh̥}+r{k۠ԁvC666427)AP ŮLn.mJ@4!s c+u\ئH2<:)U υ.,..mnJ!sK+K" +lu\sЅ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$2c8b96d78a1d396900b0187087323851.pdbHASH,׊9ip28QDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@<@ yaLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hQBbb dՆ  47.SV_Position Ά 6,q7xzbz X&A2ذ a} "') 9`C A0 +;+ ҆X o 6maP76XPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ@!sK+K" +Xu\oyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma ;A,FB)\Q)3# `iaȈA @[eY2b Ƈ\$ ʈA at$!̈A c|Ԍ$A |3b ,aI`$ 0  0@ F$1"|H3b HXi1b HXi0b HXi0b HXia DXBCguA`Q(q DT(0` hThphSFI0ISG1SV_PositionNORMALTANGENTTEXCOORDOSG1th@h@h@SV_TargetPSV04",NORMALTANGENTTEXCOORDTEXCOORDPSMainDCCBCDDD000ILDB]`cDXILt]BC! Z #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L N2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??=htyzx( 38C8<->C=C9)=8;;C8)gY@B`V 1 rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3 !@C @"2L &GCJ +)2((b(r(JJ +a1A n,A?A"Af( qjb8A@A"AyL d!+ã+#sAcc4@ oM $Efe%&,f&gl&e-͌]ݛZ <half{ 0b4pZ` E ,h  E 4h ( E <h 8 BaG[Y[ݲ6element_countT`YPֵAI HD*;4[ !17930:float{ <0b4phE4 `1@w(  @ MfZe `p`cg,b@[ !17930:E "0YE>00E 4"( "hA `moA lk (`pq,bK [ !17930:E ` "h0 LfZe `u >6[AЀj +Ks#̡ͽՑqՙ}͕ͱ P UI}=UQAUQ1 c+#{ +{[(Bk`5707:4020E ДB(*HH2066*09290E МB(*l  R0T(jȀ=90241:24::49A +:::#:33"positionqV\Hɵ-bXar!  @xЅ-bFXr!  Е ɑ-bXr@ @8ɔ-bXr!  @6 P 0 V`P *¦ta &@@H]UD^L[יXY '-L̬L(+ .llH̬LHO\ZّXY0627half3|xX@f|1@s 0YVH `4 +鐀lȡa0$A`0st1%+,b&B DB 2FV67,D` 1@"`41@ " T1@@"`d1@3P"` lܾ1@S`"``1@s"`ܾ1@"`41@"` D1@" xcKs+[?`:aYwy{}I0C(x>`!@$ 0 U + p%8\?init_albedo@@YAXUUnpackedGbuffer@@V?$vector@$halff@$02@@@Z`$a)jB$P"~B%,O[\[ '-kͭln(+ .llH̬L- HkD;l%VM@(DKX pIsKr{k c}ɵeaUUՙYؕѽ5imHMĪ P@ D:init_metalness442069 *72#:329 0633 U +6q/n<ޘ?init_ao@@YAXUUnpackedGbuffer@@$halff@@Z& rB'B.^(}ՙ}Ʌ~ʾ~Ȏ䀀6 U +<?lʾ?write_gbuffer@@YA?AUGBUFFER_OUTPUT@@UPackedGbuffer@@@ZlȎ1@3 +pR99 0 `f&ǮlM-͌Dg4lE H `6hI&Apo(,|` `4 +sm +`"a pI0E( +[lT.6 & B,BA6f}ՙ~־䀀~Ȏ䀀Ȏ䀀6p!U +tQ +wʦٕͥMe}95i{{ccd`/MŪ ЋP0@ S6FV&F;)s{#+szk c + !+{j"!+{j" Al@4VM@(Fh l`z$V&j'v,/4X-b3f3&DU6G'TgfV&4cCbW6F&D3$mP4PCPNC30:<Nmatrixbb1@` E м`pYMlv0( E ̆`pYMmv0H /E ܆`pYMnv0h /E `pYMov0 E `pYMxv0 E Ќ`pYMyv0 /E М`pYMzv0 /E Ь`l\6d6l7t7|<ă<=ԃ=Ƚ}չM+8pb25VF7>k@ @` Xjv>AOБX[PYЌI[\P ж@հݛUZ M*mHkj̭L̬LhĮlMfHh~p U]\ ]ݛ[ ϲ`C @ ?A]Ќ U]\ ]ݛP Pж@ sampld&A4"`@P kc +kc+ + +ڶ(""%"8$HЏ1QO@@@Ai! 3*K{s0A\@@6 y"e!( \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KBH[YZYYY[ٜ HH[YH[ [HB Л]XYٛ]XH[]\Z\]ZٜK˜XYUPY\Y]XLJ^[ ۛNBNBU]\ ]\Y] +LNTX[]]\X\Y]LNBHYȑPQԗUTRUBӓPאPQX[PY\ +\Y]LJ^[  HNBNBS\TSX\\H\]J^؛[ SH HL H LN؛[ [UHۛ\[[^ +SH H\ \]ڛ[N؛[YY\H\]\]J[ + +[U H\ۛ\[[ + L + +HLNBS\[\NB[\ \]ڛHH[J [ J\ \]ڛ H YJN[\ۛH[ +YY\ YY\ YY\ H YN[\ ]ۛHH\ ]ۛNB\][\NB_B[ TSXS\H\] +NȔUY]^[ HXH]TX[\X H\ ]ۛYN\]HX +H\ۛNB_B[ TSXۛ\S\H\] +ȔUY]^[ HXH]TX[\X H\ ]ۛYN\]HX +H\ۛ +ۛNB_H\YBӓPאPQX[PY\ +\Y]LJ^[  HN[ ݛUZNBNBS\ݑPTSX\\H\]J^S\ݑP[\NB[ HH\ \]ڛN[\ \]ڛHH[J [ J\ \]ڛ H YJN[\ۛ\HH\ۛ\[N[\ LHݛUZۜ ^H N[\ ]ۛHH\ ]ۛNB\][\NB_BH[YșXYܗX\ [HB‘PQSTTSXS\ݑPH\]J^[ ܘ\YHH\ \]ڛNH\ZّXY\\NH[יXY\\]NZ HXۗ[[H]TX[\X H\ ]ۛYNHXۗ[[ܜKHH [[\Z ۛ\[\[HZ + H  HLN[ ۛ\[Nۛ\[ ^Hۛ\[\[ܜ ^ + H HLN H[WXۗ[[\\ HXۗ[[\NH[WX\\ HXۗ[[ܜ ^^NH[\[\\ ۛ\[\[ܜKXNK[ݗۛ\[\\ \]ؗۛ\[ۛ\[ ۛ\[[^J\ۛ\[ + H\ L H\ ]ۛYJNH[ݗۛ\[\\ ۛ\[[^J\ۛ\[JNH[W[][\\ LNH[W\\ HLN\]HYיXY\\ ܘ\Y\NB_B‘PQSTTSXۛ\S\ݑPH\]J^[ ܘ\YHH\ \]ڛNBH\ZّXY\\NH[יXY\\]N[ HXH]TX[\X H\ ]ۛYNH[WX\\ HXٛ ^^NB\]HYיXY\\ ܘ\Y\NB_HYY!p ZYW[YיXYܗX\ [Gyyz˓K;Cqj9Jrrabr bcK;C+++#siPxyz˓K;CAJ9 +KSKs9 +k+Y2r bcK;C+++#kPhPIsc#+C #+"+3Ks+sAiPhP{{cI+jKK+B #+C1c{ i +K cKiPkP+si +K cB +"Jr:*jJJ*iPkPhP{++#;33+kPkPA c3!K33+zc{iPA c3+c zc{iPA c3 sc+szc{iPA c3{;Cs+caKs+ z;Cs+iP1c{ q{k ciPhPA c3i+ ccs+iPA c3 sc+syy)KC+ sc+syi+ ccKkPhPA c3)ã +# +c+#{ +{yy{kkPA c3 {yy{kkPA c3C #{iPA c3)kKK{szc{iPA c3)kKK{s iP1c{ i +K ciPiPhPr [+#;33+kPkPA c3 c+#{iPA c3k{{Cs+iP1c{ q{k ciPhPA c3i+ ccs+yy)KC+ sc+syi+ ccKy)kKK{skPA c3 sc+syy)KC+ sc+syi+ ccKy)kKK{skPA c3)kKK{s yy)KC+ sc+syi+ ccKy)kKK{skPhPA c3 {yy)KC+ {cy)kKK{skPA c3)kKK{s+s;Cyy)KC+ {cy)kKK{skPA c3C #{iP1c{ i +K ciP1c{ ycKs+iPiPhP +[+#;33+kPkPA c3 c+#{ +{iP1c{ q{k ck{{Cs+j +K ciPA c3i+ cc sc+sC #{yy{++#kPiPxyC++k  s3{kkP0c{ )s{#+szk cC1c{ qKiPkPA c3)sq{k cK+CqsKQACiqsSqYqIIiP)s)sSqYqiP+s)siPkP0c{ !+{#+szk cC1c{ )sKiPkP1c{ qs1c{ A)sscaIQ1c{ AaaaIY1c{ AiaiaaiIiPA c3a!{Cqssciqss˻KiPqssaiPqssQCaKiP+sAqssQYA c3AaaiIIiPkP@ c3akKs s+CA c3{cKiPkP+s!{C{ccA c3AqaqaqIIiPkP@ c3!+{#+ +c+#{ +{CA c3 c+#{KiPkP+s +CakKs s+C c+#{KQAyqIIQqYqyy sˣCKs;! [+C sC { cIq{C˛K c{Kc+c s#IC #{kPkP +[+#;33+ [:33+Cr [+#;33+933+KiPkP +[+#;33+93iPA c3i+ ccs+{ sc+s933+si+ ccs+iPi+ ccs+{ sc+sI+jKK+B #+C933+si +K cK933+s)kKK{s i+ ccs+{ sc+siPhP1c{ q{k ck{{Cs+1c{ A)s{#+szk cC933+sq{k csKai C933+sk{{Cs+cqyIIiPA c3i +K c933+si +K cQAq1yqIiP93sq{k ck{{Cs+j +K c1c{ Aq{k ck{{Cs+ci +K cKiP93s c+#{ +{A c3A933+s c+#{cI+jKK+B #+C933+si +K cK933+s)kKK{s+s;CQAq1yi +*jJJzrJ933+s {KiPyy93s c+#{ +{A c3A{C933+s c+#{cyqIa933+s {KiPyy93si+ cc sc+sC #{A1c{{Ci+ ccs+{ sc+sSIQY1c{{C933+sC #{SIIQAqyqIiP93si+ cc sc+sC #{1c{ Ai+ ccs+{ sc+sc933+sC #{KiP+s93iPkPhP{K#s zk cj{{Cs+C1c{ q{k ck{{Cs+cy1c{ q{k ccyA c3k{{Cs+KiPkPq{k c!+{#+szk cCq{k ck{{Cs+sKiPk{{Cs+ Cq{k ck{{Cs+sKiPkPhP{K#s [;33+szk cj{{Cs+C +[+#;33+93cy1c{ q{k ccyA c3k{{Cs+KiPkPs zk cj{{Cs+C93sq{k ck{{Cs+j +K cscq{k cck{{Cs+KiPkPhPr [+#;33+s [;33+C +[+#;33+93KiPkPr [+#;33+933+iPhP933+si +K c1c{{C93sq{k ck{{Cs+j +K csQq1KiPyyA c3i+ cc sc+sC #{93si+ cc sc+sC #{sSAqyqIiPyyA c3C #{1 Ci+ cc sc+sC #{KQAqyqIiPyyA c3i+ ccs+{ sc+s1c{{Ci+ cc sc+sC #{KQAqyIiPA c3C #{93si+ cc sc+sC #{siPA c3i+ ccs+{ sc+s93si+ cc sc+sC #{siP933+s c+#{93s c+#{ +{siPs [;33+szk cj{{Cs+C93c933+sq{k cc933+sk{{Cs+KiPhP933+s)kKK{s I+jKK+B #+C933+si +K cKi+ ccs+{ sc+siP933+si+ ccs+i+ ccs+{ sc+siP933+s sc+siP933+s {I+jKK+B #+C933+si +K cK93s c+#{ +{siP933+s)kKK{s+s;CI+jKK+B #+C933+si +K cK93s c+#{ +{sQi +*jJJzriP933+sC #{C #{iPyy933+s!K33+zc{ c+#{SAi933+si+ ccs+KiPyyA c31+s+c!J+c+Kq1yya+Cq1cq1ck{{Cs+KyyCAqi+3 K+Kr#+KyAqY+3 K+Kr#+KI1{!K+c+KiPyy933+s+c zc{a+CA c3A1+s+c!J+c+Kc1+s+c!J+c+Kc1+s+c!J+c+KKa c+#{c933+si+ ccs+KiP+s933+iPkP{++#;33+{+;33+Cr [+#;33+93KiPkP{++#;33+933+iP933+si +K c93si +K ciP933+sq{k c93sq{k ciP933+saKs+ z;Cs+i93sk{{Cs+iP933+s{;Cs+i C)ka933+saKs+ z;Cs+Q933+saKs+ z;Cs+KiP933+si+ ccs+93si+ ccs+iP933+s sc+s93s sc+syy!+{K)s{#Ks;QqI{+kP933+s)kKK{szc{93s)kKK{s+s;CQ93s c+#{iP933+s)kKK{s 93s)kKK{s iP933+s)ã +# +c+#{ +{!+{#+ +c+#{ +{C93s c+#{KiP933+s!K33+zc{93s c+#{i933+si+ ccs+Q93s c+#{yyQAii+KiP933+sC #{93sC #{iP933+s sc+szc{933+s!K33+zc{Q933+s sc+siPhPA c31+s+c!J+c+Kq1yyYA93si +K cB +"Jr:rzj +bqQAi93sC #{KIyya+Cq1cq1c{;Cs+KyyCAqi+3 K+Kr#+KyAqY+3 K+Kr#+KI1{!K+c+KiP1+s+c!J+c+Ka+C1+s+c!J+c+Kcq1c933+s{;Cs+Q933+s sc+sKiP1+s+c!J+c+KQAi933+s sc+sKiP933+s+c zc{a+CA c3A1+s+c!J+c+Kc1+s+c!J+c+Kc1+s+c!J+c+KKa93s c+#{c933+si+ ccs+KiP933+s {93s {iP+s933+iPkPhP{K#IsK:33+Cyr [+#;33++cKiPkP+cs c+#{+csq{k ciP+csk{{Cs++csi+ ccs++cs sc+siP+cs)kKK{s +cs)kKK{s+s;CiP+cs {+csC #{iP+csi +K cB +"Jr:rzj +biPkP{K#IsK +c+#{CIs{r [+#;33++ccA c3 c+#{KiPkP+cs c+#{s c+#{iPkP{K#IsKk{{Cs+CIs{r [+#;33++ccA c3k{{Cs+KiPkP+csk{{Cs+k{{Cs+iPkPhP{K#IsKr{k cCIs{r [+#;33++cc1c{ q{kKiPkP+csq{k cq{kiPkPhP{K#IsKj+ cs+CIs{r [+#;33++ccA c3i+ cKiPkP+csi+ ccs+i+ ciPkP{K#IsK sc+sCIs{r [+#;33++ccA c3 sc+sKiPkP+cs sc+s sc+siPkPhP{K#IsK +{CIs{r [+#;33++ccA c3 {KiPkP+cs { {iPkP{K#IsKC #{CIs{r [+#;33++ccA c3C #{KiPkP+csC #{C #{iPkP{K#IsKj +K cCIs{r [+#;33++cc1c{ i +K cKiPkP+csi +K ci +K ciPkP{K#IsK*kKK{sCIs{r [+#;33++cc1c{ )kKK{s+s;CKiPkP+cs)kKK{s+s;C)kKK{s+s;CiPkP{K#IsK*kKK{s CIs{r [+#;33++cc1c{ )kKK{s KiPkP+cs)kKK{s )kKK{s iPkPhP922*zjPkPA c3 c+#{ +{ +;+iP1c{ q{k ck{{Cs+j +K c +;+iPA c3i+ cc sc+sC #{ +;+iPiPhP822*zK+:33+C +[+#;33+93KiPkP922*z93{iP93{s c+#{ +{93s c+#{ +{iP93{sq{k ck{{Cs+j +K c93sq{k ck{{Cs+j +K ciP93{si+ cc sc+sC #{A c3A93si+ cc sc+sC #{caIiP+s93{iPkPhP822*z)s{#+:33+ Cr [+#;33+933+KiPkP+sK+:33+C [:33+C933+KIiPkPhP!+3Ks+)s{#+:33+C cK)s{#+:33+ C KiPhP@ c3+r{k cCA c3a{ cszkcA c3qb1c{ c1c{ KiPkPyy9+)#;++{y3C+K+cK s;c+kP1c{ !!#CKiP1c{ !!#CKiP1c{ !!#CKiP1c{ !!#CKiPhPyy{c+C+aKs+ ˛+kkP1c{ !+{Cqb!IiP1c{ !+{C!aqJiP1c{ !+Q!qY!+Q!qiP1c{ !+Q!qY!+Q!qiPhPyy{s  c+kIs K s1 k+kP1c{ Isk Ci C!{CbJa!{CbJIIiP+sA c3Aa{ cszksQqYAa{ cszksQIsk KQYAa{ cszksQIsk KQJiP HsC #+Jsc#+JszsAccK\// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct VsInput +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; +}; + +struct VsVFXOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; + int frameID : TEXCOORD1; +}; + +struct VsInputLit +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 tangent : TANGENT; +}; + +struct VsOutputLit +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; +}; + +struct VsOutputLitForward +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; + float3 worldPos : TEXCOORD1; + float4 color : COLOR; +}; + +struct VsInputZPrepass +{ + float3 position : POSITION; +}; + +struct VsInputZPrepassSkinned +{ + float3 position : POSITION; + float4 boneWeights : BLENDWEIGHT; + uint4 boneIndices : BLENDINDICES; +}; + +struct VsOutputGBuff +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float3 tangent : TANGENT; + float2 texCoord : TEXCOORD; + float3 p2e : TEXCOORD1; +}; + +struct VsOutputZPrepass +{ + float4 position : SV_Position; + nointerpolation uint4 uid : TEXCOORD0; +}; + +struct VsOutputResolve +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; +SX]\\X[X[P\ WY[؛\WY[\YW[Y[XZYZYYY[ٜ :xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPhP ;k ys+kPhPxQiPq k+ +q kPkPq k+ ++s+kPkPyy!{s;i [+q++#q k+ +Aq љ+s+KKs+CK1Kc+I+#C #+{kKc+kPkPkPPyiPhPxyzkk{sAZY s#AbbJc{iPhP!+3Ks+*2 +*zriP!+3Ks+*r*j +bzZJ*iP!+3Ks+*j +*r2 +*J*iP!+3Ks+I +"J +r*j +2 +*J*iP!+3Ks+*2b*Jzrj +2 +*J*iP!+3Ks+*2b*Jzrj +jJzriPhP!+3Ks+q +j +ZJrrJr:zr*zriPhP!+3Ks+B +"Jr:rzj +biP!+3Ks+B +"Jr:*jJJ*iP!+3Ks+i +*jJJzrq1kPhP!+3Ks+9bz +b22**2J9jP!+3Ks+ʚ*j22**2JjPhPI3#+3cckPhPxyZYyscc{iPhP!+3Ks+Jr:J2JjbBKkP!+3Ks+Jr:J2BKJr:J2JjbBKiPhPp k+ +q љC #+"+3Ks+kPkP{s+Ã) cљKs;K+9b{ c33++3KJr:J2B9bz +b22**2JJiP{s+Ã) cљKs;K+ʛ+k33++3KJr:J2Bʚ*j22**2JJiPhPIscKs+{{cI;b{ c33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCC9b{ c33++3KKiPkPhPIscKs+{{cIʛ+k33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCCʛ+k33++3KKiPkPkPhP)c+yycckPhPxyAbbzscc{iPhP!+3Ks+zr +B+3Kcq k+K+3Kq k+kP!+3Ks+zr +B+3Kcq k+Kzr +B+3Kcq k+KiPhP!+3Ks+9bz +b22*Bq k+K33+zr +B9bz +b22**2Jbq k+KiP!+3Ks+ʚ*j22*Bq k+K33+zr +Bʚ*j22**2Jbq k+KiPhP)s#K3yycc ȍ0:22* +J +rȆ RDܗ " +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhHI q&ȳA84 LԄ6 l&h2A "mN6$h&&hr&y&q! Bx4A4946u ĆO6 g y2AoC'\&I5AH Lk`4?P 3 4ӓTS!Q&ȴA(Sٰ Jɟ + "' K +ʙI +@kIhPea)UQR9R)Qa lXUQqR9?DP +J +)/02 BLjPaAXYQ9PAQ ˙ĊȊʙʙ +l`Ò'r+r&B+Z\0J +^]E\ݸ^!r!@O# 0XG=*`z\`ha \\ݸ^ D@O8#aph' @O#0 : u`޾%»XG=: 0unc&5FV677.@E &cDzXH`6.B4% u encDH_BHՙK ـ` ~ #Pq&VgTG7.Bd.L&hC`q'@$ٵM N]KY[[!EV +]KYݔE,̽ɍѕM!\$FhF̽ɍM r[XK[XQ[SX[ٔ@G̽ɍɝM +]\ڛ۔M؅ٕM ZY\Y۔M̐ȕͽɍM  ]\Y]]ڛܔ Oإ%MхѕM K\[ܔ@WyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` !H;/D0! apdm[3\3~q&0 <<mpK,_ܶ T;/MNDP_ܶ<;O5@m[,WBa {A, DP6@I R +3%W2WnV0t 0&GL9 s0A8` ‘C&GL? 0A8LapX +# `A03+x$&bL# `hˌ +e A (qg@3a$"i`e5 tnA (sg`3a AQl?L?0a$Bkgτ0b @Ä0b @pÄ0b @Ä0b @Ä0b @`Ä0b @ Ì +U/#`PAml?L#`Pll?L#`Pll?L#`Pll?L#`Pll?L#`Pkl?L#`Pkl?L#`Pll?L#`As$hP2c@  wCj3+,& +^/ B0a& „0b Ì +K/#`PZk?L#`PZk?L#`Plk?L#`PiXi?0b Ì L/#`Plm?P0b @QF1c@B  Tv0|& L#`PA[n?P0b Ä0b Ä0b pÄ0b Ä0b Ìaiˈ ~WCk ~WkA \x0 xAW0a"gƀ x/F0F +1 H_F  f 3DH/&t0F `f 0vxp6:0$dm7ISD ̳; rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !Y 2L &GC"J`$ʠ +0vxp6:0$dm7ISD ̳; rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`g !Y 2L &GC"J` J ʡʃ(B(!nƪ&ywLFD oM $Efe%&,f&gl&eCLd@$ a0(MeÀ$Lf@4ِ CCC<heBbb |چ  47.SV_PositionB ӆ 6,q7xpzj +b p&ijA2ذ a}  "' Ks׉5@kIh0ca4ؾN 1O &!6,lb0pl +004X7`2eE&wVF7A( m@6,lq}G|sa`6o`ClX8k90A P`YT@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)U ..l.lJ`!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! apdm3\3~q0 <<mpK,_ܶ T;/MNDP_ܶ<;O5@ma vA, +TPQDL @ɕL c 700F # ``B8# ``ArA<# ``։$73b te@X3b FxfP3b |g`3b M4Qrg) 0  0b @QF1b` L|LH3b hB #`"C>F10 0Ē|,cJ& X`>&t1HΠ A0@H Ԁ1HΠA0@H  F !3>a @ R8?5F !3>01H`A0@H 1H@@ ` @ R8=8F !3Ѓ>DXBC:k+=*U D; DTL,,T333SFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV0(4  COLORTEXCOORDPSMainColoredDDBDILDB)`v +DXIL)BC! m + #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Q2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??@BvJKHF &i(aYy"b'`"PЗ rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0`,2L &GCB +ʠF +J@ʡ<()2("(f o +b yybLFĆ Nmm=271 47722float4xX@h|0c{ cdAeS `FP6 "hA0PweS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X@e-Ln%m+뭎m-mt::::"position$colorω$$]ۛ 30:BvectorA 0`1@T(``03@ L+8.5 Pk0 3(0461U28pP CL08 pqi9   +@h97D:`CP 8f3&DU6G'TgfV&4cCbW6F&D3$mA @PC30:<Nmatrixbb1@5 +0bd1@5 + E Є@` ++f4 P㠀pYM)8(` 1dd1@s +5 +X /E Ф@`Kf4 P㠀pYM+8(` 2fd1@ +5 + E Ă@`*kf4 P㠀pYM-8(` 3hd1@s 5 + /E @`:዆f4 P㠀lDLT\dltȽ}չM+8 c25VF7.l@B8L +@ @E `@,b3 kft$55VV&TgfV&4cCF'D3C3$mAA]92<:2"17930:e0muB:  ~f~Hd~H䀚H`f-@=C; ; kc#3V&7EFW6 &x0Z\XLTX[]]Pжw D;è'  ;`Ct&gbU&7aP{(՝$XͥMdà- ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց̡}͹4(Ց}ѹͱ4(4( хсՙɁɁЕсѕɥɽѥ͹4(ՙɁP ՙɁȕѕɡŤ4(5(р4(4(4(PɕЕȕѕɡ4(LMхѕ̅ȕѕɡ4(4( UI}YI%9Q5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(4(4(X=сXM5X%сѥ4(5(с̀0Á԰4(с̀Y􀸽ɵ镡0Áѹͥѥ4(сс͕̅ɅѕᡐѡYѹɵȤĸ̤4(4(X=с4(4(ѹͥѥձѠѹͥѥĸ4(ѹɁ􀘱Ѡ͕͕͕ĸ4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ȕɹ4(5(4(р@M5X=сѥ4(LY}Qɝ5(5(рЕL̅ѹЕ ɑ4(ȕɹѹ4(5(4(р@M5 ɕX=сѥLY}Qɝ5(5(рЕL̅ѹЕ ɑ4(ȕɹѹɁ4(5(͕5(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(рܽɱYA4(4(4(X= ՙXM5X%сѥ4(5(X= ՙ4(4(̀́􀤹ѹͥѥ4(ѹͥѥձѠѹͥѥĸ4(ѹɵ􀤹ѹɵ4(ѹɔܽɱYA͹遴4(ѹЕ ɑ􀤹ѹЕ ɑ4(4(ȕɹ4(5(4(Ցՙ}͕ͱ4(4( UI}=UQAUQ@M5X= ՙѥ4(5(р̍ɕ́􀤹ѹͥѥ4(TՙɁȕձ4(}ՙɡȕձѥ4(р}ɽ՝́ЕL̅ѹЕ ɑ4(}ɽ՝͹쀀Ƚ՝5(рɵ}͵ѡ́􀠅ѠİĤ4(̀ɵ4(ɵ􀠸ɵ}͵ѡ͹遨ȀĤ4(}}ɽ՝͡ȕձѱ}ɽ՝ͥ4(}ȕձѱ}ɽ՝͹4(}͵ѡ͡ȕձѱɵ}͵ѡ͹4(}ɵȕձѱɉ}ɵɵɵ镡ѹɵѹɔѹЕ ɑ4(}ɵȕձѱɵ镡ѹɵ4(}х͡ȕձѱ4(}ȕձѱĤ4(ȕɹ}ՙɡȕձѱ̍ɕͥ4(5(4( UI}=UQAUQ@M5 ɕX= ՙѥ4(5(р̍ɕ́􀤹ѹͥѥ4(4(TՙɁȕձ4(}ՙɡȕձѥ4(рЕL̅ѹЕ ɑ4(}ȕձѱ4(4(ȕɹ}ՙɡȕձѱ̍ɕͥ4(5(5(l~5FV&7Ǖ6VGVƕVG6ǖƹ^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`vv@@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@欌@@@@h@@t@v@@@@h@@t@v@@@@d@@t@v@@@@@ʒ@t@bvv@@@@@f@@t@v@@@@f@@t@v@@@@d@@t@`v@@@@h@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@vv@@@@@h@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@@t@v@@@@f@Ƞ@t@bv@@@@h@@t@vv@贠@@@@f@@t@vv@贠@@@@f@@t@v@@@@h@ʮ@t@v@@@@h@ʒ@t@vv@莄@@@@h@@t@v@@@@f@@t@v@@@@f@@t@v@@@@d@@t@v@@@@f@d@t@bvv@贠@@@@h@@t@v@@@@@h@@t@`vv@@@@@h@@t@v@@@@d@@@@@@t@`vv6<".:(77<2689222..242727:9.272941:2.:9029902/2494u2'vF"#Cr4"vF7"W6W&gWFҠR5WfB62V'7V2FV6rfW&VF""4E22V7W–6V6WBF2"VbVFBV”4T4UbVҠРР0'v6V֠РҠV66VVננV66V27VV֠נBvBVV6GWFV66VV37VV26VB6bV6R7WF"2FV&2V&נננҠР22F4Ŕ"6ҠР0BVfV2T%Te4T5TDbӠ0BVfV24Ud5T%T5%45UӠ0BVfV2T%TUde4T5U#CӠ0BVfV$%D4Te4T5U#Ӡ0BVfV"UdT4De4T5UR#Ӡ0BVfV"UdT4DՔ5TDӠР0BVfVT5t%T45TD#ӠР0BVfV2Dt$Ӡ0BVfV2DtUԔ45dU2Ӡ0BVfVUԔ45Bc֠Р0BVfVr$%TedT$%Udr$ՠ0BVfV25EU%TedT$%Ud2%ՠР0fFVf5V7V7נР2Ɩ"6ҠР0BVfV2E%tdń2נ0BVfV2E%td2E%tdńҠРV66VV3FV&EVfV6ננ26GW'R6GǦ3G'veVvr&&TgfV&%Wf2E%tdr$%TedT$%UdӠ26GW'R6GǦ3G'veVv27GW&TgfV&%Wf2E%td25EU%TedT$%UdӠРƖV"6w&&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uFr&&TgfV&%WfӠנРƖV"677GW&TgfV&R6GǦ3G'veVv"VgfV&VҠנ"WFW'"VgfV&V2G&G7uF27GW&TgfV&%WfӠננР0R6W5V7V7נР4Ɩ"6ҠР0BVfV24D'WfV'Wf72V֠0BVfV24D'WfV24D'WfVҠР0BVfVr$5$TedT$V2&VgfV&24Dr$%TedT$%UdVҠ0BVfV25EU5$TedT$V2&VgfV&24D25EU%TedT$%UdVҠР0RFf5V7V7A Z(PрВg-Ln%m@V%FFW2V627VV&6WRvV2&WFVV6"WFV&6VGVV2FV&7ǡE+MKTYXYX+ KI&q((+-1A@ l^&&Ax 77A@ MLL8l8 L:LDNltbiT&ȳ x `C06 000lbX& 10 Yl`,b!P KZL€)/47 B"MiC $Ն&.B.%&`1$5AH m/6,/apArq/1/AyAkIhaQ xP C]E_0 +;+ $׆&.@C.%&"/6a 6tPY,%@Aimz$`X: u ' @Oc+#{ R! ] ؙXݔٵձM!ٵM [X؛]ܔA$̽ɍM Zdx.source.mainFileNameSC2V'7V&w67%h*dx.versionShBbfW&7%:dx.shaderModelS(C"W6V'7V67%Jdx.typeAnnotationsSX:dx.viewIdStateSCRF'F77% yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq Ф ,ND V <PEAD %amp LD4B4\ bP_ܶ@;/̳~q6P <49RCM~q,KC`Pa A,D5@ @)\%%@ 0c &L6 i0A8`py# `pAm2c@AUA \a`PL# `p!u2a$rbm0b  +|2a$d``1 ksA (jPbH3a A?@?0a$f0bp9 mCA (lpd03a A?H?0a A?H?0a A?H?0a A?H?0a A?H?0a A?H?0a<AM@ʌU#`PӸ?o03Tu&00h1LF$1 `D>|& #L#`@AcPhBL B0a& „0@ %|f 8:,!3aXBgτ0b 3u$a`v A 0~v`k L# `A؁A0aF3m=е >R#m6C}#>r"4mTQ/TQ40vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/SZB6(MQ,DNDOrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0P EPRPPQ@TJ +a + 3gȏ(@ yLFD oM $Efe%&,f&gl&eCLc@  l d2 Le@4BYb`gCL +UPYX6 D$0jq,6 u@lU6A4color p&ijA 6SlM &0eP30 dp47722.SV_Positionb Ԇ 6, p@bIjP\ tua `!Uӓ6, A tAlɔUY6,AA p@āl`ðl(` @AhMEh̥}јK;#BW&׶AQ R0*llvm.identS +]\ڛ۔hBbfW&7%(̡5M 2dx.resourcesS ]\Y]]ڛA Π]Z]]]ٔ ṔAM @ []ܔyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq Ф ,ND F <PEAD %amp LD4BX4\ bP_ܶ @;/̳~q&P <49RCM~qILDN,$1c1d42425157726409793adfcd30193d.pdbHASHBBQWrd y:0=DXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L L2"H d""ㄡL L|#%f`) BR˟VbFc* ?a!! UEc BȠvpmT_6"0Bp (#Is `fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/SZB6(MQ,DNDOrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"%0PP%Q ePTJ +a + 3b yyjLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!Le@,ِ CCC<hYـC l Bwm@!6"*lam l܆ȸLY}AͥѥMgP@bPDBڰa czbz h&A84ذ eA "') Yo 3hƀ 6 dmd*LnPP >81Ā4 Ppd@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)V ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq Ф ,ND F <PEAD %amp LD4BX4\ bP_ܶ @;/̳~q&P <49RCM~qa JA,$GB)\1# `0umɈA L1q2b wD$AMˈA ep$aLAՌ$q$$<AMDhB&h &|HcD"# 0  0@ 򱄐%|,!3b # `A؁tÈA  {v`j $a`vDXBCL6 g DT(4X_ `(`SFI0ISG1SV_PositionNORMALTANGENTTEXCOORDOSG1th@h@h@SV_TargetPSV04"0NORMALTANGENTTEXCOORDTEXCOORDPSMainColoredDCCBCDDDILDBU`oDXILUBC! f #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L G2"H d""ㄡL L|#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"ha8rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCJR + F +J<(D1A ;  $ E ghK@yL d!+ã+#sAcc4@ oM $Efe%&,f&gl&e-͌]ݛZ <half{ 0b4pZ` E ,h  E 4h ( E <h 8 BaG[Y[ݲ6element_countT`APֵAI HD*;4[ !17930:float{ <0b4phE4 `1@w(  @ MdZe `p`cg,b@[ !17930:E "0YE>00E 4"( "hA `moA lk (`pq,bK [ !17930:E ` "h0 LeZe `u >6[Aj +Kszc{+##̡ͽՑqՙ}͕ͱ P UI}=UQAUQ1 c+#{ +{[(Bk`5707:4020E ДB(*HH2066*09290E МB(*l  R0T(jȀ=90241:24::49A +:::#:33"positionqV\Hɵ-bXar!  @xЅ-bFXr!  Е ɑ-bXr@ @8ɔ-bXr!  @6 P 0 V`P *¦ta &@@]_D^L[יXY '-L̬L(+ .llH̬LHO\ZّXY0627half3|xX@f|1@s 0YpH `4鐀lȡa0$A0st1%B8,b&B DB 2FV67,D 1@"`41@ " T1@@"`d1@3P"` lܾ1@S`"``1@s"`ܾ1@"`41@"` D1@" xcKs+[?`:aYwy{}I0C(x>`!@$ 0 U + p%8\?init_albedo@@YAXUUnpackedGbuffer@@V?$vector@$halff@$02@@@Z`$a)jB$P"~B%,RYיXYܗ\ m썬L̬LK.(+'HȨH멊 + + .llH̬LHk +"iX5- +@N.L̬Lxs'FWu&VgfV&Tu$TedT$TEUET6VFv$VgfV&*llH̬Ln4 +qH)Phalf2|xX@d|1@s 0Y `9A`7!NN 71@s +0`  LAbajB!&d"dC,`6 \יXY .llL̬L(+' +*llH̬L .llH̬LHk"iX5@e +p@ +@(m-mn.ͮl +-L[O\Q[\]ZYPVЗS 7=@k` l4@[PH -D2encodeNormal272706 179& 179& Bb\E(\"Lb%`b,-ۛ"09h?color@TestBuffer@@3V?$vector@M$03@@B?/.81c{ F'cFBB+&f4}!x|`pY_v0 E Є`pYhv08 /E Д`pYiv0X /E Ф`pYjv0x E д`pYkv0 E Ć`pYlv0 /E Ԇ`pYmv0 /E `pYnv0 /@C4H4PC5X5`C6h6pC7x[ݴ߰.&col_count +ú6 d1 @ 7@pGnG Al dÀ#!@ ÍBLmC&\&I4AH LiPi7y8ӓTS!96,7B'n"'pR'7&7"' "' K܉ ɍI @kIhPea)C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DND +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePQ*A$ʠF@C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DND +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QPTJ +a + cUpyvLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hUBbb dֆ 47722.SV_Position™ φ 6,q7xpzj +b ҆e`AtTDai`:1&BkIh`fa13ؾN 10 &!6,jp۷b0pj +02H6`2eE&wVF7A( l6,lo}G|qa`{5o`ClX7ހk80 P`T@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)U ..l.lJ`!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq Ф ,ND F <D@3,L;8 65m4\< mpK(5= a KA, +F+R1F@ zc   # `yHqˈA @_Bu3b `7%# ``A}2b 4 ` 0  0b 8d@0b 8d@0b 8d@X0b 8d@2b 8e@3b 8e@3b 8e@X3b 8e@[2b 8a@Y2b 8a@2b 8a@X2b 8a@[DXBCBWK bS DT$8=FFFSFI0ISG1`HQPOSITIONSV_InstanceIDOSG1`HTSV_PositionTEXCOORDPSV0 4  ,POSITIONTEXCOORDzprepassInstancedVSMainCAD +DILDB:`DXIL:BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L X2" d##ㄡL L@ +@@ 3s`0G@$AH) HS A  BQOCH>QJL~qۈ8'!$?a!P0BB(RqtŠA2n.BWBZGn H)8Bn.BWBZ/nqH)>B# aFGsɗ&_l h&H"Lo0P0@P@ @P` | +00@ +@(0LÑjg!6(8bJj rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q` `!@C < y@2L &GC" +B("(((`% ((($(PR(PB(JJb JJȜsRgh v@y +LFD N,m.mmm=271 30:Bvector X12@ E £%`0["$90241:27/<949A$9020E LeA ,bd( z!0!XRp`ICJ;CcK;C+#[MDR` kkcQF7ˮlMm.̭ $͍dg4E `1@XX( 'z'6m @ p `X:!`@X PB, 2 MԄMXLi&d `He!0I `<Is s+33+!+#33+Jr s+# +  +ڶxi!`h U]\ ]ݛ[ ϲ A[L-  ?tex@@3V?$Texture2D@V?$vector@M$03@@@@A/.-X̅ +kc+ +\@-g. hj* Ln. (h\ԅ@$V%".b\*L ]U\ڛۆ!/DT&VwfbU&7a ؃ 1^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@Dܾ\DF@Dܾ\DF@D\DPʄR@t@P`R@@@@hh@v@@@@hh@v@@@@hh@Țv@@@@hh@ؚv@@@@h@ʄʒv@@@@@涜vv@@t@PbR@@@@h@vvȄxʈ|@ʄ@t@P`Rvd@@t@P`Rv@@t@P`Rvh@P@R@t@@@@@h@@z@\PX@\Rv@@@@@@T@\v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@vh@栦P贠@R@t@@@@@@\v贠@ʚ֬P贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ʚ֦ȬP贠@X@@蒈@t@ʒR@@@@贠@@z@P贠R`v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@v@ʚ֠P贠@R@t@@@@@@\\v6_ \ʸܾ\Ҩ.// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; + z.\shaders\include\in_out.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAaNnj. AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAoAAaNnjAaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhAoAAaNnj멎AaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhA$͍L.,DkI(fAoAAaNnj. )AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAČ-.̍D*ȉjAoAAaNnj)AaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAoAAaNnj)M.LAaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAČ-nM mDkI(fAČ-dMDdIjAoAAaNnj. N J .lnAaAČ-nm.. Di**iAoAAaNnj. N J .lnnj-ͭAaAČ-nm.. Di**iAČ-Dͭ, nDDȉ(jA.͍Dͭ,ɍ,mlDDȉ(ɉ(ihjAoAAaNnjH̬AaAČ-m.. Dd m..mAČ-nM DI)iAČ-n.̍D*ȉjAČ-N oM DkIhAČ-nN DkI(fAoAAaNnjN J .lnAaAČ-m.. Dd m..mA-͍L-. .͍. DkIfAoAAaNnjNlͮAaAČ-m.. Dd m..mAČ-N oM DkIfAoAa@s r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplus@ A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰF1 6lcD +vsD0n `L olHl7^6l6|6cC5`:GB_SceneBufferڀxmFm!0 xL` 6 וĚ d7T!/clc=c`P=p` m@vcB=>փ=&  X c7Bbc=cp(P=` Gy{|}L 6 y{`P=p` m0vc >փ?&؍X c7rb@d=c!2A84`  Fl8l#=#?DdDLd`!@ CmBLؠ 6+Bi**i! mL1 zlXlE\E`Ej#FlEd͔W]XY!! BR 6{Pڠyڸx HpzKK{s $g0A@`=aq "TEXCOORDyx HltDL llL6Ѝ z 47:q "p&B#`: PinstID DPM1 X<10.@D88outputDPAN2XG=`z,`h: u]\\wшͮͥ퍬Ō-ln|Qͮ%̍nJ\\!\\C-2<:24742)Aj!s{+s ;F2<27)m4!s c+F2<90272)n!s+{+G%2<< 7707)H2<$)0)!s)s˃zKs yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq 0@ <~@0m[5\UDT:#mp UDT:P `~qۆ <D@3, L;8 65m4\ bPܶT;/MNDP_ܶT;/MNDPܶH;?фmβT?_ E=$641 a A,DR\eW3%W T`0c&L> z0A@Da) b +&\L {1A8# `Aa3H$i L# `܁`Ȍ1z +A (ykY2a A$?85?0a$pl`) |@cA ({m2a A&?@7?0a A%?@7?0a A$?@7?0a A#?@2?0c@)0bp 82c@ +hBLg5c@A`B  1 @C`@ +Q8 TF i `ƀ@5@`4!& !0FaM `@ SXA ,TF 84h0F 84f0F 84d0F  <1 `PM `4A& фA0Fa1@0Z `4!& !0FaM `@ @ `4!& !0FaM `@ `M `4A& фA0Fa18` XaƀHф0F`M `4& A0v!@& ф0F`M `4& A0& ф0F`M `4& A0a& ф0F`M `4& @>3Dl A0a A0a pA0ae0F rS 0F zSx 0F TX 0l+L#`pɃ*\eL#`p*LeL#`p+Ȃw0b >̂v0b ?Ђu`f`0F [;& A0<;& A0@4;& S:τ0b HA0a 5 uL#`p/xuLt `@ .5`1@$~ 0F B p:& Sτ0b JCB0a L#`p9)Ձ)g1@%!L!0F zshS& A0` 3a %PL#`p:A) \4mP +`}@ +0F  wR& A0n `@ .8 `0PL#`p<- \;1xp 0b OB0a)؂|& A0|@ `@ >`1@ ,l!0 jA> \bP 0b X(B0a EL + `@ .T`1@,h!0F B Z& zό*#`pHA= \k1wP`@g8L#`pIA> \oqk`@g2L#`pɅJA? \s_?t& BB> \vVH \wSHt& A0(p ,TF  d& A0(p `@ A&\Ha1H/.'b TF ዱ Љd1H/.b' ` @  & A0b,.|& A0b,.tb& A0b,.vB& A0b,.z"& 1 ֠@ u`|&0Դ mgC}lP`|&0Ժ ngC[kP`|&0ش vmgmi`f`|&0ظ vngh``|&0ؼ} vogM[gp׶`|&0ܶi mgÍepf`|&0ܺU ng͛dp`|&0= xmgn[c߶`|&0) xngaf`|&0 xogCN``|&0 m~gC[g|&0 nygC۝P|&0fg|&0 zmsgng|&0  XUD UDd8`44QEADD\4E0TSTATh `ZDXILP BC! Q #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L `2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄6* R`D4\=䯄_6*aRlD  #C|104-P/M%LHDL*@0$ęa!ޡ Ɓa fƁAʁDA a!aʁP0e#M 9 +DClTQ2@?γ$bq}MQ䋍4@t"MCBbrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C <d2L &GC"J` + +0 + ʡ$ +0 +p J@ J@ +U<ʦD +(R((j!r:g uֱygyLFD oM $Efe%&,f&gl&eCLe@,  l Is s+33+ p6C!! p6 ܀ΑX[PYx6 D$0j0A86`7A m4- &5A``}&DA 81<.worldMatrixڀ dm\t700:4 qm@36 :N]XP\Y&DAAԀ[>6QɅ͙ɵMmAqoy Ҡ `0qA 86 d'ǡ.l@l2 46isHighlighted` xAg,&DA؀`4s@w}0A 5`@@#&jB6A HaЄB)l8+&0 +U0 +5 A+҃+ Kr s+#j +Ks#4D4A(`P dA  -P lʒ&EL +3 gA p . [.SV_Position &AaBB,, ,"') 0 / q C/0A`5 簡@W0 hMEsig_ld4ξ&D+b{ #۠:C;vPͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJPU"s˃+ rs{ K{s"*!sK+K" +B2<27:<47):t!s{s+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq -@ <~@0m5\UDT:#mp UDT:P `~qv <D@3,L;8 65m4\ bPܶ T;/MNDP_ܶT;/MNDPܶH;?фmWDHH&4ILDN,$f24f9248bf20667e53723895683d7e34.pdbHASHOH f~Sr8h=~4DXIL `*DXIL BC! ! #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L V2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄6* R`D4\=䯄_6*aRlD  #C|104-P/M%LHDL*@0$ęa!ޡ Ɓa fƁAʁDA a!aʁP0e#M 9 +DClTQ2@?< @rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C <d2L &GC"J` 0 +X@ ʠʃ(R((R J: +y?yoLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ <™ ap6$φ 7A !11L@D@LҠ\'W676G6VFf5Fi**iPPš 6`b:>6SV_InstanceID 6`0lX2(3  6c\&6A X``s"TEXCOORDʠ``s A A `Cis`A666427)AP ŮLn.mJ@4!s c+u\ئI2<:)AU ..l.lJp!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq -@ <~@0m5\UDT:#mp UDT:P `~qv <D@3,L;8 65m4\ bPܶ T;/MNDP_ܶT;/MNDPܶH;?фmWDHH&4a ]A,DW)]! @H +PU## ``qA# ``R# `Bc)# ``Cd-# ``ASep1# ``cf5#`AT0 pP&𹀘A0ޠZh4!F`4aFa@ 9 #F`4AFa4F ÃZфMфAM A0 4M!Mb1@N`4!F`4aFa@ Ux1(фMфAM A0``F`4AFa4F  #`0-xw A0b S#`0݃/A#`0/A#`08xuЁ|F `qP:F `q0:F `r:,NA>#`09)#`09)#`0:)V A0FBA0HbA0J˃Rψ L'uP + L(qP + L)mP +)g@ < `@ &: `@ 8 @3b KB0b LB0b SLB`` 1@i&l!1@&l!1@&l!0T t@ +  +  +Ђ|F ` @ZF `≑ ZF ` ZA>#`0IA=#`0IA=t,A>#`0JA>#`0JA>t A>#`0KA?#`0K|XADzψ Lk!VH#`0LL!XAg @ HhF @ H؉d @ H (F @ H` @  HA0`&"-vbF  P }1H.hB-'DXBCHdn_uX[ DT|CXMMMSFI0ISG1POSITIONBLENDWEIGHTBLENDINDICESSV_InstanceIDOSG1`HTSV_PositionTEXCOORDPSV0d4,  DPOSITIONBLENDWEIGHTBLENDINDICESTEXCOORDzprepassSkinnedVSMainC +DDAD#DILDB@`$DXILx@BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L U2" d##ㄡL L@@! H(@( c` b$, +1PEYr($PeQH:j {6X/nI$3\=@3, +BPUDI9(FMOCHJH+1mBQE)XB0$A8@(rH`5Q䋍4@tBG !`!a`AaA̡RơH!!%  ^v8ҴCM>@4F!CE1D)% b !Jrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q` G@!C < y> 2L &GC2 +dB("(((`% ((($(PR(PB(ZJb +(r:g( uֱyxyy +LFD N,m.mmm=271 30:Bvector X12@ E £%`0["p{c#k +Kܽɱ5ɥ }M ՙXɥ5̐ m[| &F'G:q{k ck +K:+s+33+!i Kj"!ڶ|!#!8@'m.mL(l,hp~ʄʒʄ䀀f~H䀚H`f-_IIzs+ s3{k[fp `C P 0`QɅ͙ɵ }M ՙD Yɥ5̐ m[H `1&3{c{zc{33+!+{j"ڶ|1!T&@'m.mL̬L\]\PYO]XQ]e-Ln%mk쭭.lm-m@&m.m(.l4`FZ 8@ @1@36`l1@6*d,Xԥ+{sK;s+#IscY!`eq`,bf800E 4Vg` +a B$~BXOP"hz&0 p `C9>& +x (7R/c=cÑ1q2P oC_{7D/c=cx= m0~c'@DD& +l0~'DD6"#R"3Xh@=Ѝ xȆC7ڃ?DNDE6 A0*a `C"D&L1a! džE7bDFfFf$7jD7fF19]%!QM2 (aAٰȌȌFƌ!"'$' bȑa3e6G6VD4AX`arcò`#aB#3b32&!.SV_Position0ɑݘ!BU5$Ea 41ɍɍّ ™ɆL A7dC +ݚGHs! +o"): @O#0XG= z@F]ѸV PA49$2E `Ka<@O[\ݸV@O# 0XG=`z<`i@en-ͭ mn\+P*V`6.@TLE fAwP*TXG=`Dͭ,ɍ o\Hz U=hfA{yksK{+sC c4V22B%! l^%VdeÀ̊lhVdeP͊llVd ] ؙXݔ`/ٵձM4ٵM B[X؛]b4L#5X[X YY[ܔ`E2V'7VfVV6%h:dx.source.argsSۨBbW&76%Ѝ&dx.valverSިC2FV&FV6%2dx.resourcesSDBWFF67EPCbVvD6EFW6%x:dx.entryPointsS6yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q /@ <~@0m6\B@0_ܶ%H;/D0! ap/0CM~qF0 <<#mpK(5=mpK(5=#mpOD4!@m,aβT?_ EX@=*H˚a F,R\e7PrR%R$eR(EQ0 $&*LU +Lޠ& +(L] (0APbA 2& 8Lp $0AP|a! Bb&& NL $:1AHvb! B<&Iz# `ՁA83H$g nL# `t͈A 8}@r3b ā$v@rA# `A4b (AЁH# `BAxӈA 0w``@$S +{w@ՈA 0xf`  +?:?n$s +}y ׈ 0Ä0b  *`#`p|L(( +?Ä0 +4 +> `؀06; ~80alv & a"p`P(LD 0bp ,0v"Ba6 g& („0l@LQ( `؀0; p +80a A ?™f?L#`pЂpC *@Ä0b - +`?0c@*0bp +3h&pXR3+&1 ` X@B4VF ^!2f 9X1@/ʠ Baƀ5``4!& A0F dA0f 8X1@10F dA& A08xY `@ ^Av8aƀA08xYRf R*=F1 RHHb"1`y *UPb@ q|haƀTA08!\VF p!9& A08\A `@ qa1@C1 J`P21 j`ABT;` | +@A2& Jpf >W*0F ;P`M `4A& фA0Fa`18  `4!& !0FaM = `@ .w;& ф0F`M `4& @& A0! 0F`M `4a& b0̺|  AA0a AA0aXp@gl3a A@A0a AA0aX@g03a ApA0a A& A0aX@go3a AVB0a AfPB0aXAgF 3c@ +`g 3a0| +`Dg03aQ0F  8Xtf :`X1@&`Z0F  7Xs& A08l ``1 q`"Ay*D`"Ay*D`@ &r`aƀA08ta `@ p&rPa1@C'\f0,X3t m?ĭ?w +0wP +0PAZB1 R@,A0c@AQ*hB)3+ 0L#`p63D0 u?į?L#`p6 `1MÄ0bp N8Č +c +hBL B0a& „0@  \`QhBL B0a& „0@  \ehBL B0a& „0@  \jPhBL B0a& „0@ M|f PX1@-L `@ 28 & A0%/0L#`ͅJHbL#`J8bL#`K(bL|& A0%*3& A0%"3& A0&3& @> d{! d|1 d}A \A'Q3(l&0 h L 0aE9{1a&0 h L 0a>1a&0 h L 0aca1a&0 h L 0a1 @b`@ P & A0hc--0F  8`0 3a Avn!A0a Ao|0b Ynei `@ ݐ `@ 2ޘh `@ ޠ 6τ0b o0b xu0b YxD0b zn?0c@ + oÄ0b zn?0a ?a?L# `kFnF3c@ +A @L# `kFnF1a$Ta0b yniĄ0b ynh„0b ynhĄ0b yni„3(W!O q 2`>d#Q>B߼E >R[e@#ݛd#Y>bM >re@#7^/ρS44M@ODXz`gCM[wP`|&0Զm mgCqP6`|&0Ժ ngCoP`|&0ش vmgm[n`߆`|&0ظ vng[c`P|&0ܦ`|&0ܴ% wmg}[ap&`|&0ܺ ngngCngngngogCo?@4FB@YgB\$8`cH#M@#UDO5QKSD S@H +4Đ:Om` MC #H +4Đ:Omb MC #܆H +4Đ:_m MC #ԦH +4Đ:_m MC #1[TheSTAT `tDXIL BC! k #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄6* R`D  #Cp104-P/M%LHDL*#a!ޡ Ɓa fƁAʁDA a!aʁPRe#M 9 +DClTQ2븑ȳ$bq}MQ䋍4@t4=brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C @2L &GC"J` + +0 + ʡ$ +0 +p J@ J@ +U< +(ʦ +(B("(jp"gsбyxygy LFD oM $Efe%&,f&gl&eCLd@(  l AIs s+33+ h6C!! p6 ހΑX[PYp6 D$0j0A 7`7A m4- &4A``}&A 81<.worldMatrixڠ dm\tq{k ck +KÛ 9lР褹х ͕%Mk@`D 5 ap6$φ 7A !11L@D@L̠\`'W677VFf5Fi**iPPš 6`b:>.BLENDWEIGHT  `2yPCwb"#TDD4T45A( Kt^7Atgf+m.m,hPdB a6X7 )/47 1PDwD6,CAPCw: 0A8n@"float|@M P m`pۆ6 | +aQintRP0B)B666427)AP ŮLn.mJ@4!s c+u\ئI2<:)AU ..l.lJp!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q (@ <~@0m[6\B@0_ܶH;/D0! ap/0CM~q&0 <<#mpK(5=mpK(5=#mpOD4!@m@=*H˚a F, TQ\Pv3Pr(P P"ER&REQ4# ``ӡH# ``AAL# `ȁDjA# `$kшA  t@p҈A  uPAxӈA  v`5b \pdP$XX# ``A&q ׈A {́6b ls0h$h# ``AWu`L(DF`؀0 3=a"p`Cu0l@lu( F8:6 g: D  Dp&aCbF  ;34MA%*=FHbb0`y *U tb2e` +è9A0pA M!Mb`@ "_8F`4AFa418LфMфAM BF  RV`4!F`4aF;ψ L@ #`0C-0wXp@Dz=ψ L #`0C.<{X@Ǹ?ψ L #`0C/HX@ǾQψ L(#`0C8TXA5)k ;@>F|Q1cDg`A!A!<8  7 ,t( ,A0P +h) #`#`0KHb /A0b Z"ef A0B&*3F `r 1@-h185ψ Lqa#`0MPj 48A0bp Q]IhB&h &È Dz,a 0  0@ #`EXD\&h& h1ADfay1 B00 `Sg@ p F `RX`@ Հ * r!A0b k̅#`0](\`Yg@ ذ A0d.1F ` h 0 3b Sm L#`0_@d$yA͈A (A$yAQňA (A$yQ.1b nEmiˆA 0A# `F^mF*`@ [9DaA)DXBC_w,2=O0[ DT|PC,M`M|MSFI0ISG1POSITIONBLENDWEIGHTBLENDINDICESSV_InstanceIDOSG1`HTSV_PositionTEXCOORDPSV0h4,  HPOSITIONBLENDWEIGHTBLENDINDICESTEXCOORDoutlineMaskSkinnedVSMainC +DDAD#DILDB\@`DXILD@BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L U2" d##ㄡL L@@! H(@( c` b$, +1PEYr($PeQH:j {6X/nI$3\=@3, +BPUDI9(FMOCHJH+1mBQE)XB0$A8@(rH`5Q䋍4@tBG !`!a`AaA̡RơH!!%  ^v8ҴCM>@4F!CE1D)% b !Jrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q` G@!C < y> 2L &GC2 +dB("(((`% ((($(PR(PB(ZJb +hp2gtZzyyyy +LFD N,m.mmm=271 30:Bvector X12@ E £%`0["p{c#k +Kܽɱ5ɥ }M ՙXɥ5̐ m[| &F'G:q{k ck +K:+s+33+!i Kj"!ڶ|!#!8@'m.mL(l,hp~ʄʒʄ䀀f~H䀚H`f-_IIzs+ s3{k[fp `C P 0`QɅ͙ɵ }M ՙD Yɥ5̐ m[H `1&3{c{zc{33+!+{j"ڶ|1!T&@'m.mL̬L\]\PYO]XQ]e-Ln%mk쭭.lm-m@&m.m(.l4`FZ 8@ @1@36`l1@6*d,Xԥ+{sK;s+#IscY!`eq`,bf800E 4Vg` +a B$~BXOP"hz&0 p `C9>& +x (7R/c=cÑ1q2X oC_{7D/c=cx= m0~c'@DD& +l0~'DD6"#R"3`h@=Ѝ xȆC7ڃ?DNDE6 A0*a `C"D&L1a! džE7bDFfFf$7jD7fF19]%!QM2 (aAٰȌȌFƌ!"'$' bȑa3e6G6VD4AX`arcò`#aB#3b32&!.SV_Position0ɑݘ!BU5$Ea 41ɍɍّ ™ɆL A7dC +ݚGHs! +o"Ԃ): @O#0XG= z@F]ѸVPA! Ԁ[\ݸV@O 1A4XG= #m. o*DXO\XG=`@en-ͭ mn\+ *V|`6.@TLE fAP*T~XG=`Dͭ,ɍ o\H UphfAyksK{+sC c4V22B%! l^%VdeÀ̊lhVdeP͊llVd ] ؙXݔ`/ٵձM4ٵM B[X؛]b4L#5X[X YY[ܔ`E2V'7VfVV6%h:dx.source.argsSۨBbW&76%Ѝ&dx.valverSިC2FV&FV6%2dx.resourcesSDBWFF67EPCbVvD6EFW6%x:dx.entryPointsS6yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q /@ <~@0m6\B@0_ܶ%H;/D0! ap/0CM~qF0 <<#mpK(5=mpK(5=#mpOD4!@m,aβT?_ EXPӂ4 H + MC /kHa F,R\e7PrR%R$eR(EQ0D&*LV A+L&J(L] (?1AH|a! BE&J/L $41AHjb! B$'&NL $1AH~c!9# `ف¹83.P$wKoL# `x͈A 8~Ps3b $ +wPsA# `A4b (H# `܁|ӈA 0xpa@$c +|xPՈA 0yg`  +?;? +$ +~z0׈ @(Ä0b L*A`#`p}ÎL(( +?Ä0 +4 +? `؀06;  +80alv @A& a"p`P)LD 0bp ,@ÏvBDa6 g& („0l@LR0 `؀0; +80a Q ?g?L#`p *PÄ0b G- +a?0c@Ԃ+0b G- +=?0c@܂ + *Ä0bp ,3D.h&pXR3D.+&1 ra X@"4VF Ѕ`2f \X1@Oʠ `ƀ6``@ ]!aƀA08vXVF b3f _pJ%f _(JP bƀ0H`"`Dy *RHLbB `A08[aVF n9& A08A[! `@ pa1@#@1 |)`@ pp`aƀ*U#`ƀUYaf phRX`͂0c@*ɘ0*1 \ `18+ `4!& !0FaM : `@ s7& ф0F`M `4& j& A0! 0F`M `4a& b0j0F SЃ`M `4A& фA0Fa03c@ +0b >BT0b Y>S` <τ0b ?0b Y?“` >τ0b H0b YH܂`A Pτ0b I +0b YIB +` 5ό1p*)k 6τ`Dg03c@*u :τ`Dg1@&X Z1 xa`@ a%h0a1@&X Z0F ਉ7VW& Yaƀ U!HA!HAA08rBaVF ȉ8^u& A08r! `@ x%pa d1 dA dQ oÌq +#`pG o`Ä0b yn?0a$4qQ͌ +# `jmF2a$4qń0b xmiA Hq +A HqqA HqqA HqqPW!O q 2`>c#M>B߼A >Re@#[d#U>bI >re@#7^/ρS44M@ODy`gCMvPצ`|&0Զe mgCpP`|&0Ժ ngC[oP`|&0ش vmgmm`f`|&0ظ vngc`fP|&0ܖ`|&0ܴ! wmg}ap`|&0ܺ ngngCngngngogCo@@4FB@gB\$8`bH#M@#UDO5QKSD S@H +4Đ:Om_ MC #H +4Đ:Oma MC #vH +4Đ:_m MC #ԖH +4Đ:_m MC #1[RheːSTAT `uDXIL BC! l #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄6* R`D  #Cp104-P/M%LHDL*#a!ޡ Ɓa fƁAʁDA a!aʁPRe#M 9 +DClTQ2븑ȳ$bq}MQ䋍4@t4=brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C @2L &GC"J` + +0 + ʡ$ +0 +p J@ J@ +U< +(ʦ +(B("(jp"gsбyxyy LFD oM $Efe%&,f&gl&eCLd@(  l AIs s+33+ h6C!! p6 ހΑX[PYp6 D$0j0A 7`7A m4- &4A``}&A 81<.worldMatrixڠ dm\tq{k ck +KÛ 9lР褹х ͕%Mk@`D 5 ap6$φ 7A !11L@D@L̠\ VGǖV66VFf5Fi**iPPš 6`b:>.BLENDWEIGHT  `2yPCwb"#TDD4T45A( Kt^7Atgf+m.m,hPdB a6X7 )/47 1PDwD6,CAPCw: 0A8n@"float|@M P m`pۆ6 | +aQintRP0B)B666427)AP ŮLn.mJ@4!s c+u\ئI2<:)AU ..l.lJp!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q )@ <~@0m[6\B@0_ܶH;/D0! ap/0CM~q&0 <<#mpK(5=mpK(5=#mpOD4!@mPӂ4 H + MC /kHa ~F, +TQ\Pv3PrR*P%R$eR(%QeA# ``AAL# ``P# `TkшA  t@4b HTd4b Xe5b \fcP$XAX# ``A&q׈A {́6b lt0g$Ah# ``AWuPۈA ف7D2 +3j@$Aȃ<6 g6: zD Fb`؀P 3[>a"p`0l@lu8 (80bp )E pP&𹀘A0P f + *PDbb `y *n0ڀ f!X`@0*9`@ [4F`4AFa418 фMфAM jF  R`4!F`4aF?A0a M!Mb03b ;BT L@ Lб,3b < L O(13b = L R4б/3b > + LU(@бF c6m #>F|Q%*D`b@y*D`b@y,L ;,CA `$ +1K&0bp K8hB&h &È D4a 0  0@ #`>;&h& h1A 0 B00 `S'A0%.1@,RbA0B%.0+ 3b Y LhN#`0K(aXV1@i-`*`@ & A0B&2K 4A0b \ LqaP#`EM[&h& h1A:t1 B00 0bp Q_KhB&h &È DA3q 0  0@ 6|F `: x`@ &he F `J 82ψ L#`0F\8_0b Skȅ|F `z 1@ 6"`@ ذ @>#`0^`j DyAA0b SmDA (q!ь$w!!ɈA (q!Q$w!aA 0q! +# `]̆ll$w111b  nlȆi[8Da˰A)DXBC/._/޿#qw? DT,1T888SFI0ISG1htzSV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV04COLORTEXCOORDPSMainDDBDILDB/` DXIL/BC! #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@" rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + c1 +<y +LFD N,m.mmm=271 47float4xX@h|0c{ cdAgS `Fx6 "h0PwgS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X@e-Ln%m+뭎m-mt::::"position$colorω$$]ۛ 30:BvectorA 0`1@U(``03@ rL+8.5 Pk0 3*0461UB28pP CL08 pqi9   +@<@6u@[  0:4<30:_11a _12a W"h@XA0CPpP a8|,bF0_22!a ,×"hLAXA0%CTpP c8|,bF0_32aa L"h\AXA05CXpP e8|,bF0_42a l"hlAXA0EC\pP g6@{ +P + + + P L…1{c{sVp ax&A  "@Xp1@5:+s+33+!i Kj"!ڶvq ,kft$55VV&TgfV&4cCF'D3C3$mA`ݛYS\ M)N. Hkj̭L̬Lhꇤ-N. ffHh:Ј700:4$90241:27/<949A$9020E Р?c ,bfp!0!PFƢ.͍]ݛO\ڙ[H :32247=@%`p,b00 0`1@K "hs 0X $`.a`0@Pe0%I H0%E Ј? c  9343422uint LXMLC23` kkcQF7ˮlMm.̭ $͍dg4IF~$ `1@O( 'rB'&2࠺xb=1 001ee,,PDHM$ @, 4?h@@Ỹ4902:329 ):1:22:329$90200 m `pf@Qɕؕѽ񘱽ѱ,i$B,` hCW4cCBUGW'W&CdCbW6F&D3m"-B\X682)0I0Ņ~؀fʀ-]\\lPԡ-ނ.F=! A]09327 FL $ ĪLn.màyc8 ɥсЀ8%9901 ȥ́ȕ͕ٕ4(T͕С́̽ɍٕ́ɹ偄M̀ ͕͕СсչС0% 9M4(4(Ց}͹ͱ4(Ց}ѹͱ4(Ց̡}͹4(4(4(1= 1} UIL ՙɥȕѕɡ4(5(р4(р4(рܽɱ5ɥ4(рɵ5ɥ4(рх ͕%4(ɥQɅ͙ɵm9U}5a}M-%99%9} =9M} =U9Qu4(4(4(ՙɁ ՙɁȕѕɡŤ4(5(р4(4(4(LՍɕ ՙ$ххх ՙɁȕѕɡ4(4(PɕЕȕѕɡ4(LMхѕ̅ȕѕɡ4(4(р@M5X=сѥLY}Qɝ5(5(рЕL̅ѹЕ ɑ4(ȕɹѹ4(5(4(X=iAɕ́ɕ%хYM5X%iAɕ́ѱԥс%LY}%х%4(5(X=iAɕ́4(4(сԥс%􀤹х ͕%%4(ѹԥ􀤹х ՙm%uԥ4(ѹͥѥձձх ՙm%uܽɱ5ɥᥰѠѹͥѥĸ4(4(ȕɹ4(5(4(X=iAɕ́ɕMYM5X%iAɕMѱԥс%LY}%х%4(5(X=iAɕ́4(4(сԥс%􀤹х ͕%%4(ѹԥ􀤹х ՙm%uԥ4(4(р̭Á􀘱Ѡ4(4(Ɂс쀤쀤4(5(сԥс%􀤹ѹ%mu4(%8U}5a}M-%99%9} =9M} =U9Q4(5(̭Á􀤹ѹ]muձQɅ͙ɵm%uѠѹͥѥĸ4(5(5(4(ѹͥѥձձܽɱ5ɥ᱀̭Aͥ4(4(ȕɹ4(5(4(ԥрɕAM5X=iAɕ́ѥLY}Qɝ5(5(ȕɹѹԥ4(5(4(X=iAɕ́ѱ5ͭYM5X%iAɕ́ѱԥс%LY}%х%4(5(X=iAɕ́4(4(сԥс%􀤹х ͕%%4(ѹԥ􀤹х ՙm%u!ѕ4(ѹͥѥձձх ՙm%uܽɱ5ɥᥰѠѹͥѥĸ4(4(ȕɹ4(5(4(X=iAɕ́ѱ5ͭMYM5X%iAɕMѱԥс%LY}%х%4(5(X=iAɕ́сX=iAɕͥ4(4(сԥс%􀤹х ͕%%4(ѹԥ􀤹х ՙm%u!ѕ4(4(р̭Á􀘱Ѡ4(4(Ɂс쀤쀤4(5(сԥс%􀤹ѹ%mu4(%8U}5a}M-%99%9} =9M} =U9Q4(5(̭Á􀤹ѹ]muձQɅ͙ɵm%uѠѹͥѥĸ4(5(5(4(ѹͥѥձձܽɱ5ɥ᱀̭Aͥ4(4(ȕɹ4(5(4(сѱ5ͭAM5X=iAɕ́ѥLY}Qɝ5(5(ȕɹѹԥ4(5(l p͡qՑq}͹ͱQ]^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\@ʈ@@@@hh@Țv@@@@hh@ؚv@@@@h@v@@@@@v@@@@f@vv@؈@@@@h@v@@@@@vv6~\ʸܾ\8 \\ SQӐ H\\\]K H\țZ[XYHٛ][XHQ [X\[X\ZXX[HZSPTY[KB\\\]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓNBNB\S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNBNB\՜S\]^[ \]ڛȔ\]ڛN[ ۛӓN[ ]ۛUӓNH\X[YUӓQNBNB\\\S]^[ \]ڛTUғN[ ۛ\[ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\S]^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQNBNB\S\Sћ]Y^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]ۛUӓN[ ]YUQN[ ݛUӓQN[ ۛӓNBNB\\\\\\^[ \]ڛTUғNBNB\\\\\Z[Y^[ \]ڛTUғN[ ؛[UYSUQNH] ؛[YYXSQQPNBNB\S\ݑPY^[ \]ڛȔ\]ڛN[ ۛ\ӓTSN[ ]YUQN[ ]ۛUӓN[ LUӓQNBNB\S\\\\^[ \]ڛȔ\]ڛN[][]ڛH] H]UӓNBNB\S\T]Y^[ \]ڛȔ\]ڛN[ ]ۛUӓNBN!4D@V%FFW5V657VV&6WUvV5&WFVV6%WFV&Ǖ6VGVV5FV&75FV&EVfV6F^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@^T@@@@@@@@@@@@@@@@@@@^^@N@@@@PttR@@@@@@@@@@@@T^^^@@PVV@@R@\F@@lF@@pF@@b`dhF@@bdpF@@jbdF@@b`F@@bdpF@@`F@@fF@@h\`F@@F@@F@^^@VV@@\F@PR@FF@PR@PR@tt@@@@@ttξ@؄@z@PRv@@@@@ttξ@ڄ@z@PRv@@@@@@؄Pttξ@R@@@@@@@@@@@@@\P؄Rv@@@@@@@@@@ڄPttξ@R@@@@@@@@@@@@@\PڄRv@@@@F@^^@^^@@\F@PX@R@FFF@PX@R@PX@RF@PR@@PX@RF@PR@@PX@RF@^^@6QBK*ps_6_0Z̡ͽՑt^^^ʄ^\\^\\^^^^^^^8hi*k+#"+;raA"5Tc5Xc5Z5^6&H2A@ lY6Q&a ܘ BVMf0! H٘ P AoL6k211<6a džA6<&ܵ!0.SV_Position $І`6&I4AH lGzzllbIjL D|lXd=ң=>d=d=Uӓ'xbâ!Q`2eE&wVF7AH lGzzll|lcpl(XэK8u ' @O#0XG=&`zC=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePP,TJ +a + c1 +<yLFD oM $Efe%&,f&gl&eCLb@  ql X2 Ld@4BYb`gCL\X$`C0m &0׵!6 M2kCрj +Ks2e6F6A( Bl BMhBx b@bIjPHB  `27a` cD6gpf 13̀60)/02 B1mX7 `b `C7`CausP4&"mnn@44ξh̥}+r{k۠ԁvC666427)AP ŮLn.mJ@4!s c+u\ئH2<:)U υ.,..mnJ!sK+K" +lu\sЅ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$2c8b96d78a1d396900b0187087323851.pdbHASH,׊9ip28QDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@<@ yaLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hQBbb dՆ  47.SV_Position Ά 6,q7xzbz X&A2ذ a} "') 9`C A0 +;+ ҆X o 6maP76XPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ@!sK+K" +Xu\oyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma ;A,FB)\Q)3# `iaȈA @[eY2b Ƈ\$ ʈA at$!̈A c|Ԍ$A |3b ,aI`$ 0  0@ F$1"|H3b HXi1b HXi0b HXi0b HXia DXBC8Glqh8 DT .3<3X3SFI0ISG1`HTSV_PositionTEXCOORDOSG14(@SV_TargetPSV04 +TEXCOORDzprepassPSMainDDDILDB`,` DXILH,BC!  #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L8#%9P( PR;bb1@d` E 􁰄pYK8( E ЄpY(K8H /E ДpY)K8h /E ФpY*K8 E дpY+K8 E ĂpY,K8 /E ԂpY-K8 /E 䂰l@AHPAX`AhpAȽ}չM+8 c25VF7.là @a`Xy ,@8  }M ՙXɥ5̐ m[rqf5i:+s+33+!i Kj"!ڶja 0M)N. ss&FF't$55VV&TgfV&4cCF'D3C3$m"Ahۛ\[[S\ M-)N. Hkj̭L̬Lhꇤ-N. ffHh;4902$E `mp~ʄʒʄ䀀f~H䀚H`f-ZC<<zs+ s3{k[f `CP 0{`QɅ͙ɵ }M ՙD Yɥ5̐ m[|{`1&3{c{zc{33+!+{j"ڶj T@'m.mL̬L\]\PYO]XQ]e-Ln%mk쭭.lm-m@&m.m(.l4Ma8nB@ @1@ `ICJ;CcK;C+##QF,0@1@S Id,Xԥ+{sK;s+#IscY "`3FfB0X#`3lX%\bp + &6TLLa%  %@&E `3,b&%@B 06"1$51  @4 e0Ć'&A  'm.mL̬LhdNnNL̬L*m.m(. (hE?섀2 >`b OL'  ?tex@@3V?$Texture2D@V?$vector@M$03@@@@A@-zB,-,X̅ +kc+ +SY@-g. hj* Ln. (hYaAxb,bL ]U\ڛۆa-DT&VwfbU&7aX 1^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@Dܾ\DF@Dܾ\DF@D\DPʄR@t@P`R@@@@hh@v@@@@hh@v@@@@hh@Țv@@@@hh@ؚv@@@@h@ʄʒv@@@@@涜vv@@t@PbR@@@@h@vvȄxʈ|@ʄ@t@P`Rvd@@t@P`Rv@@t@P`Rvh@P@R@t@@@@@h@@z@\PX@\Rv@@@@@@T@\v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@vh@栦P贠@R@t@@@@@@\v贠@ʚ֬P贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ʚ֦ȬP贠@X@@蒈@t@ʒR@@@@贠@@z@P贠R`v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@v@ʚ֠P贠@R@t@@@@@@\\v6A\ \ʸܾ\Ҩ.// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; + z.\shaders\include\in_out.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAaNnj. AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAoAAaNnjAaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhAoAAaNnj멎AaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhA$͍L.,DkI(fAoAAaNnj. )AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAČ-.̍D*ȉjAoAAaNnj)AaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAoAAaNnj)M.LAaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAČ-nM mDkI(fAČ-dMDdIjAoAAaNnj. N J .lnAaAČ-nm.. Di**iAoAAaNnj. N J .lnnj-ͭAaAČ-nm.. Di**iAČ-Dͭ, nDDȉ(jA.͍Dͭ,ɍ,mlDDȉ(ɉ(ihjAoAAaNnjH̬AaAČ-m.. Dd m..mAČ-nM DI)iAČ-n.̍D*ȉjAČ-N oM DkIhAČ-nN DkI(fAoAAaNnjN J .lnAaAČ-m.. Dd m..mA-͍L-. .͍. DkIfAoAAaNnjNlͮAaAČ-m.. Dd m..mAČ-N oM DkIfAoAa`ws r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplusЋ A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰE1Q 4Pcp$P +psC0FkƆ5bCӨؘ 4ӆ@6LY}AͥѥMf4Ԙ y6,Aa"') Mhp, iomiioltQJL~qۈ8'!$?a!P0BB(RqtŠA2n.BWBZGn H)8Bn.BWBZ/nqH)>B# aFGsɗ&_l h&H"Lo0P0@P@ @P` | +00@ +@(0LÑjg!6(8bJj rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q` `!@C < y@2L &GC" +B("(((`% ((($(PR(PB(JJb JJȜsRgh v@>yz +LFD N,m.mmm=271 30:Bvector X12@ E £%`0["$90241:27/<949A$9020E LeA ,bd( z!0!XRp`ICJ;CcK;C+#[MDR` kkcQF7ˮlMm.̭ $͍dg4E `1@XX( 'z'6m @ p `X:!`@X PB, 2 MԄMXLi&d `He!0I `<Is s+33+!+#33+Jr s+# +  +ڶxi!`h U]\ ]ݛ[ ϲ A[L-  ?tex@@3V?$Texture2D@V?$vector@M$03@@@@A/.-X̅ +kc+ +\@-g. hj* Ln. (h\ԅ@$V%".b\*L ]U\ڛۆ!/DT&VwfbU&7a ؃ 1^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@Dܾ\DF@Dܾ\DF@D\DPʄR@t@P`R@@@@hh@v@@@@hh@v@@@@hh@Țv@@@@hh@ؚv@@@@h@ʄʒv@@@@@涜vv@@t@PbR@@@@h@vvȄxʈ|@ʄ@t@P`Rvd@@t@P`Rv@@t@P`Rvh@P@R@t@@@@@h@@z@\PX@\Rv@@@@@@T@\v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@vh@栦P贠@R@t@@@@@@\v贠@ʚ֬P贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ʚ֦ȬP贠@X@@蒈@t@ʒR@@@@贠@@z@P贠R`v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@v@ʚ֠P贠@R@t@@@@@@\\v6_ \ʸܾ\Ҩ.// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; + z.\shaders\include\in_out.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAaNnj. AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAoAAaNnjAaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhAoAAaNnj멎AaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhA$͍L.,DkI(fAoAAaNnj. )AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAČ-.̍D*ȉjAoAAaNnj)AaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAoAAaNnj)M.LAaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAČ-nM mDkI(fAČ-dMDdIjAoAAaNnj. N J .lnAaAČ-nm.. Di**iAoAAaNnj. N J .lnnj-ͭAaAČ-nm.. Di**iAČ-Dͭ, nDDȉ(jA.͍Dͭ,ɍ,mlDDȉ(ɉ(ihjAoAAaNnjH̬AaAČ-m.. Dd m..mAČ-nM DI)iAČ-n.̍D*ȉjAČ-N oM DkIhAČ-nN DkI(fAoAAaNnjN J .lnAaAČ-m.. Dd m..mA-͍L-. .͍. DkIfAoAAaNnjNlͮAaAČ-m.. Dd m..mAČ-N oM DkIfAoAa@s r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplus@ A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰF1 6lcD +vsD0n `L olHl7^6l6|6cC5`:GB_SceneBufferڀxmFm!0 xL` 6 וĚ d7T!/clc=c`P=p` m@vcB=>փ=&  X c7Bbc=cp(P=` Gy{|}L 6 y{`P=p` m0vc >փ?&؍X c7rb@d=c!2A84`  Fl8l#=#?DdDLd`!@ CmBLؠ 6+Bi**i! mL1 zlXlE\E`Ej#FlEd͔W]XY!! BR 6{Pڠyڸx HpzKK{s $g0A@`=aq "TEXCOORDyx HltDL llL6Ѝ z 47:q "p&*B#`: PinstID DPMU X<10.@Dp8outputDPANVXG=`z ] ؙXݔ.ٵձM/ٵM [X؛]/D4P[X YY[ܔ`E2V'7VfVV6%H:dx.source.argsS٨BbW&76%&dx.valverSܨC2FV&FV6%؍2dx.resourcesSDBWFF67E0CbVvD6EFW6%X:dx.entryPointsS2yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq /@ <~@0m[5\UDT:#mp UDT:P `~qۆ <D@3, L;8 65m4\ bPܶT;/MNDP_ܶT;/MNDPܶH;?фmβT?_ E@Pӂ4 H˚a A,DR\eW3%W T`0 c&L> z0A@Daဋ A/&_# `Aa3+P$i L# `܁`Ȍ +t +A (ykY2a A'?85?0a$pl`) |pcA ({m2a A)?@7?0a A(?@7?0a A'?@7?0a A&?@2?0c@(0bp 82c@ +hBLg5c@B`B 1 \AC`@ +QP TF i `ƀx6@`4!& A0(Hakf VP1@0`ƀ=@`4!& !0FaM `@ 2 & ф0F`M `4& A0RF0F`M `4a& b0F  Ta 8ɛ0F`M `4a& b0F 4T1 `C`4!& !0FaM `@ *\p2x `4!& !0FaM `@ ^5 `4!& !0FaM `@ *q7؅ `4!& !0FaM 3ό *#`p \p +W \ +S \ +O}d `@ yX `@ .z` `@ zh 3a uA0a A0a `A0a؁|& A0a `@ .~ `@ ~ Ԡ3a `uL#`p.A \! ^g1@k$vA 0F " ^0:& A0JĀ 3a uL#`p8) \)ep +`u` +0F ZqS& A0X `@ (40`<(L#`p9A) \0qP +0b WLCB0aX|& A0fb `@ .`: `1@&!H!0 nA> \7|p 0b NB0a @LF + `@ P`1@'l!0F z[& CZτ0b O)B0a  +L#`pE>A--g1@k,h!0F " ~ Z& A0ʢ@ @3c@… + \gz 0b ZC0aX@Й0,A> \k1n`0b [C0aXЙ0 A> \oqb0b \ħ` 2τ0b \0b ]` `@ +%Vaƀ` A0("X `@ +%Va1@/xR0F  h؉fƀA0p,ڢ-n"0F  hb1H'/-B' ` @ hȇ g Y(Ptf`|&0Դ mgC}kP`|&0Ժ ngC͛jP`|&0ش vmgmi`6`|&0ظ vngg``|&0ؼq vogMfp׆`|&0ܶ] mgÍep6`|&0ܺI ngcp`|&01 xmgnb߆`|&0 xnga6`|&0  xogCN۟g|&0 m{gCg|&0 nvgCP|&06g|&0 zmpgnۛf|&0  XUD UDd8`44QEADD\4E0TSTATX `VDXIL@ BC! M #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L `2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄6* R`D4\=䯄_6*aRlD  #C|104-P/M%LHDL*@0$ęa!ޡ Ɓa fƁAʁDA a!aʁP0e#M 9 +DClTQ2@?γ$bq}MQ䋍4@t"MCBbrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C <d2L &GC"J` + +0 + ʡ$ +0 +p J@ J@ +U<ʦ,(2("(B-"gsRgh(yyLFD oM $Efe%&,f&gl&eCLe@,  l Is s+33+ p6C!! p6 ڀΑX[PYx6 D$0j0A86`7A m4- &5A``}&DA 81<.worldMatrixڀ dm\t700:4 qm@36 :N]XP\Y&DAAԀ[>6QɅ͙ɵMmAqoy Ҡ `0pA 86 d'ǡ.l@l2 46isHighlighted` xAg,&DA؀`4s@w}0A 5`@@#&jB6A HaЄB)l8+&0 +U0 +5x A+0zcKs+k +[j +Ks#4D4A(`P cA  -P lʒ&L2 fA p . [.SV_Position &AaBB,, ,"') 0 / q C/0A`4 簡@W0 hMEsig_ld4ξЕ}mPaءA{;;fFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥMLaإ%MхѕM ZK\[ܔṌչѕM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ,@ <~@0m5\UDT:#mp UDT:P `~qv <D@3,L;8 65m4\ bPܶ T;/MNDP_ܶT;/MNDPܶH;?фmCM & )/kHILDN,$8285a13ff1968c15fedd0e2cff29190a.pdbHASH?,) +DXIL` `DXILH BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L V2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄6* R`D4\=䯄_6*aRlD  #C|104-P/M%LHDL*@0$ęa!ޡ Ɓa fƁAʁDA a!aʁP0e#M 9 +DClTQ2@?< @rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C <d2L &GC"J` 0 +X@ ʠʃ(R((R J: +yrymLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ <™ ap6$φ 7A !11L@D@LҠ\`VGǖV6f5Fi**iPPš 6`b:>6SV_InstanceID 6`0lX2(3  6c\&6A X``s"TEXCOORDʠ``C A A `Cis`A666427)AP ŮLn.mJ@4!s c+u\ئI2<:)AU ..l.lJp!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ,@ <~@0m5\UDT:#mp UDT:P `~qv <D@3,L;8 65m4\ bPܶ T;/MNDP_ܶT;/MNDPܶH;?фmCM & )/kHa NA,DWb@) @H +PU## ``qA# ``R# `Bc)# ``Cd-# ``ASep1# ``cf5#`T0 pP&𹀘A0Zh4!F `4!F`4aFa@ :$M!Mb1@NjфMфAM A0 8M!Mb18 Da4!F`4aFa@ V2@фMфAM A0dԠ F`4AFa4F  >xUM!Mb 3b /s L@ +#`0B)ge1@ Na2`@ p@ A0!3l+ DpA0b S9T L +O|F `BW 1@)`"`@ &u ;ψ L0 #`0-hw `A`f`1@ nA 1@)p`@ &yS:ψ L fP L bP L ^t A0ԀA0̀A0!ĀSψ L0mp + L@ip + LPep +Ձ)g@ &880`@ @60`@ &H403b ICB0b SICB0b ICB`}@ +1@ %!H!1@)%H!1@I%!H!0P   @)؂|F `{[F ` |[F `|[ jA>#`0>B-#`0?B-#`0D?A- + A0pPA0r$HA0t"$@yψ L<1z  L=Aw t{ψ L`qn` Lak`h+}ψ Ldb Le>pб3b Z Li?@1H-^,̂'A0P%,p"1H-^,"'A0P%,v"1H-^,̂'DXBC?KEe|'R*h7 DT,1282SFI0ISG1`HTSV_PositionTEXCOORDOSG14(@SV_TargetPSV04 +TEXCOORDoutlineMaskPSMainDDAILDB<+` +DXIL$+BC! + #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L<#%9P( PR;<brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@ 2L &GCB("((’(B(($y LFD N,m.mmm=271 ::4547float{ 0ZYK[YW[ [ڠ@BVsOutputZPrepassDh+{1c{ caGx y; `-bF0`pJx `DSţ̍n\227:7:int{ 40bp + `$1YU0 0C]47:^vectord@G X $Tn```0 `4Pl @ e6&A@B "@71@# +l&A$ C6 0X5B@@Pl쀂30:<Nmatrixbb1@0bd1@ E ` ++f4 ,ppY(K8` 1dd1@S +X /E М`Kf4 ,ppY*K8` 2fd1@ + E м`*kf4 ,ppY,K8` 3hd1@S  /E ܂`:዆f4 ,pl@AHPAX`AhpAȽ}չM+8c25VF76nÀ/LA@ `E `偰,b3jct$55VV&TgfV&4cCF'D3C3$mAXC Hkj̭L̬Lhꇤ-N. ffHh97960:4P4902:329zStructuredBuffer$90241:27/<949A$9020E ФH7! ,b@ q!0!Xro`ICJ;CcK;C+##QF,0 E ДH$7q`  <uint3x@X@f|1@L0l& `4̈́lX%\bp + &6l @X px `X*!`LI Pn& 2 HIDML)$@ l`\7!I `<Is s+33+!+#33+Jr s+# +  +ڶj;!`: U]\ ]ݛ[ ϲ OL'  ?tex@@3V?$Texture2D@V?$vector@M$03@@@@A@-zB,-,X̅ +kc+ +SY@-g. hj* Ln. (hYaAxb,bL ]U\ڛۆa-؂DT&VwfbU&7aX 1^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@Dܾ\DF@Dܾ\DF@D\DPʄR@t@P`R@@@@hh@v@@@@hh@v@@@@hh@Țv@@@@hh@ؚv@@@@h@ʄʒv@@@@@涜vv@@t@PbR@@@@h@vvȄxʈ|@ʄ@t@P`Rvd@@t@P`Rv@@t@P`Rvh@P@R@t@@@@@h@@z@\PX@\Rv@@@@@@T@\v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ȬP贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@vh@栦P贠@R@t@@@@@@\v贠@ʚ֬P贠@X@@蒈@t@ʒR@@@@贠@v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@\@z@PPX@ʄ\ȚRX@hP\X@b\`RRv@@@@@v贠@ʚ֦ȬP贠@X@@蒈@t@ʒR@@@@贠@@z@P贠R`v@@@@@@@z@ʄʒ\@V@蒈v@@@@\\@z@ʄ\v@@@@h@Ƞ@z@hP`\`X@`\`X@`\`X@`\`Rv@@@@@P@@z@`v@@x@hv@VVR@@@@@@@@@@@@@@ʒ@z@\ʒҺv@@@@@@@@@Pʒ@x@R@@@@@@@@@@@@@@@@@@@@Ƞ@Vz@\ʮҺ@T@PʒX@hP\X@b\`RRv@@@@@@@@@@@@@@@@\@z@PX@PȚX@ȠRRv@@@@@v@ʚ֠P贠@R@t@@@@@@\\v6A\ \ʸܾ\Ҩ.// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; + z.\shaders\include\in_out.hlslid .O. DFĩ( i$ D. nDlLή̥Aj -mdNn d썬 $mͮLέ D,$ Dhed-n -mm -d, D ΍ $  )ii,̥AAaNnj. AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAoAAaNnjAaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhAoAAaNnj멎AaAČ-m.. Dd m..mAČ-dMDdIjAČ-N oM DkIhA$͍L.,DkI(fAoAAaNnj. )AaAČ-nm.. Di**iAČ-nM- DI)iAČ-N oM DkIfAČ-.̍D*ȉjAoAAaNnj)AaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAoAAaNnj)M.LAaAČ-m.. Dd m..mAČ-nM DI)iAČ-N oM DkIhAČ-n.̍D*ȉjAČ-nM mDkI(fAČ-dMDdIjAoAAaNnj. N J .lnAaAČ-nm.. Di**iAoAAaNnj. N J .lnnj-ͭAaAČ-nm.. Di**iAČ-Dͭ, nDDȉ(jA.͍Dͭ,ɍ,mlDDȉ(ɉ(ihjAoAAaNnjH̬AaAČ-m.. Dd m..mAČ-nM DI)iAČ-n.̍D*ȉjAČ-N oM DkIhAČ-nN DkI(fAoAAaNnjN J .lnAaAČ-m.. Dd m..mA-͍L-. .͍. DkIfAoAAaNnjNlͮAaAČ-m.. Dd m..mAČ-N oM DkIfAoAa`ws r +{{˃+ kc++s+ ++rqrq*s;Ks+{+j{#c++s#+Jsc#+r C #+C #+"+3Ks+sA[// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +/* + namespace nau +{ + namespace scene + { + // don't make nested namespace (nau::scene) since this file is used by shader compiler + } +} +*/ + +// Common (C++ and HLSL) block. + +#define CUBE_FACE_COUNT 6 +#define CS_ENV_CUBEMAPS_BLOCK_SIZE 8 +#define CUBEMAP_ENV_FACE_SIZE 1024 +#define IRRADIANCE_MAP_FACE_SIZE 128 +#define REFLECTION_MAP_FACE_SIZE 512 +#define REFLECTION_MAP_MIP_COUNT 10 + +#define NAU_MAX_SKINNING_BONES_COUNT 128 + +#define SHADING_NORMAL 0 +#define SHADING_EMISSIVE 3 +#define MAX_EMISSION 4.0f + +#define GLOBAL_BUFFER_PREFIX GB_ +#define SYSTEM_BUFFER_PREFIX SB_ + +#ifdef __cplusplus + +// C++ only block. + +#define STRINGIFY_IMPL(x) #x +#define STRINGIFY(x) STRINGIFY_IMPL(x) + +namespace nau::shader_defines +{ + constexpr eastl::string_view GlobalBufferPrefix = STRINGIFY(GLOBAL_BUFFER_PREFIX); + constexpr eastl::string_view SystemBufferPrefix = STRINGIFY(SYSTEM_BUFFER_PREFIX); + + inline bool isGlobalBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(GlobalBufferPrefix); + } + + inline bool isSystemBuffer(eastl::string_view bufferName) + { + return bufferName.starts_with(SystemBufferPrefix); + } +} + +#else // __cplusplus + +// HLSLonly block. + +#define CONCAT_(prefix, name) prefix##name +#define CONCAT(prefix, name) CONCAT_(prefix, name) + +#define GLOBAL_CBUFFER(name) cbuffer CONCAT(GLOBAL_BUFFER_PREFIX, name) +#define SYSTEM_CBUFFER(name) cbuffer CONCAT(SYSTEM_BUFFER_PREFIX, name) + +#endif // __cplusplusЋ A@B  // +-I|^h D:/NauPrototype/samples/sceneBase/../../engine/core/modules/render/include/nau/shadersZشD}՝qhڰE1Q 4Pcp$P +psC0FkƆ5bCӨؘ 8҆@6LY}AͥѥMe0Ԙ q6,Aa"') Lha9ܸ8 8 n)/02 mXP#QJL~qۈ8'!$?a!P0BB(RqtŠA2n.BWBZ/nqH)8Bn.BWBZGn H)>B# a9pi0|i(aFF :`1""9;=C8;=8C8<,Ѓ<8C=C9(ԃ9C9;=;C9B8C8 +J2/;iZ̡&~V b0rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q` `!@C < y@2L &GC" +B(2((((((ЀR(JJb JHA sBg( ui@? yLFD mm=271 30:Bvector X12@ E %`0["xZ`@o4i ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A`@B l4蹼̡ͽՑq}ѹͱ b5geTGWGGm..m4aQtbMn4cUt+z{#aF'CȮlMnj-Dg4A` "hs `i0A@i &Ap"@71@SEo +`"L.,h4q]t` +l Ā @&A0@normal0P0XM|)(h!F&AT P +$Թͥ12@0cX x@*:0U4*L` +"@+!pviewDhh8ɥ񘱽ѱаpY,W>$`pYM-W>$``0bf1@s • ( E pC`K&f4 \pYM/W>$``1df1@ • h /E ЄpC`k&f4 \pYM9W>$``2ff1@s•  E ФpC`.&f4 \pYM;W>$``3hf1@•  /E ăpC`>[]_q s@u`wy`"v5VF7[ݴ{ T0 Y.!0y|1 @A]ZБX[PYЌI[\P жx X *projection87177#22:329 0:4<& m @<1X769# :9:329 $m !1B'@$Ƚ }ѱ ՙ m[( <6G6V&TgfV&GoNnNL̬L'm.m(.̇L]XQ]7960:4E Ь>8 @1@3H <uint3x@X@f|1@sc` "ha p" `1@c` +ae &`1!@MM a 1@9`V`p JN,'6=1  10|`х ՙXLՍɕ ՙU%ххm[@ @WG NLǮlMnj-gHچ,&A0`@@YD2< 2<:2" 179& m bqd@,LMхѕMI- 34S5V&7EFWm"-B` A'h^- ]U\ڛۆa DT&VwfbU&7aX @^^@@d`dh@Z@\@@@\^^@@@@@@@@@@Zf@@@@@@@@@@\F@D\DF@Dܾ\D@ʈ@@@@hh@Țv@@@@@ʒv@@@@h@v@@@@f@vv^^@@@@@PʈRȄxʈ|@ʄ@t@PbRvd@@t@P`Rv@@t@P`RvPʄR@t@P`R@@@@hh@v@@@@hh@vvPR@t@PbR@@@@@v@@@@@vv欌@P@X@@ʒ@t@ʒR@@@@ʈ@ʈ@z@ʄʒȺv@@@@hh@@z@ʈ\Țv@@@@h@@z@hP`\`X@`\`X@`\`X@b\`Rv@@@@h@Ⱦ@z@PX@Rv@@@@h@@z@PX@ȾRv@@@@h@Ⱦ޾@z@@Z@Ⱦv@@@@h@Ⱦ@z@PX@hP\X@b\`RRv@@@@h@@z@Ⱦ@V@Ⱦ޾v@@@@h@@z@PX@Rv@@@@欌@v@@@@\@z@v@@@@\@z@ʈ\v@@@@\ʒ@z@ʈ\ʒv@@@@\@z@\v@@@@@vh@P欌@R@t@@@@@@@z@\ʒv@@@@@ʮ@z@b\`@^@v@@@@@ʐ@z@b\`@^@v@@@@@ʰ@z@@J@v@@@@@ʲ@z@@^@v@@@@d@ʞ@z@dPʰ@T@ʮX@PP@Z@b@Z@ʲRR@T@ʐRv@@@@d@ʪ@z@ʞ@V@\@T@dPʮX@ʐRv@@@@h@@z@\PX@ʪRv@@@@@@T@\v6A]sC #+Jsc#+JszsAccK\// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct VsInput +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; +}; + +struct VsVFXOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; + int frameID : TEXCOORD1; +}; + +struct VsInputLit +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 tangent : TANGENT; +}; + +struct VsOutputLit +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; +}; + +struct VsOutputLitForward +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; + float3 worldPos : TEXCOORD1; + float4 color : COLOR; +}; + +struct VsInputZPrepass +{ + float3 position : POSITION; +}; + +struct VsInputZPrepassSkinned +{ + float3 position : POSITION; + float4 boneWeights : BLENDWEIGHT; + uint4 boneIndices : BLENDINDICES; +}; + +struct VsOutputGBuff +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float3 tangent : TANGENT; + float2 texCoord : TEXCOORD; + float3 p2e : TEXCOORD1; +}; + +struct VsOutputZPrepass +{ + float4 position : SV_Position; + nointerpolation uint4 uid : TEXCOORD0; +}; + +struct VsOutputResolve +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; + SX]\\X[X[P\ WY[؛\WY[\YW[Y[XZYZYYY[ٜ :xyz˓K;Cqj9Jrrabr bcK;C+++#siPxy+y3CK{+{#+I9{+s+# "jb +aK+s+C  s+1{s#IsC+aJ*r*1Kc+siPhPhP ;k ys+kPhPxQiPq k+ +q kPkPq k+ ++s+kPkPyy!{s;i [+q++#q k+ +Aq љ+s+KKs+CK1Kc+I+#C #+{kKc+kPkPkPPyiPhPxyzkk{sAZY s#AbbJc{iPhP!+3Ks+*2 +*zriP!+3Ks+*r*j +bzZJ*iP!+3Ks+*j +*r2 +*J*iP!+3Ks+I +"J +r*j +2 +*J*iP!+3Ks+*2b*Jzrj +2 +*J*iP!+3Ks+*2b*Jzrj +jJzriPhP!+3Ks+q +j +ZJrrJr:zr*zriPhP!+3Ks+B +"Jr:rzj +biP!+3Ks+B +"Jr:*jJJ*iP!+3Ks+i +*jJJzrq1kPhP!+3Ks+9bz +b22**2J9jP!+3Ks+ʚ*j22**2JjPhPI3#+3cckPhPxyZYyscc{iPhP!+3Ks+Jr:J2JjbBKkP!+3Ks+Jr:J2BKJr:J2JjbBKiPhPp k+ +q љC #+"+3Ks+kPkP{s+Ã) cљKs;K+9b{ c33++3KJr:J2B9bz +b22**2JJiP{s+Ã) cљKs;K+ʛ+k33++3KJr:J2Bʚ*j22**2JJiPhPIscKs+{{cI;b{ c33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCC9b{ c33++3KKiPkPhPIscKs+{{cIʛ+k33+C) cљKs;K+33+s +k+KiPkP+s33+s +k+s KCCʛ+k33++3KKiPkPkPhP)c+yycckPhPxyAbbzscc{iPhP!+3Ks+zr +B+3Kcq k+K+3Kq k+kP!+3Ks+zr +B+3Kcq k+Kzr +B+3Kcq k+KiPhP!+3Ks+9bz +b22*Bq k+K33+zr +B9bz +b22**2Jbq k+KiP!+3Ks+ʚ*j22*Bq k+K33+zr +Bʚ*j22**2Jbq k+KiPhP)s#K3yycc ^l +-EZh}|PhI3FV&76VGVF[ yq +{{˃+{ kc+{+s+ ++{qqyqqy)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ/ ( Ә 6$ jP ҆5\#5&gpd 5dcC1ژ A9+s+33+ $5l6R#5P7 Anl j `ha5 6  k|ۀ?AoAxolp6 +1AP5$' BMoC olXR>#?#?Pc?R#?ӓTSӆ5?C?55 BU5$E4AH`|aYЏ@Y6SV_InstanceID$ &l56,|@"%"a"|'2e6F6AH`p>` Kj~~jHjGzbzڰƋG~GƊF~Ȇe @?C?B5Bd CD6aYA 8 HȆ!Eh !5ldC +]ƍx +9": u`,%@Ba` +zu`'@ @O#06G6VD6.BDUu@&m.m(.l\+0<'@ @O#%0XG=N`z` d@M.,m\+p{c#zK;Ks +q"' إ}ɥKq:`"view_posD\N6[ܸW 6XG=`z,`A66623)[4bcksi{#c+s1c ;"\TacksI#+sE%2<:27727)C]^4"s{+s!+3Ks+ \\܌ʜʦ|Q eNn%LlnJ`U\ܦф .ͮLnJu\ئQ ElNnlnJ\ʂ1u\ȦʦQ ϥ̍N.-͍nnJp#yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq -` %P;PEAD ~qۦ@ <~@0m6\B@0_ܶ!H;/D0! ap/0CM~q60 <<#mpK(5=mpK(5=#mpOD4!@m[,WBa .A,DR\eW3%W T`0&GL= {0A8` A &-L[ 0A8\apစ c&=L} (1A8RbpX 1,&ZL# `Aq3+# `aA 0tip2c@ +A (vkZ2a A?8`?0c@A +A (wl2c@ + yÏ3D$nj-3Dp A?@>?0a$ok1 {CCA (zl\3a A?H`?0a A!?H`?0a A ?H`?0a A?H9?0c@0b <3+ 0a&00h1L#`,ф0hL 0a&Ä0b dTM 0a&00h1L#`ЍwUل0hL 0a&Ä0b `p +ciy0a&0b ,l?0c@ + tPW3+ 0a&00h1L#`PBmÛ3H Aq 4?An?L#`PŒmC  CÄ0b -i?0c@ + CÌ+#`PmpC CÄ0b -g?0aA% k 0c@ +hBL B0a& „0@  Tg +hBL B0a& „0@  TPlP hBL B0a& „0@  Tq hBL B0a& „0@ M|f 4\1@B `@ s & A0a/0L#`pC)HcL#`p)8cL#`p)(cL|& A0!3& A0A3& A0a3& @> \ + \ + \ + C,Ì+#`PC C,Ä0b > ?0a|f 6\1@bAD!0F YQ& Rτ0b W>B0a L& + `@ .~?@`1@pAP!0VA> \ +0b HB0agƀh0p >|& # L#`PD`3D0 A|??L#`PĞ` +C8Ä0bp I-Č+ 0a&00h1L#`P9=L 0a&00h1L#`PD:IL 0a&00h1L#`PՄ;CIL 0a&00h1L6a1 r`@ . & A0v,0F {8`0τ0b O \?L#`p>(\0aX0F ~ 0F   0F "h 0#L#`pEH`dL#`pHPdL#`pH@dL#`PE%30 A?1?L#`PŮ% oCIÄ0b [P7?0c@A + oCIÄ0b [P7?0a A??L#`PE%qý oCI`Ä0b [P7?0a A?.?L#`P%qC oACI`Ä0b [P7?0a$5`!͌q+# `EMXD2a$5`ń0b [XELA 8lQa2 A 8lQa. A 8lQa0 A 8lQa1 A 8lQc2A 8lQc.qA @kQb2 wPF@|&0kP`|&0Է 5ngC[jPv`|&0Ի 5ogCh`&`|&0ص mga`F`|&0ػ  6ogM`pg|&0ܷ 7n{gÝpg|&0ܻ 7ovg[6g|&0 mqg~ۛf|&0๵ n6@4FB@Y  4@lTQ?DE/M%LUSTAT `HDXIL BC! ? #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L ]2" d##ㄡL L@ +f`)@DAQ A@J1 +˟|n1 @=OCH~4B)C@Eah#ATd4\=䯄_6*aR`D4\=䯄6* RlD  #C|qH`5Q䋍4@t $p7@wz`pȇwzpq`pypYyqzr Qs0r>Hwzwr pp4^v8ҴCM>@4F!Hwzwr pp4^v8ҴCM>@4F!brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0a`0g !C <d2L &GC"J` 0 +8ʠ<(2(R(B @Ȝsi@? "gyLFD oM $Efe%&,f&gl&eCLe@, a0(MfÀ$ >™ ap6$φ A7A !11L@D@L\a5Fi**iPT 6`b:>NORMAL o 1*zz"  `bgu^7tif+m.m,hPdB a5`4 s )/47 BMjsa!<9ӓԆe` yh0ti!6,`prA ml @6 p LٵM *dx.versionS ]]ܔC2FV&FV6%HʐȕͽɍM :dx.viewIdStateSK\[ܔyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq *` !P;PEAD ~qۖ@ <~@0m[6\B@0_ܶH;/D0! ap/0CM~q&0 <<#mpK(5=mpK(5=#mpOD4!@ma &A,DW)]!b @HXP5# ``a# ``Q# `ҍ$ G2b 4]XˈA pl̈A q`͈A rlΈ dl!F&h& h1 AUH 0  0@ #`ف&AhB&h &È d{]6 B00 0b y 0b (ǙhB&h &È Db@ + 0  0@ #`*&h& h1AD w0 B00 0bp Q.AhB&h &M|F `Rx`@ _( F `S81ψ L +#`0C*8c DA`g@ &s` A0Ρ3F `BWh 0n 3b : L #`0,@k|F `rZQF `zZQ JA>#`0-A)#`0.A)& + A0AA0a#Uψ L + L | +)| c# A` 0 B00 0bp H.hB&h &È D( 0  0@ #`<H&h& h1؄g@ & F `|X`@ &Ї 3b M#`0D?8\0b N|F ` 1@i'B"`@ & @>#`0I`d %AA0b XDA (da<1ь$B&<ɈA (da</Q$B&<A (da=1 # `IO.$B&<0b  +YDOLˆA (da41# `IO=$3&a<DXBC>TI>(> DT<0.556SFI0ISG1SV_PositionCOLORTEXCOORDOSG14(@SV_TargetPSV0L4  COLORTEXCOORDTEXCOORDPSMainDDBADILDB+` +DXIL+BC! + #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L T2" d##ㄡL L@ +@@ 3s`0G@$AH) HS A '!$%QqǁPrpͰ( +!tǁ AQOCH>QJL>rۈ@)DHYsA1$$Aa☩ Ɓa hAAHƁA @!a~Lb00n@ PPr@ +|`0`@~~pi* +"Bw4E0,< 0(@(rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`30`!OY 2L &GCBʠF +Jʃ(B((f pz yy]LFD mm=271 30:Bvector X12@ E g%`0["xV`APelementIؔ}չqHscdVpI&A`@B \ 47float4xX@h|1@s$`,bf<3H `-b<3H @a-b  0p }a0A@i4 &A @0ZYK[YW[ [ڠ@՜S\47E ЬAPtp {c{[MAEg`@ oMl4o\ <ʒ1@ipс`*`7903MAVM < aVvGČ-S[\[  E pC` E pC`+ff4 \㐀pY(8$`0db1@S +5 H /E МpC`Kff4 \㐀pY*8$`1fb1@ +5  E мpC`&kff4 \㐀pY,8$`2hb1@S 5  /E ܂pC`6ff4 \㐀pY.8$`3 ?Q S@U`WY[]&row_count +|A&col_count +A 0 >.!0^q1A]ZБX[PYЌI[\P ж =0* *projection87177#22:329 0:4<& m V@<1H769# :9:329 $m B@$Ƚ }ѱ ՙ m[xxm@ X  _Hk!/Z56 wa Ɔ.@6&cmh˔\]ڛ!&ɴ! BBMjrqaqzbz $6#؍ BU5$EAذLqa1xlb\ HnFy]Hyl x#<=LY}QɝMlrqaq0G{;C5input D>=XG="`zL`H: u'@ @O+s3 k+ !\X[Uڸ<b&VTvF7.@ChɅaKBAframeYD@DQ\X[Yո< .XG=: 0albedoDES8fB&v2V7%Fllvm.module.flagsS*llvm.identSD2V'7V2FWF77e HFdx.source.definesS[XK[XQ[SX[ٔ@-̽ɍɝM +]\ڛ۔.؅ٕM ZY\Y۔/ʐȕͽɍM R ]\Y]]ڛ5d]Z]]]ٔ6ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCImہ4\BDͰ&0 <<mp/0CM>rV <0BmA5\DJM5m[,WBa @A,D6@HBɕ] 1F 30 &GL7 o0A8`ሃ Q&HL= 0A8Da# `A1q\2c@BA db`X]L# `Ay2a$bz0b L#`PO|?L# `AX̄0b EÄ0b  +AL#`Pџ|?L# ``΄0b  Ä0b AL#`PS|?L# `AxЄ0b E@Ä0b E@Ä0b E@Ä0b E@Ä0b E@Ä0b E@Ä0b E@Ä0b E@Ì #`` 0a\p؄`O@8<F 30=1 ``4f ? >3tx Ah?l{?0c@@90b EÌ + 4c@‡ zCC3($xp،A +a@  +xA +x1gƀ(1E> |& L#`P›e3D)0x A! +n?}?L#`0lp܁p3)Tx A1 +n??03)Tx&00h1LFh1 PaM>|& #4L# `ࠂ(1c@BA 8 +u0L# `ࠂ(؁0a$ +j +@8D}[#5nJض4m*ڴFB@YJ#̳< 3?DEoSTAT`DXILtBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Q2" d##ㄡL L@ +f`)@DAQ A@MOCHJH+1mb'!$?a!P!g ˟|n|AQpb8DAU0S;<̃B9=ԃ<C9=<9;=ЁC:<=< +`!a܀á!  XF9kHUD &i(aYy"b'`"P@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`#0`,2L &GC"J`$ + ʡʣ8J(B((jfoyxyLFD oM $Efe%&,f&gl&eCLc@   l l2 Le@4BYb`gCLΑW[؜PY`6 D$0jy,6 u@lU6A8columns x&A HȽm@1>k`0l &0gp40 f06k@j),͍˔\]ڛ&! &E5A( oq szbz 6lX:x9;`< BU5$EA o0q`0saP`nذtz s~0A7<P`2eE&wVF7A( ! +o0 +q0sR0B) +3hSfloats"b6G77A $ints4ξh̥}+r{kcQF7ATPU`rF <0Bm@5\DJM5mILDN,$abfc938205ab0a34cf1ed99dbc5c647f.pdbHASH +4ٝ\dDXIL `DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Q2" d##ㄡL L@ +f`)@DAQ A@MOCHJH+1mb'!$?a!P!g ˟|n|AQpb8DAU0S;<̃B9=ԃ<C9=<9;=ЁC:<=< +`!a܀á!  XF9kHUD &i(aYy"b'`"P@rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`#0`,2L &GC"J` J ʃ(B((foyxyoLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$aLe@0ِ CCC<h]Bba0 4A Q11@DuM d5e m..mP<" ҆ `B COLORb p6fp <12`4 BU5$EA03ذ4jP`  AAf o4`8`2eE&wVF7A( ! a@l`ul(60 +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔCbVvD6EFW6%ṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ0 <<mp/0CM>rF <0Bm@5\DJM5ma VA,DQx3P +%Wv5@ # `PyqʈA TQu2b 1# `}2b ,ẌA hxaP5# ``A3b9# ``Ccp=# ``SdA# ``deE#` hB\0=}FL +Sat`%\\G f @E>#`lpp 0  0@ Fh1B|3b J)(# `(0b J)(B# `(A \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/ColorSpaceUtility.hlsl b/project_templates/sample_scene/resources/shaders/include/ColorSpaceUtility.hlsl new file mode 100644 index 00000000..445d4bf1 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/ColorSpaceUtility.hlsl @@ -0,0 +1,161 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License (MIT). +// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY +// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR +// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. +// +// Developed by Minigraph +// +// Author: James Stanard +// + +#pragma warning( disable : 3571 ) + +#ifndef __COLOR_SPACE_UTILITY_HLSLI__ +#define __COLOR_SPACE_UTILITY_HLSLI__ + +// +// Gamma ramps and encoding transfer functions +// +// Agnostic to color space though usually tightly coupled. For instance, sRGB is both a +// color space (defined by three basis vectors and a white point) and a gamma ramp. Gamma +// ramps are designed to reduce perceptual error when compressing floats to small integer +// values. More precision is needed in darker gradients as the human eye is more sensitive +// to contrast with dark values. A logarithmic curve is often used. +// + +// sRGB is both a color space and a transfer function or "gamma ramp". (It's not a true gamma +// curve, which have been deprecated along with CRT displays.) sRGB is what almost all 8 bpc +// textures use, and when passed to an LCD monitor they look right. sRGB textures must be +// linearized for physically correct rendering, and the linear results need to be re-encoded +// with the sRGB ramp for display. +float3 LinearToSRGB( float3 x ) +{ + // Approximately pow(x, 1.0 / 2.2) + return select(x < 0.0031308, 12.92 * x, 1.055 * pow(x, 1.0 / 2.4) - 0.055); +} + +float3 SRGBToLinear( float3 x ) +{ + // Approximately pow(x, 2.2) + return select(x < 0.04045, x / 12.92, pow((x + 0.055) / 1.055, 2.4)); +} + +// These functions avoid pow() to efficiently approximate sRGB with an error < 0.4%. +float3 LinearToSRGB_Fast( float3 x ) +{ + return select(x < 0.0031308, 12.92 * x, 1.13005 * sqrt(x - 0.00228) - 0.13448 * x + 0.005719); +} + +float3 SRGBToLinear_Fast( float3 x ) +{ + return select(x < 0.04045, x / 12.92, -7.43605 * x - 31.24297 * sqrt(-0.53792 * x + 1.279924) + 35.34864); +} + +float3 accurateSRGBToLinear(in float3 x ) {return SRGBToLinear(x);} +float3 accurateLinearToSRGB(in float3 x ) {return LinearToSRGB(x);} +// The OETF recommended for content shown on HDTVs. This "gamma ramp" may increase contrast as +// appropriate for viewing in a dark environment. +float3 LinearToREC709( float3 x ) +{ + return select(x < 0.0181, 4.5 * x, 1.0993 * pow(x, 0.45) - 0.0993); +} + +float3 REC709ToLinear( float3 x ) +{ + return select(x < 0.08145, x / 4.5, pow((x + 0.0993) / 1.0993, 1.0 / 0.45)); +} + +// This is the new HDR transfer function, also called "PQ" for perceptual quantizer. +float3 LinearToREC2084(float3 L) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Lp = pow(L, m1); + return pow((c1 + c2 * Lp) / (1 + c3 * Lp), m2); +} + +float3 REC2084ToLinear(float3 N) +{ + float m1 = 2610.0 / 4096.0 / 4; + float m2 = 2523.0 / 4096.0 * 128; + float c1 = 3424.0 / 4096.0; + float c2 = 2413.0 / 4096.0 * 32; + float c3 = 2392.0 / 4096.0 * 32; + float3 Np = pow(N, 1 / m2); + return pow(max(Np - c1, 0) / (c2 - c3 * Np), 1 / m1); +} + +// +// Color space conversions +// +// These assume linear (not gamma-encoded) values. A color space conversion is a change +// of basis (like in Linear Algebra). Since a color space is defined by three vectors-- +// the basis vectors--changing space involves a matrix-vector multiplication. Note that +// changing the color space may result in colors that are "out of bounds" because some +// color spaces have larger gamuts than others. When converting some colors from a wide +// gamut to small gamut, negative values may result, which are inexpressible in that new +// color space. +// +// It would be ideal to build a color pipeline which never throws away inexpressible (but +// perceivable) colors. This means using a color space that is as wide as possible. The +// XYZ color space is the neutral, all-encompassing color space, but it has the unfortunate +// property of having negative values (specifically in X and Z). To correct this, a further +// transformation can be made to X and Z to make them always positive. They can have their +// precision needs reduced by dividing by Y, allowing X and Z to be packed into two UNORM8s. +// This color space is called YUV for lack of a better name. +// + +// Note: Rec.709 and sRGB share the same color primaries and white point. Their only difference +// is the transfer curve used. + +float3 REC709toREC2020( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.627402, 0.329292, 0.043306, + 0.069095, 0.919544, 0.011360, + 0.016394, 0.088028, 0.895578 + }; + return mul(ConvMat, RGB709); +} + +float3 REC2020toREC709(float3 RGB2020) +{ + const float3x3 ConvMat = + { + 1.660496, -0.587656, -0.072840, + -0.124547, 1.132895, -0.008348, + -0.018154, -0.100597, 1.118751 + }; + return mul(ConvMat, RGB2020); +} + +float3 REC709toDCIP3( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 0.822458, 0.177542, 0.000000, + 0.033193, 0.966807, 0.000000, + 0.017085, 0.072410, 0.910505 + }; + return mul(ConvMat, RGB709); +} + +float3 DCIP3toREC709( float3 RGB709 ) +{ + const float3x3 ConvMat = + { + 1.224947, -0.224947, 0.000000, + -0.042056, 1.042056, 0.000000, + -0.019641, -0.078651, 1.098291 + }; + return mul(ConvMat, RGB709); +} + +#endif // __COLOR_SPACE_UTILITY_HLSLI__ \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/atmosphere_params.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/atmosphere_params.hlsli new file mode 100644 index 00000000..63bdf67e --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/atmosphere_params.hlsli @@ -0,0 +1,107 @@ +#ifndef ATMOSPHERE_PARAMETERS +#define ATMOSPHERE_PARAMETERS 1 + +#include "atmosphere/definitions.hlsli" +#include "atmosphere/definitions_units.hlsli" + +/* +

Atmosphere parameters

+ +

Using the above types, we can now define the parameters of our atmosphere +model. We start with the definition of density profiles, which are needed for +parameters that depend on the altitude: +*/ + +/* +The atmosphere parameters are then defined by the following struct: +*/ + +//this is const buffer <> CPU. so it must be aligned to float4! +struct AtmosphereParameters { + // The solar irradiance at the top of the atmosphere. + IrradianceSpectrum solar_irradiance; + // The sun's angular radius. Warning: the implementation uses approximations + // that are valid only if this angle is smaller than 0.1 radians. + Angle sun_angular_radius; + + // The scattering coefficient of air molecules at the altitude where their + // density is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'rayleigh_scattering' times 'rayleigh_density' at this altitude. + ScatteringSpectrum rayleigh_scattering; + // The density profile of air molecules, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile rayleigh_density; + Number rayleigh_density_altitude_exp_term; + + // The scattering coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The scattering coefficient at altitude h is equal to + // 'mie_scattering' times 'mie_density' at this altitude. + ScatteringSpectrum mie_scattering; + // The density profile of aerosols, i.e. a function from altitude to + // dimensionless values between 0 (null density) and 1 (maximum density). + //DensityProfile mie_density; + Number mie_density_altitude_exp_term;//todo: make more sophisticated + + // The extinction coefficient of aerosols at the altitude where their density + // is maximum (usually the bottom of the atmosphere), as a function of + // wavelength. The extinction coefficient at altitude h is equal to + // 'mie_extinction' times 'mie_density' at this altitude. + ScatteringSpectrum mie_extinction; + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols forward weight. + Number mie_forward_scattering_weight; + + //second mie layer + Number mie2_strength,//can be bigger than 1. making it relative to 'common mie' + mie2_altitude,//where (and below) strength is 1 + mie2_density_altitude_exp_term;// + Number padding; + // The extinction coefficient of molecules that absorb light (e.g. ozone) at + // the altitude where their density is maximum, as a function of wavelength. + // The extinction coefficient at altitude h is equal to + // 'absorption_extinction' times 'absorption_density' at this altitude. + ScatteringSpectrum absorption_extinction; + Length absorption_density_max_alt;//absorption profile part + + // The average albedo of the ground. + DimensionlessSpectrum ground_albedo; + // The cosine of the maximum Sun zenith angle for which atmospheric scattering + // must be precomputed (for maximum precision, use the smallest Sun zenith + // angle yielding negligible sky light radiance values. For instance, for the + // Earth case, 102 degrees is a good choice - yielding mu_s_min = -0.2). + Number mu_s_min;//to be removed + + // precalced + DimensionlessSpectrum mie_extrapolation_coef; + Number multiple_scattering_factor; + + // The distance between the planet center and the bottom of the atmosphere. + Length bottom_radius; + // The distance between the planet center and the top of the atmosphere. + Length top_radius; + + // The asymetry parameter for the Cornette-Shanks phase function for the + // aerosols. + Number mie_phase_function_forward_g; + Number mie_phase_function_backward_g; + + //float2(1.0 + g * g, - 2.0 * g)*pow(2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); + //optimized mie phase coef + float4 mie_phase_consts; + // The density profile of air molecules that absorb light (e.g. ozone), i.e. + // a function from altitude to dimensionless values between 0 (null density) + // and 1 (maximum density). + //DensityProfile absorption_density; + float2 absorption_density_linear_term0; + float2 absorption_density_linear_term1; + + //https://en.wikipedia.org/wiki/Kruithof_curve + //5500 kelvin + Kruithof effect results in (0.5764705882352941,0.6274509803921569, 1) + // full moon lux brighntess is way darker + DimensionlessSpectrum moon_color;//(0.5764705882352941,0.6274509803921569, 1)*.25 by default. That affects sky and moon + Number sunBrightness;//this is 10 by default. that affects everything, sky and sun +}; + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/definitions.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/definitions.hlsli new file mode 100644 index 00000000..ba0e6d62 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/definitions.hlsli @@ -0,0 +1,53 @@ +#ifndef ATMOSPHERE_DEFINITIONS +#define ATMOSPHERE_DEFINITIONS 1 +#define Length float +#define Wavelength float +#define Angle float +#define SolidAngle float +#define Power float +#define LuminousPower float +#define Number float +#define InverseLength float +#define Area float +#define Volume float +#define NumberDensity float +#define Irradiance float +#define Radiance float +#define SpectralPower float +#define SpectralIrradiance float +#define SpectralRadiance float +#define SpectralRadianceDensity float +#define ScatteringCoefficient float +#define InverseSolidAngle float +#define LuminousIntensity float +#define Luminance float +#define Illuminance float + +// A generic function from Wavelength to some other type. +#define AbstractSpectrum float3 +// A function from Wavelength to Number. +#define DimensionlessSpectrum float3 +// A function from Wavelength to SpectralPower. +#define PowerSpectrum float3 +// A function from Wavelength to SpectralIrradiance. +#define IrradianceSpectrum float3 +// A function from Wavelength to SpectralRadiance. +#define RadianceSpectrum float3 +// A function from Wavelength to SpectralRadianceDensity. +#define RadianceDensitySpectrum float3 +// A function from Wavelength to ScaterringCoefficient. +#define ScatteringSpectrum float3 + +// A position in 3D (3 length values). +#define Position float3 +// A unit direction vector in 3D (3 unitless values). +#define Direction float3 +// A vector of 3 luminance values. +#define Luminance3 float3 +// A vector of 3 illuminance values. +#define Illuminance3 float3 + +#define SKIES_SEPARATE_SINGLE_SCATTERING 1 +#define COMBINED_SCATTERING_TEXTURES 1 + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/definitions_units.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/definitions_units.hlsli new file mode 100644 index 00000000..d1532d02 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/definitions_units.hlsli @@ -0,0 +1,96 @@ +#ifndef ATMOSPHERE_DEFINITIONS_UNITS +#define ATMOSPHERE_DEFINITIONS_UNITS 1 + +#include "atmosphere/definitions.hlsli" +#include "hardware_defines.hlsli" + +struct SamplerTexture2D +{ + Texture2D tex; + SamplerState tex_smp; +}; +struct SamplerTexture3D +{ + Texture3D tex; + SamplerState tex_smp; +}; +SamplerTexture2D from_texture2d(Texture2D tex, SamplerState tex_smp){ SamplerTexture2D r;r.tex=tex;r.tex_smp = tex_smp;return r;} +SamplerTexture3D from_texture3d(Texture3D tex, SamplerState tex_smp){ SamplerTexture3D r;r.tex=tex;r.tex_smp = tex_smp;return r;} + +#define SamplerTexture2DFromName(a) from_texture2d(a, a##_samplerstate) +#define SamplerTexture3DFromName(a) from_texture3d(a, a##_samplerstate) +#define TransmittanceTexture SamplerTexture2D +#define AbstractScatteringTexture SamplerTexture3D +#define PreparedSkiesScatteringTexture SamplerTexture2D +#define PreparedScatteringTexture SamplerTexture3D +#define ReducedScatteringTexture SamplerTexture3D +#define ScatteringTexture SamplerTexture3D +#define ScatteringDensityTexture SamplerTexture3D +#define IrradianceTexture SamplerTexture2D +#define MultipleScatteringTexture SamplerTexture2D + +#define IN(t) t +#define OUT(t) out t +#define INOUT(t) inout t +#define INLINE +#define G_UNUSED(a) +#define assert(a) +#define vec2 float2 +#define vec4 float4 +#define vec3 float3 +#define TEMPLATE(a) +#define TEMPLATE_ARGUMENT(a) +DimensionlessSpectrum DimensionlessSpectrumFromTexture(float4 a) {return a.xyz;} +AbstractSpectrum AbstractSpectrumFromTexture(float4 a) {return a.xyz;} +IrradianceSpectrum IrradianceSpectrumFromTexture(float4 a) {return a.xyz;} + +float mod(float a, float b) {return fmod(a,b);} + +float4 sample_texture(SamplerTexture2D ts, float2 uv) +{ + return ts.tex.SampleLevel(ts.tex_smp, uv, 0); +} + +float4 sample_texture(SamplerTexture3D ts, float3 uv) +{ + return ts.tex.SampleLevel(ts.tex_smp, uv, 0); +} + +/* +

Physical units

+ +

We can then define the units for our six base physical quantities: +meter (m), nanometer (nm), radian (rad), steradian (sr), watt (watt) and lumen +(lm): +*/ + +static const Length meter = 1.0; +static const Wavelength nm = 1.0; +static const Angle rad = 1.0; +static const SolidAngle sr = 1.0; +static const Power watt = 1.0; +static const LuminousPower lm = 1.0; + +/* +

From which we can derive the units for some derived physical quantities, +as well as some derived units (kilometer km, kilocandela kcd, degree deg): +*/ + +static const Length km = 1000.0 * meter; +static const Area m2 = meter * meter; +static const Volume m3 = meter * meter * meter; +static const Angle pi = PI * rad; +static const Angle deg = pi / 180.0; +static const Irradiance watt_per_square_meter = watt / m2; +static const Radiance watt_per_square_meter_per_sr = watt / (m2 * sr); +static const SpectralIrradiance watt_per_square_meter_per_nm = watt / (m2 * nm); +static const SpectralRadiance watt_per_square_meter_per_sr_per_nm = + watt / (m2 * sr * nm); +static const SpectralRadianceDensity watt_per_cubic_meter_per_sr_per_nm = + watt / (m3 * sr * nm); +static const LuminousIntensity cd = lm / sr; +static const LuminousIntensity kcd = 1000.0 * cd; +static const Luminance cd_per_square_meter = cd / m2; +static const Luminance kcd_per_square_meter = kcd / m2; + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/functions.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/functions.hlsli new file mode 100644 index 00000000..eab570b4 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/functions.hlsli @@ -0,0 +1,777 @@ +#ifndef ATMOSPHERE_FUNCTIONS_HLSLI_INCLUDED +#define ATMOSPHERE_FUNCTIONS_HLSLI_INCLUDED 1 +//only parametrization and lut transmittance is used from Eric Bruneton code. +//we can reimplement it ofc +/** + * Copyright (c) 2017 Eric Bruneton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * Precomputed Atmospheric Scattering + * Copyright (c) 2008 INRIA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atmosphere/transmittance.hlsli" +#include "atmosphere/texture_sizes.hlsli" +//#include "atmosphere/preparedScattering2.hlsl" +#include "hardware_defines.hlsli" + +INLINE Number GetTextureCoordFromUnitRange(Number x, int texture_size) +{ + return 0.5 / Number(texture_size) + x * (1.0 - 1.0 / Number(texture_size)); +} + +INLINE Number GetUnitRangeFromTextureCoord(Number u, int texture_size) +{ + return saturate(u / (1.0 - 1.0 / Number(texture_size)) - 0.5 / (Number(texture_size) - 1.0));//we saturate just in case, due to numeric instabilities +} + +INLINE vec2 GetTransmittanceTextureUvFromRMu(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon. + Length rho = + SafeSqrt(r * r - atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon). + Length d = DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Number x_mu = (d - d_min) / (d_max - d_min); + Number x_r = rho / H; + return vec2(GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)); +} + +/* +

and the inverse mapping follows immediately: +*/ + +INLINE void GetRMuFromTransmittanceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT); + // Distance to top atmosphere_p boundary for a horizontal ray at ground level. + Length H = sqrt(atmosphere_p.top_radius * atmosphere_p.top_radius - + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius); + // Distance to the horizon, from which we can compute r: + Length rho = H * x_r; + // due to float precision, sqrt(0 + x*x) can produce value lower than x, so we need to acknowledge that + r = rho > 0 ? sqrt(rho * rho + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius) : atmosphere_p.bottom_radius; + // Distance to the top atmosphere_p boundary for the ray (r,mu), and its minimum + // and maximum values over all mu - obtained for (r,1) and (r,mu_horizon) - + // from which we can recover mu: + Length d_min = atmosphere_p.top_radius - r; + Length d_max = rho + H; + Length d = d_min + x_mu * (d_max - d_min); + mu = d == 0.0 * meter ? Number(1.0) : (H * H - rho * rho - d * d) / (2.0 * r * d); + mu = ClampCosine(mu); +} + +/* +

It is now easy to define a fragment shader function to precompute a texel of +the transmittance texture: +*/ + +DimensionlessSpectrum GetTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + vec2 uv = GetTransmittanceTextureUvFromRMu(atmosphere_p, r, mu); + return DimensionlessSpectrumFromTexture(sample_texture(transmittance_texture, uv)); +} + +DimensionlessSpectrum GetTransmittance( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu, Length d, bool ray_r_mu_intersects_ground) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + assert(d >= 0.0 * meter); + + Length r_d = ClampRadius(atmosphere_p, sqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_d = ClampCosine((r * mu + d) / r_d); + + if (ray_r_mu_intersects_ground) { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, -mu_d) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, -mu))); + } else { + return saturate( + GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu) / + max(float3(1e-10, 1e-10, 1e-10), GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r_d, mu_d))); + } +} + +DimensionlessSpectrum GetTransmittanceToSun( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + Length r, Number mu_s) +{ + Number sin_theta_h = atmosphere_p.bottom_radius / r; + Number cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0)); + return GetTransmittanceToTopAtmosphereBoundary( + atmosphere_p, transmittance_texture, r, mu_s) * + smoothstep(-sin_theta_h * atmosphere_p.sun_angular_radius / rad, + sin_theta_h * atmosphere_p.sun_angular_radius / rad, + mu_s - cos_theta_h); +} + +Length DistanceToNearestAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu, bool ray_r_mu_intersects_ground) +{ + if (ray_r_mu_intersects_ground) { + return DistanceToBottomAtmosphereBoundary(atmosphere_p, r, mu); + } else { + return DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu); + } +} + +INLINE InverseSolidAngle RayleighPhaseFunction(Number nu) +{ + InverseSolidAngle k = 3.0 / (16.0 * PI * sr); + return k * (1.0 + nu * nu); +} + +float2 GetMiePhaseConsts(Number g); + +#if 0 +INLINE float MiePhaseFunctionDivideByRayleigh(Number g, Number nu) +{ + return MiePhaseFunctionDivideByRayleighOptimized(float4(GetMiePhaseConsts(g)*pow(0.5,-1./1.5), GetMiePhaseConsts(-0.25*g)*pow(0.5,-1./1.5)), nu); + //float k = 2.0 * (1.0 - g * g) / (2.0 + g * g);//this is constantant + //float phase = 1.0 + g * g - 2.0 * g * nu;//this is nother two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + //return k / (phase*sqrt(phase));//pow(1.5) +} + +//only for reference +//https://arxiv.org/pdf/1812.00799.pdf +//ON SAMPLING OF SCATTERING PHASE FUNCTIONS +//CORNETTE SHANKS PHASE +INLINE InverseSolidAngle MiePhaseCornetteShanksFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//full Drain phase function +INLINE InverseSolidAngle MiePhaseDrainFunction(Number g, Number nu) +{ + float alpha = 1.0; + InverseSolidAngle k = 3.0 / (4.0 * PI * sr) * (1.0 - g * g) / (3 + alpha*(1.0 + 2.0*g * g)); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + alpha*nu * nu) / (phase*sqrt(phase));//pow(1.5 +} +//http://www.csroc.org.tw/journal/JOC25-3/JOC25-3-2.pdf +//Zhang function +INLINE InverseSolidAngle MiePhaseZhangFunction(Number g, Number nu) +{ + InverseSolidAngle k = 3.0 / (8.0 * PI * sr) * (1.0 - g * g) / (2.0 + g * g); + float phase = 1.0 + g * g - 2.0 * g * nu; + return k * (1.0 + nu * nu) / (phase*sqrt(phase)) + g*nu*1.0/(4.0*PI * sr); +} + +#endif +INLINE float SafePow(Number a, Number b) {return a != 0 ? pow(a, b) : 0;} +INLINE float2 GetMiePhaseConsts(Number g, Number weight) +{ + return float2(1.0 + g * g, - 2.0 * g)*SafePow(weight*2.0 * (1.0 - g * g) / (2.0 + g * g), 1./-1.5); +} + +INLINE float2 GetMiePhaseConsts(Number g) { return GetMiePhaseConsts(g, 1); } + +INLINE float MiePhaseFunctionDivideByRayleighOptimized(float4 mie_phase_consts, Number nu) +{ + float forward_phase = mie_phase_consts.x + mie_phase_consts.y*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + float backward_phase = mie_phase_consts.z + mie_phase_consts.w*nu;//this is another two consts (1.0 + g * g) + (-2.0 * g)*nu, each of which can be pre-dvided by pow(k,-1.5) + return pow(forward_phase, -1.5) + pow(backward_phase, -1.5);//it is faster than rcp(phase*sqrt(phase)) or phase*phase*rsqrt(phase) on Xb1+ +} + + +INLINE RadianceSpectrum GetPhasedRadianceOptimized(float4 mie_phase_consts, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return (scattering + single_mie_scattering * + MiePhaseFunctionDivideByRayleighOptimized(mie_phase_consts, nu)) * RayleighPhaseFunction(nu); +} + +INLINE RadianceSpectrum GetPhasedRadiance(IN(AtmosphereParameters) atmosphere_p, + IrradianceSpectrum scattering, + IrradianceSpectrum single_mie_scattering, + Number nu) +{ + return GetPhasedRadianceOptimized(atmosphere_p.mie_phase_consts, scattering, single_mie_scattering, nu); +} + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s); + +vec2 GetIrradianceTextureUvFromRMuS(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + Number x_r = (r - atmosphere_p.bottom_radius) / + (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + Number x_mu_s = mu_s * 0.5 + 0.5; + return vec2(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH), + GetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT)); +} + +/* +

The inverse mapping follows immediately: +*/ + +void GetRMuSFromIrradianceTextureUv(IN(AtmosphereParameters) atmosphere_p, + IN(vec2) uv, OUT(Length) r, OUT(Number) mu_s) +{ + assert(uv.x >= 0.0 && uv.x <= 1.0); + assert(uv.y >= 0.0 && uv.y <= 1.0); + Number x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH); + Number x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT); + r = atmosphere_p.bottom_radius + + x_r * (atmosphere_p.top_radius - atmosphere_p.bottom_radius); + mu_s = ClampCosine(2.0 * x_mu_s - 1.0); +} +/* +

Lookup

+ +

Thanks to these precomputed textures, we can now get the ground irradiance +with a single texture lookup: +*/ + +IrradianceSpectrum GetIrradiance( + IN(AtmosphereParameters) atmosphere_p, + IN(IrradianceTexture) irradiance_texture, + Length r, Number mu_s) +{ + vec2 uv = GetIrradianceTextureUvFromRMuS(atmosphere_p, r, mu_s); + return IrradianceSpectrumFromTexture(sample_texture(irradiance_texture, uv)); +} + +//rendering part +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoef( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + // Algebraically this can never be negative, but rounding errors can produce + // that effect for sufficiently short view rays. + return (scattering.w / max(scattering.x, 1e-4f)) * extrapolateMieCoef;//betaRMie = (betaR.x / betaR); +} + +IrradianceSpectrum GetExtrapolatedSingleMieScatteringDS( + DimensionlessSpectrum extrapolateMieCoef, IN(vec4) scattering) +{ + return IrradianceSpectrumFromTexture(scattering) * GetExtrapolatedSingleMieScatteringCoef(extrapolateMieCoef, scattering); +} +DimensionlessSpectrum GetExtrapolatedSingleMieScatteringCoefConst( + IN(AtmosphereParameters) atmosphere_p) +{ + return (atmosphere_p.rayleigh_scattering.x / atmosphere_p.mie_scattering.x) * + (atmosphere_p.mie_scattering / atmosphere_p.rayleigh_scattering);//constant` +} + +#ifdef COMBINED_SCATTERING_TEXTURES +IrradianceSpectrum GetExtrapolatedSingleMieScattering( + IN(AtmosphereParameters) atmosphere_p, IN(vec4) scattering) +{ + return GetExtrapolatedSingleMieScatteringDS(GetExtrapolatedSingleMieScatteringCoefConst(atmosphere_p), scattering); +} + +#endif + +/* +

We can then retrieve all the scattering components (Rayleigh + multiple +scattering on one side, and single Mie scattering on the other side) with the +following function, based on +GetScattering (we duplicate +some code here, instead of using two calls to GetScattering, to +make sure that the texture coordinates computation is shared between the lookups +in scattering_texture and +single_mie_scattering_texture): +*/ + +#define SKIES_PREPARED_SHORT_PART (112./128.) +#define SKIES_PREPARED_SHORT_PART_SQ (SKIES_PREPARED_SHORT_PART*SKIES_PREPARED_SHORT_PART) +float scattering_DistToTc_m(float d, float2 dist_to_prepared_tc) {return sqrt(saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y));} +float scattering_DistToTc_Km(float d, float2 dist_to_prepared_tc) {return scattering_DistToTc_m(d*1000, dist_to_prepared_tc);}//fixme: +float scattering_DistToTc_Long(float d, float4 dist_to_prepared_tc) +{ + float shortDistTc = saturate(d*dist_to_prepared_tc.x + dist_to_prepared_tc.y); + float longDistTc = saturate(d*dist_to_prepared_tc.z + dist_to_prepared_tc.w); + return sqrt(shortDistTc < SKIES_PREPARED_SHORT_PART_SQ ? shortDistTc : longDistTc); +} +float scattering_TcToDist_Km(float tcX, float4 dist_to_prepared_tc) +{ + float tc = (tcX*tcX); + return 0.001*(tc < SKIES_PREPARED_SHORT_PART_SQ ? (tc-dist_to_prepared_tc.y)/dist_to_prepared_tc.x : (tc-dist_to_prepared_tc.w)/dist_to_prepared_tc.z); +} + +#define SKIES_LOWER_SPACE_PART 0.8 +float scattering_viewZtoTc(float viewZ) +{ + //return acos(viewZ)*(-1./PI) + 1; + return SKIES_LOWER_SPACE_PART + (viewZ < 0 ? SKIES_LOWER_SPACE_PART : (1-SKIES_LOWER_SPACE_PART))*viewZ; +} +float scattering_tcToViewZ(float tcY) +{ + //return cos(-PI*(tcY-1)); + float2 maddP = tcY= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + result += ComputeScatteringForIrradiance(atmosphere_p, transmittance_texture, RAY_SAMPLE_COUNT, r, omega, omega_s) * + omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum GetMultipleScattering(IN(AtmosphereParameters) atmosphere_p, IN(MultipleScatteringTexture) multiple_scattering_approx, + Length r, Number mu) +{ + float MultiScatteringLUTRes = SKIES_MULTIPLE_SCATTERING_APPROX; + float2 uv = saturate(float2(mu*0.5f + 0.5f, (r - atmosphere_p.bottom_radius) / (atmosphere_p.top_radius - atmosphere_p.bottom_radius))); + uv = float2(GetTextureCoordFromUnitRange(uv.x, MultiScatteringLUTRes), GetTextureCoordFromUnitRange(uv.y, MultiScatteringLUTRes)); + + return IrradianceSpectrumFromTexture(sample_texture(multiple_scattering_approx, uv)); +} + +struct SingleScatteringResult +{ + IrradianceSpectrum L; // Scattered light (luminance) + IrradianceSpectrum ray,mie,ms; + DimensionlessSpectrum Transmittance; // Transmittance in [0,1] (unitless) +}; + +INLINE SingleScatteringResult IntegrateScatteredLuminanceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) multiple_scattering_approx, + IN(Position) worldPos, IN(Direction) worldDir, Number shadow_offset,//only for shadows + float sampleCountIni, bool variableSampleCount, float2 rayMarchMinMaxSPP, + Length r, Number mu, Number nu, Number mu_s, + bool ray_intersects_ground,//RayIntersectsGround(atmosphere_p, r, mu) + float tMaxMax = 9000000.0f) +{ + SingleScatteringResult result; + result.L = result.ray = result.mie = result.ms = IrradianceSpectrum(0,0,0); + float start_distance = 0; + #if ORIGIN_CAN_BE_IN_SPACE + result.Transmittance = DimensionlessSpectrum(1,1,1); + //just skip distance befroe atmosphere. + //it is totally fine to render atmosphere from space without this defines on. + //it is just produces better quality in such case + if (r > atmosphere_p.top_radius) + { + Length rmu = r*mu; + Length distance_to_top_atmosphere_boundary = -rmu - + sqrt(rmu * rmu - r * r + atmosphere_p.top_radius * atmosphere_p.top_radius); + if (distance_to_top_atmosphere_boundary > 0.0 * meter) { + start_distance = distance_to_top_atmosphere_boundary; + } else { + // If the view ray does not intersect the atmosphere_p, simply return 0. + return result; + } + } + #endif + + // Compute next intersection with atmosphere or ground + float tMax = DistanceToNearestAtmosphereBoundary(atmosphere_p, r, mu, ray_intersects_ground) - start_distance; + tMax = min(tMax, tMaxMax); + + // Sample count + float sampleCount = sampleCountIni; + float sampleCountFloor = sampleCountIni-1; + float tMaxFloor = tMax; + if (variableSampleCount) + { + sampleCount = lerp(rayMarchMinMaxSPP.x, rayMarchMinMaxSPP.y, saturate(tMax*0.01)); + sampleCountFloor = floor(sampleCount); + tMaxFloor = tMax * sampleCountFloor / sampleCount; // rescale tMax to map to the last entire step segment. + } + // Phase functions + //const Number uniformPhase = 1.0 / (4.0 * PI); + Number RayleighPhaseValue = RayleighPhaseFunction(nu); + Number MiePhaseValue = RayleighPhaseValue*MiePhaseFunctionDivideByRayleighOptimized(atmosphere_p.mie_phase_consts, nu); + + // Ray march the atmosphere to integrate optical depth + IrradianceSpectrum L = IrradianceSpectrum(0.0f,0.0f,0.0f); + DimensionlessSpectrum throughput = DimensionlessSpectrum(1.0,1.0,1.0); + float t = 0.0f; + float tPrev = 0.0; + const float sampleSegmentT = 0.5f; + float invSampleCountFloor = 1.0f/sampleCountFloor; + Position curWorldPos = worldPos; + for (float s = 0.0f, e = sampleCount*invSampleCountFloor; s < e; s += invSampleCountFloor) + { + float dt; + if (variableSampleCount) + { + float t0 = s * s; + float t1 = s + invSampleCountFloor; + // Non linear distribution of sample within the range. + t1 = t1 * t1; + // Make t0 and t1 world space distances. + t0 = tMaxFloor * t0; + t1 = t1 > 1.0f ? tMax : tMaxFloor * t1; + t = t0 + (t1 - t0)*sampleSegmentT; + dt = t1 - t0; + } + else + { + float newT = tMax * saturate(s + sampleSegmentT*invSampleCountFloor); + dt = newT - t; + t = newT; + } + Length d = t + start_distance; + Length r_d = ClampRadius(atmosphere_p, SafeSqrt(d * d + 2.0 * r * mu * d + r * r)); + Number mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d); + + G_UNUSED(curWorldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + Position curWorldPos = worldPos + (d + shadow_offset*dt) * worldDir; + float shadow = getShadow(curWorldPos, d, r_d, mu_s_d); +#endif + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, r_d-atmosphere_p.bottom_radius, curWorldPos); + + const float3 sampleOpticalDepth = medium.extinction * dt; + const float3 sampleTransmittance = exp(-sampleOpticalDepth); + + float3 transmittanceToSun = GetTransmittanceToSun( atmosphere_p, transmittance_texture, r_d, mu_s_d); + + + G_UNUSED(worldPos);G_UNUSED(worldDir);G_UNUSED(shadow_offset); +#if SHADOWMAP_ENABLED + // First evaluate opaque shadow + transmittanceToSun *= finalShadowFromShadowTerm(shadow); +#endif + float3 PhaseTimesScattering = medium.scatteringMie * MiePhaseValue + medium.scatteringRay * RayleighPhaseValue; + + // Dual scattering for multi scattering + + float3 multiScatteredLuminance = GetMultipleScattering(atmosphere_p, multiple_scattering_approx, r_d, mu_s_d); + + #if ORIGIN_CAN_BE_IN_SPACE && SHADOWMAP_ENABLED + multiScatteredLuminance *= shadow; + #endif + + float3 S = (transmittanceToSun * PhaseTimesScattering + multiScatteredLuminance * medium.scattering); + + // When using the power serie to accumulate all sattering order, serie r must be <1 for a serie to converge. + // Under extreme coefficient, MultiScatAs1 can grow larger and thus result in broken visuals. + // The way to fix that is to use a proper analytical integration as proposed in slide 28 of http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + // However, it is possible to disable as it can also work using simple power serie sum unroll up to 5th order. The rest of the orders has a really low contribution. + + // See slide 28 at http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/ + float3 Sint = (S - S * sampleTransmittance) / medium.extinction; // integrate along the current step segment + L += throughput * Sint; // accumulate and also take into account the transmittance from previous steps + + float3 rayS = medium.scatteringRay*transmittanceToSun; + float3 raySint = (rayS - rayS * sampleTransmittance) / medium.extinction; + result.ray += throughput * raySint; + + float3 mieS = medium.scatteringMie*transmittanceToSun; + float3 mieSint = (mieS - mieS * sampleTransmittance) / medium.extinction; + result.mie += throughput * mieSint; + + float3 msS = multiScatteredLuminance * medium.scattering; + float3 msSint = (msS - msS * sampleTransmittance) / medium.extinction; + result.ms += throughput * msSint; + + throughput = throughput*sampleTransmittance; + tPrev = t; + } + + result.L = L; + result.Transmittance = throughput; + return result; +} + +IrradianceSpectrum ComputeIndirectIrradianceMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + Length r, Number mu_s) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu_s >= -1.0 && mu_s <= 1.0); + + const int SAMPLE_COUNT = 8; + const Angle dphi = pi / Number(SAMPLE_COUNT); + const Angle dtheta = pi / Number(SAMPLE_COUNT); + + IrradianceSpectrum result = + IrradianceSpectrum(0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm,0.0 * watt_per_square_meter_per_nm); + vec3 omega_s = vec3(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s); + for (int j = 0; j < SAMPLE_COUNT / 2; ++j) { + Angle theta = (Number(j) + 0.5) * dtheta; + for (int i = 0; i < 2 * SAMPLE_COUNT; ++i) { + Angle phi = (Number(i) + 0.5) * dphi; + vec3 omega = + vec3(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta)); + SolidAngle domega = (dtheta / rad) * (dphi / rad) * sin(theta) * sr; + + Number nu = dot(omega, omega_s); + SingleScatteringResult ss = IntegrateScatteredLuminanceMS( + atmosphere_p, + transmittance_texture, + ms_texture, + float3(0,0,0),float3(0,0,0),0,//shadows + 32, true, float2(16,16), + r, omega.z, nu, mu_s, + false); + result += ss.L * omega.z * domega * atmosphere_p.solar_irradiance; + } + } + return result; +} + + +IrradianceSpectrum ComputeIndirectIrradianceTextureMS( + IN(AtmosphereParameters) atmosphere_p, + IN(TransmittanceTexture) transmittance_texture, + IN(MultipleScatteringTexture) ms_texture, + IN(vec2) frag_coord) +{ + Length r; + Number mu_s; + GetRMuSFromIrradianceTextureUv( + atmosphere_p, frag_coord / vec2(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT), r, mu_s); + //return ComputeIndirectIrradianceSingle(atmosphere_p, transmittance_texture, r, mu_s, 32, 32); + return ComputeIndirectIrradianceMS(atmosphere_p, + transmittance_texture, ms_texture, r, mu_s); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/preparedScattering2.hlsl b/project_templates/sample_scene/resources/shaders/include/atmosphere/preparedScattering2.hlsl new file mode 100644 index 00000000..b91fdff7 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/preparedScattering2.hlsl @@ -0,0 +1,30 @@ +#ifndef SKIES_PREPARED_SCATTERING +#define SKIES_PREPARED_SCATTERING 1 + + +#include "atmosphere/transmittance.hlsli" +#include "atmosphere/texture_sizes.hlsli" + +vec4 getPreparedCombinedScattering(IN(PreparedScatteringTexture) preparedScattering, IN(vec2) prepared_tc, float layer) +{ + return sample_texture(preparedScattering, float3(prepared_tc.x, prepared_tc.y, layer)); +} + +float getInscatterLerpParam(vec2 viewdirXYNorm, vec2 sundirXYNorm) +{ + //remapped(0.5-0.5*dot(viewdirXYNorm, sundirXYNorm)) + float inscatterLerp = dot(viewdirXYNorm, sundirXYNorm); + return inscatterLerp*(-0.5*((SKIES_OPTIMIZATION_NUM_LAYERS-1.)/(SKIES_OPTIMIZATION_NUM_LAYERS))) + 0.5; +} + +vec4 getPreparedCombinedScatteringXYZ(IN(PreparedScatteringTexture) preparedScattering, float3 viewdir, float3 sundir, vec2 prepared_tc) +{ + return getPreparedCombinedScattering(preparedScattering, prepared_tc, getInscatterLerpParam(normalize(viewdir.xy), normalize(sundir.xy))); +} + +DimensionlessSpectrum getPreparedTransmittanceFromUV(IN(TransmittanceTexture) preparedTransmittance, IN(vec2) prepared_tc) +{ + return DimensionlessSpectrumFromTexture(sample_texture(preparedTransmittance, prepared_tc)); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/statistical_clouds_shadow.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/statistical_clouds_shadow.hlsli new file mode 100644 index 00000000..7bd0c54d --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/statistical_clouds_shadow.hlsli @@ -0,0 +1,16 @@ +#ifndef STATISTICAL_CLOUDS_SHADOW_HLSLI +#define STATISTICAL_CLOUDS_SHADOW_HLSLI 1 + float getCloudsLength(float r, float mu, float clouds_bottom_radius_sq, float clouds_top_radius_sq) + { + float rmu = r * mu; + float rSq = r*r; + float rmuSq = (rmu*rmu - rSq); + float2 discriminant_bottom_top = float2(rmuSq + clouds_bottom_radius_sq, rmuSq + clouds_top_radius_sq); + float2 sqDiscr = sqrt(max(float2(0,0), discriminant_bottom_top)); + float2 dist_to_bottom = discriminant_bottom_top.x < 0 ? float2(0,0) : max(float2(0,0), float2(-rmu, -rmu) + float2(-sqDiscr.x, sqDiscr.x)); + float2 dist_to_top = discriminant_bottom_top.y < 0 ? float2(0,0) : max(float2(0,0), float2(-rmu, -rmu) + float2(-sqDiscr.y, sqDiscr.y)); + float len = max(0.f, max(dist_to_top.x, dist_to_top.y) - max(dist_to_bottom.x, dist_to_bottom.y)); + len += max(0.f, min(dist_to_bottom.x, dist_to_bottom.y) - min(dist_to_top.x, dist_to_top.y)); + return len; + } +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/texture_sizes.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/texture_sizes.hlsli new file mode 100644 index 00000000..11735aa4 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/texture_sizes.hlsli @@ -0,0 +1,17 @@ +#ifndef SKIES_TEXTURE_SIZES +#define SKIES_TEXTURE_SIZES 1 +#ifndef TRANSMITTANCE_TEXTURE_SIZE_DEFINED +#define TRANSMITTANCE_TEXTURE_SIZE_DEFINED 1 +static const int TRANSMITTANCE_TEXTURE_WIDTH = 256; +static const int TRANSMITTANCE_TEXTURE_HEIGHT = 64; +#endif +static const int SCATTERING_TEXTURE_MU_SIZE = 128; +static const int SCATTERING_TEXTURE_NU_SIZE = 8; +static const int IRRADIANCE_TEXTURE_WIDTH = 64; +static const int IRRADIANCE_TEXTURE_HEIGHT = 16; +static const int SKIES_OPTIMIZATION_NUM_LAYERS = 5;//actually 3 is also working fine +static const int SKIES_MULTIPLE_SCATTERING_APPROX = 32; +static const int SKIES_LUT_SIZE_W = 192; +static const int SKIES_LUT_SIZE_H = 108; + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/atmosphere/transmittance.hlsli b/project_templates/sample_scene/resources/shaders/include/atmosphere/transmittance.hlsli new file mode 100644 index 00000000..4bffd85b --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/atmosphere/transmittance.hlsli @@ -0,0 +1,340 @@ +#ifndef ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED +#define ATMOSPHERE_TRANSITTANCE_HLSLI_INCLUDED 1 +/** + * Copyright (c) 2017 Eric Bruneton + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * Precomputed Atmospheric Scattering + * Copyright (c) 2008 INRIA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atmosphere\atmosphere_params.hlsli" + +/* +

They use the following utility functions to avoid NaNs due to floating point +values slightly outside their theoretical bounds: +*/ +INLINE Number ClampCosine(Number mu) { + return clamp(mu, Number(-1.0), Number(1.0)); +} + +INLINE Length ClampDistance(Length d) { + return max(d, 0.0 * meter); +} + +INLINE Length ClampRadius(IN(AtmosphereParameters) atmosphere_p, Length r) { + return clamp(r, atmosphere_p.bottom_radius, atmosphere_p.top_radius); +} + +INLINE Length SafeSqrt(Area a) { + return sqrt(max(a, 0.0 * m2)); +} + +/* +

Transmittance

+ +

As the light travels from a point $\bp$ to a point $\bq$ in the atmosphere_p, +it is partially absorbed and scattered out of its initial direction because of +the air molecules and the aerosol particles. Thus, the light arriving at $\bq$ +is only a fraction of the light from $\bp$, and this fraction, which depends on +wavelength, is called the +transmittance. The +following sections describe how we compute it, how we store it in a precomputed +texture, and how we read it back. + +

Computation

+ +

For 3 aligned points $\bp$, $\bq$ and $\br$ inside the atmosphere_p, in this +order, the transmittance between $\bp$ and $\br$ is the product of the +transmittance between $\bp$ and $\bq$ and between $\bq$ and $\br$. In +particular, the transmittance between $\bp$ and $\bq$ is the transmittance +between $\bp$ and the nearest intersection $\bi$ of the half-line $[\bp,\bq)$ +with the top or bottom atmosphere_p boundary, divided by the transmittance between +$\bq$ and $\bi$ (or 0 if the segment $[\bp,\bq]$ intersects the ground): + + + + + + + + + + + + + + + + + + + + + + + + p + q + i + o + r + ?=cos(?) + x + z + + +

Also, the transmittance between $\bp$ and $\bq$ and between $\bq$ and $\bp$ +are the same. Thus, to compute the transmittance between arbitrary points, it +is sufficient to know the transmittance between a point $\bp$ in the atmosphere_p, +and points $\bi$ on the top atmosphere_p boundary. This transmittance depends on +only two parameters, which can be taken as the radius $r=\Vert\bo\bp\Vert$ and +the cosine of the "view zenith angle", +$\mu=\bo\bp\cdot\bp\bi/\Vert\bo\bp\Vert\Vert\bp\bi\Vert$. To compute it, we +first need to compute the length $\Vert\bp\bi\Vert$, and we need to know when +the segment $[\bp,\bi]$ intersects the ground. + +

Distance to the top atmosphere_p boundary
+ +

A point at distance $d$ from $\bp$ along $[\bp,\bi)$ has coordinates +$[d\sqrt{1-\mu^2}, r+d\mu]^\top$, whose squared norm is $d^2+2r\mu d+r^2$. +Thus, by definition of $\bi$, we have +$\Vert\bp\bi\Vert^2+2r\mu\Vert\bp\bi\Vert+r^2=r_{\mathrm{top}}^2$, +from which we deduce the length $\Vert\bp\bi\Vert$: +*/ + +INLINE Length DistanceToTopAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.top_radius * atmosphere_p.top_radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +INLINE Length DistanceToSomeAtmosphereBoundary(Length r, Number mu, Length radius) { + if (r > radius) + return 0; + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + radius * radius; + return ClampDistance(-r * mu + SafeSqrt(discriminant)); +} + +/* +

We will also need, in the other sections, the distance to the bottom +atmosphere_p boundary, which can be computed in a similar way (this code assumes +that $[\bp,\bi)$ intersects the ground): +*/ + +INLINE Length DistanceToBottomAtmosphereBoundary(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return ClampDistance(-r * mu - SafeSqrt(discriminant)); +} + +//return -1 if no hit +INLINE Length DistanceToBottomAtmosphereBoundarySigned(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) +{ + assert(mu >= -1.0 && mu <= 1.0); + Area discriminant = r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius; + return mu < 0 && discriminant >= 0 ? (-r * mu - sqrt(discriminant)) : (-1 * meter); +} + +/* +

Intersections with the ground
+ +

The segment $[\bp,\bi]$ intersects the ground when +$d^2+2r\mu d+r^2=r_{\mathrm{bottom}}^2$ has a solution with $d \ge 0$. This +requires the discriminant $r^2(\mu^2-1)+r_{\mathrm{bottom}}^2$ to be positive, +from which we deduce the following function: +*/ + +INLINE bool RayIntersectsGround(IN(AtmosphereParameters) atmosphere_p, + Length r, Number mu) { + assert(r >= atmosphere_p.bottom_radius); + assert(mu >= -1.0 && mu <= 1.0); + return mu < 0.0 && r * r * (mu * mu - 1.0) + + atmosphere_p.bottom_radius * atmosphere_p.bottom_radius >= 0.0 * m2; +} + +/* +

Transmittance to the top atmosphere_p boundary
+ +

We can now compute the transmittance between $\bp$ and $\bi$. From its +definition and the +Beer-Lambert law, +this involves the integral of the number density of air molecules along the +segment $[\bp,\bi]$, as well as the integral of the number density of aerosols +and the integral of the number density of air molecules that absorb light +(e.g. ozone) - along the same segment. These 3 integrals have the same form and, +when the segment $[\bp,\bi]$ does not intersect the ground, they can be computed +numerically with the help of the following auxilliary function (using the trapezoidal rule): +*/ + +INLINE Number GetMieDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + //return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude));//todo: exp2 + return saturate(exp(atmosphere_p.mie_density_altitude_exp_term * altitude)) + +atmosphere_p.mie2_strength * saturate(exp(atmosphere_p.mie2_density_altitude_exp_term * max(0., altitude-atmosphere_p.mie2_altitude)));//todo: exp2 +} + +INLINE Number GetRayDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(exp(atmosphere_p.rayleigh_density_altitude_exp_term * altitude));//todo exp2 +} + +INLINE Number GetAbsDensity(IN(AtmosphereParameters) atmosphere_p, Length altitude) { + return saturate(altitude < atmosphere_p.absorption_density_max_alt ? + atmosphere_p.absorption_density_linear_term0.x * altitude + atmosphere_p.absorption_density_linear_term0.y: + atmosphere_p.absorption_density_linear_term1.x * altitude + atmosphere_p.absorption_density_linear_term1.y); +} + +struct MediumSampleRGB +{ + DimensionlessSpectrum scattering; + DimensionlessSpectrum extinction; + + DimensionlessSpectrum scatteringMie; + DimensionlessSpectrum scatteringRay; +}; + +INLINE MediumSampleRGB SampleMediumFull(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos)//worldPos is for other volumetrics +{ + G_UNUSED(worldPos); + Number densityMie = GetMieDensity(atmosphere_p, altitude); + Number densityRay = GetRayDensity(atmosphere_p, altitude); + Number densityAbs = GetAbsDensity(atmosphere_p, altitude); + + MediumSampleRGB s; + + s.scatteringMie = densityMie * atmosphere_p.mie_scattering; + s.scatteringRay = densityRay * atmosphere_p.rayleigh_scattering; + s.extinction = densityMie * atmosphere_p.mie_extinction + s.scatteringRay + densityAbs * atmosphere_p.absorption_extinction; + DimensionlessSpectrum msScattering = DimensionlessSpectrum(0,0,0); + #if CUSTOM_SKIES_FOG + getSkiesCustomFog(s.scatteringMie, s.scatteringRay, msScattering, s.extinction, altitude, worldPos);//todo: add fixed phase fog + #endif + s.scattering = s.scatteringMie + s.scatteringRay + msScattering; + return s; +} + +INLINE void SampleMedium(IN(AtmosphereParameters) atmosphere_p, Length altitude, IN(Position) worldPos, + OUT(DimensionlessSpectrum) scattering, OUT(DimensionlessSpectrum) extinction) +{ + MediumSampleRGB medium = SampleMediumFull(atmosphere_p, altitude, worldPos); + scattering = medium.scattering; + extinction = medium.extinction; +} +/* +

With this function the transmittance between $\bp$ and $\bi$ is now easy to +compute (we continue to assume that the segment does not intersect the ground): +*/ + +INLINE DimensionlessSpectrum ComputeTransmittanceToTopAtmosphereBoundary( + IN(AtmosphereParameters) atmosphere_p, Length r, Number mu, Length maxDist, int SAMPLE_COUNT, + IN(Position) worldPos, IN(Direction) worldDir//only for custom fog + ) +{ + assert(r >= atmosphere_p.bottom_radius && r <= atmosphere_p.top_radius); + assert(mu >= -1.0 && mu <= 1.0); + + Length dist = min(maxDist, DistanceToTopAtmosphereBoundary(atmosphere_p, r, mu)); + Length dx = dist / Number(SAMPLE_COUNT); + // Integration loop. + //generic loop, works for any medium + DimensionlessSpectrum sampleScattering, sampleExtinction; + SampleMedium(atmosphere_p, r - atmosphere_p.bottom_radius, worldPos, sampleScattering, sampleExtinction); + DimensionlessSpectrum extinction = sampleExtinction*0.5; + for (int i = 1; i < SAMPLE_COUNT; ++i) + { + Length d_i = Number(i) * dx; + // Distance between the current sample point and the planet center. + Length r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r); + SampleMedium(atmosphere_p, r_i - atmosphere_p.bottom_radius, worldPos + worldDir*d_i, sampleScattering, sampleExtinction); + extinction += sampleExtinction; + } + SampleMedium(atmosphere_p, sqrt(dist * dist + 2.0 * r * mu * dist + r * r) - atmosphere_p.bottom_radius, worldPos + worldDir*dist, + sampleScattering, sampleExtinction); + extinction += sampleExtinction*0.5; + return exp(-dx*extinction); +} + +/* +

Precomputation

+ +

The above function is quite costly to evaluate, and a lot of evaluations are +needed to compute single and multiple scattering. Fortunately this function +depends on only two parameters and is quite smooth, so we can precompute it in a +small 2D texture to optimize its evaluation. + +

For this we need a mapping between the function parameters $(r,\mu)$ and the +texture coordinates $(u,v)$, and vice-versa, because these parameters do not +have the same units and range of values. And even if it was the case, storing a +function $f$ from the $[0,1]$ interval in a texture of size $n$ would sample the +function at $0.5/n$, $1.5/n$, ... $(n-0.5)/n$, because texture samples are at +the center of texels. Therefore, this texture would only give us extrapolated +function values at the domain boundaries ($0$ and $1$). To avoid this we need +to store $f(0)$ at the center of texel 0 and $f(1)$ at the center of texel +$n-1$. This can be done with the following mapping from values $x$ in $[0,1]$ to +texture coordinates $u$ in $[0.5/n,1-0.5/n]$ - and its inverse: +*/ +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/clustered/point_light.hlsli b/project_templates/sample_scene/resources/shaders/include/clustered/point_light.hlsli new file mode 100644 index 00000000..25f197e6 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/clustered/point_light.hlsli @@ -0,0 +1,130 @@ +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "pbr.hlsli" +#include "ColorSpaceUtility.hlsl" +#include "shader_global.hlsli" +#include "atmosphere/functions.hlsli" +#include "punctualLightsMath.hlsli" + +#define TEX_ID_MULTIPLIER (1 << 5) +#define MAX_OMNI_LIGHTS 256 +#define MAX_SPOT_LIGHTS 256 + +#define DYNAMIC_LIGHTS_SSS 1 +#define LAMBERT_LIGHT 1 +#define DYNAMIC_LIGHTS_EARLY_EXIT 1 + +struct RenderOmniLight +{ + float4 posRadius; + float4 colorFlags; + float4 direction__tex_scale; + float4 boxR0; + float4 boxR1; + float4 boxR2; + float4 posRelToOrigin_cullRadius; +}; + +struct RenderSpotLight +{ + float4 lightPosRadius; + float4 lightColorAngleScale; //AngleScale sign bit contains contact_shadow bit + float4 lightDirectionAngleOffset; + float4 texId_scale; +}; + +GLOBAL_CBUFFER(LightConstBuffer) : register(b0) +{ + float4x4 mvp; + float4x4 globtm_inv; + float4 screen_pos_to_texcoord; + float4 world_view_pos; +}; + + +/* TODO: support Photometry +Texture2DArray photometry_textures_tex : register(t4); +SamplerState photometry_textures_tex_samplerstate : register(s4); +*/ + + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +/* TODO: support Photometry +half2 getPhotometryTexCoords(half3 lightDir, half3 dir, float zoom, bool rotate) +{ + half3 side = abs(lightDir.x) < 0.707106781186548 + ? half3(1, 0, 0) + : half3(0, 0, 1); + half3 forward = normalize(cross(side, lightDir)); + side = cross(lightDir, forward); +#if USE_OCTAHEDRAL_MAPPING + half2 tc = octahedral_mapping(half3(dot(side, dir), dot(lightDir, dir), dot(forward, dir)), zoom, rotate); +#else + half phi = atan2(dot(forward, dir), dot(side, dir)); + half2 tc = half2(phi / (2 * M_PI), acosFast4(dot(lightDir, dir)) / M_PI * zoom); +#endif + return tc; +} + +float getPhotometryValue(float3 light_dir, float3 dir, float zoom, bool rotated, float texId) +{ + half2 tc = getPhotometryTexCoords(light_dir, dir, zoom, rotated); + BRANCH + if (any(or(tc < 0, tc > 1))) + return 0; + float3 photometry = tex3Dlod( + photometry_textures_tex, + half4(tc, texId, 0)).rgb; + return SRGBToLinear_Fast(photometry.r).r; +} +*/ + +half applyPhotometryIntensity(float3 lightToWorldDir, float3 lightDir, float texId, float texScale_rotation, float currentAttenuation) +{ + return currentAttenuation; +// ##if photometry_textures_tex != NULL +// ##if photometry_textures_tex != NULL + //bool rotated = texScale_rotation < 0; + //float zoom = abs(texScale_rotation); + // BRANCH + //if (texId < 0 || currentAttenuation < 0.0001) + // return currentAttenuation; + //return getPhotometryValue(lightDir, lightToWorldDir, zoom, rotated, texId) * currentAttenuation; +// ##else +} + + +// from http://advances.realtimerendering.com/other/2016/naughty_dog/index.html +// http://advances.realtimerendering.com/other/2016/naughty_dog/NaughtyDog_TechArt_Final.pdf +half calc_micro_shadow(half NoL, half AO) +{ + return (half) saturate(abs(NoL) + half(2.0) * pow2(AO) - half(1.0)); +} + +float3x3 axis_matrix(float3 right, float3 up, float3 forward) +{ + float3 xaxis = right; + float3 yaxis = up; + float3 zaxis = forward; + return float3x3( + xaxis.x, yaxis.x, zaxis.x, + xaxis.y, yaxis.y, zaxis.y, + xaxis.z, yaxis.z, zaxis.z + ); +} + +float3 tangent_to_world(float3 vec, float3 tangentZ) +{ + float3 up = abs(tangentZ.z) < 0.999 ? float3(0, 0, 1) : float3(1, 0, 0); + float3 tangentX = normalize(cross(up, tangentZ)); + float3 tangentY = cross(tangentZ, tangentX); + return tangentX * vec.x + tangentY * vec.y + tangentZ * vec.z; +} + +float2 screen_pos_to_tc(float2 screen_pos) +{ + return screen_pos * screen_pos_to_texcoord.xy + screen_pos_to_texcoord.zw; +} diff --git a/project_templates/sample_scene/resources/shaders/include/clustered/punctualLightsMath.hlsli b/project_templates/sample_scene/resources/shaders/include/clustered/punctualLightsMath.hlsli new file mode 100644 index 00000000..cdd2ebf3 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/clustered/punctualLightsMath.hlsli @@ -0,0 +1,134 @@ +#include "fast_shader_trig.hlsli" + + //Window1 from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + float smoothDistanceAtt ( float squaredDistance, float invSqrAttRadius ) + { + float factor = squaredDistance * invSqrAttRadius ; + float smoothFactor = saturate (1.0f - factor * factor ); + return smoothFactor * smoothFactor; + } + + float getDistanceAtt ( float sqrDist, float invSqrAttRadius ) + { + float attenuation = rcp(max(sqrDist, 0.0001)); + attenuation = saturate(attenuation * smoothDistanceAtt ( sqrDist, invSqrAttRadius )); + return attenuation; + } + float getAngleAtt ( float3 normalizedLightVector, float3 lightDir, float lightAngleScale , float lightAngleOffset) + { + // On the CPU + // float lightAngleScale = 1.0f / max (0.001f, ( cosInner - cosOuter )); + // float lightAngleOffset = -cosOuter * angleScale ; + + float cd = dot ( lightDir , normalizedLightVector ); + float attenuation = saturate (cd * lightAngleScale + lightAngleOffset ); + // smooth the transition + return attenuation * attenuation ; + } + + +// A right disk is a disk oriented to always face the lit surface . +// Solid angle of a sphere or a right disk is 2 PI (1 - cos( subtended angle )). +// Subtended angle sigma = arcsin (r / d) for a sphere +// and sigma = atan (r / d) for a right disk +// sinSigmaSqr = sin( subtended angle )^2, it is (r^2 / d^2) for a sphere +// and (r^2 / ( r^2 + d ^2) ) for a disk +// cosTheta is not clamped +float illuminanceSphereOrDisk ( float cosTheta , float sinSigmaSqr ) +{ + float sinTheta = sqrt (1.0f - cosTheta * cosTheta ); + + float illuminance = 0.0f; + // Note : Following test is equivalent to the original formula . + // There is 3 phase in the curve : cosTheta > sqrt ( sinSigmaSqr ), + // cosTheta > -sqrt ( sinSigmaSqr ) and else it is 0 + // The two outer case can be merge into a cosTheta * cosTheta > sinSigmaSqr + // and using saturate ( cosTheta ) instead . + if ( cosTheta * cosTheta > sinSigmaSqr ) + { + illuminance = sinSigmaSqr * saturate ( cosTheta ); + } + else + { + float x = sqrt (1.0f / sinSigmaSqr - 1.0f); // For a disk this simplify to x = d / r + float y = -x * ( cosTheta / sinTheta ); + float sinThetaSqrtY = sinTheta * sqrt (1.0f - y * y); + illuminance = ( cosTheta * acosFast4 (y) - x * sinThetaSqrtY ) * sinSigmaSqr + atan (sinThetaSqrtY / x); + illuminance /= PI; + } + return max ( illuminance , 0.0f); +} + +float illuminanceSphereAttenuation ( float3 worldNormal, float3 dirToLight, float lightRadius, float sqrDist) +{ + // Sphere evaluation + float cosTheta = clamp ( dot ( worldNormal, dirToLight), -0.999, 0.999) ; // Clamp to avoid edge case + // We need to prevent the object penetrating into the surface + // and we must avoid divide by 0, thus the 0.9999 f + + float sqrLightRadius = lightRadius * lightRadius ; + float sinSigmaSqr = min( sqrLightRadius / sqrDist, 0.9999f); + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ); + return illuminance; +} + + +float illuminanceDiskAttenuation ( float3 worldNormal, float3 dirToLight, float3 planeNormal, float lightRadius, float sqrDist) +{ + // Disk evaluation + float cosTheta = dot ( worldNormal, dirToLight); + float sqrLightRadius = lightRadius * lightRadius ; + // Do not let the surface penetrate the light + float sinSigmaSqr = sqrLightRadius / ( sqrLightRadius + max ( sqrLightRadius , sqrDist )); + // Multiply by saturate ( dot ( planeNormal , -dirToLight)) to better match ground truth . + float illuminance = illuminanceSphereOrDisk ( cosTheta , sinSigmaSqr ) * saturate ( dot( planeNormal , -dirToLight)); + return illuminance; +} + +void spot_light_params(float3 worldPos, float4 pos_and_radius, float3 light_direction, float lightAngleScale, float lightAngleOffset, out half geomAttenuation, out float3 dirFromLight, out float3 point2light) +{ + point2light = pos_and_radius.xyz-worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float rcpDistFromLight = rsqrt(0.0000001+distSqFromLight); + dirFromLight = point2light*rcpDistFromLight; + float invSqrRad = rcp(pow2(pos_and_radius.w)); + + geomAttenuation = getDistanceAtt( distSqFromLight, invSqrRad ); + geomAttenuation = geomAttenuation*getAngleAtt ( -dirFromLight, light_direction, lightAngleScale, lightAngleOffset); +} + +half areaSphereNormalization( float len, float lightSize, float m ) +{ + // Compute the normalization factors. + // Note: just using sphere normalization (todo: come up with proper disk/plane normalization) + half dist = saturate(lightSize / len); + half normFactor = m / ( m + 0.5 * dist ); + return normFactor * normFactor; +} + +half3 areaSphereLight(half3 R, half3 L, half m, half lightSize) +{ + // Intersect the sphere. + half3 centerDir = L - dot(L, R) * R; + L = L - centerDir * saturate( lightSize / (length(centerDir)+1e-6) ); + return L.xyz; +} + +half4 SphereAreaLightIntersection( half3 N, half3 V, half3 L, half ggx_alpha, half lightSize ) +{ + half4 lightVec = half4(L.xyz, 1.0f); + half3 R = reflect(V, N); + + lightVec.xyz = areaSphereLight(R, L, ggx_alpha, lightSize); + + // Normalize. + half len = max(length( lightVec.xyz ), 1e-6); + lightVec.xyz /= len; + + // Energy normalization + lightVec.w = areaSphereNormalization( len, lightSize, ggx_alpha ); + + return lightVec; +} + + diff --git a/project_templates/sample_scene/resources/shaders/include/common_types.hlsli b/project_templates/sample_scene/resources/shaders/include/common_types.hlsli new file mode 100644 index 00000000..8aa64c30 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/common_types.hlsli @@ -0,0 +1,17 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct InstanceData +{ + float4x4 worldMatrix; + float4x4 normalMatrix; + uint4 uid; + uint isHighlighted; + uint3 dummy; +}; + +struct PixelData +{ + uint4 uid; + float depth; +}; diff --git a/project_templates/sample_scene/resources/shaders/include/cs_common.hlsli b/project_templates/sample_scene/resources/shaders/include/cs_common.hlsli new file mode 100644 index 00000000..93fc9fad --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/cs_common.hlsli @@ -0,0 +1,51 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_global.hlsli" + +static float3 CUBE_FACES_N[CUBE_FACE_COUNT] = { + UNIT_X, + -UNIT_X, + UNIT_Y, + -UNIT_Y, + UNIT_Z, + -UNIT_Z +}; +static float3 CUBE_FACES_T[CUBE_FACE_COUNT] = { + -UNIT_Z, + UNIT_Z, + UNIT_X, + UNIT_X, + UNIT_X, + -UNIT_X +}; +static float3 CUBE_FACES_B[CUBE_FACE_COUNT] = { + -UNIT_Y, + -UNIT_Y, + UNIT_Z, + -UNIT_Z, + -UNIT_Y, + -UNIT_Y +}; + +float2 GetUV(uint2 id, uint2 imageSize) +{ + const float2 pixelSize = 1.0f / imageSize; + return pixelSize * id + pixelSize * 0.5; +} + +float3 GetCubeDirection(uint curFaceIndex, float2 uv) +{ + const float2 xy = uv * 2.0 - 1.0; + + const float3 normal = CUBE_FACES_N[curFaceIndex]; + const float3 tangent = CUBE_FACES_T[curFaceIndex]; + const float3 binormal = CUBE_FACES_B[curFaceIndex]; + + return normalize(normal + xy.x * tangent + xy.y * binormal); +} + +float CosThetaWorld(float3 N, float3 v) +{ + return max(dot(N, v), 0.0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/csm.hlsli b/project_templates/sample_scene/resources/shaders/include/csm.hlsli new file mode 100644 index 00000000..28cd79bb --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/csm.hlsli @@ -0,0 +1,204 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "hardware_defines.hlsli" + +#ifndef CSM_HLSL +#define CSM_HLSL 1 + +#ifndef NUM_CASCADES + #define NUM_CASCADES 4 +#endif + +#define shadow2D(a, uv) a.SampleCmpLevelZero(csmSampler, (uv).xy, (uv).z) +#define shadow2DArray(a, uv) a.SampleCmpLevelZero(csmSampler, (uv).xyz, (uv).w) + +// inc "./csm_shadow_tc.hlsl" +#ifndef shadow_array_supported +#define shadow_array_supported 0 +#endif + +#ifndef MIN_SHADOW_SIZE + #define MIN_SHADOW_SIZE 512 +#endif + +#define HALF (float3(0.5-2./MIN_SHADOW_SIZE, 0.5-2./MIN_SHADOW_SIZE, 0.5))//0.5-2/512 (512 is our smallest cascade size) + +#ifndef LAST_CASCADE +#define LAST_CASCADE NUM_CASCADES +#endif + +SYSTEM_CBUFFER(CSMBuffer) : register(b3) +{ + float4 pcf_lerp; + float4 shadow_cascade_tm_transp[24]; + float4 shadow_cascade_tc_mul_offset[6]; +} + +float get_csm_shadow_effect( uint cascade_id, float3 t0, float3 t1, float3 t2, float3 t3, float3 t4, float3 t5 ) +{ + float csmEffect = 0; + csmEffect = (LAST_CASCADE==6 && cascade_id == LAST_CASCADE-1) ? max3(abs(t5.x), abs(t5.y), abs(t5.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==5 && cascade_id == LAST_CASCADE-1) ? max3(abs(t4.x), abs(t4.y), abs(t4.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==4 && cascade_id == LAST_CASCADE-1) ? max3(abs(t3.x), abs(t3.y), abs(t3.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==3 && cascade_id == LAST_CASCADE-1) ? max3(abs(t2.x), abs(t2.y), abs(t2.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==2 && cascade_id == LAST_CASCADE-1) ? max3(abs(t1.x), abs(t1.y), abs(t1.z))*2 : csmEffect; + csmEffect = (LAST_CASCADE==1 && cascade_id == LAST_CASCADE-1) ? max3(abs(t0.x), abs(t0.y), abs(t0.z))*2 : csmEffect; + return csmEffect; +} + +float3 get_csm_shadow_tc(float3 pointToEye, float sel_scale, out uint cascade_id, out float csmEffect, out float3 tlast) +{ + pointToEye = -pointToEye; + //to be moved out to const buffer + float3 t0,t1,t2,t3,t4,t5; + t0 = pointToEye.x*shadow_cascade_tm_transp[4*0+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*0+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*0+2].xyz + + shadow_cascade_tm_transp[4*0+3].xyz; + #if NUM_CASCADES>1 + t1 = pointToEye.x*shadow_cascade_tm_transp[4*1+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*1+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*1+2].xyz + + shadow_cascade_tm_transp[4*1+3].xyz; + #endif + #if NUM_CASCADES>2 + t2 = pointToEye.x*shadow_cascade_tm_transp[4*2+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*2+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*2+2].xyz + + shadow_cascade_tm_transp[4*2+3].xyz; + #endif + #if NUM_CASCADES>3 + t3 = pointToEye.x*shadow_cascade_tm_transp[4*3+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*3+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*3+2].xyz + + shadow_cascade_tm_transp[4*3+3].xyz; + #endif + #if NUM_CASCADES>4 + t4 = pointToEye.x*shadow_cascade_tm_transp[4*4+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*4+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*4+2].xyz + + shadow_cascade_tm_transp[4*4+3].xyz; + #endif + #if NUM_CASCADES>5 + t5 = pointToEye.x*shadow_cascade_tm_transp[4*5+0].xyz + + pointToEye.y*shadow_cascade_tm_transp[4*5+1].xyz + + pointToEye.z*shadow_cascade_tm_transp[4*5+2].xyz + + shadow_cascade_tm_transp[4*5+3].xyz; + #endif + + tlast = float3(0, 0, 0); + #if NUM_CASCADES==2 + tlast = t1; + #elif NUM_CASCADES==3 + tlast = t2; + #elif NUM_CASCADES==4 + tlast = t3; + #elif NUM_CASCADES==5 + tlast = t4; + #elif NUM_CASCADES==6 + tlast = t5; + #endif + float3 use_half = sel_scale * HALF; + bool b5 = NUM_CASCADES > 5 && all(abs(t5) 4 && all(abs(t4) 3 && all(abs(t3) 2 && all(abs(t2) 1 && all(abs(t1) + +float3 diffuseLambert( float3 diffuseColor ) +{ + return diffuseColor;//division by PI omitted intentionally, lightColor is divided by Pi +} + +//linearRoughness - perceptual linear roughness +float3 diffuseBurley( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + float FD90 = 0.5 + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return diffuseColor * ( FdV * FdL );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//from moving FrostBite to PBR, energy conservative burley diffuse +float diffuseBurleyFixedFresnel( float linearRoughness, float NoV, float NoL, float VoH ) +{ + float energyBias = 0.5; + float energyFactor = (0.45f * linearRoughness - 0.475f) * linearRoughness + 1.0f; + float FD90 = energyBias + 2 * VoH * VoH * linearRoughness; + float FdV = 1 + (FD90 - 1) * pow5(1 - NoV); + float FdL = 1 + (FD90 - 1) * pow5(1 - NoL); + return ( FdV * FdL * energyFactor);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float3 diffuseBurleyFixed( float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH ) +{ + return diffuseColor * diffuseBurleyFixedFresnel( linearRoughness, NoV, NoL, VoH);//division by PI omitted intentionally, lightColor is divided by Pi +} + +float diffuseChanFresnel( float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + // Since we use CoD fitting, need to invert/convert our roughness parametrization to + // their glossiness parametrization 'g' + float ggx_alpha = linear_roughness*linear_roughness; + float a2 = ggx_alpha*ggx_alpha; + float g = saturate( (1.0 / 18.0) * log2( 2 / a2 - 1 ) ); + + float f0 = VoH + pow5(1 - VoH); + // This factor tunes the enery boost at grazing angle for low roughness material. + // It creates energy ring at grazing angle for smooth dieletric material + // The higher the value 'rimScale' is, the lower the energy boost will be + // The default value from Chan is 0.75. + // Setting the value to 1.0 get rid off this energy boost. + const float rimScale = 0.75f; + float f1 = (1.0 - rimScale * pow5(1.0 - NoL)) * (1.0 - rimScale * pow5(1.0 - NoV)); + + // Rough (f0) to smooth f1 response interpolation + float fd = lerp( f0, f1, saturate( 2.2 * g - 0.5 ) ); + + // Retro reflectivity contribution. + float fb = ( (34.5 * g - 59 ) * g + 24.5 ) * VoH * exp2( -max( 73.2 * g - 21.2, 8.9 ) * sqrt( NoH ) ); + // allow to fade our rough retro reflectivity + fb *= retroReflectivityWeight; + return ( fd + fb ); +} + +float3 diffuseChan( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH, float NoH, float retroReflectivityWeight=1) +{ + return diffuseColor * diffuseChanFresnel(linear_roughness, NoV, NoL, VoH, NoH, retroReflectivityWeight); +} + +float3 diffuseOrenNayar( float3 diffuseColor, float linear_roughness, float NoV, float NoL, float VoH ) +{ + float VoL = 2 * VoH - 1; + float m = linear_roughness * linear_roughness; + float m2 = m * m; + float C1 = 1 - 0.5 * m2 *rcp(m2 + 0.33); + float Cosri = VoL - NoV * NoL; + + float C2 = 0.45 * m2 * rcp(m2 + 0.09) * ( Cosri >= 0 ? Cosri * rcp(max(NoL, NoV)) : 0 ); + return diffuseColor * (C1 + C2); + //float C2 = 0.45 * m2 * rcp(m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NoL / NoV ) : NoL ); + //return diffuseColor * ( NoL * C1 + C2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// N is the normal direction +// V is the view vector +// NdotV is the cosine angle between the view vector and the normal +float3 getDiffuseDominantDir ( float3 N, float3 V, float saturated_NdotV, float ggx_alpha) +{ + float a = 1.02341f * ggx_alpha - 1.51174f; + float b = -0.511705f * ggx_alpha + 0.755868f; + float lerpFactor = saturate (( saturated_NdotV* a + b) * ggx_alpha); + // The result is not normalized as we fetch in a cubemap + return lerp (N, V, lerpFactor ); +} + + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/envi_brdf.hlsli b/project_templates/sample_scene/resources/shaders/include/envi_brdf.hlsli new file mode 100644 index 00000000..6eaa79be --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/envi_brdf.hlsli @@ -0,0 +1,44 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef ENVI_BRDF_HLSL +#define ENVI_BRDF_HLSL 1 + +#ifndef INV_MIN_IOR +#define INV_MIN_IOR 50.0h +#endif + +//--------------- +// EnvBRDF +//--------------- + +half2 get_EnvBRDF_AB_Approx( half linear_roughness, half NoV ) +{ + // [ Lazarov 2013, "Getting More Physical in Call of Duty: Black Ops II" ] + // Adaptation to fit our G term. + const half4 c0 = { -1.h, -0.0275h, -0.572h, 0.022h }; + const half4 c1 = { 1.h, 0.0425h, 1.04h, -0.04h }; + half4 r = linear_roughness * c0 + c1; + half a004 = min( r.x * r.x, exp2( -9.28h * NoV ) ) * r.x + r.y; + return half2( -1.04h, 1.04h ) * a004 + r.zw; +} + +half3 EnvBRDFApprox( half3 specularColor, half linear_roughness, half NoV ) +{ + // [ Lazarov 2013, "Getting More Physical in Call of Duty: Black Ops II" ] + // Adaptation to fit our G term. + half2 AB = get_EnvBRDF_AB_Approx( linear_roughness, NoV ); + return specularColor * AB.x + AB.yyy*saturate(INV_MIN_IOR*specularColor.g); +} + + +half EnvBRDFApproxNonmetal( half linear_roughness, half NoV ) +{ + // Same as EnvBRDFApprox( 0.04, roughness, NoV ) + const half2 c0 = { -1.h, -0.0275h }; + const half2 c1 = { 1.h, 0.0425h }; + half2 r = linear_roughness * c0 + c1; + return min( r.x * r.x, exp2( -9.28h * NoV ) ) * r.x + r.y; +} + +#endif diff --git a/project_templates/sample_scene/resources/shaders/include/fast_shader_trig.hlsli b/project_templates/sample_scene/resources/shaders/include/fast_shader_trig.hlsli new file mode 100644 index 00000000..53cc7f7e --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/fast_shader_trig.hlsli @@ -0,0 +1,57 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef SHADER_FAST_MATH_INC_FX +#define SHADER_FAST_MATH_INC_FX +// +// Trigonometric functions +// +#define fsl_PI 3.1415926535897932384626433f +#define fsl_HALF_PI (0.5f * 3.1415926535897932384626433f) + +// 4th order polynomial approximation +// 4 VGRP, 16 ALU Full Rate +// 7 * 10^-5 radians precision +// Reference : Handbook of Mathematical Functions (chapter : Elementary Transcendental Functions), M. Abramowitz and I.A. Stegun, Ed. +float acosFast4(float inX) +{ + float x1 = abs(inX); + float x2 = x1 * x1; + float x3 = x2 * x1; + float s; + + s = -0.2121144f * x1 + 1.5707288f; + s = 0.0742610f * x2 + s; + s = -0.0187293f * x3 + s; + s = sqrt(1.0f - x1) * s; + + // acos function mirroring + // check per platform if compiles to a selector - no branch neeeded + return inX >= 0.0f ? s : fsl_PI - s; +} + +// 4th order polynomial approximation +// 4 VGRP, 16 ALU Full Rate +// 7 * 10^-5 radians precision +float asinFast4(float inX) +{ + float x = inX; + + // asin is offset of acos + return fsl_HALF_PI - acosFast4(x); +} + +// 4th order hyperbolical approximation +// 4 VGRP, 12 ALU Full Rate +// 7 * 10^-5 radians precision +// Reference : Efficient approximations for the arctangent function, Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006 +float atanFast4(float inX) +{ + float x = inX; + return x*(-0.1784f * abs(x) - 0.0663f * x * x + 1.0301f); +} + +#undef fsl_PI +#undef fsl_HALF_PI + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/gbuffer_base.hlsli b/project_templates/sample_scene/resources/shaders/include/gbuffer_base.hlsli new file mode 100644 index 00000000..354875c4 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/gbuffer_base.hlsli @@ -0,0 +1,243 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + +bool isEmissiveShader(float material) +{ + return material == SHADING_EMISSIVE; +} + +struct ProcessedGbuffer +{ + half3 diffuseColor; + half3 specularColor; + half3 translucencyColor; + half roughness, linearRoughness; + float3 normal; + + half metallness; + half translucency; // either translucent or metallic + + half extracted_albedo_ao; // custom + half ao; // custom + half shadow; + half3 emissionColor; + half emission_part; + float material; +}; + +struct UnpackedGbuffer +{ + half3 albedo; + half smoothness; + float3 normal; + + half metallness; // either translucent or metallic or emission + half translucency; // either translucent or metallic or emission + half emission_part; // either translucent or metallic or emission + + half ao; // either ao, or emission + half emission_strength; // either ao, or emission + half shadow; + float material; + float outline; +}; + +struct PackedGbuffer +{ + half4 albedo_ao; + float4 normal_smoothness_material; + half2 metallTranslucency_shadow; // processed +}; +// Spheremap Transform +float2 encodeNormal(float3 n) +{ + half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5)); + enc = enc*0.5+0.5; + return enc; +} +float3 decodeNormal(float2 enc) +{ + float4 nn = float4(enc.xy,0,0)*float4(2,2,0,0) + float4(-1,-1,1,-1); + half l = dot(nn.xyz,-nn.xyw); + nn.z = l; + nn.xy *= sqrt(l); + return (nn.xyz * 2 + half3(0,0,-1)); +} +half luminance(half3 col) +{ + return dot(col, half3(0.299, 0.587, 0.114)); +} +half decode_albedo_ao(half3 albedo) +{ + return saturate(luminance(albedo) * (1 / 0.04)) * 0.9 + 0.1; // anything darker than charcoal is not physical possible, and is shadow +} +PackedGbuffer pack_gbuffer(UnpackedGbuffer gbuffer) +{ + PackedGbuffer gbuf; + half metallnessOrTranslucency = gbuffer.metallness; + metallnessOrTranslucency = isEmissiveShader(gbuffer.material) ? gbuffer.emission_part : metallnessOrTranslucency; + + float3 normal_smoothness = float3(encodeNormal(gbuffer.normal.xyz), max(gbuffer.smoothness, 1.0 / 127)); + half material = gbuffer.material * (1.f / 3.0); + gbuf.normal_smoothness_material = float4(normal_smoothness, material); + gbuf.albedo_ao = half4(gbuffer.albedo, isEmissiveShader(gbuffer.material) ? gbuffer.emission_strength * (1.0f / MAX_EMISSION) : gbuffer.ao); + // gbuf.albedo_ao = half4(pow(gbuffer.albedo, 1/2.2), gbuffer.ao); + // gbuf.metallTranslucency_shadow = (floor(metallnessOrTranslucency*15)*16+floor(gbuffer.shadow*15))*(1.0/255.0); + gbuf.metallTranslucency_shadow = float2(metallnessOrTranslucency, gbuffer.shadow); + return gbuf; +} + +void unpackNormalSmoothness(float3 normal_smoothness, out float3 normal, out half smoothness) +{ + normal = decodeNormal(normal_smoothness.xy); + smoothness = abs(normal_smoothness.z); +} + +void unpackGbufferNormalSmoothness(PackedGbuffer gbuf, out float3 normal, out half smoothness) +{ + unpackNormalSmoothness(gbuf.normal_smoothness_material.xyz, normal, smoothness); +} + +UnpackedGbuffer unpackGbuffer(PackedGbuffer gbuf) +{ + UnpackedGbuffer gbuffer; + + gbuffer.material = floor(gbuf.normal_smoothness_material.w * 3.f); + // half metallTranslucency_shadow = gbuf.metallTranslucency_shadow.x*(255.0/16.0); + // half shadow = frac(metallTranslucency_shadow)*(16.0/15.0); + // half metallnessOrTranslucency = floor(metallTranslucency_shadow)*(1./15); + half shadow = gbuf.metallTranslucency_shadow.y; + half metallnessOrTranslucency = gbuf.metallTranslucency_shadow.x; + gbuffer.albedo = gbuf.albedo_ao.xyz; + unpackGbufferNormalSmoothness(gbuf, gbuffer.normal, gbuffer.smoothness); + + gbuffer.emission_part = isEmissiveShader(gbuffer.material) ? metallnessOrTranslucency : 0; + gbuffer.metallness = metallnessOrTranslucency; + gbuffer.translucency = 0; + gbuffer.ao = isEmissiveShader(gbuffer.material) ? 1 : gbuf.albedo_ao.w; + gbuffer.emission_strength = isEmissiveShader(gbuffer.material) ? gbuf.albedo_ao.w * MAX_EMISSION : 0; + gbuffer.shadow = shadow; + // gbuffer.diffuseColor = albedo*(1-gbuffer.metallness); + // half fresnel0Dielectric = 0.04f;//lerp(0.16f,0.01f, smoothness);//sqr((1.0 - refractiveIndex)/(1.0 + refractiveIndex)) for dielectrics; + // gbuffer.specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), albedo, gbuffer.metallness); + return gbuffer; +} +ProcessedGbuffer processGbuffer(UnpackedGbuffer gbuf) +{ + ProcessedGbuffer gbuffer; + gbuffer.material = gbuf.material; + gbuffer.normal = gbuf.normal; + gbuffer.linearRoughness = 1 - gbuf.smoothness; + gbuffer.roughness = max(1e-4, gbuffer.linearRoughness * gbuffer.linearRoughness); + gbuffer.metallness = gbuf.metallness; + gbuffer.translucency = gbuf.translucency; // due to 2 bit encoding *0.75 is correct + gbuffer.emissionColor = gbuf.emission_strength * gbuf.albedo; + gbuffer.emission_part = gbuf.emission_part; + gbuffer.extracted_albedo_ao = decode_albedo_ao(gbuf.albedo); + gbuffer.diffuseColor = gbuf.albedo - gbuffer.metallness * gbuf.albedo; //*(1-met) + gbuffer.shadow = gbuf.shadow; + gbuffer.translucencyColor = gbuffer.diffuseColor * gbuffer.translucency; + + half fresnel0Dielectric = 0.04f; // + (gbuf.material == SHADING_NORMAL ? 0.2 * (1-gbuf.shadow) : 0);//lerp(0.16f,0.01f, roughness);//sqr((1.0 - refractiveIndex)/(1.0 + refractiveIndex)) for dielectrics; + fresnel0Dielectric = lerp(fresnel0Dielectric, 0.01f, gbuffer.roughness * gbuffer.translucency); + fresnel0Dielectric *= (1 - gbuffer.translucency); + gbuffer.specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), gbuf.albedo, gbuffer.metallness); + gbuffer.ao = gbuf.ao; + return gbuffer; +} + +void init_gbuffer(out UnpackedGbuffer result) +{ + result.albedo = result.normal = 0; + result.smoothness = result.metallness = result.translucency = 0; + result.emission_part = result.emission_strength = 0; + result.ao = result.shadow = 1; + result.material = SHADING_NORMAL; +} +void init_albedo(inout UnpackedGbuffer result, half3 albedo) +{ + result.albedo.xyz = albedo; +} +void init_smoothness(inout UnpackedGbuffer result, half smoothness) +{ + result.smoothness = smoothness; +} + +void init_normal(inout UnpackedGbuffer result, float3 norm) +{ + result.normal = norm; +} + +void init_metalness(inout UnpackedGbuffer result, half metal) +{ + result.metallness = metal; +} +void init_translucency(inout UnpackedGbuffer result, half translucency) +{ + result.translucency = translucency; +} + +void init_ao(inout UnpackedGbuffer result, half ao) +{ + result.ao = ao; +} +void init_shadow(inout UnpackedGbuffer result, half shadow) +{ + result.shadow = shadow; +} +void init_material(inout UnpackedGbuffer result, float material) +{ + result.material = material; +} +void init_emission(inout UnpackedGbuffer result, float emission_strength) +{ + result.emission_strength = emission_strength; +} +void init_emission_part(inout UnpackedGbuffer result, float emission_part) +{ + result.emission_part = emission_part; +} + +struct GBUFFER_OUTPUT +{ + half4 albedo_ao : SV_Target0; + float4 normal_smoothness_material : SV_Target1; + half4 metallTranslucency_shadow : SV_Target2; +}; + +GBUFFER_OUTPUT write_gbuffer(PackedGbuffer gbuf) +{ + GBUFFER_OUTPUT gbufOut; + gbufOut.albedo_ao = gbuf.albedo_ao; + gbufOut.normal_smoothness_material = gbuf.normal_smoothness_material; + gbufOut.metallTranslucency_shadow = half4(gbuf.metallTranslucency_shadow,0,0); + return gbufOut; +} + +GBUFFER_OUTPUT encode_gbuffer_raw(UnpackedGbuffer gbuffer) +{ + return write_gbuffer(pack_gbuffer(gbuffer)); +} + +#define encode_gbuffer(a,b) encode_gbuffer_raw(a) + +half3 perturb_normal(half3 localNorm, half3 N, float3 p, float2 uv) +{ + // get edge vectors of the pixel triangle + float3 dp1 = ddx(p); + float3 dp2 = ddy(p); + float2 duv1 = ddx(uv); + float2 duv2 = ddy(uv); + + // solve the linear system + float3 dp2perp = cross(N, dp2); + float3 dp1perp = cross(dp1, N); + float3 T = dp2perp * duv1.x + dp1perp * duv2.x; + float3 B = dp2perp * duv1.y + dp1perp * duv2.y; + + // construct a scale-invariant frame + float invmax = rsqrt(max(dot(T, T), dot(B, B))); + return half3(localNorm.z * N + (localNorm.x * invmax) * T + (localNorm.y * invmax) * B); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/gbuffer_read.hlsli b/project_templates/sample_scene/resources/shaders/include/gbuffer_read.hlsli new file mode 100644 index 00000000..920fa524 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/gbuffer_read.hlsli @@ -0,0 +1,24 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved +#include "gbuffer_base.hlsli" + +Texture2D albedo_gbuf: register(t0); +Texture2D normal_gbuf: register(t1); +Texture2D material_gbuf: register(t2); +Texture2D depth_gbuf: register(t3); + +SamplerState default_sampler : register(s0); + +PackedGbuffer readPackedGbuffer(float2 tc) +{ + PackedGbuffer gbuf; + gbuf.albedo_ao = albedo_gbuf.SampleLevel(default_sampler, tc, 0); + gbuf.normal_smoothness_material = normal_gbuf.SampleLevel(default_sampler, tc, 0); + gbuf.metallTranslucency_shadow = material_gbuf.SampleLevel(default_sampler, tc, 0).xy; + return gbuf; +} + +ProcessedGbuffer readProcessedGbuffer(float2 tc) +{ + return processGbuffer(unpackGbuffer(readPackedGbuffer(tc))); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/hardware_defines.hlsli b/project_templates/sample_scene/resources/shaders/include/hardware_defines.hlsli new file mode 100644 index 00000000..f70f776e --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/hardware_defines.hlsli @@ -0,0 +1,270 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef HARDWARE_DEFINES_HEADER +#define HARDWARE_DEFINES_HEADER 1 + + + +#if _HARDWARE_METAL +#define BGRA_SWIZZLE(a) a.zyxw +#define BGR_SWIZZLE(a) a.zyx +#endif +#ifndef BGRA_SWIZZLE +#define BGRA_SWIZZLE(a) a +#endif +#ifndef BGR_SWIZZLE +#define BGR_SWIZZLE(a) a +#endif + +#ifndef SHADER_COMPILER_HLSL2021 +#define SHADER_COMPILER_HLSL2021 1 +#endif + +#define GPU_TARGET 1 +#define PI 3.14159265f +#define PIh 3.14159265h + +#define EPSILON 0.000001 +#define UNIT_X float3(1.0, 0.0, 0.0) +#define UNIT_Y float3(0.0, 1.0, 0.0) +#define UNIT_Z float3(0.0, 0.0, 1.0) + +#define HAS_REVERSEBITS 1 +#define SEPARATE_SAMPLER_OBJECT 1 +#define double doubles_are_not_supported_by_some_gpus +#define double2 doubles_are_not_supported_by_some_gpus +#define double3 doubles_are_not_supported_by_some_gpus +#define double4 doubles_are_not_supported_by_some_gpus + +#define fixed half +#define fixed2 half2 +#define fixed3 half3 +#define fixed4 half4 + +float max3(float a, float b, float c) +{ + return max(a, max(b, c)); +} +float min3(float a, float b, float c) +{ + return min(a, min(b, c)); +} +#define INVARIANT(x) x + +float max3(float3 a) +{ + return max3(a.x, a.y, a.z); +} +float max4(float a, float b, float c, float d) +{ + return max(max(a, d), max(b, c)); +} +float min4(float a, float b, float c, float d) +{ + return min(min(a, d), min(b, c)); +} + +#define PRECISE precise +#define SQRT_SAT(x) sqrt(saturate(x)) +#define VS_OUT_POSITION(name) float4 name:SV_POSITION; +#define tex2Dgrad(a, uv, dx, dy) a.SampleGrad(a##_samplerstate, (uv).xy, dx, dy) +#define tex2Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xy, (uv).w) +#define tex3Dlod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, (uv).w) +#define texCUBElod(a, uv) a.SampleLevel(a##_samplerstate, (uv).xyz, uv.w) +#define texCUBEArraylod(a, uv, lod) a.SampleLevel(a##_samplerstate, (uv).xyzw, lod) +#define tex2Dproj(a, uv) a.Sample(a##_samplerstate, (uv).xy/(uv).w) +#define tex2D(a, uv) a.Sample(a##_samplerstate, uv) +#define tex3D(a, uv) a.Sample(a##_samplerstate, uv) +#define texCUBE(a, uv) a.Sample(a##_samplerstate, uv) +#define textureGather(a, tc) a.Gather(a##_samplerstate, tc) +#define texelFetchOffset(a, tc, lod, ofs) a.Load(int3(tc, lod), ofs) +#define textureOffset(a, tc, ofs) a.Sample(a##_samplerstate, tc, ofs) +#define textureLodOffset(a, tc, lod, ofs) a.SampleLevel(a##_samplerstate, tc, lod, ofs) + +#define CLAMP_BORDER(a, name, val) +#define LOOP [loop] +#define UNROLL [unroll] +#define BRANCH [branch] +#define FLATTEN [flatten] + +#define EMPTY_STRUCT(name) struct name {} +#define DECLARE_UNUSED_MEMBER +#define RETURN_EMPTY_STRUCT(name) +#define INIT_EMPTY_STRUCT(name) + +#define HW_USE_SCREEN_POS +#define GET_SCREEN_POS(vs_pos) vs_pos +#ifndef TEXELFETCH_DEFINED +#define TEXELFETCH_DEFINED 1 + +#define CHECK_TEXTURE2D +#define CHECK_TEXTURE2D_EXPR(a, tc) 0 +#define CHECK_TEXTURE2DARRAY +#define CHECK_TEXTURE3D +#define CHECK_BUFFER(file, ln, name) +#define CHECK_BUFFER_EXPR(a, tc) 0 +#define CHECK_STRUCTURED_BUFFER(file, ln, name) +#define CHECK_STRUCTURED_BUFFER_EXPR(a, tc) 0 +#define CHECK_STENCIL +float4 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float3 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float2 texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float texelFetchBase(Texture2D a, int2 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2D; + return a.Load(int3(tc, lod)); +} +float4 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture2DArray a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE2DARRAY; + return a.Load(int4(tc, lod)); +} +float4 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float3 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float2 texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +float texelFetchBase(Texture3D a, int3 tc, int lod, int file, int ln, int name) +{ CHECK_TEXTURE3D; + return a.Load(int4(tc, lod)); +} +#define texelFetch(a, tc, lod) texelFetchBase(a, tc, lod, _FILE_, __LINE__, -1) + +float4 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float3 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float2 loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +float loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(Buffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(StructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(RWStructuredBuffer a, int tc, int file, int ln, int name) +{ CHECK_STRUCTURED_BUFFER(file, ln, name); + return a[tc]; +} +uint loadBufferBase(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(ByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +uint loadBufferBase(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load(tc); +} +uint2 loadBuffer2Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load2(tc); +} +uint3 loadBuffer3Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load3(tc); +} +uint4 loadBuffer4Base(RWByteAddressBuffer a, int tc, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + return a.Load4(tc); +} +#define loadBuffer(a, tc) loadBufferBase(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer2(a, tc) loadBuffer2Base(a, tc, _FILE_, __LINE__, -1) +#define loadBuffer3(a, tc) loadBuffer3Base(a, tc, _FILE_, __LINE__, get_name_##a) +#define loadBuffer4(a, tc) loadBuffer4Base(a, tc, _FILE_, __LINE__, -1) +void storeBufferBase(RWByteAddressBuffer a, int tc, uint value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store(tc, value); +} +void storeBuffer2Base(RWByteAddressBuffer a, int tc, uint2 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store2(tc, value); +} +void storeBuffer3Base(RWByteAddressBuffer a, int tc, uint3 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store3(tc, value); +} +void storeBuffer4Base(RWByteAddressBuffer a, int tc, uint4 value, int file, int ln, int name) +{ CHECK_BUFFER(file, ln, name); + a.Store4(tc, value); +} +#define storeBuffer(a, tc, value) storeBufferBase(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer2(a, tc, value) storeBuffer2Base(a, tc, value, _FILE_, __LINE__, get_name_##a) +#define storeBuffer3(a, tc, value) storeBuffer3Base(a, tc, value, _FILE_, __LINE__, -1) +#define storeBuffer4(a, tc, value) storeBuffer4Base(a, tc, value, _FILE_, __LINE__, -1) +#define structuredBufferAt(a, tc) a[uint((CHECK_STRUCTURED_BUFFER_EXPR(a, tc), tc))] +#define bufferAt(a, tc) a[uint((CHECK_BUFFER_EXPR(a, tc), tc))] +#define texture2DAt(a, tc) a[int2((CHECK_TEXTURE2D_EXPR(a, tc), tc))] +#endif + +uint stencilFetchBase(Texture2D a, int2 tc, int file, int ln, int name) +{ + CHECK_STENCIL; + return a[tc].g; +} +#define stencilFetch(a, tc) stencilFetchBase(a, tc, _FILE_, __LINE__, get_name_##a) + +#if !SHADER_COMPILER_HLSL2021 +#define select(a, b, c) a ? b : c +#define or(a, b) a || b +#endif + +half3 h3nanofilter(half3 val) +{ +#if HALF_PRECISION + return min(val, 65504.h); +#else + return select(isfinite(dot(val, val)).xxx, val, half3(0, 0, 0)); +#endif +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/in_out.hlsli b/project_templates/sample_scene/resources/shaders/include/in_out.hlsli new file mode 100644 index 00000000..e2bac6f2 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/in_out.hlsli @@ -0,0 +1,85 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +struct VsInput +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; +}; + +struct VsVFXOutput +{ + float4 position : SV_Position; + float4 color : COLOR; + float2 texCoord : TEXCOORD; + int frameID : TEXCOORD1; + int columns : TEXCOORD2; + int rows : TEXCOORD3; +}; + +struct VsInputLit +{ + float3 position : POSITION; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 tangent : TANGENT; +}; + +struct VsOutputLit +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; +}; + +struct VsOutputLitForward +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float2 texCoord : TEXCOORD; + float3 tangent : TANGENT; + float3 worldPos : TEXCOORD1; + float4 color : COLOR; +}; + +struct VsInputZPrepass +{ + float3 position : POSITION; +}; + +struct VsInputZPrepassSkinned +{ + float3 position : POSITION; + float4 boneWeights : BLENDWEIGHT; + uint4 boneIndices : BLENDINDICES; +}; + +struct VsOutputGBuff +{ + float4 position : SV_Position; + float3 norm : NORMAL; + float3 tangent : TANGENT; + float2 texCoord : TEXCOORD; + float3 p2e : TEXCOORD1; +}; + +struct VsOutputZPrepass +{ + float4 position : SV_Position; + nointerpolation uint4 uid : TEXCOORD0; +}; + +struct VsOutputResolve +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; +}; diff --git a/project_templates/sample_scene/resources/shaders/include/pbr.hlsli b/project_templates/sample_scene/resources/shaders/include/pbr.hlsli new file mode 100644 index 00000000..c8c1db1f --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/pbr.hlsli @@ -0,0 +1,235 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#ifndef __BRDF_COMMON__ +#define __BRDF_COMMON__ + +#include +#include +#include + +// Diffuse model +#define DIFFUSE_LAMBERT 0 +#define DIFFUSE_OREN_NAYAR 1 +#define DIFFUSE_BURLEY 2 +#define DIFFUSE_BURLEY_FIXED 3 +#define DIFFUSE_CHAN 4 + +#ifndef BRDF_DIFFUSE +#define BRDF_DIFFUSE DIFFUSE_BURLEY_FIXED//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_OREN_NAYAR//DIFFUSE_BURLEY//DIFFUSE_LAMBERT// +#endif + +// Microfacet distribution function + +#define SPEC_D_BLINN 0 +#define SPEC_D_BECKMANN 1 +#define SPEC_D_GGX 2 + +#ifndef BRDF_SPEC_D +#define BRDF_SPEC_D SPEC_D_GGX +#endif + +// Geometric attenuation or shadowing +#define SPEC_G_IMPLICIT 0 +#define SPEC_G_NEUMANN 1 +#define SPEC_G_KELEMEN 2 +#define SPEC_G_SHLICK 3 +#define SPEC_G_SMITH_GGX 4 +#define SPEC_G_SMITH_CORRELATED 5 +#define SPEC_G_SMITH_CORRELATED_APPROX 6 + +#ifndef BRDF_SPEC_G +#define BRDF_SPEC_G SPEC_G_SMITH_CORRELATED +#endif + +// Fresnel +#define SPEC_F_NONE 0 +#define SPEC_F_SHLICK 1 +#define SPEC_F_FRESNEL 2 +#ifndef BRDF_SPEC_F +#define BRDF_SPEC_F SPEC_F_SHLICK +#endif + +// Sheen +#ifndef SHEEN_SPECULAR +#define SHEEN_SPECULAR 0 +#endif + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + //#error call different BRDF_diffuse, with NoH + return 0; +#endif +} + +float3 BRDF_diffuse(float3 diffuseColor, float linearRoughness, float NoV, float NoL, float VoH, float NoH) +{ +#if BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert( diffuseColor ); +#elif BRDF_DIFFUSE == DIFFUSE_OREN_NAYAR + return diffuseOrenNayar( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY + return diffuseBurley( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_BURLEY_FIXED + return diffuseBurleyFixed( diffuseColor, linearRoughness, NoV, NoL, VoH ); +#elif BRDF_DIFFUSE == DIFFUSE_CHAN + return diffuseChan( diffuseColor, linearRoughness*linearRoughness, NoV, NoL, VoH, NoH); +#endif +} + +float BRDF_distribution(float ggx_alpha, float NoH) +{ +#if BRDF_SPEC_D == SPEC_D_BLINN + return distributionBlinn( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_BECKMANN + return distributionBeckmann( ggx_alpha, NoH ); +#elif BRDF_SPEC_D == SPEC_D_GGX + return distributionGGX( ggx_alpha, NoH ); +#endif +} + +// Vis = G / (4*NoL*NoV) +float BRDF_geometricVisibility(float ggx_alpha, float NoV, float NoL, float VoH) +{ +#if BRDF_SPEC_G == SPEC_G_IMPLICIT + return geometryImplicit(); +#elif BRDF_SPEC_G == SPEC_G_NEUMANN + return geometryNeumann( NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_KELEMEN + return geometryKelemen( VoH ); +#elif BRDF_SPEC_G == SPEC_G_SHLICK + return geometrySchlick( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_GGX + return geometrySmith( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED + return geometrySmithCorrelated( ggx_alpha, NoV, NoL ); +#elif BRDF_SPEC_G == SPEC_G_SMITH_CORRELATED_APPROX + return geometrySmithCorrelatedApprox( ggx_alpha, NoV, NoL ); +#endif +} + +float3 BRDF_fresnel(float3 specularColor, float VoH) +{ +#if BRDF_SPEC_F == 0 + return fresnelNone( specularColor ); +#elif BRDF_SPEC_F == 1 + return fresnelSchlick( specularColor, VoH ); +#elif BRDF_SPEC_F == 2 + return fresnelFresnel( specularColor, VoH ); +#endif +} + +float3 BRDF_specular(float ggx_alpha, float NoV, float NoL, float VoH, float NoH, half sheenStrength, half3 sheenColor) +{ + float D = BRDF_distribution(ggx_alpha, NoH); + float G = BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH); + float3 result = D * G; + + return result; +} + +//from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr_v2.pdf (original version had bug in code!) +float computeSpecOcclusion(float saturated_NdotV, float AO, float ggx_alpha) +{ + return saturate(pow(saturated_NdotV + AO, exp2(-16.0 * ggx_alpha - 1.0)) - 1 + AO); +} +//ggx_alpha = linearRoughness*linearRoughness + +// ggx_alpha = linearRoughness*linearRoughness +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ +#if SPECULAR_DISABLED && BRDF_DIFFUSE == DIFFUSE_LAMBERT + return diffuseLambert(baseDiffuseColor); +#else + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(normal, H)); + float VoH = saturate(dot(view, H)); + half3 diffuse = BRDF_diffuse(baseDiffuseColor, linearRoughness, NoV, NoL, VoH); +#if !SPECULAR_DISABLED + float3 specular = BRDF_specular(ggx_alpha, NoV, NoL, VoH, NoH, translucency, sheenColor) * specularStrength; + float3 F = BRDF_fresnel(specularColor, VoH); + return (diffuse + F * specular); +#else + return diffuse; +#endif +#endif +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal, float3 sheenColor, float translucency) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, sheenColor, translucency) * NoL; +} + +half3 standardBRDF_NO_NOL(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0); +} + +half3 standardBRDF(float NoV, float NoL, half3 baseDiffuseColor, half ggx_alpha, half linearRoughness, half3 specularColor, half specularStrength, float3 lightDir, float3 view, half3 normal) +{ + return standardBRDF_NO_NOL(NoV, NoL, baseDiffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, normal, float3(0, 0, 0), 0) * NoL; +} + +// //////////// TODO: NAU-1797 Unify code above with other parts (for example see distributionGGX in specular_brdf.hlsli) +uint ReverseBits32(uint bits) +{ + bits = (bits << 16) | (bits >> 16); + bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1); + bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2); + bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4); + bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); + return bits; +} + +float2 Hammersley(uint i, uint N) +{ + const float E1 = frac(float(i) / N); + const float E2 = ReverseBits32(i) * 2.3283064365386963e-10; + return float2(E1, E2); +} + +float3 ImportanceSampleGGX(float2 E, float a2) +{ + const float phi = 2.0 * PI * E.x; + const float cosTheta = sqrt((1.0 - E.y) / (1.0 + (a2 - 1.0) * E.y)); + const float sinTheta = sqrt(1.0 - cosTheta * cosTheta); + + float3 H; + H.x = sinTheta * cos(phi); + H.y = sinTheta * sin(phi); + H.z = cosTheta; + + return H; +} + +float D_GGX(float a2, float NoH) +{ + const float d = (NoH * a2 - NoH) * NoH + 1.0; + return a2 / (PI * d * d); +} + +float ImportancePdfGGX(float cosTheta, float a2) +{ + return cosTheta * D_GGX(a2, cosTheta); +} + +float SpecularPdf(float NoH, float a2, float VoH) +{ + return ImportancePdfGGX(NoH, a2) / max(4.0 * VoH, 0.000001); +} + +float Luminance(float3 color) +{ + return dot(color, float3(0.2126, 0.7152, 0.0722)); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/shader_global.hlsli b/project_templates/sample_scene/resources/shaders/include/shader_global.hlsli new file mode 100644 index 00000000..cb8f76b1 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/shader_global.hlsli @@ -0,0 +1,67 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#ifndef SHADER_GLOBAL_HLSL +#define SHADER_GLOBAL_HLSL 1 + +#include "hardware_defines.hlsli" + +float pow2(float a) {return a*a;} +float pow4(float a) {return pow2(a*a);} +float pow8(float a) {return pow4(a*a);} +float2 pow2_vec2(float2 a) {return a*a;} +float3 pow2_vec3(float3 a) {return a*a;} +float4 pow2_vec4(float4 a) {return a*a;} + +float2 pow2(float2 a) {return a*a;} +float3 pow2(float3 a) {return a*a;} +float4 pow2(float4 a) {return a*a;} +float4 pow4(float4 a) {return pow2(a*a);} +float4 pow8(float4 a) {return pow4(a*a);} +float4 pow16(float4 a) {return pow8(a*a);} +float pow5(float a) {float v = a*a; v*=v; return v*a;} + +half pow2h(half a) {return a*a;} +half pow4h(half a) {return pow2h(a*a);} +half pow5h(half a){half a4=a*a; a4*=a4; return a4*a;} + +float clampedPow(float X,float Y) { return pow(max(abs(X),0.000001f),Y); } + +float3 TangentToWorld(float3 v, float3x3 TBN) +{ + return mul(TBN, v); +} + +float3x3 GetTBN(float3 N) +{ + float3x3 TBN; + + float3 T = cross(N, UNIT_Y); + T = lerp(cross(N, UNIT_X), T, step(EPSILON, dot(T, T))); + T = normalize(T); + + const float3 B = normalize(cross(N, T)); + + return float3x3( // TODO: NAU-1797 think about this transpose, refactor + float3(T.x, B.x, N.x), + float3(T.y, B.y, N.y), + float3(T.z, B.z, N.z)); +} + +float3x3 GetTBN(float3 N, float3 T) +{ + T = normalize(T - dot(T, N) * N); + const float3 B = cross(N, T); + + return float3x3( // TODO: NAU-1797 think about this transpose, refactor + float3(T.x, B.x, N.x), + float3(T.y, B.y, N.y), + float3(T.z, B.z, N.z)); +} + +float linearize_z(float rawDepth, float2 decode_depth) +{ + return rcp(decode_depth.x + decode_depth.y * rawDepth); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/include/specular_brdf.hlsli b/project_templates/sample_scene/resources/shaders/include/specular_brdf.hlsli new file mode 100644 index 00000000..a6be87e7 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/include/specular_brdf.hlsli @@ -0,0 +1,163 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved +#ifndef SPECULAR_BRDF_HLSL +#define SPECULAR_BRDF_HLSL 1 + +#include + +// Microfacet specular = D*G*F / (4*NoL*NoV) = D*Vis*F +// Vis = G / (4*NoL*NoV) + +#ifndef INV_MIN_IOR +#define INV_MIN_IOR 50.0h +#endif + +// [Blinn 1977, "Models of light reflection for computer synthesized pictures"] +float distributionBlinn( float ggx_alpha, float NoH ) +{ + float m2 = ggx_alpha * ggx_alpha; + float n2 = 1 / m2 - 1; + return (n2+1) * clampedPow( NoH, n2*2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float distributionBeckmann( float ggx_alpha, float NoH ) +{ + float m2 = ggx_alpha * ggx_alpha; + float NoH2 = NoH * NoH; + return exp( (NoH2 - 1) / (m2 * NoH2) ) / (m2 * NoH2 * NoH2 );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// GGX / Trowbridge-Reitz +float distributionGGX( float ggx_alpha, float NoH ) +{ + float alpha2 = ggx_alpha * ggx_alpha; + float d = ( NoH * alpha2 - NoH ) * NoH + 1; // 2 mad + return alpha2 / max(1e-8, d*d );//division by PI omitted intentionally, lightColor is divided by Pi +} + +// Anisotropic GGX, Disney +float distributionGGXaniso( float ggx_alphaX, float ggx_alphaY, float NoH, float3 H, float3 X, float3 Y ) +{ + float XoH = dot( X, H ); + float YoH = dot( Y, H ); + float d = XoH*XoH / pow2(ggx_alphaX) + YoH*YoH / pow2(ggx_alphaY) + NoH*NoH; + return 1 / max(1e-8, ggx_alphaX*ggx_alphaY * d*d );//division by PI omitted intentionally, lightColor is divided by Pi +} + +//Ashikhmin +//https://knarkowicz.wordpress.com/2018/01/04/cloth-shading/ +float distributionCloth(float ggx_alpha, float NoH) +{ + float r2 = ggx_alpha * ggx_alpha; + float cos2h = NoH * NoH; + float sin2h = 1. - cos2h; + float sin4h = sin2h * sin2h; + return (sin4h + 4. * exp(-cos2h / (sin2h * r2))) / ((1. + 4. * r2) * sin4h);// division by Pi is ommited +} + +float geometryImplicit() +{ + return 0.25; +} + +float geometryNeumann( float NoV, float NoL ) +{ + return rcp( 4 * max( NoL, NoV ) +1e-5); +} + +float geometryCookTorrance(float NoH, float NoL, float NoV, float VoH, float ggx_alpha) +{ + float NdotL_clamped= max(NoL, 0.0); + float NdotV_clamped= max(NoV, 0.0); + float NoH_dov_VdotH = 2*NoH / VoH; + return min( min( NoH_dov_VdotH * NdotV_clamped, NoH_dov_VdotH * NdotL_clamped), 1.0); +} + +// [Kelemen 2001, "A microfacet based coupled specular-matte brdf model with importance sampling"] +float geometryKelemen( float VoH ) +{ + return rcp( 4 * VoH * VoH ); +} + +float geometrySchlick( float ggx_alpha, float NoV, float NoL ) +{ + float k = pow2( ggx_alpha ) * 0.5; + float geometrySchlickV = NoV * (1 - k) + k; + float geometrySchlickL = NoL * (1 - k) + k; + return 0.25 / ( geometrySchlickV * geometrySchlickL ); +} + +// Smith term for GGX +float geometrySmith( float ggx_alpha, float NoV, float NoL ) +{ + float a2 = pow2( ggx_alpha ); + + float geometrySmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 ); + float geometrySmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 ); + return rcp( geometrySmithV * geometrySmithL ); +} + +// Appoximation of correlated Smith term for GGX/Heitz +float geometrySmithCorrelated( float ggx_alpha, float NoV, float NoL ) +{ + float a2 = pow2( ggx_alpha ); + float geometrySmithV = NoL * sqrt (NoV*(NoV - NoV * a2) + a2 ); + float geometrySmithL = NoV * sqrt (NoL*(NoL - NoL * a2) + a2 ); + //float a = ggx_alpha; + //float geometrySmithV = NoL * ( NoV * ( 1 - a ) + a ); + //float geometrySmithL = NoV * ( NoL * ( 1 - a ) + a ); + return (0.5 * rcp( geometrySmithV + geometrySmithL )); +} + +// Appoximation of joint Smith term for GGX +// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"] +float geometrySmithCorrelatedApprox( float ggx_alpha, float NoV, float NoL ) +{ + float geometrySmithV = NoL * ( NoV * ( 1 - ggx_alpha ) + ggx_alpha ); + float geometrySmithL = NoV * ( NoL * ( 1 - ggx_alpha ) + ggx_alpha ); + return 0.5 * rcp( geometrySmithV + geometrySmithL ); +} + +//Ashikhmin +//https://knarkowicz.wordpress.com/2018/01/04/cloth-shading/ +float geometryCloth(float NoV, float NoL) +{ + return 1. / (4. * (NoL+ NoV - NoL * NoV)); +} + +float3 fresnelNone( float3 specularColor ) +{ + return specularColor; +} + +float3 fresnelSchlick( float3 specularColor, float VoH ) +{ + float Fc = pow5( 1 - VoH ); + + // Anything less than 2% is physically impossible and is instead considered to be shadowing + return saturate( INV_MIN_IOR * specularColor.g ) * Fc + (1 - Fc) * specularColor; + +} + +float3 F_SchlickRoughness(float3 F0, float VoH, float roughness) +{ + const float Fc = pow5(1 - VoH); + float invRough = 1.0 - roughness; + return F0 + (max(float3(invRough, invRough, invRough), F0) - F0) * Fc; +} + +float3 fresnelFresnel( float3 specularColor, float VoH ) +{ + float3 SpecularColorSqrt = sqrt( clamp( float3(0, 0, 0), float3(0.99, 0.99, 0.99), specularColor ) ); + float3 n = ( 1 + SpecularColorSqrt ) / ( 1 - SpecularColorSqrt ); + float3 g = sqrt( n*n + VoH*VoH - 1 ); + return 0.5 * pow2_vec3( (g - VoH) / (g + VoH) ) * ( 1 + pow2_vec3( ((g+VoH)*VoH - 1) / ((g-VoH)*VoH + 1) ) ); +} + +float3 getRoughReflectionVec(float3 R, float3 normal, float ggx_alpha)//alpha = pow2(linear_roughness) +{ + return lerp( normal, R, (1 - ggx_alpha) * ( sqrt(1 - ggx_alpha) + ggx_alpha ) ); +} + +#endif diff --git a/project_templates/sample_scene/resources/shaders/meta/billboards.blk b/project_templates/sample_scene/resources/shaders/meta/billboards.blk new file mode 100644 index 00000000..4fa76d12 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/billboards.blk @@ -0,0 +1,21 @@ +compile_configs { + config { + stage:t="vs" + entry:t="billboardsVS" + } + config { + stage:t="ps" + entry:t="billboardsPS" + } +} + +input_layout { + +} + +permutations { + permutation { + name:t="default" + defines {} + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/cs_gen_irradiance_map.blk b/project_templates/sample_scene/resources/shaders/meta/cs_gen_irradiance_map.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/cs_gen_irradiance_map.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/cs_gen_reflection_map.blk b/project_templates/sample_scene/resources/shaders/meta/cs_gen_reflection_map.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/cs_gen_reflection_map.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/cs_panorama_to_cubemap.blk b/project_templates/sample_scene/resources/shaders/meta/cs_panorama_to_cubemap.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/cs_panorama_to_cubemap.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/cs_pixel_data_extraction.blk b/project_templates/sample_scene/resources/shaders/meta/cs_pixel_data_extraction.blk new file mode 100644 index 00000000..20e882a5 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/cs_pixel_data_extraction.blk @@ -0,0 +1,17 @@ +compile_configs { + config { + stage:t="cs" + entry:t="CSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/debug_lights_shader.blk b/project_templates/sample_scene/resources/shaders/meta/debug_lights_shader.blk new file mode 100644 index 00000000..97847331 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/debug_lights_shader.blk @@ -0,0 +1,26 @@ +compile_configs { + config { + stage:t="vs" + entry:t="debug_point_lights_vs" + } + config { + stage:t="ps" + entry:t="debug_point_lights_ps" + } + config { + stage:t="vs" + entry:t="debug_spot_lights_vs" + } + config { + stage:t="ps" + entry:t="debug_spot_lights_ps" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/debug_renderer_line_shader.blk b/project_templates/sample_scene/resources/shaders/meta/debug_renderer_line_shader.blk new file mode 100644 index 00000000..a661f593 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/debug_renderer_line_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/debug_renderer_mesh_shader.blk b/project_templates/sample_scene/resources/shaders/meta/debug_renderer_mesh_shader.blk new file mode 100644 index 00000000..a661f593 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/debug_renderer_mesh_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/deferred_resolve.blk b/project_templates/sample_scene/resources/shaders/meta/deferred_resolve.blk new file mode 100644 index 00000000..974c1731 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/deferred_resolve.blk @@ -0,0 +1,21 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/grid.blk b/project_templates/sample_scene/resources/shaders/meta/grid.blk new file mode 100644 index 00000000..7b1ed944 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/grid.blk @@ -0,0 +1,21 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { + +} + +permutations { + permutation { + name:t="default" + defines {} + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/imgui.blk b/project_templates/sample_scene/resources/shaders/meta/imgui.blk new file mode 100644 index 00000000..ee3d91ae --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/imgui.blk @@ -0,0 +1,44 @@ +compile_configs { + config { + stage:t="vs" + entry:t="imgui_vs" + } + config { + stage:t="ps" + entry:t="imgui_ps" + } +} + +input_layout { + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="POSITION" + type:t="VSDT_FLOAT2" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="TEXCOORD" + type:t="VSDT_FLOAT2" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="COLOR" + type:t="VSDT_E3DCOLOR" + } + } +} + +permutations { + permutation { + name:t="regular" + defines {} + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/multi_tex.blk b/project_templates/sample_scene/resources/shaders/meta/multi_tex.blk new file mode 100644 index 00000000..75b56cb0 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/multi_tex.blk @@ -0,0 +1,24 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="gbuffer" + defines { + define:t="GBUFFER_VARIANT=1" + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/outline_calculation.blk b/project_templates/sample_scene/resources/shaders/meta/outline_calculation.blk new file mode 100644 index 00000000..be8c45e1 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/outline_calculation.blk @@ -0,0 +1,28 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMainJumpFloodInit" + } + config { + stage:t="ps" + entry:t="PSMainJumpFloodStep" + } + config { + stage:t="ps" + entry:t="PSMainJumpFloodResult" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines {} + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/point_lights_shader.blk b/project_templates/sample_scene/resources/shaders/meta/point_lights_shader.blk new file mode 100644 index 00000000..3b4f5503 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/point_lights_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="deferred_lights_vs" + } + config { + stage:t="ps" + entry:t="deferred_lights_ps" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/postFX_shader.blk b/project_templates/sample_scene/resources/shaders/meta/postFX_shader.blk new file mode 100644 index 00000000..0783ba26 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/postFX_shader.blk @@ -0,0 +1,38 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines {} + } + permutation { + name:t="Uncharted" + defines { + define:t="USE_UNCHARTED_TONEMAP=1" + } + } + permutation { + name:t="Filmic" + defines { + define:t="USE_FILMIC_TONEMAP=1" + } + } + permutation { + name:t="Reinhard" + defines { + define:t="USE_UNCHARTED_TONEMAP=1" + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/postFX_skybox.blk b/project_templates/sample_scene/resources/shaders/meta/postFX_skybox.blk new file mode 100644 index 00000000..191dd10e --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/postFX_skybox.blk @@ -0,0 +1,20 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { +} + +permutations { + permutation { + name:t="regular" + defines {} + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/spot_lights_shader.blk b/project_templates/sample_scene/resources/shaders/meta/spot_lights_shader.blk new file mode 100644 index 00000000..3b4f5503 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/spot_lights_shader.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="deferred_lights_vs" + } + config { + stage:t="ps" + entry:t="deferred_lights_ps" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/standard.blk b/project_templates/sample_scene/resources/shaders/meta/standard.blk new file mode 100644 index 00000000..b53580f9 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/standard.blk @@ -0,0 +1,30 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="instanced" + defines { + define_inst:t="INSTANCED=1" + } + } + permutation { + name:t="emissive" + defines { + define_emissive:t="EMISSIVE=1" + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/standard_skinned.blk b/project_templates/sample_scene/resources/shaders/meta/standard_skinned.blk new file mode 100644 index 00000000..a661f593 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/standard_skinned.blk @@ -0,0 +1,18 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/standard_translucent.blk b/project_templates/sample_scene/resources/shaders/meta/standard_translucent.blk new file mode 100644 index 00000000..bb006d5b --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/standard_translucent.blk @@ -0,0 +1,24 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="instanced" + defines { + define_inst:t="INSTANCED=1" + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/textured.blk b/project_templates/sample_scene/resources/shaders/meta/textured.blk new file mode 100644 index 00000000..9369676f --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/textured.blk @@ -0,0 +1,55 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } + config { + stage:t="ps" + entry:t="PSMainColored" + } +} + +input_layout { + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="POSITION" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=1 + vsd_reg { + semantic_name:t="NORMAL" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=2 + vsd_reg { + semantic_name:t="TEXCOORD" + type:t="VSDT_FLOAT2" + } + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } + permutation { + name:t="gbuffer" + defines { + define:t="GBUFFER_VARIANT=1" + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/texturedInstanced.blk b/project_templates/sample_scene/resources/shaders/meta/texturedInstanced.blk new file mode 100644 index 00000000..47652255 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/texturedInstanced.blk @@ -0,0 +1,38 @@ +compile_configs { + config { + stage:t="vs" + entry:t="zprepassInstancedVSMain" + } + config { + stage:t="vs" + entry:t="zprepassSkinnedVSMain" + } + config { + stage:t="vs" + entry:t="outlineMaskSkinnedVSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } + config { + stage:t="ps" + entry:t="zprepassPSMain" + } + config { + stage:t="vs" + entry:t="outlineMaskVSMain" + } + config { + stage:t="ps" + entry:t="outlineMaskPSMain" + } +} + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/meta/vfx.blk b/project_templates/sample_scene/resources/shaders/meta/vfx.blk new file mode 100644 index 00000000..e03da71b --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/meta/vfx.blk @@ -0,0 +1,45 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } + config { + stage:t="ps" + entry:t="PSMain" + } +} + +input_layout { + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=0 + vsd_reg { + semantic_name:t="POSITION" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=1 + vsd_reg { + semantic_name:t="NORMAL" + type:t="VSDT_FLOAT3" + } + } + vertex_shader_declaration { + stream:t="VSD_STREAM_PER_VERTEX_DATA" + number:i=2 + vsd_reg { + semantic_name:t="TEXCOORD" + type:t="VSDT_FLOAT2" + } + } +} + +permutations { + permutation { + name:t="Regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/shaders/src/billboards.hlsl b/project_templates/sample_scene/resources/shaders/src/billboards.hlsl new file mode 100644 index 00000000..732fc7df --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/billboards.hlsl @@ -0,0 +1,60 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(GlobalBuffer) : register(b0) +{ + float4x4 vp; +}; + +SYSTEM_CBUFFER(BillboardBuffer) : register(b1) +{ + float3 worldPosition; + float scPercentSize; + uint4 uid; + float4 aspectRatio; +}; + +struct VsOutput +{ + float4 position : SV_POSITION; + float2 texCoord : TEXCOORD0; + nointerpolation uint4 uid : TEXCOORD1; +}; + +VsOutput billboardsVS(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + output.texCoord = float2(id & 1, (id & 2) >> 1); + output.position = mul(vp, float4(worldPosition, 1.0f)); + output.position = output.position / output.position.w; // to ndc we go + + float2 offset = output.texCoord * float2(2*scPercentSize, -2*scPercentSize) + float2(-scPercentSize, scPercentSize); + offset.y *= aspectRatio.x; + output.position.xy += offset; + + output.uid = uid; + + return output; +} + + +struct PsOutput +{ + float4 color : SV_Target0; + uint4 uid : SV_Target1; +}; + +PsOutput billboardsPS(VsOutput input) +{ + PsOutput output; + output.color = tex.Sample(sampl, input.texCoord); + output.uid = input.uid; + clip(output.color.a - 0.01f); + return output; +} diff --git a/project_templates/sample_scene/resources/shaders/src/cs_gen_irradiance_map.hlsl b/project_templates/sample_scene/resources/shaders/src/cs_gen_irradiance_map.hlsl new file mode 100644 index 00000000..16c0fa10 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/cs_gen_irradiance_map.hlsl @@ -0,0 +1,59 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "cs_common.hlsli" + +#define SAMPLE_DELTA 0.05 + +TextureCube environmentCubemap : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D irradiance_map_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; +}; + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const float2 uv = GetUV(dispatchThreadID.xy, uint2(faceSize, faceSize)); + + const float3 N = GetCubeDirection(faceIndex, uv); + + const float3x3 TBN = GetTBN(N); + + uint sampleCount = 0; + float3 irradiance = float3(0.0, 0.0, 0.0); + + for (float phi = 0.0; phi < 2.0 * PI; phi += SAMPLE_DELTA) + { + for (float theta = 0.0; theta < 0.5 * PI; theta += SAMPLE_DELTA) + { + const float3 tangentDirection = float3( + sin(theta) * cos(phi), + sin(theta) * sin(phi), + cos(theta)); + + const float3 worldDirection = TangentToWorld(tangentDirection, TBN); + + irradiance += environmentCubemap.SampleLevel(texSampler, worldDirection, 5).rgb + * cos(theta) * sin(theta); + + ++sampleCount; + } + } + + irradiance = PI * irradiance / float(sampleCount); + + irradiance_map_face[dispatchThreadID.xy] = float4(irradiance, 1.0f); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/cs_gen_reflection_map.hlsl b/project_templates/sample_scene/resources/shaders/src/cs_gen_reflection_map.hlsl new file mode 100644 index 00000000..37699ddb --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/cs_gen_reflection_map.hlsl @@ -0,0 +1,78 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "cs_common.hlsli" +#include "pbr.hlsli" + +#define SAMPLE_COUNT 2048 +#define MAX_LUMINANCE 25.0 + +TextureCube environmentCubemap : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D reflection_map_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; + float roughness; +}; + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const uint2 imageSize = uint2(faceSize, faceSize); + const float2 uv = GetUV(dispatchThreadID.xy, imageSize); + + const float3 N = GetCubeDirection(faceIndex, uv); + const float3 V = N; + + const float3x3 TBN = GetTBN(N); + + const float a = roughness * roughness; + const float a2 = max(a * a, EPSILON); + + float3 result = float3(0.0, 0.0, 0.0); + float totalWeight = 0.0; + + for (uint i = 0; i < SAMPLE_COUNT; ++i) + { + const float2 Xi = Hammersley(i, SAMPLE_COUNT); + + const float3 H = TangentToWorld(ImportanceSampleGGX(Xi, a2), TBN); + + const float3 L = -reflect(V, H); + + const float NoL = CosThetaWorld(N, L); + const float NoH = CosThetaWorld(N, H); + const float VoH = max(dot(V, H), 0.0); + + if (NoL > 0.0) + { + const float pdf = SpecularPdf(NoH, a2, VoH); + + const float saTexel = 4.0 * PI / (6.0 * imageSize.x * imageSize.y); + const float saSample = 1.0 / (float(SAMPLE_COUNT) * pdf + EPSILON); + + const float lod = roughness == 0.0 ? 0.0 : 0.5 * log2(saSample / saTexel); + + float3 irradiance = environmentCubemap.SampleLevel(texSampler, L, lod).rgb; + irradiance /= max(Luminance(irradiance) / MAX_LUMINANCE, 1.0); + + result += irradiance * NoL; + totalWeight += NoL; + } + } + + result /= totalWeight; + + reflection_map_face[dispatchThreadID.xy] = float4(result, 1.0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/cs_panorama_to_cubemap.hlsl b/project_templates/sample_scene/resources/shaders/src/cs_panorama_to_cubemap.hlsl new file mode 100644 index 00000000..bdb62b81 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/cs_panorama_to_cubemap.hlsl @@ -0,0 +1,42 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "cs_common.hlsli" + +Texture2D panorama_texture : register(t0); +SamplerState texSampler : register(s0); + +RWTexture2D cubemap_texture_face : register(u0); + +GLOBAL_CBUFFER(ConstBuffer) : register(b0) +{ + uint faceIndex; + uint faceSize; +}; + +float2 ComputePanoramaTexCoord(float3 direction) +{ + const float2 inverseAtan = float2(0.1591, 0.3183); + + return float2(atan2(direction.z, direction.x), asin(-direction.y)) * inverseAtan + 0.5; +} + +[numthreads(CS_ENV_CUBEMAPS_BLOCK_SIZE, CS_ENV_CUBEMAPS_BLOCK_SIZE, 1)] +void CSMain( + uint3 groupID : SV_GroupID, + uint3 groupThreadID : SV_GroupThreadID, + uint3 dispatchThreadID : SV_DispatchThreadID, + uint groupIndex : SV_GroupIndex +) +{ + const float2 uv = GetUV(dispatchThreadID.xy, uint2(faceSize, faceSize)); + + const float3 direction = GetCubeDirection(faceIndex, uv); + + const float2 panoramaTexCoord = ComputePanoramaTexCoord(direction); + + float4 panoramaSample = panorama_texture.SampleLevel(texSampler, panoramaTexCoord, 0); + + cubemap_texture_face[dispatchThreadID.xy] = panoramaSample; +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/cs_pixel_data_extraction.hlsl b/project_templates/sample_scene/resources/shaders/src/cs_pixel_data_extraction.hlsl new file mode 100644 index 00000000..d1192f9e --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/cs_pixel_data_extraction.hlsl @@ -0,0 +1,26 @@ +#include "shader_defines.h" +#include "common_types.hlsli" + +RWStructuredBuffer ResultBuffer : register(u0); + +Texture2D UIDTexture : register(t0); +Texture2D DepthTexture : register(t1); + +GLOBAL_CBUFFER(CoordBuffer) : register(b0) +{ + int2 viewportCoords; +}; + +[numthreads(1, 1, 1)] +void CSMain(uint3 DTid : SV_DispatchThreadID) +{ + uint4 guid = UIDTexture.Load(int3(viewportCoords, 0)); + float depth = DepthTexture.Load(int3(viewportCoords, 0)); + + PixelData result; + + result.uid = guid; + result.depth = depth; + + ResultBuffer[0] = result; +} diff --git a/project_templates/sample_scene/resources/shaders/src/debug_lights_shader.hlsl b/project_templates/sample_scene/resources/shaders/src/debug_lights_shader.hlsl new file mode 100644 index 00000000..01e52caf --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/debug_lights_shader.hlsl @@ -0,0 +1,77 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "shader_global.hlsli" +#include "clustered/point_light.hlsli" + +struct VsInput +{ + float3 pos : POSITION; +}; + +struct VsOutput +{ + VS_OUT_POSITION(pos) +}; + +SYSTEM_CBUFFER(OmniLights) : + register(b1) +{ + uint4 omni_lights_count; + RenderOmniLight omni_lights_cb[MAX_OMNI_LIGHTS]; +}; + +VsOutput debug_point_lights_vs(VsInput input, uint omni_light_index : SV_InstanceID) +{ + VsOutput output; + RenderOmniLight ol = omni_lights_cb[omni_light_index]; + float4 pos_and_radius = ol.posRadius; + float3 worldPos = pos_and_radius.xyz + input.pos.xyz * pos_and_radius.w * 1.15; + output.pos = mul(mvp, float4(worldPos, 1)); + return output; +} + +float4 debug_point_lights_ps(VsOutput input) : + SV_Target +{ + return float4(1, 0, 0, 0); +} + +SYSTEM_CBUFFER(SpotLights) : register(b1) +{ + uint4 spot_lights_count; + RenderSpotLight spot_lights_cb[MAX_SPOT_LIGHTS]; +} + +VsOutput debug_spot_lights_vs(VsInput input, uint spot_light_index : SV_InstanceID) +{ + VsOutput output; + RenderSpotLight sl = spot_lights_cb[spot_light_index]; + float4 pos_and_radius = sl.lightPosRadius; + float4 color_and_attenuation = sl.lightColorAngleScale; + color_and_attenuation.w = abs(color_and_attenuation.w); + float4 dir_angle = sl.lightDirectionAngleOffset; + const float lightAngleScale = color_and_attenuation.a; + const float lightAngleOffset = dir_angle.a; + float2 texId_scale = sl.texId_scale.xy; + float cosOuter = -lightAngleOffset / lightAngleScale; + float halfTan = sqrt(1 / (cosOuter * cosOuter) - 1); + float3 ofs; + if (dot(input.pos, input.pos) > 0) + { + ofs = tangent_to_world(normalize(float3(input.pos.xy * halfTan, input.pos.z)), dir_angle.xyz); + } + else + { + ofs = float3(0, 0, 0); + } + float4 worldPos = float4(pos_and_radius.xyz + ofs.xyz * (pos_and_radius.w / cosOuter), 1); + output.pos = mul(mvp, worldPos); + return output; +} + +float4 debug_spot_lights_ps(VsOutput input) : SV_Target +{ + return float4(1, 0, 0, 0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/debug_renderer_line_shader.hlsl b/project_templates/sample_scene/resources/shaders/src/debug_renderer_line_shader.hlsl new file mode 100644 index 00000000..3d5f6e78 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/debug_renderer_line_shader.hlsl @@ -0,0 +1,40 @@ +#include "shader_defines.h" + +struct ConstantData +{ + float4x4 WorldViewProj; + float4 Color; +}; + +SYSTEM_CBUFFER(SceneBuffer) : register(b0) +{ + ConstantData ConstData; +}; + +struct VS_IN +{ + float4 pos : POSITION0; + float4 col : COLOR0; +}; + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 col : COLOR; +}; + +PS_IN VSMain( VS_IN input ) +{ + PS_IN output = (PS_IN)0; + + output.pos = mul(ConstData.WorldViewProj, float4(input.pos.xyz, 1.0f)); + output.col = input.col; + + return output; +} + +float4 PSMain( PS_IN input ) : SV_Target +{ + float4 col = input.col; + return col; +} diff --git a/project_templates/sample_scene/resources/shaders/src/debug_renderer_mesh_shader.hlsl b/project_templates/sample_scene/resources/shaders/src/debug_renderer_mesh_shader.hlsl new file mode 100644 index 00000000..15a3b5a8 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/debug_renderer_mesh_shader.hlsl @@ -0,0 +1,41 @@ +#include "shader_defines.h" + +struct ConstantData +{ + float4x4 WorldViewProj; + float4x4 Transform; + float4 Color; +}; + +SYSTEM_CBUFFER(SceneBuffer) : register(b0) +{ + ConstantData ConstData; +}; + +struct VS_MESH_IN +{ + float4 pos : POSITION0; +}; + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 col : COLOR; +}; + + +PS_IN VSMain( VS_MESH_IN input ) +{ + PS_IN output = (PS_IN)0; + + output.pos = mul(ConstData.WorldViewProj, mul(ConstData.Transform, float4(input.pos.xyz, 1.0f))); + output.col = ConstData.Color; + + return output; +} + +float4 PSMain( PS_IN input ) : SV_Target +{ + float4 col = input.col; + return col; +} diff --git a/project_templates/sample_scene/resources/shaders/src/deferred_resolve.hlsl b/project_templates/sample_scene/resources/shaders/src/deferred_resolve.hlsl new file mode 100644 index 00000000..887a94f5 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/deferred_resolve.hlsl @@ -0,0 +1,92 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "in_out.hlsli" +#include "gbuffer_read.hlsli" +#include "pbr.hlsli" +#include "csm.hlsli" + +#define DIELECTRIC_F0 float3(0.04, 0.04, 0.04) + +TextureCube irradianceMap: register(t4); +TextureCube reflectionMap: register(t5); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 globtm_inv; + float4 worldViewPos; + float4 lightDirection; + float4 lightColorIntensity; + float4 envIntensity; +}; + +VsOutputResolve VSMain(uint id : SV_VertexID) +{ + VsOutputResolve output = (VsOutputResolve)0; + + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + + return output; +} + +half3 getSkyReflection(float linearRoughness, float3 roughReflection, float NoV) +{ + const float lod = linearRoughness * (REFLECTION_MAP_MIP_COUNT - 1); + return reflectionMap.SampleLevel(default_sampler, roughReflection, lod).rgb; +} + +float4 PSMain(VsOutputResolve input) : SV_Target +{ + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, input.texCoord, 0).x; + if(rawDepth == 0) + { + return float4(0,0,0,1); + } + + ProcessedGbuffer gbuffer = readProcessedGbuffer(input.texCoord); + + // depth / viewpos + float4 farpos = float4(input.texCoord.x * 2 - 1, (1 - input.texCoord.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + float3 pointToEye = worldViewPos.xyz - worldPos.xyz; + + float3 view = normalize(pointToEye); + + // lights + float3 lightDir = normalize(lightDirection.xyz); + + // todo: (is needed?????) replace metallic surfaces with albedo of their specular value + half3 specularColor = gbuffer.specularColor; + gbuffer.diffuseColor = lerp(gbuffer.diffuseColor, gbuffer.specularColor, gbuffer.metallness); + + float NoL = saturate(dot(gbuffer.normal, lightDir)) + 1e-5; + float NdotV = dot(gbuffer.normal, view); + float NoV = abs(NdotV) + 1e-5; + float ggx_alpha = gbuffer.linearRoughness * gbuffer.linearRoughness; + + half shadowTerm = get_csm_shadow(pointToEye, 1.0f).x; + half3 lightColor = lightColorIntensity.rgb * lightColorIntensity.a; + + const float3 irradiance = irradianceMap.Sample(default_sampler, gbuffer.normal).rgb * envIntensity.x; + + const float3 F0 = lerp(DIELECTRIC_F0, gbuffer.diffuseColor, gbuffer.metallness); + + const float3 kS = F_SchlickRoughness(F0, NoV, gbuffer.linearRoughness); + const float3 kD = lerp(float3(1.0, 1.0, 1.0) - kS, float3(0.0, 0.0, 0.0), gbuffer.metallness); + + half3 envAmbientDiffuseLighting = half3(kD * irradiance) * gbuffer.diffuseColor * gbuffer.ao; + + const float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float3 roughR = getRoughReflectionVec(reflectionVec, gbuffer.normal, ggx_alpha); + + half3 enviBRDF = EnvBRDFApprox(specularColor, gbuffer.roughness, NoV); + half3 envAmbientReflection = getSkyReflection(gbuffer.linearRoughness, roughR, NoV) * enviBRDF * gbuffer.ao; + + half3 result = standardBRDF( NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, gbuffer.extracted_albedo_ao, lightDir, view, gbuffer.normal) * shadowTerm * lightColor + + envAmbientDiffuseLighting + envAmbientReflection + gbuffer.emissionColor; + + return float4(float3(result), 1.0f); +} diff --git a/project_templates/sample_scene/resources/shaders/src/grid.hlsl b/project_templates/sample_scene/resources/shaders/src/grid.hlsl new file mode 100644 index 00000000..1c570517 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/grid.hlsl @@ -0,0 +1,78 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4 worldViewPos; + float4x4 vp; +} + + +struct PS_IN +{ + float4 pos : SV_POSITION; + float4 worldPos : TEXCOORD0; +}; + + + +PS_IN VSMain(uint id : SV_VertexID ) +{ + PS_IN output = (PS_IN)0; + + float2 inds = float2(id & 1, (id & 2) >> 1); + float2 xy = inds * float2(2, -2) + float2(-1, 1); + output.worldPos = float4(xy.x * 10000, 0, xy.y * 10000, 1.0f); + + output.pos = mul(vp, output.worldPos); + + return output; +} + + +float gridTextureGradBox(in float2 p, in float2 ddx, in float2 ddy) +{ + const float N = 100.0f; + // filter kernel + float2 w = max(abs(ddx), abs(ddy)) + 0.01f; + p += 0.5f / N; // middle line offset + + float2 a = p + 0.5 * w; + float2 b = p - 0.5 * w; + float2 i = (floor(a) + min(frac(a) * N, 1.0) - + floor(b) - min(frac(b) * N, 1.0)) / (N * w); + return (1.0 - i.x) * (1.0 - i.y); +} + + +float4 PSMain( PS_IN input ) : SV_Target +{ + float level = log10(abs(worldViewPos.y)); + float alpha = level < 1.0f ? 0.0f : 1.0f - frac(level); + + level = clamp(floor(level), 0.0f, 4.0f); + + float2 uv = input.worldPos.xz; + float2 dx = ddx(uv); + float2 dy = ddy(uv); + + float scale0 = pow(0.1f, level); + float t0 = 1.0f - gridTextureGradBox(uv * scale0, dx * scale0, dy * scale0); + + float scale1 = pow(0.1f, level-1); + float t1 = 1.0f - gridTextureGradBox(uv * scale1, dx * scale1, dy * scale1); + + float t = lerp(t0, t1, alpha); + float3 color = float3(0.3f, 0.3f, 0.3f); + + float g = 0.01 * pow(10.0f, level); + if (abs(input.worldPos.x) < g) + color = float3(0.8f, 0.0f, 0.0f); + if (abs(input.worldPos.z) < g) + color = float3(0.0f, 0.0f, 0.8f); + + return float4(color, t); +} diff --git a/project_templates/sample_scene/resources/shaders/src/imgui.hlsl b/project_templates/sample_scene/resources/shaders/src/imgui.hlsl new file mode 100644 index 00000000..4f9291ce --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/imgui.hlsl @@ -0,0 +1,43 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +struct VsInput +{ + float2 pos : POSITION; + float2 uv : TEXCOORD0; + float4 col : COLOR0; +}; + +struct VsOutput +{ + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 col : COLOR0; +}; + + +VsOutput imgui_vs(VsInput v) +{ + VsOutput o; + o.pos = mul(mvp, float4(v.pos.xy, 0.f, 1.f)); + o.uv = v.uv; + o.col = v.col.bgra; // dagor supports vertex color in BGRA format, but ImGui supplies it as RGBA + return o; +} + + +float4 imgui_ps(VsOutput i) : SV_Target +{ + return i.col * tex.Sample(sampl, i.uv); +} + diff --git a/project_templates/sample_scene/resources/shaders/src/multi_tex.hlsl b/project_templates/sample_scene/resources/shaders/src/multi_tex.hlsl new file mode 100644 index 00000000..300e48f4 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/multi_tex.hlsl @@ -0,0 +1,100 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +Texture2D tex1 : register(t0); +Texture2D tex2 : register(t1); + +SamplerState sampl1 : register(s0); +SamplerState sampl2 : register(s1); + +#ifndef GBUFFER_VARIANT + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; +cbuffer PropertyBuffer : register(b1) +{ + float blendFactor; +}; + +VsOutput VSMain(VsInput input) +{ + VsOutput output; + + const float3 LightPos = {0, 15, -30}; + + const float3 lightVec = normalize(LightPos - input.position); + const float diffuse = saturate(max(dot(lightVec, input.normal), 0.2) * 1.3); + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.color = float4(diffuse, diffuse, diffuse, 1.0f); + + output.texCoord = input.texCoord; + + return output; +} + +float4 PSMain(VsOutput input) : SV_Target +{ + const float4 color1 = tex1.Sample(sampl1, input.texCoord); + const float4 color2 = tex2.Sample(sampl2, input.texCoord); + const float4 result = lerp(color1, color2, blendFactor); + + return result * input.color; +} + +#else + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4 worldViewPos; +}; +cbuffer PropertyBuffer : register(b1) +{ + float blendFactor; +}; + +VsOutputGBuff VSMain(VsInput input) +{ + VsOutputGBuff output; + + float3 pos = input.position; + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = input.normal; + output.texCoord = input.texCoord; + output.p2e = worldViewPos.xyz - pos; + + return output; +} + +#include "gbuffer_base.hlsli" + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + float4 screenpos = input.position; + UnpackedGbuffer result; + init_gbuffer(result); + + const float4 color1 = tex1.Sample(sampl1, input.texCoord); + const float4 color2 = tex2.Sample(sampl2, input.texCoord); + + half4 albedo = half4(lerp(color1, color2, blendFactor)); + + half4 normal_smoothness = half4(0, 1, 0, 1); + float3 normal; + normal.xyz = (normal_smoothness.xyz * 2 - 1); + init_albedo(result, albedo.xyz); + init_smoothness(result, normal_smoothness.a); + init_normal(result, perturb_normal(normal, normalize(input.norm), input.p2e, input.texCoord)); + + init_metalness(result, 0); + init_ao(result, 1); + return encode_gbuffer(result, screenpos); +} + +#endif \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/outline_calculation.hlsl b/project_templates/sample_scene/resources/shaders/src/outline_calculation.hlsl new file mode 100644 index 00000000..da284d1b --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/outline_calculation.hlsl @@ -0,0 +1,177 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. +// Heavily inspired by https://bgolus.medium.com/the-quest-for-very-wide-outlines-ba82ed442cd9 + +#include "shader_defines.h" +#include "in_out.hlsli" + +GLOBAL_CBUFFER(PropertyBuffer) : register(b0) +{ + uint screenWidth; + uint screenHeight; + float jumpStepWidth; + float4 outlineColor; +}; + +VsOutput VSMain(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + // TODO: Rewrite to use only one triangle in future + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + output.color = float4(output.texCoord, 1, 0.5); + + return output; +} + +// just inside the precision of a R16G16_SNorm to keep encoded range 1.0 >= and > -1.0 +#define SNORM16_MAX_FLOAT_MINUS_EPSILON ((float)(32768 - 2) / (float)(32768 - 1)) + +#define FLOOD_NULL_POS -1.0 +#define FLOOD_NULL_POS_FLOAT2 float2(FLOOD_NULL_POS, FLOOD_NULL_POS) + +Texture2D outline_tex : register(t0); +SamplerState sampl : register(s0); + +float2 PSMainJumpFloodInit(VsOutput input) : + SV_Target +{ + float2 sceneUV = input.texCoord.xy; + // integer pixel position + int2 uvInt = sceneUV * int2(screenWidth, screenHeight); + + // sample silhouette texture for sobel + half3x3 values; + [unroll] for (int u = 0; u < 3; u++) + { + [unroll] for (int v = 0; v < 3; v++) + { + uint2 sampleUV = clamp(uvInt + int2(u - 1, v - 1), int2(0, 0), int2(screenWidth, screenHeight)); + values[u][v] = 1 - outline_tex.Load(int3(sampleUV, 0)).r; + } + } + // calculate output position for this pixel + float2 outPos = sceneUV; + + // interior, return position + if (values._m11 > 0.99) + { + return outPos; + } + + // exterior, return no position + if (values._m11 < 0.01) + { + return FLOOD_NULL_POS_FLOAT2; + } + + // sobel to estimate edge direction + float2 dir = -float2( + values[0][0] + values[0][1] * 2.0 + values[0][2] - values[2][0] - values[2][1] * 2.0 - values[2][2], + values[0][0] + values[1][0] * 2.0 + values[2][0] - values[0][2] - values[1][2] * 2.0 - values[2][2]); + + // if dir length is small, this is either a sub pixel dot or line + // no way to estimate sub pixel edge, so output position + if (abs(dir.x) <= 0.005 && abs(dir.y) <= 0.005) + return outPos; + + // normalize direction + dir = normalize(dir); + + // sub pixel offset + float2 offset = dir * (1.0 - values._m11); + + // output encoded offset position + return uvInt + offset; +} + +float2 PSMainJumpFloodStep(VsOutput input) : + SV_Target +{ + float2 sceneUV = input.texCoord.xy; + // integer pixel position + int2 uvInt = sceneUV * int2(screenWidth, screenHeight); + + // initialize best distance at infinity + const float maxDist = (screenWidth + screenHeight) * (screenWidth + screenHeight); + float bestDist = maxDist; + float2 bestCoord; + + // jump samples + [unroll] for (int u = -1; u <= 1; u++) + { + [unroll] for (int v = -1; v <= 1; v++) + { + // calculate offset sample position + int2 offsetUV = uvInt + int2(u, v) * jumpStepWidth; + + // .Load() acts funny when sampling outside of bounds, so don't + offsetUV = clamp(offsetUV, int2(0, 0), int2(screenWidth, screenHeight)); + + // decode position from buffer + float2 offsetPos = outline_tex.Load(int3(offsetUV, 0)).rg; + + // the offset from current position + float2 disp = uvInt - offsetPos * int2(screenWidth, screenHeight); + + // square distance + float dist = dot(disp, disp); + + // if offset position isn't a null position or is closer than the best + // set as the new best and store the position + if (offsetPos.y != FLOOD_NULL_POS && dist < bestDist) + { + bestDist = dist; + bestCoord = offsetPos; + } + } + } + + // if not valid best distance output null position, otherwise output encoded position + return maxDist == bestDist ? FLOOD_NULL_POS_FLOAT2 : bestCoord; +} + +Texture2D outlineMask_tex : register(t1); + +float4 PSMainJumpFloodResult(VsOutput input) : + SV_Target +{ + float2 sceneUV = input.texCoord.xy; + // integer pixel position + int2 uvInt = sceneUV * int2(screenWidth, screenHeight); + + // load encoded position + float2 encodedPos = outline_tex.Load(int3(uvInt, 0)).rg; + float isInside = outlineMask_tex.Load(int3(uvInt, 0)).r; + + // early out if outside + if (isInside < 0.9) + return half4(0, 0, 0, 0); + // early out if null position + if (encodedPos.y == -1) + return half4(0, 0, 0, 0); + + // decode closest position + float2 nearestPos = encodedPos* int2(screenWidth, screenHeight); + + // current pixel position + float2 currentPos = uvInt; + + // distance in pixels to closest position + half dist = length(nearestPos - currentPos); + + // calculate outline + // + 1.0 is because encoded nearest position is half a pixel inset + // not + 0.5 because we want the anti-aliased edge to be aligned between pixels + // distance is already in pixels, so this is already perfectly anti-aliased! + half outline = clamp(jumpStepWidth - dist + 1.0, 0, jumpStepWidth); + + half outlineAlpha = outline/jumpStepWidth; + + // apply outline to alpha + half4 col = outlineColor; + col.a *= outlineAlpha; + + return col; +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/point_lights_shader.hlsl b/project_templates/sample_scene/resources/shaders/src/point_lights_shader.hlsl new file mode 100644 index 00000000..c177cf6c --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/point_lights_shader.hlsl @@ -0,0 +1,271 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "clustered/point_light.hlsli" + +struct VsInput +{ + float3 pos : POSITION; +}; + +struct VsOutput +{ + VS_OUT_POSITION(pos) + float4 pos_and_radius : TEXCOORD1; + float4 color_and_attenuation : TEXCOORD2; + float3 worldPos : TEXCOORD3; + float3 worldPos2 : TEXCOORD4; +#if OMNI_SHADOWS + float4 shadow_tc_to_atlas : TEXCOORD3; +#endif +}; + +SYSTEM_CBUFFER(Lights) : + register(b1) +{ + uint4 omni_lights_count; + RenderOmniLight omni_lights_cb[MAX_OMNI_LIGHTS]; +}; + + +#include "gbuffer_read.hlsli" + +float readGbufferDepth(float2 tc) +{ + return depth_gbuf.SampleLevel(default_sampler, float4(tc, 0, 0).xy, float4(tc, 0, 0).w).r; +} + +half3 perform_point_light(float3 worldPos, float3 view, float NoV, ProcessedGbuffer gbuffer, half3 specularColor, half dynamicLightsSpecularStrength, half ao, float4 pos_and_radius, float4 color_and_attenuation, float4 shadowTcToAtlas, float2 screenpos) +{ +#if DYNAMIC_LIGHTS_EARLY_EXIT + #define EXIT_STATEMENT return 0 +#endif + + float3 point2light = pos_and_radius.xyz - worldPos.xyz; + float distSqFromLight = dot(point2light, point2light); + float ggx_alpha = max(1e-4, pow2(gbuffer.linearRoughness)); + +#if LAMBERT_LIGHT + float radius2 = pow2(pos_and_radius.w); + #if DYNAMIC_LIGHTS_EARLY_EXIT + bool shouldExit = distSqFromLight >= radius2; + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + EXIT_STATEMENT; + #endif + float invSqrRad = rcp(radius2); + float attenuation = smoothDistanceAtt(distSqFromLight, invSqrRad) * color_and_attenuation.w; + + float3 lightDir = point2light * rsqrt(0.0000001 + distSqFromLight); + float NoL = saturate(dot(gbuffer.normal, lightDir)); + half shadowTerm = attenuation; // no shadows + shadowTerm *= calc_micro_shadow(NoL, ao); + + #if OMNI_SHADOWS + shadowTerm *= getOmniShadow(shadowTcToAtlas, pos_and_radius, worldPos, NoL, screenpos); + #endif + + #if !DYNAMIC_LIGHTS_SPECULAR + half3 lightBRDF = diffuseLambert(gbuffer.diffuseColor) * (NoL * shadowTerm) * color_and_attenuation.xyz; + #else + half3 diffuse = diffuseLambert(gbuffer.diffuseColor); + + float3 H = normalize(view + lightDir); + float NoH = saturate(dot(gbuffer.normal, H)); + float VoH = saturate(dot(view, H)); + float D = BRDF_distribution(ggx_alpha, NoH) * dynamicLightsSpecularStrength; + float G = NoL > 0 ? BRDF_geometricVisibility(ggx_alpha, NoV, NoL, VoH) : 0; + float3 F = BRDF_fresnel(specularColor, VoH); + half3 result = (diffuse + (D * G) * F) * NoL; + #if DYNAMIC_LIGHTS_SSS + if (isSubSurfaceShader(gbuffer.material)) + result += (foliageSSS(NoL, view, lightDir) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + #endif + half3 lightBRDF = result * shadowTerm * color_and_attenuation.xyz; + #endif +#else + float NoL = dot(gbuffer.normal, point2light); + float invSqrRad = rcp(pow2(pos_and_radius.w)); + float attenuation = getDistanceAtt(distSqFromLight, invSqrRad) * color_and_attenuation.w; + float rcpDistFromLight = rsqrt(0.0000001 + distSqFromLight); + NoL *= rcpDistFromLight; + attenuation *= calc_micro_shadow(NoL, ao); + + #if DYNAMIC_LIGHTS_EARLY_EXIT + bool shouldExit = min(attenuation, NoL) <= 0; + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + EXIT_STATEMENT; + #endif + + #if OMNI_SHADOWS + attenuation *= getOmniShadow(shadowTcToAtlas, pos_and_radius, worldPos, NoL, screenpos); + #endif + + float3 lightDir = point2light * rcpDistFromLight; + half3 result = standardBRDF(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, lightDir, view, gbuffer.normal, gbuffer.translucencyColor, gbuffer.translucency); + #if !DYNAMIC_LIGHTS_EARLY_EXIT + result = NoL > 0 ? result : 0; + #endif + #if DYNAMIC_LIGHTS_SSS + if (isSubSurfaceShader(gbuffer.material)) + result += (foliageSSS(NoL, view, lightDir) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + #endif + half3 lightBRDF = result * attenuation * color_and_attenuation.xyz; +#endif + + return lightBRDF; +#if DYNAMIC_LIGHTS_EARLY_EXIT + #undef EXIT_STATEMENT +#endif +} + +half getOmniLightFade(RenderOmniLight ol, float3 worldPos) +{ + float3 boxPos = half3(ol.boxR0.w, ol.boxR1.w, ol.boxR2.w); + float3 boxDiff = worldPos - boxPos; + float3 box = 2 * (ol.boxR0.xyz * boxDiff.x + ol.boxR1.xyz * boxDiff.y + ol.boxR2.xyz * boxDiff.z); + box = saturate(abs(box)); + const float FADEOUT_DIST = 0.05; + box = 1 - box; + float fadeout = min3(box.x, box.y, box.z); + float fadelimit = FADEOUT_DIST; + return fadeout <= fadelimit ? fadeout / fadelimit : 1; +} + +#include "ColorSpaceUtility.hlsl" +#include "fast_shader_trig.hlsli" + +float3 inv_octahedral_mapping(float2 tc, float zoom, bool rotate) +{ + tc = (tc * 2 - 1) / zoom; + if (rotate) + tc = float2(tc.x - tc.y, tc.x + tc.y) / 2; + float3 dir = float3(tc.xy, 1.0 - (abs(tc.x) + abs(tc.y))); + if (dir.z < 0) + dir.xy = float2(-(abs(dir.y) - 1) * sign(dir.x), -(abs(dir.x) - 1) * sign(dir.y)); + return normalize(dir); +} + +half2 octahedral_mapping(half3 co, float zoom, bool rotate) +{ + co /= dot(half3(1, 1, 1), abs(co)); + +#if SHADER_COMPILER_HLSL2021 + co.xy = co.y < 0.0 ? (1.0 - abs(co.zx)) * (select(co.xz < 0, float2(-1, -1), float2(1, 1))) : co.xz; +#else + co.xy = co.y < 0.0 ? (1.0 - abs(co.zx)) * (co.xz < 0 ? float2(-1, -1) : float2(1, 1)) : co.xz; +#endif + + if (rotate) + { + float tempX = co.x; + co.x = (co.x + co.y); + co.y = (co.y - tempX); + } + co.x *= zoom; + co.y *= zoom; + return co.xy * 0.5 + 0.5; +} + +half getOmniLightIntensity(RenderOmniLight ol, float3 worldPos) +{ + return 1; +} + +float4 getFinalColor(RenderOmniLight ol, float3 worldPos) +{ + return ol.colorFlags * getOmniLightFade(ol, worldPos) * getOmniLightIntensity(ol, worldPos); +} + +VsOutput deferred_lights_vs(VsInput input, uint omni_light_index : SV_InstanceID) +{ + VsOutput output; + RenderOmniLight ol = omni_lights_cb[omni_light_index]; + float4 pos_and_radius = ol.posRadius; + float3 worldPos = pos_and_radius.xyz + input.pos.xyz * pos_and_radius.w * 1.15; + float4 color_and_attenuation = getFinalColor(ol, worldPos); + output.pos = mul(mvp, float4(worldPos, 1)); + output.color_and_attenuation = color_and_attenuation; + output.pos_and_radius = pos_and_radius; + output.worldPos = worldPos; + output.worldPos2 = worldPos - world_view_pos.xyz; +#if OMNI_SHADOWS + output.shadow_tc_to_atlas = getOmniLightShadowData(index); +#endif +#if LIGHT_LIMIT_SIZE + output.pos_and_radius.w = min(output.pos_and_radius.w, LIGHT_LIMIT_SIZE); +#endif + return output; +} + + + +float4 deferred_lights_ps(VsOutput input) : + SV_Target +{ + float4 screenpos = GET_SCREEN_POS(input.pos); + half3 result; + float3 view; + float2 tc; + float dist, w; + { + tc = screen_pos_to_tc(screenpos.xy); + + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, tc, 0).x; + float4 farpos = float4(tc.x * 2 - 1, (1 - tc.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + + float3 pointToEye = worldPos.xyz - world_view_pos.xyz; + + float4 pos_and_radius = input.pos_and_radius; +#if OMNI_SHADOWS + float4 shadowTcToAtlas = input.shadow_tc_to_atlas; +#else + float4 shadowTcToAtlas = float4(0, 0, 0, 0); +#endif + float3 moveFromPos = pos_and_radius.xyz - worldPos.xyz; + view = 0; + dist = 0; + + bool shouldExit = dot(moveFromPos, moveFromPos) > pos_and_radius.w * pos_and_radius.w; +#if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); +#endif + BRANCH + if (!shouldExit) + { + ProcessedGbuffer gbuffer = readProcessedGbuffer(tc); + + float distSq = dot(pointToEye, pointToEye); + float invRsqrt = rsqrt(distSq); + view = pointToEye * invRsqrt; + dist = rcp(invRsqrt); + float NdotV = dot(gbuffer.normal, view); + float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float NoV = abs(NdotV) + 1e-5; + + half dynamicLightsSpecularStrength = gbuffer.extracted_albedo_ao; + half ssao = 1; // fixme: we should use SSAO here! + half enviAO = gbuffer.ao * ssao; // we still modulate by albedo color, so we don't need micro AO + half pointLightsFinalAO = (enviAO * 0.5 + 0.5); + half specularAOcclusion = computeSpecOcclusion(saturate(NdotV), enviAO, gbuffer.linearRoughness * gbuffer.linearRoughness); // dice spec occlusion + half3 specularColor = gbuffer.specularColor * (specularAOcclusion * gbuffer.extracted_albedo_ao); + + float4 color_and_attenuation = input.color_and_attenuation; + result = perform_point_light(worldPos.xyz, view, NoV, gbuffer, gbuffer.specularColor, dynamicLightsSpecularStrength, gbuffer.ao, pos_and_radius, color_and_attenuation, shadowTcToAtlas, screenpos.xy); + result *= pointLightsFinalAO; + + return float4(result, 1); + } + } + + return float4(0, 0, 0, 0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/postFX_shader.hlsl b/project_templates/sample_scene/resources/shaders/src/postFX_shader.hlsl new file mode 100644 index 00000000..8c59172a --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/postFX_shader.hlsl @@ -0,0 +1,121 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" +#include "in_out.hlsli" + +Texture2D frame_tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(PropertyBuffer) : register(b0) +{ + float exposure; +}; + +VsOutput VSMain(uint id : SV_VertexID) +{ + VsOutput output = (VsOutput)0; + + //TODO: Rewrite to use only one triangle in future + output.texCoord = float2((id << 1) & 2, id & 2); + output.position = float4(output.texCoord * float2(2, -2) + float2(-1, 1), 0, 1); + output.color = float4(output.texCoord, 1, 0.5); + + return output; +} + +float3 ReinhardMain(float3 texColor) +{ + float3 retColor = texColor / (texColor + 1); // Reinhard + // retColor = pow(retColor,1.0f/2.2f); // Gamma + return retColor; +} + +#include +float3 FilmicMain(float3 texColor) +{ + float3 x = max(0, texColor - 0.004); // Filmic Curve + float3 retColor = (x * (6.2 * x + .5)) / (x * (6.2 * x + 1.7) + 0.06); + // retColor = pow(retColor,2.2f); // Gamma + return retColor; +} +float3 Uncharted2Tonemap(float3 x) +{ + float A = 0.15; + float B = 0.50; + float C = 0.10; + float D = 0.20; + float E = 0.02; + float F = 0.30; + float W = 11.2; + + return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F; +} + +float3 UnchartedMain(float3 texColor) +{ + float ExposureBias = 2.0f; + float3 curr = Uncharted2Tonemap(ExposureBias * texColor); + float3 W = 5; + float3 whiteScale = 1.0f / Uncharted2Tonemap(W); + float3 color = curr * whiteScale; + + return color; +} +// #define tonemap FilmicMain +half grainFromUV(float2 uv) +{ + return frac(sin(uv.x + uv.y * 543.31) * 493013.0); +} +#define tex2Dlod(tex, sampler, uv) tex.SampleLevel(sampler, (uv).xy, (uv).w) + +#if USE_UNCHARTED_TONEMAP +#define tonemap(color) UnchartedMain(color) +#elif USE_FILMIC_TONEMAP +#define tonemap(color) FilmicMain(color) +#elif USE_REINHARD_TONEMAP +#define tonemap(color) ReinhardMain(color) +#else +#define tonemap(color) (color) +#endif + +half3 sampleSceneColor(float2 tc) +{ + return tex2Dlod(frame_tex, sampl, float4(tc, 0, 0)).xyz; +} +float4 PSMain(VsOutput input) : + SV_Target +{ +// #define USE_COLOR_FRINGE 1 +// #define USE_GRAIN_JITTER 1 +#if USE_COLOR_FRINGE + float2 screenPos = input.texCoord.xy * 2 - 1; + float2 sceneUVJitter = float2(0.0, 0.0); + #if USE_GRAIN_JITTER + float2 sceneUV = input.texCoord.xy; + float grainRandomFull = 1.1; + half grain = grainFromUV(sceneUV + grainRandomFull); + float grainIntensity = 1; + float2 grainUV = sceneUV + 0.5 / float2(1920, 1080); + sceneUV = lerp(sceneUV, grainUV.xy, (1.0 - grain * grain) * grainIntensity); + sceneUVJitter = sceneUV.xy - input.texCoord.xy; + #else + float2 sceneUV = input.texCoord.xy; + #endif + + float3 chromatic_aberration_params = float3(0.1, 0.1, 0.15); + float2 caScale = chromatic_aberration_params.xy; + float caStartOffset = chromatic_aberration_params.z; + + float4 uvRG; + uvRG = screenPos.xyxy - sign(screenPos.xy).xyxy * saturate(abs(screenPos.xy) - caStartOffset).xyxy * caScale.xxyy; + uvRG = uvRG * 0.5 + 0.5; + + half3 frame = sampleSceneColor(uvRG.xy + sceneUVJitter.xy); + frame.g = sampleSceneColor(uvRG.zw + sceneUVJitter.xy).g; + frame.b = sampleSceneColor(sceneUV).b; +#else + half3 frame = sampleSceneColor(input.texCoord); // fixed exposure of 0.25! +#endif + return tonemap(frame * exposure).rgbr; // we write to srgb, so accurateLinearToSRGB not needed +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/postFX_skybox.hlsl b/project_templates/sample_scene/resources/shaders/src/postFX_skybox.hlsl new file mode 100644 index 00000000..e286d27f --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/postFX_skybox.hlsl @@ -0,0 +1,46 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +struct VsOutputSkybox +{ + float4 position : SV_Position; + float3 texCoord : TEXCOORD; +}; + +TextureCube environmentCubemap : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 viewMatrix; + float4x4 projectionMatrix; +}; + +VsOutputSkybox VSMain(uint id : SV_VertexID) +{ + VsOutputSkybox output = (VsOutputSkybox)0; + + const float3 position = float3( + ((id & 0x4) == 0) ? 1.0 : -1.0, + ((id & 0x2) == 0) ? 1.0 : -1.0, + ((id & 0x1) == 0) ? 1.0 : -1.0); + + output.texCoord = position; + + float4 viewPositionDiscardTranslation = mul(viewMatrix, float4(position, 0.0f)); + float4 projectedPosition = mul(projectionMatrix, viewPositionDiscardTranslation); + projectedPosition.z = 0.0f; // since we use ReverseZ, otherwise set to .w + + output.position = projectedPosition; + + return output; +} + +float4 PSMain(VsOutputSkybox input) : SV_Target +{ + float4 sky = environmentCubemap.Sample(sampl, input.texCoord); + sky.a = 0; + return sky; +} diff --git a/project_templates/sample_scene/resources/shaders/src/spot_lights_shader.hlsl b/project_templates/sample_scene/resources/shaders/src/spot_lights_shader.hlsl new file mode 100644 index 00000000..5b44d8b5 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/spot_lights_shader.hlsl @@ -0,0 +1,248 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "ColorSpaceUtility.hlsl" +#include "clustered/point_light.hlsli" + +struct VsOutput +{ + VS_OUT_POSITION(pos) + nointerpolation float3 id_texId_scale : TEXCOORD0; + float4 pos_and_radius : TEXCOORD1; + float4 color_and_attenuation : TEXCOORD2; + float4 dir_angle : TEXCOORD3; +}; + +struct VsInput +{ + float3 pos : POSITION; +}; + +SYSTEM_CBUFFER(Lights) : register(b1) +{ + uint4 spot_lights_count; + RenderSpotLight spot_lights_cb[MAX_SPOT_LIGHTS]; +} + +VsOutput deferred_lights_vs(VsInput input, uint spot_light_index : SV_InstanceID) +{ + VsOutput output; + RenderSpotLight sl = spot_lights_cb[spot_light_index]; + float4 pos_and_radius = sl.lightPosRadius; + float4 color_and_attenuation = sl.lightColorAngleScale; + color_and_attenuation.w = abs(color_and_attenuation.w); + float4 dir_angle = sl.lightDirectionAngleOffset; + const float lightAngleScale = color_and_attenuation.a; + const float lightAngleOffset = dir_angle.a; + float2 texId_scale = sl.texId_scale.xy; + float cosOuter = -lightAngleOffset / lightAngleScale; + float halfTan = sqrt(1 / (cosOuter * cosOuter) - 1); + float3 ofs; + if (dot(input.pos, input.pos) > 0) + { + ofs = tangent_to_world(normalize(float3(input.pos.xy * halfTan, input.pos.z)), dir_angle.xyz); + } + else + { + ofs = float3(0, 0, 0); + } + + float4 worldPos = float4(pos_and_radius.xyz + ofs.xyz * (pos_and_radius.w / cosOuter), 1); + output.id_texId_scale = float3(spot_light_index, texId_scale); + output.pos = mul(mvp, worldPos); + output.color_and_attenuation = color_and_attenuation; + output.pos_and_radius = pos_and_radius; + output.dir_angle = dir_angle; + return output; +} +// ##endif + + +#include "gbuffer_read.hlsli" + +float readGbufferDepth(float2 tc) +{ + return depth_gbuf.SampleLevel(default_sampler, float4(tc, 0, 0).xy, float4(tc, 0, 0).w).r; +} + + +float4 deferred_lights_ps(VsOutput input HW_USE_SCREEN_POS) : + SV_Target +{ + float4 screenpos = GET_SCREEN_POS(input.pos); + half3 result; + float3 view; + float2 tc; + float dist; + bool is_calculated = false; + { + tc = screen_pos_to_tc(screenpos.xy); + + const float rawDepth = depth_gbuf.SampleLevel(default_sampler, tc, 0).x; + float4 farpos = float4(tc.x * 2 - 1, (1 - tc.y) * 2 - 1, rawDepth, 1.0); + float4 worldpos_prj = mul(globtm_inv, farpos); + float4 worldPos = worldpos_prj / worldpos_prj.w; + + float3 pointToEye = worldPos.xyz - world_view_pos.xyz; + + float4 pos_and_radius = input.pos_and_radius; +#if OMNI_SHADOWS + float4 shadowTcToAtlas = input.shadow_tc_to_atlas; +#else + float4 shadowTcToAtlas = float4(0, 0, 0, 0); +#endif + float3 moveFromPos = pos_and_radius.xyz - worldPos.xyz; + view = 0; + dist = 0; + + bool shouldExit = dot(moveFromPos, moveFromPos) > pos_and_radius.w * pos_and_radius.w; +#if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); +#endif + BRANCH + if (shouldExit) + { + is_calculated = false; // discard; //discard is faster, but also fails early depth + } + else + { + ProcessedGbuffer gbuffer = readProcessedGbuffer(tc); + + float distSq = dot(pointToEye, pointToEye); + float invRsqrt = rsqrt(distSq); + view = pointToEye * invRsqrt; + dist = rcp(invRsqrt); + float NdotV = dot(gbuffer.normal, view); + float3 reflectionVec = 2 * NdotV * gbuffer.normal - view; + float NoV = abs(NdotV) + 1e-5; + + half dynamicLightsSpecularStrength = gbuffer.extracted_albedo_ao; + half ssao = 1; // fixme: we should use SSAO here! + half enviAO = gbuffer.ao * ssao; // we still modulate by albedo color, so we don't need micro AO + half pointLightsFinalAO = (enviAO * 0.5 + 0.5); + half specularAOcclusion = computeSpecOcclusion(saturate(NdotV), enviAO, gbuffer.linearRoughness * gbuffer.linearRoughness); // dice spec occlusion + half3 specularColor = gbuffer.specularColor * (specularAOcclusion * gbuffer.extracted_albedo_ao); + + float4 lightPosRadius = input.pos_and_radius; + float4 lightColor = input.color_and_attenuation; + float4 lightDirection = input.dir_angle; + uint spot_light_index = input.id_texId_scale.x; + float2 texId_scale = input.id_texId_scale.yz; +#define EXIT_STATEMENT return false + + float lightAngleScale = lightColor.a; + float lightAngleOffset = lightDirection.a; + + half geomAttenuation; + float3 dirFromLight, point2light; // point2light - not normalized + spot_light_params(worldPos.xyz, lightPosRadius, lightDirection.xyz, lightAngleScale, lightAngleOffset, geomAttenuation, dirFromLight, point2light); + + float NoL = dot(gbuffer.normal, dirFromLight); + half attenuation = calc_micro_shadow(NoL, gbuffer.ao) * geomAttenuation; + float ggx_alpha = max(1e-4, gbuffer.linearRoughness * gbuffer.linearRoughness); + +#if DYNAMIC_LIGHTS_EARLY_EXIT + #if DYNAMIC_LIGHTS_SSS + bool shouldExit = attenuation <= 0; + // bool shouldExit = attenuation <= 0 || (!isSubSurfaceShader(gbuffer.material) && NoL <= 0); + #else + attenuation = saturate(attenuation * NoL); + bool shouldExit = attenuation == 0; + #endif + #if WAVE_INTRINSICS + shouldExit = (bool)WaveReadFirstLane(WaveAllBitAnd(uint(shouldExit))); + #endif + BRANCH + if (shouldExit) + { + is_calculated = false; + } + else + { +#else + #if !DYNAMIC_LIGHTS_SSS + attenuation = saturate(attenuation * NoL); + #endif +#endif + + half spotShadow = 1; +#if SPOT_SHADOWS || defined(SPOT_CONTACT_SHADOWS_CALC) + float zbias = shadowZBias + shadowSlopeZBias / (abs(NoL) + 0.1); + float4x4 spotLightTm = getSpotLightTm(spot_light_index); + float4 lightShadowTC = mul(spotLightTm, float4(worldPos.xyz + (point2light + dirFromLight) * zbias, 1)); + if (lightShadowTC.w > 1e-6) + { + lightShadowTC.xyz /= lightShadowTC.w; + #if SPOT_SHADOWS + #ifdef SIMPLE_PCF_SHADOW + spotShadow = 1 - dynamic_shadow_sample(lightShadowTC.xy, lightShadowTC.z); + #else + #ifndef shadow_frame + float shadow_frame = 0; + #endif + spotShadow = 1 - dynamic_shadow_sample_8tap(screenpos, lightShadowTC.xy, lightShadowTC.z, 1.5 * shadowAtlasTexel.x * (0.75 + saturate(0.3 * length(point2light))), shadow_frame); + #endif + #endif + #ifdef SPOT_CONTACT_SHADOWS_CALC + SPOT_CONTACT_SHADOWS_CALC + #endif + } + attenuation *= spotShadow; +#endif + +#if DYNAMIC_LIGHTS_SSS + NoL = saturate(NoL); + // half3 lightBRDF = standardBRDF(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, dirFromLight, view, gbuffer.normal, gbuffer.translucencyColor, gbuffer.translucency); + half3 lightBRDF = diffuseLambert(gbuffer.diffuseColor) * (NoL)*lightColor.xyz; + ; + + #if USE_SSSS && SPOT_SHADOWS + BRANCH if (gbuffer.material == SHADING_SUBSURFACE) + { + SpotlightShadowDescriptor spotlightDesc = spot_lights_ssss_shadow_desc[spot_light_index]; + BRANCH if (lightShadowTC.w > 1e-6 && spotlightDesc.hasDynamic) + { + float4 ssssShadowTC = mul(spotLightTm, float4(ssssWorldPos, 1)); + ssssShadowTC /= ssssShadowTC.w; + ShadowDescriptor desc; + desc.decodeDepth = spotlightDesc.decodeDepth; + desc.meterToUvAtZfar = spotlightDesc.meterToUvAtZfar; + desc.uvMinMax = spotlightDesc.uvMinMax; + desc.shadowRange = lightPosRadius.w; + float ssssTransmittance = ssss_get_transmittance_factor( + gbuffer.translucency, tc, dynamic_light_shadows_smp, dynamic_light_shadows_size, ssssShadowTC.xyz, desc); + result += gbuffer.diffuseColor * lightColor.rgb * ssss_get_profiled_transmittance(gbuffer.normal, dirFromLight, ssssTransmittance) * geomAttenuation; + } + } + else + #endif + { + /* + BRANCH if (isSubSurfaceShader(gbuffer.material)) + lightBRDF += (foliageSSS(NoL, view, dirFromLight) * gbuffer.ao) * gbuffer.translucencyColor; // can make gbuffer.ao*gbuffer.translucencyColor only once for all lights + */ + } +#else + half3 lightBRDF = standardBRDF_NO_NOL(NoV, NoL, gbuffer.diffuseColor, ggx_alpha, gbuffer.linearRoughness, specularColor, dynamicLightsSpecularStrength, dirFromLight, view, gbuffer.normal); +#endif + attenuation = applyPhotometryIntensity(-dirFromLight, lightDirection.xyz, texId_scale.x, + texId_scale.y, attenuation); + lightBRDF *= attenuation * lightColor.xyz; +#if WAVE_INTRINSICS || !DYNAMIC_LIGHTS_EARLY_EXIT + FLATTEN + if (attenuation <= 0) + lightBRDF = 0; +#endif + + result = lightBRDF * pointLightsFinalAO; + is_calculated = true; + } + } + } + if (is_calculated) + { + return float4(result, 1); + } + + return float4(0, 0, 0, 0); +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/shaders/src/standard.hlsl b/project_templates/sample_scene/resources/shaders/src/standard.hlsl new file mode 100644 index 00000000..cfd7b504 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/standard.hlsl @@ -0,0 +1,101 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Copyright (C) 2024 Gaijin Games KFT. All rights reserved + +#include "shader_defines.h" + +#include "in_out.hlsli" +#include "common_types.hlsli" + +#include "shader_global.hlsli" +#include "gbuffer_base.hlsli" + +Texture2D albedoTex : register(t0); +Texture2D normalTex : register(t1); +Texture2D metalRoughnessAoTex : register(t2); + +SamplerState albedoSampler : register(s0); +SamplerState normalSampler : register(s1); +SamplerState metalRoughnessAoSampler : register(s2); + +#ifndef INSTANCED + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4x4 worldMatrix; + float4x4 normalMatrix; + float4 worldViewPos; +}; + +VsOutputGBuff VSMain(VsInputLit input) +{ + VsOutputGBuff output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = normalize(mul(normalMatrix, float4(input.normal, 0.0f)).xyz); + output.tangent = normalize(mul(worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + output.texCoord.y = 1.0f - output.texCoord.y; + + return output; +} +#else // !INSTANCED + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 vp; + float4 worldViewPos; +}; + +cbuffer InstanceDataBuffer : register(b1) +{ + float4 instanceBaseID; +}; + +StructuredBuffer instanceBuffer : register(t0); + +VsOutputGBuff VSMain(VsInputLit input, uint instID : SV_InstanceID) +{ + VsOutputGBuff output; + + const uint instIdx = instanceBaseID.x + instID; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + output.norm = mul(instanceBuffer[instIdx].normalMatrix, float4(input.normal.xyz, 0.0f)).xyz; + output.tangent = normalize(mul(instanceBuffer[instIdx].worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + output.texCoord.y = 1.0f - output.texCoord.y; + + return output; +} + +#endif // !INSTANCED + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + half3 albedo = albedoTex.Sample(albedoSampler, input.texCoord).rgb; + half4 metalRoughnessAo = metalRoughnessAoTex.Sample(metalRoughnessAoSampler, input.texCoord); + + float3 tangentNormal = normalTex.Sample(normalSampler, input.texCoord).xyz * 2.0f - 1.0f; + float3 worldSpaceNormal = normalize(TangentToWorld(tangentNormal, GetTBN(input.norm, input.tangent))); + + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + + init_albedo(result, albedo); + +#ifdef EMISSIVE + init_material(result, SHADING_EMISSIVE); + init_emission(result, 0.666f); // test value +#else + init_ao(result, saturate(metalRoughnessAo.r + 0.1f)); +#endif + + init_normal(result, worldSpaceNormal); + init_smoothness(result, 1.0f - metalRoughnessAo.g); + init_metalness(result, metalRoughnessAo.b); + + return encode_gbuffer(result, screenpos); +} + diff --git a/project_templates/sample_scene/resources/shaders/src/standard_skinned.hlsl b/project_templates/sample_scene/resources/shaders/src/standard_skinned.hlsl new file mode 100644 index 00000000..bb5609cc --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/standard_skinned.hlsl @@ -0,0 +1,91 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +#include "shader_global.hlsli" +#include "gbuffer_base.hlsli" + +struct VsInput +{ + float3 Position : POSITION; + float3 Normal : NORMAL; + float2 texCoord : TEXCOORD0; + float4 Tangent : TANGENT; + + float4 BoneWeights : BLENDWEIGHT; + uint4 BoneIndices : BLENDINDICES; +}; + +struct VsOutput +{ + float4 position : SV_Position; + float3 normal : NORMAL; + float2 texCoord : TEXCOORD0; + float3 tangent : TANGENT; +}; + +Texture2D albedoTex : register(t0); +Texture2D normalTex : register(t1); +Texture2D metalRoughnessAoTex : register(t2); + +SamplerState albedoSampler : register(s0); +SamplerState normalSampler : register(s1); +SamplerState metalRoughnessAoSampler : register(s2); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + matrix vp; + matrix BonesTransforms[NAU_MAX_SKINNING_BONES_COUNT]; + matrix BonesNormalTransforms[NAU_MAX_SKINNING_BONES_COUNT]; +}; + +VsOutput VSMain(VsInput input) +{ + VsOutput output; + + float4 skinnedPos = float4(0.0, 0.0, 0.0, 0.0); + float3 skinnedNormal = float3(0.0, 0.0, 0.0); + float3 skinnedTangent = float3(0.0, 0.0, 0.0); + + [unroll] + for (int i = 0; i < 4; i++) + { + const uint boneIndex = input.BoneIndices[i]; + if (boneIndex < NAU_MAX_SKINNING_BONES_COUNT) + { + skinnedPos += input.BoneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.Position, 1.0)); + skinnedNormal += input.BoneWeights[i] * mul(BonesNormalTransforms[boneIndex], float4(input.Normal, 0.0)).xyz; + skinnedTangent += input.BoneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.Tangent.xyz, 0.0)).xyz; + } + } + + output.position = mul(vp, skinnedPos); + output.texCoord = input.texCoord; + output.normal = normalize(skinnedNormal); + output.tangent = normalize(skinnedTangent); + + return output; +} + +GBUFFER_OUTPUT PSMain(VsOutput input) +{ + half3 albedo = albedoTex.Sample(albedoSampler, input.texCoord).rgb; + half4 metalRoughnessAo = metalRoughnessAoTex.Sample(metalRoughnessAoSampler, input.texCoord); + float3 tangentNormal = normalTex.Sample(normalSampler, input.texCoord).xyz * 2.0f - 1.0f; + + float3 worldSpaceNormal = normalize(TangentToWorld(tangentNormal, GetTBN(input.normal, input.tangent))); + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + + init_albedo(result, albedo); + init_ao(result, saturate(metalRoughnessAo.r + 0.1f)); + + init_normal(result, worldSpaceNormal); + init_smoothness(result, 1.0f - metalRoughnessAo.g); + init_metalness(result, metalRoughnessAo.b); + + return encode_gbuffer(result, screenpos); +} diff --git a/project_templates/sample_scene/resources/shaders/src/standard_translucent.hlsl b/project_templates/sample_scene/resources/shaders/src/standard_translucent.hlsl new file mode 100644 index 00000000..d4dac13a --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/standard_translucent.hlsl @@ -0,0 +1,136 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" + +#include "in_out.hlsli" +#include "common_types.hlsli" + +#include "shader_global.hlsli" +#include "pbr.hlsli" + +#define DIELECTRIC_F0 float3(0.04, 0.04, 0.04) + +Texture2D albedoTex : register(t0); +Texture2D normalTex : register(t1); +Texture2D metalRoughnessAoTex : register(t2); + +SamplerState albedoSampler : register(s0); +SamplerState normalSampler : register(s1); +SamplerState metalRoughnessAoSampler : register(s2); + +half luminance(half3 col) +{ + return dot(col, half3(0.299, 0.587, 0.114)); +} + +#ifndef INSTANCED + + GLOBAL_CBUFFER(SceneBuffer) : register(b0) + { + float4x4 mvp; + float4x4 worldMatrix; + float4x4 normalMatrix; + float4 worldViewPos; + }; + + cbuffer ColorBuffer : register(b1) + { + float4 color; + }; + + VsOutputLitForward VSMain(VsInputLit input) + { + VsOutputLitForward output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = normalize(mul(normalMatrix, float4(input.normal, 0.0f)).xyz); + output.tangent = normalize(mul(worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + + output.worldPos = mul(worldMatrix, float4(input.position, 1.0f)).xyz; + output.color = color; + + return output; + } + +#else // !INSTANCED + + GLOBAL_CBUFFER(SceneBuffer) : register(b0) + { + float4x4 vp; + float4 worldViewPos; + }; + + cbuffer InstanceDataBuffer : register(b1) + { + float4 instanceBaseID; + }; + + cbuffer ColorBuffer : register(b2) + { + float4 color; + }; + + StructuredBuffer instanceBuffer : register(t0); + + VsOutputLitForward VSMain(VsInputLit input, uint instID : SV_InstanceID) + { + VsOutputLitForward output; + + const uint instIdx = instanceBaseID.x + instID; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + output.norm = mul(instanceBuffer[instIdx].normalMatrix, float4(input.normal.xyz, 0.0f)).xyz; + output.tangent = normalize(mul(instanceBuffer[instIdx].worldMatrix, float4(input.tangent.xyz, 0.0f)).xyz); + output.texCoord = input.texCoord; + + output.worldPos = mul(instanceBuffer[instIdx].worldMatrix, float4(input.position, 1.0f)).xyz; + output.color = color; + + return output; + } + +#endif // !INSTANCED + +float4 PSMain(VsOutputLitForward input) : SV_Target +{ + half4 albedo = albedoTex.Sample(albedoSampler, input.texCoord); + half4 metalRoughnessAo = metalRoughnessAoTex.Sample(metalRoughnessAoSampler, input.texCoord); + float3 tangentNormal = normalTex.Sample(normalSampler, input.texCoord).xyz * 2.0f - 1.0f; + + const float3 diffuseColor = float3(albedo.rgb); + const float linearRoughness = float(metalRoughnessAo.b); // todo: NAU-1797: srgb/linear ? + const float metallness = float(metalRoughnessAo.g); + const float ao = 1.0f; + + float3 worldSpaceNormal = normalize(TangentToWorld(tangentNormal, GetTBN(input.norm, input.tangent))); + + float3 pointToEye = worldViewPos.xyz - input.worldPos; + float3 view = normalize(pointToEye); + + // lights + float3 lightDir = normalize(float3(0.5f, -0.5f, 0.0f)); // todo: NAU-1797 pass direct light dir + + float NoL = saturate(dot(worldSpaceNormal, lightDir)) + 1e-5; + float NdotV = dot(worldSpaceNormal, view); + float NoV = abs(NdotV) + 1e-5; + float ggx_alpha = linearRoughness * linearRoughness; + + half3 lightColor = half3(1.0, 1.0, 1.0); // todo: NAU-1797 pass direct light color + + const float3 reflectionVec = 2 * NdotV * worldSpaceNormal - view; + float3 roughR = getRoughReflectionVec(reflectionVec, worldSpaceNormal, ggx_alpha); + + float opacity = albedo.a; // todo: NAU-1797 make color4 material prop, pass as Per-Instance Data or as regular CB-member (non-instanced) + + half fresnel0Dielectric = 0.04f; + fresnel0Dielectric = lerp(fresnel0Dielectric, 0.01f, linearRoughness * opacity); + fresnel0Dielectric *= (1 - opacity); + half3 specularColor = lerp(half3(fresnel0Dielectric, fresnel0Dielectric, fresnel0Dielectric), albedo.rgb, half(metallness)); + + half specularStrength = saturate(luminance(albedo.rgb) * (1 / 0.04)) * 0.9 + 0.1; + + half3 result = standardBRDF(NoV, NoL, diffuseColor, ggx_alpha, linearRoughness, specularColor, specularStrength, lightDir, view, half3(worldSpaceNormal)) * lightColor; + + return float4(float3(result), 1.0f) * input.color; +} diff --git a/project_templates/sample_scene/resources/shaders/src/textured.hlsl b/project_templates/sample_scene/resources/shaders/src/textured.hlsl new file mode 100644 index 00000000..a4348b30 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/textured.hlsl @@ -0,0 +1,104 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +// Constant buffer for test local material properties. +cbuffer TestBuffer : register(b1) +{ + float4 color; +}; + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +#ifndef GBUFFER_VARIANT + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; +}; + +VsOutput VSMain(VsInput input) +{ + const float3 LightPos = {0, 15, -30}; + const float3 lightVec = normalize(LightPos - input.position); + const float diffuse = saturate(max(dot(lightVec, input.normal), 0.2) * 1.3); + + VsOutput output; + + output.position = mul(mvp, float4(input.position, 1.0f)); + output.color = float4(diffuse, diffuse, diffuse, 1.0f); + output.texCoord = input.texCoord; + + return output; +} + +float4 PSMain(VsOutput input) : + SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color; +} + +float4 PSMainColored(VsOutput input) : SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color * color; +} +#else + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 mvp; + float4 worldViewPos; +}; + +VsOutputGBuff VSMain(VsInput input) +{ + VsOutputGBuff output; + + float3 pos = input.position; + output.position = mul(mvp, float4(input.position, 1.0f)); + output.norm = input.normal; + output.p2e = worldViewPos.xyz - pos; + output.texCoord = input.texCoord; + + return output; +} + +#include "gbuffer_base.hlsli" + +GBUFFER_OUTPUT PSMain(VsOutputGBuff input) +{ + float4 screenpos = input.position; + UnpackedGbuffer result; + init_gbuffer(result); + half4 albedo_roughness = tex.Sample(sampl, input.texCoord); + albedo_roughness.a = 1; // roughness + half4 normal_smoothness = half4(0, 1, 0, 1); + float3 normal; + normal.xyz = (normal_smoothness.xyz * 2 - 1); + // init_albedo_roughness(result, albedo_roughness); + init_albedo(result, albedo_roughness.xyz); + init_smoothness(result, normal_smoothness.a); + //init_normal(result, perturb_normal(normal, normalize(input.norm), input.p2e, input.texCoord)); + init_normal(result, normalize(input.norm)); + init_metalness(result, 0); + init_ao(result, 1); + return encode_gbuffer(result, screenpos); +} + +GBUFFER_OUTPUT PSMainColored(VsOutputGBuff input) +{ + float4 screenpos = input.position; + + UnpackedGbuffer result; + init_gbuffer(result); + float4 albedo = tex.Sample(sampl, input.texCoord); + init_albedo(result, albedo.xyz); + + return encode_gbuffer(result, screenpos); +} +#endif diff --git a/project_templates/sample_scene/resources/shaders/src/texturedInstanced.hlsl b/project_templates/sample_scene/resources/shaders/src/texturedInstanced.hlsl new file mode 100644 index 00000000..1b005736 --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/texturedInstanced.hlsl @@ -0,0 +1,111 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "common_types.hlsli" +#include "in_out.hlsli" +#include "shader_defines.h" + + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 vp; + float4x4 mvp; + float4x4 worldMatrix; + float4x4 normalMatrix; + float4 instanceBaseID; + matrix BonesTransforms[NAU_MAX_SKINNING_BONES_COUNT]; +}; + +cbuffer ColorBuffer : register(b1) +{ + float4 color; +}; + +StructuredBuffer instanceBuffer : register(t0); + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +float4 PSMain(VsOutput input) : SV_Target +{ + float4 albedo = tex.Sample(sampl, input.texCoord); + return albedo * input.color; +} + +VsOutputZPrepass zprepassInstancedVSMain(VsInputZPrepass input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output; + + const uint instIdx = instanceBaseID.x + instID; + output.uid = instanceBuffer[instIdx].uid; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + + return output; +} + +VsOutputZPrepass zprepassSkinnedVSMain(VsInputZPrepassSkinned input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output; + + const uint instIdx = instanceBaseID.x + instID; + output.uid = instanceBuffer[instIdx].uid; + + float4 skinnedPos = float4(0.0, 0.0, 0.0, 0.0); + + for (int i = 0; i < 4; i++) + { + const uint boneIndex = input.boneIndices[i]; + if (boneIndex < NAU_MAX_SKINNING_BONES_COUNT) + { + skinnedPos += input.boneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.position, 1.0)); + } + } + + output.position = mul(vp, skinnedPos); + + return output; +} + +uint4 zprepassPSMain(VsOutputZPrepass input) : SV_Target +{ + return input.uid; +} + +VsOutputZPrepass outlineMaskVSMain(VsInputZPrepass input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output; + + const uint instIdx = instanceBaseID.x + instID; + output.uid.x = instanceBuffer[instIdx].isHighlighted; + output.position = mul(mul(vp, instanceBuffer[instIdx].worldMatrix), float4(input.position, 1.0f)); + + return output; +} + +VsOutputZPrepass outlineMaskSkinnedVSMain(VsInputZPrepassSkinned input, uint instID : SV_InstanceID) +{ + VsOutputZPrepass output = (VsOutputZPrepass)0; + + const uint instIdx = instanceBaseID.x + instID; + output.uid.x = instanceBuffer[instIdx].isHighlighted; + + float4 skinnedPos = float4(0.0, 0.0, 0.0, 0.0); + + for (int i = 0; i < 4; i++) + { + const uint boneIndex = input.boneIndices[i]; + if (boneIndex < NAU_MAX_SKINNING_BONES_COUNT) + { + skinnedPos += input.boneWeights[i] * mul(BonesTransforms[boneIndex], float4(input.position, 1.0)); + } + } + + output.position = mul(vp, mul(worldMatrix, skinnedPos)); + + return output; +} + +float outlineMaskPSMain(VsOutputZPrepass input) : SV_Target +{ + return input.uid.x; +} diff --git a/project_templates/sample_scene/resources/shaders/src/vfx.hlsl b/project_templates/sample_scene/resources/shaders/src/vfx.hlsl new file mode 100644 index 00000000..9b7b187f --- /dev/null +++ b/project_templates/sample_scene/resources/shaders/src/vfx.hlsl @@ -0,0 +1,81 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#include "shader_defines.h" +#include "in_out.hlsli" + +struct InstanceData +{ + float4x4 worldMatrix; + int frameID; + float4 color; + uint3 dummy; +}; + +// Structure buffer for instance (InstanceData) +StructuredBuffer instanceBuffer : register(t1); + +Texture2D tex : register(t0); +SamplerState sampl : register(s0); + +GLOBAL_CBUFFER(SceneBuffer) : register(b0) +{ + float4x4 view; + float4x4 projection; +}; + +GLOBAL_CBUFFER(AtlasBuffer) : register(b1) +{ + int frames_y; + int frames_x; +}; + +VsVFXOutput VSMain(VsInput input, uint instanceId : SV_InstanceID) +{ + InstanceData instanceData = instanceBuffer[instanceId]; + + float4x4 model = instanceData.worldMatrix; + + float4 origin = float4(0.0, 0.0, 0.0, 1.0); + float4 world_origin = mul(model, origin); + float4 view_origin = mul(view, world_origin); + float4 world_to_view_translation = view_origin - world_origin; + + float4 world_pos = mul(model, float4(input.position, 1.0)); + float4 view_pos = world_pos + world_to_view_translation; + float4 clip_pos = mul(projection, view_pos); + + VsVFXOutput output; + + output.position = clip_pos; + output.color = instanceData.color; + output.frameID = instanceData.frameID; + output.texCoord = input.texCoord; + //output.columns = frames_y; + //output.rows = frames_x; + + return output; +} + +float4 PSMain(VsVFXOutput input) : SV_Target +{ + int currentFrame = input.frameID; + + //int columns = input.columns; + //int rows = input.rows; + + int columns = 1; + int rows = 1; + + float frameWidth = 1.0 / columns; + float frameHeight = 1.0 / rows; + + int frameX = currentFrame % columns; + int frameY = currentFrame / columns; + + float2 frameOrigin = float2(frameX * frameWidth, (float(rows - 1 - frameY)) * frameHeight); + float2 frameUV = frameOrigin + input.texCoord * float2(frameWidth, frameHeight); + + float4 albedo = tex.Sample(sampl, frameUV); + return albedo * input.color; +} diff --git a/project_templates/sample_scene/resources/textures/hdri/default_cubemap_2k.hdr b/project_templates/sample_scene/resources/textures/hdri/default_cubemap_2k.hdr new file mode 100644 index 00000000..31843fc6 Binary files /dev/null and b/project_templates/sample_scene/resources/textures/hdri/default_cubemap_2k.hdr differ diff --git a/project_templates/sample_scene/resources/ui/shaders/cache/shader_cache.nsbc b/project_templates/sample_scene/resources/ui/shaders/cache/shader_cache.nsbc new file mode 100644 index 00000000..c383669f --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/cache/shader_cache.nsbc @@ -0,0 +1,863 @@ +NauContent-Kind: nau-shader-pack +Content-Type: application/json +Content-Length: 58234 + + +{"byteCode":[{"blobOffset":0,"blobSize":8620,"shaderName":"cameraClear_frag.ps.psmain"},{"blobOffset":8620,"blobSize":12272,"shaderName":"cameraClear_vert.vs.vsmain"},{"blobOffset":20892,"blobSize":12108,"shaderName":"etc1Gray_frag.ps.psmain"},{"blobOffset":33000,"blobSize":11496,"shaderName":"etc1_frag.ps.psmain"},{"blobOffset":44496,"blobSize":11312,"shaderName":"grayScale_frag.ps.psmain"},{"blobOffset":55808,"blobSize":13836,"shaderName":"labelDistanceFieldGlow_frag.ps.psmain"},{"blobOffset":69644,"blobSize":13936,"shaderName":"labelOutline_frag.ps.psmain"},{"blobOffset":83580,"blobSize":12932,"shaderName":"label_distanceNormal_frag.ps.psmain"},{"blobOffset":96512,"blobSize":11932,"shaderName":"label_normal_frag.ps.psmain"},{"blobOffset":108444,"blobSize":11332,"shaderName":"layer_radialGradient_frag.ps.psmain"},{"blobOffset":119776,"blobSize":9220,"shaderName":"positionColorLengthTexture_frag.ps.psmain"},{"blobOffset":128996,"blobSize":13616,"shaderName":"positionColorLengthTexture_vert.vs.vsmain"},{"blobOffset":142612,"blobSize":13200,"shaderName":"positionColorTextureAsPointsize_vert.vs.vsmain"},{"blobOffset":155812,"blobSize":8616,"shaderName":"positionColor_frag.ps.psmain"},{"blobOffset":164428,"blobSize":12892,"shaderName":"positionColor_vert.vs.vsmain"},{"blobOffset":177320,"blobSize":12412,"shaderName":"positionTextureColorAlphaTest_frag.ps.psmain"},{"blobOffset":189732,"blobSize":10604,"shaderName":"positionTextureColor_frag.ps.psmain"},{"blobOffset":200336,"blobSize":13388,"shaderName":"positionTextureColor_vert.vs.vsmain"},{"blobOffset":213724,"blobSize":10124,"shaderName":"positionTexture_frag.ps.psmain"},{"blobOffset":223848,"blobSize":12596,"shaderName":"positionTexture_vert.vs.vsmain"},{"blobOffset":236444,"blobSize":8624,"shaderName":"positionUColor_frag.ps.psmain"},{"blobOffset":245068,"blobSize":12480,"shaderName":"positionUColor_vert.vs.vsmain"},{"blobOffset":257548,"blobSize":12352,"shaderName":"position_vert.vs.vsmain"}],"shaders":[{"entryPoint":"PSMain","name":"cameraClear_frag.ps.psmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"cameraClear_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"cameraClear_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":3,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"COLOR","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"cameraClear_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"etc1Gray_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_1","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture1","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"etc1Gray_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"etc1_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_1","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"},{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture1","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"etc1_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"grayScale_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"grayScale_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"labelDistanceFieldGlow_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"labelDistanceFieldGlow_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"labelOutline_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"labelOutline_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"label_distanceNormal_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"label_distanceNormal_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"label_normal_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":2,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"label_normal_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"layer_radialGradient_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[]},"srcName":"layer_radialGradient_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"positionColorLengthTexture_frag.ps.psmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"positionColorLengthTexture_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"positionColorLengthTexture_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"COLOR","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"positionColorLengthTexture_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"positionColorTextureAsPointsize_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":2,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"COLOR","stream":0}]},"srcName":"positionColorTextureAsPointsize_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"positionColor_frag.ps.psmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"positionColor_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"positionColor_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"COLOR","stream":0}]},"srcName":"positionColor_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"positionTextureColorAlphaTest_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":0,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":2,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"positionTextureColorAlphaTest_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"PSMain","name":"positionTextureColor_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"positionTextureColor_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"positionTextureColor_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":1,"semanticIndex":0,"semanticName":"COLOR","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":2,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"positionTextureColor_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"positionTexture_frag.ps.psmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Unknown","flags":0,"name":"sampler_0","numSamples":0,"returnType":"Unknown","space":0,"type":"Sampler"},{"bindCount":1,"bindPoint":0,"bufferDesc":{"flags":0,"name":"","size":0,"type":"CBuffer","variables":[]},"dimension":"Texture2D","flags":12,"name":"u_texture","numSamples":4294967295,"returnType":"Float","space":0,"type":"Texture"}],"signatureParams":[]},"srcName":"positionTexture_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"positionTexture_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0},{"componentType":"Float","mask":3,"readWriteMask":3,"registerIndex":1,"semanticIndex":0,"semanticName":"TEXCOORD","stream":0}]},"srcName":"positionTexture_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"PSMain","name":"positionUColor_frag.ps.psmain","reflection":{"inputBinds":[],"signatureParams":[]},"srcName":"positionUColor_frag.hlsl","target":"Pixel","vsd":[]},{"entryPoint":"VSMain","name":"positionUColor_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":2,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"positionUColor_vert.hlsl","target":"Vertex","vsd":[]},{"entryPoint":"VSMain","name":"position_vert.vs.vsmain","reflection":{"inputBinds":[{"bindCount":1,"bindPoint":1,"bufferDesc":{"flags":0,"name":"UIConstBuffer","size":176,"type":"CBuffer","variables":[{"flags":2,"name":"u_MVPMatrix","samplerSize":0,"size":64,"startOffset":0,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4x4","rows":4,"svc":"MatrixColumns","svt":"Float"}},{"flags":0,"name":"u_textColor","samplerSize":0,"size":16,"startOffset":64,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_effectColor","samplerSize":0,"size":16,"startOffset":80,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_startColor","samplerSize":0,"size":16,"startOffset":96,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_endColor","samplerSize":0,"size":16,"startOffset":112,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_color","samplerSize":0,"size":16,"startOffset":128,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":4,"elements":0,"members":{},"name":"float4","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_center","samplerSize":0,"size":8,"startOffset":144,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":2,"elements":0,"members":{},"name":"float2","rows":1,"svc":"Vector","svt":"Float"}},{"flags":0,"name":"u_radius","samplerSize":0,"size":4,"startOffset":152,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_expand","samplerSize":0,"size":4,"startOffset":156,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_effectType","samplerSize":0,"size":4,"startOffset":160,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"dword","rows":1,"svc":"Scalar","svt":"Uint"}},{"flags":0,"name":"u_alpha_value","samplerSize":0,"size":4,"startOffset":164,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"u_alpha","samplerSize":0,"size":4,"startOffset":168,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}},{"flags":0,"name":"depth","samplerSize":0,"size":4,"startOffset":172,"startSampler":0,"startTexture":0,"textureSize":0,"type":{"columns":1,"elements":0,"members":{},"name":"float","rows":1,"svc":"Scalar","svt":"Float"}}]},"dimension":"Unknown","flags":1,"name":"UIConstBuffer","numSamples":0,"returnType":"Unknown","space":0,"type":"CBuffer"}],"signatureParams":[{"componentType":"Float","mask":15,"readWriteMask":15,"registerIndex":0,"semanticIndex":0,"semanticName":"POSITION","stream":0}]},"srcName":"position_vert.hlsl","target":"Vertex","vsd":[]}]}DXBC+_aXSj7b\Hy! DTDH$,`|SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV04 POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`5DXILBC! , #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L<#%9P( PRCDb"'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GCB(2((,2("( yLFj,L.l,LL.mm=271 47float4xX@h|0c{ cdAcS `F06 "h0PwcS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X`=(yq +{*{+{+{K{C #+{Isc#+{{JszsAccK4jj\]ڛ"h9@ b6F消1`8>v_fragmentColor!o 0bEW7&GFÌ-N]ݛ[ "hy E 0B + ! ` + 6TL @ ` E `o,b <:80@AL@ @6l&j: pjj +K#bFGGé-N. nj-ƇWL"h@(A0W"h@(A03P +qP @a8|,bFB0p_21! $×"hLA(A0%3T +qP @c8|,bFB0_31a D׌"h\A(A053X +qP @e8|,bFB0p_41 d"hlA(A0E3\ +qP @g8|,bFB0 PA(B)B*B+B,B-B.:7ipaLؾ…m(_I P,= +@E `P~꾚䀀f~HH`fH`f-MA9x9p+ãzc{[f|/2<77979::329 179& m @@l?u_effectColor@UIConstBuffer@@3V?$vector@M$03@@B&ց}х ~䀪䀀f~H䀚H`f-M;x :P*s#zc{} U% ՙXؕѽ5 m[ytQ5&5{c{Jzs33+!+{j"ڶ4A-@k̍Lnd272979::329 179& m @^@D1(/0979::329 &m @@D}U% ՙ4 m[~ SUffV6FGWF.͍L\ڙ[H 0815$AOWYU\PUЛPYLж @ : 6u_alpha_value068/0279::329 &m @*^@<}U% ՙ4 m[h $~`AVGF-  *imN̬LhIhLĄ7ԡaA!$R%^B&F=! L09327 FL $ ĪLn.m6  41:24::49430:47::::(!47::)/022:9747::/3277793 B܃".:.9:.:94902941:24::494`2–6V6WEWGVUvV֠Р0&VgfV&R46G'TgfV&"Wv6GW&"ҠנbFGGRdF'ӠbFGREWG7&ӠbFGRUffV6F7&ӠРbFGR5G&G7&ӠbFGRUF6&ӠbFGR5&ӠҠbF'R5VFW&ӠbFR%FV7ӠbFRUFӠRFRUffV6FGWӠbFReVWӠbFRӠbFBVGӠbFG2&ӠзӠР0G'W7Fb5WGՠנbFG6F4DӠзӠР0G'W7Fb5WG5ԠנbFG6F4DӠbFG5&2$ӠзӠР0G'W7Fb5WGEՠנbFG6F4DӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5WGE5ԠנbFG6F4DӠbFG5&2$ӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5TGWGE5ԠנbFG6F2e4DӠbFGb6F4DӠbFGbe&vVF7&2$ӠbF'bEW7&GBU5$EӠзӠР`Fb&WvDTGbFbFrҠנ"WFW'r"ӠзA Z(PрВD4(yq +{*{+{+{K{C #+{Isc#+8ս8ɕձͽȕɽՑս̡t^^^^^^^^^^8hi*k+#"+;r B,Ƃ,ʂ,̂,-B-&1A@ [I6l&a h C[Ć.6 lau1Ap ]pzKK{s $!i6m1AH BlX"/b//آ//"POSITIONڰh_EhE__,&ȲA ذh_EhE__"') N^_[N 0 `2eE&wVF7AH K[^_[E[EilXcÐl(p `WG7.B`C @O#0XG=*`z\ ] ؙXݔ`&ٵձMj'ٵM r[X؛]a'|[X YY[ܔ`E2V'7VfVV6%:dx.source.argsSBbW&76%h&dx.valverSC2FV&FV6%Jdx.typeAnnotationsSCbVvD6EFW6%:dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m[,WBa \A,D#3@Y0 &# `T ÌApw AqPpÄ0b EM@L#`P`??0a$rUT ٨?L# ``V%5Ƅ0b f ZȪ?L#`Ph? ?0a ApÄ0b  fL#FqA 01M0a$ӴA 01MN0aSTAT`@DXILBC! 7 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 2L &GC("((B*2("(ڱ yjLFD oM $Efe%&,f&gl&eCLa@  Ql `@,ˆ0 J3AX Cj),͍˔\]ڛX&! &E3A( !MTe qD&ųa骴.`@,&1A mXn*m Pa ==ImX<1J46cd*LnP@ &3".0 P(Q49 ИK;b#  +9 AA666427)AP ŮLn.mJ@4!s c+u\ئH%2<< 7707)AS ..l.lJ!s)s˃zKsA2<:72)yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$6ee0bdb46dbdfcdad66b3a3db729b12f.pdbHASHnུmk:=)/DXIL(`JDXILBC! A #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 2L &GC(b(2((B( rByTLFD oM $Efe%&,f&gl&eCLa@ a0(McÀ$a6Ah@M5qzKK{s X6`&Ea!(a"(TUғp6,Q5LLӓ@&DAظ KAt SFuD6,Q5\l *&SV_TargetٰbD Au20A1fFVF7%ؕͥM &dx.valverSZY\Y۔ CbVvD6EFW6%XṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma A,D0P +T%# ``P!ÈA UH1b e@SR$q# `\FU1ˆA  QU0b eTB$rUDXBC6cS AI.o/ DT x(((SFI0ISG1hqwPOSITIONCOLORTEXCOORDOSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV0@41 8POSITIONCOLORTEXCOORDPOSITIONCOLORTEXCOORDVSMainD +DBDD"D(B ILDB`tDXILBC! k #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L (2"H d""ㄡL Lp#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!AP B0q$FGswEiiPss9r2 rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCJe@ J` ʡ$ +0@ +8 +P@ +Vp +X +Y +[<(@!1A#;@x c1"  + H yL d! k+ b+ +sAcc4@ oM $Efe%&,f&gl&e@j),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h S\477float4xX@h|0c{ cdЀas `H0> "h$0Pws a6O4U< )c+k+s{sF@0(&1 ۸ Ma 0 <`X`䈃9}ͥѥ-bF 90 0 ce&vVF7&28`$D]ۛ 30:Bvectora 0`1@ 8``04P L+866 `m0 40571uB38`d`cPq0 &x09b5WGE5D% m..m4upH<¾1@sP +z{#[Mlp +`"a<ЃI0*`{A>4@L` ~ |ڞ܎Шɽ=1ѡe555im4(#DR<D (&+0:4<"float4x4xX@hX@h|8|,bF0`8|,b00_13q W "h`A(0%Y +xp @b8|,b0_23 4× "hpA(05] +xp @d8|,b00_33 T "hA(0Eq +xp @f8|,b0_431 t "hA(0B+B,B-B.B/B8C9C:0{{sVpdk΍nZA;l܆cwB*:;BXf +)N. *imN̬Lhꇤ-N. ffHh)Q/2<77E `` ~䀪䀀f~H䀚H`f-X==*33+zc{c} U% ՙXؕѽ5 m[}8{ S5G&G7&G8 zc{Jzs33+!+{j"ڶbp$@̍lMnSUF6&T46G'TgfV&4cCbW6F&D3$m@PGۛ kM*imN̬LhĮlMfHhHı272E `p ~䀪䀀f~H䀚H`b-XII #K[f~怪䀀f-XJJ*à s#cSUFT46G'TgfV&4$mĢ%\xTLWYU\47:2unsigned int{ d XVL0"0?u_effectType@UIConstBuffer@@3IB@,`&&}}مՕQ ~¾ʀ䀀f-XDNJ +cC #ST46G'TgfV&4$mb'xTY28:479::329 &m >Ǥ@z} ` 0` +al@6 l0%23$7727 lؠ,bC0]F@Dܾ\D蠨@P@蠨@@R@@@@蠨@@z@P蠨R`v@@@@\@z@\¾v@@@@\\@z@ڞ܎PX@bRv@@@@\\@z@b\`v@@@@\@z@\¾v@@@@\@z@\¾v@@@@@@@@@v6AZpt긨Ҹʸܾ\ [X\]ݗ[XWY[YB˜XYHUЛPY\Y]XLJ^[  HWTS\N[ H]ۛN[ HWYۛNB[ H]ۛN[ HWۛN[ HۛNH[ HX]N[Hݗ\YZN[HW\NH]HWYU\N[HWZؗ][]N[HWZN[YN [ ۛNBNB\\\T^[ H\]ڛTUғNBNB\\\P^[ H\]ڛTUғN[ HۛӓNBNB\\\U^[ H\]ڛTUғN[ H]ۛUӓNBNB\\\P^[ H\]ڛTUғN[ HۛӓN[ H]ۛUӓNBNB\S\P^[ \]ڛȔTUғN[ \]ڛTUғN[ ݗ\Y[ۛӓN[ ]ۛUӓNBNB[[\Q[ []J^\]]ʋNBa-bCPh)BEn BKѠH)lElNnl.e-Ln%mPVVWvVRvV2&WFVV6"WFV&6VGVV2FV&7S(yq +{q ++r;Ks+{y{Isc#+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ- + Y6z E_P ͆/@c/&Jzs33+ d/Dc4B/4 Ail 4 Bfc Lha{1A@ hԃYj6fd`?EljLj`1A@ hYԆj6Qfq`FJEnjLl-a1A@ m0@&̢7T7&ȶ 0 P՘ 4v,C5Vct X iklІmnoxdža/P<6 {A0aC zzJJzr $! ^L0 YlX===">=ӓ6fQxxx BU5$E4AH`!2e6F6AH ^{|ć^^}lX==#?">=caxx@HlCD #r:::q "P"1zd`؀: u`'@ @O Hs! +-"|'0XG=`z,`h: u` @OHL2XG=20A8`\H)P8.:`\H)H8z`866623)AX8bcksi{#c+s1c ;"YXacksI#+s%2<:27727)BZ#2<:224)` eNn̥-,()lJv\\xa ŮLn.mJN\}a e-L鍬mJf\a υ.,..mn`a ..l.lJv\#yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ&0 <<mpK(5=mβT?_ Ea ~A,DFhP*B3%WvEAgAF0 c&L: v0A8`pȃ ¡&# `@A 3$lh0 sP30b A0b ÌaD$2njP%3 AQ5?4q?0c@(# `,ʌA(#`PAn?F +A (um2c@` + wP330b ā03 A5?@t?0c@(# `܁d͌A(#`PAQl?L# `<΄0b  0Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  `ÌaD Ae?Hv?0a A6?Hv?0a A5?Hv?0aAtMI0  |PEØ3A)Ȉ |`Ø3t#h1 )όQ)Ȉ ~C30b `Ä0b ` Ä0b `Ä0b `Ä0b `Ä0b `pÄ0b ``Ä0b `PÄ0b `@Ä0b  g +A 0|Pt@T1a$e@tA 0|Pt@yM# `A|΄0b  AL# `At΄0b  AA8A 0|Pw@2a$ept@%A 0|Pw@2a$eptDŽ0b  L# `AP˄3S&S"4ҴQEADPEADSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L &2"H d""ㄡL Ld#%f`) BR˟|n1T.BC0Bm (#Gp ``#a#M 9"4ҴQEADs9dA6rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P .PPPPPP*P+PP-PQ8QTJb 3b'D@@AyLFD oM $Efe%&,f&gl&eCLb@  ql \g*imN̬Ln@ BYa` A Xf +)N. o@$B0L4A LfDUť nMn@8ـ YY6*33+zc{ *ϺL]ۛ6 Ta`]D̍lMn@Hd *2mQ5&7A bX6+s+ IJ k}ɅMjAE .̍l@X *8.2u_effectType j,:`SeVW6A bX068 m0# `Aef# `Aefp# `Aef# `Aef=# `Auf9# `Aufp9# `Auf9# `Auf9# `Af)# `Afp%# `Af!# `Af# `A%f1# `A%fp-DXBC{wxr&L/ DTD x'''SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0`4 POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`|DXILBC! s #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + cAp<yLFDn,H.,L.mm=271 30=@!0h@M50c{ !dW6F&cFBo4`p0 1@g0[#` +n4`p8 q G[Y[ݲ 6element_count\`1XXAI ( 0,b+ E:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3A`L.쬭̍nMn4et  Th+{1c{ cY"4p`Fh0 LcZrI (,4E МGt 1 3I0:`sA`u0AU ,plKWTS\30:<Nmatrixbb1@B10bd1@B1 E ЄP` ++f4 `pYM)8` 1dd1@s +B1X /E ФP`Kf4 `pYM+8` 2fd1@ +B1 E ĂP`*kf4 `pYM-8` 3hd1@s B1 /E P`:዆f4 `lDLT\dltȽ}չM+8,c25VF7lPB8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mB+K]ۛ"0}ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶg@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mKJWۛ ̍lM*imN̬LhĮlMfHh<ç779AOۛPUЛPYЌ]ݛP ж8zoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7}ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-YDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhK' 28:4j?depth@UIConstBuffer@@3MB,bB&}ѕɕ*ã+!+{1c{ cY6!I Ԅ@Xp  N hꇄ NLĮlMf(hM@682/2SamplerState ` 0 ̅}TMMхѕm[ REWGW'W7+ã+!*ã+!!+{j" +ڶga!8d. L+^\X[W LTX[]]Pж8 9;=>HDKLOEYzB6Dwarf Version6@QXHU\ڛA6 mk!S#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); +Texture2D u_texture1 : register(t1); +SamplerState sampler_1 : register(s1); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 texColor = u_texture.Sample(sampler_0, input.v_texCoord).bgra; + texColor.a = u_texture1.Sample(sampler_1, input.v_texCoord).r; + texColor.rgb *= texColor.a; // premultiply alpha channel + + texColor = input.v_fragmentColor * texColor; + + float4 ret; + ret.rgb = float(0.2126*texColor.r + 0.7152*texColor.g + 0.0722*texColor.b).rrr; + ret.a = texColor.a; + + return ret.bgra; +} +-E:\Nau\Test\resources\ui\shaders\include\cocos_in_out.hlslid-mm싮 -,ͭAAaL̬L*imN̬LDD,mLE,&AaAČ- +)N. oAČ- nMnAČ-̬lnMnAAČ-k.LnMnAČ-̍lMnAČ-kMnAAČ-Nk̍LnAČ-K.,nnAČ- .̍lA.͍̬l*lAČ-+ -.lAČ-+ -lAČ- mAČ-dMnAoAAaNnj. AaAČ-$ m.. Di**iAoAAaNnj. jAaAČ-$ m.. Di**iAČ-$kMDdIjAoAAaNnj. AaAČ-$ m.. Di**iAČ-N$싮 oM DkIhAoAAaNnj. jAaAČ-$ m.. Di**iAČ-$kMDdIjAČ-N$싮 oM DkIhAoAAaNnjjAaAČ-m.. Dd i**iAČ- m.. Di**iAČ-L.쬭̍nMDdIjAČ-N oM DkIhAoAA-L 툉  Ō-DČ-.AaADN Eo.EfAoq!(Qh7eC%hPVBU6G"W6V'7V6R2FV&76VGV?(yq +{q ++r;Ks+{)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+)8ս8ѽՑɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kCCH]]]]^E_Ld( lB4(Mf@ 4PcCA8 6 jL6k/Zc,@/4 k566 A06e m..m<!&aЍ @=M%Q%=9Mizbz a-c1D6k( @xy0 +;+ $Ԇ47C7x/v4xc<6a@6wGl,%@{ +: u`'@ @O #0XG=.`@ oMn\܇tzu`'@ @Op+ !Htacks!;sE#6667:23)ZE666427)[T"s{+s{s+s"E\4"s{+s!+3Ks+ \\܌ʜʦrQ eNn%LlnJU\ܦф .ͮLnJ u\ئQ ElNnlnJ\ʂQ ..l.lJPu\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa PA, +DFhP*BW +3%Ggg3rtoٹf0# &L5 g0A8`pဃ  &L: v0A8`p# `@yEiʌHx$-A P`pTL# `@bq\3a$Rau2c@(# `,A (g0b]̄0b E Ä0b  +L#`Pz?L# `AA`΄0b @Ä0b AL#`Pz?L#`Py?L#`P}?L#`P|?L#`PA{?L#`Px?L#`F,c02c@0 0a&00 pCC30b Ä0b pÄ0b QX$sg@=3D#0 rÞ30b Ä0b Ä0b Ä`!2<F 6>1 A0(`=& A0(@=& A0( <& [&`A!b0ƒό 1 7L>3dxXgƀF +X@E>3Ĵx Aq?? |C@Ä0b P?0a Ar??L# `AA0c@X# `AA0a$a0s0b A(N@FC #un8غ >rI$̳O< YI$̳_< 01ԷԸT?DEDO5QۃP?DE?DEoSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePEQ>@$ʠF@<q yLFD oM $Efe%&,f&gl&eCLb@  ql X/2<: Ld@4BYb`J]]\Y̆dP b <̅}l@"̅}l@"6յ `@lۆ0 Z7AȮ Gj),͍˔\]ڛx&! &E4A( !c@e`gzJJzr ӆeH182P 3X =1=IMe@,6p cpe0gD6m6182PA `ksd*LnPP 3 6wa<6ZA0c{  49 ИK;b#1v5G7A "tex_norm=>?@@!DfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥM :dx.viewIdStateSK\[ܔ ṌչѕM DyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$22005489c1231ff3658be37a38c4f76e.pdbHASH"T#ez8nDXIL|`DXILdBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@<q ynLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<aaahgEڀCl@!6T dՆ  47.SV_Position Ά 6,y `@@i**iPDa 0`! COLORb  `ҘA `ЄA*zz" lX` 0` 36@AA0 +;+ ҆x04 Ph\@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)U ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma RA, +F+B(9c8{7F;c7# `uEqˈA @!q3b wT׌$yΈA dh_$Q3b 0^\͈A g|b9# ``c=# ``dA#`РF,eP2 B00#`а0J@ψA  y uPk$bPu@A  y uPj$bPu +DXBCk!:, DTDd8%l%%SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0`4 POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + cA@<yLFDn,L.mm=271 30:Bvector X12@ E %`0["Z`@o4`h ( E <%`0q element@Jؔ}չqHscdPĘVp@Ya&A`@B0 l4ܸE:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3`L.쬭̍nMn4el  Th+{1c{ cY!4pEh 0 LcZearI (,4E МGt 1 3I0:`sA`u0AU t,plKWTS\30:<Nmatrixbb1@B1 0bd1@B1  E ЄPC` ++f4 㐀pYM)8$` 1dd1@s +B1 X /E ФPC`Kf4 㐀pYM+8$` 2fd1@ +B1  E ĂPC`*kf4 㐀pYM-8$` 3hd1@s B1  /E PC`:዆f4 㐀lDLT\dltȽ}չM+8b25VF7k0B8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mB+K]ۛ"0 }ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶg@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mKJWۛ ̍lM*imN̬LhĮlMfHh<ç779AOۛPUЛPYЌ]ݛP ж8zoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7 }ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-YDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhK' 28:4j?depth@UIConstBuffer@@3MB,bB&}ѕɕ*ã+!+{1c{ cY6!I Ԅ@Xp  N hꇄ NLĮlMf(hM@682/2SamplerState ` 0 ̅}TMMхѕm[ REWGW'W7+ã+!*ã+!!+{j" +ڶga!8d. L+^\X[W LTX[]]Pж8 9;=>HDKLOEYzB6Dwarf Version6@QXHU\ڛA6 mk!?#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); +Texture2D u_texture1 : register(t1); +SamplerState sampler_1 : register(s1); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 texColor = float4(u_texture.Sample(sampler_0, input.v_texCoord).bgr, u_texture1.Sample(sampler_1, input.v_texCoord).r); + + texColor.rgb *= texColor.a; // Premultiply with Alpha channel + + return (texColor * input.v_fragmentColor).bgra; +} +-E:\Nau\Test\resources\ui\shaders\include\cocos_in_out.hlslid-mm싮 -,ͭAAaL̬L*imN̬LDD,mLE,&AaAČ- +)N. oAČ- nMnAČ-̬lnMnAAČ-k.LnMnAČ-̍lMnAČ-kMnAAČ-Nk̍LnAČ-K.,nnAČ- .̍lA.͍̬l*lAČ-+ -.lAČ-+ -lAČ- mAČ-dMnAoAAaNnj. AaAČ-$ m.. Di**iAoAAaNnj. jAaAČ-$ m.. Di**iAČ-$kMDdIjAoAAaNnj. AaAČ-$ m.. Di**iAČ-N$싮 oM DkIhAoAAaNnj. jAaAČ-$ m.. Di**iAČ-$kMDdIjAČ-N$싮 oM DkIhAoAAaNnjjAaAČ-m.. Dd i**iAČ- m.. Di**iAČ-L.쬭̍nMDdIjAČ-N oM DkIhAoAA-L 툉  Ō-DČ-.AaADN Eo.EfAoq!(Qh7eC%hPVBU6G"W6V'7V6R2FV&76VGV?(yq +{q ++r;Ks+{)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+)8ս8ѽՑɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kCC]]]]]^E_Ld( lB4(Mf@ 4PcCA8 6 jL6k/Zc,@/4 k566 A06e m..m<!&aЍ @=M%Q%=9Mizbz a-c1D6k( @xy0 +;+ $Ԇ47C7x/v4xc<6a@6wеGl,%@{ +: u`'@ @O #0XG=.`@ oMn\܇lzu`'@ @Otacks!;sE#6667:23)ZE666427)[T"s{+s{s+s"E\4"s{+s!+3Ks+ \\܌ʜʦrQ eNn%LlnJU\ܦф .ͮLnJ u\ئQ ElNnlnJ\ʂQ ..l.lJPu\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa A,DFh(R(R #m4VC}#D< /̳D< /̳T?DEDO5QۃP?DE?DEoSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePP8@$ʠF@< yLFD oM $Efe%&,f&gl&eCLb@  ql X/2<: Ld@4BYb`J]]\Y̆dP b <̅}l@"̅}l@"6յ `@lۆ0 Z7AȮ Gj),͍˔\]ڛx&! &E4A( !c@e`gzJJzr ӆeH182P 3X =1=IMe@,6p cpe0gD6m6182PA `ksd*LnPP 3 6wa<6ZA0c{  49 ИK;b#1v5G7A "tex_norm=>?@@!DfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥM :dx.viewIdStateSK\[ܔ ṌչѕM DyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$c4e6d6dd86889d919fb939255d551c48.pdbHASH݆9%]UHDXILX`DXIL@BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@< ynLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<aaahgEڀCl@!6T dՆ  47.SV_Position Ά 6,y `@@i**iPDa 0`! COLORb  `ҘA `ЄA*zz" lX` 0` 36@AA0 +;+ ҆x04 Ph\@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)U ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma IA,FBɕBQ)3# `ieȈA @dY2b wHۦ$!Ӷ-# ``rq2b ,Xw0# ``yT3b 4ܗ8# ``ӁA$a4b M4a"b- 0  0b MD$cfP= `" B>0|F  ޠ A0@`{7ȈA0@`{7 c @ 9 @DXBC8Ro3 OaSb0, DTD|$$$SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV004 POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`DXILlBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + cAp<yLFL.,oj,L.mm=271 30=@!0h@M50c{ !dW6F&cFBo4`p0 1@g0[#` +n4`p8 q G[Y[ݲ 6element_count\`1XXAI ( 0,b+ E:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3A`L.쬭̍nMn4et  Th+{1c{ cY"4p`Fh0 LcZrI (,4E МGt 1 3I0:`sA`u0AU p plKWTS\30:<Nmatrixbb1@B10bd1@B1 E ЄP` ++f4 `pYM)8` 1dd1@s +B1X /E ФP`Kf4 `pYM+8` 2fd1@ +B1 E ĂP`*kf4 `pYM-8` 3hd1@s B1 /E P`:዆f4 `lDLT\dltȽ}չM+8,c25VF7lPB8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mB+K]ۛ"0}ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶa@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mKJWۛ ̍lM*imN̬LhĮlMfHh<ç779AOۛPUЛPYЌ]ݛP жzoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7}ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-@XDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhK' 28:4j?depth@UIConstBuffer@@3MB ,bB&}ѕɕ*ã+!+{1c{ cY6!I Ԅ0Xp  N hꇄ NLĮlMf(hM0682/2SamplerState ` 0 ̅}TMMхѕm[ :C<=?JL̄NĨ'  < `Ct&gbU&7ah(՝$XͥMddQ736VGV"266VG6ǖ&ҠР@UGW'W&CREWGW'W"Wv6GW&BӠ0V&7EFW2V&"Wv6GW&2ӠРР`FG5b5TGWGE5WG2eE&wVFננbFG2REWGW'W2V2V&WGbEW7&G"v&Ӡ2WGbe&vVF7&2ӠbFG"W6WFӠ"W6WF炗bF"#c2"rS#2rs##2"₇Ӡ"W6WFr2rӠ"WFW'"W6WF"v&ӠנAЂ{PVEU6G%W6V'7V6U5FV&7Ǖ6VGV566VG6ǖF ^^@Fʾ@@t@PbR@@@@hh@꾚v@@@@h@v@@@@h@v@@@@h@v@@@@h@Ȇv@@@@h@v@@@@@@@@d@v@@@@@v@@@@@v@@@@@v@@@@@¾v@@@@@v@@@@@v@@@@^^@h@vv@@@@@h@¾@t@vv@蠆@@@@h@¾@t@v@@@@h@¾@t@vv@蠨@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@¾@t@v@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@@t@v@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@ڞ܎P@X@@R@@@@@PVR^dv6jBK*ps_6_0ZE:/Nau/Test/resources/ui/shaders/include""42477:27241:9029B΋SX݋SX]Y[[\K[Y؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ64n\ą\\]ԅ]I&A !/a6 ~z1AȪ lB46$z4zm! fm@4vB/"/456 zA06e m..m<!&aы׀ؐȋ @=M%Q%=9MiÒ!zbz ,tc!D6eQ ؠ ٸ @no0 +;+ $ԆE/6C6h#/fC/hc76a6wGj,%@y: u`'@ @O #0XG=.``l\tzu`'@ @OА+c !,tacks!;sE#6667:23)XE666427)YT"s{+s{s+s"Z4"s{+s!+3Ks+ \\܌ʜʦlQ eNn%LlnJpU\ܦzф .ͮLnJu\ئQ ElNnlnJ\ʂQ ..l.lJu\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa A, +DFhP*BWr3@gg3rtoٹf0 &L4 e0A8`pp  &L8 s0A8`p# `@yGeʌDx$!-A (cuۄA (d$A (e`Uʄ0b Ä0b Ax2a Ar?D?0a$rc L#`PҨ?L# `ḧ́0b 0Ä0b 0Ä0b 00Ä0b 0 Ä0b 0Ä0b 0Ä0b @aIa$3D0hL 0a&Ä0b Ì0x As?`?0a Ar?`?0a Aq?`?0aX`gƀPA0( LPf `@ +8! `@ +8x! `@ +8p! H>3xX@gƀ`<<l3c@(`|f f !ό\1 0E>3xgƀ`A0(0 !ba1@RP0F :€S& A0(0 ` @ ; 1 A0``{7 ` @ ; 0F  ' p 3m3f3m0FI,Dӿ0BD6BQD\D\=STAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePeSTJ +a + cAp<yLFD oM $Efe%&,f&gl&eCLb@  ql X/2<: Ld@4BYb`gCL\X[$`C0m &0׵!6 M2kCрj +Ks2e6F6A( Bl BMhBx b@@i**iPH 13`ӓP&IJAH5ذ0hA "') B% 00 ` `Agod*LnPL">91Ā5PX]T 309insts1vFFc.kn@4D6(wA|C666427)AP ŮLn.mJ@4!s c+u\ئH2<:)U υ.,..mnJ!sK+K" +lu\uЅ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$99b3ac6d37a3841256a4097838418ea3.pdbHASHm7V x8ADXIL,`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@<q ygLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hQBbb dՆ  47.SV_Position Ά 6,q7xzJJzr цe``1$5A l 6, l_'|g@kIhPea)4ؾN 1(O 6`0hL&a!`s<; l ATacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+Pu\ȦʦV2<27:<47)AyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma EA, +F+B(c8{7F;c7# `uHmˈA @^Bq3b  X7%# ``Ay2b (W-# ``ҁÌ$aV3b 4hΈ 4f!Q$&h& h1X`H>e|lc% g @ :  1H80F - A0@`8HDXBCOb~_*`k.a 6 DTD# -T-p-SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0H4  POSITIONCOLORTEXCOORDPSMainDD +DBDILDBD!`QDXIL,!BC! H #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L ^2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX#} 1~䀪䀀f~H䀚H`f-@XC;|G: zc{#}х U% ՙXؕѽ5 m[xxtRUF6&G7*s#zc{Jzs33+!+{j"ڶa!)kMkS5&T46G'TgfV&4cCbW6F&D3$m¢[HX]"08?u_center@UIConstBuffer@@3V?$vector@M$01@@B ,A&}Ʌ-b3Hv?u_radius@UIConstBuffer@@3MB ,>} *à s#Jzs33+iڶa!=@̬l*D]:32247=@%`p,b$0 `I 231:<279::329 $m #@l¾(?u_alpha_value@UIConstBuffer@@3MB ,V%x} +cC Jzs33+iڶa/I ZYPUЛPYLжo &u_texturedxxX@h|@| mlb5!`@7+ã+!*ã+!!+{j" +ڶaA9!8d. L TX[]]$xB( z?sampler_0@@3USamplerState@@A ,v''6<p"-3?1 a.݅əXͥm@,.JDebug Info VersionD0Yņ`#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 sample = u_texture.Sample(sampler_0, input.v_texCoord); + // fontAlpha == 1 means the area of solid text (without edge) + // fontAlpha == 0 means the area outside text, including outline area + // fontAlpha == (0, 1) means the edge of text + float fontAlpha = sample.a; + + // outlineAlpha == 1 means the area of 'solid text' and 'solid outline' + // outlineAlpha == 0 means the transparent area outside text and outline + // outlineAlpha == (0, 1) means the edge of outline + float outlineAlpha = sample.r; + + if (u_effectType == 0) // draw text + { + return (input.v_fragmentColor * float4(u_textColor.rgb, u_textColor.a * fontAlpha)).bgra; + } + else if (u_effectType == 1) // draw outline + { + // multipy (1.0 - fontAlpha) to make the inner edge of outline smoother and make the text itself transparent. + return (input.v_fragmentColor * float4(u_effectColor.rgb, u_effectColor.a * outlineAlpha * (1.0 - fontAlpha))).bgra; + } + else // draw shadow + { + return (input.v_fragmentColor * float4(u_effectColor.rgb, u_effectColor.a * outlineAlpha)).bgra; + } +} +-E:\Nau\Test\resources\ui\shaders\include\cocos_in_out.hlslid-mm싮 -,ͭAAaL̬L*imN̬LDD,mLE,&AaAČ- +)N. oAČ- nMnAČ-̬lnMnAAČ-k.LnMnAČ-̍lMnAČ-kMnAAČ-Nk̍LnAČ-K.,nnAČ- .̍lA.͍̬l*lAČ-+ -.lAČ-+ -lAČ- mAČ-dMnAoAAaNnj. AaAČ-$ m.. Di**iAoAAaNnj. jAaAČ-$ m.. Di**iAČ-$kMDdIjAoAAaNnj. AaAČ-$ m.. Di**iAČ-N$싮 oM DkIhAoAAaNnj. jAaAČ-$ m.. Di**iAČ-$kMDdIjAČ-N$싮 oM DkIhAoAAaNnjjAaAČ-m.. Dd i**iAČ- m.. Di**iAČ-L.쬭̍nMDdIjAČ-N oM DkIhAoAA-L 툉  Ō-DČ-.AaADN Eo.EfAok!(Qh7eC%hPVBU6G"W6V'7V6R2FV&76VGV?(yq +{q ++r;Ks+{)s;Ks+{{+{i{#c+{+s#+{Isc#+{q {C #+)8ս8ѽՑɕձͽȕɽՑս̡qhJcU&VFEV&Vwơ +kC[E\E\E\E]]Le0Ћ l/(Mg &ȳA ؐEhЄ^E^^Ɔ4&cl& 8 ȋ@ `C2H ^N^^@1A30\WLhzQz1A@ _CYFl6eQ!`;mĆhLjP1A@ _CYFl6e!`?oĆhLl Q1A@ m0b$bL>#/C/?6'a 6wХk,%@: u`'@ @O #0XG=.`@c. l\̈l.KȼѱKfU2tDYE#B*bV]\\`шͮͥ퍬Ō-ln eQͮ%̍nJ`\\h\\C-2<:24742)[!s{+s ;E2<27)^4!s c+E2<90272)_!s+{+F%2<< 7707){G2<$)0)A|!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q !` l;/TQQCIm[6\B@0ܶH;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa F,DP6@I 2PreWxEA 0 +C&L> x0A8`p  +# `!A$3R0b 2a$ȴlL# `Tʌpx$rqm,A (x q3a A=?@p?0a$s o4 {CÛA (z@s3a A=?Hr?0a$u@q= }4Û }4 }4 }4C }4 }4C Dz$Q(J ~Ú303R0  C30b (`Ì1-xU#hBL QY:2B0c@T #`pq 0a&00h1W(`A"zf Jvn@ f l`@ R(81 88`4!& !0FaM f˜1 2GG\:`$,3c@p#,A1c@pIFP1 `|%(f 0H|8bhC j !j dƀ`G0+d ` @ \X<f 11H&B` ` @ \X<& A0`r!`0pUЦUԖU؆UF5OcV4~Mە?_VUOvS"4ҴQEADPEADfI,Dӿ0BDVCQD\D\=STAT8 `NDXIL BC! E #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L [2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@QOCH>QJL>rۈ (C0AG ?a!F+1m#b4` *a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C82$ȆÑj]siڨ "tYe7 0 $M%L> 0BDL + +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30`,2L &GC"J`$ +\ʠ +04 +4 +< +T` +WJ +ZʣĨ(2("(jf qƱ AyLFD oM $Efe%&,f&gl&eCLc@   l pg Nl@(b ͆P<0H6UIConstBufferـD l 682/ a]1@@@M>4RdF'7A C1™ #REWG7&7A Be"ڠ b4 AǦ̬lnMn@H >4!2}х Mi`ДAG̍lMn@P >7 :u_colorڀ p4e+s+ )Hݗ\YZ6|w 2<07 m0< 2u_effectType" ჯ2`SeVW6A  +_(Aã+ -l@p d>RY6)|g +3H6x9<؃?R@ A6XaC +a\a0k!PSMain\&L0B &lXYZ[nTUғ ˠ - zbz  -0 D6߷apva؅a d*LnP(Z0[\ 9l *B:h1019floats,&G"͍n\9:"tex_normu`ءiwxxafFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%*хѥMRإ%MхѕM `K\[ܔ ṌչѕM yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm6\B@0ܶH;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$23481024e7d8bbaecb0ba2029081988d.pdbHASH#H$ػ DXIL`%DXIL|BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L \2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@QOCH>QJL>rۈ (C0AG ?a!F+1m#b4` *a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C82$ȆÑj]siڨ "tYe7 0 $M%L> 0BDL + +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30`,2L &GC"J` Jʠ<(2("(f qƱ AypLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$Le@0ِ CCC<hh6 0j `Cpm "&cm Ѐj +Ks2e6F6A( Bm B!MiBx b@@i**iPP 13`ӓp&ijAH5ذ4hA "') B% 00 ` `Agod*LnPT">91Ā5Pp]d@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)V ..l.lJ!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm6\B@0ܶH;/D0! ap/0CM~q6 <0Bm@5\DJM5ma eF,TPQD @)\^Q0F 3# ``}uˈA X`pTnj$A3b 0TˈA hla0# ``Ռ$$P$<AMDhB&È @m)hB 7k T&h& h1Xgn@ F `F`4AFa4f°|,3KPAgbchA j !j A+CF Q7 Rȃ` @ UpR 8F Q7 Ra @ UpR = DXBCQ3 vPmp6 DTD4$t---SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0H4  POSITIONCOLORTEXCOORDPSMainDD +DBDILDB!`fDXIL!BC! ] #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L ^2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX X12@ E %`0["Z`@o4`h ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A`@B0 l4ܸE:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3`L.쬭̍nMn4el  Th+{1c{ cY!4pEh 0 LdZearI (,4E МGt 1 3I0:`sA`u0AU t` plKWTS\30:<Nmatrixbb1@B1 0bd1@B1  E ЄPC` ++f4 㐀pYM)8$` 1dd1@s +B1 X /E ФPC`Kf4 㐀pYM+8$` 2fd1@ +B1  E ĂPC`*kf4 㐀pYM-8$` 3hd1@s B1  /E PC`:዆f4 㐀lDLT\dltȽ}չM+8b25VF7k0B8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mB+K]ۛ"0 }ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶa@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mKJWۛ ̍lM*imN̬LhĮlMfHh<ç779AOۛPUЛPYЌ]ݛP жzoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7 }ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-@XDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhK' 28:4j?depth@UIConstBuffer@@3MB ,bB&}ѕɕ*ã+!+{1c{ cY6!I Ԅ0Xp  N hꇄ NLĮlMf(hM0682/2SamplerState ` 0 ̅}TMMхѕm[ :C<=?JL̄NĨ'  < `Ct&gbU&7ah(՝$XͥMedQpՑ}}ѹͱ4(4(Pɕ}ѕɕȕѕɡ4(LMхѕ̅}ȕѕɡ4(4(р@M5X=AQ ѥ4(LY}Qɝ5(5(р̅}ѕɕL̅}ѹ}ѕ ɑɅ4(Ā́Сɕ̽Есܥѡс4(́СɕͥЕѱՑѱɕ5(Ĥ́СЕ5(с̅4(4(ѱĀ́Сɕ̽Еѝ̽ѱ4(ѱ́СɅɕсɕͥЕсѱ5(ѱĤ́Сѱ5(сѱ̅4(4(}QɅ݁Е5(5(ȕɹѹ}Ʌ ɁѠ}ѕ ɹȝ}ѕ ɹɅ4(5(͕}QĤɅ݁ѱ5(5(ձѥ偠ĸнСɁѱ̵ѡɁСЕс͕Ʌɕѹ4(ȕɹѹ}Ʌ ɁѠ} ɹȝ} ɹѱĸɅ4(5(͕Ʌ̡݁5(5(ȕɹѹ}Ʌ ɁѠ} ɹȝ} ɹѱɅ4(5(mp9qQqɕͽɍqեq͡qՑq}}ѹͱ2/23 A/DcCAzyz1Ҙ Jzs33+ D/L4"/5 AjL 6 z;zzlXcQjA `p]m0A@ _AFYEl6e1!d`;EmĆhLjP1A@ _CYFl6Qe!`>EoĆhLlP1A@ _DYGl&ȶ( /V,#6Dctp@ m0"&B=bC468!a!qx 0AlcÐw3P A|pzKK{s $`0AH`CD &lXb>>>>?"POSITION 6,yyqy'' m?6,myqmAkIhPea)ȋ(  D~)/02 BR(0ȆDPPA"Hs!+"t'@ @O #0XG=2`zl`68q "x0#B: @O01{s bC  7"4 2outlineAlphaD@G)YE*bV9GU>"xE66623)X4bcksi{#c+s1c ;"EYTacksI#+sE%2<:27727)ZE#2<:224)P eNn̥-,()lJu\\wQ ŮLn.mJM\|Q e-L鍬mJe\Q υ.,..mnQ ..l.lJu\)yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q !` l;/TQQCIm[6\B@0ܶH;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa 0F,DP6@I 2PreWxEA 0 C&L> x0A8`p  +# `!A$3DR0b 2a$ȴlL# `Tʌalx$rqm,A (x q3a A;?@p?0a$s o4 {CÛA (z@s3a A;?Hr?0a$u@q= }4Û }4 }4 }4C }4 }4C Dz$Q(IhB L 0a A +;?Xn?0c@$ #`Pl?L#`Pi?͂ uC30bp D3c@P 0a 7w3e0A%xT3=&0 h L 0c@X#|f zόaAF<0f JznPB f l`@ S,91 68`4!& !0FaM bf˜1 0G[:`%b,3c@l#|f ~0Cτ0KP[#|f o0ēόt0f K8bP0b  b@@ : 0F RZcƀA0`zh 0F RZb1HJh ' p UUUUܦ4mUеa>B4mVطe>b5Oc]4~o7+rN#MUD UDd60BD?K,Dd5O5QO5QSTAT8 `NDXIL BC! E #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L [2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@QOCH>QJL>rۈ (C0AG ?a!F+1m#b4` *a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C82$ȆÑj]siڨ "tYe7 0 $M%L> 0BDL + +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30`,2L &GC"J`$ +\ʠ +04 +4 +< +T` +WJ +ZʣԨ(2("(jf qƱ (AyLFD oM $Efe%&,f&gl&eCLc@   l pg Nl@(b ͆P<0H6UIConstBufferـD l 682/ a]1@@@M>4RdF'7A C1™ #REWG7&7A Be"ڠ b4 AǦ̬lnMn@H >4!2}х Mi`ДAG̍lMn@P >7 :u_colorڀ p4e+s+ )Hݗ\YZ6|w 2<07 m0< 2u_effectType" ჯ2`SeVW6A  +_(Aã+ -l@p d>RY6)|g +3H6x9<؃?R@ A6XaC +a\a0k!PSMain\&L0B &lXYZ[nTUғ ˠ - zbz  -0 D6߷apva؅a d*LnP(Z0[\ 9l *B:h1019floats,&G"͍n\9:"tex_normu`ء ށ$:yٵM *dx.versionS ]]ܔC2FV&FV6%@ʐȕͽɍM Jdx.typeAnnotationsSTp:dx.viewIdStateSXCRF'F77%H.dx.countersSyyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm6\B@0ܶH;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$4cc6257e8bb24e126175e4462ad9a37c.pdbHASHL%~NauF*٣|DXIL`)DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L \2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@QOCH>QJL>rۈ (C0AG ?a!F+1m#b4` *a6vy7rzy(9 >rzxys`wz`0??=htyzx(38C8<->C=C9)=8;;C82$ȆÑj]siڨ "tYe7 0 $M%L> 0BDL + +rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30`,2L &GC"J` Jʠ<(2("(f qƱ (AypLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$Le@0ِ CCC<hh6 0j `Cpm "&cm Ѐj +Ks2e6F6A( Bm B!MiBx b@@i**iPP 13`ӓp&ijAH5ذ4hA "') B% 00 ` `Agod*LnPT">91Ā5Pp]d@666427)AP ŮLn.mJ@4!s c+u\ئI2<:)V ..l.lJ!s)s˃zKsyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm6\B@0ܶH;/D0! ap/0CM~q6 <0Bm@5\DJM5ma iF,TPQD @)\^Q0F 3# ``}uˈA X`pTnj$A3b 0TˈA hla0# ``Ռ$$P$<AMDhB &È @m)hB 7k T&h& h1X +H>F<%(:A0𠳾фMфAM Y0c% ر M>| cK'Ybcd A l g0 i` +@ 1HPA0@\AP 1HPA0@\AP@@DXBCQoxׇ-kB\2 DTD!*<*X*SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0H4  POSITIONCOLORTEXCOORDPSMainDD +DBDILDBt`DXIL\BC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fX0vxp6:0=ЃvHx_|r@2;<̃B9=ԃ<C9=<9;=Ё aKmA8;iZ̡&9* +"Bͷm۶ǁAMQ,DND1!rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`!OY 2L &GCJ +B(2(((pr( ((@(X(`R(d(l$ʠF1O#ogr,!!@yILFD-L,m.mM-L.mm=271 30:Bvector X12@ E %`0["Z`@o4`h ( E <%`0q element@Jؔ}չqHscdP$Vp@Ya&A`@B0 l4ܸE:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3`L.쬭̍nMn4el  Th+{1c{ cY!4pEh 0 LeZearI (,4E МGt 1 3I0:`sA`u0AU t`plKWTS\30:<Nmatrixbb1@B1 0bd1@B1  E ЄPC` ++f4 㐀pYM)8$` 1dd1@s +B1 X /E ФPC`Kf4 㐀pYM+8$` 2fd1@ +B1  E ĂPC`*kf4 㐀pYM-8$` 3hd1@s B1  /E PC`:዆f4 㐀lDLT\dltȽ}չM+8b25VF7k0B8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mB+K]ۛ"0 }ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶa@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mKJWۛ ̍lM*imN̬LhĮlMfHh<ç779AOۛPUЛPYЌ]ݛP жzoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7 }ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-@XDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhK' 28:4j?depth@UIConstBuffer@@3MB ,bB&}ѕɕ*ã+!+{1c{ cY6!I Ԅ0Xp  N hꇄ NLĮlMf(hM0682/2SamplerState ` 0 ̅}TMMхѕm[ :C<=?JL̄NĨ'  < `Ct&gbU&7ah(՝$XͥMedQ?66VGV"266VG6ǖ&ҠР@UGW'W&CREWGW'W"Wv6GW&BӠ0V&7EFW2V&"Wv6GW&2ӠР`FG5b5TGWGE5WG2eE&wVFננbFG2&REWGW'W2V2V&WGbEW7&G"v&ӠBVBWGW'WR7WBV2Vc"FVGWGb&B6G6VנbFB6G2&"2&r"ScӠBVBWGW'WR7W2vV2V"FVGWGb&B6G6VנbFB6G2&ӠBDVVFFrbvFFvb&r6ӠbFrFFbvFFB6GӠ67vrFFb&26GFrVFB–FGV"FbVǒFw2BW&&V6W'WҠbFrFFCӠbF2F6GWRrFFRrFFB6GREWG7&Ӡ"WFW'WGbe&vVF7&bFGREWG7&"w&"v&ӠзAЂ{PVEU6G%W6V'7V6U5FV&7Ǖ6VGV566VG6ǖF ^^@Fʾ@@t@PbR@@@@hh@꾚v@@@@h@v@@@@h@v@@@@h@v@@@@h@Ȇv@@@@h@v@@@@@@@@d@v@@@@@v@@@@@v@@@@@v@@@@@¾v@@@@@v@@@@@v@@@@^^@h@vv@@@@@h@¾@t@vv@蠆@@@@h@¾@t@v@@@@h@¾@t@vv@蠨@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@¾@t@v@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@@t@v@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@ڞ܎P@X@@R@@@@@PVR^dv6jBK*ps_6_0ZE:/Nau/Test/resources/ui/shaders/include""42477:27241:9029B΋SX݋SX]Y[[\K[Y؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ64nѽ\ą\\]ԅ]a&HA !/y6 ~z1A`@ ^M^EhlHc i*imN̬LnD0Ћ 61A 5؀j^E^!` Di0@ u6 me!d`:lĆhLjP1A@ _CYFl6!e!`E=nĆhLlP1A@ _CYFl6e!d /F,#6ctX0 m0%=bC4&ȷ( ࠆlІmnoxyzl5cà!p C^{L` 6e m..m! ^L1 $daыȋ @=M%Q%=9M2ذ~~~}~,&l?6,myqmAkIhPea)ȋ(  D~)/02 BlXDD?>?cCp"A`Cq]" n\`A#0XG=&`zT`Ȁ: u,%' HэK0widthD@G(alphaDG(.llvm.dbg.cuShfFVVbv67EfFVF7%0Jdx.source.contentsSXFdx.source.definesS[XK[XQ[SX[ٔ-̽ɍɝM +]\ڛ۔@/؅ٕM ZY\Y۔/ʐȕͽɍM Z ]\Y]]ڛ=ޣ]Z]]]ٔ >ṔAM RyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCImہ4\BDͰ&0 <<mpK,_ܶ T;/MNDP_ܶ<;O5@m[,WBa A, D6@I RvWr3t `0F / c?/0 &L? {0A8`p ! # `A,3B0b  3a$A6InL# `\Ɍalx$so(A ({@s2a Aa?Hs?0a$u@q1 ~DA (}`u Z3a Aa?Pu?0a$w`s9 Ce CeC @CeC 0Ce  CeÜ Ce D}%Q( +hB0L#`Po? 30b (pÌ-xXgƀ&<,x3a +sLH0 +3a% +3D +x&Ä0b E*0Ì-x&! C0a&„`$B<l3ageόMxXg`ό(1 1` @ XS88(f ` @ XS830& A0`bN0F <8S`  4mN4mSVDEDN劜HFB@YN$̳O< EqMTDqMTDSTAT`<DXILBC! 3 #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L V2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@Mb'!$ۨb%&mD 0""9 QE@010P@  P@ |`@lt`z0@b&1vy7rzy(9 >rzxys`wz`0??@00v8ҴCM+rN#MUD0 놁)gY@A`Brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0`,2L &GC"J`$ +\ʠ +04 +4 +< +T` +WJ +Zʣ0J(B(!h o +gH rByLFD oM $Efe%&,f&gl&eCLc@   l lh Nl@(b ͆P<O T% ՙMfBD1 !&aL`6 u@lU6AҀKWTS\h6 ]Lg@<cK]ۛ&Lh7`4dP23177 !m@3 2}х Mi`ДAG̍lMn@P >7 :u_colorڀ p4e+s+ )Hݗ\YZ6|w 2<07 m0< 2u_effectType" ჯ}}مՕMm +` +cC aAVG6A b +)A Ҁ @DPa@l0A `V†aXW l`TSX)/47 BB 6 BAbhl[ p 4D4A(`2--p .,&A|a--p ."') mXp\]vq@/80 +;+ fa!ʁpa~aCpr@`C +@Ì-nn@|,&ИK;b#1v5GG Mmrzxys`wz`0??@00v8ҴCM+rN#MUD0 놁)gY@A`Brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0`,2L &GC"J` Jʠ<(2("(fpı AypLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$aLe@0ِ CCC<h]ـC l B`bb + A!&@j),͍˔\]ڛ&E! &4A( }`b01$' BAmX2 `a COLOR™ ! `Ҡ7a`4cD6i4ho 3H1p )/02 BQmX8 `b `C08`CuuU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\X2<$)0)V ϥ̍N.-͍nnJPyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ0 <<mpK,_ܶ T;/MNDP_ܶ<;O5@ma WA, DPQD]9^!B0F H c4hx0# `PQ8# `PA<# `Pb@# ``Ӎ$G3b 8bPZ3b F6@e|,Xc"A0@Da 1HDƀ A0@Da 1HDƀ`DXBC uI4#I_K+W[4. DTD&&&SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0H4  POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L W2" d##ㄡL L@ +@@ 3s`0G@$AH) HrspJL~qۨ8@(g {fXrzxys`wz`0??@Bі0pv8ҴCM+rN#MUD.˲,9)gY@BaB rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0`,2L &GCB +ʠF +Jʡ +4 +< +T` +WJ +Zʃ(B(!ngHq,!!yLFD-LM-L.mm=271 30:Bvector X12@ E %`0["Z`@o4`h ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A`@B0 l4ܸE:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3`L.쬭̍nMn4el  Th+{1c{ cY!4pEh 0 LdZearI (,4E МGt 1 3I0:`sA`u0AU t`plKWTS\30:<Nmatrixbb1@B1 0bd1@B1  E ЄPC` ++f4 㐀pYM)8$` 1dd1@s +B1 X /E ФPC`Kf4 㐀pYM+8$` 2fd1@ +B1  E ĂPC`*kf4 㐀pYM-8$` 3hd1@s B1  /E PC`:዆f4 㐀lDLT\dltȽ}չM+8b25VF7k0B8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mB+K]ۛ"0 }ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶa@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mKJWۛ ̍lM*imN̬LhĮlMfHh<ç779AOۛPUЛPYЌ]ݛP жzoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7 }ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-@XDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhK' 28:4j?depth@UIConstBuffer@@3MB ,bB&}ѕɕ*ã+!+{1c{ cY6!I Ԅ0Xp  N hꇄ NLĮlMf(hM0682/2SamplerState ` 0 ̅}TMMхѕm[ :C<=?JL̄NĨ'  < `Ct&gbU&7ah(՝$XͥMddQ)36VGV"266VG6ǖ&ҠР@UGW'W&CREWGW'W"Wv6GW&BӠ0V&7EFW2V&"Wv6GW&2ӠР`FG5b5TGWGE5WG2eE&wVFננ"WFW'bFGҠWGbe&vVF7&REWG7&"v&"w&"u$b&Rf&֠REWGW'W2V2V&WGbEW7&GREWG7&b&BWGW'WbRf&֠"v&ӠзAЂ{PVEU6G%W6V'7V6U5FV&7Ǖ6VGV566VG6ǖF ^^@Fʾ@@t@PbR@@@@hh@꾚v@@@@h@v@@@@h@v@@@@h@v@@@@h@Ȇv@@@@h@v@@@@@@@@d@v@@@@@v@@@@@v@@@@@v@@@@@¾v@@@@@v@@@@@v@@@@^^@h@vv@@@@@h@¾@t@vv@蠆@@@@h@¾@t@v@@@@h@¾@t@vv@蠨@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@¾@t@v@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@@t@v@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@ڞ܎P@X@@R@@@@@PVR^dv6jBK*ps_6_0ZE:/Nau/Test/resources/ui/shaders/include""42477:27241:9029B΋SX݋SX]Y[[\K[Y؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ64nѽ\ą\\]ԅ]Q&ȲA !/i6 ~z1A`8 ^M^EhlHcg*imN̬Ln<0Ћ 61A4؀j^E^!` Di 6 ڀl^ĆhLhP1A@ _CYFl6eq!`QJL~qۈa(C0AsA1 ab Ɓa hAAHƁA @!a~Lb00n@ PPr@ +|`0`@~~", aa8pi0|WF6(5eY 1 q7ISD ̳; rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"J`$ +\ʠ +04 +4 +< +T` +WJ +Zʣ`(2("(jfo @yLFD oM $Efe%&,f&gl&eCLc@  l df Nl@$B ͆P< T% ՙMeBD1 !&_0 kc+ـEl T;.u_MVPMatrix0t3A l@> .u_textColor He0A +"AӐAtl&DAC0hʠ#S5G&G7&7A AS2777 1m@6 2x}Mj`ДAGk̍Ln@Td>: "u_radius` v4D&ĵ@0h}QMl@d >?`SeVW6A  +_(Aã+ -l@l d>RY6)|g +3H6x9<؃?R@ A6XaC +a\aj!PSMain\&7A(`C@L0 ba!fjna"POSITIONb 6,... 0bIjZ[؅\"TEXCOORD۰|@ ` 0‡ ᰁ^q`2eE&wVF7A(`@t6,9B9. @9la0l(VAAhͱHs /62sig_stD6(е;CC666427)AP ŮLn.mJ@4!s c+u\ئH2<:)AV υ.,..mn +P ..l.lJ u\Ѕ e΍LnnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,_ܶ T;/MNDP_6ILDN,$fd5425c63fe0aca15fc9f231c6061121.pdbHASHT%?ଡ_1!DXIL`DXILBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L U2" d##ㄡL L@ +f`)@DAQ b '!$%Q1 @PqpͰ(X + 3 @@QOCH>QJL~qۈa(C0AsA1 ab Ɓa hAAHƁA @!a~Lb00n@ PPr@ +|`0`@~~", aa8pi0|WF6(5eY 1 q7ISD ̳; rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀`30@2L &GC"J` Jʠʃ(B(lf rByqLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!Le@,ِ CCC<h]ـC l ‡m@!6"*lن@  47.SV_Position ц 6,A D&a00A 1X =1=IMf@84P K bЌ*zz" AlXҠ 13 6dplL&E5A BO` 1 ƀ6ua;6\wPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ!sK+K" +hu\wyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK,_ܶ T;/MNDP_6a AA,$Q3PreWxT 3# `0yqɈA L1u2b -# ``}2b 0ˈA gxaP1# ``Ҍ$t&h& |l8c!A0h@zf5X Mфd@ψA  tA1b do1b dobp$BADXBC-\S ىZzߢ?D, DTDd$$%SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV04 POSITIONCOLORTEXCOORDPSMainDD +DBDILDBh`DXILPBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L *2"H d""ㄡL L|#%@`1RJT1B(be8;j {6X/nC'!$?a!P D4bHd# 0pv8ҴCM+rN#MUD1X9Mrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0q`30`,2L &GCBPeP#Q .P%QPP*P+PP-PA$ʠF@h>yLFD-,LK.,-H.,̍L.mm=271 30:Bvector X12@ E %`0["Z`@o4`h ( E <%`0q element@Jؔ}չqHscdPVp@Ya&A`@B0 l4ܸE:/Nau/Test/resources/ui/shaders/include\cocos_in_out.hlsliX=AQ {KK{s[M|q@HT1@3`L.쬭̍nMn4el  Th+{1c{ cY!4pEh 0 LdZearI (,4E МGt 1 3I0:`sA`u0AU t@plKWTS\30:<Nmatrixbb1@B1 0bd1@B1  E ЄPC` ++f4 㐀pYM)8$` 1dd1@s +B1 X /E ФPC`Kf4 㐀pYM+8$` 2fd1@ +B1  E ĂPC`*kf4 㐀pYM-8$` 3hd1@s B1  /E PC`:዆f4 㐀lDLT\dltȽ}չM+8b25VF7k0B8L@ @E `P,b3 rSdF'T46G'TgfV&4cCF'D3C3$mjB+K]ۛ"0 }ѕ U% ՙXؕѽ5 m[@ut`SUffV6F7&8*33+zc{Jzs33+!+{j"ڶ5@k.LnMpS5G&G7&T46G'TgfV&4cCbW6F&D3$mjKJWۛ ̍lM*imN̬LhĮlMfHhԄ<ç779AOۛPUЛPYЌ]ݛP жzoI "u_center }ѕU% ՙXؕѽ5 m[}| R%FV7 }ɅU% ՙ4 m[~ RUF. .̍ *imN̬LhIhH231:<2uintd@, $E `'0 ~ʀ䀀f-@MDJ|J +cC c+}}مՕU% ՙ4 m[X ~QF.+ - *imN̬LhIhԄK' 28:4j?depth@UIConstBuffer@@3MB&bB&64p"-31 a.h݅əXͥm&.JDebug Info Version$0NĆ``Ց}}ѹͱ4(4(4(р@M5X=AQ сLY}Qɝ5(5(с􀐥хѹ}ͥѥ局}ѕɥ}Ʌ4(ĸ4(5(}4(5(ȕɹ}х ɹɅ4(5(͕5(5(ȕɹ}х ɱ} ɱ}ĸ}Ʌ4(5(5(͕5(5(ȕɹѠ4(5(5(lp9qQqɕͽɍqեq͡qՑq}}ѹͱ2/2|& #(LFP03aAg%f ` [ 88:Fx` @ ^(Z> f +` @ ^(Z:& A0`xh@0F RZ`  UUUUv3mOеM>BvE#A>RFEH#5oQVE[#voRܦU]fEȭBd1+rN#MUD UDSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR2 2H5\=sU1ƠrpͰ(h`zsA1)DĐuA;iZ̡&9* +"Bz c Art`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`#0@2L &GC"%0P .PPPPPP*P+PP-PQ0F$ʠF@(3ǂyyLFD oM $Efe%&,f&gl&eCLc@  l dh*imN̬Ln@$BYa` A `g +)N. o@(b0L4A LgDUť nMn@<ڀ YY6*33+zc{ *ϺL]ۛ&lP0.1&*u_endColorbڠ dPu]bM<&AΠB&"u_centerڠ jPu]bID&AڠrĀHW\6 Tq`]*33+ʃ+ 6Tt`068/0 m0;x}MmAł m@p *? qAȁ@a  1 +! +0A`Cp +4ܸLY}AͥѥM +0 a! &L1ذ + +0 +$' BAڰ + +0 +bIj"*B+ ++D6,-+, PZ\`2eE&wVF7A(`@t6,..+ @B/l|aÐ l(D!Ʌ0c{ 49 јK;b#1v5GAiȡ$tٵM *dx.versionS ]]ܔC2FV&FV6%@ʐȕͽɍM Jdx.typeAnnotationsSP(:dx.viewIdStateSSCRF'F77%.dx.countersStyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpS a~qILDN,$cf8912f09f384b730f3211cb004201d1.pdbHASHω8Ks2BDXIL,`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Lp#%f`) BR2 2H5\=sU1ƠrpͰ(h`zsA1)DĐuA;iZ̡&9* +"Bz c Art`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@0y`#0@2L &GC"%0PPePA$ʠF@( ryaLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6D5e m..mP8 ц ˆ"POSITIONB 6,giX7dMӓԆ% Ұn@Pa ==ImX<24:O6A0 +;+ h6^lX3ӆ`C3``C1QmU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\O2<$)0)AT ϥ̍N.-͍nnJyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpS a~qa ZD,GR(B((r1F ## ` uq̈A bt$15Ɉ F41|cYac [ 8:Fx` @ WTH? F q +qP #? +qP `8|,bB0P_14 ×L"hHA(A0%#S +qP b8|,bB0_24Q <L"hXA(A05#W +qP d8|,bB0P_34 \M"hhA(A0E#[ +qP f8|,bB0_44 |` +P + + + P Dk΍nZA/\7:7ipaa{ B`,bK`8&+0:4<79::329 0:4<& m @yP^A@\1p  nM*imN̬LhĮlMfHh9g231779AOWYۛPUЛPYЌ]ݛP жu`@ 2u_startColor90977979::329 179& m @^@TȆ?u_endColor@UIConstBuffer@@3V?$vector@M$03@@B&A<x}q ~䀪䀀f~H䀚H`f-MC=x :+s+[f k̍L*imN̬LhĮlM&Hh=/0E ` +.K.,n*imN̬LhIh>2<072v?u_expand@UIConstBuffer@@3MB&$}QKs#S6vVFFȀ$ E `%,b30 aSUffV6FGWT46G'TgfV&4$mhB$PƒNMWZؗ][] + -. *imN̬LhIhЄJ0680r?u_alpha@UIConstBuffer@@3MB&Z%<XѡQ !+CJzs33+iڶ41M1uhx{`QO@@@x0.L ĪLn.m5Q"*;Ir3{*K{s dž n'6b$m Ddmm+뭎m-MAAA-j), jj$ $Dd*LAaADN % L.쬭̍nMNe $ %  oM,%%EL.lAAaH)lKlNnl.k-Ln+mkmm+뭎m- ͕}ѕ}}5(4(ՙɁT% ՙɁȕѕɡŤ4(5(р}5YA5ɥ4(р}ѕ 4(р} 4(4(р}х 4(р} 4(р}4(4(ɀ}ѕ4(с}Ʌ4(с}4(ԥс}Q4(с}}مՕ4(с}4(сѡ4(р 4(4(4(ՍсX%A5(5(р}ͥѥ@=M%Q%=94(4(4(ՍсX%A 5(5(р}ͥѥ@=M%Q%=94(р}Ɂ =1=I4(4(4(ՍсX%AQ5(5(р}ͥѥ@=M%Q%=94(ɀ}ѕ ɑPa ==I4(4(4(ՍсX%AQ 5(5(р}ͥѥ@=M%Q%=94(р}Ɂ =1=I4(ɀ}ѕ ɑPa ==I4(4(4(ՍсX=AQ 5(5(рͥѥLY}A=M%Q%=94(р}ͥѥ@=M%Q%=94(р}Ʌ Ɂ =1=I4(ɀ}ѕ ɑPa ==I4(4(4(сɽ=1ѡс豀сܥ4(5(ȕɹܥ4(mz'6" +-T4l`($ t^^^^^^E:/Nau/NauEngine/engine/core/modules/render/include/nau/shaders<""4:::41:77:27241:9029-ZilZȾ8\amh¢ @P Ldm1A@ [ lB.b! [A]LiCp\&I3AH A[Lg@ 苶 TUғ!6,lz|ll'' lp46,l0z|llAkIh8a ` @ _i)/02 B"mXb55/آ//JcCp `Cak47:q "w1zd`؀: u`'@ @O tacks!;sD#6667:23)BMD666427)ANT"s{+s{s+s"O4"s{+s!+3Ks+ \\܌ʜʦ?Q eNn%LlnJU\ܦmф .ͮLnJu\ئrQ υ.,..mnJPu\ȦʦwQ ϥ̍N.-͍nnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m3\TD_ܶ8R1~,a A,DF((:#c 0c &7A8 # `d%-ČApw AÄ0b vUQL#`Pp?$?0a$a J?L# `pV%DŽ0b GA (Y2a AÄ0b iL#`PA ?L#`P ?L#`P ?L#`P ?L#`PA ?L#`P ?Lf1 9 C>|& A0p & [F047c@cpt|f C 0aτ`" E>A 0i@pŒaw$5L# `5cA 0i@x@82m)Ԧ2m+FBP4STAT4`MDXILBC! D #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L8#%90#@1DTDV 2 @@Brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y (@2L &GC("((b)(B( rByoLFD oM $Efe%&,f&gl&eCLb@  al `@,ˆ0 J3Ah Cj),͍˔\]ڛh&! &3A( !MTe qD&Ea骴.`@,&2A mXn*m Pa ==Im(0@TL&a!"&6ea36sPͮ%̍nJT!s+K{sM\F2<90272)AR ..l.lJ!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m3\TD_6a 4A,T%@T00P +4#c # ```D-ĈA UH1b vLVc$!ԥ# ``pI9ȈA beRb!3 X g@ l 3474|LXc"#$T'$T6$TF$T DXBCєV-!rn +05 DTT$<,p,,SFI0ISG1hqwPOSITIONCOLORTEXCOORDOSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV0@41 8POSITIONCOLORTEXCOORDPOSITIONCOLORTEXCOORDVSMainD +DBDD"D(B ILDBt!`]DXIL\!BC! T #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F +ʀ3g(< > yL d! ܆Шʾ\ @#{{qqqA)I0c{ !dW6F&cFB[  X!Z` E ,%``0 1@0[#Z`PQVVFlM[Y[[47=@A1A@ium&l`HD* Fj),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h5 $a_coloro ` 0 EW7&G=ؠD`py ` T`@}i?  :@@ɽ=1ѡQ 1{k{+s;b"*C +jjj0$IiRX5(wxP0.u_MVPMatrixDhh8ɥ񘱽ѱаpY*E<$`pYM+E<$``0bf1@ +B ( E ĂPC`K&f4 pYM-E<$``1df1@s B h /E PC`k&f4 pYM/E<$``2ff1@ B  E ЄPC`.&f4 pYM9E<$``3hf1@sB  /E ФPC`>bWY[]_q s@u`"v5VF7[ݴw 0 U +!0ux1 +B@AOWTS\PUЛPYЌI[\P ж T .u_textColor 6oSEWG7&T46G'TgfV&4cCbW6F&D3$m3MWYۛ ̬lnM*imN̬LhĮlMfHh>w909779AO]ۛPUЛPYЌ]ݛP ж~/ *u_endColort2777979::329 179& m 0 r@<?u_color@UIConstBuffer@@3V?$vector@M$03@@B`,F$}ѕ-b3lS5VFW&T46G'TgfV&4cCbW6F&D$m$PkNHݗ\YZ"0`S%FV7T46G'TgfV&4$mB%XsVHW\2<07279::329 &m 0.߳@dHԥёsK;s+#Iscd0`"dB10*33+ʃ+Jzs33+Iڶc7A6+ -.bSeVWT46G'TgfV&4$m"'tVGWZ068079::329 &m 0<@,ШѡU% ՙ4 m[ C>?DIDKNOŨ'  S `Ct&gbU&7ah(՝$XͥMdfqu36VGV"266VG6ǖ&ҠР`5TGWGE5b5b5WGE5WGҠנb5TGWGE5VGWGb5TGWGE5ӠРVGWG6FVdžRdF'WG6F斲ӠVGWGbEW7&GWGEW7&GӠVGWGbe&vVF7&bFGWG5&"w&WG5&RWG5&RӠРVGWG6Fb&WvDTGVGWG6FVGWG6FrӠ"WFW'VGWGӠנAԂ{PVEU6G%W6V'7V6U5FV&7Ǖ6VGV566VG6ǖF ^^@Fʾ@@t@PbR@@@@hh@꾚v@@@@h@v@@@@h@v@@@@h@v@@@@h@Ȇv@@@@h@v@@@@@@@@d@v@@@@@v@@@@@v@@@@@v@@@@@¾v@@@@@v@@@@@v@@@@^^@h@vv@@@@@h@¾@t@vv@蠆@@@@h@¾@t@v@@@@h@¾@t@vv@蠨@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@¾@t@v@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@@t@v@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@ڞ܎P@X@@R@@@@@PVR^dv6lBK*vs_6_0ZE:/Nau/Test/resources/ui/shaders/include""42477:27241:9029B΋SX݋SX]Y[[\K[Y؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ64pŅ\]E]̅]^Q&ȲA a/i6 |1A΀MUЛPYq6 |1{lLcL630\WLg@@6P` m0B5V5& }8 X ֘ #4,dc5XcP` Rm0Bc$6V5& 8 X ֘ #4T,tc5Xc`p` Mm1q1A@ FhYj6g1`OEyklpJ5^#6f6n#7v7C<<6 |a dža/@A=&l؃TUғ!& lb6g1p`1$a x "TEXCOORDD 6gq6ȏ60})/47 B2ذ{|G~||dž =#>c/ >6,g{g 0Lj +PH5outputDBD`Ȁ: input DBAE`H: u' @O`z `(: u`' &#@bA+u  +'@ @O K1练D@/K1滃$ٵM ]KY[[, +]KYݔ-,̽ɍѕMԢ-̽ɍM [dx.source.mainFileNameSC2V'7V&w67% +dx.versionSpBbfW&7% ;dx.shaderModelS0C"W6V'7V67%8 Kdx.typeAnnotationsSP;dx.viewIdStateSCRF'F77% yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa JA,DFP*B5Pv%Wt@o0&GL; w0A8`pЃ ±&GLZ 0A8zap8 #&:Lv# ``A$30b uL#`PA̛n?E +A (sm +2c@ _(#`PA n?E +A (tlV2c@ _(#`PANl?L# `0ʄ0b Ä0b āL#`PAЛl?L# `܁X̄0b EÄ0b  +L#`PARl?L# `@΄0b 0Ä0b AāL#`PAԜl?L# `ȁhЄ0b EPÄ0b EPÄ0b EP0Ä0b EP Ä0b EPÄ0b EPÄ0b EPÄ0b EPÄ0b EPÄ0b EPÄ0b EPÌQD Ai?Tx?0a Af?Tx?0aA23ı0hL 0a&Ä0bp TPL 0a&00h1L#`V„0hL 0a&Ä0bp Q*|)L 0a&00h1L6a1 +A0\ ,0F `z4X`1@  ,N> LL#`08\0a D mp`g1@ޠ`1@ `1@ `0 3a  sA0a  t@A0a  uA0a Ax??E + pC Ä0b E8?0a Au??L#`Pyî CÄ`i1 ;Ԁ 3a|& A0f dBM @>3D +X!gbτ`DgƀH!A0(ԡQ(!B1@Brp0F P=DX& A0(AQ( `@ +uA^paƀ301@BV\1 31Łό){ ""SA0(aR8B1@D sz0F `=H^& A0(R8! ` @ uqVf  ` @ uqQ& A0`aAV!0F QYqPf1HFfaġ`1HFfaA`1HFfaa`1HFfaA`1HFfġ ` @ urQ(& A0`aAV0F QY(qPa1HFfġ`1HFfA`)B&6mgеmcԆVH]F6mi5nag Q 5mSgC]W`[WpWV[VVU[UL劜HFB@STAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P .PPPPPP*P+PP-PQEQTJb (3byD@@AyLFD oM $Efe%&,f&gl&eCLc@  l dh*imN̬Ln@$BYa` A `g +)N. o@(b0L4A Lg$"¸}ѕ Mg@@D6&6u_effectColor"ڀ ^Y7 zc{  J } MiAUM<&AΠB&"u_centerڀ jPuq/0 am06}MkAE̬l*l@`"` sPсUl¾&@Q6A Xׅ +C kdAl&00 +R0 P +- 6@j),͍TUғ B!bP6+lXUXVhV\`X`1$adaXXap`Uӓ BUmX$ZXVhVjAb[0,)/47 BQ"VAZW X6,*+B- 0,lX$YXVhZ\AbXذT + +0B +^_0/ +QHpxfloats,&Gc.싍l@|4ξ&l@ār(s8tfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%p*хѥM@إ%MхѕM NK\[ܔṌչѕM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$394b2d4f95a95b83b36de45e325757a6.pdbHASH9K-O[m^2WWDXIL`'DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePE@$F +ʀ y$@ydLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.ӓԆe l *zz" A6,`օ]5#.SV_PositionBڰf` qq.L l xօmX0.L 1Ю1@Alʀ DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+|F QYXl @ \YRF QYH` @ \YT`F QYX=1HFf` @ \ZT؃A0@pahaPaF QhYXc @ \VR(F QhYHb @ \VTF QxYX<1HFfDXBCɌC.Ou3 DTh"*++SFI0ISG1XHQPOSITIONCOLOROSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV04( 0POSITIONCOLORPOSITIONCOLORTEXCOORDVSMainD +DDDDBILDBh `DXILP BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F + 3g < >yL d!1 ܆ʂʾ\ @#{{qqqA)I0c{ !dW6F&cFB[  X!Z` E ,%``0 1@0[#Z`PQVVFlM[Y[[47=@A1A@ium&l`HD* Fj),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6ho6x}-bo6 $D`@{i>  :@@ɽ=1ѡQ 1{k{+s;b"*C +jjj0$IiQX5(wx? .u_MVPMatrixDhh8ɥ񘱽ѱаpYM*;$`pY*;$``0bf1@ +B ( E мPC`K&f4 pY,;$``1df1@S B h /E ܂PC`k&f4 pY.;$``2ff1@ B  E PC`.&f4 pY8;$``3hf1@SB  /E МPC`>RVpXZ\^pr0t`"v5VF7@[ݴv ô0 T +!0tw1u +BAOWTS\PUЛPYЌI[\P ж S .u_textColor 6oSEWG7&T46G'TgfV&4cCbW6F&D3$m‚3MWYۛ ̬lnM*imN̬LhĮlMfHh>w909779AO]ۛPUЛPYЌ]ݛP ж}/ *u_endColort2777979::329 179& m R@<?u_color@UIConstBuffer@@3V?$vector@M$03@@B ,BB$}ѕ-b3lS5VFW&T46G'TgfV&4cCbW6F&D$m‚$LkJHݗ\YZ"0`S%FV7T46G'TgfV&4$m%TsRHW\2<07279::329 &m ,ߓ@dHԥёsK;s+#Iscd`"`B10*33+ʃ+Jzs33+Iڶa5A4+ -.bSeVWT46G'TgfV&4$m&pRGWZ068079::329 &m :@,ШѡU% ՙ4 m[ =C?HJMOĨ'  R `Ct&gbU&7ah(՝$XͥMddQ36VGV"266VG6ǖ&ҠР`5TGWGE5b5b5WG5WGҠנb5TGWGE5VGWGb5TGWGE5ӠРVGWG6FVdžRdF'WG6F斲ӠrF7WWGEW7&GBDrTVF'2FV&"WW&WF֠VGWGbe&vVF7&bFGWG5&"w&WG5&RWG5&RӠРVGWG6Fb&WvDTGVGWG6FVGWG6FrӠ"WFW'VGWGӠנAЂ{PVEU6G%W6V'7V6U5FV&7Ǖ6VGV566VG6ǖF ^^@Fʾ@@t@PbR@@@@hh@꾚v@@@@h@v@@@@h@v@@@@h@v@@@@h@Ȇv@@@@h@v@@@@@@@@d@v@@@@@v@@@@@v@@@@@v@@@@@¾v@@@@@v@@@@@v@@@@^^@h@vv@@@@@h@¾@t@vv@蠆@@@@h@¾@t@v@@@@h@¾@t@vv@蠨@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@¾@t@v@@@@h@¾@t@v@@@@d@¾@t@vv@蠨@@@@h@@t@v@@@@h@@t@v@@@@h@@t@v@@@@d@@t@vv@ڞ܎P@X@@R@@@@@PVR^dv6jBK*vs_6_0ZE:/Nau/Test/resources/ui/shaders/include""42477:27241:9029B΋SX݋SX]Y[[\K[Y؛\KY[܋\YK[Yً[XZY46-Qembed_debugZ64nѽ\ą\\]ԅ]Q&ȲA !/i6 ~z1A΀MUЛPYq6 zylHcL630\WLg@06@ЋP m0ʂ5RC5& |( H ՘ /,`#5TcPP Rm0"$ʂ6RC5& ( H ՘ /P,p#5Tc``ЍP Mm/Q1A@ _DYFj6e`EOxjlpFc5Z5bc6j6rc7|<ă<6 zqa dž!/=&lԃTUғ!& lb6e`ppp`1$a hx |)/47 B"p $ca hx KG{{G^G|*zz" EYlXʢ?=C?B?=ca6~Ѕi,%@: u`'@ @O#`: Pu hэK +:uH# hezd@a: 0u' %@A" ?%@BA^\\`ልͮͥ퍬Ō-ln eaͮ%̍nJ`\\h\\-2<:24742)[!s{+s ;܅2<27)^8!s c+2<90272)_!s+{+%2<< 7707)By2<$)0)z!s)s˃zKsyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa A,DFP*B5Pv%Wt@o0&GL; w0A8`pЃ ±c&-L] 0A8ap8 C# ``A$30b uL#`PЁq?L# `́(Ȅ0b EÄ0b  +L#`P؁q?L# `Tʄ0b Ä0b AL#`Pq?L# `܁8̄0b EÄ0b  +L#`P聎q?L# `d΄0b 0Ä0b 0pÄ0b 0`Ä0b 0PÄ0b 0@Ä0b 00Ä0b 0 Ä0b 0Ä0b 0ÌQD Ap?Ln?0a Ak?Ln?0aAN3ı0hL 0a&Ä0bp QLL 0a&00h1L#`60hL 0a&Ä0bp )t(L 0a&00h1L6a1 A0X ,0F `j3X`1@ ,N> LL#`0ł8\0a $ kp`g1@ڠ`1@ `1@ޠ`0 3a  qA0a  r@A0a  sA0a A }?܁?E pÄ0b /p?0a A z?܁?Ll "?L @>g18`ƀHVф@03c@$|& +LFā|f 1@D]l1 A0(!P `@ +tva1@]f0F @Q@AXf ;0RБA0(ЁPx!:RSyX1 "1@BP^1 A0(QA `@ +uAza1@BJ^0F AXpXlƀ`?F AXpj1Hb ` @ tpT`& A0`!V!& A0`!@!& A0`!P!& A0`!R!& A0`!V0F AXpb1Hba ` @ tqT& A0`!V!& A0`!@!& 1 p 6meеmafVH]&6mg5n_gy I 5mQgC][W`VpV[VUU[UTL劜HFB@STAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P .PPPPPP*P+PP-PQQTJbʠ(3RyD@yLFD oM $Efe%&,f&gl&eCLc@  l dh*imN̬Ln@$BYa` A `g +)N. o@(b0L4A Lg$"¸}ѕ Mg@@D6&6u_effectColor"ڀ ^Y7 zc{  J } MiAUM<&AΠB&"u_centerڀ jPuq/0 am06}MkAE̬l*l@`"` sPсUl¾&@Q6A Xׅ +C kdAl&00 +R0 P +- 6@j),͍TUғ B!bP6+lXUXVhV\`X`1$adaXXap`a e m..mPUVpV BQAVZWX6,,+. ,*zz" TՆڅU`V*V -.†|PB*0c{ c6G77A <sig_ld1v5G7A `899C666427)AP ŮLn.mJ@4!s c+u\ئH2<:)S υ.,..mn +P ..l.lJp +u\Ѕ e΍LnnJpyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$bdbe2b0899d44eb196e653ec53194039.pdbHASH+NSS@9DXILl`DXILTBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePE@$F + yy`LFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.ӓԆe l BqzKK{s цK lȈ ҆e #!.n@43 #!3#BU5$EAд օ@ڕ1(3P (6*llvm.identS +]\ڛ۔hBbfW&7%0̡5M 2dx.resourcesS]Z]]]ٔ CRF'F77%`yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@ma A,GR(B(+ +c 7# ` miˈA `lt$ 1ȈA bt\$1MʈA dx$QÄA fT͈A gA\Έ 4f$b0 B00 0bp L&h& h1Ad 0  0@ #`AhB&h &M|F 3x`@ =8 F 48,N>#`H\0b #`(\`g@ Qp + A0xF "0F !8h 0 3b )F <0#`@dX|L @>l A0hZ`F@>Vbq SX1HB!b!A0@l!b!D1HB!bA0@l!b!N1HBAb!` @ [YQȃA0@l!d!L!F PX8<1HBab!A0@l!V!D1HBabA0@l!V!Na1HBb!` @ [VQDXBCnѷ8ެ! DTDH (\xSFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV04 POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`4DXILBC! + #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L<#%9P( PRCDb"'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GCB(2((,2("( yLF m..mML.mm=271 47float4xX@h|0c{ cdAcS `F06 "h0PwcS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X`=(yq +{*{+{+{K{C #+{Isc#+{{JszsAccK4jj\]ڛ"h9@ b6F消1`8>v_fragmentColor!o 0bEW7&GFÌ-N]ݛ[ "hy E 0B + ! ` + 6TL @ ` E `o,b <:80@AL@ @6l&j: pjj +K#bFGGé-N. nj-ƇWL"h@(A0W"h@(A03P +qP @a8|,bFB0p_21! $×"hLA(A0%3T +qP @c8|,bFB0_31a D׌"h\A(A053X +qP @e8|,bFB0p_41 d"hlA(A0E3\ +qP @g8|,bFB0 PA(B)B*B+B,B-B.:7ipaLؾ…m(_I P,= +@E `P~꾚䀀f~HH`fH`f-MA9x9p+ãzc{[f|/2<77979::329 179& m @@l?u_effectColor@UIConstBuffer@@3V?$vector@M$03@@B&ց}х ~䀪䀀f~H䀚H`f-M;x :P*s#zc{} U% ՙXؕѽ5 m[ytQ5&5{c{Jzs33+!+{j"ڶ4A-@k̍Lnd272979::329 179& m @^@D1(/0979::329 &m @@D}U% ՙ4 m[~ SUffV6FGWF.͍L\ڙ[H 0815$AOWYU\PUЛPYLж @ : 6u_alpha_value068/0279::329 &m @*^@<}U% ՙ4 m[h $~`AVGF-  *imN̬LhIhLĄ7ԡaA!$R%^B&F=! L09327 FL $ ĪLn.m6  䇑41:24::49430:47::::(!47::)/022:9747::/32777 B܃".:.9:.:94902941:24::494`2–6V6WEWGVUvV֠Р0&VgfV&R46G'TgfV&"Wv6GW&"ҠנbFGGRdF'ӠbFGREWG7&ӠbFGRUffV6F7&ӠРbFGR5G&G7&ӠbFGRUF6&ӠbFGR5&ӠҠbF'R5VFW&ӠbFR%FV7ӠbFRUFӠRFRUffV6FGWӠbFReVWӠbFRӠbFBVGӠbFG2&ӠзӠР0G'W7Fb5WGՠנbFG6F4DӠзӠР0G'W7Fb5WG5ԠנbFG6F4DӠbFG5&2$ӠзӠР0G'W7Fb5WGEՠנbFG6F4DӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5WGE5ԠנbFG6F4DӠbFG5&2$ӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5TGWGE5ԠנbFG6F2e4DӠbFGb6F4DӠbFGbe&vVF7&2$ӠbF'bEW7&GBU5$EӠзӠР`Fb&WvDTGbFbFrҠנ"WFW'r"ӠзA Z(PрВD4(yq +{*{+{+{K{C #+{Isc#+8ս8ɕձͽȕɽՑս̡t^^^^^^^^^^8hi*k+#"+;r B,Ƃ,ʂ,̂,-B-&1A@ [I6l&a h C[Ć.6 lau1Ap ]pzKK{s $!i6m1AH BlX"/b//آ//"POSITIONڰh_EhE__,&ȲA ذh_EhE__"') N^_[N 0 `2eE&wVF7AH K[^_[E[EilXcÐl(p `WG7.B`C @O#0XG=*`z\ ] ؙXݔ`&ٵձMj'ٵM r[X؛]a'|[X YY[ܔ`E2V'7VfVV6%:dx.source.argsSBbW&76%h&dx.valverSC2FV&FV6%Jdx.typeAnnotationsSCbVvD6EFW6%:dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m[,WBa \A,D#3@Y0 &# `T ÌApw AqPpÄ0b EM@L#`P`??0a$rUT ٨?L# ``V%5Ƅ0b f ZȪ?L#`Ph? ?0a ApÄ0b  fLCFqA 01M0a$ӴA 01MN0aSTAT`@DXILBC! 7 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 2L &GC("((B*2("(ڱ yjLFD oM $Efe%&,f&gl&eCLa@  Ql `@,ˆ0 J3AX Cj),͍˔\]ڛX&! &E3A( !MTe qD&ųa骴.`@,&1A mXn*m Pa ==ImX<1J46cd*LnP@ &3".0 P(Q49 ИK;b#  +9 AA666427)AP ŮLn.mJ@4!s c+u\ئH%2<< 7707)AS ..l.lJ!s)s˃zKsA2<:72)yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$15c27b31a29bdb6b36cd15903a5a9d5a.pdbHASH{1k6:ZZDXIL(`JDXILBC! A #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 2L &GC(b(2((B( r@ yTLFD oM $Efe%&,f&gl&eCLa@ a0(McÀ$a6Ah@M5qzKK{s X6`&Ea!(a"(TUғp6,Q5LLӓ@&DAظ KAt SFuD6,Q5\l *&SV_TargetٰbD Au20A1fFVF7%ؕͥM &dx.valverSZY\Y۔ CbVvD6EFW6%XṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma A,D0P +T%# ``P!ÈA UH1b e@SR$q# `\FU1ĈA  QU0b eT"$rUDXBCzꈧilC\2 DTh!))*SFI0ISG1XHQPOSITIONCOLOROSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV04( 0POSITIONCOLORPOSITIONCOLORTEXCOORDVSMainD +DDDDBILDBd`DXILLBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F + 3g < (yL d!{KK{szc{+sAcc4@ oM $Efe%&,f&gl&e@j),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h S\477float4xX@h|0c{ cdЀas `H0> "h$0Pws a6O4U< )c+k+s{sF@0(&1 ۸ Ma 0 <`X`䈃9}ͥѥ-bF 90 0 ce&vVF7&28`$D]ۛ 30:Bvectora 0`1@ 8``04P L+866 `m0 40571uB38`d`cPq0 &x09`b5WG5D% m..m4upxz {c{[HH`Ltpp"`yA=4L` | |ڞ܎Шɽ=1ѡe555im4@(@Q<D &+0:4<"float4x4xX@hX@h|8|,b0`8|,bF00_13ap W "h\A(0%X +wp @b8|,bF0_23p 4× "hlA(05\ +wp @d8|,bF00_33p T "h|A(0Ep +wp @f8|,bF0_43!p t "hA(0*+,-./890{{sVpdk΍nZ:l܆Sv):@;2Xf +)N. *imN̬Lhꇤ-N. ffHhE)Q/2<77E `` ~䀪䀀f~H䀚H`f-XC==*33+zc{c} U% ՙXؕѽ5 m[|8z S5G&G7&G8 zc{Jzs33+!+{j"ڶ`p$@̍lMnSUF6&T46G'TgfV&4cCbW6F&D3$mPGۛ kM*imN̬LhĮlMfHhHı272E `p ~䀪䀀f~H䀚H`b-XDI I #K[f~怪䀀f-XDJJ*à s#cSUFT46G'TgfV&4$mb%XxPLWYU\47:2unsigned int{ ` XK"0?u_effectType@UIConstBuffer@@3IB,\&h&}}مՕQ ~¾ʀ䀀f-XMJ +cC #ST46G'TgfV&4$m"'tPY28:479::329 &m <DŽ@y| P 0@ +?l@6 l%23$7727 l`,bC0UF@Dܾ\D蠨@P@蠆@@R@@@@蠨@@z@P蠨R`v@@@@\@z@P꾚X@\¾Rv@@@@\@z@\¾v@@@@\\@z@ڞ܎P\\X@\\Rv@@@@@v6Ypt긨Ҹʸܾ\ [X\]ݗ[XWY[YB˜XYHUЛPY\Y]XLJ^[  HWTS\N[ H]ۛN[ HWYۛNB[ H]ۛN[ HWۛN[ HۛNH[ HX]N[Hݗ\YZN[HW\NH]HWYU\N[HWZؗ][]N[HWZN[YN [ ۛNBNB\\\T^[ H\]ڛTUғNBNB\\\P^[ H\]ڛTUғN[ HۛӓNBNB\\\U^[ H\]ڛTUғN[ H]ۛUӓNBNB\\\P^[ H\]ڛTUғN[ HۛӓN[ H]ۛUӓNBNB\S\P^[ \]ڛȔTUғN[ \]ڛTUғN[ ݗ\Y[ۛӓN[ ]ۛUӓNBNB[[\Q[ []J^\]]ʋNB!-bCPh)BEn BKѠH)lElNnl.e-Ln%mPVVWvVRvV2&WFVV6"WFV&6VGVV2FV&7S(yq +{q ++r;Ks+{y{Isc#+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ- +x Y6x ^P ͆/"/&Jzs33+ $/@#4/B4 hl 4 fc LhAy1A@ _Yj6~qdd`>kFjLj@1A@ _Yj6~1dQ`ImFjLl+A1A@ m0%b7P7&ȶ @Ԙ /r,5Rct H hklmnFoFxdž!/L<6 yA0EC AzzJJzr $! A^L0 ,cÒ,6,x1xxA2e6F6AH`Òd 6,xxxaa`p`"TEXCOORD Y{{^YGl C??6  +) [\ݸ?XG="`zL`: pinput DEB`' @O# 0XG=`z4`x: p F'XG=" 1A`Ȁ¸Q;p`]4Q;p ] ؙXݔ'ٵձM‚,ٵM [X؛],[X YY[ܔ`E2V'7VfVV6%X ;dx.source.argsSBbW&76% 'dx.valverSC2FV&FV6% 3dx.resourcesSҰDBWFF67E CbVvD6EFW6%H;dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa A,DFP*B5Pv%GgAF0c&L: v0A8`pȃ ¡C&-L] 0A8# `` 3D0b JAdL#`Ṕq?GA (rj1c@#`PЁ̜q?GA (sk2c@#`Pԁ q?GA (tlT2c@#`P؁Nq?GA (ul2c@#`P܁o?L# `AA4˄0b Ä0b ȁL#`P䁎o?L# ``̈́0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  Ä0b  ÌqD~ Aj?Hy?0a Ag?Hy?0aAtM3D0hL 0a&Ä0bp HL 0a&00h1L#`50hL 0a&Ä0bp )pX(L 0a&00h1L6a1 A0V ,0F `b2X`1@ ,N> LL#`0B8\0a  jp`g1@iؠ`1@ `1@ܠ`0 3a t pA0a  q@A0a  rA0a A }?A?G PÄ0b /`?0a A z?A?L#`PBv @Ä0b /`?0a A ?A?L#`Pv3(Ȉ Ìq(|f 68LցAȁ@a  1 +! +0A`Cp +4܈@=M%Q%=9M0 b! &LnP†PU`V`VCOLORAVZWX60 \&lXZX[hW\`X eaTaXpap`a"*B+ ++"') BUmX]XVh\pb^@B.B/lh (/< 309insts£1vF6A >sig_st 6 ဈ8C99TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+8\ʂP +u\ȦʦP ϥ̍N.-͍nnJ ]\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$f84aef5446428a7c4cd69475fd27cb4e.pdbHASHJTFB|L֔u'NDXIL@`DXIL(BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePE@$F + yy`LFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.ӓԆe l BqzKK{s цK lȈ ҆e #!.n@43 #!3#BU5$EAд օ@ڕ1(3P (6*llvm.identS +]\ڛ۔hBbfW&7%0̡5M 2dx.resourcesS]Z]]]ٔ CRF'F77%`yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@ma A,GR(B(1F ## ` iCeʈA ߡe1b  # ``Am2b ('%# ``u2b 0,# ``A}3b 8`V3bp M4I&h& h1As 0  0@ #`м5hB&h &È 4tal0 B00 `&A0x ,1@G`A0x ,0ψ <} jp < +X1@'ڠ`@ Qp A0xF 0# S +qA0b )E <03b +)<# `)2b +)# `)0b +*A  pp +x# `)$ +w +p0b +A(A  pp +x# `)$ +w +k0b +(A  pp +xDXBCUu*|0 DTD(H(d(SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV0H4  POSITIONCOLORTEXCOORDPSMainDD +DBDILDBd`DXILLBC!  #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L Y2" d##ㄡL L@ +@@ 3s`0G@$AH) Hr3G@zn.BWBZ/nq% ?a!! 02MqD5\=sU8BXȄU Iġl8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@2;<̃B9=ԃ<C9=<9;=Ё aKmA8;iZ̡&9* +"Bͷm۶ǁAMQ,DND1!)rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0y`C0`!OY 2L &GCB +ʠF +Jʡ +4 +< +T` +WJ +Zʃ(B(!ogr,!!@yLF3{KK{s*ã+zc{ bC *2 ;sAcc4@ oM $Efe%&,f&gl&e@j),͍[ !17930:x,$`"h0`-bM0`G06 "h 0p <227e0)l812 L+8.l@e @8@ @ X!pt^^^^^^ʸܾ\ @p{"6F消0`8}ͥѥ-bF <9$$ݗ\Y[ۛ"h9@ @}ѕ ɑ0c{ !dW6F&cF"㳈Dh@0`4м`AH5 ɴb  @@PXp`Xg 41@ @6a0e `7 7  D;`Cp\꾚pj K1c{ ca> +qP #? +qP `8|,bB0P_14 ×L"hHA(A0%#S +qP b8|,bB0_24Q <L"hXA(A05#W +qP d8|,bB0P_34 \M"hhA(A0E#[ +qP f8|,bB0_44 |` +P + + + P Dk΍nZA/\7:7ipaa{ B`,bK`8&+0:4<79::329 0:4<& m yP^A@\1p  nM*imN̬LhĮlMfHh9g231779AOWYۛPUЛPYЌ]ݛP жu`@ 2u_startColor90977979::329 179& m ^@TȆ?u_endColor@UIConstBuffer@@3V?$vector@M$03@@B,A<x}q ~䀪䀀f~H䀚H`f-XC=x :+s+[f k̍L*imN̬LhĮlM&Hh=/0E ` +.K.,n*imN̬LhIh>2<072v?u_expand@UIConstBuffer@@3MB,$}QKs#S6vVFFȀ$ E `%,b30 aSUffV6FGWT46G'TgfV&4$mB$PƒNMWZؗ][] + -. *imN̬LhIhJ0680r?u_alpha@UIConstBuffer@@3MB,Z%<XѡQ !+CJzs33+iڶ`1M NU]\ ]ݛ[ ϲ AML& ?u_texture@@3V?$Texture2D@V?$vector@M$03@@@@A,f'&̅} +kc+ +N@/g. L hj* Ln. (hNPԡaA!$R%^B&r'F=! O09327 FL $ ĪLn.m(6  441:24::4942<:2"/2<:2929:682)02682/929930:47::::(!47::)/0230:2779/2<:2682682/47::/27934327790068/02092:97277947::/327773 Bp܃".:.9:.:94902941:24::494`2–6V6WEWGVUvV֠Р0&VgfV&R46G'TgfV&"Wv6GW&"ҠנbFGGRdF'ӠbFGREWG7&ӠbFGRUffV6F7&ӠРbFGR5G&G7&ӠbFGRUF6&ӠbFGR5&ӠҠbF'R5VFW&ӠbFR%FV7ӠbFRUFӠRFRUffV6FGWӠbFReVWӠbFRӠbFBVGӠbFG2&ӠзӠР0G'W7Fb5WGՠנbFG6F4DӠзӠР0G'W7Fb5WG5ԠנbFG6F4DӠbFG5&2$ӠзӠР0G'W7Fb5WGEՠנbFG6F4DӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5WGE5ԠנbFG6F4DӠbFG5&2$ӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5TGWGE5ԠנbFG6F2e4DӠbFGb6F4DӠbFGbe&vVF7&2$ӠbF'bEW7&GBU5$EӠзӠР`Fb&WvDTGbFbFrҠנ"WFW'r"ӠзAH Z(PрВD4(yq +{*{+{+{K{C #+{Isc#+8ս8ɕձͽȕɽՑս̡t^^^^^^^^^^8hi*k+#"+;ri-.....&2A@ ^i6x&a ȋ g EhlH4f"// /DcC01@6UIConstBufferڀEiF^^!@ $/TC'"/"/ jl HH ֘ l0 &H<` И /΁,d6BcL X  Bm06`#4&Hx ܀И /,t6Bc\   m0b7`#4&H И 6~!d!1`JEyFhLn-A1A@ _Yl4bc6j6rc7z7ƒ<=cÐ A{lcPj!.SV_Position &Ilb! K^|G}^G^@i**i/c>>//`1$5A@ Ydž c>>/ ?Pa ==ImȂ,6,d"qxdq!a2eE&wVF7AH`Ò$2%R0ȉ +;(P5input D@Ed`: 0u'@ @O #0 BW7&7.@dDP8XG=: 0u' f҅ͮͅLenJ\\aAU\eQ eNne͍̍nnpjш eNn̅,ͭlnJ0"s{+si Ks3Jc+s +k+E2<:20)]T!s+K{sE2<062)^!sC #+kz#+cE2<:)kT"s˃+ rs{ K{s"{!sK+K" +G2<27:<47)yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCImہ4\BDͰF y0A8`p  +&(# `23r0b $0a$A +m@L# `AAX̌pw$rnp4A (y0r3a Ad?Dr?0a$t0p< |@4CA ({Pt4a Ad?Lt?0a$vPrE ~@UC ~0U ~pU ~`UÜ ~PU ~ UÛ Pz%Q(́uhBL B0a& „0@  `C&C30b (Ä0b (Ä0b (Ä0bp P4c@, A0a G K#,3Ģ0b` (Tۄ0K LV01 ;L00`3a$ +pŒw$ +p A 0g@L# `A0av4mHԖ4mJ܆S"4ҴQEADPEADvI,Dӿ0BDfCQD\D\=STAT `CDXILBC! : #AI29 %bEB B28K +2bH CF2BH#PAQ1FQ@  m0 I`B L V2" d##ㄡL L@ +f`)@DAQ b d (@(4\=䯄_6*a*.BCNaya:j {6X/n0 QB@010P@  P@ |`@lt`z0@b&1vy7rzy(9 >rzxys`wz`0??@00v8ҴCM+rN#MUD0 놁)gY@A`Brt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y ,@0䁀`30`,2L &GC"J`$ +\ʠ +04 +4 +< +T` +WJ +Zʣt(2("(Rjfpı yyLFD oM $Efe%&,f&gl&eCLc@   l lg Nl@(b ͆P</ T% ՙMfBD1 !&aL`6 u@lU6AЀKWTS\h6 ]Lg@<cK]ۛ&DA0hȠcSUffV6F7&7A bAC90977 1m@4 2} Mj`АAǣkMn@T >8 :"u_centerڀ r4d #K !RUF6A _AC̬l*l@dB` {068/0 M3؀ 4M( +cC aAVG6A b +)A  ` DPa@l0A `V†aXW l`TSX)/47 B" 6 B1bhl[ p 4D4A(`2--p .,&A|a--p ."') mXp\]vq@/80 +;+ ea!ʁpa~aCpr@`C +@DL.m l[49 јK;b#1v5GG Mm;A;; Pͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJU"s˃+ rs{ K{s"+!sK+K" +B2<27:<47)A:t!s{s+yQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm4\BDͰ6 rzxys`wz`0??@00v8ҴCM+rN#MUD0 놁)gY@A`BSrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y ,@0䁀`30`,2L &GC"J` Jʠ<(2("(fpı yypLFD oM $Efe%&,f&gl&eCLc@  a0(MeÀ$aLe@0ِ CCC<h]ـC l B`bb + A!&@j),͍˔\]ڛ&E! &4A( }`b01$' BAmX2 `a COLOR™ ! `Ҡ7a`4cD6i4ho 3H1p )/02 BQmX8 `b `C08`CuuU\A2<27)ф .ͮLnJ`!sC #+kz#+c$e\X2<$)0)V ϥ̍N.-͍nnJPyQ3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC P0@a@q ` l;/TQQCIm4\BDͰ6 0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + cA@<yiLFDm..͍ NlML.mm=271 47float4xX@h|0c{ cdAcS `F06 "h0PwcS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X`=(yq +{*{+{+{K{C #+{Isc#+{{JszsAccK4jj\]ڛ"h9@ b6F消1`8>v_fragmentColor!o 0bEW7&GFÌ-N]ݛ[ "hy E 0B + ! ` + 6TL @ ` E `o,b <:80@AL@ @6l&j: pjj +K#bFGGé-N. nj-ƇWL"h@(A0W"h@(A03P +qP @a8|,bFB0p_21! $×"hLA(A0%3T +qP @c8|,bFB0_31a D׌"h\A(A053X +qP @e8|,bFB0p_41 d"hlA(A0E3\ +qP @g8|,bFB0 PA(B)B*B+B,B-B.:7ipaLؾ…m(_I P,= +@E `P~꾚䀀f~HH`fH`f-XA9x9p+ãzc{[f|/2<77979::329 179& m @l?u_effectColor@UIConstBuffer@@3V?$vector@M$03@@B,ց}х ~䀪䀀f~H䀚H`f-X;x :P*s#zc{} U% ՙXؕѽ5 m[ytQ5&5{c{Jzs33+!+{j"ڶ`A-@k̍Lnd272979::329 179& m ^@D1(/0979::329 &m @D}U% ՙ4 m[~ SUffV6FGWF.͍L\ڙ[H 0815$AOWYU\PUЛPYLж @ : 6u_alpha_value068/0279::329 &m *^@<}U% ՙ4 m[h $~`AVGF-  *imN̬LhIhLĄ7/2<:2rTexture2D >`651  0l}ѕɕXPɕYؕѽ5m[ `2V&Cf* Ln.lL;!`682/ 682)02 m :B@sPvy}H x 0?l@6 l%23$7727 l`,bC00EF@Dܾ\Dd@@t@P`Rv@`@t@P`Rvh@P@蠨@@R@t@@@@@@P\P`X@\R\@T@\R\v6Ypt긨Ҹʸܾ\ [X\]ݗ[XWY[YB˜XYHUЛPY\Y]XLJ^[  HWTS\N[ H]ۛN[ HWYۛNB[ H]ۛN[ HWۛN[ HۛNH[ HX]N[Hݗ\YZN[HW\NH]HWYU\N[HWZؗ][]N[HWZN[YN [ ۛNBNB\\\T^[ H\]ڛTUғNBNB\\\P^[ H\]ڛTUғN[ HۛӓNBNB\\\U^[ H\]ڛTUғN[ H]ۛUӓNBNB\\\P^[ H\]ڛTUғN[ HۛӓN[ H]ۛUӓNBNB\S\P^[ \]ڛȔTUғN[ \]ڛTUғN[ ݗ\Y[ۛӓN[ ]ۛUӓNBNB[[\Q[ []J^\]]ʋNB!-bCPh)BEn BKѠH)lElNnl.e-Ln%mPVVWvVRvV2&WFVV6"WFV&6VGVV2FV&7S(yq +{q ++r;Ks+{y{Isc#+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ- +x Q6xd ^P ̆/"/&Y5A@ B^Ɔ$/@c&"/ B461Aج H^NE^E^@Ɔ!/bC՘ p׆5LY}AͥѥMg@ $!6,y!x!y1$' B2mX6^c6b6B6b6COLOR EnlX7^c6b6B6`6tUӓ,bBAڸ &SV_TargetڰxFxlllƆ@<6 1 +@ E\ݸ;0XG="`zL`: u`' ٵM ~]KY[[!,Ȣ +]KYݔ,*̽ɍѕMB-̽ɍM Zdx.source.mainFileNameSC2V'7V&w67%*dx.versionShBbfW&7%؋:dx.shaderModelS(C"W6V'7V67%8Jdx.typeAnnotationsSըCbVvD6EFW6%`:dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~qF <0Bm@5\DJM5m[,WBa A,DFh(+A 0n`|Œw$4L# `ugA 0n`A0a 2m.2m0I,Dӿ0BDBQD\D\=STAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePP,TJ +a + cA@<yLFD oM $Efe%&,f&gl&eCLb@  ql X/2<: Ld@4BYb`gCL\X[$`C0m &0׵!6 M2kCрj +Ks2e6F6A( Bl BMhBx b@@i**iPH 13`ӓP&IJAH5ذ0hA "') B% 00 ` `Agod*LnPL">91Ā5PX]T 30 Hs  /62sig_stD6(wy{Pͮ%̍nJT!s+K{sM\E2<90272)R ElNnlnJ@U"s˃+ rs{ K{sdu\Ȧʦ[2<27:<47)At!s{s+yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$5304a1fa15ccf571818a8020f8f25864.pdbHASHSq XdDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@< ygLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hQBbb dՆ  47.SV_Position Ά 6,q7xzJJzr цe``1$5A l 6, l_'|g@kIhPea)4ؾN 1(O 6`0hL&a!`s<; l ATacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+Pu\ȦʦV2<27:<47)AyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma ;A,FB)\Q)3# `iaȈA @[eY2b ƇT$ʈA ad$!̈A clԌ$A ]Έ 4c Q$ &h& h1LjD>f$1"ψA  m`A|ˆA  m`ALÈA  m`AxĈA  m`AADXBCbD\?rĎL4 DT#+++SFI0ISG1hqwPOSITIONCOLORTEXCOORDOSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV0@41 8POSITIONCOLORTEXCOORDPOSITIONCOLORTEXCOORDVSMainD +DBDD"D(B ILDB `1DXIL BC! ( #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F +ʀ3g(< ( yL d!у{KK{s*ã+zc{+sAcc4@ oM $Efe%&,f&gl&e@j),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h S\477float4xX@h|0c{ cdЀas `H0> "h$0Pws a6O4U< )c+k+s{sF@0(&1 ۸ Ma 0 <`X`䈃9}ͥѥ-bF 90 0 ce&vVF7&28`$D]ۛ 30:Bvectora 0`1@ 8``04P L+866 `m0 40571uB38`d`cPq0 &x09b5WGE5D% m..m4upH<¾1@sP +z{#[Mlp +`"a<ЃI0*`{A>4@L` ~ |ڞ܎Шɽ=1ѡe555im4(#DR<D (&+0:4<"float4x4xX@hX@h|8|,bF0`8|,b00_13q W "h`A(0%Y +xp @b8|,b0_23 4× "hpA(05] +xp @d8|,b00_33 T "hA(0Eq +xp @f8|,b0_431 t "hA(0B+B,B-B.B/B8C9C:0{{sVpdk΍nZA;l܆cwB*:;BXf +)N. *imN̬Lhꇤ-N. ffHh)Q/2<77E `` ~䀪䀀f~H䀚H`f-X==*33+zc{c} U% ՙXؕѽ5 m[}8{ S5G&G7&G8 zc{Jzs33+!+{j"ڶbp$@̍lMnSUF6&T46G'TgfV&4cCbW6F&D3$m@PGۛ kM*imN̬LhĮlMfHhHı272E `p ~䀪䀀f~H䀚H`b-XII #K[f~怪䀀f-XJJ*à s#cSUFT46G'TgfV&4$mĢ%\xTLWYU\47:2unsigned int{ d XVL0"0?u_effectType@UIConstBuffer@@3IB@,`&&}}مՕQ ~¾ʀ䀀f-XDNJ +cC #ST46G'TgfV&4$mb'xTY28:479::329 &m >Ǥ@z} ` 0` +al@6 l0%23$7727 lؠ,bC00_F@Dܾ\D蠨@P@蠨@@R@@@@蠨@@z@P蠨R`v@@@@\@z@P꾚X@\¾Rv@@@@\@z@\¾v@@@@\@z@\¾v@@@@\\@z@ڞ܎P\\X@\\Rv@@@@@v6AZpt긨Ҹʸܾ\ [X\]ݗ[XWY[YB˜XYHUЛPY\Y]XLJ^[  HWTS\N[ H]ۛN[ HWYۛNB[ H]ۛN[ HWۛN[ HۛNH[ HX]N[Hݗ\YZN[HW\NH]HWYU\N[HWZؗ][]N[HWZN[YN [ ۛNBNB\\\T^[ H\]ڛTUғNBNB\\\P^[ H\]ڛTUғN[ HۛӓNBNB\\\U^[ H\]ڛTUғN[ H]ۛUӓNBNB\\\P^[ H\]ڛTUғN[ HۛӓN[ H]ۛUӓNBNB\S\P^[ \]ڛȔTUғN[ \]ڛTUғN[ ݗ\Y[ۛӓN[ ]ۛUӓNBNB[[\Q[ []J^\]]ʋNBa-bCPh)BEn BKѠH)lElNnl.e-Ln%mPVVWvVRvV2&WFVV6"WFV&6VGVV2FV&7S(yq +{q ++r;Ks+{y{Isc#+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆ- + Y6z E_P ͆/@c/&Jzs33+ d/Dc4B/4 Ail 4 fc Lha{1A@ hԃYj6fd`?EljLj`1A@ hYԆj6Qfq`FJEnjLl-a1A@ m0@&̢7T7&ȶ 0 P՘ 4v,C5Vct X iklІmnoxdža/P<6 {A0C zzJJzr $! ^L0 ,cò1,6,zQzzAkIh,b2e6F6AH`ò1hxxذA}{~E|{dž,=>C/,#?6 "`Cň@㭎n\(`#0XG=6`zD`: Pu,%@B: @O#0XG=`z,`h: u @O zD@b: q "@wh&q " w66623)AX8bcksi{#c+s1c ;"YXacksI#+s%2<:27727)BZ#2<:224)` eNn̥-,()lJv\\xa ŮLn.mJN\}a e-L鍬mJf\a υ.,..mn`a ..l.lJv\#yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa /A,DFP*B5Pv%GgAF0c&L: v0A8`pȃ ¡c&LZ 0A8xap# `` 3$lh0 sP30b Ar0b ÌaD$2njP!3 AQ5?4q?0c@(# `,ɌA(#`PAn?F +A (um2c@` + wP330b āA0b ÌaD$rrn13 A5?Dm?0a$so4 zPA (y@p3a A5?Lo?0a$uq= |C | | |Ú | |C |Û |p |`C |P |p30b @PÄ0b @0Ä0bp Q< +hBL B0a& „0@  D~@Ax0a&0 h L 0aA4 +YhBL B0a& „0@  Di0a&0 h L 0a؄gƀ@.PF `j3x`1@` `@ W@ & 8L#`0łH\0a $ kp0b ,e` `@ Zp + `@ &[x `@ [ 82τ0b S.F0b .E0b .D0b 8?0c@(#`PÝx `Ä0b 8?0a A??L#`PCx Ä0b 8?0a A~??L#`PCx PPÌqfP +>2b 8?0c@AW +>bA"R @>3DD##`PzC30b 8?0a A!v?聯?L#`PÝzA 0 +   +A 0 + xL# `C*.B0a$ +Ä0b  8B.(0b  8B.0b  8B.B(0b  8B.(0b  8.(0b  8.0b  8.B(0b  8.(0b  8.(0b  8.3DSF|&0WP۔P&e|&0Եy q m i a ] Y Q T94mTQ/TQSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P .PPPPPP*P+PP-PQA$F +ʀb <@z,Fqy@@0A DyLFD oM $Efe%&,f&gl&eCLc@  l dg*imN̬Ln@$BYa` A `f +)N. o@(b0L4A Lg$"¸}ѕ Mg@@D6&6u_effectColor"ڀ ^Y7 zc{  J } MiAUM<&AΠB&"u_centerڀ jPuq/0 am06}MkAE̬l*l@`"` sPсUl¾&@Q6A X 28: m0>68LցAȁ@a  1 +! +0A`Cp +4܈@=M%Q%=9M +0 a! &LnP†PU`V`VCOLORAVZWXPa ==IM1 TՆEU`V`$V C,-pzKK{s da!rat\ap`a2*B+ ++†EU`V$V KE +P C-T` ]^ .TaF7"mn\h̥}Mo"8lPpU\A2<27)ф .ͮLnJP!sC #+kz#+c e\N%2<< 7707)(B2<$)0))!s)s˃zKsC2<:72)9yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$f407602663af4fa02e7a3a424cfacf2a.pdbHASH`&cO.z:BL*DXILp`DXILXBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePE@$F +ʀ y$@ydLFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.ӓԆe l *zz" A6,`օ]5#.SV_PositionBڰf` qq.L l xօmX0.L 1Ю1@Alʀ DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+Ukk|1E' DTD|t SFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV004 POSITIONCOLORTEXCOORDPSMainDD +DBDILDBX`DXIL@BC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L F2"H d""ㄡL Lt#%@`1RJT1B(b7 ?a!+!sA.BC0Ax9Cq (D It8fjq`pypZ(|zrR{(qw>0vxp6:0=ЃvHx_|r@I Ɓa hAAHƁA `/ᛤ)gY@"rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`C0@2L &GCBPeP#Q %QJ +a + cA<yWLF m..͍ NL.mm=271 47float4xX@h|0c{ cdAcS `F06 "h0PwcS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X`=(yq +{*{+{+{K{C #+{Isc#+{{JszsAccK4jj\]ڛ"h9@ b6F消1`8>v_fragmentColor!o 0bEW7&GFÌ-N]ݛ[ "hy E 0B + ! ` + 6TL @ ` E `o,b <:80@AL@ @6l&j: pjj +K#bFGGé-N. nj-ƇWL"h@(A0W"h@(A03P +qP @a8|,bFB0p_21! $×"hLA(A0%3T +qP @c8|,bFB0_31a D׌"h\A(A053X +qP @e8|,bFB0p_41 d"hlA(A0E3\ +qP @g8|,bFB0 PA(B)B*B+B,B-B.:7ipaLؾ…m(_I P,= +@E `P~꾚䀀f~HH`fH`f-XA9x9p+ãzc{[f|/2<77979::329 179& m @l?u_effectColor@UIConstBuffer@@3V?$vector@M$03@@B,ց}х ~䀪䀀f~H䀚H`f-X;x :P*s#zc{} U% ՙXؕѽ5 m[ytQ5&5{c{Jzs33+!+{j"ڶ`A-@k̍Lnd272979::329 179& m ^@D1(/0979::329 &m @D}U% ՙ4 m[~ SUffV6FGWF.͍L\ڙ[H 0815$AOWYU\PUЛPYLж @ : 6u_alpha_value068/0279::329 &m *^@<}U% ՙ4 m[h $~`AVGF-  *imN̬LhIhLĄ7/2<:2rTexture2D >`651  0l}ѕɕXPɕYؕѽ5m[ `2V&Cf* Ln.lL;!`682/ 682)02 m :B@sPvy}H x 0?l@6 l%23$7727 l`,bC0C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0P EPePQTJ +a + cA<yLFD oM $Efe%&,f&gl&eCLb@  ql X/2<: Ld@4BYb`gCL\X[$`C0m &0׵!6 M2kCрj +Ks2e6F6A( Bl BMhBx b@@i**iPH 13`ӓԆAo 1`  +"') E 00 ` `Agmd*LnPLb AlX7 `b `C07`CauuP,&Cc.싍\hЕ}ɵm@у= +]KYݔ BbW&76% ؅ٕM :dx.shaderModelS \[XܔDBWFF67%إ%MхѕM :dx.entryPointsS:B2VFW&77%yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5mILDN,$402b1040d619db2ffdbc89bb0f9924c6.pdbHASH@+@/$DXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L C2"H d""ㄡL Lh#%f`) BR˟VbFc* ?a!! UEc BȠ6GB#80@ 38C8<->C=C9)=8;;C8A;C9$0P@  P@ |`@lt`HMQ,DNDMrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0䁀 2L &GC"%0PP%QA$ʠF@<ygLFD oM $Efe%&,f&gl&eCLb@ a0(MdÀ$Ld@(ِ CCC<hQBbb dՆ  47.SV_Position Ά 6,q7xzJJzr цe``1$ai`:1&BkIh`fa13ؾN 10 6`0eL&4A X o 6oaP86XPͮ%̍nJT!s+K{sM\F2<90272)AR ElNnlnJ@!sK+K" +Xu\qyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` H;/D0! ap/0CM~q6 <0Bm@5\DJM5ma *A,F @BQ)3# `iaȈA @eY2b gT$Ɉ 4A BP 0  0@ # `ap# `a # `a` # `aDXBCR"+Wp0\41 DTl (( )SFI0ISG1\HQPOSITIONTEXCOORDOSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV04+ 4POSITIONTEXCOORDPOSITIONCOLORTEXCOORDVSMainD +BDDD"B ILDB``DXILHBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F +ʀ3g< yL d!1{KK{s*ã++sAcc4@ oM $Efe%&,f&gl&e@j),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h S\477float4xX@h|0c{ cdЀas `H0> "h$0Pws a6O4U< )c+k+s{sF@0(&1 ۸ Ma 0 <`X`䈃9}ͥѥ-bF 90 0 ce&vVF7&28`$D]ۛ 30:Bvectora 0`1@ 8``04P L+866 `m0 40571uB38`d`cPq0 &x09`b5WGEE% m..m4upHT¾1@sGl&ADha`{0AU 01{k{+s;b"*Cc&WvDTGapgj?D6~0 +\꾚pj K1c{ caT +wp #U +wp `8|,b0P_14qp ×L"h`A(0%#Y +wp b8|,b0_24p <L"hpA(05#] +wp d8|,b0P_34p \M"hA(0E#q +wp f8|,b0_441p |` + + P PDk΍nZA:l7:7iqLa B`,bp`;&+0:4<79::329 0:4<& m G@\17+ãzc{Jzs33+!+{j"ڶ`1p̬lnMqSUffV6F7&T46G'TgfV&4cCbW6F&D3$m8L]ۛ k.LnM*imN̬LhĮlMfHh>Ñ27779AOWۛPUЛPYЌ]ݛP ж~C u_color\77979::329 179& m  B@D1@6+s+Jzs33+!+{j"ڶ`1%q4$@K.,nn #KJzs33+iڶ`q)q8(@ .̍]OW\PUЛPYLж`A 2u_effectType$Թͥ12 0cX/!@@L d`}QU% ՙ$ m[p 8`SeVWF1 +cC c+Jzs33+iڶ`a7qD(+ -\OWZPUЛPYLжЉCB depth~Ѐ䀀f-XDOJlhA$LB%Z&pb'|b)! 3*K{s0AXp@@&Ha` SIsc#+{{JszsAccKiPhP{j +KsCKrIsIiPkP{yA{JiPHhPys{KK{sicCjj +KcIss {KK{sKiPys+z{#Iss +z{#iPhPys{KK{ss1{k{+s;b"*CCys{KK{sscys{KK{ssKiP+syiPkP g=(r +*+{+KC #+Jsc#+{{JszsAccK#// #license_text_nau_engine + +cbuffer UIConstBuffer : register(b1) +{ + float4x4 u_MVPMatrix; + float4 u_textColor; + float4 u_effectColor; + + float4 u_startColor; + float4 u_endColor; + float4 u_color; + + float2 u_center; + float u_radius; + float u_expand; + uint u_effectType; + float u_alpha_value; + float u_alpha; + float depth; + // float4 Color; +}; + +struct VsInputP +{ + float4 a_position : POSITION; +}; + +struct VsInputPC +{ + float4 a_position : POSITION; + float4 a_color : COLOR; +}; + +struct VsInputPT +{ + float4 a_position : POSITION; + float2 a_texCoord : TEXCOORD; +}; + +struct VsInputPTC +{ + float4 a_position : POSITION; + float4 a_color : COLOR; + float2 a_texCoord : TEXCOORD; +}; + +struct VsOutputPTC +{ + float4 position : SV_POSITION; + float4 v_position : POSITION; + float4 v_fragmentColor : COLOR; + float2 v_texCoord : TEXCOORD; +}; + +float fromOpenGLDepth(float z, float w) +{ + return (z+w)/2; +}P A@B  // +-ID"9:90241:2A΋SX݋SX]Y[KY[؛\KY[܋\YK[Yً[XZYOH)),ͭ孎%meM퍬lE̍L%m-e-LnCV62/23-WX(-".B.b..b(d E^Lf{Ann4 pg*imN̬Ln8 6&l8 &3A@ _Yj6~1dD`=EkFjLi@1A@ _Yj6~d1`HEmFjLk'A1A@ _Yj& @ ޘ /l,|5Rcp H m0'B˔\]ڛ! K^{{^G^G|lXb=أ=܃>==ӓԆ ==/ރ #>6,d1AxAdЏ0>(@4outputD@Db`Ȁ: input DDA`' @O# 0XG=`z`: $@OHL2XG=20.BdXd0.BdfB&v2V7% Gllvm.module.flagsS +llvm.identSD2V'7V2FWF77E8 pD2V'7VBVfV67%l̽ɍ9M [XKܔ.ؕͥM ]]ܔ`/̡5M \[Xܔ4,хѥM<إ%MхѕM K\[ܔDyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa A,DFP*B5Pv%GgAF0 c&L: v0A8`pစ A &/L_# `` 30b JAdL#`Ṕq?EA (rj1c@ #`PЁ̜q?EA (sj2c@ #`Pԁ o?L# `,Ʉ0b Ä0b JAL#`P܁o?L# `AAT˄0b Ä0b Ä0b  Ä0b Ä0b Ä0b Ä0b ÌQD~ Al?@w?0a Ai?@w?0aAT3ı0hL 0a&Ä0bp @ L 0a&00h1L#`A0hL 0a&Ä0bp )hL 0a&00h1L6a1 A0RA ,0F `R1X`1@i ,N> L`L#`08\0a  +hp`g1@)Ԡ`1@I `1@iؠ`0 3a T nA0a d o@A0a t pA0a A ??E PÄ0b /@?0a A ~??L#`P©t `Ä0b /@?0c@܁B A ??wЍBXPgƀgj7ό(Ȉ 0ÌQD~ A ?A?L#`PŸv 0Ä0b  /-<30b  /-,A 0P +@ }L# `B)-0a$ P n0a$ P @n0a$ P n0a$ P n0a$ p n0a$ p @n0a$ p n0a$ p n0a$ ` l0a$ ` @k0a~E|&0VPۓPd|&0Եi a ] Y Q M I A T94mTQ/TQSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P .PPPPPP*P+PP-PQxA$F +ʀb <@z,py@AyLFD oM $Efe%&,f&gl&eCLc@  l dg*imN̬Ln@$BYa` A `f +)N. o@(b0L4A Lg$"¸}ѕ Mg@@D6&6u_effectColor"ڀ ^Y7 zc{  J } MiAUM<&AΠB&"u_centerڀ jPuq/0 am06}MkAE̬l*l@`"` sPсUl¾&@Q6A X 28: m0>68LցAȁ@a  1 +! +0A`Cp +4܈@=M%Q%=9M +0 a! &LnP†PU`V`V"TEXCOORDb 6UadaXXaha e m..mPUVpV ˠ + +0 + ,6,.+, ,lX*YXVhYfbZ@.B/ll (/< 309insts£1vFFc.kn@|p@a)sfFVF7%ؕͥM &dx.valverSZY\Y۔)C"W6V'7V67%p*хѥM@إ%MхѕM NK\[ܔṌչѕM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$0a73ab1af55d080b88b9827ca90eea7d.pdbHASH +s] |}DXIL `DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePE@$F +ʀ yAy`LFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.Uӓ6a<®.0 tae m..mPHb ,2!#.n2Tօ}C6\hX =1=ImX .nâyօ}ç]`(3H50bfFVF7%ؕͥM &dx.valverSZY\Y۔ )C"W6V'7V67%xإ%MхѕM :dx.entryPointsS6yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@ma A,GR(B(1F ## ` ieʈA ߡe1b  # ``Am2b ($# ``u2b 07-#`Ќr| 0  0@ #`РĔhB&h &È 4mPEc0 B00 0bp h&h& h1؄g@ ; F 2X`@ <( 3b #`8\0b O|F 5 1@ `@ Ph @>#``d C +p@A0b O)D|,p$ +uP +ψA  PP +v$ +uP +A  PP +z0$ +u` +n0b *ԁ)A  PP +{# `BB)$ +un0b *A  PP +{# `BA)$ +u +l0b *A(DXBCaS:IR(0(0Ӫ! DTDH(0dSFI0ISG1SV_PositionPOSITIONCOLORTEXCOORDOSG14(@SV_TargetPSV04 POSITIONCOLORTEXCOORDPSMainDD +DBDILDB`6DXILBC! - #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L<#%9P( PRCDb"'rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@2L &GCB(2((,2("( yLFD m..ͭjML.mm=271 47float4xX@h|0c{ cdAcS `F06 "h0PwcS a6KD< )c+k+s{sF0(&1࠺ M 0 4`X`=(yq +{*{+{+{K{C #+{Isc#+{{JszsAccK4jj\]ڛ"h9@ b6F消1`8>v_fragmentColor!o 0bEW7&GFÌ-N]ݛ[ "hy E 0B + ! ` + 6TL @ ` E `o,b <:80@AL@ @6l&j: pjj +K#bFGGé-N. nj-ƇWL"h@(A0W"h@(A03P +qP @a8|,bFB0p_21! $×"hLA(A0%3T +qP @c8|,bFB0_31a D׌"h\A(A053X +qP @e8|,bFB0p_41 d"hlA(A0E3\ +qP @g8|,bFB0 PA(B)B*B+B,B-B.:7ipaLؾ…m(_I P,= +@E `P~꾚䀀f~HH`fH`f-MA9x9p+ãzc{[f|/2<77979::329 179& m @@l?u_effectColor@UIConstBuffer@@3V?$vector@M$03@@B&ց}х ~䀪䀀f~H䀚H`f-M;x :P*s#zc{} U% ՙXؕѽ5 m[ytQ5&5{c{Jzs33+!+{j"ڶ4A-@k̍Lnd272979::329 179& m @^@D1(/0979::329 &m @@D}U% ՙ4 m[~ SUffV6FGWF.͍L\ڙ[H 0815$AOWYU\PUЛPYLж @ : 6u_alpha_value068/0279::329 &m @*^@<}U% ՙ4 m[h $~`AVGF-  *imN̬LhIhLĄ7ԡaA!$R%^B&F=! L09327 FL $ ĪLn.m6  41:24::49430:47::::(!47::)/022:9747::/3277793 B܃".:.9:.:94902941:24::494`2–6V6WEWGVUvV֠Р0&VgfV&R46G'TgfV&"Wv6GW&"ҠנbFGGRdF'ӠbFGREWG7&ӠbFGRUffV6F7&ӠРbFGR5G&G7&ӠbFGRUF6&ӠbFGR5&ӠҠbF'R5VFW&ӠbFR%FV7ӠbFRUFӠRFRUffV6FGWӠbFReVWӠbFRӠbFBVGӠbFG2&ӠзӠР0G'W7Fb5WGՠנbFG6F4DӠзӠР0G'W7Fb5WG5ԠנbFG6F4DӠbFG5&2$ӠзӠР0G'W7Fb5WGEՠנbFG6F4DӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5WGE5ԠנbFG6F4DӠbFG5&2$ӠbF'EW7&GBU5$EӠзӠР0G'W7Fb5TGWGE5ԠנbFG6F2e4DӠbFGb6F4DӠbFGbe&vVF7&2$ӠbF'bEW7&GBU5$EӠзӠР`Fb&WvDTGbFbFrҠנ"WFW'r"ӠзA Z(PрВD4(yq +{*{+{+{K{C #+{Isc#+8ս8ɕձͽȕɽՑս̡t^^^^^^^^^^8hi*k+#"+;r B,Ƃ,ʂ,̂,-B-&1A@ [I6l&a h C[Ć.6 lau1Ap ]pzKK{s $!i6m1AH BlX"/b//آ//"POSITIONڰh_EhE__,&ȲA ذh_EhE__"') N^_[N 0 `2eE&wVF7AH K[^_[E[EilXcÐl(p `WG7.B`C @O#0XG=*`z\ ] ؙXݔ`&ٵձMj'ٵM r[X؛]a'|[X YY[ܔ`E2V'7VfVV6%:dx.source.argsSBbW&76%h&dx.valverSC2FV&FV6%Jdx.typeAnnotationsSCbVvD6EFW6%:dx.entryPointsSyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5m[,WBa \A,D#3@Y0 &# `T ÌApw AqPpÄ0b EM@L#`P`??0a$rUT ٨?L# ``V%5Ƅ0b f ZȪ?L#`Ph? ?0a ApÄ0b  fL#FqA 01M0a$ӴA 01MN0aSTAT`@DXILBC! 7 #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 2L &GC("((B*2("(ڱ yjLFD oM $Efe%&,f&gl&eCLa@  Ql `@,ˆ0 J3AX Cj),͍˔\]ڛX&! &E3A( !MTe qD&ųa骴.`@,&1A mXn*m Pa ==ImX<1J46cd*LnP@ &3".0 P(Q49 ИK;b#  +9 AA666427)AP ŮLn.mJ@4!s c+u\ئH%2<< 7707)AS ..l.lJ!s)s˃zKsA2<:72)yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5mILDN,$6ee0bdb46dbdfcdad66b3a3db729b12f.pdbHASHnུmk:=)/DXIL(`JDXILBC! A #AI29 %bEB B28K +2BH CF2BH"PAQ!FQ@  I`B 2" d""ㄡL L0#%90#@1DTDV  rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 2L &GC(b(2((B( rByTLFD oM $Efe%&,f&gl&eCLa@ a0(McÀ$a6Ah@M5qzKK{s X6`&Ea!(a"(TUғp6,Q5LLӓ@&DAظ KAt SFuD6,Q5\l *&SV_TargetٰbD Au20A1fFVF7%ؕͥM &dx.valverSZY\Y۔ CbVvD6EFW6%XṔAM yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` L;8 65m@5\DJM5ma A,D0P +T%# ``P!ÈA UH1b e@SR$q# `\FU1ˆA  QU0b eTB$rUDXBCn970 DTD@ X(((SFI0ISG14(POSITIONOSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV04" ,POSITIONPOSITIONCOLORTEXCOORDVSMainDD +DDBILDB``DXILHBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F + 3ge<yL d!{KK{szc{+sAcc4@ oM $Efe%&,f&gl&e@j),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h S\477float4xX@h|0c{ cdЀas `H0> "h$0Pws a6O4U< )c+k+s{sF@0(&1 ۸ Ma 0 <`X`䈃9}ͥѥ-bF 90 0 ce&vVF7&28`$D]ۛ 30:Bvectora 0`1@ 8``04P L+866 `m0 40571uB38`d`cPq0 &x09 b5WGE% m..m4updx l`Ltp\`wA<4@L` z |ڞ܎Шɽ=1ѡe555im4P<D &+0:4<"float4x4xX@hX@h|8|,b0`8|,b00_13Q` W "hXA(0%W +vp @b8|,b0_23` 4× "hhA(05[ +vp @d8|,b00_33` T "hxA(0E_ +vp @f8|,b0_43` t "hA(0B*B+B,B-B.B/B8C90{{sVppdk΍nZA:l܆CuB)9:"Xf +)N. *imN̬Lhꇤ-N. ffHh(Q/2<77E `` ~䀪䀀f~H䀚H`f-O<<*33+zc{c} U% ՙXؕѽ5 m[{8y S5G&G7&G8 zc{Jzs33+!+{j"ڶ>p$@̍lMnSUF6&T46G'TgfV&4cCbW6F&D3$m|bPGۛ kM*imN̬LhĮlMfHh?ñ272E `p ~䀪䀀f~H䀚H`b-OHH #K[f~怪䀀f-OII*à s#cSUFT46G'TgfV&4$m|"%TxLLWYU\47:2unsigned int{ \ XVK"0?u_effectType@UIConstBuffer@@3IB'XB&(&}}مՕQ ~¾ʀ䀀f-ODMI +cC #ST46G'TgfV&4$m|&pLY28:479::329 &m :d@x{Ї~ @ 0 +=l@6 l%23$7727 l ,bC0TF@Dܾ\D蠨@P@@@R@@@@蠨@@z@P蠨R`v@@@@\@z@P꾚X@\¾Rv@@@@\@z@v@@@@\\@z@ڞ܎P\\X@\\Rv@@@@@v6AYpt긨Ҹʸܾ\ [X\]ݗ[XWY[YB˜XYHUЛPY\Y]XLJ^[  HWTS\N[ H]ۛN[ HWYۛNB[ H]ۛN[ HWۛN[ HۛNH[ HX]N[Hݗ\YZN[HW\NH]HWYU\N[HWZؗ][]N[HWZN[YN [ ۛNBNB\\\T^[ H\]ڛTUғNBNB\\\P^[ H\]ڛTUғN[ HۛӓNBNB\\\U^[ H\]ڛTUғN[ H]ۛUӓNBNB\\\P^[ H\]ڛTUғN[ HۛӓN[ H]ۛUӓNBNB\S\P^[ \]ڛȔTUғN[ \]ڛTUғN[ ݗ\Y[ۛӓN[ ]ۛUӓNBNB[[\Q[ []J^\]]ʋNB,bCPh)BEn BKѠH)lElNnl.e-Ln%mPVVWvVRvV2&WFVV6"WFV&6VGVV2FV&7S(yq +{q ++r;Ks+{y{Isc#+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆf- +h x Y6vq E^P ͆a/.&Jzs33+ ./.4 Ahl @4 fc Lh!wa1A@ _ăXi6|Qbqd`>EkiLj a1A@ _XĆi6|b1q`EIEmiLl)!a1A@ m0%"7LC7&ȶ  0Ә /nB,|4Nct 8 hjklІmnodž.HC<6 wA0C yzJJzr $! ]L0 A,craq2e6F6AH`raqd 6,vQvvbIjaD6b!XX@Ї}~l? 147:q "|Bzu`'@ @OL02VGWG7.@LD8@O zD@b: u ' @O +#0! +q f2! +qNxacks!;s#6667:23)O666427)XX"s{+s{s+s"Z8"s{+s!+3Ks+ \\܌ʜʦia eNn%LlnJ@V\ܦw .ͮLnJv\ئ|a ElNnlnJ \ʂQv\Ȧʦa ϥ̍N.-͍nnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa A,DFP*BUv3%GgAF0c&L: v0A8\apᰅ ¡ &G/L_ 0A8# `` 3D0b JTL#`PAKt?L# `AA$Ƅ0b @Ä0b tL#`PA͝t?L# `PȄ0b pÄ0b `Ä0b PÄ0b @Ä0b ÌqD| Aas?8q?0a Aan?8q?0aA4J3D0hL 0a&Ä0bp <L 0a&00h1L#`0hL 0a&Ä0bp (dTL 0a&00h1L6a1 A0N ,0F `B0X`1@) ,N> L@L#`0B8\0a  +fp`g1@Р`1@  `1@)Ԡ`0 3a 4 lA0a D m@A0a T nA0a A ?A?G 0Ä0b . ?0a A ?A?L#`݂+hBL#`Ptp30 30b E/P?0c@ 0c@(#`Pv30@ 30b /p?0c@#`Pw 00Ä0b /p?0a A ?A?w` ##`P©w3t #f(1  3c@A +22b E8?0c@#`PyC 0CÄ0b E8?0a$ p +Ԍ0|$ p pЄ0b /-A 0 +p L# `*-BL# `*-AL# `*-AL# `*-BL# `*-1a$ pń0b /.A 0 +p 0L# `*-BL# `*-AL8c@4@E|&0XVP[Pd|&0Եa Y U Q I E A 9 T94mTQ/TQSTAT`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0P .PPPPPP*P+PP-PQ~A$F + b <@z,pyyLFD oM $Efe%&,f&gl&eCLc@  l dg*imN̬Ln@$BYa` A `f +)N. o@(b0L4A Lg$"¸}ѕ Mg@@D6&6u_effectColor"ڀ ^Y7 zc{  J } MiAUM<&AAΠB0n"R5VFW&7A X' #K i HW\6Tq`]d&6A 2Xu+ -.l@h *<.u_alphab` zPu +C kdAl&00 +R0 P + 6@j),͍TUғ BbP6+lXUXVhV\`X)/47 B1bVZW X&lXUXVh[\a`X`1$apaXlap`Uӓ6,.+- P.l jr6 BR[49 јK;b#1v5G7A 8 0C9TacksI#+sU\ܦD2<062)AQ e-L鍬mJ!s+{+8\ʂP +u\ȦʦP ϥ̍N.-͍nnJ ]\yL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$9367f8890585daa08f80b30d9da2e615.pdbHASHgڠ DXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@ 2L &GC"%0PPePE@$F + yy]LFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.nCqzKK{s ц,0!#.nPH.L l ѰzbzڰAX&CFGkIhi A 6a0fO DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+#`B`d # +n@A0b (D 4i + 0  0@ f( 3b H+*(P# `*4b H+*B# `*2b H+A*(A   +y# `*A$ +x +q0b H+((# `*A1b H+(B# `*0b H+)(A   +yDXBCg!lGA@ @0 DTD@8 ' (<(SFI0ISG14(POSITIONOSG1 SV_PositionPOSITIONCOLORTEXCOORDPSV04" ,POSITIONPOSITIONCOLORTEXCOORDVSMainDD +DDB/OILDB`|DXILBC! s #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L )2"H d""ㄡL Lx#%@`1RJT1B(bG ?a!F+1m#s(3\=@3, +^!b):М#QBF $qH`594mTQj2c}:Nrt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 0@0䉀`3`,2L &GCBPeP#Q .P%QPP*P+PP-PA$F + 3geyL d!Q{KK{s+sAcc4@ oM $Efe%&,f&gl&e@j),͍{PVBU6G"W6V'7V6R2FV&76VGV566VG6ǖ6h S\477float4xX@h|0c{ cdЀas `H0> "h$0Pws a6O4U< )c+k+s{sF@0(&1 ۸ Ma 0 <`X`䈃9}ͥѥ-bF 90 0 ce&vVF7&28`$D]ۛ 30:Bvectora 0`1@ 8``04P L+866 `m0 40571uB38`d`cPq0 &x09 b5WGE% m..m4updx l`Ltp\`wA<4@L` z |ڞ܎Шɽ=1ѡe555im4P<D &+0:4<"float4x4xX@hX@h|8|,b0`8|,b00_13Q` W "hXA(0%W +vp @b8|,b0_23` 4× "hhA(05[ +vp @d8|,b00_33` T "hxA(0E_ +vp @f8|,b0_43` t "hA(0B*B+B,B-B.B/B8C90{{sVppdk΍nZA:l܆CuB)9:"Xf +)N. *imN̬Lhꇤ-N. ffHh(Q/2<77E `` ~䀪䀀f~H䀚H`f-O<<*33+zc{c} U% ՙXؕѽ5 m[{8y S5G&G7&G8 zc{Jzs33+!+{j"ڶ>p$@̍lMnSUF6&T46G'TgfV&4cCbW6F&D3$m|bPGۛ kM*imN̬LhĮlMfHh?ñ272E `p ~䀪䀀f~H䀚H`b-OHH #K[f~怪䀀f-OII*à s#cSUFT46G'TgfV&4$m|"%TxLLWYU\47:2unsigned int{ \ XVK"0?u_effectType@UIConstBuffer@@3IB'XB&(&}}مՕQ ~¾ʀ䀀f-ODMI +cC #ST46G'TgfV&4$m|&pLY28:479::329 &m :d@x{Ї~ @ 0 +=l@6 l%23$7727 l ,bC0PUF@Dܾ\D蠨@P@@@R@@@@蠨@@z@P蠨R`v@@@@\@z@P꾚X@\¾Rv@@@@\@z@\¾v@@@@\\@z@ڞ܎P\\X@\\Rv@@@@@v6AYpt긨Ҹʸܾ\ [X\]ݗ[XWY[YB˜XYHUЛPY\Y]XLJ^[  HWTS\N[ H]ۛN[ HWYۛNB[ H]ۛN[ HWۛN[ HۛNH[ HX]N[Hݗ\YZN[HW\NH]HWYU\N[HWZؗ][]N[HWZN[YN [ ۛNBNB\\\T^[ H\]ڛTUғNBNB\\\P^[ H\]ڛTUғN[ HۛӓNBNB\\\U^[ H\]ڛTUғN[ H]ۛUӓNBNB\\\P^[ H\]ڛTUғN[ HۛӓN[ H]ۛUӓNBNB\S\P^[ \]ڛȔTUғN[ \]ڛTUғN[ ݗ\Y[ۛӓN[ ]ۛUӓNBNB[[\Q[ []J^\]]ʋNB,bCPh)BEn BKѠH)lElNnl.e-Ln%mPVVWvVRvV2&WFVV6"WFV&6VGVV2FV&7S(yq +{q ++r;Ks+{y{Isc#+{{+{i{#c+{+s#+{Isc#+{q {C #+ТƦ%M심LCֆf- +h x Y6vq E^P ͆a/.&Jzs33+ ./.4 Ahl @4 fc Lh!wa1A@ _ăXi6|Qbqd`>EkiLj a1A@ _XĆi6|b1q`EIEmiLl)!a1A@ m0%"7LC7&ȶ  0Ә /nB,|4Nct 8 hjklІmnodž.HC<6 wA0C yzJJzr $! ]L0 A,craq2e6F6AH`raqd 6,vQvvbIjaD6b!XX@Ї}~l? 1:::q "|1z$`X: u,%@A: @O#0XG=`0A`'@$&Z#P! +q f2! +qNxacks!;s#6667:23)O666427)XX"s{+s{s+s"Z8"s{+s!+3Ks+ \\܌ʜʦia eNn%LlnJ@V\ܦw .ͮLnJv\ئ|a ElNnlnJ \ʂQv\Ȧʦa ϥ̍N.-͍nnJyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm4\BDͰ&0 <<mpK(5=mpOD4!@m[,WBa A,DFP*B5Pv%GgAF0 +c&L: v0A8\apᰅ ¡ # `` 3D0b JdL#`PAKt?GA (ri1c@#`PAt?GA (sj2c@#`PA͝t?GA (tkT2c@#`PAt?G v@#C3D0b Ä0b Ä0b Ä0b ÌqD| Aam?8x?0a Aaj?8x?0aA4I3D0hL 0a&Ä0bp 8L 0a&00h1L#`0hL 0a&Ä0bp (`TL 0a&00h1L6a1 A0N ,0F `B0X`1@) ,N> L@L#`0B8\0a  +fp`g1@Р`1@  `1@)Ԡ`0 3a 4 lA0a D m@A0a T nA0a A ??G 0@Ä0b . ?0a A ??L#`Prî pÄ0b . ?0a A ??L#`PBrê3A(Ȉ  Ìq](Ȉ|f 68LցAȁ@a  1 +! +0A`Cp +4܈@=M%Q%=9M +0 a! &LnP†PU`V`V A,pzKK{s ca!fah\ap`aPePU`VVCOLOR VZWXPa ==ImjR*B+` +n!xa l(D!|hͱHs /62sig_stۀ09C666427)AP ŮLn.mJ@4!s c+u\ئH2<:)S υ.,..mn +P ..l.lJp +u\Ѕ e΍LnnJPyL3f=C8ÌByxsq 3 BΡf0=C8=C==xtp{yHppzpvxp 0n0P3!!af0;;C9<<;v`{h7hrh7pp`v(vvxw_qry,0bȡ̡a!āa֐C9C9C9C98C8;/<;; !|pz(vC Pq ` l;/TQQCIm[4\BDͰ0 <<mpK(5=mpOD4!@mILDN,$bc0157d351136b1d923975c4bc1fa2e6.pdbHASHWQk9uļDXIL`DXILBC!  #AI29 %bEB B28K +2RH CF2BH"PAQ)FQ@  m0 I`B L '2"H d""ㄡL Ll#%f`) BR˟|n1T.BC0B1`I #Caa8pi0|WF6(5Z1rt`6hyhr PmzPmz0rs mqs mxs mq`z0r0rs mv@z`tvs m`s z0r`tv@mxq`z0rv@C< y 4@ 0y`#0@2L &GC"%0PPePE@$F + ^y]LFD oM $Efe%&,f&gl&eCLc@ a0(MdÀ$!LeB, 1 !p6Da5Fi**iP8 `6ڶa!*®!#.nCqzKK{s ц,0!#.nPH.L l ѰzbzڰAX&CFGkIhi A 6a0fO DTacksI#+sU\ܦD2<062)Q e-L鍬mJ!s+{+#`B`d # +n@A0b (D|,`$ +s0 +ψA  00 +t$ +s0 +A  00 +y0$ +s@ +j0b *)A  00 +x# `($ +sl0b *AA  0}0 +x# `($ +sl0b * \ No newline at end of file diff --git a/project_templates/sample_scene/resources/ui/shaders/include/cocos_in_out.hlsli b/project_templates/sample_scene/resources/ui/shaders/include/cocos_in_out.hlsli new file mode 100644 index 00000000..25734ead --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/include/cocos_in_out.hlsli @@ -0,0 +1,59 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +cbuffer UIConstBuffer : register(b1) +{ + float4x4 u_MVPMatrix; + float4 u_textColor; + float4 u_effectColor; + + float4 u_startColor; + float4 u_endColor; + float4 u_color; + + float2 u_center; + float u_radius; + float u_expand; + uint u_effectType; + float u_alpha_value; + float u_alpha; + float depth; + // float4 Color; +}; + +struct VsInputP +{ + float4 a_position : POSITION; +}; + +struct VsInputPC +{ + float4 a_position : POSITION; + float4 a_color : COLOR; +}; + +struct VsInputPT +{ + float4 a_position : POSITION; + float2 a_texCoord : TEXCOORD; +}; + +struct VsInputPTC +{ + float4 a_position : POSITION; + float4 a_color : COLOR; + float2 a_texCoord : TEXCOORD; +}; + +struct VsOutputPTC +{ + float4 position : SV_POSITION; + float4 v_position : POSITION; + float4 v_fragmentColor : COLOR; + float2 v_texCoord : TEXCOORD; +}; + +float fromOpenGLDepth(float z, float w) +{ + return (z+w)/2; +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/cameraClear_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/cameraClear_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/cameraClear_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/cameraClear_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/cameraClear_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/cameraClear_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/etc1Gray_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/etc1Gray_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/etc1Gray_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/etc1_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/etc1_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/etc1_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/grayScale_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/grayScale_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/grayScale_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/labelDistanceFieldGlow_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/labelDistanceFieldGlow_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/labelDistanceFieldGlow_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/labelOutline_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/labelOutline_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/labelOutline_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/label_distanceNormal_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/label_distanceNormal_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/label_distanceNormal_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/label_normal_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/label_normal_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/label_normal_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/layer_radialGradient_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/layer_radialGradient_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/layer_radialGradient_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionColorLengthTexture_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionColorLengthTexture_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionColorLengthTexture_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionColorLengthTexture_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionColorLengthTexture_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionColorLengthTexture_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionColorTextureAsPointsize_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionColorTextureAsPointsize_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionColorTextureAsPointsize_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionColor_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionColor_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionColor_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionColor_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionColor_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionColor_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColorAlphaTest_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColorAlphaTest_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColorAlphaTest_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColor_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColor_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColor_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColor_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColor_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionTextureColor_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionTexture_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionTexture_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionTexture_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionTexture_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionTexture_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionTexture_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionUColor_frag.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionUColor_frag.blk new file mode 100644 index 00000000..08feaea2 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionUColor_frag.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="ps" + entry:t="PSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/positionUColor_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/positionUColor_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/positionUColor_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/meta/position_vert.blk b/project_templates/sample_scene/resources/ui/shaders/meta/position_vert.blk new file mode 100644 index 00000000..bec0b0f7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/meta/position_vert.blk @@ -0,0 +1,15 @@ +compile_configs { + config { + stage:t="vs" + entry:t="VSMain" + } +} + + +permutations { + permutation { + name:t="regular" + defines { + } + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/cameraClear_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/cameraClear_frag.hlsl new file mode 100644 index 00000000..e9f0e527 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/cameraClear_frag.hlsl @@ -0,0 +1,7 @@ +#include "cocos_in_out.hlsli" + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + return input.v_fragmentColor.bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/cameraClear_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/cameraClear_vert.hlsl new file mode 100644 index 00000000..888e5539 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/cameraClear_vert.hlsl @@ -0,0 +1,16 @@ +#include "cocos_in_out.hlsli" + + +VsOutputPTC VSMain( VsInputPTC input ) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = input.a_position; + output.position.z = fromOpenGLDepth(depth, 1); + output.position.w = 1.0; + output.v_texCoord = input.a_texCoord; + output.v_fragmentColor = input.a_color; + + return output; +} + diff --git a/project_templates/sample_scene/resources/ui/shaders/src/etc1Gray_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/etc1Gray_frag.hlsl new file mode 100644 index 00000000..2e991204 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/etc1Gray_frag.hlsl @@ -0,0 +1,23 @@ +#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); +Texture2D u_texture1 : register(t1); +SamplerState sampler_1 : register(s1); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 texColor = u_texture.Sample(sampler_0, input.v_texCoord).bgra; + texColor.a = u_texture1.Sample(sampler_1, input.v_texCoord).r; + texColor.rgb *= texColor.a; // premultiply alpha channel + + texColor = input.v_fragmentColor * texColor; + + float4 ret; + ret.rgb = float(0.2126*texColor.r + 0.7152*texColor.g + 0.0722*texColor.b).rrr; + ret.a = texColor.a; + + return ret.bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/etc1_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/etc1_frag.hlsl new file mode 100644 index 00000000..3588b82a --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/etc1_frag.hlsl @@ -0,0 +1,17 @@ +#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); +Texture2D u_texture1 : register(t1); +SamplerState sampler_1 : register(s1); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 texColor = float4(u_texture.Sample(sampler_0, input.v_texCoord).bgr, u_texture1.Sample(sampler_1, input.v_texCoord).r); + + texColor.rgb *= texColor.a; // Premultiply with Alpha channel + + return (texColor * input.v_fragmentColor).bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/grayScale_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/grayScale_frag.hlsl new file mode 100644 index 00000000..b04a20bf --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/grayScale_frag.hlsl @@ -0,0 +1,15 @@ +#include "cocos_in_out.hlsli" + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 c = u_texture.Sample(sampler_0, input.v_texCoord).bgra; + c = input.v_fragmentColor * c; + float4 result; + result.xyz = float(0.2126*c.r + 0.7152*c.g + 0.0722*c.b).xxx; + result.w = c.w; + return result.bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/labelDistanceFieldGlow_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/labelDistanceFieldGlow_frag.hlsl new file mode 100644 index 00000000..68ab06a0 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/labelDistanceFieldGlow_frag.hlsl @@ -0,0 +1,34 @@ +#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 sample = u_texture.Sample(sampler_0, input.v_texCoord); + // fontAlpha == 1 means the area of solid text (without edge) + // fontAlpha == 0 means the area outside text, including outline area + // fontAlpha == (0, 1) means the edge of text + float fontAlpha = sample.a; + + // outlineAlpha == 1 means the area of 'solid text' and 'solid outline' + // outlineAlpha == 0 means the transparent area outside text and outline + // outlineAlpha == (0, 1) means the edge of outline + float outlineAlpha = sample.r; + + if (u_effectType == 0) // draw text + { + return (input.v_fragmentColor * float4(u_textColor.rgb, u_textColor.a * fontAlpha)).bgra; + } + else if (u_effectType == 1) // draw outline + { + // multipy (1.0 - fontAlpha) to make the inner edge of outline smoother and make the text itself transparent. + return (input.v_fragmentColor * float4(u_effectColor.rgb, u_effectColor.a * outlineAlpha * (1.0 - fontAlpha))).bgra; + } + else // draw shadow + { + return (input.v_fragmentColor * float4(u_effectColor.rgb, u_effectColor.a * outlineAlpha)).bgra; + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/labelOutline_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/labelOutline_frag.hlsl new file mode 100644 index 00000000..65551ec7 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/labelOutline_frag.hlsl @@ -0,0 +1,33 @@ +#include "cocos_in_out.hlsli" + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + +float4 PSMain(VsOutputPTC input) : + SV_Target +{ + float4 sample = u_texture.Sample(sampler_0, input.v_texCoord).bgra; + // fontAlpha == 1 means the area of solid text (without edge) + // fontAlpha == 0 means the area outside text, including outline area + // fontAlpha == (0, 1) means the edge of text + float fontAlpha = sample.a; + + // outlineAlpha == 1 means the area of 'solid text' and 'solid outline' + // outlineAlpha == 0 means the transparent area outside text and outline + // outlineAlpha == (0, 1) means the edge of outline + float outlineAlpha = sample.r; + + if (u_effectType == 0) // draw text + { + return (input.v_fragmentColor * float4(u_textColor.rgb, u_textColor.a * fontAlpha)).bgra; + } + else if (u_effectType == 1) // draw outline + { + // multipy (1.0 - fontAlpha) to make the inner edge of outline smoother and make the text itself transparent. + return (input.v_fragmentColor * float4(u_effectColor.rgb, u_effectColor.a * outlineAlpha * (1.0 - fontAlpha))).bgra; + } + else // draw shadow + { + return (input.v_fragmentColor * float4(u_effectColor.rgb, u_effectColor.a * outlineAlpha).bgra); + } +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/ui/shaders/src/label_distanceNormal_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/label_distanceNormal_frag.hlsl new file mode 100644 index 00000000..6389ed2b --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/label_distanceNormal_frag.hlsl @@ -0,0 +1,19 @@ +#include "cocos_in_out.hlsli" + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + +float4 PSMain(VsOutputPTC input) : SV_Target +{ + float4 color = u_texture.Sample(sampler_0, input.v_texCoord).bgra; + // the texture use dual channel 16-bit output for distance_map + // float dist = color.b+color.g/256.0; + // the texture use single channel 8-bit output for distance_map + float dist = color.a; + // TODO: Implementation 'fwidth' for glsl 1.0 + // float width = fwidth(dist); + // assign width for constant will lead to a little bit fuzzy,it's temporary measure. + float width = 0.04; + float alpha = smoothstep(0.5 - width, 0.5 + width, dist) * u_textColor.a; + return (input.v_fragmentColor * float4(u_textColor.rgb, alpha)).bgra; +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/ui/shaders/src/label_normal_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/label_normal_frag.hlsl new file mode 100644 index 00000000..f9f4c01a --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/label_normal_frag.hlsl @@ -0,0 +1,12 @@ +#include "cocos_in_out.hlsli" + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + +float4 PSMain(VsOutputPTC input) : SV_Target +{ + return float4( + (input.v_fragmentColor*u_textColor.bgra).rgb, // RGB from uniform + (u_texture.Sample(sampler_0, input.v_texCoord) * u_textColor).a // A from texture & uniform + ).bgra; +} \ No newline at end of file diff --git a/project_templates/sample_scene/resources/ui/shaders/src/layer_radialGradient_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/layer_radialGradient_frag.hlsl new file mode 100644 index 00000000..572f04da --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/layer_radialGradient_frag.hlsl @@ -0,0 +1,22 @@ +#include "cocos_in_out.hlsli" + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float d = distance(input.v_position.xy, u_center) / u_radius; + if (d <= 1.0) + { + if (d <= u_expand) + { + return u_startColor.bgra; + } + else + { + return lerp(u_startColor, u_endColor, (d - u_expand) / (1.0 - u_expand)).bgra; + } + } + else + { + return float4(0.0, 0.0, 0.0, 0.0); + } +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionColorLengthTexture_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionColorLengthTexture_frag.hlsl new file mode 100644 index 00000000..c65d45ec --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionColorLengthTexture_frag.hlsl @@ -0,0 +1,7 @@ +#include "cocos_in_out.hlsli" + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + return (input.v_fragmentColor*step(0.0, 1.0 - length(input.v_texCoord))).bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionColorLengthTexture_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionColorLengthTexture_vert.hlsl new file mode 100644 index 00000000..afbcca8b --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionColorLengthTexture_vert.hlsl @@ -0,0 +1,13 @@ +#include "cocos_in_out.hlsli" + +VsOutputPTC VSMain(VsInputPTC input) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + output.v_texCoord = input.a_texCoord; + output.v_fragmentColor = float4(input.a_color.rgb * input.a_color.a * u_alpha, input.a_color.a * u_alpha); + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionColorTextureAsPointsize_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionColorTextureAsPointsize_vert.hlsl new file mode 100644 index 00000000..538dfb90 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionColorTextureAsPointsize_vert.hlsl @@ -0,0 +1,13 @@ +#include "cocos_in_out.hlsli" + +VsOutputPTC VSMain(VsInputPC input) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + // gl_PointSize = input.a_texCoord; TODO: Geometry shader required + output.v_fragmentColor = float4(input.a_color.rgb * input.a_color.a * u_alpha, input.a_color.a * u_alpha); + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionColor_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionColor_frag.hlsl new file mode 100644 index 00000000..bc94e5e8 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionColor_frag.hlsl @@ -0,0 +1,7 @@ +#include "cocos_in_out.hlsli" + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + return input.v_fragmentColor; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionColor_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionColor_vert.hlsl new file mode 100644 index 00000000..413f0c72 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionColor_vert.hlsl @@ -0,0 +1,14 @@ +#include "cocos_in_out.hlsli" + + + +VsOutputPTC VSMain( VsInputPC input ) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + output.v_fragmentColor = input.a_color; + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColorAlphaTest_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColorAlphaTest_frag.hlsl new file mode 100644 index 00000000..d3725434 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColorAlphaTest_frag.hlsl @@ -0,0 +1,15 @@ +#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + float4 texColor = u_texture.Sample(sampler_0, input.v_texCoord).bgra; + if ( texColor.a <= u_alpha_value ) + discard; + + return (texColor * input.v_fragmentColor).bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColor_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColor_frag.hlsl new file mode 100644 index 00000000..acd0bfee --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColor_frag.hlsl @@ -0,0 +1,11 @@ +#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + return (u_texture.Sample(sampler_0, input.v_texCoord).bgra * input.v_fragmentColor).bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColor_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColor_vert.hlsl new file mode 100644 index 00000000..48545d4c --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionTextureColor_vert.hlsl @@ -0,0 +1,15 @@ +#include "cocos_in_out.hlsli" + + +VsOutputPTC VSMain( VsInputPTC input ) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + output.v_texCoord = input.a_texCoord; + output.v_fragmentColor = input.a_color; + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} + diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionTexture_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionTexture_frag.hlsl new file mode 100644 index 00000000..8a9b6a3b --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionTexture_frag.hlsl @@ -0,0 +1,11 @@ +#include "cocos_in_out.hlsli" + + +Texture2D u_texture : register(t0); +SamplerState sampler_0 : register(s0); + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + return u_texture.Sample(sampler_0, input.v_texCoord); +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionTexture_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionTexture_vert.hlsl new file mode 100644 index 00000000..b90b843c --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionTexture_vert.hlsl @@ -0,0 +1,12 @@ +#include "cocos_in_out.hlsli" + +VsOutputPTC VSMain( VsInputPT input ) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + output.v_texCoord = input.a_texCoord; + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionUColor_frag.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionUColor_frag.hlsl new file mode 100644 index 00000000..e9f0e527 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionUColor_frag.hlsl @@ -0,0 +1,7 @@ +#include "cocos_in_out.hlsli" + + +float4 PSMain( VsOutputPTC input ) : SV_Target +{ + return input.v_fragmentColor.bgra; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/positionUColor_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/positionUColor_vert.hlsl new file mode 100644 index 00000000..48a97c03 --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/positionUColor_vert.hlsl @@ -0,0 +1,14 @@ +#include "cocos_in_out.hlsli" + + + +VsOutputPTC VSMain( VsInputP input ) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + output.v_fragmentColor = u_color; + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} diff --git a/project_templates/sample_scene/resources/ui/shaders/src/position_vert.hlsl b/project_templates/sample_scene/resources/ui/shaders/src/position_vert.hlsl new file mode 100644 index 00000000..cdbdba2d --- /dev/null +++ b/project_templates/sample_scene/resources/ui/shaders/src/position_vert.hlsl @@ -0,0 +1,14 @@ +#include "cocos_in_out.hlsli" + + + +VsOutputPTC VSMain( VsInputP input ) +{ + VsOutputPTC output = (VsOutputPTC)0; + + output.position = mul(u_MVPMatrix, input.a_position); + output.v_position = input.a_position; + + output.position.z = fromOpenGLDepth(output.position.z, output.position.w); + return output; +} diff --git a/project_templates/sample_scene/source/game/main_module/CMakeLists.txt b/project_templates/sample_scene/source/game/main_module/CMakeLists.txt new file mode 100644 index 00000000..69f07a56 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/CMakeLists.txt @@ -0,0 +1,52 @@ +set(TargetName MainGameModule) + +nau_collect_files(Sources + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} + MASK "*.cpp" "*.h" +) + +nau_add_module(${TargetName} + SOURCES ${Sources} +) + +target_precompile_headers(${TargetName} PRIVATE pch.h) + +target_link_libraries(${TargetName} PUBLIC + NauFramework + CoreInput + Animation + Physics + Graphics +) + +nau_target_link_modules(${TargetName} + PlatformApp + Animation + CoreScene + CoreAssets + GraphicsAssets + DebugRenderer + CoreAssetFormats + CoreInput + Graphics + Physics + PhysicsJolt +) + +target_include_directories(${TargetName} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_include_directories(${TargetName} PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/public) + +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${Sources}) + +if (TARGET NauKernel_Import AND TARGET NauFramework_Import) + add_dependencies(${TargetName} NauKernel_Import NauFramework_Import) +endif() + +install(TARGETS ${TargetName} + DESTINATION bin +) \ No newline at end of file diff --git a/project_templates/sample_scene/source/game/main_module/module.cpp b/project_templates/sample_scene/source/game/main_module/module.cpp new file mode 100644 index 00000000..8140ec71 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/module.cpp @@ -0,0 +1,27 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#include "nau/module/module.h" + +#include "myapi_impl.h" +#include "rotator.h" +#include "mover.h" + +class MainGameModule final : public nau::DefaultModuleImpl +{ + nau::string getModuleName() override + { + return "MainGameModule"; + } + + void initialize() override + { + NAU_MODULE_EXPORT_SERVICE(MyApiImpl); + nau::getServiceProvider().addClass(); + nau::getServiceProvider().addClass(); + } +}; + + +IMPLEMENT_MODULE(MainGameModule) diff --git a/project_templates/sample_scene/source/game/main_module/mover.cpp b/project_templates/sample_scene/source/game/main_module/mover.cpp new file mode 100644 index 00000000..556a468f --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/mover.cpp @@ -0,0 +1,57 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#include "mover.h" + +NAU_IMPLEMENT_DYNAMIC_OBJECT(MyMover) + +void MyMover::updateComponent(float dt) +{ + nau::math::Transform transform = getParentObject().getTransform(); + m_time += dt; + const float period = std::remainderf(m_time * m_frequency + m_phase, PI); + NAU_LOG_WARNING("MainGameModule updateComponent period{}", period); + + if (m_axis == AxisM::X) + { + transform.addTranslation(nau::math::vec3(sinf(period) * m_amplitude,0,0)); + } + else if (m_axis == AxisM::Y) + { + transform.addTranslation(nau::math::vec3(0, sinf(period) * m_amplitude, 0)); + } + else + { + transform.addTranslation(nau::math::vec3(0, 0, sinf(period) * m_amplitude)); + } + getParentObject().setTransform(transform); +} + +void MyMover::setRotationAxis(AxisM axis) +{ + value_changes_scope; + + m_axis = axis; +} + +void MyMover::setFrequency(float frequency) +{ + value_changes_scope; + + m_amplitude = frequency; +} + +void MyMover::setPhase(float phase) +{ + value_changes_scope; + + m_phase = phase; +} + +void MyMover::setAmplitude(float amplitude) +{ + value_changes_scope; + + m_amplitude = amplitude; +} diff --git a/project_templates/sample_scene/source/game/main_module/mover.h b/project_templates/sample_scene/source/game/main_module/mover.h new file mode 100644 index 00000000..876efa2a --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/mover.h @@ -0,0 +1,44 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#pragma once +#include "nau/scene/components/component.h" +#include "nau/scene/components/component_life_cycle.h" +#include "nau/scene/scene_object.h" +#include "nau/utils/enum/enum_reflection.h" + +NAU_DEFINE_ENUM_(AxisM, X, Y, Z); + +/** + */ +class MyMover final : public nau::scene::Component, + public nau::scene::IComponentUpdate +{ + NAU_OBJECT(MyMover, nau::scene::Component, nau::scene::IComponentUpdate) + NAU_DECLARE_DYNAMIC_OBJECT + + NAU_CLASS_FIELDS( + CLASS_NAMED_FIELD(m_axis, "axis"), + CLASS_NAMED_FIELD(m_frequency, "frequency"), + CLASS_NAMED_FIELD(m_amplitude, "amplitude"), + CLASS_NAMED_FIELD(m_phase, "phase") + ) + + void updateComponent(float dt) override; + +public: + void setRotationAxis(AxisM axis); + + void setFrequency(float frequency); + + void setPhase(float phase); + + void setAmplitude(float amplitude); + +private: + AxisM m_axis = AxisM::Y; + float m_frequency = 2.f; + float m_amplitude = 0.5f; + float m_phase = 0.5f; + float m_time = 0.0f; +}; diff --git a/project_templates/sample_scene/source/game/main_module/myapi_impl.cpp b/project_templates/sample_scene/source/game/main_module/myapi_impl.cpp new file mode 100644 index 00000000..668b412e --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/myapi_impl.cpp @@ -0,0 +1,14 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#include "myapi_impl.h" + +MyApiImpl::MyApiImpl() +{ +} + +void MyApiImpl::myApiFunction() +{ + NAU_LOG("Hello from module"); +} diff --git a/project_templates/sample_scene/source/game/main_module/myapi_impl.h b/project_templates/sample_scene/source/game/main_module/myapi_impl.h new file mode 100644 index 00000000..429c3fb7 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/myapi_impl.h @@ -0,0 +1,19 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +#include "myapi.h" +#include "nau/rtti/rtti_impl.h" + +class MyApiImpl : public IMyApi1 +{ + NAU_RTTI_CLASS(MyApiImpl , IMyApi1) + +public: + MyApiImpl(); + + void myApiFunction() override; + +}; diff --git a/project_templates/sample_scene/source/game/main_module/pch.h b/project_templates/sample_scene/source/game/main_module/pch.h new file mode 100644 index 00000000..222e68f6 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/pch.h @@ -0,0 +1,29 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +#include + +#ifdef _WIN32 + #include "nau/platform/windows/windows_headers.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nau/diag/assertion.h" +#include "nau/diag/logging.h" +#include "nau/service/service_provider.h" diff --git a/project_templates/sample_scene/source/game/main_module/public/myapi.h b/project_templates/sample_scene/source/game/main_module/public/myapi.h new file mode 100644 index 00000000..5b8cd416 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/public/myapi.h @@ -0,0 +1,15 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +#include "nau/rtti/rtti_object.h" + +struct NAU_ABSTRACT_TYPE IMyApi1 : nau::IRttiObject +{ + NAU_INTERFACE(IMyApi1, nau::IRttiObject) + + virtual void myApiFunction() = 0; +}; + diff --git a/project_templates/sample_scene/source/game/main_module/rotator.cpp b/project_templates/sample_scene/source/game/main_module/rotator.cpp new file mode 100644 index 00000000..8c571bf9 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/rotator.cpp @@ -0,0 +1,42 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#include "rotator.h" + +NAU_IMPLEMENT_DYNAMIC_OBJECT(MyRotator) + +void MyRotator::updateComponent(float dt) +{ + NAU_LOG_WARNING("MainGameModule updateComponent root"); + nau::math::Transform transform = getParentObject().getTransform(); + const float angle = dt * m_speedFactor; + + if (m_axis == Axis::X) + { + transform.addRotation(nau::math::quat::rotationX(angle)); + } + else if (m_axis == Axis::Y) + { + transform.addRotation(nau::math::quat::rotationY(angle)); + } + else + { + transform.addRotation(nau::math::quat::rotationZ(angle)); + } + getParentObject().setTransform(transform); +} + +void MyRotator::setRotationAxis(Axis axis) +{ + value_changes_scope; + + m_axis = axis; +} + +void MyRotator::setSpeedFactor(float factor) +{ + value_changes_scope; + + m_speedFactor = factor; +} diff --git a/project_templates/sample_scene/source/game/main_module/rotator.h b/project_templates/sample_scene/source/game/main_module/rotator.h new file mode 100644 index 00000000..08faa0a7 --- /dev/null +++ b/project_templates/sample_scene/source/game/main_module/rotator.h @@ -0,0 +1,35 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + +#pragma once +#include "nau/scene/components/component.h" +#include "nau/scene/components/component_life_cycle.h" +#include "nau/scene/scene_object.h" +#include "nau/utils/enum/enum_reflection.h" + +NAU_DEFINE_ENUM_(Axis, X, Y, Z); + +/** + */ +class MyRotator final : public nau::scene::Component, + public nau::scene::IComponentUpdate +{ + NAU_OBJECT(MyRotator, nau::scene::Component, nau::scene::IComponentUpdate) + NAU_DECLARE_DYNAMIC_OBJECT + + NAU_CLASS_FIELDS( + CLASS_NAMED_FIELD(m_axis, "axis"), + CLASS_NAMED_FIELD(m_speedFactor, "speedFactor") + ) + + void updateComponent(float dt) override; + +public: + void setRotationAxis(Axis axis); + + void setSpeedFactor(float factor); + +private: + Axis m_axis = Axis::Y; + float m_speedFactor = 0.5f; +}; diff --git a/project_templates/sample_scene/source/game/project.cmake b/project_templates/sample_scene/source/game/project.cmake new file mode 100644 index 00000000..3e9f401a --- /dev/null +++ b/project_templates/sample_scene/source/game/project.cmake @@ -0,0 +1,5 @@ +nau_collect_cmake_subdirectories(Modules ${CMAKE_CURRENT_LIST_DIR}) +foreach(module ${Modules}) + message(STATUS "project module: (${module})") + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/${module}) +endforeach() \ No newline at end of file diff --git a/project_templates/sample_scene/source/main.cpp b/project_templates/sample_scene/source/main.cpp new file mode 100644 index 00000000..ffafb4e2 --- /dev/null +++ b/project_templates/sample_scene/source/main.cpp @@ -0,0 +1,181 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#include +#include + +#include "myapi.h" +#include "nau/app/application.h" +#include "nau/app/application_delegate.h" +#include "nau/app/application_services.h" +#include "nau/app/application_utils.h" +#include "nau/app/global_properties.h" +#include "nau/app/platform_window.h" +#include "nau/app/window_manager.h" +#include "nau/assets/asset_db.h" +#include "nau/input.h" +#include "nau/module/module_manager.h" +#include "nau/service/service_provider.h" +#include "nau/physics/physics_world.h" +#include "nau/physics/core_physics.h" +#include "json/json.h" + +#include + +#define RUN_PLATFORM_APP + +using namespace std::chrono_literals; +using namespace nau; + +/** + */ +class MainAppDelegate final : public ApplicationDelegate +{ +public: + MainAppDelegate(Functor()>&& startup) : + m_startup(std::move(startup)) + { + NAU_FATAL(m_startup); + } + +private: + Result<> configureApplication() override + { + namespace fs = std::filesystem; + + const auto projectRootDir = EXPR_Block->fs::path + { + const fs::path projectRelativeDir{L"config"}; + + fs::path currentPath = fs::current_path(); + + do + { + fs::path targetPath = currentPath / projectRelativeDir; + + if (fs::exists(targetPath)) + { + return fs::canonical(targetPath.parent_path()); + } + + currentPath = currentPath.parent_path(); + + } while (currentPath.has_relative_path()); + + return {}; + }; + + auto defaultConfigResult = nau::app_utils::parseAppConfigs(projectRootDir.string()); + NAU_FATAL(defaultConfigResult.isSuccess()); + + return nau::applyDefaultAppConfiguration(); + } + + eastl::string getModulesListString() const override + { +#if !defined(NAU_STATIC_RUNTIME) + return NAU_MODULES_LIST; +#else + return {}; +#endif + } + + /** + */ + Result<> initializeServices() override + { + initializeDefaultApplication(); + + return ResultSuccess; + } + + void setupPhysicsWorld() + { + GlobalProperties& globalProperties = getServiceProvider().get(); + auto result = globalProperties.getValue("projectDir"); + NAU_ASSERT(result.has_value(), "Fail to get project dir value."); + + const std::filesystem::path& projectRootDir = + std::string(reinterpret_cast(result.value().data()), result.value().length()); + + auto physWorld = getServiceProvider().get().getDefaultPhysicsWorld(); + physWorld->resetChannelsCollisionSettings(); + std::ifstream ifs; + const auto channelsFileName = projectRootDir / std::filesystem::path("resources/physics/channels.data"); + ifs.open(channelsFileName); + if (!ifs) + { + NAU_LOG_ERROR("Can't load physics channel collisions from {}", channelsFileName.string()); + return; + } + + NAU_LOG_DEBUG("Loading physics channels from {}", channelsFileName.string().c_str()); + Json::Value root; + ifs >> root; + + const Json::Value channels = root["collisionChannels"]; + for ( int index = 0; index < channels.size(); ++index ) + { + const auto& channel = channels[index]; + const auto channelA = channel["channel"].asInt(); + + const Json::Value collisions = channel["collisions"]; + for (int collisionIdx = 0; collisionIdx < collisions.size(); ++collisionIdx ) + { + const auto channelB = collisions[collisionIdx].asInt(); + physWorld->setChannelsCollidable(channelA, channelB); + } + } + } + + /** + */ + void onApplicationInitialized() override + { + auto& windowService = getServiceProvider().get(); + auto& window = windowService.getActiveWindow(); + + window.setVisible(true); + + const auto [width, height] = window.getClientSize(); + + nau::input::setScreenResolution(width, height); + + setupPhysicsWorld(); + } + + /** + */ + async::Task<> startupApplication() override + { + return m_startup(); + } + + Functor()> m_startup; +}; + +ApplicationDelegate::Ptr createSampleAppDelegate(Functor()> startup) +{ + return eastl::make_unique(std::move(startup)); +} + +namespace +{ + async::Task<> startup() + { + co_await nau::app_utils::loadStartupScene(); + } +} + +int main() +{ + using namespace nau; + + ApplicationDelegate::Ptr delegate = createSampleAppDelegate([] + { + return startup(); + }); + + return nau::runApplication(std::move(delegate)); +} diff --git a/project_templates/sample_scene/source/pch.h b/project_templates/sample_scene/source/pch.h new file mode 100644 index 00000000..a7b6f3e7 --- /dev/null +++ b/project_templates/sample_scene/source/pch.h @@ -0,0 +1,28 @@ +// Copyright 2024 N-GINN LLC. All rights reserved. +// Use of this source code is governed by a BSD-3 Clause license that can be found in the LICENSE file. + + +#pragma once + +#include + +#include + +#ifdef NAU_PLATFORM_WIN32 + #include "nau/platform/windows/windows_headers.h" +#endif + +#include +#include + +#include +#include + +#include "nau/app/application.h" +#include "nau/app/application_services.h" +#include "nau/app/window_manager.h" +#include "nau/app/platform_window.h" +#include "nau/rtti/ptr.h" +#include "nau/service/service_provider.h" +#include "nau/utils/scope_guard.h" +#include "nau/service/service_provider.h" diff --git a/project_templates/sample_scene/template.json b/project_templates/sample_scene/template.json new file mode 100644 index 00000000..e7c8de20 --- /dev/null +++ b/project_templates/sample_scene/template.json @@ -0,0 +1,59 @@ +{ + "FileVersion": "1.0", + "Template": "Standalone", + "Description": "Standalone nau project", + "ProjectFiles": + [ + { + "Name": "project.cmake", + "UpdateContent": true, + "Rename": true, + "Lowercase": false + }, + { + "Name": "project.nauproject", + "UpdateContent": true, + "Rename": true, + "Lowercase": false + }, + { + "Name": "CMakeLists.txt", + "UpdateContent": true, + "Rename": false + }, + { + "Name": "CMakePresets.json", + "UpdateContent": true, + "Rename": false + }, + { + "Name": "config.json", + "UpdateContent": true, + "Rename": false, + "Lowercase": false + }, + { + "Name": "app.json", + "UpdateContent": true, + "Rename": false, + "Lowercase": false + }, + { + "Name": "main.cpp", + "UpdateContent": true, + "Rename": false, + "Lowercase": false + } + ], + "Exclude": + { + "Condition": "Always", + "List": + [ + ".gitignore", + ".clangd", + ".clang-format", + "template.json" + ] + } +} diff --git a/project_templates/sample_scene/templates/material/standard_pbrTemplate.nausd b/project_templates/sample_scene/templates/material/standard_pbrTemplate.nausd new file mode 100644 index 00000000..d156570e --- /dev/null +++ b/project_templates/sample_scene/templates/material/standard_pbrTemplate.nausd @@ -0,0 +1,59 @@ +#nausd 1.0 + +def NauAssetMaterial "standard_pbr" +{ + string uid = "" + + def "Common" + { + asset Texture:albedoTex = @asset:/content/textures/rusted_pbr/rusted_albedo_ao.png.nausd@ + asset Texture:normalTex = @asset:/content/textures/rusted_pbr/rusted_normals.png.nausd@ + asset Texture:metalRoughnessAoTex = @asset:/content/textures/rusted_pbr/rusted_metallic_roughness.png.nausd@ + } + + def NauMaterialPipeline "default" + { + int albedoSampler = 0 + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ] + } + + def NauMaterialPipeline "deferred" + { + int albedoSampler = 0 + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ] + } + + def NauMaterialPipeline "deferredEmissive" + { + int albedoSampler = 0 + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.emissive.ps.psmain]" + ] + } + + def NauMaterialPipeline "instanced" + { + int albedoSampler = 0 + float4 instanceBaseID = (0, 0, 0, 0) + int metalRoughnessSampler = 2 + int normalSampler = 1 + string[] shaders = [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard.instanced.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard.ps.psmain]" + ] + } +} + diff --git a/project_templates/sample_scene/templates/material/standard_skinned_pbrTemplate.nausd b/project_templates/sample_scene/templates/material/standard_skinned_pbrTemplate.nausd new file mode 100644 index 00000000..3cb6c251 --- /dev/null +++ b/project_templates/sample_scene/templates/material/standard_skinned_pbrTemplate.nausd @@ -0,0 +1,21 @@ +#nausd 1.0 +(defaultPrim = "standard_skinned_pbr") + +def NauAssetMaterial "standard_skinned_pbr" +{ + string uid = "" + + def NauMaterialPipeline "default" + { + asset Texture:albedoTex = @asset:/content/textures/default_albedo_8x8.png.nausd@ + asset Texture:normalTex = @asset:/content/textures/default_normal_8x8.png.nausd@ + asset Texture:metalRoughnessAoTex = @asset:/content/textures/default_metal_rough_8x8.png.nausd@ + string[] shaders = [ + "file:/res/shaders/cache/shader_cache.nsbc+[standard_skinned.vs.vsmain]", + "file:/res/shaders/cache/shader_cache.nsbc+[standard_skinned.ps.psmain]" + ] + token cullMode = "CounterClockwise" + token blendMode = "Opaque" + token depthMode = "Default" + } +} diff --git a/project_templates/sample_scene/templates/material_preview_sceneTemplate.nausd_scene b/project_templates/sample_scene/templates/material_preview_sceneTemplate.nausd_scene new file mode 100644 index 00000000..86ad3613 --- /dev/null +++ b/project_templates/sample_scene/templates/material_preview_sceneTemplate.nausd_scene @@ -0,0 +1,13 @@ +#nausd_scene 1.0 +( + defaultPrim = "PreviewMesh" +) + +def NauAssetMesh "PreviewMesh" ( + displayName = "PreviewMesh" + prepend references = @../content/meshes/sphere.usda.nausd@ +) +{ + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 1, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] +} \ No newline at end of file diff --git a/tools/asset_tools/tool/src/asset_manager.cpp b/tools/asset_tools/tool/src/asset_manager.cpp index f8bba424..4c2a7bac 100644 --- a/tools/asset_tools/tool/src/asset_manager.cpp +++ b/tools/asset_tools/tool/src/asset_manager.cpp @@ -431,9 +431,25 @@ namespace nau options.allowedExtensions = {".nausd"}; LOG_FASSERT(!fs.findAllFiles(assets, metaFiles, options), std::format("Project {} cannot be scanned!", args->projectPath)); - LOG_INFO("Project {} scanned, {} assets found!", args->projectPath, metaFiles.size()); + // Adding priority to assets + // auto getPriority = [](const FileInfo& f) -> int + // { + // const std::string& sp = f.subpath; + // if (sp.find("textures") != std::string::npos) return 0; + // if (sp.find("materials") != std::string::npos) return 1; + // if (sp.find("scenes") != std::string::npos) return 3; + // return 2; + // }; + // + // auto compareByPriority = [&getPriority](const FileInfo& a, const FileInfo& b) + // { + // return getPriority(a) < getPriority(b); + // }; + // + // std::sort(metaFiles.begin(), metaFiles.end(), compareByPriority); + for (const auto& file : metaFiles) { auto metafilePath = file.path + file.extension;